pax_global_header00006660000000000000000000000064145462260520014520gustar00rootroot0000000000000052 comment=470ef8daa6186045fb23238cb8043f718f6cfb44 CPU-X-5.0.3/000077500000000000000000000000001454622605200123615ustar00rootroot00000000000000CPU-X-5.0.3/.cirrus.yml000066400000000000000000000014241454622605200144720ustar00rootroot00000000000000task: name: FreeBSD # https://www.freebsd.org/releases freebsd_instance: # https://cirrus-ci.org/guide/FreeBSD/#list-of-available-image-families matrix: image_family: freebsd-13-2 image_family: freebsd-14-0 env: IGNORE_OSVERSION: yes # supress package installation error on FreeBSD-13 install_script: - pkg update -f - pkg install -y cmake ninja pkgconf gettext nasm gtkmm30 ncurses libcpuid pciutils glfw opencl ocl-icd vulkan-loader vulkan-headers libstatgrab build_script: - cmake -S . -B build -GNinja -DCMAKE_BUILD_TYPE=Debug -DCMAKE_INSTALL_PREFIX=/usr -DWITH_OPENCL=1 - cmake --build build - cmake --install build run_script: - sudo CPUX_BCLK=100 cpu-x --issue-fmt - cat /tmp/cpu-x.log - cat /tmp/cpu-x-daemon.log CPU-X-5.0.3/.github/000077500000000000000000000000001454622605200137215ustar00rootroot00000000000000CPU-X-5.0.3/.github/ISSUE_TEMPLATE.md000066400000000000000000000001411454622605200164220ustar00rootroot00000000000000 CPU-X-5.0.3/.github/ISSUE_TEMPLATE/000077500000000000000000000000001454622605200161045ustar00rootroot00000000000000CPU-X-5.0.3/.github/ISSUE_TEMPLATE/bug_report.md000066400000000000000000000021211454622605200205720ustar00rootroot00000000000000--- name: Bug report about: Create a report to help us to improve CPU-X --- **Describe the bug/Expected behavior** **Additional information** * Operating system name and version: * CPU-X installation type: **Bug information** ``` ========================= Backtrace ========================= PASTE BACKTRACE HERE ======================== End Backtrace ======================= ``` CPU-X-5.0.3/.github/ISSUE_TEMPLATE/feature_request.md000066400000000000000000000007671454622605200216430ustar00rootroot00000000000000--- name: Feature request about: Suggest an idea for CPU-X --- **Is your feature request related to a problem? Please describe.** **Describe the solution you'd like** CPU-X-5.0.3/.github/ISSUE_TEMPLATE/libcpuid.md000066400000000000000000000004631454622605200202240ustar00rootroot00000000000000--- name: Wrong CPU Code Name about: Create a report to help us to improve libcpuid --- **libcpuid dump** CPU-X-5.0.3/.github/main.workflow000066400000000000000000000003161454622605200164410ustar00rootroot00000000000000action "Cirrus CI Email" { uses = "docker://cirrusactions/email:latest" env = { APP_NAME = "Cirrus CI" } secrets = ["GITHUB_TOKEN", "MAIL_FROM", "MAIL_HOST", "MAIL_USERNAME", "MAIL_PASSWORD"] } CPU-X-5.0.3/.github/workflows/000077500000000000000000000000001454622605200157565ustar00rootroot00000000000000CPU-X-5.0.3/.github/workflows/appimage_continuous.yml000066400000000000000000000033271454622605200225570ustar00rootroot00000000000000name: AppImage Continuous on: push: branches: - master workflow_dispatch: env: BUILD_TYPE: RelWithDebInfo jobs: linux-appimage-continuous: name: Linux x64_64 (Continuous) runs-on: ubuntu-20.04 steps: - uses: actions/checkout@v3 - uses: abbbi/github-actions-tune@v1 - name: Build libcpuid run: bash -x ./scripts/build_libcpuid.sh "$BUILD_TYPE" - name: Build CPU-X run: bash -x ./scripts/build_ubuntu.sh "$BUILD_TYPE" "$GITHUB_WORKSPACE" "$GITHUB_WORKSPACE/AppDir" - name: Package CPU-X as an AppImage run: bash -x ./scripts/build_appimage.sh "$GITHUB_WORKSPACE" "$GITHUB_WORKSPACE/AppDir" - name: Delete previous continuous release uses: dev-drprasad/delete-tag-and-release@v0.2.1 with: tag_name: continuous delete_release: true env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - name: Create continuous release uses: ncipollo/release-action@v1 with: allowUpdates: true artifacts: "AppImage/CPU-X-*.AppImage*" body: | :heavy_check_mark:CPU-X AppImage built from latest commit ([${{ github.sha }}](https://github.com/${{ github.repository }}/commit/${{ github.sha }})). See [known issues](https://github.com/TheTumultuousUnicornOfDarkness/CPU-X/wiki/appimage). :scroll: Build log: https://github.com/${{ github.repository }}/commit/${{ github.sha }}/checks?check_suite_id=${{ github.run_id }} commit: ${{ github.sha }} draft: false name: Continuous build prerelease: true removeArtifacts: true replacesArtifacts: true skipIfReleaseExists: false tag: continuous token: "${{ secrets.GITHUB_TOKEN }}" CPU-X-5.0.3/.github/workflows/appimage_release.yml000066400000000000000000000036341454622605200217720ustar00rootroot00000000000000name: AppImage Release on: push: tags: - v* workflow_dispatch: env: BUILD_TYPE: Release jobs: linux-appimage-release: name: Linux x64_64 (Release) runs-on: ubuntu-20.04 steps: - uses: actions/checkout@v3 - uses: abbbi/github-actions-tune@v1 - name: Set environment variables run: | echo "VERSION=${GITHUB_REF_NAME/v/}" >> $GITHUB_ENV echo "CHANGELOG_TAG=${GITHUB_REF_NAME//./}---$(date +'%Y-%m-%d')" >> $GITHUB_ENV - name: Build libcpuid run: bash -x ./scripts/build_libcpuid.sh "$BUILD_TYPE" - name: Build CPU-X run: bash -x ./scripts/build_ubuntu.sh "$BUILD_TYPE" "$GITHUB_WORKSPACE" "$GITHUB_WORKSPACE/AppDir" - name: Package CPU-X as an AppImage run: bash -x ./scripts/build_appimage.sh "$GITHUB_WORKSPACE" "$GITHUB_WORKSPACE/AppDir" - name: Create versioned release uses: ncipollo/release-action@v1 with: allowUpdates: false artifacts: "AppImage/CPU-X-*.AppImage*" body: | **Version ${{ env.VERSION }}.** [ChangeLog](https://github.com/TheTumultuousUnicornOfDarkness/CPU-X/blob/master/ChangeLog.md#${{ env.CHANGELOG_TAG }}) ## Packages Search the `cpu-x` package in your repositories or [CPU-X on Flathub](https://flathub.org/fr/apps/io.github.thetumultuousunicornofdarkness.cpu-x). ## Binary - **AppImage**: CPU-X-v${{ env.VERSION }}-x86_64.AppImage (**libfuse2** package is required) *Note: a Polkit Authentication agent is mandatory to start daemon from GUI.* ## Notes ### To packagers - ### To users - commit: ${{ github.sha }} draft: true name: ${{ github.ref_name }} prerelease: false replacesArtifacts: true skipIfReleaseExists: true tag: ${{ github.ref_name }} token: "${{ secrets.GITHUB_TOKEN }}" CPU-X-5.0.3/.github/workflows/linux.yml000066400000000000000000000020251454622605200176370ustar00rootroot00000000000000name: Linux build on: push: branches: - '*' pull_request: branches: - '*' workflow_dispatch: jobs: linux-build: name: Linux x64_64 (Build) runs-on: ${{ matrix.os.label }} strategy: matrix: os: # https://github.com/actions/virtual-environments/tree/main/images/linux - { label: ubuntu-20.04 } - { label: ubuntu-22.04 } steps: - uses: actions/checkout@v3 - uses: abbbi/github-actions-tune@v1 - name: Build libcpuid run: bash -x ./scripts/build_libcpuid.sh "Debug" - name: Build CPU-X run: bash ./scripts/build_ubuntu.sh "Debug" "$GITHUB_WORKSPACE" - name: Run tests run: ninja -C build test - name: Run CPU-X run: | error=0 sudo CPUX_BCLK=100 cpu-x --issue-fmt || error=1 cat /tmp/cpu-x.log cat /tmp/cpu-x-daemon.log exit $error - name: Test CPU database with LibCPUID tests run: | bash ./scripts/run_libcpuid_tests.sh "/tmp/libcpuid/tests" 2> /dev/null CPU-X-5.0.3/.github/workflows/update_pot_file.yml000066400000000000000000000024111454622605200216420ustar00rootroot00000000000000name: Update POT file on: push: branches: - master workflow_dispatch: jobs: check_new_string: name: Linux x64_64 (check) runs-on: ubuntu-latest outputs: output1: ${{ steps.step1.outputs.check_ret }} steps: - uses: actions/checkout@v3 with: fetch-depth: '0' - id: step1 name: Check if POT file needs to be regenerated run: echo "check_ret=$(bash ./scripts/check_new_strings.sh)" >> $GITHUB_OUTPUT update_pot_file: name: Linux x64_64 (L10n) runs-on: ubuntu-latest needs: check_new_string if: ${{ needs.check_new_string.outputs.output1 == 'REGEN' }} steps: - uses: actions/checkout@v3 - uses: abbbi/github-actions-tune@v1 - name: Install packages run: sudo apt-get install -y -qq cmake ninja-build gettext - name: Disable all options in CMakeLists.txt run: sed -i 's/ ON)$/ OFF)/g' "$GITHUB_WORKSPACE/CMakeLists.txt" - name: Generate files for build system run: cmake -S "$GITHUB_WORKSPACE" -B build -GNinja -DWITH_GETTEXT=1 - name: Generate new POT file run: ninja -C build genpot - uses: EndBug/add-and-commit@v7 with: add: 'po' message: 'Regen POT file' pull_strategy: '--ff-only' push: true CPU-X-5.0.3/.gitignore000066400000000000000000000000521454622605200143460ustar00rootroot00000000000000*~ *.log build/ packages .vscode .vagrant CPU-X-5.0.3/CMakeLists.txt000066400000000000000000000152411454622605200151240ustar00rootroot00000000000000cmake_minimum_required(VERSION 3.12) cmake_policy(SET CMP0048 NEW) if(POLICY CMP0075) cmake_policy(SET CMP0075 NEW) endif() project(cpu-x VERSION "5.0.3" LANGUAGES C CXX ) ### DEFAULT CONFIG # Global variables set(CMAKE_CXX_STANDARD 17) set(CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/cmake") include(GNUInstallDirs) if(NOT EXISTS ${CMAKE_INSTALL_FULL_LIBEXECDIR}) set(CMAKE_INSTALL_LIBEXECDIR lib/${CMAKE_PROJECT_NAME}) set(CMAKE_INSTALL_FULL_LIBEXECDIR ${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_LIBEXECDIR}) endif(NOT EXISTS ${CMAKE_INSTALL_FULL_LIBEXECDIR}) set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/output/bin/) set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/output/lib/) set(CMAKE_DATA_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/output/data/) set(CPU_X_DATA_DIRECTORY ${CMAKE_INSTALL_FULL_DATADIR}/${CMAKE_PROJECT_NAME}/) set(APP_EXEC ${CMAKE_PROJECT_NAME}) set(DAEMON_EXEC ${CMAKE_PROJECT_NAME}-daemon) set(DAEMON_PATH ${CMAKE_INSTALL_FULL_LIBEXECDIR}/${DAEMON_EXEC}) if(${CMAKE_SYSTEM_NAME} MATCHES "Linux") set(DAEMON_SOCKET "/run/cpu-x.sock") else() set(DAEMON_SOCKET "/var/run/cpu-x.sock") endif(${CMAKE_SYSTEM_NAME} MATCHES "Linux") if(CMAKE_SIZEOF_VOID_P EQUAL 4) set(BITNESS "32") else(CMAKE_SIZEOF_VOID_P EQUAL 4) set(BITNESS "64") endif(CMAKE_SIZEOF_VOID_P EQUAL 4) set(CMAKE_COLOR_DIAGNOSTICS ON) set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-deprecated-declarations -Wno-unused-result") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wpedantic -Wno-deprecated-declarations -Wno-unused-result") set(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -Wall -Wextra -Wuninitialized -Wformat -Wformat-security -Wstrict-prototypes") set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -Wall -Wextra -Wuninitialized -Wformat -Wformat-security") set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -Wl,-z,noexecstack -Wl,-z,relro -Wl,-z,now") set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,-z,noexecstack -Wl,-z,relro -Wl,-z,now") include(CheckCCompilerFlag) check_c_compiler_flag("-no-pie" HAS_NO_PIE) if(${CMAKE_SYSTEM_NAME} MATCHES "Linux" AND HAS_NO_PIE) set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -no-pie") endif(${CMAKE_SYSTEM_NAME} MATCHES "Linux" AND HAS_NO_PIE) # Options option(WITH_GTK "Build support for GUI in GTK3+" ON) option(WITH_NCURSES "Build support for TUI in NCurses" ON) option(WITH_GETTEXT "Build support for internationalization" ON) option(WITH_LIBCPUID "Use Libcpuid library" ON) option(WITH_LIBPCI "Use Libpci library" ON) option(WITH_LIBGLFW "Use Libglfw library" ON) option(WITH_VULKAN "Use Vulkan library" ON) option(WITH_OPENCL "Use OpenCL library" OFF) # Disabled due to issues (#238, #258, #264) option(WITH_LIBPROCPS "Use Libprocps library" ON) option(WITH_LIBSTATGRAB "Use Libstatgrab library" ON) option(WITH_DMIDECODE "Built-in Dmidecode" ON) option(WITH_BANDWIDTH "Built-in Bandwidth" ON) option(FORCE_LIBSTATGRAB "Force use of Libstatgrab instead of Libprocps (GNU/Linux system)" OFF) option(FLATPAK "Enable workarounds for Flatpak" OFF) # Colours string(ASCII 27 Esc) set(ColourReset "${Esc}[m") set(ColourBold "${Esc}[1m") set(Red "${Esc}[31m") set(Green "${Esc}[32m") set(Yellow "${Esc}[33m") set(Blue "${Esc}[34m") set(Magenta "${Esc}[35m") set(Cyan "${Esc}[36m") set(White "${Esc}[37m") set(BoldRed "${Esc}[1;31m") set(BoldGreen "${Esc}[1;32m") set(BoldYellow "${Esc}[1;33m") set(BoldBlue "${Esc}[1;34m") set(BoldMagenta "${Esc}[1;35m") set(BoldCyan "${Esc}[1;36m") set(BoldWhite "${Esc}[1;37m") ### MACROS # Macro: print_config(libname foundstate withstate) # Print the state of CPU-X features: in bold green if enabled, else bold red. # @libname: library name (e.g. GTK) # @libver: library version (e.g. XXXXX_VERSION) # @foundstate: the result of pkg_check_modules(...) (e.g. XXXXX_FOUND) # @withstate: the CMake option which allows to disable this feature (e.g. WITH_XXXXX) macro(print_config libname libver foundstate withstate) if(${foundstate} AND ${withstate}) message("${BoldCyan}** ${libname}${ColourReset}\tsupport is ${BoldGreen}enabled${ColourReset}") add_definitions(-DHAS_${libname}=1 -D${libname}_VERSION="${libver}") else(${foundstate} AND ${withstate}) if(NOT ${withstate}) message("${BoldCyan}** ${libname}${ColourReset}\tsupport is ${BoldRed}disabled${ColourReset} (explicitly disabled)") elseif(NOT ${foundstate}) message("${BoldCyan}** ${libname}${ColourReset}\tsupport is ${BoldRed}disabled${ColourReset} (not found by pkg-config)") endif() add_definitions(-DHAS_${libname}=0 -D${libname}_VERSION=NULL) endif(${foundstate} AND ${withstate}) endmacro(print_config) ### HELPERS / SUBDIRECTORIES set(GIT_REVISION "") if(EXISTS ${CMAKE_SOURCE_DIR}/.git) find_package(Git) if(GIT_FOUND) execute_process(COMMAND sh -c "${GIT_EXECUTABLE} describe --long --tags --exclude continuous --abbrev=40 --dirty | cut --delimiter=- --fields=2-" WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}" OUTPUT_VARIABLE GIT_DESCRIBE_REVISION ERROR_QUIET OUTPUT_STRIP_TRAILING_WHITESPACE ) if(NOT ${GIT_DESCRIBE_REVISION} STREQUAL "") set(GIT_REVISION "+git-r${GIT_DESCRIBE_REVISION}") endif(NOT ${GIT_DESCRIBE_REVISION} STREQUAL "") endif(GIT_FOUND) endif(EXISTS ${CMAKE_SOURCE_DIR}/.git) enable_testing() find_package(PkgConfig REQUIRED) find_package(Threads REQUIRED) find_package(Backtrace REQUIRED) find_package(Filesystem REQUIRED) if(WITH_GETTEXT) find_package(Gettext) if(${CMAKE_VERSION} VERSION_GREATER "3.1") find_package(Intl) endif(${CMAKE_VERSION} VERSION_GREATER "3.1") endif(WITH_GETTEXT) include(CheckSymbolExists) include(CheckStructHasMember) include(CheckIncludeFile) add_subdirectory(data) add_subdirectory(po) add_subdirectory(src) add_subdirectory(tests) ### UNINSTALL TARGET configure_file("${CMAKE_MODULE_PATH}/cmake_uninstall.cmake.in" "${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake" IMMEDIATE @ONLY ) add_custom_target(uninstall COMMAND ${CMAKE_COMMAND} -P ${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake ) CPU-X-5.0.3/CONTRIBUTING.md000066400000000000000000000126341454622605200146200ustar00rootroot00000000000000# How to contribute to CPU-X CPU-X is mainly developed by [TheTumultuousUnicornOfDarkness](https://github.com/TheTumultuousUnicornOfDarkness), but contributors are welcome! Here is some things to be involved. ## Translate If you want to translate CPU-X in your native tongue, please visit the [Weblate page](https://hosted.weblate.org/engage/cpu-x/?utm_source=widget). ## Update databases When new CPUs are out, we need to add them in databases. You can find databases [here](src/databases.h). Also, please note CPU codenames are defined in [libcpuid](https://github.com/anrieff/libcpuid). Dumps can be found on [InstLatx64 website](http://users.atw.hu/instlatx64/). Latest dumps can be found on [this Git mirror](https://github.com/InstLatx64/InstLatx64/commits/master). ## Develop CPU-X is written in C++ and uses the CMake build system. First of all, if you are interested to modify CPU-X source code, take a look at [how to manually build CPU-X](https://github.com/TheTumultuousUnicornOfDarkness/CPU-X/wiki/manual-build). ### Source files The file structure in the `src` directory is the following: 1. CPU-X core, where data are gathered: - core.cpp - core.hpp - daemon_client.cpp - daemon_client.hpp - daemon.h - databases.h - data.cpp - data.hpp - logger.cpp - logger.hpp - main.cpp - opencl_ext.h - options.cpp - options.hpp - util.cpp - util.hpp 2. CPU-X daemon, doing operations that require privileges: - daemon.h - daemon_server.cpp - daemon_server.hpp 3. External projects, modified to be integrated within CPU-X (optional): - bandwidth - dmidecode 4. User interfaces (optional): - gui_gtk.cpp - gui_gtk.hpp - tui_ncurses.cpp - tui_ncurses.hpp ### Add new labels Adding new labels to CPU-X is a little bit complex, but don't worry: this sub-section explains how to achieve that. :warning: Note: this guide does not explain how to add a new tab. **1. In core** - First of all, you need to add a new `Label` object in `struct Data` in `data.hpp` file. Example to add `kernel` in `Data::System::OperatingSystem`: ```cpp Label kernel {_("Kernel")}; ``` `{_("Kernel")}` is the name of the label (which may be translated). - Set the label value in `core.cpp`, in the appropriate function. You need to store label value in `value` field, like this: ```c data.system.os.kernel.value = "XXX"; ``` :bulb: `fill_labels()` and `do_refresh()` are the calling functions. - Finally, in `data.cpp` file, print the label in the appropriate `operator<<` overload. **2. In NCurses TUI** You may need to adapt `tui_ncurses.cpp`. To print text on screen, `mvwprintwc()` and `mvwprintw2c()` functions are used. ```c mvwprintw2c(win, LINE_1, SizeInfo::tb, "%13s", "%s", data.system.os.kernel); ``` In this example, it will display content of `data.system.os.kernel` at `LINE_1`, with label name on the left side. **3. In GTK+ 3 GUI** You need to use [Glade](https://glade.gnome.org/) to edit UI. The UI file in under `data/` (e.g. `cpu-x-gtk-3.12.ui`). Two labels must be created at least: - one label to display the label name, with an ID like `TAB_labNEWLABEL` ; - a second label to display the label value, with an ID like `TAB_valNEWLABEL`. Then labels are filled from `gui_gtk.cpp` file: - bind widget (from UI) to an object in `get_widgets()` ; - set label by using `set_label_name_and_value()` in the appropriate `GtkData::gtab_XXX()` method. **4. Verify** Build and run CPU-X. The software must not crash or freeze after these changes. Please check all modes to avoid potential regressions: ```shell $ cpu-x -Dv $ cpu-x -Nv $ cpu-x -Gv ``` If nothing is broken, congratulations! :tada: You can open a new [pull request](https://github.com/TheTumultuousUnicornOfDarkness/CPU-X/compare). ### Add new options This section describe how to add a new option. You can take a look on [this commit](https://github.com/TheTumultuousUnicornOfDarkness/CPU-X/commit/008e03cf95653e964a9e334347c297fef57ce82a). 1. `src/options.hpp`: add new option in `class Options`. Values are private: you need to define a public setter and getter. 2. `src/main.c`: * in `struct cpux_options[]`: add a new line entry * in `parse_arguments()`: retrieve value for option 3. `data/io.github.thetumultuousunicornofdarkness.cpu-x.gschema.xml`: add a new key 4. `data/cpu-x-gtk-3.12.ui`: open UI file in Glade and change Settings window 5. `src/gui_gtk.hpp`: add a new widget in `struct GtkData` 6. `src/gui_gtk.cpp`: * `get_widgets()`: map UI widget to a C++ object * `load_settings()`: map setting to an option * `bind_settings()`: bind schema value to a C++ object * `set_signals()`: handle signal when value is changed by user (note: the "OK" button in Settings window is handled by `this->validatebutton->signal_clicked().connect()`) 7. Do something with your new option! ### Things to do - A good starting point if you want to do stuff is to fix [issues](https://github.com/TheTumultuousUnicornOfDarkness/CPU-X/issues). One example: add proper CPU logos (as requested in #144). - Another point, if you have a lot of time to spare, is to create new user interfaces: - Qt5/Qt6 GUI can be appreciated by users using Qt-based desktop environnement (like KDE); - Cocoa GUI to port CPU-X on macOS (read #147, #56, #55 #35 and #33 for more details). - Also, feel free to improve existing stuff. For instance, databases are defined in a C header, but maybe there are better ways to store data. CPU-X-5.0.3/COPYING000066400000000000000000001045131454622605200134200ustar00rootroot00000000000000 GNU GENERAL PUBLIC LICENSE Version 3, 29 June 2007 Copyright (C) 2007 Free Software Foundation, Inc. Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The GNU General Public License is a free, copyleft license for software and other kinds of works. The licenses for most software and other practical works are designed to take away your freedom to share and change the works. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change all versions of a program--to make sure it remains free software for all its users. We, the Free Software Foundation, use the GNU General Public License for most of our software; it applies also to any other work released this way by its authors. You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for them if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs, and that you know you can do these things. To protect your rights, we need to prevent others from denying you these rights or asking you to surrender the rights. Therefore, you have certain responsibilities if you distribute copies of the software, or if you modify it: responsibilities to respect the freedom of others. For example, if you distribute copies of such a program, whether gratis or for a fee, you must pass on to the recipients the same freedoms that you received. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. Developers that use the GNU GPL protect your rights with two steps: (1) assert copyright on the software, and (2) offer you this License giving you legal permission to copy, distribute and/or modify it. For the developers' and authors' protection, the GPL clearly explains that there is no warranty for this free software. For both users' and authors' sake, the GPL requires that modified versions be marked as changed, so that their problems will not be attributed erroneously to authors of previous versions. Some devices are designed to deny users access to install or run modified versions of the software inside them, although the manufacturer can do so. This is fundamentally incompatible with the aim of protecting users' freedom to change the software. The systematic pattern of such abuse occurs in the area of products for individuals to use, which is precisely where it is most unacceptable. Therefore, we have designed this version of the GPL to prohibit the practice for those products. If such problems arise substantially in other domains, we stand ready to extend this provision to those domains in future versions of the GPL, as needed to protect the freedom of users. Finally, every program is threatened constantly by software patents. States should not allow patents to restrict development and use of software on general-purpose computers, but in those that do, we wish to avoid the special danger that patents applied to a free program could make it effectively proprietary. To prevent this, the GPL assures that patents cannot be used to render the program non-free. The precise terms and conditions for copying, distribution and modification follow. TERMS AND CONDITIONS 0. Definitions. "This License" refers to version 3 of the GNU General Public License. "Copyright" also means copyright-like laws that apply to other kinds of works, such as semiconductor masks. "The Program" refers to any copyrightable work licensed under this License. Each licensee is addressed as "you". "Licensees" and "recipients" may be individuals or organizations. To "modify" a work means to copy from or adapt all or part of the work in a fashion requiring copyright permission, other than the making of an exact copy. The resulting work is called a "modified version" of the earlier work or a work "based on" the earlier work. A "covered work" means either the unmodified Program or a work based on the Program. To "propagate" a work means to do anything with it that, without permission, would make you directly or secondarily liable for infringement under applicable copyright law, except executing it on a computer or modifying a private copy. Propagation includes copying, distribution (with or without modification), making available to the public, and in some countries other activities as well. To "convey" a work means any kind of propagation that enables other parties to make or receive copies. Mere interaction with a user through a computer network, with no transfer of a copy, is not conveying. An interactive user interface displays "Appropriate Legal Notices" to the extent that it includes a convenient and prominently visible feature that (1) displays an appropriate copyright notice, and (2) tells the user that there is no warranty for the work (except to the extent that warranties are provided), that licensees may convey the work under this License, and how to view a copy of this License. If the interface presents a list of user commands or options, such as a menu, a prominent item in the list meets this criterion. 1. Source Code. The "source code" for a work means the preferred form of the work for making modifications to it. "Object code" means any non-source form of a work. A "Standard Interface" means an interface that either is an official standard defined by a recognized standards body, or, in the case of interfaces specified for a particular programming language, one that is widely used among developers working in that language. The "System Libraries" of an executable work include anything, other than the work as a whole, that (a) is included in the normal form of packaging a Major Component, but which is not part of that Major Component, and (b) serves only to enable use of the work with that Major Component, or to implement a Standard Interface for which an implementation is available to the public in source code form. A "Major Component", in this context, means a major essential component (kernel, window system, and so on) of the specific operating system (if any) on which the executable work runs, or a compiler used to produce the work, or an object code interpreter used to run it. The "Corresponding Source" for a work in object code form means all the source code needed to generate, install, and (for an executable work) run the object code and to modify the work, including scripts to control those activities. However, it does not include the work's System Libraries, or general-purpose tools or generally available free programs which are used unmodified in performing those activities but which are not part of the work. For example, Corresponding Source includes interface definition files associated with source files for the work, and the source code for shared libraries and dynamically linked subprograms that the work is specifically designed to require, such as by intimate data communication or control flow between those subprograms and other parts of the work. The Corresponding Source need not include anything that users can regenerate automatically from other parts of the Corresponding Source. The Corresponding Source for a work in source code form is that same work. 2. Basic Permissions. All rights granted under this License are granted for the term of copyright on the Program, and are irrevocable provided the stated conditions are met. This License explicitly affirms your unlimited permission to run the unmodified Program. The output from running a covered work is covered by this License only if the output, given its content, constitutes a covered work. This License acknowledges your rights of fair use or other equivalent, as provided by copyright law. You may make, run and propagate covered works that you do not convey, without conditions so long as your license otherwise remains in force. You may convey covered works to others for the sole purpose of having them make modifications exclusively for you, or provide you with facilities for running those works, provided that you comply with the terms of this License in conveying all material for which you do not control copyright. Those thus making or running the covered works for you must do so exclusively on your behalf, under your direction and control, on terms that prohibit them from making any copies of your copyrighted material outside their relationship with you. Conveying under any other circumstances is permitted solely under the conditions stated below. Sublicensing is not allowed; section 10 makes it unnecessary. 3. Protecting Users' Legal Rights From Anti-Circumvention Law. No covered work shall be deemed part of an effective technological measure under any applicable law fulfilling obligations under article 11 of the WIPO copyright treaty adopted on 20 December 1996, or similar laws prohibiting or restricting circumvention of such measures. When you convey a covered work, you waive any legal power to forbid circumvention of technological measures to the extent such circumvention is effected by exercising rights under this License with respect to the covered work, and you disclaim any intention to limit operation or modification of the work as a means of enforcing, against the work's users, your or third parties' legal rights to forbid circumvention of technological measures. 4. Conveying Verbatim Copies. You may convey verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice; keep intact all notices stating that this License and any non-permissive terms added in accord with section 7 apply to the code; keep intact all notices of the absence of any warranty; and give all recipients a copy of this License along with the Program. You may charge any price or no price for each copy that you convey, and you may offer support or warranty protection for a fee. 5. Conveying Modified Source Versions. You may convey a work based on the Program, or the modifications to produce it from the Program, in the form of source code under the terms of section 4, provided that you also meet all of these conditions: a) The work must carry prominent notices stating that you modified it, and giving a relevant date. b) The work must carry prominent notices stating that it is released under this License and any conditions added under section 7. This requirement modifies the requirement in section 4 to "keep intact all notices". c) You must license the entire work, as a whole, under this License to anyone who comes into possession of a copy. This License will therefore apply, along with any applicable section 7 additional terms, to the whole of the work, and all its parts, regardless of how they are packaged. This License gives no permission to license the work in any other way, but it does not invalidate such permission if you have separately received it. d) If the work has interactive user interfaces, each must display Appropriate Legal Notices; however, if the Program has interactive interfaces that do not display Appropriate Legal Notices, your work need not make them do so. A compilation of a covered work with other separate and independent works, which are not by their nature extensions of the covered work, and which are not combined with it such as to form a larger program, in or on a volume of a storage or distribution medium, is called an "aggregate" if the compilation and its resulting copyright are not used to limit the access or legal rights of the compilation's users beyond what the individual works permit. Inclusion of a covered work in an aggregate does not cause this License to apply to the other parts of the aggregate. 6. Conveying Non-Source Forms. You may convey a covered work in object code form under the terms of sections 4 and 5, provided that you also convey the machine-readable Corresponding Source under the terms of this License, in one of these ways: a) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by the Corresponding Source fixed on a durable physical medium customarily used for software interchange. b) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by a written offer, valid for at least three years and valid for as long as you offer spare parts or customer support for that product model, to give anyone who possesses the object code either (1) a copy of the Corresponding Source for all the software in the product that is covered by this License, on a durable physical medium customarily used for software interchange, for a price no more than your reasonable cost of physically performing this conveying of source, or (2) access to copy the Corresponding Source from a network server at no charge. c) Convey individual copies of the object code with a copy of the written offer to provide the Corresponding Source. This alternative is allowed only occasionally and noncommercially, and only if you received the object code with such an offer, in accord with subsection 6b. d) Convey the object code by offering access from a designated place (gratis or for a charge), and offer equivalent access to the Corresponding Source in the same way through the same place at no further charge. You need not require recipients to copy the Corresponding Source along with the object code. If the place to copy the object code is a network server, the Corresponding Source may be on a different server (operated by you or a third party) that supports equivalent copying facilities, provided you maintain clear directions next to the object code saying where to find the Corresponding Source. Regardless of what server hosts the Corresponding Source, you remain obligated to ensure that it is available for as long as needed to satisfy these requirements. e) Convey the object code using peer-to-peer transmission, provided you inform other peers where the object code and Corresponding Source of the work are being offered to the general public at no charge under subsection 6d. A separable portion of the object code, whose source code is excluded from the Corresponding Source as a System Library, need not be included in conveying the object code work. A "User Product" is either (1) a "consumer product", which means any tangible personal property which is normally used for personal, family, or household purposes, or (2) anything designed or sold for incorporation into a dwelling. In determining whether a product is a consumer product, doubtful cases shall be resolved in favor of coverage. For a particular product received by a particular user, "normally used" refers to a typical or common use of that class of product, regardless of the status of the particular user or of the way in which the particular user actually uses, or expects or is expected to use, the product. A product is a consumer product regardless of whether the product has substantial commercial, industrial or non-consumer uses, unless such uses represent the only significant mode of use of the product. "Installation Information" for a User Product means any methods, procedures, authorization keys, or other information required to install and execute modified versions of a covered work in that User Product from a modified version of its Corresponding Source. The information must suffice to ensure that the continued functioning of the modified object code is in no case prevented or interfered with solely because modification has been made. If you convey an object code work under this section in, or with, or specifically for use in, a User Product, and the conveying occurs as part of a transaction in which the right of possession and use of the User Product is transferred to the recipient in perpetuity or for a fixed term (regardless of how the transaction is characterized), the Corresponding Source conveyed under this section must be accompanied by the Installation Information. But this requirement does not apply if neither you nor any third party retains the ability to install modified object code on the User Product (for example, the work has been installed in ROM). The requirement to provide Installation Information does not include a requirement to continue to provide support service, warranty, or updates for a work that has been modified or installed by the recipient, or for the User Product in which it has been modified or installed. Access to a network may be denied when the modification itself materially and adversely affects the operation of the network or violates the rules and protocols for communication across the network. Corresponding Source conveyed, and Installation Information provided, in accord with this section must be in a format that is publicly documented (and with an implementation available to the public in source code form), and must require no special password or key for unpacking, reading or copying. 7. Additional Terms. "Additional permissions" are terms that supplement the terms of this License by making exceptions from one or more of its conditions. Additional permissions that are applicable to the entire Program shall be treated as though they were included in this License, to the extent that they are valid under applicable law. If additional permissions apply only to part of the Program, that part may be used separately under those permissions, but the entire Program remains governed by this License without regard to the additional permissions. When you convey a copy of a covered work, you may at your option remove any additional permissions from that copy, or from any part of it. (Additional permissions may be written to require their own removal in certain cases when you modify the work.) You may place additional permissions on material, added by you to a covered work, for which you have or can give appropriate copyright permission. Notwithstanding any other provision of this License, for material you add to a covered work, you may (if authorized by the copyright holders of that material) supplement the terms of this License with terms: a) Disclaiming warranty or limiting liability differently from the terms of sections 15 and 16 of this License; or b) Requiring preservation of specified reasonable legal notices or author attributions in that material or in the Appropriate Legal Notices displayed by works containing it; or c) Prohibiting misrepresentation of the origin of that material, or requiring that modified versions of such material be marked in reasonable ways as different from the original version; or d) Limiting the use for publicity purposes of names of licensors or authors of the material; or e) Declining to grant rights under trademark law for use of some trade names, trademarks, or service marks; or f) Requiring indemnification of licensors and authors of that material by anyone who conveys the material (or modified versions of it) with contractual assumptions of liability to the recipient, for any liability that these contractual assumptions directly impose on those licensors and authors. All other non-permissive additional terms are considered "further restrictions" within the meaning of section 10. If the Program as you received it, or any part of it, contains a notice stating that it is governed by this License along with a term that is a further restriction, you may remove that term. If a license document contains a further restriction but permits relicensing or conveying under this License, you may add to a covered work material governed by the terms of that license document, provided that the further restriction does not survive such relicensing or conveying. If you add terms to a covered work in accord with this section, you must place, in the relevant source files, a statement of the additional terms that apply to those files, or a notice indicating where to find the applicable terms. Additional terms, permissive or non-permissive, may be stated in the form of a separately written license, or stated as exceptions; the above requirements apply either way. 8. Termination. You may not propagate or modify a covered work except as expressly provided under this License. Any attempt otherwise to propagate or modify it is void, and will automatically terminate your rights under this License (including any patent licenses granted under the third paragraph of section 11). However, if you cease all violation of this License, then your license from a particular copyright holder is reinstated (a) provisionally, unless and until the copyright holder explicitly and finally terminates your license, and (b) permanently, if the copyright holder fails to notify you of the violation by some reasonable means prior to 60 days after the cessation. Moreover, your license from a particular copyright holder is reinstated permanently if the copyright holder notifies you of the violation by some reasonable means, this is the first time you have received notice of violation of this License (for any work) from that copyright holder, and you cure the violation prior to 30 days after your receipt of the notice. Termination of your rights under this section does not terminate the licenses of parties who have received copies or rights from you under this License. If your rights have been terminated and not permanently reinstated, you do not qualify to receive new licenses for the same material under section 10. 9. Acceptance Not Required for Having Copies. You are not required to accept this License in order to receive or run a copy of the Program. Ancillary propagation of a covered work occurring solely as a consequence of using peer-to-peer transmission to receive a copy likewise does not require acceptance. However, nothing other than this License grants you permission to propagate or modify any covered work. These actions infringe copyright if you do not accept this License. Therefore, by modifying or propagating a covered work, you indicate your acceptance of this License to do so. 10. Automatic Licensing of Downstream Recipients. Each time you convey a covered work, the recipient automatically receives a license from the original licensors, to run, modify and propagate that work, subject to this License. You are not responsible for enforcing compliance by third parties with this License. An "entity transaction" is a transaction transferring control of an organization, or substantially all assets of one, or subdividing an organization, or merging organizations. If propagation of a covered work results from an entity transaction, each party to that transaction who receives a copy of the work also receives whatever licenses to the work the party's predecessor in interest had or could give under the previous paragraph, plus a right to possession of the Corresponding Source of the work from the predecessor in interest, if the predecessor has it or can get it with reasonable efforts. You may not impose any further restrictions on the exercise of the rights granted or affirmed under this License. For example, you may not impose a license fee, royalty, or other charge for exercise of rights granted under this License, and you may not initiate litigation (including a cross-claim or counterclaim in a lawsuit) alleging that any patent claim is infringed by making, using, selling, offering for sale, or importing the Program or any portion of it. 11. Patents. A "contributor" is a copyright holder who authorizes use under this License of the Program or a work on which the Program is based. The work thus licensed is called the contributor's "contributor version". A contributor's "essential patent claims" are all patent claims owned or controlled by the contributor, whether already acquired or hereafter acquired, that would be infringed by some manner, permitted by this License, of making, using, or selling its contributor version, but do not include claims that would be infringed only as a consequence of further modification of the contributor version. For purposes of this definition, "control" includes the right to grant patent sublicenses in a manner consistent with the requirements of this License. Each contributor grants you a non-exclusive, worldwide, royalty-free patent license under the contributor's essential patent claims, to make, use, sell, offer for sale, import and otherwise run, modify and propagate the contents of its contributor version. In the following three paragraphs, a "patent license" is any express agreement or commitment, however denominated, not to enforce a patent (such as an express permission to practice a patent or covenant not to sue for patent infringement). To "grant" such a patent license to a party means to make such an agreement or commitment not to enforce a patent against the party. If you convey a covered work, knowingly relying on a patent license, and the Corresponding Source of the work is not available for anyone to copy, free of charge and under the terms of this License, through a publicly available network server or other readily accessible means, then you must either (1) cause the Corresponding Source to be so available, or (2) arrange to deprive yourself of the benefit of the patent license for this particular work, or (3) arrange, in a manner consistent with the requirements of this License, to extend the patent license to downstream recipients. "Knowingly relying" means you have actual knowledge that, but for the patent license, your conveying the covered work in a country, or your recipient's use of the covered work in a country, would infringe one or more identifiable patents in that country that you have reason to believe are valid. If, pursuant to or in connection with a single transaction or arrangement, you convey, or propagate by procuring conveyance of, a covered work, and grant a patent license to some of the parties receiving the covered work authorizing them to use, propagate, modify or convey a specific copy of the covered work, then the patent license you grant is automatically extended to all recipients of the covered work and works based on it. A patent license is "discriminatory" if it does not include within the scope of its coverage, prohibits the exercise of, or is conditioned on the non-exercise of one or more of the rights that are specifically granted under this License. You may not convey a covered work if you are a party to an arrangement with a third party that is in the business of distributing software, under which you make payment to the third party based on the extent of your activity of conveying the work, and under which the third party grants, to any of the parties who would receive the covered work from you, a discriminatory patent license (a) in connection with copies of the covered work conveyed by you (or copies made from those copies), or (b) primarily for and in connection with specific products or compilations that contain the covered work, unless you entered into that arrangement, or that patent license was granted, prior to 28 March 2007. Nothing in this License shall be construed as excluding or limiting any implied license or other defenses to infringement that may otherwise be available to you under applicable patent law. 12. No Surrender of Others' Freedom. If conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot convey a covered work so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not convey it at all. For example, if you agree to terms that obligate you to collect a royalty for further conveying from those to whom you convey the Program, the only way you could satisfy both those terms and this License would be to refrain entirely from conveying the Program. 13. Use with the GNU Affero General Public License. Notwithstanding any other provision of this License, you have permission to link or combine any covered work with a work licensed under version 3 of the GNU Affero General Public License into a single combined work, and to convey the resulting work. The terms of this License will continue to apply to the part which is the covered work, but the special requirements of the GNU Affero General Public License, section 13, concerning interaction through a network will apply to the combination as such. 14. Revised Versions of this License. The Free Software Foundation may publish revised and/or new versions of the GNU General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies that a certain numbered version of the GNU General Public License "or any later version" applies to it, you have the option of following the terms and conditions either of that numbered version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of the GNU General Public License, you may choose any version ever published by the Free Software Foundation. If the Program specifies that a proxy can decide which future versions of the GNU General Public License can be used, that proxy's public statement of acceptance of a version permanently authorizes you to choose that version for the Program. Later license versions may give you additional or different permissions. However, no additional obligations are imposed on any author or copyright holder as a result of your choosing to follow a later version. 15. Disclaimer of Warranty. THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 16. Limitation of Liability. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. 17. Interpretation of Sections 15 and 16. If the disclaimer of warranty and limitation of liability provided above cannot be given local legal effect according to their terms, reviewing courts shall apply local law that most closely approximates an absolute waiver of all civil liability in connection with the Program, unless a warranty or assumption of liability accompanies a copy of the Program in return for a fee. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively state the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . Also add information on how to contact you by electronic and paper mail. If the program does terminal interaction, make it output a short notice like this when it starts in an interactive mode: Copyright (C) This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, your program's commands might be different; for a GUI interface, you would use an "about box". You should also get your employer (if you work as a programmer) or school, if any, to sign a "copyright disclaimer" for the program, if necessary. For more information on this, and how to apply and follow the GNU GPL, see . The GNU General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. But first, please read . CPU-X-5.0.3/ChangeLog.md000066400000000000000000000576461454622605200145540ustar00rootroot00000000000000# Changelog All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). - [Changelog](#changelog) - [\[v5.0.3\] - 2024-01-06](#v503---2024-01-06) - [Changed](#changed) - [Fixed](#fixed) - [\[v5.0.2\] - 2023-11-12](#v502---2023-11-12) - [Changed](#changed-1) - [Fixed](#fixed-1) - [\[v5.0.1\] - 2023-10-21](#v501---2023-10-21) - [Changed](#changed-2) - [Fixed](#fixed-2) - [\[v5.0.0\] - 2023-10-15](#v500---2023-10-15) - [Added](#added) - [Changed](#changed-3) - [Removed](#removed) - [Fixed](#fixed-3) - [\[v4.5.3\] - 2023-04-02](#v453---2023-04-02) - [Added](#added-1) - [Changed](#changed-4) - [Fixed](#fixed-4) - [\[v4.5.2\] - 2022-11-12](#v452---2022-11-12) - [Changed](#changed-5) - [Fixed](#fixed-5) - [\[v4.5.1\] - 2022-10-23](#v451---2022-10-23) - [Changed](#changed-6) - [Fixed](#fixed-6) - [\[v4.5.0\] - 2022-10-09](#v450---2022-10-09) - [Added](#added-2) - [Changed](#changed-7) - [Removed](#removed-1) - [Fixed](#fixed-7) - [\[v4.4.0\] - 2022-08-28](#v440---2022-08-28) - [Added](#added-3) - [Changed](#changed-8) - [Fixed](#fixed-8) - [\[v4.3.1\] - 2022-05-08](#v431---2022-05-08) - [Fixed](#fixed-9) - [\[v4.3.0\] - 2022-02-18](#v430---2022-02-18) - [Added](#added-4) - [Changed](#changed-9) - [Fixed](#fixed-10) - [\[v4.2.0\] - 2021-03-28](#v420---2021-03-28) - [Added](#added-5) - [Changed](#changed-10) - [Removed](#removed-2) - [Fixed](#fixed-11) - [\[v4.1.0\] - 2021-01-10](#v410---2021-01-10) - [Added](#added-6) - [Changed](#changed-11) - [Fixed](#fixed-12) - [\[v4.0.1\] - 2020-06-13](#v401---2020-06-13) - [Changed](#changed-12) - [Fixed](#fixed-13) - [\[v4.0.0\] - 2020-05-17](#v400---2020-05-17) - [Added](#added-7) - [Changed](#changed-13) - [Removed](#removed-3) - [Fixed](#fixed-14) - [\[v3.2.4\] - 2019-01-13](#v324---2019-01-13) - [Changed](#changed-14) - [Deprecated](#deprecated) - [Fixed](#fixed-15) - [\[v3.2.3\] - 2018-07-01](#v323---2018-07-01) - [Added](#added-8) - [Changed](#changed-15) - [Removed](#removed-4) - [\[v3.2.2\] - 2018-05-03](#v322---2018-05-03) - [Changed](#changed-16) - [Fixed](#fixed-16) - [\[v3.2.1\] - 2018-03-24](#v321---2018-03-24) - [Changed](#changed-17) - [Removed](#removed-5) - [Fixed](#fixed-17) - [\[v3.2.0\] - 2018-01-31](#v320---2018-01-31) - [Added](#added-9) - [Changed](#changed-18) - [Removed](#removed-6) - [Fixed](#fixed-18) - [\[v3.1.3\] - 2016-10-25](#v313---2016-10-25) - [Added](#added-10) - [Changed](#changed-19) - [Fixed](#fixed-19) - [\[v3.1.2\] - 2016-10-23](#v312---2016-10-23) - [Added](#added-11) - [Changed](#changed-20) - [Fixed](#fixed-20) - [\[v3.1.1\] - 2016-10-16](#v311---2016-10-16) - [Fixed](#fixed-21) - [\[v3.1.0\] - 2016-09-24](#v310---2016-09-24) - [Added](#added-12) - [Changed](#changed-21) - [Removed](#removed-7) - [Fixed](#fixed-22) - [\[v3.0.1\] - 2016-08-23](#v301---2016-08-23) - [Changed](#changed-22) - [Fixed](#fixed-23) - [\[v3.0.0\] - 2016-06-15](#v300---2016-06-15) - [Added](#added-13) - [Changed](#changed-23) - [Removed](#removed-8) - [\[v2.2.2\] - 2015-12-02](#v222---2015-12-02) - [Changed](#changed-24) - [Fixed](#fixed-24) - [\[v2.2.1\] - 2015-11-27](#v221---2015-11-27) - [Changed](#changed-25) - [Fixed](#fixed-25) - [\[v2.2.0\] - 2015-11-21](#v220---2015-11-21) - [Added](#added-14) - [Changed](#changed-26) - [Fixed](#fixed-26) - [\[v2.1.1\] - 2015-08-26](#v211---2015-08-26) - [Added](#added-15) - [Changed](#changed-27) - [Fixed](#fixed-27) - [\[v2.1.0\] - 2015-08-08](#v210---2015-08-08) - [Added](#added-16) - [Changed](#changed-28) - [Fixed](#fixed-28) - [\[v2.0.3\] - 2015-03-15](#v203---2015-03-15) - [Added](#added-17) - [Changed](#changed-29) - [Removed](#removed-9) - [Fixed](#fixed-29) - [\[v2.0.2\] - 2015-02-08](#v202---2015-02-08) - [Added](#added-18) - [Changed](#changed-30) - [Fixed](#fixed-30) - [\[v2.0.1\] - 2014-11-23](#v201---2014-11-23) - [Added](#added-19) - [Changed](#changed-31) - [Fixed](#fixed-31) - [\[v2.0.0\] - 2014-11-16](#v200---2014-11-16) - [Added](#added-20) - [Changed](#changed-32) - [Fixed](#fixed-32) - [\[v1.2.2\] - 2014-11-05](#v122---2014-11-05) - [Added](#added-21) - [Changed](#changed-33) - [Fixed](#fixed-33) - [\[v1.2.1\] - 2014-10-24](#v121---2014-10-24) - [Added](#added-22) - [Changed](#changed-34) - [Fixed](#fixed-34) - [\[v1.2.0\] - 2014-10-12](#v120---2014-10-12) - [Added](#added-23) - [Changed](#changed-35) - [Fixed](#fixed-35) - [\[v1.1.0\] - 2014-09-28](#v110---2014-09-28) - [Added](#added-24) - [Changed](#changed-36) - [\[v1.0.0\] - 2014-09-21](#v100---2014-09-21) --- ## [v5.0.3] - 2024-01-06 ### Changed - Improvements for Flatpak runtime - Do not print OpenGL version for unknown user mode driver - Reword labels about 'theme' in Settings (#314) - Set tooltip for all labels with full text in GTK GUI (#316) - Update databases (AMD Storm Peak) ### Fixed - Fix active graphic card in GTK GUI (#313) - Fix missing AMD GPU power average for some cards (#315) --- ## [v5.0.2] - 2023-11-12 ### Changed - Print vendor ID and device ID in Graphics tab for "Device ID" label (#311) - Update various tags in appdata.xml file - Rename AppID from com.github.thetumultuousunicornofdarkness.cpu-x to io.github.thetumultuousunicornofdarkness.cpu-x ### Fixed - Fix daemon socket path when prefix is `/usr/local` (#310) - Fix launchable field in appdata.xml file - Fix icon name field in PolKit policy file --- ## [v5.0.1] - 2023-10-21 ### Changed - Update databases (AMD Chagall, more Intel CPU packages) - Do not try to read memory frequency for iGPU with AMDGPU driver ### Fixed - Fix build on CentOS/RHEL 7 (#305) - Fix build when libcpuid header is not present (#306) - Fix abort with stoull() when retrieving GPU monitoring information (#304) - Fix wrong CPU temperature in fallback mode (#308) - Fix unknown user mode driver for NVIDIA graphic cards (#307) --- ## [v5.0.0] - 2023-10-15 ### Added - Support for C++17, involving a major rewrite of project from C to C++ - Add more debug data, including a debug mode for the daemon - Add an option to choose temperature unit among Celsius, Fahrenheit, Kelvin and Rankine - Add initial Flatpak support with `FLATPAK` option in CMake ### Changed - Update databases (AMD Genoa, Intel Sapphire Rapids-WS, AMD Phoenix, Intel Alder Lake-U, Intel Apollo Lake) - Update Intel vendor logo in GTK GUI - Rename AppData, PolKit policy, Desktop and GSchema files with `com.github.thetumultuousunicornofdarkness` prefix - Redesign Memory tab - Rename 'Distribution' label to 'Name' in System tab ### Removed - Remove support for CMake < 3.12 - Remove 'Compiler' label from System tab - Remove the need to have gawk/mawk/nawk at the same time during build for test execution - Remove `APPIMAGE` option in CMake ### Fixed - Fix CPU temperature in fallback mode on FreeBSD - Fix build with NCURSES and Intl CMake modules on FreeBSD - Fix threads affinity for benchmarks - Fix elapsed time for benchmarks --- ## [v4.5.3] - 2023-04-02 ### Added - Add BAR size for Intel discrete GPU - Add total VRAM size via Vulkan API for checking ResizableBAR ### Changed - Update databases (Intel Alder Lake, Intel Raptor Lake-S/P/U) - Disable OpenCL support by default - Update brand logos for AMD and Intel - Make yellow brighter for dark themes in GTK GUI - Patch dmidecode to version 3.5.484f893 - Update 'Technology' label in CPU tab for new node name (like Intel 7) and change prefix for technology nodes >= 100nm to µm ### Fixed - Print correct memory speed - Fix empty 'Interface' label in Graphics tab for NVIDIA cards (get DRM path for all graphic cards) - Fix race condition with cache test selection --- ## [v4.5.2] - 2022-11-12 ### Changed - Support for procps-ng 4.0.1rc3 - Update databases (Intel Tremont, Intel Ice Lake Xeon-D, AMD Mendocino, AMD Zen 2 Desktop Kit, AMD Athlon 64 Sherman) ### Fixed - Do not print Vulkan Ray tracing status when indeterminate --- ## [v4.5.1] - 2022-10-23 ### Changed - Update databases (Intel Raptor Lake) - Display memory DIMMs with "Not Specified" manufacturer - Improve memory DIMMs capacity format ### Fixed - Fix segmentation fault in Vulkan code (specific to NVIDIA proprietary driver) - Fix "invalid write" when detecting OpenCL compute units --- ## [v4.5.0] - 2022-10-09 ### Added - Add support for hybrid CPUs (libcpuid v0.6.0 is required) - Add support for 'tab' key in NCurses TUI - Add scrolling in Memory tab in NCurses TUI ### Changed - Update databases (Intel Alder Lake, AMD Zen 4 (Raphael)) - Improve Vulkan Ray Tracing detection and device matching - Patch dmidecode to version 3.4.f50b925 ### Removed - Remove CPU voltage reading from in0_input probe - Remove support for libcpuid before v0.6.0 ### Fixed - Fix segmentation fault during arguments parsing when some features are disabled - Fix random numbers when CPU technology is not present in database (AMD) - Fix segmentation fault in Vulkan code (specific to Intel Anv) - Workaround in OpenCL code in case of aborted signal (specific to AMD ROCm) --- ## [v4.4.0] - 2022-08-28 ### Added - Support for libproc-2 (procps-ng is still supported) - Add Graphics API Version and Vulkan Ray Tracing in Graphics tab (Vulkan libraries are optionally required) - Add VBIOS Version in Graphics tab ### Changed - Display "Configured Memory Speed" instead of "Speed" in Memory tab - Patch dmidecode to version 3.4.a1a2258 - Update CPU databases (AMD Rembrandt) ### Fixed - Fix build when libstatgrab support is forced - Fix flickering in Graphics tab during refresh --- ## [v4.3.1] - 2022-05-08 ### Fixed - Fix CPU usage in System tab when theme is Auto - Fix a crash when libpci is upgraded and CPU-X is not rebuild against the new shared library --- ## [v4.3.0] - 2022-02-18 ### Added - Add Compute Unit in Graphics Tab (require OpenCL) - Add Resizable BAR in Graphics tab ### Changed - Update databases - Rename from "Ext. Family/Model" to "Disp. Family/Model" - Display a warning for unsupported CPUs - Patch dmidecode to version 3.3.024b0fb4 ### Fixed - Fix build with musl libc - Limit number of characters for labels in Graphics tab (GTK GUI) - Allow to translate settings (GTK GUI) --- ## [v4.2.0] - 2021-03-28 ### Added - Add new option `--cpuid-decimal` to display CPUID values in decimal - Add User Mode Driver (UMD) in Graphics Tab (require GLFW) - Add GPU DeviceID:RevisonID in Graphics tab - Add PCIe link speed/width in Graphics tab ### Changed - Reduce the GPU clock precision in Graphics tab - Reserve 'HT' keyword for Intel CPUs only, and use 'SMT' for other vendors instead - Update CPU databases - Support more GPU in Graphics tab - Use unit prefixes in System tab - Add a dropdown list in Graphics tab to choose graphic card to monitor ### Removed - Remove support for libcpuid before v0.5.0 ### Fixed - Apply dmidecode upstream patch to fix warnings - Fix for `--issue-fmt` - Fix overflow caused by some translations - Fix socket path on FreeBSD --- ## [v4.1.0] - 2021-01-10 ### Added - Add `CPUX_ARGS` environment variable to set default command line - Add alternative key mapping for NCurses mode (option `--keymap`) - Add debug mode (option `--debug`) - Add screen reader accessibility on GUI - Add Core Voltage, Power Avg and Memory Used in Graphics tab (AMDGPU only) ### Changed - Prefix all hexadecimal values with `0x` - Reword nonsensical messages - Update databases - Request `Tdie` temperature for `k10temp` if available - Change bars color in System tab in GTK GUI when Dark theme is used - Patch dmidecode to version 3.3.3c111e4 - Use binary prefixes for System tab ### Fixed - Fix build on FreeBSD when GTK is enabled - Fix build on musl libc - Fix list of influenceable environment variables in help - Fix override of refresh value when GTK is enabled - Fix screen flickering in NCurses TUI - Ignore batteries voltage when searching CPU voltage - Fix build when gettext support is disabled - Allow to run CPU-X daemon from AppImage --- ## [v4.0.1] - 2020-06-13 ### Changed - Optimize images - Prioritize rootless GPU load percentage retrievement for AMDGPU GPU ### Fixed - Fix double MHz and % symbols on Graphics page with NVIDIA GPU - Fix reopening of settings window in GTK GUI - Fix `optirun: command not found` error with NVIDIA GPU - Mount debugfs if not mounted before reading GPU load percentage for AMDGPU GPU --- ## [v4.0.0] - 2020-05-17 ### Added - Add a daemon to handle privileged access - Add basic completions for Bash/Fish/Zsh - Add settings window in GUI - Add "Driver" label in Graphics tab - Retrieve CPU temperature on FreeBSD - Add support for zenpower module - Add continuous build of AppImage ### Changed - Patch dmidecode to version 3.2.5b3c8e9 - Move translations from Transifex to Weblate - Uniform all units (byte and octet) - Rewrite all CLI options - Write output to `/tmp/cpu-x.log` and `/tmp/cpu-x-daemon.log` files when `--issue-fmt` is used - Update databases - Replace `nvidia-settings` command calls by `nvidia-smi` - Support for L1 Instruction Cache information ### Removed - Remove portable binary - Remove libcurl dependency - Remove libjson-c dependency - Remove all privileged access in `cpu-x` binary (moved to `cpu-x-daemon`) - Remove "CPU-X (Root)" desktop launcher ### Fixed - Fix some awk regex - Fix `load_module()` function - Fix options parsing - Fix build on FreeBSD - Various C fixes (unsafe functions and warnings) - Fix Bumblebee support for NVIDIA/Nouveau - Fix with VFIO GPU driver - Fix GUI switches appearance in Bench tab - Fix issues with AppImage - Various fixes in NCurses TUI --- ## [v3.2.4] - 2019-01-13 ### Changed - Build portable binary without PIE - Improve AppImage experience - Use GitHub API to check new version (libjson-c) ### Deprecated - Deprecate the portable version ### Fixed - Wrong GPU clocks with AMDGPU driver - Empty memory bank label - Build without gettext --- ## [v3.2.3] - 2018-07-01 ### Added - `TEXTDOMAINDIR`/`TERMINFO` support - Add AppData metainfo file - NVIDIA Bumblebee support ### Changed - Patch Dmidecode to v3.1.20180620 ### Removed - Support for CMake < 3.0 --- ## [v3.2.2] - 2018-05-03 ### Changed - Update CPU database ### Fixed - Segfault when retrieving AMD GPU temperature --- ## [v3.2.1] - 2018-03-24 ### Changed - Switch Cache and Swap colors in System tab ### Removed - Drop 32-bit portable version for future releases ### Fixed - Swap bar in NCurses TUI - Bug in Bandwidth related to AVX instructions --- ## [v3.2.0] - 2018-01-31 ### Added - Add ability to read CPUID raw file (CPUX_CPUID_RAW environment variable) - Add `--issue-fmt` argument - Allow to enforce BCLK (CPUX_BCLK environment variable) - New GTK theme for Dark themes - Retrive CPU frequency in fallback mode - Add GPU usage and GPU clocks in Graphics tab - Add Polish translation (thanks to eloaders) - Add Russian translation (thanks to TotalCaesar659) - Add Czech translation (thanks to pavelb) - Add Chinese translation (thanks to 高垚鑫) ### Changed - Update CPU database - Display influenceable environment variables in help - Display CPU family/model in hex only - Add a second line for Instructions label - Improve CPU temperature and voltage retrieval in fallback mode - Improve GPU temperature retrieval - Rework GPU detection and improve multi-GPU support - Patch Dmidecode to v3.1.20180131 - Patch Bandwidth to v1.5.1 ### Removed - Support for libcpuid < 0.4.0 ### Fixed - SSE3 feature detection - Cache labels format - `--nocolor` option - Set window icon in GTK GUI - cpu-x_polkit command on Wayland (used by cpu-x-root.desktop) - Buffer overflow in some cases when Dmidecode is called --- ## [v3.1.3] - 2016-10-25 ### Added - Add Russian translation to shortcuts (thanks to TotalCaesar659) ### Changed - Add more AMD Kaveri CPUs in database - Print CPUID raw dumps when using `--dump --verbose` ### Fixed - Segfault in `call_libcpuid_static()` - GTK GUI theme --- ## [v3.1.2] - 2016-10-23 ### Added - Allow to set Bclk through CPUX_BCLK environment variable ### Changed - Avoid to refresh Bclk and minimum/maximum CPU multipliers - Rework CPU multipliers calculation - Add AMD Tyler CPUs in database - Reorganize databases ### Fixed - Segfault caused by `free_multi()` - Socket detection in fallback mode - Kernel module load in fallback mode --- ## [v3.1.1] - 2016-10-16 ### Fixed - Bandwidth build on system without stropts.h - Segfault in `cpu_multipliers_fallback()` - Asking for update when already up-to-date in portable version - Dynamic allocation checking - Memory leaks --- ## [v3.1.0] - 2016-09-24 ### Added - Libcurl support - Libarchive support in portable version - Add support for L4 cache in Caches tab - Add `--tab` option ### Changed - Patch Dmidecode to 3.0.20160907 - Rebase Bandwidth on v1.3.1 - Decrease Dmidecode verbosity with `--verbose` - Merge Descriptor label in Size label in Caches tab - Hide absent cache levels in Caches tab in GTK GUI - Hide empty pages in GTK GUI - Refactor Memory tab - Various minor core enhancements ### Removed - Support for libcpuid < 0.3.0 - Support for GTK 3.8 & 3.10 ### Fixed - Broken redirection with `--dump` - Memory leaks - Bandwidth build with -DWITH_LIBCPUID=0 - Set speed to 0 for unavailable Bandwidth tests --- ## [v3.0.1] - 2016-08-23 ### Changed - Add more CPU and sockets in database - Decrease verbosity in Dmidecode and Bandwidth - Improve fallback mode ### Fixed - Refresh in fallback mode - Detection of GPU temperature with NVIDIA proprietary driver - Check for a new version when network is unreachable - Various minor fixes --- ## [v3.0.0] - 2016-06-15 ### Added - Report total CPU usage - Add a signal handler to provide backtrace on crash - Add `--nocolor` option - Add `--cachetest` option - Add `--bandwidth` option - Add `--core` option - Add a Bench tab ### Changed - More CMake improvements, allow to build with CMake 2.8 - Full core rewrite - Improve options parsing - Rewrite update module for portable version + add `--update` option - Rewrite NCurses UI + add color support + add help - CPU-X logo redesign - Patch dmidecode with latest source code (commit cff11af) - Rebase bandwidth on v1.1 - Recognize more CPUs for the "Technology" label in CPU tab - Print some values > 9 in hexadecimal in CPU tab - More fallback support - More strings in `--verbose` mode - A lot of GTK UI tweaks - Run bandwith in a separate thread to avoid UI slowdown ### Removed - Drop support for Darwin/Mac OS X - Report CPU BogoMIPS value --- ## [v2.2.2] - 2015-12-02 ### Changed - Add technology report for some Clarksfield & Richland CPUs ### Fixed - Avoid to free dynamic labels in Caches tab - Free memory when possible in `pcidev()` function - Fix a buffer overflow on HT detection, causing bug in bandwidth --- ## [v2.2.1] - 2015-11-27 ### Changed - Add debugs symbols in bandwidth source code when using CMAKE_BUILD_TYPE=Debug ### Fixed - Segfault on NULL pointer in `bandwidth()` - Buffer overflow when setting label name in Caches tab --- ## [v2.2.0] - 2015-11-21 ### Added - Add support for libcpuid 0.2.2 - Add new tab Caches - Add labels Technology, Voltage and Temp in CPU tab - Add lebel Temperature in Graphics tab ### Changed - Some changes in options parsing - Update to dmidecode 3.0 - In NCurses TUI, add tab names - Merge Architecture label in Instructions label in CPU tab - Merge GPU driver with GPU vendor in Graphics tab - Update GUI for GTK >= 3.8 and < 3.14 ### Fixed - Typo - L3 cache value - Some problems with `libdmi_fallback()` - .desktop files - Build with Clang - Stop update if curl is missing --- ## [v2.1.1] - 2015-08-26 ### Added - Add translations support in portable version - Add HyperThreading detection - Option `--version` informs if a new version is available - Add an auto-update module for portable version - Add pt_BR translation (thanks to ShyPixie) ### Changed - Some text changes in `--verbose` mode - Improve translations support (rewrite target updatepo, add target newpo...) ### Fixed - Segfault with `strdup()` on NULL pointer - Avoid multipliers "(0 ## 0)" in CPU tab and "-nan" values in System tab - Fixes garbages after freeing - Some problems with build - Do changes to enable compilation with libpci.a in portable version --- ## [v2.1.0] - 2015-08-08 ### Added - Add libsystem - Add a button to change GTK GUI color - Add new chipset section in Motherboard tab - Add new tab Graphics - GTK 3.14 support / partial GTK 3.16 support ### Changed - Improve drawing bars in System tab in GTK GUI - Use dynamic arrays instead of static arrays - Use GResource instead of GdkPixbuf in GTK embedded GUI ### Fixed - Build - Options - Deprecated functions in GTK GUI code --- ## [v2.0.3] - 2015-03-15 ### Added - Add verbose mode (for CPU-X, previously Dmidecode only) - Colorized messages - Add a "Run as root" button in GTK GUI - Add `make uninstall` target to allow to properly uninstall CPU-X - Add `make genpot` target to generate a pot file - Add `make updatepo` target to update a po file from a newer pot file ### Changed - Better support for non-Linux OS - Improve displaying of memory usage in System tab ### Removed - Remove RPATH ### Fixed - Stop spam errors (in Dmidecode) - Options when built without GTK - Incomplete possibility for translation - Output messages (verbose and error) --- ## [v2.0.2] - 2015-02-08 ### Added - Add argument `--dmidecode` to run (internal) Dmidecode alone ### Changed - Rebase dmidecode code on 2.12 - Improve options parsing - Less (useless) function recalls on refresh loop - Display dashes for empty banks in RAM tab ### Fixed - Empty RAM tab on certain machines --- ## [v2.0.1] - 2014-11-23 ### Added - Add possibility to resize terminal with NCurses TUI ### Changed - Better CPU multiplier calculation - Hide non-existent banks in tab RAM - Better compiler detection - Improve option `--help` - Better translation support ### Fixed - NCurses TUI: correct refresh (when left key/button 3 on mouse are spammed) - NCurses TUI: segfault when spamming right key - GTK GUI/NCurses TUI: use timeout instead of new thread to refresh - Segfault when file `/etc/os-release` could not be open - Add more static libraries in portable binary --- ## [v2.0.0] - 2014-11-16 ### Added - Add argument `--dump` (no start GUI) - Add fallback mode for Libdmi (but it not replaces Libdmi) - Add new tab System - Add new tab RAM - Add support for translations (only French available) - Add CPU-X launchers (depends of GTK); cpu-x.desktop and cpu-x-root.desktop - Add possibility to run CPU-X as root with pkexec - Add more CPU vendor logos ### Changed - Big changes in core - Full rewrite GTK GUI - Minor changes in NCurses TUI ### Fixed - Segfault when compiling with target Release - Memory leak (with function get_path) --- ## [v1.2.2] - 2014-11-05 ### Added - Add argument `--verbose` (set Dmidecode verbose) ### Changed - Print nothing on impossible values (Caches section) ### Fixed - Stop distort GTK GUI when label length is large - Stop spam errors (about CPU frequencies) - Typos (BogoMIPS, CPU Vendor, label Manufacturer) --- ## [v1.2.1] - 2014-10-24 ### Added - Add arguments support (`--no-gui`, `--version`, `--help`) - Add support for custom refresh time (`--refresh`) ### Changed - Rewrite error messages - Restructuration of files and functions in files ### Fixed - Segfault when compiling without GTK & embeded - Unwanted characters in NCurses - Compilation with CMake --- ## [v1.2.0] - 2014-10-12 ### Added - Add NCurses mode ### Changed - Add possibility to disable GTK/NCurses/Libcpuid/Libdmi before compiling ### Fixed - CPU multipliers calculation - Relative path of file on error - Segfault on unknown multiplier - Unwanted characters --- ## [v1.1.0] - 2014-09-28 ### Added - Add possibility to change install prefix ### Changed - Change build system from Makefile to CMake - Remove calls to external command `dmidecode`, use provided library instead of - Remove calls to external command `lscpu` --- ## [v1.0.0] - 2014-09-21 - Initial release CPU-X-5.0.3/README.md000066400000000000000000000176421454622605200136520ustar00rootroot00000000000000 [![Logo](https://github.com/TheTumultuousUnicornOfDarkness/CPU-X/blob/master/data/icons/CPU-X_22x22.png?raw=true)](https://thetumultuousunicornofdarkness.github.io/CPU-X/) [![GitHub release](https://img.shields.io/github/release/TheTumultuousUnicornOfDarkness/CPU-X.svg)](https://github.com/TheTumultuousUnicornOfDarkness/CPU-X/tags) [![GitHub commits](https://img.shields.io/github/commits-since/TheTumultuousUnicornOfDarkness/CPU-X/latest.svg)](https://github.com/TheTumultuousUnicornOfDarkness/CPU-X/commits/master) [![GitHub downloads](https://img.shields.io/github/downloads/TheTumultuousUnicornOfDarkness/CPU-X/latest/total.svg)](https://github.com/TheTumultuousUnicornOfDarkness/CPU-X/releases/latest) [![GitHub total downloads](https://img.shields.io/github/downloads/TheTumultuousUnicornOfDarkness/CPU-X/total.svg)](https://github.com/TheTumultuousUnicornOfDarkness/CPU-X/releases) [![GitHub issues](https://img.shields.io/github/issues/TheTumultuousUnicornOfDarkness/CPU-X.svg)](https://github.com/TheTumultuousUnicornOfDarkness/CPU-X/issues) [![GitHub pull-requests](https://img.shields.io/github/issues-pr/TheTumultuousUnicornOfDarkness/CPU-X.svg)](https://GitHub.com/TheTumultuousUnicornOfDarkness/CPU-X/pull) [![Translation status](https://hosted.weblate.org/widgets/cpu-x/-/svg-badge.svg)](https://hosted.weblate.org/engage/cpu-x/?utm_source=widget) | Linux | FreeBSD | AppImage | | :---: | :---: | :---: | | [![Build Status (Linux)](https://github.com/TheTumultuousUnicornOfDarkness/CPU-X/workflows/Linux%20build/badge.svg?branch=master)](https://github.com/TheTumultuousUnicornOfDarkness/CPU-X/actions?query=workflow%3A%22Linux+build%22) | [![Build Status (FreeBSD)](https://api.cirrus-ci.com/github/TheTumultuousUnicornOfDarkness/CPU-X.svg)](https://cirrus-ci.com/github/TheTumultuousUnicornOfDarkness/CPU-X) | [![AppImage Continuous](https://github.com/TheTumultuousUnicornOfDarkness/CPU-X/workflows/AppImage%20Continuous/badge.svg?branch=master)](https://github.com/TheTumultuousUnicornOfDarkness/CPU-X/actions?query=workflow%3A%22AppImage+Continuous%22) | **CPU-X** is a Free software that gathers information on CPU, motherboard and more. CPU-X is a system profiling and monitoring application (similar to [CPU-Z for Windows](https://www.cpuid.com/softwares/cpu-z.html)), but CPU-X is a Free and Open Source software designed for GNU/Linux and FreeBSD. This software is written in C++ and built with [CMake](https://www.cmake.org/) tool. It can be used in graphical mode by using GTK or in text-based mode by using NCurses. A dump mode is present from command line. **:warning: There are no milestones for this project, read [this announcement](https://github.com/TheTumultuousUnicornOfDarkness/CPU-X/wiki/future-of-project) for more details.** *** # Table of contents - [Table of contents](#table-of-contents) - [Dependencies](#dependencies) - [Build-only dependencies](#build-only-dependencies) - [Test dependencies](#test-dependencies) - [Build and run dependencies](#build-and-run-dependencies) - [Download and install](#download-and-install) - [From repositories](#from-repositories) - [From GitHub releases](#from-github-releases) - [From Flathub](#from-flathub) - [Manual build](#manual-build) - [Usage](#usage) - [Wiki](#wiki) - [Bugs/Improvements/Request features](#bugsimprovementsrequest-features) - [Translate CPU-X](#translate-cpu-x) *** ## Dependencies ### Build-only dependencies These dependencies are needed to **build** CPU-X: * A C++ compiler ([GCC](https://gcc.gnu.org/) or [Clang](https://clang.llvm.org/)) * [CMake](https://www.cmake.org/) * [Pkg-Config](https://www.freedesktop.org/wiki/Software/pkg-config/) / [Pkgconf](https://github.com/pkgconf/pkgconf) * [NASM](https://www.nasm.us/) ### Test dependencies These dependencies are optional to **test** CPU-X: * [Grep](https://www.gnu.org/software/grep/) * [GNU Awk¹](https://www.gnu.org/software/gawk/) * [Mawk¹](https://invisible-island.net/mawk/) * [One true awk¹](https://github.com/onetrueawk/awk) **¹**At least on Awk is required, e.g. the default Awk on the system. ### Build and run dependencies These dependencies are needed to **build²** and **run** CPU-X: * [Gtkmm3](https://www.gtkmm.org/en/index.html) (versions 3.12 to 3.24 are supported) * [NCurses](https://www.gnu.org/software/ncurses/) * [Libcpuid](http://libcpuid.sourceforge.net/) (version 0.6.0 or newer is needed) * [Pciutils](https://mj.ucw.cz/sw/pciutils/) * [GLFW](https://www.glfw.org/) (version 3.3 or newer is needed), with [OpenGL](https://www.opengl.org/) * [Vulkan](https://www.vulkan.org/) * [OpenCL](https://www.khronos.org/opencl/) (version 1.2 or newer is needed), **disabled by default** (enable with `-DWITH_OPENCL=1` during CMake invocation) * [Procps-ng](https://sourceforge.net/projects/procps-ng/) (Linux) / [Libstatgrab](https://www.i-scream.org/libstatgrab/) (*BSD) **²**On some GNU/Linux distributions, the appropriate **-dev** or **-devel** package is needed. ## Download and install ### From repositories In alphabetical order: - [Debian (since version 11 "Bullseye")](https://packages.debian.org/search?searchon=names&keywords=cpu-x): `apt install cpu-x` - [Fedora (since version 30)](https://src.fedoraproject.org/rpms/cpu-x): `dnf install cpu-x` - [FreeBSD (since version 11)](https://www.freshports.org/sysutils/cpu-x): `pkg install cpu-x` - [OpenMandriva Lx (since version 4.0 "Nitrogen")](https://github.com/OpenMandrivaAssociation/cpu-x): `dnf install cpu-x` - [openSUSE Leap (since version 15.2 from **utilities** project)](https://software.opensuse.org//download.html?project=utilities&package=cpu-x): `zypper install cpu-x` - [Solus](https://packages.getsol.us/shannon/c/cpu-x/): `eopkg install cpu-x` - [Ubuntu (since version 20.04 "Focal Fossa")](https://packages.ubuntu.com/search?suite=default§ion=all&arch=any&keywords=cpu-x&searchon=names) : `apt install cpu-x` All packages: [![Packaging status](https://repology.org/badge/vertical-allrepos/cpu-x.svg?exclude_unsupported=1)](https://repology.org/project/cpu-x/versions) ### From GitHub releases Look for **Assets** [here ![GitHub release](https://img.shields.io/github/release/TheTumultuousUnicornOfDarkness/CPU-X.svg)](https://github.com/TheTumultuousUnicornOfDarkness/CPU-X/releases/latest) for portable binary (AppImage). ### From Flathub CPU-X is available [as Flatpak on Flathub](https://flathub.org/fr/apps/io.github.thetumultuousunicornofdarkness.cpu-x) since v5.0.2. ### Manual build For step-by-step guide, please read [this page](https://github.com/TheTumultuousUnicornOfDarkness/CPU-X/wiki/manual-build) on the Wiki. ## Usage Application is available in menu (**System Tools** category). If you start the daemon, it will allow CPU-X to access some special devices, which provides more information and avoid empty labels. The CPU-X daemon requires root privileges, and uses Polkit for privileges escalation. You can use `cpu-x` from command line, some options are available, like: - `--gtk`: to start the graphical user interface (default) - `--ncurses`: to start the text-based user interface - `--dump`: to get a summary of data Use `--help` to see all arguments. ## Wiki More informations are available on Wiki, like screenshots, troubleshooting and tips. You can access the Wiki by using [this link](https://github.com/TheTumultuousUnicornOfDarkness/CPU-X/wiki). ## Bugs/Improvements/Request features Please [open a new issue](https://github.com/TheTumultuousUnicornOfDarkness/CPU-X/issues/new/choose) and fill the appropriate template. Note that text between `` is not displayed. :warning: **Incomplete reports may be closed without justification.** ## Translate CPU-X If you want to translate CPU-X in your native tongue, please visit the [Weblate page](https://hosted.weblate.org/engage/cpu-x/?utm_source=widget). POT file is updated on each changes thanks to [Update POT file workflow](https://github.com/TheTumultuousUnicornOfDarkness/CPU-X/actions?query=workflow%3A%22Update+POT+file%22). CPU-X-5.0.3/cmake/000077500000000000000000000000001454622605200134415ustar00rootroot00000000000000CPU-X-5.0.3/cmake/FindFilesystem.cmake000066400000000000000000000171041454622605200173730ustar00rootroot00000000000000# Taken from https://raw.githubusercontent.com/vector-of-bool/CMakeCM/master/modules/FindFilesystem.cmake # Distributed under the OSI-approved BSD 3-Clause License. See accompanying # file Copyright.txt or https://cmake.org/licensing for details. #[=======================================================================[.rst: FindFilesystem ############## This module supports the C++17 standard library's filesystem utilities. Use the :imp-target:`std::filesystem` imported target to Options ******* The ``COMPONENTS`` argument to this module supports the following values: .. find-component:: Experimental :name: fs.Experimental Allows the module to find the "experimental" Filesystem TS version of the Filesystem library. This is the library that should be used with the ``std::experimental::filesystem`` namespace. .. find-component:: Final :name: fs.Final Finds the final C++17 standard version of the filesystem library. If no components are provided, behaves as if the :find-component:`fs.Final` component was specified. If both :find-component:`fs.Experimental` and :find-component:`fs.Final` are provided, first looks for ``Final``, and falls back to ``Experimental`` in case of failure. If ``Final`` is found, :imp-target:`std::filesystem` and all :ref:`variables ` will refer to the ``Final`` version. Imported Targets **************** .. imp-target:: std::filesystem The ``std::filesystem`` imported target is defined when any requested version of the C++ filesystem library has been found, whether it is *Experimental* or *Final*. If no version of the filesystem library is available, this target will not be defined. .. note:: This target has ``cxx_std_17`` as an ``INTERFACE`` :ref:`compile language standard feature `. Linking to this target will automatically enable C++17 if no later standard version is already required on the linking target. .. _fs.variables: Variables ********* .. variable:: CXX_FILESYSTEM_IS_EXPERIMENTAL Set to ``TRUE`` when the :find-component:`fs.Experimental` version of C++ filesystem library was found, otherwise ``FALSE``. .. variable:: CXX_FILESYSTEM_HAVE_FS Set to ``TRUE`` when a filesystem header was found. .. variable:: CXX_FILESYSTEM_HEADER Set to either ``filesystem`` or ``experimental/filesystem`` depending on whether :find-component:`fs.Final` or :find-component:`fs.Experimental` was found. .. variable:: CXX_FILESYSTEM_NAMESPACE Set to either ``std::filesystem`` or ``std::experimental::filesystem`` depending on whether :find-component:`fs.Final` or :find-component:`fs.Experimental` was found. Examples ******** Using `find_package(Filesystem)` with no component arguments: .. code-block:: cmake find_package(Filesystem REQUIRED) add_executable(my-program main.cpp) target_link_libraries(my-program PRIVATE std::filesystem) #]=======================================================================] if(TARGET std::filesystem) # This module has already been processed. Don't do it again. return() endif() cmake_minimum_required(VERSION 3.10) include(CMakePushCheckState) include(CheckIncludeFileCXX) # If we're not cross-compiling, try to run test executables. # Otherwise, assume that compile + link is a sufficient check. if(CMAKE_CROSSCOMPILING) include(CheckCXXSourceCompiles) macro(_cmcm_check_cxx_source code var) check_cxx_source_compiles("${code}" ${var}) endmacro() else() include(CheckCXXSourceRuns) macro(_cmcm_check_cxx_source code var) check_cxx_source_runs("${code}" ${var}) endmacro() endif() cmake_push_check_state() set(CMAKE_REQUIRED_QUIET ${Filesystem_FIND_QUIETLY}) # All of our tests required C++17 or later set(CMAKE_CXX_STANDARD 17) # Normalize and check the component list we were given set(want_components ${Filesystem_FIND_COMPONENTS}) if(Filesystem_FIND_COMPONENTS STREQUAL "") set(want_components Final) endif() # Warn on any unrecognized components set(extra_components ${want_components}) list(REMOVE_ITEM extra_components Final Experimental) foreach(component IN LISTS extra_components) message(WARNING "Extraneous find_package component for Filesystem: ${component}") endforeach() # Detect which of Experimental and Final we should look for set(find_experimental TRUE) set(find_final TRUE) if(NOT "Final" IN_LIST want_components) set(find_final FALSE) endif() if(NOT "Experimental" IN_LIST want_components) set(find_experimental FALSE) endif() if(find_final) check_include_file_cxx("filesystem" _CXX_FILESYSTEM_HAVE_HEADER) mark_as_advanced(_CXX_FILESYSTEM_HAVE_HEADER) if(_CXX_FILESYSTEM_HAVE_HEADER) # We found the non-experimental header. Don't bother looking for the # experimental one. set(find_experimental FALSE) endif() else() set(_CXX_FILESYSTEM_HAVE_HEADER FALSE) endif() if(find_experimental) check_include_file_cxx("experimental/filesystem" _CXX_FILESYSTEM_HAVE_EXPERIMENTAL_HEADER) mark_as_advanced(_CXX_FILESYSTEM_HAVE_EXPERIMENTAL_HEADER) else() set(_CXX_FILESYSTEM_HAVE_EXPERIMENTAL_HEADER FALSE) endif() if(_CXX_FILESYSTEM_HAVE_HEADER) set(_have_fs TRUE) set(_fs_header filesystem) set(_fs_namespace std::filesystem) set(_is_experimental FALSE) elseif(_CXX_FILESYSTEM_HAVE_EXPERIMENTAL_HEADER) set(_have_fs TRUE) set(_fs_header experimental/filesystem) set(_fs_namespace std::experimental::filesystem) set(_is_experimental TRUE) else() set(_have_fs FALSE) endif() set(CXX_FILESYSTEM_HAVE_FS ${_have_fs} CACHE BOOL "TRUE if we have the C++ filesystem headers") set(CXX_FILESYSTEM_HEADER ${_fs_header} CACHE STRING "The header that should be included to obtain the filesystem APIs") set(CXX_FILESYSTEM_NAMESPACE ${_fs_namespace} CACHE STRING "The C++ namespace that contains the filesystem APIs") set(CXX_FILESYSTEM_IS_EXPERIMENTAL ${_is_experimental} CACHE BOOL "TRUE if the C++ filesystem library is the experimental version") set(_found FALSE) if(CXX_FILESYSTEM_HAVE_FS) # We have some filesystem library available. Do link checks string(CONFIGURE [[ #include #include <@CXX_FILESYSTEM_HEADER@> int main() { auto cwd = @CXX_FILESYSTEM_NAMESPACE@::current_path(); printf("%s", cwd.c_str()); return EXIT_SUCCESS; } ]] code @ONLY) # Check a simple filesystem program without any linker flags _cmcm_check_cxx_source("${code}" CXX_FILESYSTEM_NO_LINK_NEEDED) set(can_link ${CXX_FILESYSTEM_NO_LINK_NEEDED}) if(NOT CXX_FILESYSTEM_NO_LINK_NEEDED) set(prev_libraries ${CMAKE_REQUIRED_LIBRARIES}) # Add the libstdc++ flag set(CMAKE_REQUIRED_LIBRARIES ${prev_libraries} -lstdc++fs) _cmcm_check_cxx_source("${code}" CXX_FILESYSTEM_STDCPPFS_NEEDED) set(can_link ${CXX_FILESYSTEM_STDCPPFS_NEEDED}) if(NOT CXX_FILESYSTEM_STDCPPFS_NEEDED) # Try the libc++ flag set(CMAKE_REQUIRED_LIBRARIES ${prev_libraries} -lc++fs) _cmcm_check_cxx_source("${code}" CXX_FILESYSTEM_CPPFS_NEEDED) set(can_link ${CXX_FILESYSTEM_CPPFS_NEEDED}) endif() endif() if(can_link) add_library(std::filesystem INTERFACE IMPORTED) set_property(TARGET std::filesystem APPEND PROPERTY INTERFACE_COMPILE_FEATURES cxx_std_17) set(_found TRUE) if(CXX_FILESYSTEM_NO_LINK_NEEDED) # Nothing to add... elseif(CXX_FILESYSTEM_STDCPPFS_NEEDED) set_property(TARGET std::filesystem APPEND PROPERTY INTERFACE_LINK_LIBRARIES -lstdc++fs) elseif(CXX_FILESYSTEM_CPPFS_NEEDED) set_property(TARGET std::filesystem APPEND PROPERTY INTERFACE_LINK_LIBRARIES -lc++fs) endif() endif() endif() cmake_pop_check_state() set(Filesystem_FOUND ${_found} CACHE BOOL "TRUE if we can run a program using std::filesystem" FORCE) if(Filesystem_FIND_REQUIRED AND NOT Filesystem_FOUND) message(FATAL_ERROR "Cannot run simple program using std::filesystem") endif() CPU-X-5.0.3/cmake/GSettings.cmake000066400000000000000000000037011454622605200163530ustar00rootroot00000000000000# See: https://raw.githubusercontent.com/ammonkey/marlin/master/cmake/GSettings.cmake # GSettings.cmake, CMake macros written for Marlin, feel free to re-use them. option (GSETTINGS_LOCALINSTALL "Install GSettings Schemas locally instead of to the GLib prefix" ON) option (GSETTINGS_COMPILE "Compile GSettings Schemas after installation" ${GSETTINGS_LOCALINSTALL}) if(GSETTINGS_LOCALINSTALL) message(STATUS "GSettings schemas will be installed locally.") endif() if(GSETTINGS_COMPILE) message(STATUS "GSettings shemas will be compiled.") endif() macro(add_schema SCHEMA_NAME) set(PKG_CONFIG_EXECUTABLE pkg-config) # Have an option to not install the schema into where GLib is if (GSETTINGS_LOCALINSTALL) SET (GSETTINGS_DIR "${CMAKE_INSTALL_PREFIX}/share/glib-2.0/schemas/") else (GSETTINGS_LOCALINSTALL) execute_process (COMMAND ${PKG_CONFIG_EXECUTABLE} glib-2.0 --variable prefix OUTPUT_VARIABLE _glib_prefix OUTPUT_STRIP_TRAILING_WHITESPACE) SET (GSETTINGS_DIR "${_glib_prefix}/share/glib-2.0/schemas/") endif (GSETTINGS_LOCALINSTALL) # Run the validator and error if it fails execute_process (COMMAND ${PKG_CONFIG_EXECUTABLE} gio-2.0 --variable glib_compile_schemas OUTPUT_VARIABLE _glib_comple_schemas OUTPUT_STRIP_TRAILING_WHITESPACE) execute_process (COMMAND ${_glib_comple_schemas} --dry-run --schema-file=${CMAKE_CURRENT_SOURCE_DIR}/${SCHEMA_NAME} ERROR_VARIABLE _schemas_invalid OUTPUT_STRIP_TRAILING_WHITESPACE) if (_schemas_invalid) message (SEND_ERROR "Schema validation error: ${_schemas_invalid}") endif (_schemas_invalid) # Actually install and recomple schemas message (STATUS "GSettings schemas will be installed into ${GSETTINGS_DIR}") install (FILES ${CMAKE_CURRENT_SOURCE_DIR}/${SCHEMA_NAME} DESTINATION ${GSETTINGS_DIR} OPTIONAL) if (GSETTINGS_COMPILE) install (CODE "message (STATUS \"Compiling GSettings schemas\")") install (CODE "execute_process (COMMAND ${_glib_comple_schemas} ${GSETTINGS_DIR})") endif () endmacro() CPU-X-5.0.3/cmake/cmake_uninstall.cmake.in000066400000000000000000000021571454622605200202260ustar00rootroot00000000000000# See: http://www.cmake.org/Wiki/CMake_FAQ#Can_I_do_.22make_uninstall.22_with_CMake.3F if(NOT EXISTS "@CMAKE_CURRENT_BINARY_DIR@/install_manifest.txt") message(FATAL_ERROR "Cannot find install manifest: @CMAKE_CURRENT_BINARY_DIR@/install_manifest.txt") endif(NOT EXISTS "@CMAKE_CURRENT_BINARY_DIR@/install_manifest.txt") file(READ "@CMAKE_CURRENT_BINARY_DIR@/install_manifest.txt" files) string(REGEX REPLACE "\n" ";" files "${files}") foreach(file ${files}) message(STATUS "Uninstalling $ENV{DESTDIR}${file}") if(IS_SYMLINK "$ENV{DESTDIR}${file}" OR EXISTS "$ENV{DESTDIR}${file}") exec_program("@CMAKE_COMMAND@" ARGS "-E remove \"$ENV{DESTDIR}${file}\"" OUTPUT_VARIABLE rm_out RETURN_VALUE rm_retval ) if(NOT "${rm_retval}" STREQUAL 0) message(FATAL_ERROR "Problem when removing $ENV{DESTDIR}${file}") endif(NOT "${rm_retval}" STREQUAL 0) else(IS_SYMLINK "$ENV{DESTDIR}${file}" OR EXISTS "$ENV{DESTDIR}${file}") message(STATUS "File $ENV{DESTDIR}${file} does not exist.") endif(IS_SYMLINK "$ENV{DESTDIR}${file}" OR EXISTS "$ENV{DESTDIR}${file}") endforeach(file) file(REMOVE_RECURSE @CPU_X_DATA_DIRECTORY@) CPU-X-5.0.3/cmake/gettext_create_translations.cmake000066400000000000000000000027571454622605200222660ustar00rootroot00000000000000# See: /usr/share/cmake-*.*/Modules/FindGettext.cmake # This is the GETTEXT_CREATE_TRANSLATIONS macro without GETTEXT_MSGMERGE_EXECUTABLE command macro(GETTEXT_CONVERT_TRANSLATIONS _potFile _firstPoFileArg) # make it a real variable, so we can modify it here set(_firstPoFile "${_firstPoFileArg}") set(_gmoFiles) get_filename_component(_potName ${_potFile} NAME) string(REGEX REPLACE "^(.+)(\\.[^.]+)$" "\\1" _potBasename ${_potName}) get_filename_component(_absPotFile ${_potFile} ABSOLUTE) set(_addToAll) if(${_firstPoFile} STREQUAL "ALL") set(_addToAll "ALL") set(_firstPoFile) endif() foreach (_currentPoFile ${_firstPoFile} ${ARGN}) get_filename_component(_absFile ${_currentPoFile} ABSOLUTE) get_filename_component(_abs_PATH ${_absFile} PATH) get_filename_component(_lang ${_absFile} NAME_WE) set(_gmoFile ${CMAKE_CURRENT_BINARY_DIR}/${_lang}.gmo) add_custom_command( OUTPUT ${_gmoFile} COMMAND ${GETTEXT_MSGFMT_EXECUTABLE} -o ${_gmoFile} ${_absFile} DEPENDS ${_absPotFile} ${_absFile} ) install(FILES ${_gmoFile} DESTINATION share/locale/${_lang}/LC_MESSAGES RENAME ${_potBasename}.mo) set(_gmoFiles ${_gmoFiles} ${_gmoFile}) endforeach () if(NOT TARGET translations) add_custom_target(translations) endif() _GETTEXT_GET_UNIQUE_TARGET_NAME(translations uniqueTargetName) add_custom_target(${uniqueTargetName} ${_addToAll} DEPENDS ${_gmoFiles}) add_dependencies(translations ${uniqueTargetName}) endmacro() CPU-X-5.0.3/data/000077500000000000000000000000001454622605200132725ustar00rootroot00000000000000CPU-X-5.0.3/data/CMakeLists.txt000066400000000000000000000026211454622605200160330ustar00rootroot00000000000000project(data LANGUAGES NONE ) add_subdirectory(completions) # Files needed by GTK GUI if(WITH_GTK) include(GSettings) # Set config file(MAKE_DIRECTORY ${CMAKE_DATA_OUTPUT_DIRECTORY}) configure_file(io.github.thetumultuousunicornofdarkness.cpu-x.desktop.in ${CMAKE_DATA_OUTPUT_DIRECTORY}/io.github.thetumultuousunicornofdarkness.cpu-x.desktop) configure_file(io.github.thetumultuousunicornofdarkness.cpu-x-daemon.policy.in ${CMAKE_DATA_OUTPUT_DIRECTORY}/io.github.thetumultuousunicornofdarkness.cpu-x-daemon.policy) # Install UIs install(FILES cpu-x-gtk-3.12.ui cpu-x-gtk-3.12.css cpu-x-gtk-3.12-dark.css cpu-x-gtk-3.20.css cpu-x-gtk-3.20-dark.css DESTINATION ${CPU_X_DATA_DIRECTORY}/ ) # AppData metainfo file install(FILES io.github.thetumultuousunicornofdarkness.cpu-x.appdata.xml DESTINATION ${CMAKE_INSTALL_FULL_DATADIR}/metainfo/ ) # Install launcher install(FILES ${CMAKE_DATA_OUTPUT_DIRECTORY}/io.github.thetumultuousunicornofdarkness.cpu-x.desktop DESTINATION ${CMAKE_INSTALL_FULL_DATADIR}/applications/ ) # Install policy rule install(FILES ${CMAKE_DATA_OUTPUT_DIRECTORY}/io.github.thetumultuousunicornofdarkness.cpu-x-daemon.policy DESTINATION ${CMAKE_INSTALL_FULL_DATADIR}/polkit-1/actions/ ) # Install schema file add_schema("io.github.thetumultuousunicornofdarkness.cpu-x.gschema.xml") add_subdirectory(icons) add_subdirectory(logos) endif(WITH_GTK) CPU-X-5.0.3/data/completions/000077500000000000000000000000001454622605200156265ustar00rootroot00000000000000CPU-X-5.0.3/data/completions/CMakeLists.txt000066400000000000000000000006271454622605200203730ustar00rootroot00000000000000project(completions LANGUAGES NONE ) install(FILES bash DESTINATION ${CMAKE_INSTALL_FULL_DATADIR}/bash-completion/completions/ RENAME ${CMAKE_PROJECT_NAME} ) install(FILES fish DESTINATION ${CMAKE_INSTALL_FULL_DATADIR}/fish/vendor_completions.d/ RENAME ${CMAKE_PROJECT_NAME}.fish ) install(FILES zsh DESTINATION ${CMAKE_INSTALL_FULL_DATADIR}/zsh/site-functions/ RENAME _${CMAKE_PROJECT_NAME} ) CPU-X-5.0.3/data/completions/bash000066400000000000000000000014321454622605200164660ustar00rootroot00000000000000_cpu_x() { local cur prev display opts COMPREPLY=() cur="${COMP_WORDS[COMP_CWORD]}" prev="${COMP_WORDS[COMP_CWORD-1]}" display=(-G --gtk -N --ncurses -D --dump -M --dmidecode -B --bandwidth -h --help -V --version) opts=(-r --refresh -t --tab -c --core -b --cachetest -d --daemon -v --verbose --nocolor --issue-fmt --keymap) case $prev in -G|--gtk|-N|--ncurses|-D|dump|-M|--dmidecode|-B|--bandwidth) COMPREPLY=($(compgen -W "${opts[*]}" -- "$cur")) ;; -h|--help|-V|--version) return 0 ;; -r|--refresh|-t|--tab|-c|--core|-b|--cachetest|-d|--daemon|-v|--verbose|--nocolor|--debug|--issue-fmt|--keymap) COMPREPLY=($(compgen -W "${opts[*]}" -- "$cur")) ;; *) COMPREPLY=($(compgen -W "${display[*]} ${opts[*]}" -- "$cur")) ;; esac } complete -F _cpu_x cpu-x CPU-X-5.0.3/data/completions/fish000066400000000000000000000030251454622605200165020ustar00rootroot00000000000000set -l progname cpu-x complete -c $progname -f set -l noopt 'not __fish_contains_opt -s G -s N -s D -s M -s B V gtk ncurses dump dmidecode bandwidth' complete -c $progname -s G -l gtk -n $noopt -d 'Start graphical user interface (GUI)' complete -c $progname -s N -l ncurses -n $noopt -d 'Start text-based user interface (TUI)' complete -c $progname -s D -l dump -n $noopt -d 'Dump all data on standard output and exit' complete -c $progname -s M -l dmidecode -n $noopt -d 'Run embedded command dmidecode and exit' complete -c $progname -s B -l bandwidth -n $noopt -d 'Run embedded command bandwidth and exit' complete -c $progname -s h -l help -n $noopt -d 'Print help and exit' complete -c $progname -s V -l version -n $noopt -d 'Print version and exit' complete -c $progname -s r -l refresh -x -d 'Set custom time between two refreshes (in seconds)' complete -c $progname -s t -l tab -x -d 'Set default tab (integer)' complete -c $progname -s c -l core -x -d 'Select CPU core to monitor (integer)' complete -c $progname -s b -l cachetest -x -d 'Set custom bandwidth test for CPU caches speed (integer)' complete -c $progname -s d -l daemon -d 'Start and connect to daemon' complete -c $progname -s v -l verbose -d 'Verbose output' complete -c $progname -l nocolor -d 'Disable colored output' complete -c $progname -l debug -d 'Print information for debugging' complete -c $progname -l issue-fmt -d 'Print required informations to paste in an issue' complete -c $progname -l keymap -x -d 'Set key mapping for NCurses mode (arrows|emacs|inverted-T|vim)' CPU-X-5.0.3/data/completions/zsh000066400000000000000000000017721454622605200163640ustar00rootroot00000000000000#compdef cpu-x _cpu_x() { _arguments -C \ {-G,--gtk}'[Start graphical user interface (GUI)]' \ {-N,--ncurses}'[Start text-based user interface (TUI)]' \ {-D,--dump}'[Dump all data on standard output and exit]' \ {-M,--dmidecode}'[Run embedded command dmidecode and exit]' \ {-B,--bandwidth}'[Run embedded command bandwidth and exi]' \ {-r,--refresh}'[Set custom time between two refreshes (in seconds)]' \ {-t,--tab}'[Set default tab (integer)]' \ {-c,--core}'[Select CPU core to monitor (integer)]' \ {-b,--cachetest}'[Set custom bandwidth test for CPU caches speed (integer)]' \ {-d,--daemon}'[Start and connect to daemon]' \ {-v,--verbose}'[Verbose output]' \ {-h,--help}'[Print help and exit]' \ {-V,--version}'[Print version and exit]' \ '--nocolor[Disable colored output]' \ '--debug[Print information for debugging]' \ '--issue-fmt[Print required informations to paste in an issue]' \ '--keymap[Set key mapping for NCurses mode (arrows|emacs|inverted-T|vim)]' } _cpu_x "$@" CPU-X-5.0.3/data/cpu-x-gtk-3.12-dark.css000066400000000000000000000002231454622605200171200ustar00rootroot00000000000000GtkBox#footer_box { color: rgb(46, 52, 54); background-color: rgb(76, 153, 230); } GtkLabel#value, GtkProgressBar { color: rgb(192, 192, 0); } CPU-X-5.0.3/data/cpu-x-gtk-3.12.css000066400000000000000000000002211454622605200161770ustar00rootroot00000000000000GtkBox#footer_box { color: rgb(46, 52, 54); background-color: rgb(76, 153, 230); } GtkLabel#value, GtkProgressBar { color: rgb(0, 0, 128); } CPU-X-5.0.3/data/cpu-x-gtk-3.12.ui000066400000000000000000013773051454622605200160510ustar00rootroot00000000000000 True False CPU-X False center True False vertical True True True True True False vertical True False 6 6 4 6 0 out True False 6 6 6 True False end True False vertical 2 True False end 4 1 1 proc_valvendor True 1 False True 0 True False end 4 1 1 proc_valcdename True 1 False True 1 True False end 4 1 1 proc_valpkg True 1 False True 2 True False end 4 1 1 proc_valtech True 1 False True 3 True False end 4 1 1 proc_valspec True 1 False True 4 True False end 4 1 1 proc_valfam True 1 False True 5 True False end 4 1 1 proc_valextfam True 1 False True 6 True False end 4 1 1 proc_valinstr True 1 False True 7 False True 0 True False vertical True False True False vertical True False 1 1 0 in True False center True end 30 True 30 1 False False 0 True False 1 1 0 in True False center True end 30 True 30 0 False False 1 True False 1 1 0 in True False center True end 30 True 30 1 False False 2 True False True False 1 1 0 in True False center True end 9 True 9 1 False False 0 True False 1 1 0 in True False center True end 9 True 9 1 False True end 1 True False 1 1 proc_valvolt True 1 False True 2 end 3 False True 3 False False 0 True False 4 2 0 True True 1 False False 0 True False 1 1 0 in True True True center True end 43 True 43 1 False False 1 True False True False 1 1 0 in True False center True end 7 True 7 1 0 0 True False 1 1 0 in True False center True end 7 True 7 1 0 1 True False 1 1 0 in True False center True end 7 True 7 1 2 0 True False 1 1 0 in True False center True end 7 True 7 1 2 1 True False end 6 4 1 1 True proc_valmod True 1 1 0 True False end 6 4 1 1 True proc_valextmod True 1 1 1 True False end 6 4 1 1 True proc_valtemp True 1 3 0 True False 1 1 0 in True False center True end 7 True 7 1 4 0 True False 1 1 0 in True False center True end 7 True 7 1 4 1 True False end 6 4 1 1 True proc_valstep True 1 3 1 False False 2 True False 1 0 in True True True True end 43 43 2 False False 3 False False 1 True False Processor False True 0 True False True False 6 6 6 True 0 out True False 6 6 6 True False end True False end 4 1 1 clock_valcore True 1 0 0 True False end 4 1 1 clock_valmult True 1 0 1 True False end 4 1 1 clock_valbus True 1 0 2 True False end 4 1 1 clock_valusage True 1 0 3 True False 1 1 0 in True False center True end 11 True 0.009999999776482582 11 1 1 0 True False 1 1 0 in True False center True end 11 True 11 1 1 1 True False 1 1 0 in True False center True end 11 True 11 1 1 2 True False 1 1 0 in True False center True end 11 True 11 1 1 3 True False Clocks False True 0 True False 6 6 True 0 out True False 6 6 6 True False end True False end 4 1 1 cache_vall1d True 1 0 0 True False end 4 1 1 cache_vall1i True 1 0 1 True False end 4 1 1 cache_vall2 True 1 0 2 True False end 4 1 1 cache_vall3 True 1 0 3 True False 1 1 0 in True False center True end 18 True 18 1 1 0 True False 1 1 0 in True False center True end 18 True 18 1 1 1 True False 1 1 0 in True False center True end 18 True 18 1 1 2 True False 1 1 0 in True False center True end 18 True 18 1 1 3 True False Cache False True 1 False True 1 True False 6 6 8 0 out True False 6 6 6 True False True False end 6 4 1 1 True Cores cpufooter_valcore True 1 2 0 True False end 6 4 1 1 True Threads cpufooter_valthrd True 1 4 0 True False 1 1 0 in True False center True end 5 True 5 1 3 0 True False 1 1 0 in True False center True end 5 True 5 1 5 0 True False 6 1 1 1 True 1 0 True False 6 1 1 1 True 0 0 True False 1 False True 2 True False CPU 1 False True True False True False 6 6 4 6 0 out True False 6 6 6 6 6 True False end True False 1 1 0 in True False True center True end 40 True 40 1 1 0 True False 1 1 0 in True False True center True end 40 True 40 1 1 1 True False end 4 4 1 1 l1cache_valsize True 1 0 0 True False end 4 4 1 1 l1cache_valspeed True 1 0 1 True False L1 Cache 0 0 True False 6 6 4 6 0 out True False 6 6 6 6 6 True False end True False 1 1 0 in True False True center True end 40 True 40 1 1 0 True False 1 1 0 in True False True center True end 40 True 40 1 1 1 True False end 4 4 1 1 l2cache_valsize True 1 0 0 True False end 4 4 1 1 l2cache_valspeed True 1 0 1 True False L2 Cache 0 1 True False 6 6 4 6 0 out True False 6 6 6 6 6 True False end True False 1 1 0 in True False True center True end 40 True 40 1 1 0 True False 1 1 0 in True False True center True end 40 True 40 1 1 1 True False end 4 4 1 1 l3cache_valsize True 1 0 0 True False end 4 4 1 1 l3cache_valspeed True 1 0 1 True False L3 Cache 0 2 True False 6 6 4 6 0 out True False 6 6 6 6 6 True False end True False 1 1 0 in True False True center True end 40 True 40 1 1 0 True False 1 1 0 in True False True center True end 40 True 40 1 1 1 True False end 4 4 1 1 l4cache_valsize True 1 0 0 True False end 4 4 1 1 l4cache_valsize True 1 0 1 True False L4 Cache 0 3 True False 6 6 4 6 0 out True False 6 6 6 6 6 True False True False Test 0 4 1 True False Caches 1 False True False vertical True False 6 6 4 6 0 out True False 6 6 6 True False end True False 1 1 0 in True False True center True end 40 True 40 1 1 0 True False 1 1 0 in True False True center True end 40 True 40 1 1 1 True False 1 1 0 in True False True center True end 40 True 40 1 1 2 True False end 4 1 1 motherboard_valmanu True 1 0 0 True False end 4 1 1 motherboard_valmod True 1 0 1 True False end 4 1 1 motherboard_valrev True 1 0 2 True False Motherboard False True 0 True False 6 6 4 6 0 out True False 6 6 6 True False end True False 1 1 0 in True False True center True end 40 True 40 1 1 0 True False 1 1 0 in True False True center True end 40 True 40 1 1 1 True False 1 1 0 in True False True center True end 40 True 40 1 1 2 True False 1 1 0 in True False True center True end 40 True 40 1 1 3 True False end 4 1 1 bios_valbrand True 1 0 0 True False end 4 1 1 bios_valvers True 1 0 1 True False end 4 1 1 bios_valdate True 1 0 2 True False end 4 1 1 bios_valrom True 1 0 3 True False BIOS False True 1 True False 6 6 4 6 0 out True False 6 6 6 True False end True False end 4 1 1 chip_valvend True 1 0 0 True False end 4 1 1 chip_valname True 1 0 1 True False 1 1 0 in True False True center True end 40 True 40 1 1 1 True False 1 1 0 in True False True center True end 40 True 40 1 1 0 True False Chipset False True 2 2 True False Motherboard 1 2 False True True in True False True False True False 6 6 6 6 4 6 0 out True False 6 6 6 6 6 True False end True False end 4 4 1 1 card_valtemp end True 15 1 0 6 True False True False 1 1 0 in True False center True end 13 True 13 1 False False 0 True False 1 1 0 in True False center True end 13 True 13 1 False True end 1 True False end 4 4 1 1 card_valusage middle True 18 1 False True 2 end 3 1 6 True False 1 1 0 in True False True center True end 40 True 40 1 1 1 True False end 4 4 1 1 card_valumd end True 15 1 0 1 True False 1 1 0 in True False True center True end 40 True 40 1 1 0 True False 1 1 0 in True False True center True end 40 True 40 1 1 2 True False 1 1 0 in True False True center True end 40 True 40 1 1 3 True False 1 1 0 in True False True center True end 40 True 40 1 1 4 True False 1 1 0 in True False True center True end 40 True 40 1 1 5 True False 1 1 0 in True False True center True end 40 True 40 1 1 7 True False end 4 4 1 1 card_valumd end True 15 1 0 0 True False end 4 4 1 1 card_valumd end True 15 1 0 2 True False end 4 4 1 1 card_valumd end True 15 1 0 3 True False end 4 4 1 1 card_valumd end True 15 1 0 4 True False end 4 4 1 1 card_valumd end True 15 1 0 5 True False end 4 4 1 1 card_valumd end True 15 1 0 7 True False end 4 4 1 1 card_valumd end True 15 1 0 8 True False 1 1 0 in True False True center True end 40 True 40 1 1 8 True False Stick 0 0 0 True False 6 6 6 6 4 6 0 out True False 6 6 6 6 6 True False True False Sticks 0 1 3 True False Memory 1 3 False True False vertical True False 6 6 4 6 0 out True False 6 6 6 True False end True False 1 1 0 in True False True center True end 40 True 40 1 1 1 True False 1 1 0 in True False True center True end 40 True 40 1 1 0 True False 1 1 0 in True False True center True end 40 True 40 1 1 2 True False end 4 1 1 os_valkernel True 1 0 1 True False end 4 1 1 os_valname True 1 0 0 True False end 4 1 1 os_valhostname True 1 0 2 True False 1 1 0 in True False True center True end 40 True 40 1 1 3 True False end 4 1 1 os_valuptime True 1 0 3 True False Operating System False True 0 True False 6 6 4 6 0 out True False 6 6 6 True False end True False end 4 1 1 mem_valused True 1 0 0 True False end 4 1 1 mem_valbuff True 1 0 1 True False end 4 1 1 mem_valcache True 1 0 2 True False end 4 1 1 mem_valfree True 1 0 3 True False 4 1 1 0 in True False True right True end 18 True 18 1 1 0 True False 4 1 1 0 in True False True right True end 18 True 18 1 1 1 True False 4 1 1 0 in True False True right True end 18 True 18 1 1 2 True False 4 1 1 0 in True False True right True end 18 True 18 1 1 3 True False end 4 1 1 mem_valswap True 1 0 4 True False 4 1 1 0 in True False True right True end 18 True 18 1 1 4 True False 1 1 0 in 172 21 True False 2 0 True False 1 1 0 in 172 21 True False 2 1 True False 1 1 0 in 172 21 True False 2 2 True False 1 1 0 in 172 21 True False 2 3 True False 1 1 0 in 172 21 True False 2 4 True False Memory False True 1 4 True False System 1 4 False True True in True False True False True False 6 6 4 6 0 out True False 6 6 6 True False end True False 1 1 0 in True True True center True True end 40 80 2 1 2 True False end 4 1 1 card_valmod end True 15 1 0 2 True False end 4 1 1 card_valtemp end True 15 1 0 6 True False True False 1 1 0 in True False center True end 13 True 13 1 False False 0 True False 1 1 0 in True False center True end 13 True 13 1 False True end 1 True False end 4 1 1 card_valusage middle True 18 1 False True 2 end 3 1 6 True False True False 1 1 0 in True False center True end 13 True 13 1 False False 0 True False 1 1 0 in True False center True end 13 True 13 1 False True end 1 True False end 4 1 1 card_valmclk middle True 18 1 False True 2 end 3 1 8 True False True False 1 1 0 in True False center True end 13 True 13 1 False False 0 True False 1 1 0 in True False center True end 13 True 13 1 False True end 1 True False end 4 1 1 card_valdriver middle True 18 1 False True 2 end 3 1 0 True False end 4 1 1 card_valvend end True 15 1 0 0 True False True False 1 1 0 in True False center True end 13 True 13 1 False False 0 True False 1 1 0 in True False center True end 13 True 13 1 False True end 1 True False end 4 1 1 card_valgpwr middle True 18 1 False True 2 end 3 1 7 True False end 4 1 1 card_valgvolt end True 15 1 0 7 True False end 4 1 1 card_valgclk end True 15 1 0 8 True False end 4 1 1 card_valvram_used end True 15 False 1 0 9 True False 1 1 0 in True False True center True end 40 True 40 1 1 9 True False 1 1 0 in True False True center True end 40 True 40 1 1 1 True False end 4 1 1 card_valumd end True 15 1 0 1 True False True False 1 1 0 in True False center True end 13 True 13 1 False False end 0 True False 1 1 0 in True False center True end 13 True 13 1 False False 1 True False end 4 4 1 1 card_valdid_rid middle True 18 1 False True 2 end 2 1 3 True False end 4 4 1 1 card_valpcie True 1 0 5 True False 1 1 0 in True False center True end 40 True 40 1 1 5 True False end 4 4 1 1 card_valpcie True 1 0 3 True False True False 1 1 0 in True False center True end 13 True 13 1 False False 0 True False 1 1 0 in True False center True end 13 True 13 1 False False end 1 True False end 4 4 1 1 card_valpcie end True 15 1 False True end 2 1 10 True False end 4 4 1 1 card_valpcie end True 15 1 0 10 True False True False 1 1 0 in True False center True end 13 True 13 1 False False 0 True False 1 1 0 in True False center True end 13 True 13 1 False False end 1 True False end 4 4 1 1 card_valdid_rid middle True 18 1 False True 2 end 2 1 11 True False end 4 4 1 1 card_valpcie True 1 0 11 True False True False 1 1 0 in True False center True end 13 True 13 1 False False 0 1 12 True False end 4 4 1 1 card_valpcie True 1 0 12 True False 1 1 0 in True False center True end 40 True 40 1 1 4 True False end 4 4 1 1 card_valpcie True 1 0 4 True False Card 0 0 0 True False 6 6 6 6 4 6 0 out True False 6 6 6 6 6 True False True False Cards 0 1 5 True False Graphics 5 False True False vertical True False 6 6 4 6 0 out True False 6 6 6 6 6 True False end True False end 4 4 1 1 primeslow_valscore True 1 0 0 True False end 4 4 1 1 primeslow_valrun True 1 0 1 350 True True 1 1 0.009999999776482582 True end 1 0 True True center 1 1 1 1 True False Prime numbers (slow) False True 0 True False 6 6 4 6 0 out True False 6 6 6 6 6 True False end True False end 4 4 1 1 primefast_valscore True 1 0 0 True False end 4 4 1 1 primefast_valrun True 1 0 1 350 True True 1 1 0.009999999776482582 True end 1 0 True True center 1 1 1 1 True False Prime numbers (fast) False True 1 True False 6 6 4 6 0 out True False 6 6 6 True False True True 1 1 True 0 number 3 0 True True 1 1 True False 0 number 1 0 True False end 4 1 1 True param_valduration 0 0 True False end 4 1 1 True param_valthreads 2 0 True False Parameters False True 2 6 True False Bench 6 False True False vertical True False 6 6 4 6 0 out True False 6 6 6 True False vertical True False 10 10 False True 0 True False 4 center True False True 1 False True 0 True False 6 6 6 0 out True False 6 6 6 True False vertical True False center True 1 False True 1 True False center True 1 False True 2 True False True False True 2 True False About False True 1 True False 6 6 6 0 out True False 6 6 6 True False vertical True False 10 False True 0 True False center False True 1 True False False True 2 GPL v3 True True True none https://www.gnu.org/licenses/gpl.txt False True 3 True False License False True 2 7 True False About 1 7 False True True True none True True False gtk-preferences False False True 0 footer_box True False True True False 4 CPU-X 1 False True 0 True False 4 Version x.x.x 1 False True 1 Start daemon True True True 8 False True 2 False True 1 False 6 False True preferences-desktop dialog False vertical 2 False end gtk-cancel True True True True True True 0 gtk-ok True True True True True True 1 False False 0 True True True True True False 4 4 12 6 12 True False start Refresh time refreshtime_val 0 1 True True True 1 1 True False start Text theme theme_val 0 2 True False True 0 Automatic Blue for light theme Yellow for dark theme 1 2 True False start Temperature unit refreshtime_val 0 0 True False True 0 Celsius (°C) Fahrenheit (°F) Kelvin (K) Rankine (Ra) 1 0 True False Interface False True False 12 6 12 True False start Default tab defaulttab_val 0 0 True False start Default CPU core defaultcore_val 0 2 True False start Default cache test defaultcachetest_val 0 3 True False True 1 0 True False True 1 2 True False True 1 3 Print CPUID values in decimal True True False start True 0 6 2 Start and connect to daemon True True False start True 0 7 2 True False start Default graphic card defaultcachetest_val 0 5 True False True 1 5 True False start Default core type defaultcore_val 0 1 True False True 1 1 True False start Default memory stick defaultcachetest_val 0 4 True False True 1 4 1 True False Startup 1 False False True 1 CPU-X-5.0.3/data/cpu-x-gtk-3.20-dark.css000066400000000000000000000002121454622605200171150ustar00rootroot00000000000000box#footer_box { color: rgb(46, 52, 54); background-color: rgb(76, 153, 230); } label#value, progressbar { color: rgb(192, 192, 0); } CPU-X-5.0.3/data/cpu-x-gtk-3.20.css000066400000000000000000000002101454622605200161740ustar00rootroot00000000000000box#footer_box { color: rgb(46, 52, 54); background-color: rgb(76, 153, 230); } label#value, progressbar { color: rgb(0, 0, 128); } CPU-X-5.0.3/data/icons/000077500000000000000000000000001454622605200144055ustar00rootroot00000000000000CPU-X-5.0.3/data/icons/CMakeLists.txt000066400000000000000000000007261454622605200171520ustar00rootroot00000000000000project(icons LANGUAGES NONE ) # Icons file(GLOB icons CPU-X_*x*.png ) foreach(icon ${icons}) get_filename_component(filename ${icon} NAME_WE) string(REGEX REPLACE "CPU-X_" "" size "${filename}") install(FILES ${icon} DESTINATION ${CMAKE_INSTALL_FULL_DATADIR}/icons/hicolor/${size}/apps/ RENAME io.github.thetumultuousunicornofdarkness.cpu-x.png ) endforeach() install(FILES CPU-X_original.png DESTINATION ${CPU_X_DATA_DIRECTORY}/ RENAME CPU-X.png ) CPU-X-5.0.3/data/icons/CPU-X_128x128.png000066400000000000000000000540031454622605200167660ustar00rootroot00000000000000PNG  IHDR>agAMA a cHRMz&u0`:pQ<bKGD pHYsHHFk>WIDATxڭgeu}/׍΍nnH 0 )MIiQe-c:̨ʞga45]u߻霽 ַ/+|?J=wPs,y'b @U*F#q,I4RJ|_[Yoo/_M7n-b}s7o^GۄL{sH)A y~쩑a_8۽S*y^95e9b`9u fk| 3o;! LMOQna^oSK,đc#NkB-Bbnl۶/^k$|-2u)s|{8\r|tsVXKy DPKs/ ʝy}/۴Bpu^|&}|^ /k`Q9aq*.Pgp~/ӿ01H⌝lYnUYj?sœe&[!͢7AϜSU|R޾Jg ,IJG*DU "W_| 7zKς$ϯZ {-AAƶH#,s@WmvjT˒1֔qM%1{J H ^8&=#{$$A$H|yH߫a6'd$E(!W]-s )] ҅7^'I VY$0%׾{;W_~ 騯oN<՛HmE. lBB=Bn"?mvJ99C-9H_L$'mye^F6B 5 c̀(8=q5L1Rp'ѱpRx)/zwߜ10mveڇ ꈚEIo'` 1 m͑Rm rgAB xM:e@YX.Br}kO?1`a Ά!mUcp8ZYRhJj- `(RU-,&mD*P>_*,tZ29Y{옝A5`F\7n2VC#0A0$8Ws˓.nN.36BX/P,TJH!f1 2B(~/8DRB?Tj-յJ~.8b `ucWnƵװѿ7(sbGlIqAN'?L^CF{ F|7@(.!\_y.c8Ewf!Ǯ} C($"y)8 >яQJ°5"fIҀ] @@ Jl$;?9p f {rEB?.|E:?HhMvYHo[Hr/w]1"yJH0"@RރN/s&\Dy %TثNlH8K/bbr 𙿂$Z$8Z!"e5b}b0sUnM1ܿo%b?q)Hu07B`u)(FW2 z~a\q }B//B޲` q Pz{1|{w߇Nc3AM,g~rM!sV|3=:wa1}NBZ !45 \xG>֥Qi,K*cPk4v 1هۋp+.>yY  6c`8QcjzFs4C S#e#S7(TE`XA8׵Sq7 PG4~r^C  !Cr۵jDJ,M!yP cq ĮQ 9(`N,lRlU "KS5pf 7W0"DZ|ծDMDAg`^Nb ]B@pD1,Pc^oT9T.H 8a j#\x9j֒1R*L~Vc??Eu;d#Sb"0!\0 M5Q `n Aa/kyWjFۢ1J]L!Wzg"xB+ca*whFHly9QXX .VA7{t6t~NvqLD>^)wMkkkuVWWt0 eW]ŋp}x}ϻ?R)֛0R<րKH) t]F@˃OC 2HԀ9J֗L%$4B2980??7OMUs 57@-kA]/NR5PGNjKݑqB6y<1 ep4[vR7k.XC)=aI#ҪO(Ncyeػw/cxp9\xKKKX[[C\a"ct:z= C`rr2't@{=Q2XHn~R" q 2kI *%yK8s Q9 >iP((yߖdM ` QkZ61NDQILOOZ$ .Z!vCu]СC\*kWad pK@`, w )ҳAsP_7'{~kVvά ,8@D '>h_'c a9&-@.i9Y! Cah cjDHfkkkHSgYhV69-o{oMnA{ yȒld֥b :t8pf7ѣG՛Wf1#HRw[saIP53ڼ棚ik U3ۘ;ܔN[a`O销D:5PȲ|smTk5'~A!PTPռ 8Fá10b(v,hk)B. v kɱD| &%;/~ʉ=3q>[SH(=GYp#c&'sg~F!.ǧTx*@$ wڅ(ӧ7S`O=4?=hu:8~_|60t'I:M`Q|n%,X` bTIzc1y;8TvXT\ud FFz~񡣇y8v/!%Ni\Ò>l_5N(A(*@T l*x׻GA;.lln;wދClEm޽x?Ξ^~% " ScD%K?40 I `BjzhlǞ{7w$Ox,C>{Wë_6A>\b3pޘU4b%Ev@2՗_B5 +{~G/4.^yh^ݻ?pd3t&]9p eN޴'WȒf6Ky@s5i4JJu@|Byi{}h.FHxwrW(^_eѳ?—먮k|5R}!%.&LO1un Y )sqos+D?>ዒ\ڄS'In)T ݓ_)YR>5G^^kM+ YZ2B[<%,ÕWo/rD0ʐ.J. 9GvԇOVK 8s~on{H)z`Zхq]J`ͤ6v)n)^y`C qDm]_S(Q`qGycH TvPSDn[E-/1c#z4MjoV)P@MDnb4f}gx0O&s?V!lm"ITU'muJuiq/(QRXs4Th&:LGek_*-\x*7{q\;PDRrEC su{?j~#HאK9H{`3Yp!C*M/9X]]Cj.;#Mڣ{kVt:BNs D里[Zdi;c-[fM0y ) !a2  ,ׁV YU} [De3˰sK#d&*!Tluܼy  `^>to!徝j1وFwKUuů[J3S{˽WP>%J$X;4F?^̞^ :db2!! <8$Řh6l6mM`03xֳKܣjn%f ?ZLzM /2i-mΡUK`S^&X,܍mڟ fvF@UT#*'W\Džݷ&]_cavM$R *!Bge%&LYacjj ۷oc Bؓv% Mކ[{( ,~+!H$ᩋ- ָs}f< nOzGJa8!u8Z}r&Pt3[nK : WX:CKdnLX[v Oֱ؃}كzϣjxW|26 I26ȋ^ËKp(b\ɂx!*N;=&2FJ.OF.d&(&UVmE#"t\vi;`ϰ~Bg)(c `Y,U 976pAm۶СChZ B_={vR2X5 ``Hq3TYfIYqđO9v.3 }\\KiR*[BN<~Q# 㿃DZt+-EE%`}Lf=t}<#GshN8cu xwsE&~QdiLVoPr1U @$JMic2S2T/emqV'26w v,lbvf|恿b`}TA2a\z˵chnۇ}bǎh68z(0Dq%TU7ٳg-- SYyg/%|\ټ,"$,(&&!/q#9LWc€,PmG0n-.Khzx055h;vb`P oo&d4Rm64 DQ#G`ݸr nݺ(0;;kyNam̡Yu59ĉݘCE$i:c`e3Nf@ps>gyrva)WN9!ܑ`)IO4ɓ'vhcǎVAz !4`G:&''133FZji|ĩS 9n߾ YGʕxSOJ&b貆dV^ބ-U*궂I*nmJ'"K]rȎ9A71zCjcxrq-%ߺg6j{10JFa{:64բ Fzz |Wlnn"2t]/B`8Z 9GX__O^)oWnʺz R@F' ļcuc $I6;V+.16YY_G;I˗/3sO~h4JcO[j5|_!0Jn/| 7M;`Vq&~O~qkOw@Ypsz h;T*T*8u4v؁G}s64]؀O15"sɋ^,2}oWDL(s FfJȝ0bJ(SBgx:z9;wޞ$I˿XXX亓J"~?2ql1ck~?jVq㥗^wa׮]މl̹,ܩm\J Wu?hEBOw$'a5L I8) [Bb}cmn8t~jFg9# !\!@%1'q{ ڵA|qaz>w GQgOSZ-El !.b-xY߿}{$f}RäiQH%b|`֟ \<8_pp7^ߟyEK8qox'|.Ylw0iaRAZEZۜjwOGŧ?iTU4uZ"dY`Nc/ V474fMrVں3S1tPXw H^G-kE<0E(',|dPcU>ᮻYĄ-$A߷RKKxWf٘.2}M@fCdrhvFT*\m[LN-AD5No% > -UrFaCRpUSoqU__ã>j{s]+P|27ܴ߿&011>)m<`N:.ZQ ?~ GD*[nw)^V~O,eD!בRl()o˸r2aft _n?co&o>fFpbg66QAFعs'>:fff0==mib0XE%:yC$/2E4+x=A.=VU-QrW݉We}%d[J.|uQQք6[m;wkkkO<~w _|+ mۆ0 133YLNNZW0&8} Vn c bg0OgN0Gtt7AH[HUjx¥KMF#,,,<*JEHl37$I9<裐Rbvv۷oV1,01 0nqԙQ^O14 [)Dӂ ˸2]\C?TE1jE4܎ɓF!` =H˷&/IN; KCy@c2"p#Ȳ6orb|jkv> Ox yV|Q!˲3ךr5OTE)0Ļ.Bd fGX=Rv?Jaʦ9 sD,W/CeExnCȲ.BQ,;GѬMo Vxz~)N:BV+ptJfH~-93zo~9+ \,-NԾe(\ $l:1fueUBwڧ|I^w+ hEDp52;/C*̞x_oc~VUw;0\,&`lu@w8R[DQ@A8HԂFV sss "v`Pn;yn٩O{A`YIPl6 3 ' 0j]`.#JYBL{76p`\&,iPRS= R5vNJ(¢璧: a~:OP_:(e \TG("j>Z:9ܒEXoVBVGȗ *+T|樫5$w w F+`{FvfxhM`8Nl[ggpRvfff011zY}:@13jͰ wi 5>,MqU$I PV199{:tZz-N3gY` vL3RS<y1"eH C2??đ#-wږ*z8@=f~&R,ar;a.9qJVJ j5K*pz+n| LEkh4GHx;bK7Ѳ!#juLOOcǎ޽fggLcj()ײ؂.I4Op93 lʴ^' d݄?BHv")DɷtT[FF?ށn0 [#w;!{7*7ĮWЌ[2׎pb"\YʰO8XQqLM"LW*Jx~Ead ܞbrN4x4a)!;ZH N%}2-xvEޡTM T:_ja,/FD`6c.~acۯaB,"d|m!wFC`RA#*Xuy#6I5+R0yԉ[(q ! 5)K.#Ч~^0,*qtPpdLZ >J5YHL09*H^PI@x6~}FC|߆O.h)tnn8Htڜ|dj1 #l]vg]˥\J J p y50 tXlpiFl^H@7w}x<b0 J5m4,xBwh5h~LX̦p] tjjP#dE34ҋ/8&zZI2-5 s@H:?K-Qz]Vea+ AJ5GtTU.WԻfQ< RRhcdHDM }X|u޼G$g?k+n;2=?jt$G#x=3Yhp6@u tb!Sdtd~:Ԝ$MK%rS'Ʒ)| 1e6^@^Fa૘9SEqm j@<)15h7؆]qkͿ7 `YŖ7oJt: O0 X:IzgTf]ls$SDAl9窉IcycL2OF;IB5m+NЅ GRcj*ʼn1bhXg%]:`D dMx a$`Zwvi]Aqߝ3l:|Mx:" N,ak20a*= UܘiҙIqS'bns-μ>וa#ٖA ySaeHBjH!Y@q•VB* `ܑ/1]J0i\A7x\/ڛ9Ɔpۿ]ᇲ\6=-͛X|t[-QX&(^YHۘ< _C̓\ͼR⓾fpT H#!AN8fnƄ׹+H? aGr s&(nyD;=xkj?8!VVV 糀3FU[ZZ~|GT.B Hِ(@XöяO?$މ\=HLaBI~0"L*h(pv. KDy\%1SۍU Bg6,􏪬=/=XY{{كuO47[Hҷƍx簹J4 F"g[oŷa{++ދF7xed^"[`w|M'dEFS;|>|X ֟-g4@LmWPhhO8 1FSG1^[ _lrcoC!z- !Hu :=`>tEo= HpGPAK+ )|\cjzQ#u +g΀9cEZ4r_kٰ<0N;pHg*P"a;S7_v= 뿋ݾEE n_ޠ1Ͱ׵/~'[fcdyJv u;byyWJcjFE0^X^ZpSLqu'Sj)RMM`( OoLuݻ{E2 ^W\3g5TvT@b\0:Vܕ(DTz4&gqa(| AiܞfiV']wwjҏU)j@ >>/n_8}41??iW`FȻ-..ZzIMWq@ uzbj7 nkilyg@9ZY4|%٘S6C"$E o'Ұ:ږRi]?eƝvg!? N(4E h+%Dx6~wxk .]… ,7&HV݅7 ܽ]SRfúLWf@6$@ͰD`/DT,̫zrw<-0@)5'&{.?yPpk$Rh^2d$cr(YL|e&UA %*)Wo^g܏KG6+Rͦ55b!޵hC[hVrU0.VއO!j, !B*R^-^%'J{3gRlsogcW\p0@Hz99^!}40SbӾ*.a-b׮NRӲG4t!!&6ٻ0CP(X7T$p7kza!q L"0לGg fӵS-J>Ae#˻xGhGxq}/^ˎA614SZɘ G͘xL$6)#H n`d>[lt <)`ہ c>&9 n&K,T VP*(\2w# `@HD #l!Ih6dLhQIԔ$A۵`& zHdEN}Si:o%Q #đ(De} .V:{6As wȑp%l d9%t~`Buc`,TiOm6Ma/bcj]@y{jieP eHHIhu2HQ((B(h4D&M4xB-'[t{fʾ.ʘ;R(\pp+_,TX0 yS0ƶ'ps Z96/MIݑ ^Î]1;3Z3VW87\h/@tY$#°t A vm{h6h4hN411jW <c4´z8sdQ} Εqf?82!*_B:@ :A:-WZR$i(!D ,uBg+ut!Bt;'0%Pw AAxim;jAAFl)t|) T8G8su.!ZBcdM\OF2mQtfF}l6AAlװqJ$҈Fy%|$2 K-ޏ|7._Ve70z`V1g$H*dzHHϘB؆HԘ,\\`&Z\wmkb܅.!8a$!dGCP_@GCHOSo ea{13.`$3-$iU1[kiEMP%Tu1Xmԛ0^$͏BS)%ߊçT ڡZ͍+^31Ҩ,d*3ǫq{z j1JiAŒX8cpYWPbM pHSP! <|ac4ZAxGqֺ)VbܸQh;K 0`y3cYD@ Br^_pGS i2: *!XH7B=i̠i<6sˆ鴖kJ8 "q~%eHs@*iqB2.4.QBf"dQTL!`HFC?Y&VJ,],@44JX,!pBqtaG?i b lm@dC,-0uXl Ȍ!:6ubtׄ*9Bi4dT+3 @FLcA Bg.ŀNnW$]7qr|(PAl1J#  Tuq"NƕKXa\`}E YܸpοD 8{ =rD&a8bvn;0BF: b@a i) o< Џ^eސP>^]nN5ol7Q`8V7 eq( -yXZPeR"c,Wci8~ s4]3@6 p) P!WWJ*F}7 kw48ͫx7T -@ʕ+hxA%pc_R#3"qT64'FXhTP#`udY8oGBV.Os?fNP2U2V>BȈU+ 4h<ͱ{=yLo_3X+%!T=+D*~X)LELUZϟ;_:@ ;3XߍWob[ B@3qra+)|< Л, "D,r2U`Lҷ 3э'8* l#R*l gqLƍ * %as#>kE'wj j< &s$iE:jVS`m Fqo]ǛO5 p ::z/.+0BhK᳟Eo'-& LU,:Cd )I+KuּRN [v3RDȊ9tb̜a2a`Mh%]ɰR'͆ r+ +5qnaOpUa՟]=8v(_ (CwVp\|&~ nsO G߇VB:%PAOB ү::1b)6WWU*2=[HVBO HSI3Lo5Չa%8%c!tj *F AePDž S}oE,z 2n3&z.[Ï~*@(}*N 헃 jHɴK5#\\W^ `[]_l$y ~K 4K'QB:|$Si θRdU{ "|sQpZp{ev֭سw?\8sgq#x A|?6v:i%*i|cxM[Yn#ⓛ" Zk?v:gϡ93mK-G DrYBS34Ʃ0Dy * ^&5Z#K JfYǁ[u H`Q 5jD t#T&f0}!tnO4>ſ< Da\'PT6ӘQ}yOı°˫+`([%~o7v|5oɂ,*bҹ?ݏ|q,r3 īSbffn{?7qCv*(.\Źsoo"YC?zYWUUHaS;gQ&=Q&Pw⿾˼\jr~DDF Ĵ`ov~溸YR:]ZNvvuϷ|öӥhmljĹ^lsz֟q{QQQĹ\krxެjjjTTS[jqw͢AAAƷYiowٽ>==xywvս[@ƲxRø\lruTmH* ɵ`owta u;86///w_oum|ķǹɤhaaGzVhn4K\@GJ>BD?BD=?D(IDAT !"#$$%&'()*+,-./0123456789::;<=>?@ABCDEFGHIJKLM@NOPQRSTHUVWXYZ[O\ ]^_T`abcdefghi jklmnopqrsNtuv wlxyz{|}~u { {t!DFY%tEXtdate:create2016-01-04T17:28:07+00:00e;%tEXtdate:modify2016-01-04T17:28:07+00:00fQIENDB`CPU-X-5.0.3/data/icons/CPU-X_192x192.png000066400000000000000000001324411454622605200167730ustar00rootroot00000000000000PNG  IHDRRlgAMA a cHRMz&u0`:pQ<bKGDIDATxymWuƜk洷ҕPC#@F q $-;IvJ%Izq*)'Ncvbcz0 B +ZkQn̵9WWosOk9h~ a[ fN?pS/15w‡l"53Ce1 _W{,.SxXǭ_ ſ'Ք⳰s)=boN;].eǓ]ɧPZ0@U^5i @ D 8_io ^Y݈8>)[gqH`j9![%@_ >ذ l'(͝V{~}`s4Zvy ,H]cr_7&]kw~7oU׾KKK\9W^u-I\0HwpN}f uhk6nlm&ϭQ:~<a=\V$ mAv^g70UZ s8L^QZ-x;-B޳юJ 5/cG?jav6xHׁuz~ 0&]PS0)rE&I,V@7ZMD)7WRV%:usX~e6R?OE5c,:+N  F,Dyх_ޑog J䯏O _+x_>30 +ujPbs}qu 7W1W܆`S6{ J 0li zA>jM ?A`wÔN [7otZl[kG|TiX02Z4]dҟgUkcHb!6~!6-ȩx!kylyM|ZIi ߚ7\j,y  U⥯\w]?.4 6)#nXֿ"fa{i-,+L\v5yxp?8L`iқg:LjpJhuEL鍵WfC "M ڋQ.t*}}d\ڄS97&{,-Jӕߒ'/hM|T ,:V*]k^PE}gqϜõ?Zگ=כ`xlqǧ pR ѪAԨݏ*.M7V>ﮛfRjM&( ~׊Si&[3!"i9XiSsdIL6[L~_t X|rA&0s&[kKIC?_"W܌9C6! H%XUgֿGR/{+hB旁 q3]F~rQHb$S;jynO1@ 5)R*O]`ZEaSS5zoQ#I$/3qR>nP2"" #: ʽ=ڦpQV"u>dj\ bqks]tqNe,Nmҝ}c4S$_6c :GcʤHXDnvɌn+\q2p|wtN\=U/+hOkQdMB1JH9TkO e=_# Cntq3Qg\DE{iEݒ죧Abprc53,MD)`X}l~[ZKS;xwHLnR!&kR@뎭5AW褄.N?߄Ì()d6~ܗw,B*uvYM"|}Egn3`#Fu ), ;DƄ6enL\Ȕڈq#u^<#TEʔu)bf> B7C~*4&_`S*̉Zf u}!0Db(mJDng]% PYіE;<dGiq65)Bpf}. L17uv6t2M9SR@2L$-aٝ4PlJB;^$C8l_0h|*`|qG PcE )qy҄0 ,Z:.Zr 8aӱs(|  *0dgůn-~kv{eDsdžHn|zX3wpLzŦ@';"{ȑGD Щ$GJCŁΡ B(T3QʥJZ(5L ECcPFA25J* dۂb6t]إ>=af(X(R`& $Fh"(FUUpN{l`غkBA X4tQƻ"AX ]hܦ+|hm"k-Hn3JqEGTQw^(+7(,Fc uI\b-:45J4jcb~GQtrֱ:qֈ?rB:\*BTH)*RK;%i=7@$->as~W_x3 7?/|>,,31&u\lJ#|,g|-jE/_L- X K9|Ͻ>R/5n!Mm:NihV(T󺿭HӪ,bQx-r'"12m`w)"ԍ"[ ڔ[ZFNaTU82߉;{w46WS̍) 'OC֝Z:EʦJ9Edk#v}{Q*ћ+~[q01nccc  @)#@3H AJ~}vEʿdœ2u^ǯpzMhՐ(L?PNfY89!uNuESͯ-7݈'>O~l,/3EJȺ&TY1[c[<يd9LzApHB_3?믺ۃ!Μ= cW< -~v<O\CHgZ3hbjM`E0[ .)U r _z^rq7.0])dEB3"ȝxs>}zjFg*֏2j/REl O EhUq 11Z nDƺS"}XxNo}J}y8;Ur'IZ|T Y6\JG~coL(|c`C JQ!sm;@J)c Q> W3B_izr|nW;JQ/9O7m&1kcB1dJt7]\(ORn |ٞz| y7>wa}kx+EV"E#iXHEg֢(k@9\d iMiqBxCʷc B0 3؄IMS>e5(bhGSucPJEQzfsOpo{;=z)ß}N@E j87W:Fץ/~`YV"ŠCd"]'˿7޷+ >/x# 2ccE6*"[@)yHEDzz$,d':o-gjEkc.hǮ{׌S&(zkM`E~hrs &7:ɫ'E<&n 4 H+ q/O$VG)` .m:7<@'!Y춸B}[^u ~?5Ͱto6l (SeEx5FE81Øvc!V4%^ IKᓲZY͂_/eI@Q`^ӂJJݷ8Pc,JESԮV&^oϹj߆yŶ^/:ųȞw \EL Oa{DK|e\sg-js]vPY`qaPc p+bCJ9-W`h#2 8lT!)|~.6GwPbpFQo{4}ō.F@<ڣR٩q])NvK5ǷkR- vi1u]cskK9,Jjތk x!yHYv0 ዷ߅ JĠ/BӉ϶. Rh K %4'TD*rph tWEQd+m:uG^?{L2`K0ƢƆ 504w0 c8qrwSi9K|n]G$}/|=<_k4kjS玄+tK(Uh# B[֣8J؀?'n|%&T 6BZ[9lHO~N4(Y ./t~=p~*S;8ڛ^Jb< F]B"XWP Et7܄`"R7ݘDAYsG7׳+ q,H8Kѱ1N9OwUֺ)њ)%\tŌhDFgYٔ&ɣ(ʭAE!E. l-cV c LcPc\ t07?S=؆R^JrR]h{ =R|3I)+0 pn9h>Cr.{<lMZ:F^ٹx̺(jM@4>.OJ+#Fn)9HcيAyZ"}Xy}q9,J 0RlMMXZ|,&alMNT[J[@Y-^kܩb'@];R( ~BTк@Wu|*"2E\w:[N \$"ZR ؏K0z{~:.,"ٙVN0A>;$jg B A ha@8.L҅IQ 3#?C˞RX/"3m) 6RPGd5*D©d%?Rq5z/~M1Ɵ&Av+u:.:[ TʲӖS037ˎ5uq僔>abߘ ̮OaL57C@Q7TFhtJ\l @$+(@DH6z]ob)AS!Aے\OB.A8!HPrܴ #w֡MWVFq#HNsy.? OC΁[iN࿨ԁb6c0geL| twZw C9JA(P@+/jAY,V΢Ĝ+!#?PMJҲt8A^:=prXhq֙T"Dwg)y jXV\+&N=4M|TU`Mlnnb0`<*4MAbZkesen s!ʊHHj!fF͕q8F?`GFakȱV$)U#z&.hF\T\܄dp b Qu(XEA-McY}h EFVێ(H >rB{8N(9JV<*H5(( /gϝJ)XYY:1QUpeYcmm O=4nzx^z?1ML`_'X !P2#eo.z*k$dBKs2TVU&upB5镂(|,.4n v-##SuWL_9/Je$PWB%9I\TQ<,:5m)n/+ۀJܓOh>0 3gٳ1Bv133v<c{wmЅа$(qU Aޕ; ڍ_И&v U֩MN$71MV-E*, ]&ߘ1HH߫me]*DG`sL8PATs:6>R=2y#Mzj='͔"D8-Xa}cEQ`aaǎC]8wΝ;'N̙3X^^/kxzS`4a4ōbLo~ss҉”`HҨƻ)-$a>(V``ў:ђEt'ar'("O8f5 eXv nj[3äk"@TvRY7f @!JE"jcB>=n4vj`MBnZUU8y4Rc#ɓxꩧpi?kkkv,C4D69fƷK_zO4:[Z$kZ0Nʲ`?O 'OdA^B2cOڬK&SVk ʲt$y LrwC[@XPEw?, (19yQ0MV8 t a:LJZ'e(v6ɍb>uYdW,uR!pH_XX3㡇c=~N¹s簶/%*O 3,AફĞ={", Вк'HdlxD rx7CKw_%jL@P ˓sczNPurUW+l i-FCdyMf#20\{X%7H&'+z*HAl2 JP6WPO-jP3ϠӟFm=3xGSOſF1Ouvz߆w1-͖]N,w&!*YSga&>3`ZxCDJyxKT' a8rJv,zDGZFBCVN5 N4.SvrxH8Q"3 4t@7B"As2=yt$x03qY8q"=X__;o//~& ᮻƫ^u31J%hq%x*¢ `{+R K&IOʳj0̘YFwX^ZA ݶ%,--ey;w1ꇜ_.v;=a<01 pRfz@Zk=1L6^sN >1 ϸ=^*ʣO28G؝&OP$5*ODrha,z<͂(R,Lr"Ou_2%qK@փ"( Z%lfF,C,^sΖ%+1PrCSFHHi2F;)`4:/ܹ8|P[&L~ dvE' I*1f nd4&bVtS4߳*ULckXdI5L_^` MI8=YVrhB&rbfLcQ_2f\UUass39B_:NL BF$`<c4'pA!55w}bQ,;mrQP“ @qhY` RA(P}!"ZB5AlаA1w9lM=Vqצn0֋ߕڈugX nq!HxHd"`mq"Ỵ̈-TB?s)0◢rx>Nl,fffvc*4 FN{)^%LKT!LR\@LFJ!Z"BA4ΐCN| *Pi-ԹHubYZze8]@EsAeƊw_?}3dAO<95fF(/5Z]iV/Go!& ahԚ^˂3oK'IHM.uLmBw&_F):=D#yb'(F 0 x3W/15:S&c-x"e k FOlj !u'{x5k p~,o/M"ۈ %_ƎLi9šQ#YO"hJa9h$fmNd'|ʿ/k(>g<c~a\s ,.ÇpӍ/;]"¯?^[O/077yQ+ Y`a¼1k ÚLe5Bl]ZH&)ļ&'ҴX!#0l2;XG;EEW=] {x;jm 7S FОQ.xMa@.I&i0&wQ0͢8CU J)S_=(8:O N%Moy w/{+7Nu]Gx{ރt\[,8늝siD!Ǎ 2:Nq-V<]R-łؤ(Ddk lrcmt8LF*h~T\`bҽ#`jΙwj˚* P\p qI#!~ɣM`mv s0m/?x,o  l-;HZBTKR,; yIAT2&  ^xÎCG>4M|[߂1wy't"N;5@7a!9cxoS$#&'XHDjt2l]@TUB4;ID3K575ShVn#/N0`1jL5)F<"S!2IɣXƁHb<,YPvy'O'ELTz6kkkp}3;O㲣GwJ{n uٿU]klp IJ">Kim(~Sg'AM$f ڠ(KDQH:x90mnQ#C+M;6M [m{ )ˆL0 JZ,е|1S-܊ub%av+Aۂ PT8޽{[qݻwvz|8\jOa+F:|܎ݟ*n|)W ֋MϸYh&0h ތ\sUdP%:#sӤT:=`h*G|l9p|fObU!D Z.m*3jŤCig Oj \H ]ө_~L 9E{i_Z-܂[7\vHGXYYV%{>Z CVac2-oz.kAk01 YtLB ݦYfEniY*da ,#ZiJGx-NGhh4 ' Gb{'@Еqф4Tvj |YA $j)/i)'H׋m|>o7+5س0N]6>csc}DžDU5F5j fHJ9h۩< Tbˡփ _h:yw֞H4]T ȵ^= ẅO7uf{># h:`sVaK4iTS>nOe(J7X,%6FP70N-ƴB j)?xKt0 _1`@ơK)ݿd =]4w| V ix\V+s{,݉[RLbF"EIipj,ុ+ `fquc.4ņ`@3$6ǟbB.05y^@Aǎ[ $t7<7cSh*DP{p4&wѥ7g4|3U,cn {lKV;M BX&KRGI%9l16,ķΡ1GLO=t*ʠO,<1P$y8FsZaj4EzqOe83 W]ux >}:^,o>\s5 q` zW}{ ] 9-0ScQ:7L L$uQ1jDݢJ"mK']eg ˜'H' 3>_;#H6$-XAYИ"k򖕖<`eW^%}] z@v`+E~Xij.Q`0wTǠzp!=z\r ^k_ZNZsss8rN8h |鯿_u3b%FK zL чĉY`~*SDv )niatSS^Ϣ .\ ` ¯uRU\epOakk+=_XXFWarG]*Fc]9Nl}X\ae{ggK.z IipK_z#)M mM)}$vtnFVPi1«{ƛlKKulŶAC]4bY(Phi*fN !-PYdz6 QZ9GUUx3꺮qرt:X\\+~{;aϡ( b48EƵ7w^,..F-в,t׽hM'Fuu6P bب N6B`s:O adni lce/{YT+t]4MŸgff;GGNר>Ob FA6]{eYg?e6&JJb [Tʼul[PɴXR ƛ`h\4X$I})/ka4ADxs -_gBՂ2glD 9)&>`2< a LWpwqwM]WUmt:(!*NYx]qL ( t:+]?q)[)Pۯ"F|‘E$rNQVyKfuag֫yh)"";BF}5@a N۔6m&a7IV- 2$2M$o;! Dr^HN}sq7f[C3ZL䶽>zDOO#AF`6]8eʲ׸#Xܳ;4',̀tH?؊7PaϵF.evBpiuT1S9` 0Rʽ9r(OT ho- R-(<*T&{OYGvs ѼKO߾;XYYnau|69g  LaH2Bȑ#xއ|#!6`r>ٿ]qNhK5bǏ#.wQGyy Z,Bp "'ئ?\;{+9I:EtHw@My1ŀ.L$(\Ȝd6MSp4a Lj.--0 sssx׻ޕQFe ù#@!9D?hDµRo P8~)|o7"j]KZ@ Ʉ$daʌ ki;h`+ֱ$dmԙ5J\$Y#R0s:.~g/:*\I8 IcǺ'=j}̌o|e?o߾̲pM { mrw'2 eRo+#x bbHN֥[!5S``b4v%aBWQyY- :A(ꂈ uk-%hT2rBZ!4$L] `oNcFOC2A^)G M!N!6͹E7+dn Q:43Ao&u]C߿7ٻ&N^W]u>SmݖL N:o|1TDY2JRZZ:F} b3/E }zj߿?S{r#ȏetnwd HwzH{QUU"/!$U m_Ͻj\rɡIsK39u!q'o&_7LLEB FD.Am(ŽDPd›Q"1%)q>MrT: Ux?STopSdT#pC&^wRI.6:3#79r?#?!Kc ೟<~'~tZjˬCjrn &T2mdZjeӁ82@vϿ] X+ڠV* aB2fb-! t5GKmB?qD[U}{$~MwR0m Cʳ} MĆB(~^)BJ)㉔ĉַM78W&H8sg4Z{}30p;ivk 0&nРꂣ ``OnJ҈O+tԾdwgz!Rj/<ĶڜVJ t C(Vd2Qb3??h/h:;mi{mD;w_߻wo<&,˘J+l0&:C_Wq\4ɢXshBT( I14;ZTqM#ր$\sȋ^M[j /%cHCAcI3LiJ9ذ"+ .EIKp 1M][ߺsjS5~'/yK*2o=6!ӏi~IDB->b޽q0T+"Kp(1/}{x"h9JYqnɤ&;8xC]7YkSƸ41)/bw @9%OabD@;b/ű6Z1/Nك( o@e *n9 &MO<$N<S9S|{r1i=6Ψi`?t]MtFSNM6@]xcOj ߖY:IL3+}S)Pc-,G'je*$y qANpdI9u-HNLy 3t9UyrL##S(s\S= ]lnnN>Zʯ fff&5Nn)NE촺@H-R ~O|1 fFUU~(lЦuX/ң,Pcm'4l`R.he$JҍR  S7A;it:>"@ˆrFXAN%d7׷K*D=>`7fҜ| >ERaR:yj =-ܒE"};u6vrh[HvwAt:\S0i;-0S_>BN*qpNQUE`{KU{HSaR;ǻ: yP+j!˜Aijjq)MI't 0VB۔Z1ccc>X\2/..~.@wZ;=N_oD2 jozӛpСMzqDe*)bw݃rhiNP_Λs 6 <5y0 o|"M2w oH~G0 \%E+],&0-u8Idm"6BrOpph/߿PcbmH{󞸈\[z ü uTRǐX] ;OAغ(w韶Yړÿ~qAXkQ%fggl O2Vl$MHi 8C4JoQ㇄:y.qpAV*`wm Z˧C Tɛhl D')wҸZ蜼$6S8"O :QE1xSA1NN Lmi`ZZF "g~~{`ff&)75sT ɦ8D/ ˜fByH.u2&995qK+T8x t +EZrLUM\)`eez'StN Oh}kXZz)'`ir ?Bw]7n`V4P U FYؿ?ߏX S@acGy]߮!&R*Y~hڪ6rG\@SZ \m"7}? g;3͋!S Ƿ.%)xAi|mwl3IL / { X4 :tL}FQ\hԎNQBmϝ:];MwT 7A]q#KÇwެ#$k&`{.F!F|Fڛ˟:qئ55XF4M4j&e82EяWbBLv#2Y *CxhS}>*EK1Tr-NRuwxɘI}_G8/vG$w mt[PUaqL{h4(ǣ1?y<Ay˩0eD 1.&n.k zK[ 'N*JGLEb'@N}0^G`OºTt/ZPc* 2Թ#07k47ۈ"iV`ө_ C;w>v|Btx<1 ۠~|;-Ҥi`aaW^y%pQ۷/ by1?Wr0%**$P.0`Kj ,JGqH^R,ӳ$$m$Lrv^ /4lt/4V. ,C~b]0>MQ."A6cA+W_-g[>vK.4\kE)pM7a8bmm {Ç"`'A xDcT4h|ݽ+ $EFׯ881PŮ8;]t(HĔJlu3ழwQΌ,# =x /D)/rD:f|'1̑pug++%/8TF&)4DGQziuHMtE s lra,1  ).2ot\_kQw4f}Xd^,9nou]Ck[8pEF Q񾗓a)c (~ܹڧ@B? ZS938M[+a/ȜZ sYGheMSH9ڀbBdl zn+q@9T#~R1L3,{꺎ZbEQſ{Yfح 6ѣG11qylnnNu5Tڴ yymU7Ʀx-ظw*~E;(BG³r9ero6 vv1 2W06 )=7+cOk_$m3Щj6O!4؉{1$eU,N^K7Ay8jH8=fdtSfzk18p h۝w;2Mnw+n)O; ^\a8x+EQyHQ떺¥ g8ӠU{ 8%DҼ/nmma4i 8 %+乻r `*_Y D䢊,ZE[(VmPbR2P:Y|_śS(.LKq텆Z;2KExR/ Zu}kPCk:?1+O,QvJ߿/\ua u41@PkY&S `v;2[BH*˳:rf^ق,lo'@}aI=},O5B%huTJbԊ~sf*:؎5Akix  pc8pg>w+'6@Hh4Fd\hȴCsw L4}T5]cy`iaH U(:]9؏{1]Sp@IV.ݚ0njOr6&k RoR+`rn/y-83HEMY"bUԘ*9LQ!2grL>(W9Co®| e>¬.ް!Nr虙|cûn\} MO_ DXb:bĭTZ!)a&V,"qk4mυUJ&6.X"*9s T 78?5\3`t];>koڔUbo h mpZ\̵؆gѓ\{>1 vP13`X>Wf"4 En+B*S׃$"ɢ5C(VP`Kspt&mrn%* i4ڑ &kc,@!ET0$Q # ^(*"VHzihp ldD"_;[xM^uu?)\a#i*tP5ӑ-2(_>ۃݏhbdQ hq'$MI2 .7 ϥ8AnS#ďb p^d}m J'{xi&i(hdd g1 gs}[^,L|55Jar310>^<d1l z*EЙx>#G/?xK_:ThZ-0D;SН2o/~mj=cvץeh s4M)U18=_D!ճJHHBMi@,*Px ԕ)0!wa8{ ,^y<Zt$Aj.GFORKS2+*keМMTTvsC=tQN0U_6{ߌAk/~7|s٥NaɊ-ѝڝ!i9#yw'8@vK8țsnFDV6 D ܍6l">NנeFDaŤsT}Fg ~}\Iud]?{or 9~Xi{{{OڸJS R^, nĿ&[ƇtB6X9µ5xpPӧVzJ;V(Z)̼'gY8n|?A- k4s`JY@VTuXd]84a [̠(ܱ5:4F!imQڄXb _}d[7ȫlmm7~7 ~>,MX FNf"7 5E[•/g\TQ[V?!4qQV ZhHt8پyy)#ؚ k^9ĄasH&ї&@1)z r6-$>8Bo|7ܰ}TΝN3iCSi`-a8·][vM+MA+ E ū+GDI`KjB@&ILWJCqsdzD7?XSXn]I1b5HMbw,GSd@R2Pn:uKe]diʤ,B _;ꪫ4MUÍZX siQ8-}ۼ.,0gk#"ԍS `(k}s-YMJ_W4PJ4vK#}.{/Noh[,ɞN6S\4 >O̙3m`<[O]),-c\o\>D(&y e*QS(P>)!ـ#K Zan홗JB3H. H2|օ0A.7`ݗC .<|2FvJwf ;[72[Ȅ$&6*$3PG f{gpӃxlB$ 0VSN8 O,~ ;r+TeMAb ]x ?$:ҭ:BgX"UKX[gQ)⫟/8QwڅLJ#{VM@k%#A*3FEE:N@n?汭 4ec(_w E5/o= 7ફ*kUU(/amNoc$O`XZZoԎb%r6ƦE)ZZ l( pl%vJ~D|M7%#=ȝ&9.eN|۞)>/)p(4L-" Y3\C3J쭚-)M0)a }5a~zAlx-ߟ)ʅXmi'@E+e ?u>a0d_;ASZ[*OOOus#2Fu\`>s> ?ErtP}Cks_GŔ #  zEi'AkM%Ӏb*Q=*Wp nW_n~&N:B)/ ?<-Ur5n'n)lcB=pPQlUqIcmLcl{\D{rƏVf7ַK_M UB ({T"hm$xS)gS Nax<4%mF nMú6P;C~6[](\֜/1?:z!%/#G nX򿺮q{IDZᚣj0!aSrjxsżFaMRK:. ,=|lQ .  TL.;y miWVM1eRr w .4,IDATx:m'47C(;p7/nGr~O<݋kW^yetM|'qux#̍?K 64lfƲ7ѳ`KxxBHfi^-D_}“ܷttW4:@i8 ͱxr @*Nps8ډ̗yM;c0J;aZ*89Y0rRNpK1Ϋ66(-a{һ/i{A[u>ǡ{6έs0\ {DTċЅR@u~B\}8g\s ~H؜pP#'L^Xin%p=pQ`vpMmr0`!c}7~Ψ,}x%+l<?cC )X5M?|ҫJ$}8OLeiqu{ÁfÉoֱQrVb( h&r,8q>UҝѾ?ǘK<}1"w%^[h\U%0 #mx DcH!ZY{ vUNMmJ ::E( 8nz\~,dQbxQ'cL # ;ߓ L!`Ъ&nMoG@[C(v@!0#D-qm d@1}>VhM#>~c ;q;` iI0%7cC֨=xbu:X,)e@[5Ÿ"DLӀ^פJ`c@^t0V_|#< 9RCOZDfl'B$ByAe4%=S1vz^4;L PB16Vqn7ҵN`7K"9Qncd$}% \D>t '7o#Gk ֌m\F+eϑlwEr¯qWr|U! "\Zy9S{7N2M\~;lV@qV8>&DvR?hs ڛ-JGZNg減뤌T.?t[]]E mb5mY&ScGjDPkpr}כH9)OV0 C3ЅZq`FnR뜈`0ֵbfn@vw .vFu[ Mh%އ Q_")%qJw5V_0?(; a4Py-@ mfȡAbh"1.2D;i;ሬ*VVV93?4cN?CJ= mR_jH zţC zQ ]* (Ph }NYKh-Ci1N39jZRN*,4cqP&;᥯{^xU0M?/ JrQd<T> |޻iv , ږft}a`p;KtJm v6[$R . ePxD(7 W,qY;w XXX,nl wNUU Z67/Eӊb@]N!w:@3B)UUbH dȰ!C 6"͢`jvt"],6Mu1N MMl IQ=  =}"~VhHT%>s>{.QvQȵvy]E *שX&`jU{pD(;'f0uW>pI3[ذ411Dj`F'H'[\pտ^<,^?i`A܏b^tVCqx;:-~hWІtؑ4bjv- X@%vqffPenfrAC509RK((hoӠ,A|d3̶@kwt0i'Ee!#}MR(=Ai5E8@mDl+v(TqTσV('Y(0m֮UU!7͸/^|}] nOE<"rEeN`G:'xRI$ˣPV M txvƗkRЬ<ҽ-߅b֬V&$>vW  ļ:vj3{0E{077^``SZJe4Iv^`uhHՔ8lZq"׷6Cp`87 yM 'xטNىVRPx 4l2Tawpvr;,(?iƀ nR$(d\P|*{7UMfndEu%,:p=bpx ކ˷cnx֝Goxַ# ՀPZc+ b?03;n룣D (8e? /zr2Fo9XOO1z#`8Pêw6{GNNn^uv:(Kw:e ]h]1[%!60v'50hO2*US%hL R vsr̮a$mfF8p/jĩP 5ڄA/\aS cctJrrAG8|,/>^y~W>of'A8TրS싯:u8׽W^ tP}hR)+t1f\ E!mh (\b{Ch*á`04%>v:/nnn٧}z==:ݰQ P>U}Gp/ FupfnEUP&H|;u_w7 {olan[Em vGdf s l`L4̮v ]n,&Q-PKt!ކ"rU*jOjtP>N-^|/ݎQR~lȡ +R3?݄Qp~\v ?[J$ _X=PU݀MM-ZTD(w! o@==] `t0G6WZCb/ke.߅wba)\'ֆ5\o̼z3} y48B}ݣZW!e: #zUtK%k`T+aS`L`݁/:0 WOydSyl #i| lԌwbIɑ9EѺ)l/:٥Xa㷄=r;h]4ԥm\)t-mZ2 qi0>ߗPM%lb?ω8d( R[3JA*"]pַq% 6@m5ƬQQEO|gu͢Ⱦ.]޸M"~|uEOob@DYҮ!c'h44)ZeO$ G3mc^0=^o-}-.2|?l@RB%vq\䲖pfy n41/ (BcSv 1yU`J!Ե3SpScQAY ut\|S%2LӠ,5ƀW0Ơi=46E[c1OE[|:!mхN)\!f,3:` $ 366(^Wuԃ x V02bl 0(f4.[( "/BmN<)$uЈJcoaKinByVUMgfs^x}g_\>JwaٱE.+`G!51j k& 9ژN@k4( Uc=9_8ָ.c*Ttѱe\24}V9la"Eu3„3tz:uPP*=d 7 =tg07F1FBB1Ū)X-6IU: nP5{<L z6mҮSh_ݷAY Ș,Saye[ZLG88Sg `ʍaj1v]"C=uXr6`k0Lr'U]a\WGwVTg,LEl(}a<$#IY@*/mvў`=H+ɴr^) IaYYQQ[=7(*91/~ٗ`ĆVvK0(;QWp>gw@Ai9zq8p6+T/"0RzKSkGl38$!' OcoDYLC&3u?7[^{= ၮ4gUPyl~W\u-n,B 밦&p<߀f$ L-:mYs9,TiN:x,(b:B/뽏]QHvSCIIP;  \:1]nj*Z0Z60ލ1&Kk}߆|/CF=l? Rֈ&R]JMݸ`(nL9viULkj8qԳ5 "MQlkPxzm7b^9`. -Thɣ}>ݬ %#xf+:.~ @a_<3%^86.Wئl' \^cߧBJG+ p80^FPxw2e8ChXDWz '?6E:Vxd"1֓(4 _EbQox;܈[oیs1gW_nyܱ1BN Q'˲yS?wx fR~8hA=;0E"/M|:QpĀ;j֎TMp|,A:'B)#?)^Ok֥KL " kk(ݍSꦩQ`8ObˎZYO m#lZGF&@Kz68:eOuSb<F4f蠮s<sc`0WJ( :]\WWr1476p7nsGQι{ЍKϠj׶] 43G34cë^s#2Ь sa~3>W4 msjұY?*^;( % tz4Z{ʦk+ 60G|8ÑX4 ffg1 NGSU4P Oܴ>anhPz { N׽&:T1FNUUcvvuUij/V}\vvY;P8CF?Bӕ,p4$\,DnmZc7Y :n!Ъ8N}*~\M[&F٧? aBZ6JW.k_[z4tz>C6 MVSƚ/;XϠ[ _qY=|$ k6`r3\|o7zgwLEa-o>|^/|/C"0 Ϣ?4]q^]D)/6TZPv{>L.#1`AJ9*y n3q4Ą1ou /Ni?_ B>;E m"u]XC(ƽ['K`kQ_QO+|{ &Bwf(S\وMk;Z06i'V.Efo{5|۱|fKX)I ܀t%j`T Sj,фNF3&eV~}z4Kgq^nRH Dg UYp:<*9P)J_L@YFDBSx X /՗TnJ}R)/zZ葐p6,<@P%ۨbI^(]ǣX0Dk؂CjE'Z|_kv..:ȂV ,E>x0C؎%u;(cq߁6Ib&yMgdp' 6xI|kJ/ BIq HÂ{?:s;=틽oSg^}ωMo'C+ĉX:H  'ǎ\}8 0.%Ж:l(2pӔ y.~ç@4VqԵk2!I]8''y[0P셛Nh`$"9uv=4:8#ruGmjY(rJu8x0J]S8ZRu҃B%P(P>+pW!2=oHNmjc 1WZЙT 7GyO>fs3|o=җoő#Gp{"ŏpMe,c@&6t~M8D\Wr-^߃t$)RuEJ'~x2 JhÊ_]qA4|(Arq YM 7ol] @ZH)`DoQv:&_[c~M]FBoҏ4 п '>ȉxހu 8))"!uhMNQ|kSa4q7u8M30j{Qqq" nW (GTdF|Ql"j0S@Ol.0" ,gNW_S<@aH;=?PHur?g'0muь;_.h6>BAD\EiÙ5yI`.{?WGq=w?y౧Ncԓm`%ߟUzMm'QJJv&("2.Q3>0A Gsaܐ{WQm i|اpD#d@Q&l1' x 1Kdc#)I|SvAJ9s?7jB|@@*׃_Y:_JNlL>W!U}!e7)!X@H %A} s?"t ~ꋸ 5|Ǐ =OGqQ)`x[AWm\q٥892lm )b/+xɏ_]u5Jۻ/I]LqʜRT2H :3;d;~]Ѭ @]L1ٵU_k<3̘)T,6NZTU M0J&U!U]#r[|[%3&G5Pq<;1wv)Yfo"T}ʑS:頻nR i7AmFf]VQ e/No-8+ne/d^Kʚ1>>񡃰 3u;Vzb,AT.mER6ȮcPB] 160?;˷b$ǐ);CMP(D0Zӵ69%+ IaFdR tdѶM*+V6g?rߤ|'ٜBvv0g@4Z[(|g< Ʀ90݋L)^k(+SӸb?IiD"3r)2spmW}zL. +3kJ*IFfI%Leea"Z*>Xn8X\zȗ"=G*/7CT\)WW)>?׏&w\k__غ)ʰ,yY"cES@l)MA[e dʪ<39fTt9*Dl`:>.2CLC#X[z,8#b [mf(phӚײ- ܰ?5q ۢ^ձLNa8AdW 홡67G_U%ui fvo`5GC){^[[SD-JWPyRI&PH y:tą{ސr(#?EjijXߑT v ߶M6bLM;5'VCa[B/b.\iD8ꁫ>rRi"C)AmHd:2\U2=L*U7r3]jj @d?6!6Y|K ycp6(8^?sv3v2HO}w#Y +rq4sfA`OE#%k0*p\GY4z0RP#ߍ}%$:?-aҦL&z"3 ~>uˁk}$keUiadf)lQ/mxJ)jYUlJdKk k9*Un]khq2BZJ&N$D[kWHD6dRlCvW]tˈ׻BIMˀ59%2skwnhM#Z"iM@stQ`kA*f[FVd oﭲtp"qs:7B˳ j10> ("i[o"(`pvV5A%!# )4XA @^(6OP@1JLY~e 3b2GFB#X2dzl+#yU!'(gԁdg-f8vm7i#oAEXp .%&W>8!8XWfS$2yd1 Z,b:ZfHNt|ӕ.zMGdžMYajh"9E>kF"ˬӅk.ԪAp?m+54rBb9M 5\;HWpP0jԴq5 9t>wx{ ɩF$UP})+ףڥsu Vv^`@|qHx2a1mfdvX(pJigI#OR׍px_]Q(½KpQ/*\b>ON+~T3_NH5#stTdfer}s5H_Ri8t/{Md`7BE->vSpP' #!i1Y$3{Ïn޸cǎ3o_ƒ~/3."3An8Sc OsF<, mQ)؇crш=ftQEv& ꒨"6D>}s17$dbL8|tgóocpnC 7汲Ǘ.v\K KÏbnxsos3ԧo-87xSr $}6Kjw܀ |\%St2",7GC,l\?Ȓ!T;yaԲ"c5G@2p ogDߧJ<]#sCt6piM?v^y&ZMx웘/pЍ>f&GqOn*vn8{,gujއݗaNZ5"{oWav~[k>t=-0Yaɣs/iq JAnxIc8Jp Pq} ~2ćc}ab$n,i ƻkAD^|SNkhKqBf->E}rcI@E$- h= tgBig0pqa? ; $+pb)b 㿳xynطBh9n5@{uofg{%"I\.GY 3}xCR2 NDf,w`MY f!lfod1Ie /p(Nt Re('©3讯anx)YHÉ֯v]POIv"l , y< 5)KIi 7or-*CES;j "q˲lqTɧaЩgnΩ:9=LoE]k,vF{~5R+.*ͨ(-a& zh1,pRd8#0ރޙ|W=$4'pNj+·CQYIFKHq-}/Nm\l;nMƀR9f|3c.s'Z9Ǜ8@ <.oB}ݠE喈͏-aqJ%R P(""ɬVUUJdRO'[;>(s\6bP25 Qރ]B$7ID0` \l %^]#|{Wtj"c%CgsݸNS? eo-A={Μ9CGRٰa+Wd۶m455Z\Z`,MJ!&|رFijj۷3==W_  fR r)9Jmmm3x$i B$5D1S<"BLMMQTCjGިRx:wh÷ׇhVt>W7VDY6jрJhÍC)o<+;QGWWccc|=0@X&_Ƀ">QJYwÀB%[P<Ƨ9zvUs 4l"j`PQADft(ܹ(qGK [Z?H '[ ܽY9IGTIUL-9@r} snT/=ͭXk/|ȹ˖sf5+u%!NƵܶnSJe9.~o&(QN{YÃa%NR$*pn|6.~㏬bfU" fB-" N  !Xغl_22t4K4!oԞY0w$.?dOCIENDB`CPU-X-5.0.3/data/icons/CPU-X_24x24.png000066400000000000000000000033021454622605200166100ustar00rootroot00000000000000PNG  IHDRw=gAMA a cHRMz&u0`:pQ<bKGD pHYsHHFk>IDATHUoWr.vAFiԤB%TJ/ Oy7@ !HҒ ZqDQqvl'Ƿs3vґhf׷~7f5mjQPc@FUK5 t/S[\HJ3UߠZ'48aQlhb$AUQHwyXPU,ɣ q"|q.n\A_l'q/~g_.<$ ދ V~w|}ņV³G3\{5,9Y&KK(9ޑ9$jі7@DRBP@ uTf8&o1$D:s!in\{Ћ$FUQ :GuY 5>_7Wfiy 1c n!#!L B "1`y$I?'< pߤz`k׮q1* dØ')YkRU:;ۯ׿COO |gWe̥dFGSW#E%#.]Ǐ:Papcǎ?ɡCOp3X8>$[E(twwIWWO\.sYiYc-HAGLM'eevMfgILHoCmt U$!I[Pj>.0o[ӳJ"6j*QJ`!"MC W](n~ wFtجEwYFF!@ȜlCDj4\`qOa".,cVq|=c[8K LF7RE k5.]aq*pwnqꧨ(FӥAIz+b*8CDskק(^[ז#_y$V색,l~j Ftj,2롣xɊSYI%tEXtdate:create2020-05-17T22:00:42+00:00ڮK%tEXtdate:modify2020-05-17T22:00:42+00:00IENDB`CPU-X-5.0.3/data/icons/CPU-X_256x256.png000066400000000000000000002213301454622605200167710ustar00rootroot00000000000000PNG  IHDR\rfgAMA a cHRMz&u0`:pQ<bKGD pHYsHHFk>IDATxygu~[rZQ(;A$ )DJDJ)ղȚ%=qha;KXӚ"[;emr_@} W[޽g9_V@Eπm{9:{]PUK=m0-08|@@ɀpY f'3<(< G?|9ޭů΅Z>w=:?YYY<';0nN}OQ}^A\/g]>fN8j[؁L 0_{k#w\I}ֽ8!s'OO>2`nrv afڇ7qIot:6;IWټ]f>ϵ{3tz3Sn2sx%}"li㹸Vq~%;}j! ܗxL֦3L@dAZ|| ^{}|ʞ3Xp;7tLvs\d*yl7{xM baspy*Hܬ&=ߣ:z]AgǸ޿33@Zpq:煥4~)ɘg?;7N +d)xƉC8 TaO]rV|#?clzKg_yS"T=U109WW}j̮lۄ]{q-ƟqX3bSO=$f7sXEV}P{PZ,x\#QŽLεR_)3C\}SLzVE{Lg>Y);q[J̄Txwo5F[8}5Я*מ Fq1<Q'wyJgZ/ `Cv".6nc9<>tW)˛ u4M0S4NKcFG_+Z2(-ޣX8`\`g*bNQ9],G".E)]pi}JY44fWL /HſY~9n2~A\> 쯉\,\@UX]xzk'XYw*Q:L u>cd& Ejl-5ŠShͮ"囙n)7\1 q%O48,S+^)Op8F;8ӵ\&l]Z`_8gi2Met|ւYK7> |AxX RߧLz`SL19}f|!EK:yMx):ǭ&"c! Pq[2ou6z!~wLҷ{\;Ӊ3쯍UolUl;#Fr)pz|6\.x|pG X=E0*>pC'~Ө 3XG`!YU87k".z4\I,[lzAt\o?5{/z4@MpCE8'XL,7UcQ,VaiGf׮28+Ri4L:SQ:qȟ,3LR `|3rFlRebwUStD\|&D,g,["ӶE#Uyӭmҙ^Ζ WJ!P1\*b@h} @ĸ[qvx0pM7*ر?9^t"66|].難T(H}|?~cߋac<5.z6|TycEYэpU,Nh] uN>-Hif>L)-LN|,f:eHEd t͘Uf l ЊAl}|ܗ#c6Ne!AE 'GN {}&Ġ0 F sof f+BǴ|GQ:LUS Nx3꺇o~ϱoKvB-JrYhc_p Cd\/>};01p7ˡGP!?g.DtM_e@CmHV/o"=%ӥQ&d:Dd@~e9er"2xrFedJ `VQцbLf.^AI6.&}D苘@\9HI0a[+E;ȅGIK0saw6L]'&r>2aӧ4&M`*D\fSVE d.,y z.SXě!!C ab B2*v׆cH3ϚJkaܞjId6PtP1b$z 8I.(-BXv6!AH)mxMMc\ 3`E*S"%|O0N\wMc'׿E4N4s p)RنLge-Z'P4M9.4J(hD\"cxxYf *q^(&nܸ]|DF|T8l|* MAi@~SGq<21H)uPes{΀rP`(+nyZ.lh(>-Y(2&Ld 0Hyɲ ,M&9M8"9UT?M[̎H$LƬ.@ |"u)Kg_[xg &wGsHqE79ތ@- .uK D062iYbbTⲓO"do!ELZ!1.~4"1%ؑG5Pj@!Ӭ(0&z^d=0szAC<&wXRq}2q󅿺46 ) f*BCʛHR2mו-on$6k@ %vU׬z4l )+a`8Gpr? μ+N=Vި Ȳ^-uLOGzuQR! "!}*-pSC[``0D5\l?f7q7+S͉(ph.w!BLkq|^S,NdZڒ . tE1NN|5U=0& G)Ir X L1KrcXoegJfoL2NY1CL$u%Rs]8c!n8pF終uNb*=/,j\+Ǧir/e}Sb8eS7-I8ɁR]'6MJBm=EUpCƎBR2ÆM.,>AA;UBT?G0`A3mPtJHjXVv)WJC@ħ?ӫ&@ rQ"b8lv߀}z466)gGJɰW j1~FW*MbOkPRم8Q[{b\-5g9B@o8nʘǓޘ0<߫1>ʀ\ 2!_ qcA>82 Pb4SO)1j,LG@G*Tuϟ΁آWX Ǣ7N]Mp0xM@EԀ] 'ո\>4>$Q0P9FE6脦 \Ä`ww6lp hh,YhuR4z΅"Ɍ]MRixKlDa}QE\ 5qr*ŦUE­Ǘow܀[NCG0^  !3RlD1D0=?9FP4/Se=> Q9׸FJt8KP(){ 'sЊOUe`;GTC $BMd ^`T qkCjd$fHPa6 c*=bP,C9 ׻"?p.q|=d1Y6V d|&Xedu_KgvqKxs8{i ؊9TJ69}Xr>(* =tjQʜ9Į=1iM̐kW}RATQF#vb߉VX9`8L(ڏ>$Cz` UE~zS8.uŖrٓH$5I&Pƺɷ3[H|I@o*k T`e<]5W0+A&MC "?uyv†x5 +鷔=Ft(_OLA8260l _9wfa.e\X9VnLfpqy|^ѝpk_ǥK;i.gj 5,Ep~Der[DA'ʇ̇܀n~CS~~ VW70j&CuajB4y#14S.8hӉGV8io˒H$"gY_"]]#C :8^5sqkԉ/).7 1i!f/:P&1ZޅkB5DhlH$<'}ss<.Rmz_c{o4GƉoǮ[o=/~5|KObjXarJ< %P&ȥLDz0DzȊ/MyV5@)A5e"%x'?wu/ i$Axr%̣$("Nb^&qCԫy!0ǿU&`sw$>GŬDQB#C $T*ĽA E PpTu-QT2 ίĔq6 yJ's u SUʸ5'G(X;&NMRDLexଧ:t+Oǟ:~5LƑ3Uu B2YAN f^+u3/L|hUCI~ P2!~<77i3 O94Ɉt( zӫ۝)~]r\1C(OgrM>&pq|"(&~o>; u T`TOk,!$k{l*먪*wl Ȑ럲 ZljNCQUT-(A {qH<}Ƞr0=ĭϾ+1H i\H[Ri(51tSr"ԃ:G{,?G>4r 1QЄSn|;.@}SESYnK[ɅGͪR}$&q~\^ؤX>`I$u.`,xb66DI(HNY@*7a(tϪT~`ܒ';=z^dLP -^fR' *MAQ:+5Ηu[o ?G?5tr5hV]\Ģx*ۀ| 9TrAͩ_z{F?W[67Lj> nbM$H8sAXefP+<=qε^Cm*c&|"BUUF.KLK7AwÖt/Qj?ׇ&n ⵓ's}'\d% =(ٝ}hnz^3UKI h`'*@*1Utq9t?xu%2OFD  Hƻpf @[a>31)u!1 na{k cYvm|2+,Mbp"\hdhfrE6!iS>݀ uWzY{&|fDžߵ]x._֤ Ul<#܁pG]Oq-Xp{ì,lV-=8,Z'fvε ]H|kln]9LY_D)8=_٘*N{2[pLdv3 MkĬD/;ANk||0wtԭ]!4(n~H5M :c-C)Gx0=O$ŠE- wik Iib\hޠ#}/67gK!򀊬-񨾣R^'nPE&g6)J*wFceĖ:60g9HkMZfL)7c9 1ǐHLoxՔPd0؜h2ʎD-^{!(2 8b^ddTVlt n|߇o?͑H.#L`Zo`1̣P(zQ'I W6=>C7a:ePY}FUU:QJRF%=fmtrS?L$ "=^68ҠPdwzCj)e ъ HQJȉ'uYޥ{5p2ZQ2uC`L1c:SԽ!غzu*0^Eji e}A|E6ݢ,RZ5X)Ve߆jy<˯~SCp%L'9'! زass:$9eRH01IjT؀]E-7/l6SENF; &iѹx2rZ) ACv4),zO)NhS W$6E? HqB&>+g/V'U\I'J߿I5rR61"s# Q" lY\,9 [Uf , VٳѣG`NW c@0p...xϽ􇰍UV99\W Q PA'T2M4 DxsEp!<8NMBp!,j>̇aCZ7NI qg%.Tv03ŕg2-5FgE݀XPɼtJCʫQb_F-qQ⢴|yFD8UEQ?+ݒzai@%錈1,GJZݔ8FƠc8anǹ3~z;OYu:(xu{xS -8E*oӇWbd[n#?CAPdVv~nᜊ̾ t$1"evlڤN}#/@1ƅ2ˌ#'>]!ΊU#H͂f+${EyԨM(s+~2RѶѭ[v7yhG d.XE 6z a5U^]c~nkXY>v Ӻ$^6Mrc8nF<)<0 Wp\ˆZ4p.p3-ntk-lӄ ^G09A)6gRRp̒"І(!&p'Gӆۍ n ޢRvcb ~sC.tbP1I&ƹ~NBϢNPսCdZK]ר}8~,w!ƴMf(h-$+dKauGaz=nms|m4 ‰º&gʗe!**$GNЁ9M.YZNt $&*{pi/g"4KO/[0e'cޔ:TX1!? šrqy uD6&C+362ۥK D`QLibwl%8~/D1vi`jt >0 xe ;^0ڂz%x `A?-"hx71ӱbkleBon)DY'8n 9e&9HR 6ZtqNPNr$l8ۨ9+9+!5- &(1{I"=ڏ07D\YL*Oqa 4Jf]"$4bZƚ:*B#>?9BGBPl 2uIR/IL*w0Iu8y`YRTYñyֆV}=DTv)][$y`jQ9ettva},vXئ)jjxnфeHGJ&yhC0ڠiM R_8bW*r4r|uFH.dLUi1Lwwm-lں`0H8 ٣*LӴUi#t/G,K.w`TC38ga*p"vqr;:ht٘ A *S&k'X9kqY2uZ붱v ' ۏ6^#PcOU깦 ("Ѥ0-me.u=tidDZ<9m4rTDU)(BNB4P^2) Bbϗ`K:!Ta4v ihgAiak{;h)qb\6M`2& 51X\\<`cbA5ΙNh4; cBVi $#ud7-Rj9QԞ}JK N1󀠧G.s֧v5!wp68@b#.ٟe"zu`eH"$K:*Y2ܚ`aF#@MX)٪r"vpg;.3o/o nh -^1,fpU^Wc2H@=ܳw$]YX&.L[_\PbM%,yXb 9uۺ ˒U吡0i( )M$6UE6$3)#q;SqXCk֠dZ.3d6j*srK\R33hYS0#M2-*\B H yL⊾) IGYn6mȲ6CK][ {" #/]s@B' Ν;'Oi_r d/ٕ1K8y{?xRKJҊSIStOPRt4V+?*ZlzP!@tMSvEI6gQܓԪ mxu†[K:UvSi*,[=p56`O'1`J%eªX{.J6)H`G"jWW]D ZS3r6XFAg' sεN~Sxh]ZWP z)-dz*D:;;!!qG9: -+,%KQvH!:WĔ ]HHgVkp֢\;WC{L-跊hT$hҪ֕M8'hOEDxIc;S! -5ىTk\I4 E?0QbqFc\|%qѭcmm ϟm/S%ڿG~R5 \t O|I9z$2ԉgKS>IgfHYh).O@]Sjю1N~ѫϷ}`VhKբ%0k0OLy̍ u/ah`W+ QIRW٘ Jjh(Na/HΓH hQA,L<Ĭ>C-޴Z1 j5+/R*Ɓ˦x \|9n]h6m/#X`{>;Fk4Z5$$31֙Zxh4d[, 82PHFa',?Ckw FBEP`@TĤi>Ro{I~?SRudM xj)JY8&!bQ!j.|GL!Ju{X2Kq۪HG@[XL3ybm`JjO4 \FN#:bccW\I looԟet:M3(._W^~;RLēZҌU=,5E099 3HtuO`9^%&ՙY/1 [~ܯpʦ/CS `I05c s FM蹏̐e[rC2,K A$+fx+e" c~Wd/T3VQW1iRqr-MUq`csbX~X]]U}.ϛ{u&zŸ^z>z ¹M(TeYjYv[^h>GZ;J27E<2iW?jm,tcTdH>8IU/44v'!\S\,9Oj GE(z9|lfLP;2ܴ| DRY y CgQڛ]vglAVHVb$kum@plAQȴr:X}`͐S0(b\ ip15D@4" Xr]d *L^M`ccCvg?}1ƘgIh &.^_*Sx2~GK{Yu "OT2Ed$h2JARhPXg6cv(LK[(–nj] SgNƷdzgYIf:Cki8/":ٚ4bC>nE!Ii_:bK஀DZ D !uR^"4 )Nt'a4%?k]GC]iT#e+x<ٳ,J<88MefASԩA=i9q٥$4b9KF1;F#fߢ}l˲2T1&jDT.Z< ӟORo8CQ5T-`wA˦!JιJ9ix<mjA/NhQm4+Qע=NvX23 $j)VaJ i@u:\1Тb [[L-ܔq_mw>!!z^gjBP+@4 .iЋ@X1M(3֤"7:Tw ɴ50TDb.aZU0DheTN d̾oM QF5eJTe~@5ޡAy@*Ao$[z/n}؅gn2Z<G7MRJBI*;Sovr5h^l* Q#2ބvRkH2 o E,:\jfYr D xkk+}x2G.@LF'JZd.,,`8׹i!TU]L&UVHR [h)^֩rؗ wbTT_ŀ,KXL Jۜn8BUh/f . {K2R#Ƙ0jZ U"A!`j/^oO#ow}_wߨ !zH@*!&Cb4T|)<|d@6IJ֩ިdyhֱD8n*N TWS"d>KǍ2m䩸j2ik~;XXX‚W ەH`{{ [ۺ/,7B6MR#ob(VHņsL󉜌c\4$|2%*UwQj;ƀTߕd z,U'nix?>op5ow˿ }O43b<9ahWnƎ./ȴGeU>tJ_Febh$iR>zrD H@VtybCRm i23-oĈoLԐB ךS\wawwH\P)F9Gj!kIP^\$=tH'$Xr/EN^N.cdIHT(!{t" H1fx2PqCѷOw/a||TO~;o~N;~y~qُIoSZiAfYA.^oZt:X J![䠄2wI˯{s1qR@kOΰ' H?2ϢߟL&pϣ* t7~SO R{3~YO'/VYJV.SurXpta-iODL'cG$5vvv0LZ{m|k-FQw{._W^yxx'pJ@CyEm^D` f ЖriGX9tˇ3V{1bz[ pc{N8},N8;wu7~w>Е{+\| ?%cí0K&)Iɺe rf%vAlK:ALя16RZM!b@{ ߎoog=W˗$?%!Psy!%W Yg-| -@ ߋ|;Ci.ceeo4g~גXs+ ,f]'9-Pw9۲3էII:\{(>I_֞f7D;$u>;k2;$o@_Vh'9zߚDkq˛c/{Wc~пˍoM @K@b}FRؐ:s, :PiJ.jhMR\jw Cw}MZd.b2z vwG8KKX: k->5w]w_xCaa~>Q<`<`k{w}7;?Ӡwogl@~ x%&~ޤz P @1i=M8ݫI0P:M>N!qƁ#'7hvwv6.+OYӛ:}z*?Q81kq=wD~p^8qӍJ_ઋ(rFܦOBA8Xgߣ͘?T2Rnq]d͙[|BD e[`;7={}ǏO"\sViiSSqVf5'݄C y !`h?dʘ{mR)*Nl^CT+8w_<{O_w |}_;ճ7V v7Q]k^u9(j G2%Pj(w` ꡝPAi|VuQ=UgUՁEW *ULA_۠?'-_򗱹6VVV1{Y\wrqc8y$~~?0w^KFO=)`XCC/Ⱦ~]*?5Wt}ʘCx w,:}Xn~C) u2 s+5yjc_*a*lSQ Pb敳);ĉpRmDu4Pj3oF(]. LLA tBpI\tWi\~=]fbuu5M lmm#μǎp3g//p73 yF#=L{4 6761b3ZU(vaX*hfEf,A"*LEo.Q DCc fd(mN}8!4Vn".x 6oB& fCr$ BwLNCee`(~{,X8 Z+ǹtRͲ3R>I ?!hҫ&U'&ꠢ9V&Oԝ=wwq>֖B\U,.-?`/fz);wc{{[]pYc:d:ڕˉE@1-Ek*ah1,ՖY2f깕+*e[# ZԖ3ƐC]p b + 06n12i,]и|Ɠ6oJwLrWiE/ $YHhorp\CB@ NKCw<Hj/ TNx_z {{q&=@qA} پ tx l:m+`gg /e zYF :믿7˗.L({0j5W&-y έf?N B t FJc\"/#cM,ȹ}z.,) TL|Eɤ85%UJz0# rM8Oe!Kf@46Zo J;8d=B+2:?8>|?,|1 pXƇJf`yzi͍5\Ys籵 X^Jɟ/w7;c'clnl⹳{ +ƿgYHSi+cDeȎys qՠ<աB <& RFMƲA?;Y TI֋a.! i/7אD~b"( +~!ԋuc)< `J 3 .El#zP7iR\;I蒧ޛ3ݏy^?}O<8>?ɟb~l=?Ыq=< S8DX6W; >ޙ0L>^#?b0bty5)\re/uu-#ܚ}eFI@PHd{~# 8hQS"ۄPeQgfSea.01B"9Z9Gp -)1+7SՉHijV:޾bhD!R-3({ n8 `www]AO~"p` m`a=k:f|y`kfo,~!n/2.>sw=O&X_[ÓNc$*MC&zDqXYc]Sԑ.5DIZt(r钔u֨H8PDm+NkNR;r)MĀޛt.o@Sd D_ZsҁW@.XNjdgP6ef. E]6)2 HcZ9Ks4@&dOlJZiQ 2A֋f.N8u@)0ppf2Z?,itR1Y칶 Ƅ."[F (0\pֻ6}S0,,zZW~[n{.0aC*̌ng Q:Z~Mu‡f6p`X;DZ;׾U|רiX Y؃!EHEm**l ؐ}2[Al;7@TU[7h08)I<yL]7~m.VLɡA^ m"LH5 5/{AO=dxK([~TO Ji-\Q!5t੿cT081cn (n-M00ߓZh:^ֱzVQLB҉ ,\tV7%@,-sad@C! PX8.H1v2X_ Y@@ H^^ IrE@+Iki]wL{&%{ED(̎;VO)XlMQw~ekFcMc4O_yF=7ُAE`j4[E+"I+ߢ*obyMw4~ /?۴8]@VWW4MAG>Aށ̸(s6^f"m,3[FlKy؅z FiI:s 7DA(JG2n#NBM 0t)b>A6ߌT:yٗOzRǽSQMƥXg^69) kX=HOބ<|U4lq7]@suX:Q0 ?E? q6A@R/_i2ai YҲn;HX\^/*9?@i.AI]I&[)U:'3Bqy2MC!WƔ{1&S)wȻ.$A(MEJpcckt F'B^J1> O lvKrXp2f] %]ʞ B;pj- Œ(az$ZZ=}1)%K=$w &[e飍 ܹoh5|#w3{3z1L;o=woyy X9K5w Dp9fC1IrnB0%1a ]q8wK V c#9\t.^b9 >A ҩ]` IB形en' /%.zY ږq`"BL(~@g@NGeMND_.(ybc ֮/Mfͨu>M0VfR^2rKcNk͠t2?]v,61?9la>0.;_Mn<-ڎ#ʁ.awppU_o`M7X?Y\fR9-:y zkUc(_h~FiӒ<xxV ϗ.bN Tv=Q32+6YpAϒ١+F; y3 N|bE^E5GʃM^Ey K`b"*ZTg4bhS:ܝ#PH]K*&a;0 Q`p"@ny }F:nLhFyW~qe 8zqdJؚ'-LaOdWNjS Jm^ʢtaշ/E弔1yp(qY,s2galFw%oRҽHJ;gLFyt"6@ ]ל+Ո>'Cn3JF*F"q'ϬM%ΊB0fQ "4=%iJ ,g60a{{McqRg=~hn4< ԇ|6P- F Uw8b%<8@~85(ص\H ٷ)@ΣCo`n╥8v;H%y1t)l ΫewQr볻2$-Ieq4 ; g'x߻-0`ifr4Xˡ$zpr<]8O}P vMy/1^8˘N,4ZCxՑ  ZuKy .駟#|wkRIcOdqֱ\R5DfZ&[E2M>)6u50ԡW䭂z/.H8(K_9(vkCJiMO2,LaڼW˞f$ RYu4 8@+W.91_`x`hpj&[S߸]aNe<&3 KsXg뗧 ɡx8&a" ̘N7w띘y$$[eQq7omݜt ) S8e!N"Gpԙ`ASuXD* R⧪wI9'cśuj'Qnv|Pt u\4eǒ%;̀ylRœ`փ$& \='F ;;Sfv]ﰸҠz*ѹMߋR^r@Cl6׀3W:\Z*&z,= sWS!JUS/l#P x6LAJqΈ.UlQTkJ1됅fg#qeai3/tYJ*,0(HJ9GN&2[I?qY^fBҋ*RG/z݃){*{6VrfjBT|e+gצ2) 几?>.kٛeڌ7[.Xj9ip#W] " z&PEDXFFrKВ`==6[.P,OΝ4᳍kCWM8vПc>Rt lokckB` ?@8!s=8n:qΝ;\zp,--… 8$rFy'{~7ZFQ, Xu|14ktBf@a5mV0KΣ6b1V!|Թq[qڋ -PQ2u %zgϞ-w č [_0gaQU~l#x @ 0orh^\0NMb29뮻Gދ??Ԫ KKK8vΜ9 o~ЇZ,Q=CKAgq~-@k]BcEt q:[0U5J]Rk0t i$> >ׅu>;f $.55HdD/Pv],D/A^|HJ, cl `z`9tRV{YD8u60LRN 8z(zw~ۼgbX"LL:z'QՖ  Gafqq\B_K8t9b~~vVVVNh4JxK0H M_>\wuyy:63˳O)FZh05O<=[2'l۠i!щؠM'gL?Zd`Mo(eI`ru>LZ?Q`]t,ݼM B#Z\h fnPw%N3@(z\gpkD "lWNb< : ,.l־kLG#X&L- q/ڎBa0YZ¥u8;=)0bii+++8x ~cǎn˗Sz?L5\|Yb6pE|_DzW(Ie~_2G; SohJ!i>D)#|pYbx cY8|:[hqXMlT=PEdd:fgCf]eE 9#p-g]e`Y0 ]>V"DL  (˝ $HeyRDhVs^ )m4C24VPN>/0L {A8pD^!;o+ַg0moD}k{5  3<v>cyy+++8pwߍo~}F#loocuuΝCUU 8*O{߂ﺫ06`=HTHuLDH$~QG0$f D`e -@TQE#STu6n 5e>@@:ixIECR3Xd yTNAp$<(Z3|CQ ZŒH=MSIdY;v sss`p1L?—09,&[Bg׫1XCiaj@ᰇAy,..X\\L8uzۿBcF#lmmauuUU?㌀Q'`sscǎIAL>f-`ph|t9!h ?2v8\N%- zМsz?W re BS { ` JR&B5 u[ %y[;1 H2h!ZͷB(NevFpyb+-ir &IjEN4p.z`/]dw fWplTKhyLچ>x~K.lłSC (KRH m rE:gPn9d։1T͂bUcvf\$|3mscss) koU#A :TU3\Sr Ue0:N "7n~e#G駟N%bkk b:&0^){喛q뭷D0ŊS$68S:aXw$mAIϷ V'K$Y4!/M#>k¾"g<6Jԝ%5fe %`H,f`\+#- BCR+aXBII8啇8/@HL3̧L-#'Ο=SNa4awwWawܑ]UU\t4{up˗}<`0`00o <~J,I젪*XkQ(9N/~K8z0 =Åed rL2HY40yx~$%me ^QU TL-ni ۻ[GyJBji=CňdvKY='-q;9,Z9EnoP19E"uc*iגK.i RwJ}q"_ix簾N{q 7n 10S8Y} 4{/o{weCo<j=c:r0'Pi,aHA@nX8p>(>)_&I %+O| p=n$[NU(HCJt-8T:R@a} 6j:/۔6]̦p9f5./3O6SCL|OoZZG`Sa%R$[ U%' DIb)RJ%T|OE~i駟zaUfYA@c/e) =J/"|;s=@`QWUd{Ɨe>xQDuQx(g @V"ZcʔKQ"ۥD."؝|š'C ׫HLx-_2`0g2nA.1.Wq)xJրNN3pw$H?-S6**, Փo|WtPWq)td=;-7/yF\=Jn|?=oD71pk?_}!-6@lk@: ʢ]!;&="e p(aJY"P~=<>W~W/k@4-߀L&__'(;ʐsy]!b! +|%X4]tN5l[o[~Ne5 $^fDM;p~_@])0UPݔB#Oed&9}٩E 0gZ V6]5Bi(f\UK—^zvu?q}VY~# DT,. ,7?3n?qO2cZIv$|<8K-OB”U}j;sj} ˆ9%2C*YffP3g P*;0P%L ORyej6s,th8Q&3H2^h"u `/>̳R@9|}96*sߑxѻTnů,gYrNf 2 翄G#WIT sOQv>1L0TOus'@roׁ|q\$vOmw`fҤ5wuIӄ%"oVyÄTJVzj(DW#U"ĸY<О 6UxfL E /ܹ ǏG>V)UbHFN]3ep{>1ZXfe0]S^7M4 UOm79إ?T;:X]XSĺ;DZeL0/p.']=P6+1`:MT3(9z#oj 7$;rD^LHuu\G>]U(躸]H{&d|,[~2-?ioΟ?2Y@dP'Np=IgGSyCs+ݫG*)Z;Q΄kbX.i#ӈ?ר*#nw$ Zܑp -Aw\xda-PPJM pF 0ii -Z`6u;τsE>銠ep駟ŋNرctjwee܀Y?]LK jMEYgriZuj\ sRC^8&9LU-v#~#@:Yb;R+>|m-Pfp+[H\&18Q[#FJr7~3^T6'#5zilW(fxOOq̙VAc&Ь,c#|.R,?`/sGĉ/&| AKZKx^eT %׵,T ????k"X,`V >%;zKKK@`gcY67 &|Iq!"3WBuK;rL><%k  ȉv *|f`ލ-1<3F2YYέX(3\69|~q5v f 缦sC *;/.rpD4Wf .yԷNO&~)zn2ՌҘs_O;ħ>kS: RO368}u|od,iFg'OS>^D19JR嘂A~%wP^ON4~e\VdTDm&E)(!jA[1A8Y}%x&KDG)Iqf tr^xE;~&7OTv]nBMޕ,yY-SElᓟ$NJ("nVvۭah2}ma!.N]疠/̨?[3 l$ Yߞ4UrrEcTBida>}PEsN D@QRsYJ=;4KxDXtSLQ +m>.h "\|=ⓟd'ow]J<6~^52Ok-n&|?4m; eV/}+07|Lsj,&q~qjjx K]p[`ۡ0hR5i\R*~=n߭8q¬t5@BNcP.Ps 3ː9v[T so|5M,{= )h[ &H,iuACjk-{yΤNS8p?s?X6^YA Y}פ^גf#>1|+%8 I:.j.ФQpߚ4VLDd1Lhj}2'AϞ=^ݓgŧ?i<#]$0 T+kj$7O|Bq "XM-B&IKi:_.^FiY3uH4*"0p (6% KE6l|_Enʬ\caB-f#$.5{~Dl Seb 48QԊ5-֝A,~$R'Q)%w8%纋NHc <͙d2[VL b Jݯ_-;(pg?_|1Ƀ, `R%|2?y!a .۰tP3~=ĿB=Dr ~L/H>KsSf[k:XS J'X0][:3&PtPT!U/O;MH-v(u5 !/s Y8_k`m: MY/dSpܹ=O9|?C?ځq(ʏI 2 9gy/tbԅQ˲0J]$*BD BTZ:R;UBTtP2 Ys̛2:(έkft[9M"V"wh eMFZO@ Vixϵ^x)m~v_'|dl:na봗YyfPŇ~O?O=R.|2v_p뱸'MVY\fQn4L[FeڄR^Kl  'aR|iiЊ>D]`&@@쓨/w 4iN@^=S[-#rFc %]9j-ԗ $IAV 7*Zj3#b$/?ӎuފٟp8lx:Z7Va笍? +Ȕ~yyG/d++KyNٳO=}: Z.W "1iZPy 8TBS> #dz'ͤC$'سė_UC36|JB ]!A 4Ԣmg_jQbJP&\p&P[BEmy $ydpK %TJ5HT WԫaggwOUUiu],^䠮`r5@q/&̤Jq4x{ރ{7)UUJb_-Z|.\A%̢o`*1+~LzX|Xuk!P!2 bLF&?/.e *gс⸦3$Ş絀pЈA n "r@T8h˲*Y@3 W?IwY0DZYHʴDL2+벯j7u{G\6,绫wK裏_TZr4ᨆ񄪪T>[[[7?=n cIP{Fdȃw&t g P6,ڿ^('D},'Kt~aCphOQxANL+=b)jdnd!R&_,Q[?Mopu 9sc4?8p@Z o4֯щ6 W0+ 5>/IG4$@l΢ ˯X.|$Nr2]L'8}sZM8J!̔ S[ô3v X*K2bvl |Kyƅ KqZjGTUvI>DAs72+ +UVHY/jxh<>OxG+]oo~"u:⮻菦n/bNܮ}/~2~uK,`:[D G8??, nRq%< !S'Jc S.Ao~k-l0 7+y1k^V ;TbĆ-ۀ8/L簨g|PU~l&x\6  MqGY gwSܣ)Du>}:䏟g"LAbT14WUߙ \xZpӁ.yUK:?9hR18,QZI&&DrKQ8K dfߔȶQVqSY{~~KKK3E8JJ9q,hqTjp8?W^y%":W+\;y?~姁S}_lmP̀cyBq̀#8vag! n,8<탞BVI")jQKMɋ+R a`cr[/dK!B3Xet:_W2]j̿߉R`/,J^ߏG18tPʎ@Y 2`2^t2Ii/:=/y*b1$=pޅҏ3aOѠaXȂG<' 74Rt&v*#l+چ 7yШ0Cd ID1("G^T9pk7ҩ'M7>caaa&_{eWc] #^ "}eeo{0S8x >E ֌,00[;{WzPi9+̞$) l/@AB*d#b[Y38d wثY&|@knĄf &D5A`BSem"RQ0(+fC9HyfZRLD8&IpM7o}_ {#;{e!sSbaaG á2&1t0Opԯ2UcY-{RuÌ$nDuj݁ {I(.m7x s0د(tXt?1mv1MVR%O3)(M4pIQKZU/D*OLZoB 81κ^+6a։0B8ND|R:www1LR0cD|W= ow3@ҬaWV"'NĉFI)9r @ 09{k! KgGcjAӥlyZTi°wBXw,A45Y6!}E0$;4_+{jE:}̤MA<֭˪/Z]6 ĜL#~U,"Ҵf:Ŵi4SKXumomҥ8߿';f]X@y_ l3 R-y zWr P xo pcQ-4q!;p07Cu| `77N3Sߗm2?%LKlC`őViS{ąfw:+ϿH ,XY[]SOpXn7pÞ_ƦN}qĉt777f| ]XYMp%S.}Xk +uqp5ĵFefK(dفNAK@}x0;IXzm@޸B^0gsF,#oYVufK eFvKԅˋ@r^)mNkyG>|+++-;VI'NH@;;;X]]M4:zY@;6h;n)"#Hs޷`qn SLٕպ!:a#S RZ\CN_u8̞[N|;x.XQL\bۙ$ݟph&?mlni:OԻV\J,b]+KY9`u]J:SIϝQR@Ӧ6׈ Z\ChE9pIb)j|(i3ŗd! (UrXZu!+ا(h}U^z6=P#, IBJ_tċZЃA]W APp,uta [[[X[[CWC@{m-(@ww<:_)sy\BBS D 1J61Hn071Ŀz#+k6Jˍ+"ʊvww4MSuIw2L&k37?R4*#ՃNl2NMj#tM*Z$]CyTFBP k"i.{p`Z܈ԙSB & 8 U.0NM2R|,#_׉3*73]5fN|T3by@خRf`w rٓ)7!p+ e9h5y1*dMd堥vAJ_a=.}%G$fA9O,Wҵڃg[2DvC9p@u0mc[OƽnƏ  Qb2 ~0)rV CgN?m1Jˬ ejQu8%j, D0~Q/O)NU~v$R@vqB;g9]Bfz ?v^0!C7٨ cn1!kzg<0`w ߸ iHUD6T9ŕܪ71؟e;NC.xq ˛uJenTi1kRf('@|dXF z{ /j*(daHJTB^ "T 0|2 ĈC)e1@y;Q lk^Q>!q,XUUUKpC^n{ҡ/$ M1$46 @$LE;m.3]W ]Z6kW M_nRY_E䉏4k97bVWkbQ2 63_3)(ȓLU$K*U% ]##L3i+FJly1H(eWbXA(o?N)0Di&6 E?֯AR]HQ# F_֢Om0) Z_֜^AkwmRD z87@=)ɝX uYqB0pQ;heZm0 6 gQD-[C菷g]X .; \og(7dLoXouZ';%߬)2"GXhDs;.b[9~fV)lY6r}3;Pe' %dxM0S1>ϾTSWZ.m0dgh6Y>y,S&NC=%oP' 2^ N1@lY$ B &ރ"! Hjd'r@(Yuc*2Rt fOŽZpz񿪪18w֒e 'N3 -%٤QcY:{#ucS@$˗/o;TUxUuk=`<˸x R<ヿ+}"1䦔.d=}ݢ稒$炙'S*ل NDp.Ůp趛<.Y*7M@I'sld_q`!Q2K;=LpI&-,{2݋Ds0BN,1[_KW)%!˥ͩLM!Z{pIͿM mc<??娵Xksssp7bkk $eD!MS݉a .XBi?eY9:n9gIllkZ_qdG7@*P% Cx%8p)YU^5.TR͜ BA~]4 t df$4^ݥ "(o0q]Y'~Ou> >o]f;I$PN]+a*05R [y#7pнS_ &h` ΃Xxu7r8wΟn "׀ͬVd͒N,XgX0;CƻX[[vvw0  i%@K#ї!f ̌+QU99N ȃh[)"Qt:Db: s\R-zIB_ ?$6xH&2v Onɒ>qؚ19K6s Wr !{|bxi/}f"(:[2^Ž+W/dqvwwc RaGvϢʀ}~@YdYwuLS^nz-o"cnV7NW-?\Yo`ڰRl@7hxz>P}5VVS%+Z)^ʩ+E%ظNƥW]U4qGAE\X!=lJoY( nI"$ݴɕi914M("ݤXlWR?//`* d#DvΣq/^B3`eex">㻿q 7U?_WrN\kث/?x96@\7VxCA\XS\cuڶcbõ|{a04s[:|si"-IZߣK#/=JH^j:آH~x᩸``Pt+q ZC~ kʞZ` K7(''rS&!tM3݁JB˓Zړ|27e5L048: p , $gY7!!73x !ʀjSEzTL;ϣ Էc:w^L>R^rLLjo" %<o ="Xt\(eۋ![3O<pR&e n{yk/'()h1ä(Zb1+bJޞa R$!Y#&|"DdyE755 by v Tfư?`1dz9/xceٳg?|#[gڃ뱗0b: #7}P x c7AնxXe BRHUjԗ1~37vd•AjLlΚ+/Oe6c, An vcS8_FD 0 {^u.Kl) ! 3I 7adVC00Ҩsbb:$x.+(LR;\zӴjPU=io8 X6؝84Lٖ}3i')#b),I_>mhUU%썡ܚO$yJD1$ɇŸd#(>xzL3 H2=F<`pC13w/ p_w9=-J7^~MS4)zORq~ 8?>O}Lr,#nt `A ;)U虗AadI ޼'9sKT"l bJ! 6mLmC(pS 26 (3sm|^=sm\x$xmi^0PP 6qEy0EMq6m-1L_iJKqi$z'aۧЛ_&pP97ZLv.C7}{k">N>>O{A kVЏ ,e2jvڼ@/9rW£@pUkw1^@>NQ'@h2% v t.e(Qa„`LS$^Qر y@S߂w} ?暽QHڮX-(96H r iFI)VLCk;)栧ƘSi$ͷ[_%.#$(b`@59F՛{K!7դio3ϴ6짗]r[WK$ʮ6ͯ7~0|=7Sm:1JCPꅯ{:|U+d&U[{(<>{k 3y)D"%"ɲ۲ȑ㴻[?__Wgv;d˚lKd("A 3 (Tjus?[ZPBս眽70dHdQ Y[y7w _GRhƆ:xZ7ΡdGژL dzcy~C7[wXX݉!ʮkvF;9f 0-sLk?d8t8TBa8Z '@s)-.MM@l16]~ZRMz=(pY^ybPm'_y;!;y.Gm&-UUXאsrxBI566$|fHChY1f֡YqHǎؑ)%NHc!(OPA $Ga[1_-TJcz'r3㻓+M}w:28 qvuXN0G{fA ۘj=z } o"(7T\.L&1bo77 BჰU5&bΩus;ld 쁻ɟޜpR'DaTdZywc(:^KлXkDwp%,t_#\xϞSJ}Vg",#`Kb}Rx~jm-U\O,.2^tt{N^#HQ .3)Z)2 D{٠3d@GnS_›OA*|9>>8߉;p9јUx)$i|?ZM -P8DJtyT p=J+.1}[$aDr4,#EimM=U$`Ua hC~m}z"rMXZZii mHBl9 J aT%k1ۜ`vH\Ζp9J@9$rB AZou7[8;mމ1٠J80+` n1tő|#QQj=~ %xx55xǿӿBlaL }lcO^9HȠ0}[U7r'F0Il)‘O_DXӬ9|֞ QBy*; d)s(Аip`EޅG߃v8yfM&cӏ(*Ae")7bJnc m jQVfKO^Νy#~?~R%"TO:yNj?>MUQ B`eRmٟ> IHȃZhLWho4ˍ]4`r&yHI_뮧̵qjO0$ܲɌ]=p u j):GT, B9$ʍlNid2W[‘Id=sB1w*Z (C0[ f, ]x*L`!k,.=s+1? fC=|MlTN2t7>Mr?VRt &}f|(s )+Wk{dcKŸ^#: '-%9RZI:@-'Ù&OdYnfan= ެQZRVCt[ :{QL8 #C6dX}v"vR\# Y\U|q*T({ }$B̙3]qmV6w:';yc?s3?@d%cQ Or_ة/& o 5{8{ !f]9uv4adFmC;{s0\Hi6 7.'aJvb/㑇6|8ťwdD΢ߟ鰱JNU]J wՖN)D_ @Drp|^bT9Xy>;2)W96ķt5@L53 5!+U[gzUIn&;v _;;hۨzM`oҸO}mSum+CֱnwZz4 tt@`GZőIL{7YgE֌1Ch-'jUɖz$[9KL Emy&QŵWqg>H+ ~`9WUH2)Pم};AF)]Mu_!GjHtfC2a^'|I)A@ F[x~=\LX/"qȑ^J"ʮkD;wj?}N|im'{o w>xě \jkUaS =&s8-s ;aRXH:<%؏&` {!BL^̀ukGFFTaIGI)[x~[=:uDŵV uRS9D{ƒ L =b=$'[G4P|UZSʤ&ڌʴ-KTiK%2t vPh <}t Gz4,KIWR5["fv>)yci'l|Ӏȣp6Pރ>%1& >##<_XMvui7G WFjz~wk֠U ;ud0i] neCcږ:F/d]PƩj@A PP 9^.i8 b3=}b ("rZGvRQˍY=܃('^l/o|W4O6!^UU'ǎa#׃v626SD0U f?É1_[dYVű֐BvyHܫȜW j6Yk7(3ʁFٙǣ?/?. _k؃Rɲ3'Ex ی">3T$qЎ *o fya5?Bb84b0\a l5"."1=5iet:Hvh'Im( t«&ڦ8Rec 5GyJ춞sځ)}3ߏU15 V2(,MRaڃ paaŤ9|cԔ??N-NwMM۱,3ॗ^F097priB+m4qJW:wZan|g܇<57H 7鄣bo‰yd‰\E*GXU(5O'{ ͏c1?ҍ@ Wr0tcGnknB=([ϸHI pDNxȱC7 3ɆO=? ۴wAٳ3c&;qvN2??apygϼ{nw`n1g Ƨ9+5}_k7x?=AwNIXLcƏ sT5Lc Pj0PB,CAUTJIJclŌyv_!Y(%y%P j7@yk8}mn1 h(r)t7$ K[+c' a7A !Z:bxQUx|<`LxO1&7SdS @kA~ ϯ^» N'YCw/- 8z(*lNjieԏC@X Q7"TC`4 pF6 @d^tshS]8c7cs&dۖE\Qhe`Z_E9NZnHωw9Yg讙'F& =(+_83e^`BeVo2,hJM0@ 8pc%VKm<އII\ g<rb~qHkXZZٳgpc@RJ;@UCʗ,G@9F0AGYG<.,RqhS\.P?VJA;'[!(UVEN6?#@p2_HL{f\)h)xL;8xC׃ Zum07\l5 7] ʼn1;Ht MH{ӄ 1˖;hv}N7*7D@Z</nYॷV_^^ŋeO3k03B`0K w; !g چl:^L6ڦeǠrhA!a4$ nq۷,G T]FQ, 6}(v}.)ؑNoZUuJKӸu-YWefH㦛oA{{>t]xn=L>  Cu ~Ⱦ7ސ b<(u ! _iT @KoA]_1tW WD\FT!2DULr <{wܷw*:L1T|PfuJ)̵oxȎU7?1J`FO-!Ti92'hDr'P~5 YWPȐ;n ǾKh%Zy+/Lk\ C:79l..&ٴ2rv=Օe\ZY : &?0l}'27v"YMK'iZw"l݁H|Y% 1ZN !XD6UP^w|gmbU0/F4M8$r܀Pflcc=Ɖ5-I1aW/G8jҘ}cR\6pͯ"f/d YJrHW:wcOAߌ%dUAdQU ΓQOΞw`YCZ3g Tں24)H/'M[x~ ݑBw}k&61H"f4v0eR9!9qU\L~Zz v H9`gO&uzln 0B nYWZMb%q leDpe-?vV'4Tk+Jl~UДkz'fC򲴾ƺKf$MPLvEtر[uµKҰ,ZЪDxFIvl4$'E9sۿkl* wFM*`^fsV$$9pc#Ykʇ CU[ ԰Abg1 Mp;hI/@?̜) rͳgq[k~Z!\ \M+8 -z2_~I{ke}PUiX~*oN}Q(`H4#C9t[3LD <%7%D) m{8($K^G L@Vqs( w:>{j8ː1Ȧ릑/Nr<4a $IE߽bOumnm!wWDy v IʰU Rb[Ł6I'MZwr! \O`wJ)c2%ǨMl{dsO.~xI݅G{85 | L۔KV't0j,Q&@xеfԶ2S:coPo;n+6T+ר$ ?κ0 k0Kgv1Q!S7O/WBȦ5 ſG[ 9*,FN _ `5.#M|4P)詬.f[myn_5 8jŘm32.M흹n$LPi|q4vdO.0*%ӣwc`B q!- lUFe# ,P~n:mwE83dH q'kڸٙl x9*#|++`mcI0OuYPlO|h'޴X}W5t s]4^Mw^{ iO> X0d\}c06x`K (v(8*oZ9XUz..>J6,1]3scI%!!Ikў禍P~U ?\ߍo^L QAWdƁ Wsj^0P. +c~YZT/ݏ76f!3,hw޶st) cv|V C C 3sb'sfuA3RJ(Xk1U7JJBA)h)k?G(Ξ;} TצEi~L̀Y`\KW0Y{,U$)t* dy)Ƣ>n67b'dm/r׬S  kP*r( &LIVͅ)oN~:Ï6g{qq8ˏD&$*6"v1& HojIZs"dio 8z(D14,o|-[vs LpT"A! q[sTDBJESQz!NBnCg8Z3h֐4w2Z2HSGAWz~ti76@kٙiLu:hZY&9m5c.I 9g4ShK6L o>?v _ x)U/W-y4dKHa*$!d^f+dye&!YZҩPW[z,d/B@)Fm+D]x~U@;ˁ ;H Ʉ3@t@+xQkL,Zkh(SG.EgS.(dr!#+ (;掠9:肺Y{ sk/b6:-"YDC;L6zkUM8:WÚ؏0;;N>'đ"ʠCSmMRzmAeA'i^RC6 yl[$Aw PWvr4"*B2Sxccq&ɝf9,Gj(rdyVvWȲ>AKCFt#do >sp4ˤ7ܑy| ڑb_6@WR6"-WS\j翦";e3)PY7HV~n m3;5w+> u^1;<iOcՀDT0qnEf%oEx_߸^eԔ-30RԣR2517HBc_ºX-qu&CLs|Z& >$J°$*3NaiBa<ϑ,0}Qv00@f7 YT2˼G$ Մ[SuPFe^*lq8L$!u N3b >qwmtq'O k LO`3{U'VXҼYV-z4ydAnIyىS"Ȣ>) =ߛ퍀2)TX>11vo rv#Pųf;hٍYزߔ2A%g1{r9b-$0s)|-۶x8K8k"p޿CJT 5PV4'RI 㙵iilZ[9,V(* "/ -9QS߶Q+ l% ,ǟ, XXQZ:!=D])퐄ֵa2`YyjHAusJfHN&`Ta8Z_U *4ь-B6ɺ,jl5ԑYkegŸ$H桶\r 6וuXj;X¥A+A!=H3j]bu:ő@a*KaO(M֍5̵`h2ei͔PP*MEGg2# u/yi_ƭ|h YKcrFSxuc 6:q {޾BaV@hyP/' 0ߙud I K5T e#$"p T7}-bo,GƊR(KZWߔwΦwO}}}'6pk\Q#(X"X Jc$ѰfoUAնgMS1II*M8H&A"g;נ(}ZDSuLƁr  ȭ._ElJI5 P9ԻCP/-mOLdZEI9ZT 2]RA┕_ -J29׍R}Ri{w`=:ioٍ8u`su3a:Z.2jc,cfAbw >CQ?f)m^pB@Z~k 0QXgk J2F ̔O9G`MP#FTJLj&A+{=TQ (]6jVV T_ܱ840+*CUצ̯+(0;^}Pμ%r?]9ppp_cdN5^9r(y2S )[Y3KS%A-?0 GǛSB- \l,3Y!c쪵o\d/=JXR5$’e&Sbc0rYKڎψ ) )@1-P,7 ݸȈw–'S[WQWM4XUpF'Sr532)!ƁmFZ Z`D 󰇀.W+/^Ο>O1$|O (+1 0&)致 (ZS6ζPTr݀/H]Y s<2 /`GS?d%fFp%@(3$^N 6V8n'mzrMht Fjb.cj:KwnZG4̐BQjw07[,}kٻO-dic9:vaEߟA{¸4EU BuslW:vl0UUcPVa@HوzPQCN 1 tb~n[x+R/ iܪRQ(H&!3gw,cN֙ǫ iP e9>$Bk{1NIP#RD>KHKqo[&F?.3+˻`";90MLN`$sL2kdcR8p2M@PA DL. =Vڧt6G> J$@*$UUAĬ M|(q50ϖ&uXH)ɷ.d7=ZH+? # YKc yBbr(fj"[>4: 5+۩3<ӿs76ӿ.?ߪXY=&ߴɡ2.,s+(Y aU؄TupJ(tDkL7!ҀBа-8cc هǗ;+3IMN_?N+'ly/" bf d*ż~G[ ?߇@#hx0kT[/N]Ɛ9`ks&#"W!0 APg$L<ۉ\NPMD*Akhkmu+ #j`@*H{FBP)8fo8@@paiXɈlTzE몜2\ !vq`;$!^|uHif0u]+lv BUWrX @1j=U–ʆP[[m,9:*~n&guH,}bOzÆXۓJ |{/J [ڃi Jޮ6V9"sA)-l 20ȤJYv#/lb蓂,@ ތ2SٞΙlq"7i3﷛l7aʫYkK6cJ W=ƹZB $[f#llm5 SQR6 .467q1l]dY+ ;nc@F'S4~ ! FCY՚}5غ*m?02:B9kԪ6Ȫzȫ݄98! nB䦠 Z( ۗc3%L17* P$CB'.kQ9IE?!]۟g$kf̀N >S][P5Vi,NEn HBB]k[m'RXY۟eubL[l9rR5@j)2c l/`衬?;*83H+UAX֮@$P\6:t{aYEr3ѡV P8gFB2紑bkmAdk5B`fjuOvxG`y@╣{߇Q9 MA !!Fؾᰏ* 4H)je^2|m wM̬@җ2,$*"YpmN̦EN gY(oge,--K0 p]OZ/NX OBBdXo} }2r`Ojw-`\VCTu)$Ќ 8oU.Zʜ *.3LBr($iPK6, H=+1Eeo;Y#҃NdHf`mj5$cPU/I6 FV uUAf9:z>DޫـcZH]Ъ24Di7kWg@$Rw}n+qZ Sa .8ȟlMjܘjVo,pfgq`~up@+ː V2˓ѭz8ɓgp Һ@O\[nqpLXz߅{ 9y V KP-j+&f-< 'M7{-l ڄvw ~ϔueBHZB gV|aNJ:=jQ0qE%(=SKJp"A&> d]aAUXܵ5CqcK+KxɼT+! 'qO0' ҚOH+wm}ʜDx#Q~jjd%YpsF~ZC9RkƑR*Ȥb 27U+"3cIz"3C.2SI mem욛Zo;SΡ֌vvN #G vS6U =Mz BImmcVAsgOchg?K=ŗ^G!D1oV@5AB̎P5 3PIs~vݙ$)gYr?2gt,VVz1Tm/fk7fhҡehdbd"Vƺ!0 a<kt:T!0tPKFˈ0D"3\d5̔r,Gdar@@ն=CFSSӐҗR% ƛ3Նi6 XwE$RL,䠽ȍl٪ŐujUt{ ¨zVkdO%gl+0B)&kI8T6Vcu} j)3Ls"/,F$8uҼO)2cE.KxP !ޑ)(̅9y5z~꓿}1羋V‘ө645l=wAsjA,Vc,gJNniDBF x?_qnL j81 =Ge_ id>JG#}pT2{S 3XUɠ"쁣6a:(?Iel#DٷH:NkOusgAu'>Q{F=fd zG#=3d6=hb0P0RoMb%kJj6& =V啵?}0o[Ƨ9XZ2'8uem*{m #(2$Y,/ǵݲ5~W~/|kh F0ZӟxeU㉧é1;u-^@k-%:V&D<=K[/~ {æ$#?ND+.)?Ͱ#@|)bƞ~lCCY3XQ;ɬWZqb*9@_yo_` T'9q4ٙދյw0q׻ꗿ\ t1id?z/cu%A͉V~.dfw<*}#z"W[ h9Jl H3B|  ̞ 5N8ozAVS: ZGϖSPs:u2X,pd!mm[`#ե!06VKYbX6vk:!Js4ol_[\wM2MEƒȁXFJOvDU>^vnDكRFS0`6Ցym~,,JX#hyz`ƙV&"Ka'IIQO>-(Q`c}N u =@I./sXѱXIWGBJAL"h*PDž&daPPo%67Oacg hD9bq }v|\XE\8 B6*g0$> ̢K&OtY2E7шYxn*eyŢ# Z}=lR#072m\8\kPQ"1 +`|~qZ 9zCGx:_{FZ CbeMMMBxVdV~or %\}&Ix|PyBz$QV{“/8 :"9.t}Ÿ"YPP݁` ␖79L1X[(7&C R!TX!Z]U( ׿co<"Kb#E_£}._+lu{d0%}?QY㙧qa"v`yyAus(~/} g~ _ xÏoTgʔjP(W͒gruwz!(8$ڂ_O$DCG@$ph,? ,y^g)InHDoN!mUO9p"yI|䱟 i<: }˚ԌLFG3q7+w q"Hڮo(ɘ;D1;UJkH{j ok=t׷ Xdn(l7aD-<4Zn;‡~#.+_*zbaԠ8Xט^8MX6a?WQ?t!"I:ВSغӗ^ÛO㎛oĻnp?s(Ȑifq|@3rel 9r0Xk(76r#Y! JۀL6h2~%3.k$`gm $#{ꫤMKKdv<#S ZMa8l0eY7 k"3g 4W8ť Ro7{^dE9s'gl!BJv\_6s SDu5B]W !O"(ؙ38v"=u{veUAյq*.Aܯchr6(jg1ΖAI.3Ds6F]hKxx8qvjTL;$|tT䯐ZMcB ϡ3u?^+/.^ݽxsvzI8_ -IܑxCDBI20AXV\a*/0;;3m13;Nev4r 0 h)\1d*̂R>0IN+ 3il G "fMw:账1kQV Gn~u< ):魝Ab#ۏ{aPb%FάՆx11<6› U)K \MWJ{lAZ54ڸp]w}u1߈}&DeU)G\f hHatU= hu dH.Q LrPVehAVַx~60j@֑R[\R^dD;C5rY@t1z\3S!;x ZvGj$IkJ7q^Z/rRLu  u;;atmx15C]4@UC JF{24V]By/yhMϠ5;5(jqG"ʺ:CMA Qnl? 4ϢF0aU5@:#vzXeݨB](ۚޖUBv#va $PWVzvxګGQ.RjۆhOfwrӋjhC2h#ҌG Q +Fۂ+k.K)Q3CU_Ȼ9 pbb(Kˢފ߆74zf_׌Ŀ,2% Esձ07"N 7^)RFf.g6sS@+7tK( ŨFai6RژD9p(=7 97.|+LoC= ,P FW둋'"?듌 YK5//Uo']R #tAl@=Q*֩mS ?<[ydHCSqsk0gЬ0UE@CqVm6ᨄ@Yh+vX( L*0*`@&@̢wsRyD@KN]'u$F im٢z=Б k7Iyq5>1D h^ŵNH83+Dws̏NJp=hTb4XTؤ9my /!D+38CXanDqwBko+48yXX@]@4cZ ngX}$,\GnQv4-~@*T@!wFmϜ jqlKg?PlBLCҿW P㤬شiE@X(EIhR&J!"^.QbLdgd’aו|+=-6ٸ WcΧK3 ׇQUU.v <ŀ>t5jFjH 0JTJ@df l8揠rzToEN!0EG@𱧶,̴"c'hD5Qa4Bx|1 }I-F 186kǜԙ[!mz23/׆kv ZeG$ lp@ dTm*S#Fp*7(@$GΤ#v@ _X؎'ÑP}jh:MI5O~'F ݗJ!N[舭ߤ1/--8IA$(JY\4ژ8 2U[lAJȠG`1w^P0g?zK vR_[v+0 n~jTߥKx|)ӢQ_>A1Mj۬}6<:;SgCu~K`H~V{ b@!U[Ab^ t;dυ{i C1En{Qu7(fݏ7AL4U&+NiM\~>< &,zmp$?0Fֈ600IWrF硕eGB$1"2ߍ6yЭo[]wgęA֐#)R,ngqPp| 7p{0{/}+gm  ^J*8ޑD J8TyEɘy(kW#}"xiٿ\sH4ųBu HlzuN{ 灷*$.U:1Iڋ 5Z3c=m DFdQL!oϠm(k#GT Q\!oϢn˞  ;4Ea ڷo/ƿh)x&&3w}株pꮀU6Xd'waAڿnc3> ٽX_~a=co U|R?B)?S]]c(9}`JX %v%vB~,y:ޔ"ԗ#80r)BLFY xQE(]c Ŝu&?$rI!((mq#3ozo>aV?xOcP۽JG~WO"Dg+/⁏}쯠WV}aMXa||{nKNl֡1>l> x߽ (k^x^[/o/1G)<.2dW'2ރڹMƹ F+ƱCA+8ryۗ,4ʖ_ 57JvÄH1R̙%SBK^ D܎1O:9F8x1V K1֥#^DcpGWըZk$.{V)Uʫ,<ُ i?2-yz+(Μ]!OGyw}nKIT@.>ANc~cXx|C8|pۃ KKx-7CpY[n_'gt|ċ5c-7cXN9]鿫 ȝ4lN4kd+3 :y5>#ūO}\R>'F&jKWK@u 9-y9#. dGA(<^a%;:x¦ S$,@GUPc cFdt{x-5'ޢQlm5S3Zjù7Ż>46Ν9_b} '/o[x_үᶛo'NoEwq_WGxџ^,_Zp׻?1llm+Ab7a|k~+v<( 3ȩy9 4|SIow :677{wau׺`embwf5N 4>H<>)h<@dߞH2D*EY:5gaf^ИӘUd#*}3E @RoL=4-4A}&ӋaUӄ$Kjf 2¾GQ){bffߏCصk7$~ cϞv-]Xط{B+ؽk o75ϏO OO/ɄZ(s=Y&w.A?W1{Ξ|&+{bIտ::O@3ΎW$x)83}5a^OdM~4~HJ鷽ܨ'Wg4q|jW4&Pc`l ab\#&@l bG_ ^|%l^Z“{oϾÇs㖛ns?m߁'?߃ x ^xy0Ib9T Ȧvx ¾4ŌX5ikW&c]d?&L8E[{5fcŸ':5z:Ah_ 8įOz bq7anUa iGW48wc?w'^ {3OiOdH̫/.!$T]{,DU]|6gK@2oAוG}Y>nLlDEσGV%tEXtdate:create2020-05-17T22:00:42+00:00ڮK%tEXtdate:modify2020-05-17T22:00:42+00:00IENDB`CPU-X-5.0.3/data/icons/CPU-X_32x32.png000066400000000000000000000050641454622605200166150ustar00rootroot00000000000000PNG  IHDR szzgAMA a cHRMz&u0`:pQ<bKGD pHYsHHFk> 6IDATXUm\Uyݵwح7&fhd4@*!;j J@jLQ'[&qqqz_gv^9|wf#sg{sy~7מl/c0U0Dr1Xf9?D(6&gpsvעVs7|qw #I7o=\_a.f 04eeqOZGiQ ;\!m29>Ʒ_<Ư=J)h33ɲ4MًH* W\a}?~;P5А9Y!'3:-JD;3AO0 " ʵqw?I^}UnܸA$?|=y7*fJehYaY6|bmH)(yG/r ^8A'fuu@K@ CY"D8ٱv\RԪ:`v)3>>A0 瞣ltCR:s8o1Om" PUD, A۷?c._:GWU5%hؖxAX/=wDY[Xu 0 Cȳ5.W戻X^[n7f}"wHF vkiUqmv{}S뿟M!^@LYV]-[IqqA[Fdf]_^|K3i ]ڵ tJ:+TUh ~2Z-8vLO}{g=Ο?;-s頁ՠ0xy 1s.z8ٱALNNrWyWx78p_8|qsdmZa«/4 BdY /ӧ9<Y'pzmp"m ү=SѣGVTU$!I(b||9>CΞ{,jð4p||ĶܧnXرc j5(bnn)}67 R0Є GbK`n޼E$ Y"%2s,--9!1ՒS-Křb~) wi;e` ޭ4nF;TJmVԣTP: +f #7?Oerr<nYm^<ģ<3Qoc6QΑeo)[{22Jdh3OO?n!Inf/xv<"ݶa;L5Z;]#z`7%b ̄$2Ҁ kkk\t[gm*̐fW)_ "Co?RTs\1RZb\#SW>⭷wK~r<&oB.rL6fb/nC',"ĐЃPu7ϯ~DyZ,shhNa9ӤjV*Ua8P tY[Ow# <C)߳A=Z%dvܵqNYC@+&-JR@{tFfom ] L~jR~N_'k8' yВ 8"Aea W;ѝϐ&Ly|'8'EpBαqo'v1Fԡ7x84%DQ;G\qs5wΐuS f{(ʳ#;'ix"geℨA"2'U+qY~x?15(lFG1`0&EMN/_'-Ί>!GKou&c-<)!R[-4Ar4(jL2@%|DPIӌVF6}-rq4x˿Ovgx[V9:Up±a8V,(Sαrc>O~ Z˕%tEXtdate:create2020-05-17T22:00:42+00:00ڮK%tEXtdate:modify2020-05-17T22:00:42+00:00IENDB`CPU-X-5.0.3/data/icons/CPU-X_36x36.png000066400000000000000000000060311454622605200166200ustar00rootroot00000000000000PNG  IHDR$$gAMA a cHRMz&u0`:pQ<bKGD pHYsHHFk> IDATX][l\y3].%ry%dvŖ Kv/,E> /m})y("@RC m]QbIzGŢDI${=g9 ݳ3oY}oɣ34 ĴkAR  hL t/RA!^9 74pR!055'4XA/BcL|vworZF:2؄ޡQBFT6ָddh_9*34(eрMBX$-T(B# kBeQ}zF,(,&nbE+XЬUp?sy:Ŧ6y$<_|j c,1 ˯}c_9HOO/QaE)Ab/Z5HXN kZzyZm:<̅nk&C{6@EUk5j5E>D\aiEc֒8nRl?= !-(1n5JAZm| )NljwriJ{ b-$c$&!E(Bhܹ˭[%VF[.JDPZ5[v?{܎*ݠ '6$Z:O&@+`W:Қ Z;9 ?X ݉m:bDmC{aqq=c=tvQuAtxL"RvZO4aF)m^ytbaبmM1Y`QJ-Tskxo?ZfXy<h86Z5Ṗm'JV@q$U]vh1(?dre{Y\ZZg:0Vޘo#ã}!]X7n3K)) |15>?Fۜ{O'N1η29sZ(:dߦgi2-/z u*… GCw|r|KKۿ_:x{6!8s3~ۊ^%EΝ;ǻ'O20O@Aɓ'9}4 w3Ş ((e:a&N1#6XI XZq3gϲkn~m<}}}1<<֚i{=(JQ7:PZ}CJ(j m ^a~wԩS   |k-otuu?TyS3q DDF:FX4M^x3J \.GEE>4KKK\vz;][iФo8).ˬ9tȅt (uNk tHDiOnߥe%c*[OI 0^\Wè3z Xu(Lk`>}]ίQ 8+V̐);#(on6s8P ivf#lMPuw z&$"q2o慠5 YXam!BhҚaw9yiPQaLwf5CKr9nJO<솸KTjQORuRm] ۺ cK{JsEb\A:NkoG'6!vc0*3E=؅Z32rwA:$`[`norS>BMlooD!l161-u\.pרKkg6ke}AOQVG'[ p)̧!Z aaw"RI ngEUVEϮ095No "Р,q/ ] sk+N/Lgglckwp Q~&qI$`b\ 7Uv6WHH${((gW7{OmP9>TkW|P)>w_z{:wtwMs 10yG7>Hs%tEXtdate:create2020-05-17T22:00:42+00:00ڮK%tEXtdate:modify2020-05-17T22:00:42+00:00IENDB`CPU-X-5.0.3/data/icons/CPU-X_384x384.png000066400000000000000000005014051454622605200170010ustar00rootroot00000000000000PNG  IHDRǵgAMA a cHRMz&u0`:pQ<bKGDIDATxieq~9M9Ueͨ @aI8 BDIEJ4e%I\Kݽ۽lT˭ڦ-і-eI(I$fb Pj̗޻رVb%*3{{ןWx /p}*_uf3#P@ i93C `D`>Dfs(w_ä ~j=zx1y/Dz1-^&h֋n~X".}[~o!ݛ˵G^%S>VYj^9kg".9Yپ$yGqA>זo _Dmv 9?#u?-|Lɝg9iӞ04>SR=--Ǡ1/7߉^//>p3o{,v! 69~NKK=58quNOg._M{ˋ3A|n,!ԇt֛-7ͳ?Ͱ}_~zcAK"`U# pm4rn vN)Ś'p.~pyHQ0]`pNr8m9Inn&%uw6?32To,(sC M+>z;v?*7) B ()qT=ʍg?$]s}nsʃ\9뒚B(pv=:"ԟeWEn|y [~n2;.:U^;n79??{wCMVHvI|9e3G1*_5s2r)CxW zBABs1zX#A8D)85Iʒ3ϔO`)U"b~}!  3@*ݡTwNO|mqA,Pv@B,glwS>Q[4%.ql;Dp^8@\+d\(+! 3nsoMmCs=CMu7vG rx o9 a/%&e/hݯEj17ڵc-wM-8y>wI}GP.nmv)ITO Fvm ,gS*~=Wn~t&P}7"gu/ΞG/7-ގ_)ϣ$z5.Bvf`: ΃zNnH`2B_jWbhaU<+$Jא$q}L:Dhh rl.5UZ}?&6ҤMs 9rAؿpwr&Aw58A<ס;u T>gq<! v둛6mguj PϹn^R\c+{IJz緜ck_ EW Dxݜ[&M3vd:xJH`:H(+&r#bV^P7Exߙ[WH݊_<~+x\8D#^Ʒ]N\_'1(efY7fy0,A%g0lSdBD3(k@VvcZfXn.rǩB18Pk"nK/IPtL=w| ؝?fG< +\p7ȵӊN^C9/rA}]CϿoN~Ma9 9 tP. ]rǥ!/pgBm(]%L3(Fpbw7zU1|$Bc%U3}q­-:A AaY-1`oXo>'a8 !^J$tr m6'幫BsS6S+Y=߉3{K˛?KyQBFŧJU79Vj˫A8\(؝fE:\i8Bd8Ir4qd!DKM!y {jBVwjYRUV'.^P?5cp9:Ld#MgI,cddh``- tpc99`Vb 0XjIzϮjGmCsKݳ*׉%I{w %{#~pS`"%~ Yy Y+ʨ;+) ea@(֬ ;Q,Q :\} kbvxݠA= ZytYb gqEu9Z܁@<*Pbqh=_k|w~ېבhݼR=̚'aw{xbokS13ʢ^Ns9r GYA [(]Q>%ֆPބц2 ]g=@b$pn8BаA3r 得5pr.irɳ0J"89K91Fe^ Ƨ3qi.L$=ZHw\rı\w6d)$jDm rt_K R-y#dLTX>&=U e)nȮ_ւAA +@QVnM <(}_r#th=eTj R vv BZ1Hᕾȵ w ;t$6ι^ch;ɑsSeVu߆<З?Έ/^ě]rx_gzC>%𼮴OA5g4]+4Q߀U$<~*}/6X@~0[t,V9eq|:3ӷ9[Y_mY"-Y< R36\Q2mV'WB_Z*e0fUR&+4:3,j5nf Ca)PzNb> uy̛J. >N:r6p`n-DDM]-1Zu#aYJksvةvD,] ]q)bJujkg@) &}so<2j_7`Ub NǝCI%k #2aY2EW K2{(ϮilV#ϒ]/ "^#7㟼/%oBBDO_OjI A>64Zٳ*Yrdn6sQCs9'P!OVMg1g s>sknjuRZ`fpjk2Xf`,eʎ͂In5Yh-46 !:}BiA_6Z2~`.s-4-' Jw'{\ Z ata|'{}:\qS(p=9Yͣ ̨ IX)ez86C3}MT,$iGbA}߈!"}o}>;7m`HC7 ?as3.ayt|ıJegbo a363=n*ňxw/{+0z+ˏ},IrA+;r( mjͮݧ LCw 7ܷ~X 4|1G5KKZ pC2RP鐸*[\ W /K rE3S(\%RU<={/5yᵜ KS0ЦzRj!sDC1nrΛڱ)I ݐI:]X<]: +lyɝc;I%Θ[9h\z |Z˼tIFיgsYcp*Qɾ7[,Z鐡>9(]pTt3K.\ @sNlL23̌sKW%%:؊P3MRaN]P澺rʷbG?gtkox3|cPppAU^.x/acHä,V x>v-WY7lō=-'`j _7Ip +=~ey3$@^hϥxE. [B KחRP]bI&NBgYG`G,`3("URd3Sr-uֱ V{Ry|f#*\Yw!Jv ኤJm_9f~Grs8YK ?s-$.e))k)7cs.lIYz-x,9}@*|>9>sm">񓿏 /p)1>O˟v0(96}r9ELCSd)(/ zaC`yTFJø(_HϬ~C%3[E* BoX}vXy#^ōG*V~ƶAʭ_@4v~Zv$JGi,30\+jn*Vh2L.=.S[cY ]5s;K'=#l{)r~pp4ǝ~av% ~^hd cp;$5Z<m$gΓw, YJ\/6>’s#G1j!I0\b3~hd?᫂ C lbb">j1cVZwdWݺ58x޲bJ ZZ+\!@J|:a0:h^';zV}7"X)űs#Gn?J0c}.)֊K{g$KQ\͍r3,#a:CWMӦ&}6jc*~,ׅgvj!G1[ y vݢe4Ȧyne\_gX $@ l˼=,[L\eXof;QI>n~xpKkMfGL9 5 G^6mXsܒQ [S*\&a|uܳkrR[õ<2nD\}mcyA ?mO3:}=t F" |IýF[oi'A^iI*Ɔp#jҨIS MWv^->fj8q- kb'CbfϿL1츪'lʳBT tçMH4Oz'0:x|WF(vpWJ`rG4Qq!+ro6Qp*Dۙ@+# t6oO k|wTy> Zdgw}P Djd>{ɭTp"w>biVFKVձPg z}7P#䚔 Q`CA5۹c.9&̌*$j!B "̳/%O$fA'&ZW)Kd9k03!Syݶ%-}DTJ̑Ƹq#Br-Df-R*o_4I_v2=376Hm݇`2q .DV6ul9/ tS݌A r^:q'᷻ j SMI/#TɉMv3ԅx\9y"F73(|xc_?_|y}(i;l.O <9,r0-xG3(AΙx J PQv>BNf@"C'nQ"B^ڨ*^6+k6r_1J0b𽚧JZ )jub .3#LN*U0RN% ZKU!lbR} ׆>s(!:|U]@EW_jn;bv$*4UX(T", +,J,|m +ؼ'3"YPYslxw.֑T9!ʌdBeV Y88EP[*tCxUu^K5tĂ1R(}AmnhyB). oh%aBucB'a' Vj{$s͚d~~V _U3>3x~rVU" t{釲7cI()ՄR ,˩2ȋKW c]t"$ 4 9J!,rΪcpg)LwvBu#:4е.*^4gޔÿ 6{@@83∀6X (p##Lj1 1"`$fD TB\0(/AJL=RY̘5@z LI*I"L"ȜKu;;D jA) eF i(L@6'b@pfyW+$0fJ2pP`MrI`dSYڪ;c#\XK敫TO Blq khs CA,FY_b(A!V`"6rBЮ0aH\YΟ10R Àa(vfǡ^U]愙8 cg.IdK1MX 0#;Sb쎫MsyTAvV+$,@!)9 P̘A6lg@,S:bf4#̛ r L 1qz<%Pʆ{({- 3yGӀGaJKJ9% ̽F4!h[A~:8PoRP, 9)Y7k%h !zk(SIiTvDvq`m{x}o˯œO>/| 'zGFv@ CFMca`R\8#.s'j-6o3VԿcc&nnѓNWmNNYX?ad|k޷/y1417'N@fl,Aҭcd!)UyNe/3hÓdQK mS{4^f@Y`R]0t]<%0f弧Dh69c- TLY:dK0hS9? ,,9YN^K9c 3"qH$̓@9 +"&gۤrߤLpf&dˑTy#Y % ǀ9϶mϊ>Q>'s-+%T,O|i1׀l LTmTmR1Ě КP=W]Ͽw~'n60g8::fFΩںX )T*`i X%y* P$0asTuvfP %AECmRW) V%l:Hˬ0Q&+ rL&L+j+ㆨM /Vu$t];4۟0H"ܔq0X%\~>% `Zy+TET|9[((d& g-̛ bl>(4ġ8'Ga%=Cj2=6s8Pss 3Icu+PTwC!nE-:\ 4;UGoС؟dE3UA4VHCę#x qm#y0m1Mic7e} +A$W55 Ԡ[`*hl+_a !XsNޒYV+4 RdC K:|?[y&wmzt9_#v/[wBBVf(ts8I0Sec^+q%`mm SJ\,zEa@횚~S2c*G.MmbϿRN&Đsd)oYw9{}㯏~jj1Ά)_`Bx /ԙAߞ۫d fVAnGU寫/ *BXV*ql[~5QɌ,UTC"d@swvve\X]pcuS{O=eLiiͤԽud㓁OD4 u6,̅bwݍWq>8|"R3/Fs`oK؉ G獰SQ(7L t1uCp{[oT 4bD/[q1K~ d {{;c\?f4OY%lL3}i ftk_V%Hz7T&m'۪ӶŮUO\>/YL:kzPmshM_ORl}fnuPXS<}"`_ ;h+&*߿^t'Q*&bU\dq Ycɺd V;VX hF\>CHEȹ d8]dT"`u0>O}Y2a(EZ2fO,֔RԚ#\-$}2D$ k/Ul7F0YhPpBϳݰn*wVJV2}/;7qi¼ٔMyM=nAcI!7?XZy:_+lL=[6S4RV:XMVHi*JYmJ =4?wj$hDeX8o+@XP`F l4;  ;>h- IJ7QhR%"XEς^b5!`q_je,rܚb< :5Raߏ?Gދȵw(U„ Q[n?qBM0T\>ߐ|бDr^aa"fьea]W[P,+m_۾ۑãC\~ WLӭF]j~ :rт-3 yi}7LWP̡OSK{|E\p$yQ{|=-Iۿ@c %695rO5ᤲĖ,4!O4JD$A}O]gBX,iqMD'l{o}Ǥq?76|֯*d+i㸪>/}E]C3e]M^ҋHyq.K CڢFF~Q rGU+AnA\=қ!FyʓR0gS?F%j򳊾P]3q>4rJV;}7^z wi%!4>W&ow:/cSAF, 'uan89ɰDƁ<+P x;gpu_?BӢ2mpP"& oOc[xA;hnFڂgŕ.K:Rm[8onOZ*gXap]۶ojmaPWm5HVvG)#.AKU -RжKxSIcw?FΗ?4w^%6'n}ytӥBq$ST.vJQUe/nQJO\}QOeX#9)s |efȹNi^TOY78rw"@* g/o_Agf`iرI KVbWc!VETƢ :^H*/ꖪ⏛6{)׺3a`mmۺ ٶaJo!nguڱ_S>-47f%ל<#ɾ'49< u v}[`hl9?JcX| b0w}/xs.^Mfc :Bn;vn₦f$E@PŠJ ʰ)PJ)v}훰N3puG }ϊ6U ܳnŷUqm[UXv=L j _Fǧ~mZ'g4zM-=M[ym\{~]m0MSTm=a^;C_۠sV#׎:։$Jfz\;#&֢H,O-٢ٸR9`Fi\ĥď!$GJ,3&/1ԢPԊMMFc ūTP,˔izeV&P?FP݊#LJ8::*v`juS~V_V y>"yFs(\t> `n۪DK (Ft 2$m?$.F6-uh0V ?U2}{,2ϩU VݶdJSU%mZEY3UZ$"lKh7[aN2_ͤt6&'QN`nԮ>^|$`n׉3@B:3x.KUםF$1#DBnѵWߎ7E~E1ݤߩsfh[äfnTak"Hpf9ȈlKZ&v~߆o GGX17 d1pAA5.'2v[t?5oJs5 2mGT7nIL\x+ X"`ǚ<64SPqT}5´-9MSKfQTm3 ;z,J- lXIxS֒?Zƚ\V-P \08|nm(@$"7ǂ~F b^|/Wv,d-`DQ DP*g65ft9<8:׾u  #vƕ ߞc^!Wb/?(O@ݾiS0X9Vdt @Ϙ2^hxA~ Q?[W5wS l6ev{m™ocRfd.^J2Cyx2 p͸p˭v7\2;\n,JXћ#Y0iAAx͂¼ p]GҴmb)Tsv%HʹWgFnn@0] /9n蚜H P C @+&jALdCWc{5Qn)f΀BMJzmB -Z L)hJRs[IUB]*猜%htAPoR(+ 2TȉН- UJ}s.ɧ$ !Њ"8l:U/J%LO38 X;@wp.!#{4af"!وF.ġ/hv}W&Sg0 U4y9Jj,u|#! V 5o-By0)9Gr^}oy'rb7klM;eJϸ8s.|q9m;G b~`͹ަhU C@CӤ2hWT:/Y7 ' wXLs0iH!F.vIZ94\I̩RjBu(TB9@ F,7c v-uvÜZ3cem.3kʸL|^[6n :"nb3cUvdBl)Pjbz;H;ONLW1HO)!,"U|0`iA#xp0+'(≣3]+`ut?SO V"ZXi޺Z-9Z[wVՆJ)wSv$~h9p.M8ip۫ j!*:!j[gTFMS:VFtɠVr_) 87TR(Z\(jam}h U \BչڦeJG8b kG%3cVhja 7(9WF)5*>'HyH ҷf09f6_t}͝C3 jEσSBL22s A<Y"8zA= TAX*),XSO,ɹY7:,NRZ)Ao7B] vɎr5>`XO膳VPPJ?_Qw|; c&1V|k pdB9ʺN̮ݔ]ڒ6N8n[CtYBK>Y]9GaVUvGD jЊپz πRg.b4{gk*JA\ϳƈz0px{+loT oʆYUSBeK7PCKbÉ&LݧY2YXU|l!Yl0[*vfvzR8$ϒF'=5Xyx='b]CI0=vuSaFZDhbٷ!E<}\,@FgC)0I|A~]MSTd? 0p(UƜƁ07¸7"Skc#_s#RJYYPOwg}qĵ+x]QWmRTOqklD&[U7󞿡cYry7!sA*:ymNyv JT4[2 MtIXprE|7PٝV`lW gQJƄWnL s" V0)H\d1O QsO9Avq2b YeikPH ЀEX!FTT87-TKhݛ!-t=7$[,eq:w>УHT%D)r.T7\$6k fada,'PsqA,! )׷$3)U4ulbm8gPyN&T<}o(vPM8K¤H*iʸf.F 44Z4)G6Rϥܑ2Z<7(`ce<^t2pCF=(L5r 8U:\zQ xU;'-|b,Cqѵ*ܘ.Y} jwX-﹞ha~n[vݓ:2"FciSbpbds]q㤃g6?庬PΚV>Ռ6<+/ ޚpJt oa#.UC\7R޺ةƅP@R$"OO]L+$U~y7ʼn+xA>I4=ŗ67L8:>?8 X7)CJE7Ml9g5p l |4lIPA.Ŧ1O-h(r,UE*/|cu٥-0!ݎ\5眪A`u$( ܑ"nG0*!1եP%UW6M4Y#NOaa C??M~Dþš'|O_/?0nV<p뭷~=L V2҈M2#g8s;5لj$H1Zl9o;["Tv<%KHn8W:_.RnoozYv a03cLICĜ7 ˌ^:mj*̛Y(Vp Lg@SJUΜ M8 S@@ Np3'W< ÀUAu!z )beB+c荂-WesP7:SJ2u\KU DSՄ$oq$+=X6{V!f5)hy͉(s%xް񩥵+VX*!ٰF5eÉM+SfgINę0 OnCqY$V>xb8\@ܧizffD '1| Vha#裏[n^JqUEkB3ɨk"Ҥ0oq%{Pe*2/fA`8RUۥBO儐M京 . 6X (c BEIK:KUdovE\|vl9@NuaO.v{ <ĸ1~&Tu}W{hVX`!xHe'Q-SSkv,*fh^ 1FN+_i$zXhҞ0gѣlM*~'h/s:sůuZNf{X{L΁ fivE`|w) [Uw<#|A1b|err$>O!KPCxߏ׽XVU 6V?̹YW,=lgc:#P3Fe2p GmUe/qG!vU:(n[7M޺&{M)D@1mp5k(<יD=t !Jx"p Q`a(hn_ Mӱ`PXNV]β`*9CƿfhUVP!!T"lFߥ% ҄9|N @yyD>NKقG#jEE)]+H-ĦB{9g|S0 d!<ůc\~GGG8::ĒO.`ggl6..=s p ftC$HM2U.PyYVU[!:+),BjD;K%G B d} ΔݭV;T )@=H= 8$DU1vϥlBDE `v'kb}rj#*GVcu8sfB;SrК\(NA 90pCBk@`Uh."Oau lPIΒəe)^^"CB*z+DDM2/1q9w۪3Ot U1*\WȴÉQ }$ա<P7 )jVIdQ,d|泟 -<Ħr)%l6 [@_ @Bu=HA@:ͦxx顇/on&êm{>0mz&2sz\CX'!7Z#iE:SAB#Ft[@U@}ج>a42 C-'A:Et˽:URxKz},W!d`ZOlKrD ZlJҢ˜Lf `Kym5Q,"Q[nz3%mPUىTyDG6Y8 1H%؃Pa[h-3FjSEH^圉WM;\jwoT%3h2&U=3)yiɗMgT,Ֆ!ݥ#:^ylf8A+` ^kUNa33UY/~&IW +A{&vz(x6 VU~~~9R-b$sFtآoPnT}ɬ;% SNb@?"pfLjRŇB/.~ !K+I9j1icU61bƒ̇Iҙ*AYb(CKdvRw{7v*A3lRm,"f%NJy I'8H%,Ӱ*SiH.6gN[UE1dZI|]]V!gTЁs^ʢ( V9j|$a¬r>aF& bqL2lxԫyq5䏏q5{dzz y=gil{P5wos1a!u<9s s5݈%\ mjT9OJ7?k$0:XBmCQUP;KCu""A%@NsՒ$>"\u hBq& s"G;n&0b}|T0oz} ކ):id(3Xy.Jt`  . d,Wi OUڙP=4:PW89`N ׾*^x66ێrv|^[UU{j!9*VҖ%Ri}U]$sCS\ﱇuPO[u_Fe<~!f!!9^=O=aΝ; .`gg/_իW^quի8<<$p||MuS|hP3u]8請V/J*J5n}/Y [JJ`)G JS~>$2ʢ 4 3`p؊_Q4? !Re_ٗ2ՎDYn'SZ#tCכBB1"AWlÌ"% b3RA/WP$J`HfE?@KUN^8[%>YGcxƌf6&9Ft,{:.P^=ٳg9u޿XL!T)._cDi穚Ë"F_ ocW)#/\˕.Km6y;>?[By衇++xމX6+%Xez1-*AQl(a"dVI,?Kl"-u.TM]b0XY6ɾƶ}RQ MɢҚ- ZLu}9A5j 9Dn!eIvYveg3țа7ޛ1Ђէ _Cu=CE7Z S֍Ka11Q8di9 ?~p7M|@F!P#ۻi4ExZ/۰:J31gy5S]H&wwNR蟨A6-jt@Qϗz`8 .\-܂}LӄK.駟\r*~loog!)=~]~ _VujV^`] Vf B & ߕ1{*p &4(qt'i0t UDVxUx Mٝت̶WPv^P%%YT:CHk ٺ2bj|2Q>et1%*! ;y1&@iR/ *ٖq6|9m*Io*DW3,Ǻ(V:ۢԝe5~Ɇ#zm4QBqٳ?ݭZ.~PmЖ T.m Iqӱ6/D'}S h߉) fdnSgh=t%^T8ϟ7fSO={ .]jV=`>h^3zqt>O{ŋO"b##‡'GA{=!WͰTo8EyɶCYN `GxvIBr6w<\!.Rv{XϿ9ypVIDAT dS24dr4^؍H.rΘ1` qBRjo3JɩhU2<`X91xs=|䠛3x>q$`6~!V{O!:/  ~!!U4[nHAXT%l}'spZ^.euMZ@M$o`@E7]0R~?v^e<d3qoLW|8*w S$x>W0S|XV8880 X8<w~ᬑ>vzEfXkVdlT|4 HOUuBz63jVט%UM]nC-@}+ qMy^'˗qU=ܶ4ϕ@cC0[50vT&( ynXB*l$g/K +R#bb|T6k7\-QY,,hʞI* M;~E$.qb$IL\Sp}uøt:&/*C8Dd.Scbnr9yh}Πe1% "A@J (yK5rsf &E6,v!q6cֽ= 1_Jqk dZ~$ִ:srKaЖԳ pP*yAmz3*'ZZ!Q 6-@iO>!VuׯgSO=||uO`5{iAGG>78{ɐfpx^.9D VXa͡rb[(ķPh†vrfەl>9TI4'DӪ &PailOuilGa>J>TДz!eX -iRұMW̹jT[L: r9^h]AՐՋԋ˫VfV+R?j0j*5PT|7pN3kf;q׭#"3~?kWDr8!pG'{$D%o8*w]$ V_0 MJ|駍-ޏjlgsmD=-{I;vze_4DP19d۽f@mEΉB˶B gaGf[B?,03ry.3̢V*1M+!eurrR4awZ9ƊA׮$j(B/$#09RDe0[w\3@|r4-oP4KbFȈu͙;ňlmc*8o+f=8ð.臌mP!h;tSG4uʼnKnB]6 ;D,FԹ**eX;͒ռ77[Թ[e$cO>W{ƵQ=5k7}O}l ~{6>~w@aq;(߄ݽݖ .&ˍ{4MVc5VDorC"ydP[b/ W1tI(>P}&)0 B9:u^%fdt@C1z*}6M̌8@ͦi*i<(*pw΀ ;"7SaƤ|Rn57k7\ 8Xdk.31M}Э-3bMQE$&/iÛ`_UI4EUiu%Brڹ [qqvh-BonwC jX;`*̀\jWŽa\~f! lnbK`C-x TyO=t3iZH/lnA<A8q[fPN?%_Av7j\@y>EYMpaC`zZ+n_蛭Ѫa&*4'EA+ t"Xb ֋yDh\)I@Z r'l =6q+|)k&LbUSBh: 4feu+yT[rۥ2%]xɆ}46IӂUA?__H>l3@4t[3|egˑ%eWE\)KیESoպjmd-!!]QQE|є>+֍ٶ !Ո̈́`ۯZȒ Ñ[Yc13+:QPnD1)!Xt {x;߁|ZٴldW5:yܽy4EJ8s)F_Ap8UWJ e'A"C#n͟ڟ{g9ybFy~0F'̹>)e N˾0<#b5vW~E?;HsVCO|zcf5ݸ,NU;b rqpU B2T/"HabQ*ZAѹZ]*=ʱb-XA+AF3x1 _+UۍBTBTHΘ&JC%| 4,Tg0m+-ci~6d^>& =gyc>%/7^}ĸnaVP@sP?MŕN~3 z"tn 6QB\+ջg!@Ւ59_s,$FfՈ)Yn)^lR;gP#*GbViF#'pC3ؔAu"`IE07WF5,rFp i.2W>q VEq6zkm* Bq;(Á |mTߚjʎh qClm-IRUk7鰔m0@z 0/NSzn<_HШ}mc1zv?^ D{7͎fW4I,O5孈b-N@,гkF5 SiNzsqШ^<TӦ;CPœ+T0rN#S*LV@B Q^V$ I3pc:Z(."2IZn=[իƳUU 3aU\ZOzv_(Xp|,)qLPuhMx .;8J`ED5/ ;sƵױfu Wžֹ->-Yj蓀xO@'m._"?ѱ$pڂ_ط$6ӈ Pw_0ՅghkR$z R@_^G_atY˶ ޿ eYIsRA CJR fl9j*hZ.|ISnO}=.QX^u!'AcNK1{ju;Nm%Z=7V+X!cW1rC?uЪ+TuzT+,K,%@!"'B$4+9eຨ6RaՀqP)M+73K*,I3 h+e90+dCXl aGfa&7 wM,Bmi<#)LBqD9%t"{3T:#m뜒 iu xXtrN轷0G+%*!e[f &`?T']SFL~/!.Z4K}'J7Dm]oK{'*y>ϳ1vjN-jl6KDiPi?f+WysfKW5]y)eqGgcll[*aTӳ'+`W,Q$'䜥Kh9P #NxrUQ(*ĺ+nQ&Hl]@ӄf0(˯:Ǫ`"2] nт?B, qXݘ0>O~;/KvLIɒ|F *Ta0Һ½c@Hmki nꟽ3VUW`N͜]a1=Y>(vƲ괐v&x'P,ɷף>!27&qxC0Ϧ\No澳cW~G.mhJL &nhڙF,˔"'si@&`g[vv>qʹh̪7ECx L(e0w {E=A|T>\xtsK7$ާ?Q|Sڃ]9 ;AXw! b5;uRV}j Z32-T- âŦ@cט3;ZU %Vsj[r?45^;N|u*WߔNbhc εuCUr~fBDL-R]g~-hտ{km[ὼs3=\L>(׷vys.6i; rUoW(-uܾ[S9odS nta6N|sLZ<XeLӄam&h VWY93bfbus^9l & ߇vϖb90`,/}K~~~-ɯf7~׾o~˟OrZ a x:S#1qae л ]3 D8ii\e  4PKL/.j?m}_밌wequqpP1n-sJ\aؚ=8s܀puA/}ΌqjnO Zjv? x'Vn3|7ن/UXBO}uF!,s}ԯ–ܽD E>(]_=54ƈiވHJʹ˩Ug Lh9a>v#v>Vu#hALcFE0 P84}Z f!0"dBp9-/?Ѓ_ ]oy̰'B cqˇ#·pf NEP.k3MZro0Uҧ - ]amܼD6aif[hM:g%9r'F;I >Qpg2AMd7gZgn_fV^2qӯs Oʕvc,,V*eC)zW|Dk;elN&GH~ͲW@5PJ и˯?)ON?+?7?)[bql#Mun+Z< @!}/5̧>ϴQ#>-{72k$-;yXpb}~ڬU;fVse&Yynje@_.[|?mg@ ?ޖwι &-(̧ґϊ-<<' Ha;3U=7,FX8ʑ9vESR F?:3!EZ!RUSuY}|! 7c?\1\X:0Aq Ѷ90w@ n?33kZ~Gy?mK pRr7897LeDen2ۋ6&j4h1_p!R3:̺;t6z@X떴l bej$x)4ba̼ tϻՉb`iǘS.o6kM7{H_eZ{Kx).^4駟ƓO<zGGG=Day%ˢƩնuSWs% T~`czJ;zp;.v:9RnwPi.˞~ l]C F2)b SfiYm'LFo_ Qu dٛJP)kXx9Dg A._ok5%㣣W/ѝRC9sƅ:#v-1dgˮРn΂JtqY7TU* |5U[Cpf.6p yLfQS/sg%#BT}e|t5WEУ#[ q7/zы|'E/ΝC\9FI"yXm  7q,ܴٸ=3!JqlPO)cvr-%Tʶ7;< 84w?"^i t' s.:ٵe>B!.`jZ(% ^R mUEO MzW2j/!kϙxsڷ_t~N a]phQ75xm1b}ӗ?Q| ֗//$^- oOx^[.ތsgڂQΌicmp?ٟţ(g ]b7.kq!6]O1ĀfX`Qo諝;0"Ss"J`T{F.gL/;kF}䷷i_ w w^oNJ)aglekto 7|31_X/NK]gGvm:hmaXRS+k7-N45]/_ ڌuc޺7`}Z"O|UUvi7v+-I&ŪC(P:Ӝ0NX7jq𒗽/^dsnKJ vKU["jXaqEq T547&`oz;bk_oc?rpRy>Yx\(M*ezv-+)Wʤ۩o衫u^B,ՊD1>q1Y|e`+-;dCmȳ ؔD>X圑LKF1V9a8y8D+0Bc*l悢q'nV;{efg.qt~. \C wltlJ`pG>ƈ1T :PM3pV'4N~5޹/` L뮻clM%K{{8{ .;x˷}TV+1z-8w\pFKܹIIv^Tmt'E""DYjmu8%0.6fc麗Wf{]`Yt~fmMo" 3kO ,o$A7is\%ȯC L_t*.:F *g.=㋯S//nۼS򽜦򌼾^cU_8vٙ&4s$:;/-)xޣZf"~mfxEr*%5Ǽ VVB-xon b3quɓZ{` n.KAyn6D?LJ1bZawg=;{ΟǛ-x/_U"x;ށ׾p/|/wum1b"VX]{>я,F/84a6[F {e3Á۰8ZȩTiKG 1ʠd* rso1w|L ^@0tD$ϱP dA<'fJh 'S 0M q3QNɻ#I68ϔ>/woOnx~w>u|O'@ s:A^_+l`n ,ZAd{9s5^hsr44rQa uk$bXI&o^- DkJkAFsoӎRD+{5^Fy….TG~={77|׻#?#?~~YŹsgqtuW3?3xG̕OORA~{ӛ?*+j]Bͳ*?%yscjDKF%SY{])lk_hRT)5ҝ ZAYͳ7%yJM*Q,vV;܉j+]`;:qM9#Rr5l$rnfАeFtЌ]?+x)M Kox\8~5ZśQq813Py\}NAa)U{K"gcl V2Z>T3DJ0$TLۭ.{BZ[1eU_L} ~7i /@gfےo-?S <888>|鿏gq7]׾G?+{yko}C/ )|c!oe|_h00Ie5֯MfgBMܦuz^ѷ(5>U*5muM >~aauϧ _0vQlDK5O^Ym!9spX>)% ®q%װɟĥK?uΜ^J Ànj>pϽ +?Ƈ?aſ񶷽 ?s?to⻿{0On:SZY MZJOԙļ`'yxB-iТat !'fxmDyڭYEKdF/:SjS`C9J SNa1.gu@IA7iW2#(wEAJ/K!LDHOホmeuO) N)8 'veqrU<4ee['fzJeppH+D4Z 'V^~""D!"݋9{#g#EM22{N&@AVB9 /{>Ow y{S?Sr~÷88}݇[o< NcwwǮ__U񖷼?3?}t c=_}zWS*%3[b~2ۥ[c,:J:*3y!&gOHaI9uH P+\T(!٤=8]~7vq-7ŋ/}Y.O?;N|~/~~ ~GGGK_~]R*"+52YFϷTv<4苛a֘-")d(dh͎6_3]D Lbe^953/U:"g}gQm6Bp[s4)>BO`/g݈;ab|pj)>iY3%5/2&`|a>mQL8A7pB̝yւ].5AŧkTh&ק .>ً[/4CeEm1F (>9wԆ*V TLrpMo?ӥ(RkRJXhYձY[E`Ÿz/`^wNw72\.q|r"~x'prrR=??e/\ޚ}/z/zD~ .\F/O~?0fU6](!u WNm%;r|q.,>ֲִA)IzYϞPi!)&cbl-~%W'ʎpyRv*t ];\Rdlm dà5Pǒ}1s] *|lb8,11?dAHM.Q-Ï)'^qI!K/@wӝPY 1u2>-I9kM%>"u*bMB%OqUإ[+u͍UF9W<-`T΍UragmS0MuA QZհ>,n]''xqxxX(>?+^Jlmm;8-ܪ>-M~/=_>ٖ*Z PUܮ?l2FmʨriӺ2K>5^`rA[@f*;DMdi\ sXS qBZɈ`tǰ LsX}^>{DR&Aj ʽY7"}c#mE+>E6RM%op sӢ~0P+H -cbm^޴-ga9(7f\SxgO &zQKN'X Μ/+=a sxʧ8&)C4=e۵5qbn`'2Dɻҗ}o_"Ӷ/7eDžu`kkK1~888]w݅?0^MEYA ck^B6@A ; z0G%:* %Y+?!pkg0PRY BW,cϰt0Tڄ}U]X.WN$Oe?S5&M~ zQ :jEq+j҅RiDqcj\)r@/UVy_I.>!A+H|^P9Jhz&o,]b*rDm+EW:2EK"T)[mx0 :B _S}yXFRzrIKYd0Y}O@?}g׌!p#븾p{{|DSÛ7_v(=ddaLj{#h.=Oj!bWU)#d˓s @O]xOsg!fM"&(ž&04&{@Ƈfa Yy{ͲcCCOSW  賿ZJH |wPJ"XVn B;5!8LF7r "8'=VAiJf Z9nSWw99!VY\s:%+2%ope 0t- Wa928ijh1 .K럁0Zw_2j ,czsnlmm}/OL0;ʥ-/v,F0F,'xGv _f<41uzGGG8<:·-ׯ=q8b:7ٷqo}q7…=\?H8b c:}a? ` _K"~BZEL W-?w *1(=;F5xE DFl#E.5C$7k='%p> ] I[)[`V-k*8" ZhwnN6CE}b7L~~hMEx<%FZÃX<02|dV#e Vbgh,~EB&%Nyf^ .˾c Cި\_#fMLVADuFlݲZ _c5-Fsm&޻;bV?b5y >O`XK;+?G /qBx7{9eG !W`|[e|S88Ne_+Źtє^ڎ ,^`9qq!ZNU\o`Df7fR1xɂ*:yy/jF., jV]-J3~01^ ǜ5B]=eFcнd(u|N0w+:t0%dot*R#9PS' ! 6IXk1VKɥCI DHƐk;e9/2qMX;m]xB򗾄|{.]¿'>w[x1\;Kt[`ʢ ܼ |3Wwcçp?+{.9#.W.{~7ay./݆溜8bFCb_|pmo-7u)ߌ~,g8!c{Lϐ?YhIl1ڹ:ģ^ZB'ۣY܅HH]UѓQy{AJ߻2TjRQVVV1VÐ 1էM ,蒪ZJ{&d*VE a6^%H J'x܈_P7>Wg;ԸF%UK4t)B?sP  h0!B 7SNhX7kSm&e/B)\8fU;{Q|ןy ܟ/_+l3v}[?(ŋ LYs{/p|Znpb@| ?x*=vWWʿWpe  C3B\p|| /4 Orif S\=8VS)¦֙KW P֝7R{9'c(.*較^>]^5Fctha2!T ,JЋݱ}2ƤnaS B4 LC2n(Tadm?l1+Zj#/[h~_q`_LC[y1 @mlc%m\zCOo07 { ˓8WIca13!(d!*$6g9l{`h(3pr+a: I:,UZ;=@C+N.tN<&lșpȶ(@\μql .g#T1#Fw]UY,T|F]*?fZ80~H4F lm*!EX 1er n~/͏.x) B~ 4?+eo=ŸNt&{==8=_b|Knb}G'G㣿۪=o?w À0c6V u>eL'ij17k璅8&( JTOr)>*dډpFplTɇļuϨ<"?uVJC[ވ合 fռ4KJn^=|xNq0j8q!|J>+7`zT" /qy>=rP<,uXxS1Kc<!.{ wމLJdy6fxyXڛjJԤm*3vi2Hdg|F ̢aD!Ktꓚ62|&&Re"Jtxy'(g Dgf/b e~c$VIF%獡&'#Ӥ NNNsn~ΦUa^svꛣ[{t{֖|H%p:sVe%NIὧt 1FuQ1bqr"{2KB_ 3+( I<~NK X)`8dFe>AZ{CҹsuC,dN ۧz(nƛl*LfЈCHvSVWc|sa"g撧Č0jF§dђz2,˫dדKR3jjgicMQ4 A<:W:dh SGx  X )v3A y\{/~ .S1oⷿj_o?#}ΏZmH''_[YHBgm:, #XJK/t=kߴȶTnԙ (#SΥչ#1԰֕g5C1'kp0wi2qcf a{g# ׼^U٥:Ea0 :P0ga0OĆW/sFJ۩,^A4ollrW ^"dlbi942Wԅ0?Ig,X_n dνnB'uI4T^C2Dk j>|N-c$`?=o.v#=;tģ$ av"@@K13l=Vl dWĬȷ՜fGų)xM@rZĒeHf9( +PiB6GWKK<ϓ|I> KL7C8!>14\I;MT#PW丱䢠Av' i_At#ȌHbRDcVaYO@ÅD"0o r%,݉жtC幌tQE R\Ҍ}2#Z*Rsxml˾Z3N>i[S[Y=z~k_/Xl6l9ZG L[Dg_Xo:>֎)"p8.sw޲_cmHm!g5-y/F V96QZl?q2ҷSE &̹x$rLQiaP0B߷ bFw>(3 9;TK% NSy\'(꜀8 [PF,t͒ /vPyhˁ dX5~$& VQ){ d"g(\k֙xƝx9 آ &$YhlEa vx_z o_ܢ9ֵvVHs`"X9ilƈ*$`5_~I/sdrtx \ '^1aTxZ?1M<<*H=W!ugfT&4%Zjձd=iXYK61*I3+l-7s^z9`@T՟EL!ghn9~OՊE92 NBA*f>(&nIgV`Gr3\RVco\YdX$Z%*jsnjhM_Sqj]ti>vdu5 @\ݼF5)]@mQQa89f^{?: =|@xgOn뛢un!'vmky(CEu@,PocV( !O[n;#`0!`9}t!ۍ'儰N*ƨI)ܾD2!sOPRu\A7ZvyR|Dž*.Y <\LyYJlɷB-âiSZV./wV[.]~s9$MOM Pl[EpDnJDeLu+BX1p|\C[;{ G eohD9 O[o כ2x͡`5Fx%c [1,Mv9*rZvgbVNTݨ2W $8$)CǐCbK<8)J[;(Q{1>Fʋ@`ĉ͇U n<0cpSűx+ P m| q4LX~m`_qQ3/전1`.&⎪o) [lyLSݹ0լ#kD{@Lv ݫo||`  (CBfBj5D ic} *P?:p*㉧Q@"O״Ro)`G|䧐l SsWUWZCc`1CA-+re,;6Cd(# 'tj !4b+q$X"!etLuz@")9 qMO1c~[ۻ1.i==kbIii2"c^ s]ZEU(t .P:Vɺ)N{"U#13{ || ` #`%_V?f21Tdg)}K1<4Gz*``-#mr!_>,,B?J~aMt~-P? Srn-i.&\b$`8cBI &aG % "Q°N rIknW|)Ew,}L OϓX\y0{ȼCZ5>e+ʋ ݱK$YP*X uab$CˡN@]"vKG(Il`/sM>cJ$TVq id@}*d3K$y o-LY$es$ͨF9{*4qyidrB'7a[cigL$ib)\uymijܷiBjPCi -m:D*&{(8NC̳׵=[n]Ǡ!}Pw1~e?Jpă'tȅc.+B\㒰̝cO<|[NJ֝aw]|?X.G S@ -ZVPGGGxܳO 4u9E_ ֲ9]=ǙkH<Hz%hI )A:<477%>SAؙFU$1 8Q&!u[T$+b q8Q2 %t$Z*)\EYau$ !yy;tMl#c&@t5b_&e2b44\}^:兯98?!Xc6fݔ]az2fm P>NN-CRszu $?{Lo{=Ux;t'phq/ {ɻ,8$kKϹ%a\&}{epS@GւpaN' }Oo>G?g߄Eϔ9GVDB|k^0$5_a}3ѿhuai,D_`&̪%ІI3"ÀBEc#<rvڔJ IP)*2d[4T1/ea\\A8squ\ vu[q%Lܟo,ulXtNT"˲0TWdpFA@F0H7<}CM w *a2YT~I(#LT_w]%*HmZ|ظPd @𙯹̣7͈/zQޥ~`3K|xRU{’0#`3=c\",尳cwG@}YLa;t]b[7y~/r̿<|-7Ć4$Րu&WN2p#JM1\NXpxd%x$*gXuzva .qX;;ۈ㐧RpHٛ0w0, '9v}Iu۩I&a>n:W0dxT̿CR9ĘIL\<G-ܢ&. _W0Rhۻy#pj %&^*b$Svd=]PM>!u[xѨgɄ]&*3>0Z؞8[7ҽ G;`]X1u8#[ r[`>q(KRЁK`<&#>_~8}`:Bwv~g >X_i'b]4^r K kO|Sx^S-H{" q}OBZ` cf,Zhb iK1j"=4Yt.]|X%7_\*jʁ*7肸qsc8\/2d>fH'U1CnC1Eڻm`T{W8CoaoN988|Lɚl%|]K:cc&6_|D,_S hyu˅ݙfp=Pm@&jt#ꮏ4Fj@s.zB3O<͒^zF 3.^XtaWdD/>qj*Rj[t̝\p੫3|Hi =wu_FϿ|nj GmlmmaHq0`\H1ƈ?/ᩧVyyʘڐ02,a邿 ȳdb `{{;;;`NܲO}_s(UTE^tWKDHjIamBCOiKb _Ig ޙXpMӌðB ̔RN8,#1e??*-XvM6ư¥d=0do~n@vF⧦aLE7h8;g9>p~y)sxjƩS ԒhadqLuDIA`W~szX`KJ #yaflD{=LYZ؞< h4M߽fu#ǟy2nw_̳ twet$FqT`(@̂1 2`xYƣO^MbOSy᷷]c ܌K.a#S;;;݅s.qM`O}o~ŭڸ6/VF=Me‚5#Z$ _F6 9tff6rorx Y[mB(ca _/4- PhAʶ}I{SL#ie[L-67hPcY5dϊKQB I/#2êiaL|o͇J^)b]?w``ߣ9`Wzj;B:.9P)+_Ghg~$*Yp\.3hjd.׬p zx g {.{-F/D^`C#! 'pxj{ ¿E HɁp.+G7۰w nyxGLQO]akk ;;;x"%cPR̮]|D4y: Sk95E,(S8+)}|?Ic]:؈)\̅q@{QoNa,HIX3i:?:`d _x9 :63 kd:}tk$4'Y(xCi}Ke5r5R,**sSkׯkk wx; | .<; g} a{<\271150'>;mQ"au]~w=|pu /^M7݄o/x &Zf˗/… X.)6N/| RnI܈jbdS[Ms% Y&*fDɄ>J㶾?,{܁(/WYclL+!$&P>0"ƈy0"pUx3\GZ.#0 8^!Ns7o=Gʆg#a!~{K;_{._˗/oM7݄;"L.]­ފj'''qb]nj·;h9xo:!Imk6{)kRl2'.#{n*;$+Z]s%LPŢ7GTB"?TTw"vvwfU:)eXV.ad"g; .AhF wTR*B9,R\_R4rt D5k""[;iv"0@̘U6 :6[\7#- ܐjc_]w/@N?wq7>ndmt[ =p=J2`Υ{BH"ʠUH8 0ƀԐ \*Po`ar9b{'{FU;h ee/tUGethN(2Cb tbVRFTVSJO,f tCK"QJ64Po9% D*\QeOM@Rjhjw=sMS3{ tnǃWoS"v… ZA ^W`ww'''s !`V+(]Ķp|| 98^aׯ_G>Q{\k3So^Mtk fccap3Qy%v}6tK|%F>t(LZw]eHWX!P}C@FUaI.Hiȅ=6&ׁ%x u!MVy*һ1KrWq^fڥvVDm*rm7YE^/@\նU24ܹfV.)=3eZnE/0z(v6; oEɢ}VsegA69Ph-?997v#\/r3zOa\܉'8!‡5 V,t"u[; l]Ƶŭx6,6w賁֖DՈWݬ^"\rַ_rp5looŋ^gRBC>7஻j`zc覥ͫP6n>([(e;00+@A̺6/x +\ϸ %xw99f蜸fhɰȥփBca(YTSiCEuquu![auZUv\S]*#i!ڤ0R'Qحx]BM0Ƣ1,kAf2xF'kb i95.B΋rshGuٛLfMW7a}ܜ?'zJ=e]wUk*rA/{p {NN2L1wɿ[XluY`V;Փq^Ţ@?޵^>_ƔeéX( hbb8>>ƿ_љȳo ܇lX=zݙ`#I.Q<ׄ|}POts?|4FGcȌ8^ rEjV҈r~NkQgwE |t㘞SdF/f}"˰rMKr7dkuӜR6VJ`ˤ Jd & 0k:סzvVlf% :ާ&0.L]r\By8GVGpKpvMڒ:O3%6e*VRMsu3>M1>Oe/{)ㅧLv_NfI/bm WE"*)zQ=T e-)% $!9!8" *O14,Bov1m{p7A #((9= tX@Āum!WVl"b[p*t}o݂?D.!9A}8B n;BĴ7qPF2sQZRWA&-}sB.'CM^9q^4C7A¨j3 _WF؇ȁ2IDATǕD&{\bwG/jBa-¢{إ-ې6}kk ?C?__ BC0L`h|ϿbQ٢L:+PvQ "zd\P{UhcT1g)Dζ2P藴8%Jh@1+]#:1F\J)zA>+| pb-*P# U4b1Pv7h ,c*o9]qfcP.:,Hն N4 /N !}\qҁ%S5nDG‡X|;W`fHLc13=\ŭ]yz[:ȞP&8g@7|B@f{XI~rrPRt m`M9=Զ@[::КY,mlc%]~ }w7Nqo!vڳG99(.C-ӆ;;xߏF=@{G>-o}3PY|Or&_i^O0DV6ҙFB0NT XddDy` !dfpTN1!dn5Yx(#w_]ߥY% !,Ds\l9,܃ĵctMw` .*v@N&U8Rc@Y N]2n@dSܔY~ ܜChkwaˡs",%π^F[.gӐMҖFkL|h B&/,=U|v4}߇f-b1vjZo:nVO$~7~$c g0:oyO|⓸/.L#Y#q UnҰ؄-bzCմacM*ĸc/BTb9$Es/Gt]c(/ED0SHsCK,!\j[r]~";iP`dsα,Q0b*dB:LZQ 5a%+ w]`?aިCu2Sg5y}Nl!1AּJ"$Ye ܔhĜD(y=4d;{jG*E?GKn DUrC5A6ru5R@aQ.XD9!_#ZZ#H &qC0+*Iig&F1\}4O*8X(4 fnn@L=ob66<@>_1F=7߼vjp9p s=hsu@ D07X,++?>i>Zs7)Ls;(Y+6_s7|x_Y5ɔc3mfubT8 nTtnS~ʎ4ś3P7TSC)׹-.B`xGX>C0h"Ov{WWt7#|P0LJ'3_LvhdT&[*([D֮Ik5G9 ,pA6-{'ҝyT&ZưoU nD~bHpU\4-tٌʞ={km$ְw _[އ@]P5wc?.v'Q=!`gSKq5-/E.抿o׿_'a֟ BÎ}({?w7]q[ ,iO +1xyQLx-k-+],.Ĩzc>&`B'H$\#u}"ĴD? z8'#@` Cpr9 H^J5x]JF~`_ }%Kwuưם -`(+-d^c1/[,uP ر`Ӥ4)M I)ɧ%<%-r*L|He!CweN'zglvu ڂbۆLk9W _ NNN&v"W ?zn 序9v`;v t|wwoͿY9 쿷">."~>?C' Qc,Fm-@iGKmĕu*X^ߋ1f44ك4W^Ylm&a˔35ec@HN[^M=rx-0'd&cLNWj\QA" R*] ur[NiR2+eSaC*:&L:w2*K>yu%yVŐLd7 1/Љ3,)XRALiR k[i\w=ɧ6%l儹 vM'z5p[Ǐȏ=SumD?@Es^C;IxG,~ow+ڴpaGQ[!#:RD8Q,;XFF6ƃz00>T/ )~*iz#23zpIF?!jgCH_)iΰJ%La d0N7vd\Ɛh0eeڷL$.bPhٌy SǷT$t A|I’[  tU>5l2o`FL4-܆?ӌ B~spx/k9]O? +6 2 lo<~Z禛n//o=Kl{lq}/z!zKf>rzr6*C۪͎LW"5 +`L19SS"]J-Hq@Q7Hgȇi4,2k ENkl]iAv[8,).)iޞPLu,4&LaNd:t)")p@5@d iQM&9o|PYبESя'J#h ʽiqR1sWU 397\kS>yܗ ]g)1F]­޺_uM>z=`Y}{_OPsoG-^C੓|#;?5a9MkZb|VoGU,Ud֜ru8, ѓl1g=`uYR|'4D.vj-0iٞ]NrLLx8u fo`sURK%,Yzry@N鎲4 NDe͍̥.K"k*m͟NCY><} %u!]FzHDYֺ;j|흁j ºdɟʸz{v@5iEp4PRx¸i n]翮^wߎ|Odzúp[- =̳?&Lgb}z4Zb%Z,'7LZ^KgŔ #(>Wz^{n5lMj7yͯKusbC2 #Q˧XA%oP+PVVBqyRvD5깙A__?<[[n:-9 ӈ_W{kNvSMᨂ yNXYr:@n\Om鹧yWi :.N~ 27yEOb!\Kjhzwq,]uYą'%=8M7 a\{DD "I/)JcSJTRE*%8[ *Qyx' `s~P-K!PЊpiXa70gOo8Ɓ^1^lM6%zkFa`N !|> # ~ߎ7g1څ0m?nFssP:gŶ~~^_LÊ"G]>~~??tnx#1gŚo\/w)"D֤06b4+cl󲵨uRr>tW@tZo\-W-O@&,#1ׇjfÃa @r`FB hk}kVq]K0b4;Vf`#4 {B|2~D O̘|eI:],# "l1NiS nZUb wR좎MeК0{9=#xo}>kKKkM@[@pj-cÖ3w1u ;ww?wS$u&+x^kK4ηdP:'(rqs kXI{@ '54EC={R:dTջ+4U 9O `FxQ^YFkLQs8ԋM.bAՔ*>.tfL3+rj l\J׻ Qgifzy͐OS%\.G,VZ:[sHNh#B(M >p_շ?7͍?sӐUv1<?Od(ui]5UP6?'J-٨UDzP${*1өZB̯k EQyUpZC^/sz3~d/%+~-gǹ>4WEi[,&iw܁__{oVղZbw6,~lP&v:>?7Z<b@n+GZX;++7Nd`R7.y]66*Zԙ:fٞ%=v28rqY3Nwu pGXΧ9 EmEBaش-*TFwUyse"* g|tBԀznbNd*@dd% BCY՘lβUϾݎ04rn0Qߘqxx4Y%u\pLE<DX%3/s?=oo˿?*?uX0{'S0])rz5)RQV8C͸rʤz0ѯ\ ׇEFhEv ;9ˡ!]SS ff!*$?_l+ >a=/pR\@+a2Eη2 UUIA  dm *lyjv=UuRE?ZE [oo jvu\y&d_3ֱzZ7M-3hoohrimq]~/`:I_*^W_=SK#Uי&b 0/B@v UņV^DQS:`yl-9(~:rcGTaE"ְw39F@aT59?QV&qC@1s[]F:n0=ůJ|"9WX5 Z+T16_m!Ae"` @Ia(o" `y/CqGKkkKeGMda6ez %=o|><̳gZ/LW."jA= |mcOOo|_hVNubÿ?e/{i^͌jP-s_G쮸FF8/fϗc'k!r1rkcÞ+A5eK _%_U!߃Q"n8lu@:B؇aLc q] cEv|NI*@ uH!DS&ά7 Hg[Q8U8SIzAٝ g54hL~4iE27 ̥E𜗑L ׯc}20qYAJ{4s§9? >A,Vm-yUKa$*ևJ923Ǣ}Z:8) UHh*B:yћ?o'6d |@tѳ̳<8},(ėL^AɌ[ #2ʟ vh=x{{Ca+̛^C?\':gyϟw_[ yf)\2ZCBF!*:rݲ{GOBSO97+׫R+}r؊;̽'fD)yu -F ?b)S`7L2 !jB\&",ǀq\>8W蠶 ΡR#okSkI7 Kr$2BGK;9Tdemjcn1ddGSQY&U3\[=D7p(xc6J4/w?eJ9XU \DM%7rL U!=%{a${?sr ;vϛy9Ԝzxoܲ&6D&-xӛބ~uA<u o5=G/|o|>BŖY#=ʻT(G s{+OF kS@f,b]'ZaRŦXL0`-ĵ cJ3nz!^ǐEMdDtpslFw8 RD,!uSN-J#"&֐fID 1ʋX|bAj̸-*#27J%%{F LJL&j^b2#P8ӿ.u(za<ē?sv̌}C뮻6M ACsS:u;]ygY@[__Yt-gs+­UUV$^ڀL,URSڈG6?U ,;2V  Nժ.\J1H#=X aTpt¸.ץP?8~?sK3$^nfDN+L+lLN\^1$s(tjq5VlÕ]( 쩟{!Ytυ1J=4ο4dzzN@%t䲥:jyb!p(걼y!/\8 FdKx:z dW^Sy8[N,a/*.pk7ftQ2J y.BN.INH@ȿի>>/^__Tћh780 .>A??O}S-sAs:+>9}կ+^ 4eHȡbPZ o5E:sDCITkBf9v]{aWeקoZ঻5vxd6;)g9!.9 ?bloo9 ~RuY,y:QSqW8,Ҍl,}ĖbE#uB!z*BaXw;2>bIV q!;92۞ .s$d8u[2QܕwF|3!ۃS: @uNG'𖷼y2;NM@p .5S;2;bDu +?)?d`+jw'J.a(UVS8yp{s;L։qVa,Vifw=J~ ŋks=zރbnΦbe/{ww~w&@kW=p.a: Aœs羀쥸۪ `,nR02F"BVa&^X cre2JŬ}f*8`{{kJuXcDP_0 6|D.)QIU44{ƥ`7Aytu|8s,Oéw^59#aDcH%kLc=6ϻq:_F62RBjS^n-f}\2iʕErQ jaX~kjboL'{U p`Og]xi~_\Yu sݹ W>\p~lfqB?WCB  mgfƱͤ91fۗqQܤ{6ױl)by Uװ Xy_]ŔCŷˊDyW I^)4'OW}C^TQ˰01:.5HD,iTq1 7PUxAUh M#tro,dIU D:s>Yt}8&wX{uq&bk0ld*1èύa{X,C 㨜}c~Qn:P^m mtvU XU%!dt`[j7/ $#<2Ea0`cK{N) T,mIH*7(7hzϓ"Ј  E9*'nvo_BX[x _Xu*sV |s= N5[;o??8::kq&5trS^a{{{>&TS+VC CN~mD--CCg,Fm¼)R^tbus͖k:Ĩ IH1= Y5XQ%hh@0gVu[@SLϙ z%0PUQj|.w({@6RXR{N$! !,@ R|1s7QU}THυPۻz n Z xَ 0~8>>97c?cx{sfto>_ݿœӖ떵-w=y?G\ڃ@s a[ 4C<,_gg EΕPRb:K,'clcu}aq)zevP̊0"DEU0䩧d79xEP> 0dƜ rsdJh.g)uPDOKd w5p+EWtiD htwDϜzwp Uq^q\MVY)gYAJ]1tbnFekfY[IѤAe贉;88<1QyBW_9= Y9;0RzAp+&wwqppv!ܒ>kS-- $-/ ^ڻq妛&K[ V0.}5 (.)&kJϕ׋KeEr0Lϊ=W>3D1YFEG@=M*ԷJ?sb:blIctHpQ#`\Ga@ʾ"GRv**Y LF,[w D>^È|r&tȳy,g@rIɒbd"&gMFf*c:0^<9s 1pX/RV—&X(kT=NS'9y٣u<_Y[Om݆w :-iSϲ{h騟5Q2AZ{*:"JJCVabIJ#`($25zM- qxi9< \]ΘiI\ڟ(4t^Zň|&{ʰ=!&Mfpu\1r^ag.f T9,\B #;dclDd2-,D+s@C(볹ezVTXmǴZ2ğ?4,}",o5ϝe9}V w]tRl.6vvvf&BasNh1b5'v-W!zzjis8@C O{udce|yMX&=*dB-sgTǨ!C1x#.T\a4zы+9^U坊(@a94fCK10Zů.ŋ_ʉ]\>o洟w@}7MHsY o{۪N]-loocww۳p&q&) Ed ʦ|iZ;)V~` :30O{u} 898 Rqvur0F8) cAX9Ջ>-nָ 'ߧ̤Cx%PoQ}3nh PY*ێn(+8snq.'"@X#d,g#,#ԋ0a3p +X~y=%~/}K']\s?\=6ΣNh]fƻneK&t]K?Rޣ:}#)b}n[FaHXd^{PM.P~ջ"u*19{sMҷ@SʕO +1߳cb8lw>qb1J/ CQ @+:"˰7 N/f:R1W@ydBqӂe]rb~5TKc%Q+GD! >btSiS#[W!U\MJe~D )IrqaݟF֍]Ԅ7OcWmU{V,0ȿ um,Bݴ n ~m݆7 Y`ȭ-H7#8ΌQ^txk9sfh[([qENK%@;rcRD>}1daCU)$Brg OVԔFda'q7;$͗#$AT1)%5)[~ 8Hdg$M;QYvR|\X^1,c-{p7J< ;]O%_xS亩a؟ptG~E]&7À'ݼ8lh̺ep @}x;VbEI1B+6yc7'zr$K6R<4$FiR9V0Hu 5X=:8.3yr)0Āa1a؇rD&_\\A8}:ss Nc u1=w؟W wu{챪 $/c~ 82}Q\z._*>DUn !s2 4. Uϋ߆6rnsJ,J0}(vTq LJđ_abNЮ#!u$K.ɣFCL#ɂn[2SvQ X!ލT`\pu ,|1k$,(qs YI717HLn' q.CJK q ,,Kb+]e<_bW{8u=Afq0,.,y3 ӓ}q<b [?F`Xls,²9Xheiz׻/۸x".]]@~^:7X:j ղTϭ*=fVH,pz"r+ Q''B8Jd3;FcǠAR^59I%RU0#sy?3brL5tu@ YMSN+}7X'0n0ݗl^5^psFA썣'Mҹ^VUI#wD+p@I[꜇sbmQ[ ^dca('T}rVKX| C!d׆XP??>~|ΒN;$Σ#8)t0w|}v[vwwq%\t X,°9QiYF> 76~1_U@\4N UH=- e~nf۫_) M]ENS mXqp՛IP u.G2G1*1?x\&eV9- &=xɵ|yaH-e^~Kʹ=<:ia\C[)]Kwӱ@D\P&F4cbil\bH朽s1fĬLU?B&k@&"V+wXWm=u07bXMd x"' $()9Hh5iZZjw śG2)dBŞl W%xI^[uGE[vDR4 1&xz ٮw+ٿ%$ ;&A K`}{ӋuelF {f*X:jqA\O#VedkUr&gcpe3G.y&5C_uAS> ^:1N<̟?<<3<ؿ]Ι78x_%uϟ獦[ysJ]ag^W/Kc\… X,åKN|v I6J{%wu&=܈L8rR)΄54!F ! $64N1RųepԡØSu-PuV=6bU%t),^robDq@B k\>,ԜCF JɝhcAJ(5!RcrL'i8>& ":u'f눘L|M50Vvc^X+@$G0 rp\mo{s<(GgM .5c&agg/^76G`?:M{\.AS 4b)a~$BU17$~ê3sbגwaa(FpMh$eA`5y]6jS{E 5zIWc~H,/4 dq.2^*Hc-Fuèn0cuCj W9klFVNK 9!H(8"+o.:v"KqttPtۿ]P׼5*_sS@{XMF6/vQk;׼5'>Q-qtt Ya]Si%s|t~wBcW`+uęX&j7CōF!Y#2yǢFP#2]e" ǩ)GD {IaD9%:B%h`4dk+jOʔ҉̍Ugyl衢1n˝RG)@TORD%Ź"jhCn2vB* W9Ȝl"%o9I>[):U.m[Km|~pyxq||\ƂYz뭸tҙLNapu:u,&QcxK_ N 888KS3e R );^Xyq=^s'5\*pdzKV$Q^-R$J)=4XMഛc3tj",6]B aD +0#8֙E-:)BTb4nf2M.= eKE`MbxXȤ60!S!]Ή}WF.R; ך4ø@maK^ S@B,pӜ&5k^6nI^b.jL>G089Rèd>q1Nj .ĠSC )Eށ+sQ P_h(b-H>\ \xg:>TJT}[X̪"uZo(@B\C&ne ĶA0cʊpa7$ \B`nf^M7iQ RU,cfcGb7E9$rs kZ,ˁB*bl Y*_8;Nγ8Ϣ4{9M@[x_^d ]sNi!`[W^+^=͋3EkdDW|^΃[z?33:iD>OqLA[1ӫaԬ^E VM%;w)&Y) p|\<I!TpzdJojzȾސ 1V pua{9,BD=j'pNlVY,Tˬh߹8Z愤ﲒ{Wp mE`"!Wy栴Q֮+NRˎqtt4a({:._nL^?߮AqȳN033^Wāq qxxzij$nh{<ȣ`kȜ{ ;bG&N\Ds+®Ec., }-6lIPpGOQu[ǜihI#+e1RD-&1iuFyY͹j#gBVrPZ\ǐÖcA@ÐX= )`GwNU6U~XzPhh%4Q1v07..m/j_rb/y%=}ׅĴT#n*]`#cggGSr46 0磣cw_,CXKQV~u>r"2p{$ .HETԔ7g;IBEF)[C VÐ*{2Py>dTI\eKA`fp& '\2(Af*Jo8wqǩiϺ4bxtp8Ymzxꩧ)@^W۟<`u{=BR_Y|zyQ<,4č/d.Ys&IAw Ƙ ~IkC:S!Gt c9i2eLˬC7 E슽v~ /ȥI#|9xB%,L&z=ePM5Y*N#ƴy7<;Pak!{xYBU:@pPTG6O΃$ K0AUi <ۻê7@g$uBZ}g5P61L^Bb[n=t285A0W-y ϣ:<|RZ+&pOY[VO#̉bf9G&tҙyvеTж8{q]wiH >::֖^s `m"E֑@EUFpeb.H!Qs:%nl.3:,%>2h;a|Wbk,4ƈI7U0DqMse&:pNX`<ꮕnSKd**``1+f%z3YtS[ +o\~N3rR3v0z@M 5MvcΈ#p5ʫc>m9-wyBvr.W\lr ,K%;dP$örci`![[\MXF)6``&a#@&=aX a@adQrq2cDM b#FsCngѦ\j9"'Иx@yDT셑x2rAQ;m! D)هCmcd D-5o'{Pn1yW(X&V >=Τ/bdΤ hP7W^xa̘Kť>٩H㛭Vܜ:K$ I<;YEv2IX+C8i\UzH#aT+yEXAad'#Z;)# )#Z KX'dV:IPrylt>2s`1R_'jK}tA|(JCfėQm|5d2Jiqy RON[ۧv&MؾӅN[S3|ImR25 tS};D"85d r78D)Ӆlc@\v{#ƪiN #e>8}fF21)ޗN>EZ,%3s1JB A[,9]Ԛ ˞BU+X#sٺ P8x(\R/T044f[W}Y59Z]e]_-{8~w]ħ4@D+j(?6.R^aZk)K`f O3'7VwS]Wm-^ *v1\gvߦV3#kƇCSy:)0.A)3Oe"4vI j5Z!|Ih`52(\*gK vd+A(V{-z#! k&@krPXJQN(yT@V9_lĮ#78piNGD8t°>:1E.u@2}$M-2Yaǯ|QwBvgf= &\.7B@gCl|{PV˥X6VR :=¬K!%pͅ8Z<H)^ ާCV">s;{]et(W -4x%!Q%KXOϡ :`pJ \)/8 e;y2@ !jdԚ"?F\NLA}a\w^@w u[N\PŅJ|[q2"BEd%Y ׯ_7ߌ*ۿ\VzV+H|': _n=@KR@AsuuԦFU"XݻxkR .tKY!y @) T6/k@]*M3BǀK,Bz>CvQw_M)3e>*[%.h"Tj?C^ Y톦UΫǹEyL,u,[S _lL܈.AIxsc"<9èJ)cNmm(tHte>f)D\oP $TɄ|޴p@?+GO;Op!pg{Zy.kxFlDo (\m"dn[[ !g0xM h@BaTvkT%)9dnc4]eduS6pM83mzOPuDHKWH13\9YX49oW!mcLGG9&/dY!| 1p-HVQQ*5.MIMm'Ӟ %Y2-BYMWoZ9ӾϲzO '6Վ8eIx4`b, |O{=1w fuH<~dX8nlW4ps&mwLe̬/ L0~"sEАF N,5*d!GJtqi+ *>(1S?!CP'#T I=\gI;(N~qѴ0mX%YLYYJf n_'J< w}?X@&vgOdBx|N\ h=8w ^ Xq>Y,ǜܕ_Z|V= CI5I[?1C`S !`Z0u=oDuE$"☤PmsY]Kqu.}Y`brk+p-fao0_2y6vzDg/sՓP.s{2=es26LL NJY`O>okۛ{e! N,h7A*ig7uo䤂)7YA?KȽ=$ uk;gC('*Ɛb _ A5uȘAbˈU]wȁN};K1ݙƏmgנ4;!CWm8uFJC@﬇ W5цguy9 791(fGp8Xs+Uu/hz! Ê #wL=!i{Fhr"J;.mȷ>@DamqXW,F~|LYyמf0UoR[nZn |RdٰތbewemPd5X7![H6`fUy/?GPSM}!X"(zjU5NCWYCP=9ҡ(lIlO9ik}CA#Bᖂ':eO.{8ŤUp9yB> ڂ:x%,ĈJ Dֺ YPžu>Z6;\,Az3~ʟo$|<:mJ8O{{6o9a_ Y"COsFG)eW*:XVEF8J<y"-Bj0bj$7y]ri4$AK!g8PhPKL?aoaL^SPEJ EEtBSNr\wO HO \^5ء WpHs=0tp}'v~6=?w;G<gn_i v7t,cɟۃ` _}#6U{@e5yCL(*}Ve,6F(Sflu)۠P]eHJƊqFN"w6g=6o9ي[H"/0*S$onviﻮC P)a= -!IUbu}b(QuE+8}~C%W B~"jAz̵Wީ@ar 2W##CV.s[e_܈C =溥e|K̂JuMp\ᷴbowoG-U C/%bؾZĹ,źAcHj jw iHB BHz Z / \]*`Dž9)faH^b0,crJM2`70WVuI*)5K, .9U"!Dkvƹl,m3O$K1DIFߧov.Rr\Ԕ=R6^}.I:e Lfz %+ӝjKvL{+W`L&-}e|'h>gu< _gp8s <6󮗗, 01e)bh:k EfPMj7&9t|Ip}#>R֑x~բkD1[tڰ)MNK})#dc^ىt9hd~)T0*.D#n^, bsxHDpƲX2{ !W8M SX>8hC)B*?UQq46rtFn-#vTҩ! NNN +W駟7> B8+-Yi*M9Yn(.c^ڰQ.^oz+bX.z=<쳚)|~϶g=}26f#SW,#T-D_c(TS*S D0c OLC1DKuZE-h;af X{S|-_@kNFJd qș#m(YҸHw h;x܂й^疕p J نSxHG-Dh]jy2{ɺ:86kWxSs|_l TX$8 A 36>1&`f$7)pnыlޡa~gQ2EJLbPiM {ae8 ]1`#,SVEls, {>վg)g5\biw^\zGGG|w7^W5?$ڢX,]]x+^"O+2K"*cYnﹷwDOhGx WnwxO,ɮ@;^""W"V$I )$EQKRzh=֚iLjZFˌͰ6Q$l ")@(bG^YUY[fV垑̏s""HVYXDFFFxs-W|O~kWE1,s0ƈQ=c.]{C/8C`?*1,PFqb6Z4k׮_̍?̌5B. R&\2 .Cۏ=wgNHL\rJ^ c>RV*7x3K2ZWA>0EɝΞ=wxߟaO9,)(5hM`6q}}ounܸ1}WxTƬyxWG9|9ֵgRE϶ќPLdI ɲ8)M>ZI՟u Re !>g6FM[P j2Q*V[|Ÿ!X3Y3vkg}t]5ek3껏0jNjQƌYk74Z YNt$/dWN!wqsF8w*)NG>w37 n]X^xׁv,h 'pCf>g K/CMov=GC Loy~ fxXu8:}&fb\bkk av'úO|>χ|>mݖ#'m8q\'BLDRL>b"fAI>  `S$E:vz5LB:+QbubUE=(6OsrǠ|潩 Ȉ@UeR'4*m!BX@`X ©i="lEwAY̩+ǣ1&SɤobY: c@ ֺB@#FQٲ;jbZ{yD>2@</_}o /a讜Fzw@m|o$#kl6gyy{rzd2xt3 } vB8@٫ Ω *ժvw!V >ȧm!0)cmm-;=vs1uǯTP+%/Ù= ]TQe%U,I4AO y~&F'"|ИDr,vKb9I*LQZC-]FvӤDA]#E6JNQ剁td)E*ˬsVS ^#}*(8nhLjO\ Q,6˲c&J, Z;y>ׯ0h8m԰PA| o{=Gtn _w)!Ox` )TA>j/Ϫf/gӽb0}~>Z+-6M7nv~:Jw]סmA &0q瞻2\ @iιTeEN&*{z19R5%hB0Ԑ9{*=j']qiCJq-i u _+\lTD`kb=]GvG+0m/P%20:_Nb R>yO_u|+_?$P3@LPД4pP=wG;^nt%5ʲn,[v %<ŋ_S@I M5h-#XXq 2M,|w(-\@.(DBC^ ")ZKBXӲDd Õ\{X$U̹lG* Q1.E߮?YAJ; @zR/(35U`L}/iXmUϨ?_A}s0O`rZO ڔC_-.`d]RyDJ/TR >@\E=iwW}qY 3#jڹGQB0&Y2hW]:\|qꗯ"q!|CxG|`HX6 SŷQ*yޏo?~wK5*vmo:: -k2a;[KgxO>w=4G&ҿ$7<(q[y+X1qL)MDGn1 `D`3$waC郥}cNPcˤ5v{aƬi0ݐYع{ȴ.h܄lPP :SSA1/KPt l" b# YVE5ٱXN3)Ek^ s)O5: ya:뚕bKbAgz0諰Et{fIDAT<ˠF,1B42΄;9.lO\7yC`f|Y^KqKVԡsPﳗSk.B0X;x [+il>7Ao~`!c׷;|:>M>W^3/-pR?XNb:e%fL5JcNş1|/}N4;7.*$ܪC:|!;'LE51B "54bV`# 7jbMzЬsdmg3KFTQ7ӍΠ~#4et ёNVF<^iChL9ˍ0x2*Xg-/.IĒk^֭56[]昭뽴dRh^4K@FC, UXv5̂"w_š+W@$(^%K'D WSBw?qS^` "<㻾v@쀧DnEIe_A){a7[ E#/c@Mo+ f^DE HNIxB'vr#fąk׷u%(mPspuفs;}8ux_S񯲬2DrpMIzKbպ9JR\=sM}@}Ԙt}} j|qѴ-"nB(?^me _q ܸ,ku[yT 9թ>Q1PY>eQbA!fVa"UoޝR#"€2JƬT.PQ-nJA>T/]t9&?:}sQ%X] }'"^Ɠ0lLyctU9p89[X_Oe\>F=gyDZ KtPvS0 j`{3n} ?vE@ ꯁ5v`!o+@DP @0 {&M 4p S"%6I2FV.l l .\xf{p k"?Bl$ *AʸS+|_c@w!:|5&z` )@tE)4M{xD̛i8V巢j#bě1W?gl&2!(YA4^T/\f؁f`}1hW%[3 ,^o? 6XiFo!>T`=|w )_PfYx }] 1̰  ˆPƘAVumy%n?|M-l`Pn?]26{ª|=N*FH"U"zuM Ht8g㦱bh,=st~\n>wkĆ0UX;ppІ-]R#bWxR{2(=[P_i5S l82HD(U=L%X%ذk,$-( ǘY%hEF"ӃB8#FFA rzD)ԇ "{ k3@6Aӯ~Tb݇YCع:?'Zt$눧~я~teTAN^ަ`17>p3aƅ?-1o0A + [B"p )UI#WAP]ō6O,/kjT= hlc u9|gn| f1(Pa7z4n@T^z"B,jTkS *<ȬaSe'Ǥd5hR j' nZP0M es(#?!4'1⾻W^Bb֪yI\ T[~LE?Z=, |T~lV킋8uVY?>Lv{ vN}}P(ξ;J.5~wF|< RM! ']8 w Dmdp X/*h^n#l[5|],MD!|Ox8pЎ^%;0uW AE]L C 7E2t7L`/] \l}kʪ,ia ,7qXw(>RMij_;Eilb:3 TaPq%>ĈqŚ>ߥdQgEQ-/Grmß# o֬}JS gY6~g=&S5fF3nDFQw[aQB_*?AƂma GrE<ܔqHdUZb 1yks() )[HQU'b&9 sE) ~kx~ *{ڝ_/A<ܯuWg %!kkׯ1y. 8<biᲑ+cʴ. .)Qr п[A?9srQf5R l =:E'_>mC'@?#?cǎ[Ƙ}/k <ʝ@;$OijB]YB[T1@+:9WEڴV9yRUQeMvp & `Ђ ϿzMF]nQrKڧ\aTJZ0+ OU %N!ع7*# 8qME'M68nx#ױu~CU|7 g`5ˈ];ZmnQQRB.@"VY"o\%-nnI1|϶Oa.##S64SX&ЧM}z'is$VC.?ir$G4s^^o>,"& @uNt( ,6 Bl ;?=w.[(n{ ;;;9JxC`?J誈qbA :ʿXkT!XC(o17P( Y-b#,׆Gyxqн֞^0MXi:4|l[63=xq_{8q|=ʕ+9۪ԫTr*~-s̵_z~B>Gj8<[!!Cg(ڣ?#ȔhXu!AdJ>RdnToF K G&,6֗/H7o;k ֠mZ8.(TIY=L#^8}A4$iy":|ab484ہI#se@NRLc(yꊖ9volR4{W r!*:L^=s?)M:@)}ޚ2k'u9FTsCwU.r$O%JgZa.#7&w]cx!w_xz%X~:НxTHLX)U7.@ `<ÄX 8w:? YHg_&< ~~??'NdՅ|x%A!2Qѽ(OMhmw!'@%}aO(1P"O0rS)!3%~AQ~#:.V z qiƂrMcn`e(e"eY{JvbcDF\w- xx {@ܿvWѨkd ."De{>K[^ ׇO>ٟOOԩSEߩ_ cE5=_cg)`\W }B!(#fԀrJx iϪ5"?wLT5bDXYlck8z2NĮ>Ÿbh!߷yݞ1,Fo1֊MCub1hT9+`Df65NM\9X;/XcxC$/6p-=n}ᇾ`n3O~]oʨ,K! 1F!V]L @>jtΎ,KYŷ>[V V6D[KQܕ߷$Qkݐ6(#+X簱ޢWqǽd:^upwxX@FRp}^*ޜ%hCP G(P E//a}<}~}@b%w._+;Vbi1\sSSA)5~ ƹSZ668 F Y6h߳`.}ġ1^lƘ0 ;N-rJT_eIRD_K(C:ÌG%ଫئ2K0)!-Pk.|!?n.3T zI&7qq_տ)C'6_zZ:eP يEtZjpcbBZPѧb'#!uCwH$eétʖ9aGj% jMS3WŪ`gqf/z98\G [ /y; @>ñVBSb.0/+Ru L ; ۏ_}~P8Cmہ*/%u]+a))`SUTڃL/D/ɑ'{pcsp䴰JSRw 7^7^:H eDJtLʂ Jŋ HMNVk|I K0 8ƘjR+J֨vZOs=kx95U<0Kx} } }ҫ?(4` \|g~/zX\xxCα,y(5͈a#Ӭ(k |*Ԭ6΀W0cn.G<#\; @ @(^xK,4evw^7lY/g6MnDĞ@.".o ^y=O5~ekey^>,;{Ul `*]lW&AS>XU뭾A'L݆W߫ ^` AE_W:E\yU==TJƝ^"IڛMq})Mn8yNL^d qJ= )n@' MbL/ +pv[Coq?+.!Cᩚ$,mMl\M9RB X9*Q^HQ5}+O |Dq`@sPr!T8tA̲2b n˸}v3,y CK; x Px@']ɊDwӡqkpV k`%j\#<~yG׎/kRNbʺ)TP9L>iz!`6+$ɂ"za.2Ȋ8:M3A5icigϨ3iѻߌ>mo{ > o_t7Vr̓6?B8#mbxU%:}29q$tadWfH_tT4L(Lɍ-c<ڏ1fN?<wo^Ö6ZxXA`(^8;@IV7q+n}vv 7a=[F#rp;g2]srMi?xӛ4Ypb*q/%A{qRSfn]WS [̌τ3h WyB}vL+] !foU3¡_A8 2Zu\eid EhAH&6Yxi-!r&N3 9(w]n :JR N1dڌZtY zoJ855`\J"c,(%:0@cI1@v/:jWk R^|χ73ăx#Ӓ';qVn]c.:45֦omz1ǽ1W#_XetG> _05x/: o#^>ԃT ?<g_&>7u'>k >_}<>pxI 5_@!Dhd1C(mL NM(.ΤI6Wݒ '4ޠ4 ڂ6(^NLj ^jY[1G?,˗vgyi LB\HnPv7; ,~H 0[+~ g] Z.Rc /Fg$VmαrC "4QX,_Dt`g$Yu 'fE{u{(&'9xmńa{LA;c5Xݜ>L")Fb- g֖ovfO+ԫUg`z#M*"KSH6 c;?w׮/={1ve|,US1dem9 \f4鯸y uQ]h0Pu$~C 8D(_WN^DYfPs$ &TO(YԱQl5br=b-r8D$j;ktRB|uӓŶm44.&?r@ʸL߆>2{z>ф[8Ɩ$[w-QgЯ)^&9^Z8OT˸7EztrZ,fRR*"k^Ɨ/J^b#HYՁ_F ^{yM%w2z>`]?w#ȇw]JY?ÏTO;kz,圠ASC۠i^k; kT+}Goypc2@>f$;vy2_Jm¸*bc`mS-KjClDXN}\uji/֞PBA ,ڲĭTק`:$c@<`pEGZ4Wu1 jX+uއ|@]0}?#1`[ P馹0rls9@Cȃ{*Sv㜞=W8#/p|/ݛ a[{{B*~G=!;r~"=~~ \}EC YBW-}Z} H,vUE J0Op'({-UÓ J)FZ pGn} 1/dIQ'H|aԁ3v)at(y۶Fʟ ւB!US*g,Y[gbݢ49­r7YT[p5=2t_ :B%@3HT&z[O dGᜅ ^1p^(3>]/ӝCX=

H^0Ѫx)g9ŞC~e]'<1 yܿNH嚣PwX ~os;ǿdl6xcÜf IǨڒ5Vm8gA`|1I,82E9Er No=GP"OBc~?al=}7Οi@kSg"[9@ |,ZH,жh6s1ex8꩝꣛>V t9FLӫ+gv %V< \R:@߫rwTM7y ^G60j= \} ߃?evu|{=ƈrOo`*~| H,C`Ux xO}2b٬RڮW];i]>AO\Of7HL8'Xxe?b9[XɨL۬ a_'y~=eAՇYl!:)rZk6S16>&4z("]VPΞq ..c+Sd[ c"W`4,3\r 61q35Cd >ۯپc%RiM>^S ҁe$z 4a4g^ FaN=^ z:b#֋j_ǃɏ߉->Z@z@S\`yU>^p3>18s >O8ndw; {L4*-yWUvs!H؈Sx';OX.~.17 jXF}2hCH"EwdSB 8 (靌%,|;h0{*#dFh(O1|o?= nykiysA S7hK;k:À1I:T0F̄#taY84LZrn\%YQWhg9Q| pR;>|~+8bz9Ug>яfd8HljJ۪a|߯l-^~e|DuhacMb^S{ VAj S&Uc"C )f ﴿^Ν?J6X obIo!H^pԝc"&""Bs3 63HsDF&eWitPa+4E[d]Wu8a|ׇ%?w~q@$‘n~_Y4s`dbe_2e# d\0et{xY*2ے3{m؃=hTD? [ w='H\=#.o__S?w&M!{/e.<H>V-~թ%T~ Νoo`gP 7f@_J|e0V Iva1jԂ0xWYE/thg{?4joS;si9'?-w(b;5 AWdVA'> mrO0 '{4 >`/;Wv.!Z[)U_"/X Df >M+ 0:)ʅ'b}^xǟC<A H&Er HI Oau'|Xd̪a #}V}#3D z;)2lz=DZDtDgo6r (EI 8 n]766C?C8z~_U1%ZO}ʑtCD8}4>Oc{{{hTfaýgc!'H\F+KX$?ĹS f~"U;DusY dF]~dKNz0ȦV K2fB'0^l}(L^^]T8Hï|< fP3-eHA/I0݉ U `$2P ǣtyEB2;1*GB&p>0(JI2 mL9Ǩ;@W$IJn(@ќGxnBظb{F~q}|=9?B;1`*x/!=V}n3{&X5=J,0d("Y f{O 9R\ƤPM}1aIQNTfuX+M#iOUeAiG]hWAi#umEU`CC`bf*GNgvp<'Oww;qR[?Nz7k qį2fGygZqy8YNM?xBM3TPcU?$U!X1wWWyfu%GR9n1LX䃫U;f${P1 N!w/܀'ʩ' C2m?hW_ x ŧVv%d84`k`XQXKm0`ac |ԳiMS%9!Pd$Ӄci8km`a'))5K3ݮ̢.;OIwuY@3yl+2>xSG)GAR1 g.w=s!rV^G.p&DXx.cK%ĐCS|cX}u'S{<`%?{7L2oc׻ Y\y tKW?xWߊ;cP,c> M u?tЪ``mUO-,} Mw%1#أrlht ",W&5&$EC]Dlg{5ظc晘!t3FCa>JgG}c |t|rΑ١@U"J#+K)6G ȐfG fw~Ƒx_ËO>_7 'Sv\VRjMRt:noDg R?#L gIV!A*w.B!̞۶mka"F#eb-!Tw{n&\yxj 󳇌ܩ6`+hMBN` P :`|DmCcgSxx? [Z-?^ej.{c\U̗%/[On;6py>"WG28L'2>lQ|m .=Ç8zQi8CwN >VvO8!!\qX5uLn5ˏi5ިP4j!{CA!1Ki"e}ӂ"(F~_^5k;@[8Pqb_bPo %RsBa4mpAL^@.bc!0Z%kW:B~IRhZjX}@XrՓ*'c? _ݭ븂鳇@VQVL dFpoL_ݒ>ʽg!C977 ! tO)QZިY#BdX2lV|LQwuR O+%%[89G$&KA"F -:$ ~?3#x ~n 0<:xg c!K0@A5PȀB TQ%YSҁFmiqƬP>;ZY W^$4-MtV{:+ver}s4h /Ǻ_KD2L/922-^k=}'o}[U@Ó) *hknկSCr]W3}?#hrB8x&S 4~Чu3E0ƴn\Ӏ"Ne}R4D,2p"8tN <4huMYFb&a`+: XI0qC?_c눁qs/Ws;NK0L2hշQ~r62d͚X*yQ|5`LL[RQ ;kȄH}1$XP)c}2ъvO\ߏ&z1?^Lh)W̼OKl"(P,1,E n\coO%/ǻn}ݙV7埞"|j꽺cę3g#ҥKow?48cb݋69MeW5 `y01 Cy?@}Gw3`ۂu\8!#oZ9'(/NB"RaHL@ AJ$ !B˺"#ȺF4MpT}~pr&S](*)er 7u#pǩ8wrkvəZIͨ'-Ȁ\>t`&N[kp6<8)i//( )\@XAhZiL<ãYz\"pjAC Cz^jW_}uDzjR[b;O sU{ %*c~`[ǂGOߑC|a~YrA')tκ܁3mЫϪY\zƭ݀5r(<3GfPD 9a9P짃uRP1C,; nkWwp5,p+[5 =? KT k}9LBmZ-ƀLT I⼨1( XKe"OPN@9C<aJ `^++LCvͮ *:OLĻ4{Oy:=81yPaC痟… ?ɓx[ނ *7[x饗Cfيd?m$VS~Ed?xyoCmPC[.A;?, ?c9O7x5J evI҈GۺlȠ; V,%md`g56F 23IY *uTY&*hSmcLbq<~_fs<38ҳigj7dPG->xh=2LO& nF!-Sto,CKucN풔pQ~v$>8aJ2z w6S.|MG/9:/ᮻC=Tp @]:K.W_O?ׯVMv1xa/W7V|gLC{}VW~1c7H(FJׅoު{juV1T8f`N!xel+ ]e(ATG\\042ƨ-e+`NBTOs@$tb^,(O`ퟖ LNaT8tx_z1cmm`MY%;|Wyj[M )xJVIyk%u Ny`qd.5駄Xqp~$%pe#Ayl}i5 cq}ߵؓpML00 L35՛2]ǟ?;xu^x9smԩS{q]wĉ{5vqExrfdŋ¡Z:c(I!1c n1kCgH &4ؒXl mTé7'bW?x*u i%xwbmSeha9E gD#ö.e&8ȶ&T Ԇp)T+]Qeˁrؾbw+rM^"06d|x`"ցX>)"W?eca]'-Nu|%B{]A*bCb@ :Oݎl]Lj *d! Qʨ Eit. M8MӢaXJ TV+כ A8Yvq Ip> )U}qu{ oƖp|R/kdo{Vq6*X|b¿G rl-bۨ#Zq@Jb$+Cr@#R eL1%17 ZA ;uo>?^(wGMwh?𸂂\;,.]3g#n|鉋_8;IU=̽\rzI.?ChH`)zXh7\<{G?@x!KÃ⯅?u@?7כS?aQ8[MJΨET8/f}a!*9{,K|4q=Aơmd%ZlLPBbhL4^72*-U.q|5{&ahEАȤ/ h5$!0O@"͖tg `8i,YQXC* Sp,BuE3Fr8+@. ]'<(v@XŻL DO8xR-*90}0L-}W. d /I`;[<{g/>lƇ9F{ Pok j ^]y3-so{’gx7?q*~DA(>9֧3mfYa}j+ZI Kc}D󌮫A&5Ko9 Au* .zR-S 6%o@zEO~bcg OWo8i4dDZ&=D_U! ceFzxmP tx <24Lь*}Ϧc)jA{{ a4ڒA\\hwdg@2!vw|a*Mlji3MU.wS1jJd*4X/YU\yE?VxbWa3nUB^.N縋u0^P8aևƯ/ ?Wx?K"6% ]nO]Է/kvH0gN2gb3L}qVxj*q%6im|bbN,bB6ђH3PP19zH!);.Ey+0𛯃MP`b)lY'C(dc-)S@SfNr<D8Va.)] Dd)CAMx>c)~hq:b&C0Gyޛ5=|O5Ļ eL $Vy Kl.?{pyvn!tPրyrl #-bP!,﹉ETO75fh41ԐbO zpB,?Z?^|=,[)FV.12,abPvM"x-J񧁥M sBsfH=sm ?9uRlߨ+X6l)b@c ؏ax+/UM uz4D[-8~Y 80 cc T# wk3k7&9X'+W6SL5r/v1?K喰  0>/naAwc`3D aEa  -\?*n?yoG^/Eߧ 7Jqw{5,aY18V}s~m+5JDM|1!XgahxKiB4 ƀtr>5B$aD)Tj*]S-|Li=ua?_o~_%ؼj-N_C,:SUeDd4S\ƁCXVZ=jҖSjLJiQX0,4bpSOA/*r  %؎{,t]f~뢾w<)Ŏ* T[UƐL=׮+gᇏ7>b4 ]ԯ7SHO?S34F/ r[Ù`î7+Y,w|+x,θ7F²FC67!37"  l. 2jYDbz}/v1AB#USrcT͘۴0FfcvpDf5Jb-; }`X੯e7:H,^}b+8J*cEA@O{r3A7e,&y2lJ^R)UAtTMLvu1"B( G|e`%b#;f7\sZQ'I1Y¿ ˥}B^ ^h|!+ȸbA d/غ:nn?1Å+*k>!pW `AOlБ :4)gѠؕ"]ޤi <|ggj]  v )dZ 21:4gW|xs(LRIM%?@rШ]#GDY7yj;A[Kz;}!XuM%RKȺBaNG3 VE8}#~_. 9pX_}@`OшuA8YN9LGKYO!Uc|/OFR^h'gq+&5/ᦼܧCb@{Y.PV1@cyh3DI^.__ufA F2cQy&i#ԑJ#=7s.|6|Ks\eI g-<&U> C?.qQ\iH63Eׇ{፰x!h0 U CMCfPퟌT "v l[|*`l.mY_>b%<6^|G薺V&F7PBJ0|\er`@,'x҃Zc,5st[p K2|)^-cKorT aqq_-w%G9 ! J_Z SPL8JzZOql 3[bqu sg{늢?>Ao?hǿ_VAb* CHv( F5T]SPkhZOu7;3ܣCze$K8DֱuB*ֱlaU $#/s{/r%{w?{.0~buhT"Yd,<߹Ttwjnʽ0{ǰK̵Ր:f1*0"Q6K3im}|gفǸ?`/K_߫ŊS|8m:JoPF& pȆO99t"4 ~`,uvF3cEFhg\gqru)0lꀩ,rq?Dޫۣ Uek ʂF- 6#b]g?fϪ_{۸r ._oIB)r*yiQFM{U=H%xJ޹kotMjVsUo}kSkD5b@F Ȉ?8y&#d4M#yp }>kNjOoVHNQpkglNDĥ1"!x *Te1#o\_lj˿y`'ט"A?fBH,XZSC@zC.y4<08xl,e WUXyn>c׮]åKp? }3(W4\dס0:Zݓ;k <={-^ᥝV~TZN!xm B`)A +؀w'5FCrC&Gƒ겖ɾ_.R82bmt2K{1!H~ #ڶaEuR'0Jy)Qt$R6 Q-N<><|)4pp~sÐovFVohh:zH6 Ẁ`Zu/9SPƺ"ЩnVGz&\ S[857\:lSg?#,^Fce1 $TP&n\ Ǝ5S>TS^ٛՇأfDaؤR 1:;v GE۶`þ=Z&\k׮DdsjP0ƷʢpU$d'X{BF]pxt`m]^0@4Q/9H1FxhLb{1duؤHjW"JAQ1ʔ6FUr"fB )dfZ I$|֢q똭y8.p8 XcR(I-yN.N=Ԗ.xU7+ARNC2/kU#cdCM6Nlic1fY9哹MTUj7`6!lu h^$x 2Yz.giB*f)bb 2'pẐD@IyL/IObb7%i^݊b CX[[S^U[Zb\.nܸ12RA0+σo3iEPCy@7=41uT D [\-; X,EqۭPezW B<R@ldCyN.[A=LzIek!(4& mlkk'Oj􄥄ILAQ K%.ʦ RLk>:= OQ^BKCNy%/qđC8,_k^usZ  5GHr<x.>\8a)iH¨;~Nq.9R.u5;H*ӥ}c<|9EK] ! LĠx? rq|4lѶX{;8 zoHMиmM#omۊd3z#xb\.=CE/kk\h4M|i>:<>HiE(K&(I,f>J^/>9=[oNF$ԋA]=5X+E܊*XQ6J!Oًų âUVQȾdI,/`m!T;àYmn{D}! [LxБ 7m^(ZA䛕/=Q4$T4' ȧCP|4[Qͮ#LT}iڦ[^3g)YTGR7w. .m^B 羊O|yXd7H240T,t#N:Bua76:ܞr- jR %N+;dfaZ\:{g+ @y^L~_<|YA.^_H\ڜzwѴ-fuİkm M"&ŃTvyx\i51߈ ݹW,65J/"K6+̀!Kn1hrç^2q3(8bA bcUFy1Mj/ &U<c.LKֻR_]YŬ aAYH? s_/ֱjx a9b ׀n$yU,M ,G˒'ӟaEU)ʁDpbw 6BkM5KݡtuPAɄPp}Q?3H#v2>+.D;ա@NzK,0wBFP~ ؝KӜeHuPEÀI5!%_A` q_|2V= ;')qt7ϧO;{u5|zqzmeF { h\=X $qeaLNl#WV\1!)ܔE`Ac5܊,WNQX}D1jAeK}RjhNa1O݋< ZGx[ų ƾÚn93:(^\&el2k?3s"Q V+ B>N#2TSC~vX2'>馎1p.qOyld6a~B8ț7}%xyWwbWpjgpdB4 D;5eg.~z J'HgO^>s" 3Wqd6l6C p~S4F1-4K(6ҙmF_;2Jf訄B4G-M,%/)ch;'cېX1Èr7%u{wǷ/;׷RӡXH|xV.bƙK|~L$\A,@)iQ"+5"pLʽyf T g耘1k[ltjESsdj~x MPvBGأt3\WԀnPNdANv( /&UAcߌ5' t ' ݼDᒣyk!7b6ւC.%>ɓ$tf{4dM1f\9ig6):Vly6}5Wpr DG֕J&ϕiY&2IKDDHC20Oc3|10iMZ[ite =@9e:E'I?U{y6Ph5,ӓuf8m ҡC|ΦZ_- i[H1[pˇ𫧏a]vo%3y 5 w6xjGӸZSJ:!Zm-}hR/29 YdG3X.(q?CA#m=RpzQ^/C f2 ȸ+m5ƈϼo{}piU WFW$XJD 7lFX]/)>ֺ,0DQ-U;F)1QRQ( 9D,;$:C @/V!X%-M\1߻ f kkЅcC04Xtz3k1iӿX&/:PuIz ĸx S;hC ŋGY[}RB:7z8i[Td&ڬDh_16RǼJzM4Uk`ztiI ~dFCW~Aڦs`VFRf4BqO >B"@\=/'׿ / b9蝌cwyTBex)1"rtߵMb0B^Un/ DDCyuK-|pĨQ2"M촣q`c$t)F) DwqS?X#Zg{[cЃ`f0?&o"x\=㗿?#5s!`{sBs+Lݧb'j,(_bz7WNo|c X[[[B R7Q6ɦ$wWwQ=_%ء !`~]QyUQÑ ޕ?;+ؑVÙK)R!ZUiʵSy}-R{8\)^/&_ z(S+MIs3}nq^h'th4 N|Z5*=L^l b=@ 7 I :Yf TN(Ft1‡eFQ"(V:kx]~ 0 a7vHS@蓛8)J˘Qb`L=p!ؿ{ǾKncBH{D0FiO!{Y]|,vIjQg)|Iq ӌi8\[p/=㗾;.~+.1AB+iZ4I8A NWϿz/^^#Xߐ⿶6G۶o&wS)^c7>TK\ <ԤP/ie`:9A 3aCAGq:ױ^:iдB}Bb:nLf[<,:X/Y QmXA¤7V][a|%T?CTb};^| o *C-t źgzb 믺~=@Z-<9'F^;(5Y)xjFn V4FԨ9fQFr 2}WRgg[ @׸(DBH22Cb%C QZ F ȺJVU&N s~3fN~֝sOߧ@/-HD6~##,7C ZEY-OBpG%Q23J,YK/Z0&\"G]DʩM?VG0[!ń@g E7 4)L8x]bsTq۾#W;=Ësh}WhSE PGTZD^@,D׿ ]_:֤϶Nviwa\89u&}cDh*dz!Ю4 9ht"'1fzH xigۏ#W [Ċ[IQq\z }$xpN <~a2g?d &AtA?Wwijpւtw evq ͺJ k GXDZ3l_.ѴbHz%>vzcgg5ĉ 4U} Zft~U2f* rҤC͵_/_[=2gOcW`;R:Hyj0@>i@ۂAu0! !OC'MH{DsdIwA tлb THGafzJ{UԥQ KU9ni >EAz$yՎSgd^ `}J5N_Ө:`!ef1C}'| ;6L  ϳ {A~>x8Dr_y~/_kR>YjQoط(:}5 J(f3Fr2H~q׸{)̀?-DҤf`1r ^jw=f%;U8c=TC`߁}_T*$X I3~q/<ߏǏ_{^|4dUCGTA7^UZn2.1fwOS)(o=^X9kyP`^Ja`\swNJ5#@hcpVpNjQO*3{Duf$[>!,!U^Hxxmٍp#8v4tWTi5P`9GOI?kgծ? ֚AO¢ejvGTBcv$lGB5u׃ O )BdlNΪ}cX7 8F,6>迈 0A0rO|}#?)[9ǿ~f۾Zb,i ԓ.u)!MoU&1H~q2|M C>HC&1gmq'' ZP &f@I.E\E2w53zXvh޵ 5C7&D1`[Fn G6y3:9ę  -hKIDATv^'1X$f.scD՟Rœq" 7&In pD50@:ֈQ !,eJ"[F _`֔*QzI %*8B@h^Co{;..'#bV3H?ϵ3d6:@-}2sKmDagTAu_ 2Q)E1fм15FKCg,&q@ &&/di 0YԴcCJ=:Q:0C?o܎W&֮?#e`e`̰Nak^qᆻ Ƶ8ٔ.m"pܡgWb5m&t  >(Nh11(f%+)i_aҐAr##Ѣ(s!ަ;fagy)MY ڡBBɣ\fShŐQ}Wc=g'UF 2(k/N(ܕ gog%0 Bxz  |s跽^{~VC@X!&S W<'6CFo-އlԖX/]̭҅JC6Jރbjt+0bT-o}Y/I^%.ܡ&|WlD5 "ռ@1pdT y'XcA0C<\oup 7>1";0a{U-3" AK\rWTo0` z4sk!/U:Kb' Yƌ堶e0y$#):5HEhȊ=^+@v6 O[m];/oG9ɼS|ͮaV E?"9,k9^^lҢEnpLՙ}雊bPh ż-i X>1F4=9t6}L8fӹX֟QL`l |şG=RnEaɔ CqX8Ȏ\A^;K=xȡNBE*5\Ip>C`5r߇c`ul'ӋCIE$t.);{, QfXv[lL˫ P,`lI^/wQ {(e((ƀ ȡRq*mkM1µG"I'MJk\Y@^%6ZW!VkZPyA137ktV+C-8!%IKZID2Z2V $aZl"#VR['P,zY ѥ]%# &)pN:]`)KճtS 3Q> ĸrH-׋Mhv(񂈳_G&$U.;LFCGw$"we-dO"uУi{:k܀[r5!b7 F $ȉ\ '#Bi_]m6#E<ى[&F31{ y!@=q4xׇm ;|dwJxf'{z^^Mp98 ,!L[$Il/ _/KLa hKŲG B9ik0V*`s$A鲔/Fz}R.*g؊i 4"kAky3E4ߕ*4y$]̭E1 )*YyIŸ:]J۴yCD:H.X,c}mHpNNI%E@ 0#Dκ:,wvpusKO-TY~fB/o?xܳ, f]Y <*[|@B3`3"p ~Ѡaj%_k,NTQIЍ,} K #1]Lqx RsfAu La-FťNN^!3҄DC&R s$]`bdA^25"gQ)M!c*qVfDU(nDT$S5kJPQ]JU,VST" #'b@d8ܢ*3kpۚfl@h4l 4 Q=st}^ň1OdUL3&?6+o*[5m%03x]]Yl./qjxLڣŨPRX7N!UXi{IփY4ɕeGzNר\$:B%fr{Yd25BjBzFkHN* SKV!D(G/gSC~ ƶOV^`ԉ+ȧSuʢ5 byc^~ zf&ΒN{+z6rR}{=BvoNB} =^> qw4|Ł 8M ԈJG𢓈!dz"Ba.N_c3%emWcMbGOY;%*L4Z Ats9 EZﲸ ʒ|%;CH;*߹@=.3D yrxex8 \MeJ9j[3/a+W-~PRKS>z{¶rONg3(=>NJ"atV))]TS6UfC,k)He2.'( B' FmmJ0.~ gr`1\8$"sHУ) ip|hqc"%v2K9"rFy{QF8ja,'q\76 $똧Lg otlL$s^~U2e8r?rP4 &ubXXb8ط}/j^K`vX.;ǎ/ (t_Tqigz= 61M-[ç&`;r߻~82wpx?k/==jGKAKOHi`[Qܜfiv8*^x<V/&[;'dƪ `l-{|}/u #D ݲDm u™gFɸ>]bE tC "y `Hf P(>Ezq*a>$&bf:]؊ UaU|YD$]izCHIv Zq` . THU") Oы_&#YxJi&?WdzbNFo`/ÊjG驊tZ}:TAڌ:-gdXghw1(EQ]2) g&t@$v^ŤFY鞷ޙZLʵ(<=t)D|~㈮%lQ\1*n=(FU$L郆{ƍ uʽ=mf{0q4@u:< \sՋ{r5-\7IhwF#4c8Kxo/ogdkKMG+=BVOZƳzHd,ۜ6dN M`B^I+&ۛIi/CqJIAJIqN̬vn /HY":X^) Ӵf G0:53%FPJZ2_m~^*QDa}^)PD, S VUoR>XbF?kfCģM,$PRC]4^č+exVZHs)"G;W'ZA;LWŏCԫTĉW\KZ|?_i#4H1nغ[z>33']˾lyLYw5D%rq&P8+PG4acm,Xqjg{(c\z0u9]sIt{ulDKm}buBtb̖)A6sJ+3r),=kШ/De46S ]):Jyw+sS@DdiAZ}.X{\uZuF)eAWdk[p40FkA*« PfI.d/Vv޼m55Y<5)ɤL%4Y@@(~]k4TuK w|Aqk;YGG_"˵K<5˙B;< P&jr6|v3)(,w0w9}aJ{ekTh&*ٱ9\k_|G>9{yy:Jo-4y$ MuQKAv _Åq{j+Wazn\/VkW3~,|ˮE(,bG=|@-AڽA-7d"ᠪƀG۴:60Xvx͓KsH.\TwORyN"#fL2K"Ѯj0`6G\ =VCrgF}uOnR+98d8 2j7pb!D$DeeyCݏl{* $<9Q3Ӎj>E՝Ln2/ z)1uv֥h vcz^7灟U%X4i%u-RrZb޴JYb=;y!@)q3̪3F&EVtI4)edz^_>˾C䠨R4媀De/xP"9ȱp5,|`-,!i݉TdO(|64xFrqLƊ@@q;:νɃ `aAIIdZ-ɒ-Yْi:lcvkk\[rZ*+Z"-( 2A0 M^̀&T 3~ݷ=;_jaF0k@@6Ⱬ/{<CWOjxӫx#ATj%qլgqKi僆iќQ( &p枏[۱>G©Ç:H!cQܭ޵S u4HYSv;,p#8&[ ڮͪOndX1dJY j0qI, tx2 O2CkkGԵ'pEz\|iw 4)~4|w6gp8ZUjEiX(XK?" cl)0(\c`jض*@GPC)Td`˕_x 3cL  T@=hI9VuӨYI]B]jp#>y83c'KK0΄>h)= ¹0hFlQ' S6c0 0g'S2#m ;ţpK!'VJl%jB6t>9 M~YVsh*"1Kl"(i0L&u*85CRGi۵MSI1RY, شy>xk!TDXl$vv>xH7Mxkb6nߢ,]12 ;o0v5}\1rx(ka8PZ @lтPO9bSc2J1L&Զ-paW9`P/fd/*a< Lt0}4HBAW'JZClM,:y.mո$C* 儍A>&B)4 ڤ6Ĩ X7P A]w7*c4#9Q%44윰j+yqXCo%g,6̉_\\{''k.jvˁD>$ itm3h2\@5SJa8(SշK @LMs+B pmWE~Z"̦yx8 d!ziFT &LdGfD۶o;cce6ֹmJ@[DѲC3k_:T:yPhB&DMq5رy 3Ǩ-8{zm#Gr5PmT5R 4+"d 6"Lqqm{PW\pJ. J;"s%`=W_ǎ\:Z6Ǔt:!d:1 0]butnXQX[[WKպ1dWrwà 3,ͩ&!&!84@;C@׵QKB5ۢ>1Ìl8t] FfǪ֠nL'ፃ 0k}bA;:aD0rTBϯ+Lg3 ȇg ɷ,JIKe۶38h0 DH*=NvA̦StܮE׶p]l]V)CPȤࣀ΁B@;cN0C:0TZqF) U! \0j:3|p$ݏRkEC:Y#`/u ,T~Ow V1w;TE;yfX;ztrpa' fCиɕU~'x'Z+XE4 ;6ѥRl޴6nd:ù簲uCxZu*ew\p & F-;i%F)Zť% S;Ȁj6BVl6ha `2S1ce}HM!BxeM',,,`u<35sA-(<,5"Z.סjpm tj`׶5IU 覢4`=p ?{w]EL֥\P TQaڶ2sbT5S``(Bj2Pb`M+4Q SvReYdNa[oJ´L`z׮40UT 5fhY7A` B<\. 1c4a8CjFҝt)47bh B~*+^X\XKR݁1 a`lm;Wa}}=Ɲha#|6IoiySG °'T g0 saia[nŖMq |+yRTjHWWصՑh ,AN/jHI79>wD3%nl>Xf~r>{xɇ`iABֿs:¥/KO߃߃AEx),kgR )/#${a] z4|c 0d370 ;b&zA+LmbvΝ¹bwujB G""3_0  k$@7/!b F[uU8DGa">=bwPŖB9]I$.HJͳ$YRyu99nwY8u'ϝA\(H=N[۶o0kglPՍ`i瓧<*r8OXAƢi- @8A4ZsMHӌT,6X5SFc`űAfөyݵؾuVVqE0if,o :Bͺaaތ'S Kp cߍעYhyQVSt]d1svN:$欄 }d1;tj ds iNHvѳЂm!\𰵕D&MzHh", @Uh !`ax,4Эh*iEs8r(֦S99U%unPbZYˆ1{eN'X__}@!ͼPl izƗ2b5q߇ >|Q=!a Zz/okn@]8A pau&E~*y)Lzi׋vSVAkSkVCp#Nճj*V ^zG^q;P655`gZ\![7(a.bCMvc:T1eZlDer3R-4~=IR_J8vT*֤WĹ`5z!$쵂IwN1sy<'е^"RNdq(0bH ko @4PZRbBFN"K}EeRM Jˌ5?>U4RdVr{/R~(亞Ǡ7y&8AIe\m~DtNg4"Q:kSJ!X8B@\^lݙ:J-pNw!j6*kQY/@&),ʜTOgH4#Ϋ<׋ \d7jAdV?"1UiQW/#{*G("4kcL姞ĉӗ@m0S#S^J0u}rF0}~ +ɾ:`MDz!WCVҕ*#_}r(VqC9&Xƍ}9dcQy~I8`Dry𓍕JQ i}W Ì*D 񷜳m5Rw6ZY' yC_ *7x9hZUC6dQJʟÆ5{T]);ÐC70^Ÿ} 8wa]33$gFMɡԩ.>Dz& Y^gXK7D]FLXL+E|F. tdep{(qܸs#8u=@%NA@̰Uc?vo5o'=n\Xߓ+tG1]gUuݹL knIJLn&fr|)G)t@XԵUeJStjR՗T)0't DR!'Eb'z,Q^͠PcN|a$gƧ.!gn$Z!tlsh;!~qTF|XyF2F&@\- 6yS8YjM <—='ic1Zb: pFC,0Sm&q)l+,EgyEf\%m ~;=p&>I٨̤Ӝ}m`NJhJa|"Egwc'JbhleG~&)a,ST0"];WExATȄealUlrHI8ep>8;Pi{riYcUժ64jҺ7=q\4AҰZLZ9G2w$klX}7ҍ6yӣ\Un 7*)}utjf7_Z'/ʰ)]Me+9ʹ^@G1ߠ[Vv|VbJ'~)\>7N\Y/oUުI12Mp&VNx)idx'}'#!d/Q%zj 8V/]LYfK{Q|@nq܅;ǟ_Ğn@]7L?4lBl}5*H3_{cnFM^(z^PM[ umNfj,XM ^V5NIk __J wO楕  |lr<$.:{DqN;$} *BY K%z{e;ne@蚸v^)ĺYB76c6F@:5%L'J]E1Z<@CFADVJ \uzƉ|z&́*^P8Բry-W#5P΢RJQ,xJ# U#D茴_|ȸ3IDt‹$KXƂ0GbeEBX蚴R<׳fx33cO+m~{ Ĕ'X"l pwO ScFDɩWƩ8|1|#}GU/ V>0])b$ KF`\Ps4~q ܅LZ<ذq ڳ^,bCd$un:wJTk6㯆ihwsrVEB4UE,{JDZM])͔#>Y,'VvV^p F0} !Vw*L-[:tk&U%5);ՙSlC3VT5n42iL*. BjFz le A2Iԑ$ȉl7Q8Zy7CPŐhXb1nt::~'<*I 01dPg^/EliˠTj/#${d9KHV q^m3T6@[Rlkz@B;:CkM S&TX-] {hl3uEwaAem? d7E[uH llGKq˾:p1 tv /go{7czy`ٶo_~8<~B*Juݖ(&p"0WUK&SqBlc윸yi;[{PLM9D@z|Y1zO*'n IQ0(3ZX)$֢QPN?܂4)&畇@u:ae"N;>XwĘj%D-x]08'^ ROpd§NꝑPr 2c _]\\D=!/Q{^]YUN< 1l초4G)fzj'ذ;n Mg8wn.7E,I[q3;bEk{J@&deq m!usuT1VY5I乊|QUUwD ".16/,c|uQؘpCte4 ;s^~>{)LzV D?K`YP5@]7pA1yѢV6/Zs!vi,l:LWZg/|~1Sй)XH8Sh!7sͿ1\98SN‹W)akӌ nW[`sYBsyD?ceA51\*>gvՋT 8棥5-`l B@UK\#mQĠ׵U:+Brv.'W8k,h 64hD^Kq-[cD|7^ڪS;K.#302jZ)*um&m]Ű(,uJ|X_YŰ$k,4 24t#!XUU"?d1ed%L 2+, }+g^QySTbx\ ?zm&t弢̀Nůahv_iaMo?.m#p ]1Y ټ:\XJ~5[ K!ZO,ig/ov })Or 5C *aL,cB b:S">еcnlغC`Vw-o;Uj1~(׍Ց1s]CA} h" Q6 ^lţƧx91O|PuUՙj$Bܾ-le0-/T;#C]!A&oWvWN)ҍ9IQ*񗲹3CIڈsNA }e#}&ͮE Al@=A8 CuS7,c7^8 X1)*d!L5QT(@Z'p}k7*"|kҁ'[xc<N8LkCP/ FH%m2 `|6F\sd_yo7xv^{-e)u)i+%T[f[%MJs M{8 J OGp9FUBevRaV4֢=lT@HR#I+LB4mDxʂ(a%L8D˲Xu^h( @&+/xWb).]1u1:=I[d_DgEg$ڒ}n&R[[T`qMuL8u&m(̓kLDZHw5^ŎDTӮq }N,2m7C5%̪Ǧڧ(L%&1 Y3OZoV#_k+Kqj?0ͥ'SsO'PHyT s?G_8o"KxGJFp}c.I(qaص88uU?Pt&%j8 ;[jK1[K8㚓Xܲo`dDj\B_ԸX.'"StKa.2Ŋ`$o}J,2_2z{R_0KPJN9C<+X_t[CНrܵEzmz?W ^Yq&Y^XCV6 K !!q)3We mѓs6 LU#)`Ȣ(4C1A+dN5zdb9Z;wjlRC&m^>3gNn;P+*ꐻ̹'>l r͗>a8gJJ\yc?2hRɐ P(\x-ar31nt-vݻΝ{o+-uhdG5~E-5N7{[+Vt0<*/Ezo ⛷v-{?gx饃838x/`}m ?Tuv=.p( 9)1 3 Xj-n~MR. W̚SXϦ Ѐw չ#+秀[>(hIt=CŁąl5:j]cE肗*Z .] Ƴ|k@: MJmt Di:xl9 ZsoK\Y̠s/?C]Bv)֑ϒ撬@ F O&hg3u^ͦ  ︂6-F6gkS,t:Ŗ˸}p:a:/)E2cW:7L-V k lDzIa!5NhEa` N ךpLHCمfųxĨ՘&^b n)~xqo<7vrDM3H}(1M| @^y6JdP/mwwǦok^{] @읳_b.^s&_*c㦭):eT)k(psnH`ڄz8@+9]˸[qlo{1Z\D]5ʩ&2#DwX%Ȫ&HŧY{$ 62ك55(CCM-{V)7{)3ٳI)x2v*2B7_Dz O= 8r"EE8#ՑnTrtNMʺ#*O%m<{ ksbjTK5b휾eB`ݦ:u> u 'E@f羀^={oLSIQ!38=H< (gso.71*En(T%j-eν|H#Mv-&u/Uqst87,VRv W=>g^`|{HF wGgz^V%)yމw{xݾ<{s) E!tZMN+0 \`xk T&)OBJh P TFXj@uЭa 8߸}gkؼy vlݎmb0hmJU Ȁpe鳀BCgTǖ4:I Sa 08iK}Id57 DTQRs#:ջ]ۢLvuUǾߑ)Y(f>q[l?%UrO4H*aه6Z&="_]cG y݆dQrFjld7NzPsuMX''j2Q(; Š+`ݤiw0Uc%kq.:o*5_$I6I>qͲ*8iZYSc8x5KS(°2SI!$$#5AusEΥ5(Ỵq puqi"~w~_|>9CtdT I3s)P\9k kG ! o"X5Th} Vl4 aqa!wcvT(y9(4_g77ތ_zAp !$L2 /q *.!-m V/syUع};6-pؾe6,.ciqQpV%ou95$o &q)"$U TGK ֗&M@KjB2]tHM}xt| " UlxVoqoAbD$6"Q#?~BHF}B^Dm}G(H{>T9U&6Try` OwGi= jQMƅ1:m;- $wTSDgQM$B&+H&e %`pmQ~-ظy3JppУ+ ԜsB(p} r XYt]keCW@.H>]6'l1vb ^,H\"HhV ́=|+̕ؾUxC? } 0ϊ_Eb$sGG(;)tj,'_9:^=z p~uï<8oWM-/n_ ܥ5y ;lSdQfow.ސ(ae'5t'B@ء;36ߵA0`pն-}nظ# FC{˨^JF;RըSX8/!,mۡW^)z0qXZڠb4c0p؀CAMfxWq ,*P ģkjNToQLҹ;GT%~iAp:@b~^~ ;wµ{vb۶ X_0l`S=`rtЌXyZe/Z/˩wF @*4 q:f80h*j²b Pxqv氾.}qhY{A|tO pX7Ihn!TPi,TC l@=\`4BXkkg~$pnM#ޮV\M\' O;FA"5ƛg=qX V낚|'%lÞdik v3Pը&;VP,&<[uR-2jľMfHDs.չH/߬!\Eٙ埃ӟ] ʛ {RxC!#(/*\^Cy"u`3$̣*vƠ%(EWwpgԣIx@R,@}3)IhShXy NOX+{mu.hMհCaBH_lw׭!q @Ԉ,qԲsݓ찐*6Σ7/Ŭ1 Lڠ8+9m4l{5. ۙnFWӲ2IphR܁ / 0QE*$Z!c7Z gxGw-fE|q%3FmR]d nl9 &ŌؘZ*9 gʢITB}:Z Ű(U\+m>bG蹣irs>nĪ30\4$f.o9gmxȼs(^ۯ"18GpREj1sE]T9rTd!ǓDh2T#EV4T-lz |aB_6eE=Y=9<+wypfT5Wdfnj B=+adg.HBG* Jոb-Z%DUkrp}sXzQo_$ _X]ƎZY+JjcH";<8hUj Lr PU` iQD,:cP >E1TmTI?-,Ab:̰8QUM$Wy 'Vd.b5%FH*ppIˬMK6MfQI;X*cZ 1gXZT.o](ٺ Ѝ(${CFV[ Nr7eQd8L7Ć"v;N~R6/Z2 ӒRW+=(%-- 0J2`:V ai򰛍 [˧նd ʱ=/d4?%]C:VاÝ J>G>CA6[6 ``NMy j׃>RTb ;$lɐ#TlUΝNm4HU dXfM_AlՊ+EkL͇\5w?p; >@$ZiH4+g%7V0~z=8<^WVOdq=9SXڽw~O[ԣ|9@N32?c i".g喴F/ 2NDٳM611Ni&6C$ &{Jj3~AК|'hR!" oy(ziZcveh=LURLNb ;4Q8-V-rn"DW M?o*WZɦqà*'(V;LLA[ŗ Wš\)JtD\x,fKXĵ/$%B+SA2"pIVA7VW1UCP V>Hk֛l/ طš .Y@ by>Xo' 6J} Je d+IZYOP.4v3OS$W`EqµOf'Qd6yooLOEKD^ЊB\epݽ{?3زXc6|w6]O|giypwz8O57cī0SA]Lzu!U1)d"5>(RF@ă924l=gf 8a9P>3ddUz"釩2@FבlTJj+qBG(iC5-24(dC+bd)||z}Rf׌{Ʈ /cUUO&d$U!JN:b ֎Bo Mj0 ^,K˥vaD JRt]~6Y;25xUvO`qSbC0jq&t lk#C=WSp=7~-[| &nك#6,㙧s`c?3ظ}7]، 7݂#G?O ?\8{|~EF\wq{?n6|^;lw>-㙇>Oa6l9Ei2S|.' nݻCL$=Y`Hȭ}vǠa0~l!Բ9Ĥ(d!vAAU|ףپ=߂kuGV4ڂ=pF8>npгys3;&4A\2rK;'5/TB'{\C V.2iB 9E7E ]RIlt*䶓'Ib_\[oG:ب0r˒x05"փ|.úЯH{iL:L2 IlmAdb`Z5v]~nHPQ>c. Az0>2}(L"cSݛ\ ?hg\ -mh."uB #JɆۮFKXOw~رmƻn&#\:};]MܶZ9=?oyX.Ж~7;Kކ/<-C޾Ͼ?3رy;l _= G;l-K;ƙ1NR|߳A|TXOE?vD7V V4#}tHH?p}/+G;z.={gb`zc% a:ڱ\VSgVՉzMڄ.c1^C'BEwyiPk5(VE+8]C,=}jEIwBѪv*8ⳡ,=BwǢ/tJ\pASV \9O9,BcTy#T?۷bCCɸal6,mKg߿U3]Rp6Ɲ7Ũ&lqǍWÎ6}7Ԇ=pMزi&x&T0 [Gصjlu#F# K a wc,VMeqݡEe$86=w_`5޵ 9ZUˡU1hJւ)NJ郗@)U_SE} ^y^zO:yţ8v\*$!NihiLuʎZ &Y%-9އNm6)MqW9s0R)D722V(iJmaB﹩ ,ϸ6kϼPѮŋ+ : TǏµS9{%¥5%q zsV3p8q|-!sveVϝDy~x-AC*z=50.@HSyŃ$.[WaVz=pX,yZ`!SÙXe0c ,0Y?~g&ԲPs I$ $PTIuC0U齉lls6$v3~n;vڴ#Oċ}a#>\Ys8JMլB3TsoRb_FE'Jm3Z@`9yVo0dpx_<`j>Q,`o\{5f5s^A0 Kss &/O4បuEJ=6 fّ}r]l)=R=A&_[~AH4ܑzv~LRfY5c/iΛ=ש| FPDXPg fy) 4 mAP(ÛM)P`y8l:O)Hso/{o@u+y櫸?}> */|q?)hn|=x򳿂|DZ4w݆'n `^mlZl ڿ_|6vo]p{ў{C?ܽ3p1U6矴fOFZ׃f G2 EtSg Q`7šM 0]˛,ٙcT% jM$Gtqa% c336,-h+*>"X>QCI?hse-{TPpa^SlseB L@ya?Ρr(7$χ>{Tq˜LN(a/{TO~Λi>gb"aS (SA$pxSvuUzˎֺS01i6\({'9*ekMNt sRr u\ \"W Cr&pT<6!,~{ȥpA p⍗q-2 ,wgqF!"~x=waaPy/rN^,kL:+޵o *,/-k+3n\MߋמYw܊}"nχO0!3!fFqGÅ x9%ZSA-џGO͉m*R5 6Bh'E{W $$Щ/|o\!q+P ʉU۵xgBx4#*DCV=m~z@E\͇JN'Q -X=´+PK!sf1uJN!wQ{ԁ2*'Y3Ļ/c_1muo_UJ6}h*0O||}(~K @6e~Td A6/!J =<3 ˄Ƅ,8`^N"a0hz QB-*֦FVc{ Y a!´ċEX#Wɬ!aÒ0ƳN u̽ $_ B BZo %l XhvI|0[c+x3wP .H9^r;(iQo+/KV]Z\__?w܃ix3^}YVdgxqi+Oڸ2`.Ǡy'T e1{w}1oeF{Cw.yZ4Z]/WtQB\ԣ[Rb^8mfsP PSUYӼq@ߗa({++d|\EvÕ,t@I F=v}3oo)|q:h[@ Xt=yz@c±U|m߂{Qᡇ>K ƭ#< T<j-C: Mڳ}7bU˘9SDrG^|/ CƩÇB}3+8 }y|;g._Am8PT<17l ,(=;C;>컌Yd%9B2u.*l1ዒi.HT F}㷺V1z>CW꿽Ű^Ml71&>㲗?}|zW"a>73͑z9s +&O opo+vFL0N?\/]Oj"s8/SB Lo#竲Xek-02z7X,l|YJOkC4ty[^~+l uJUEgl I8g}p# 4m]s %~u<=c~sk~N.o5vdpW="b&1ÀoѭA3b0n7A: n hyKlY0åM3p̌z9`zf4 $S}rhژц珥^/lϠ.W{ě`wDp=k%tEXtdate:create2020-05-17T22:00:42+00:00ڮK%tEXtdate:modify2020-05-17T22:00:42+00:00IENDB`CPU-X-5.0.3/data/icons/CPU-X_48x48.png000066400000000000000000000112151454622605200166260ustar00rootroot00000000000000PNG  IHDR00WgAMA a cHRMz&u0`:pQ<bKGD pHYsHHFk>IDAThmiy{/rRKRL.Ji2ȉK9 É b(Nί\@b89l9QI$P%I"iZ.gϹʏ]itW~o0ȽWo~V#0F1@f?#{=a!!x.c0w 㶻zK&( W|ze"Cx0FE1$ n Bq絶 oV9Hh`a2S=UCnnV(22 Z 5X~|!y"` RnGL_zw\.SbXqN_*)8peQO!2(1`m\(^RZH6(1ڮhs2Ͽ&sua_t ( '>̟|a2]OX,bgx#Usܾ$DHnzUQ][bT ds@ydZ$ 'i1%nZi+KmŗS|;?ei^!?v>y>#a9 h %:\ {OJ@l R!ZE,24<ʞ۸m8/%2VR_uJf 7@Jiw(@ou)=<;fMwy:?@m FjLdK`!l * rB2_5>ÁG2ec?{f5B2W)Fc^B7M[mQזU&]VwO=isɨ Wؿ&caItu%Odj\/Rp4x0WDV{\5ʫ{U9tr&y(IMT["͹s癙fףiRZЦ?`xxNÑ#Gx&aV4zimj+ve]D b*UFFFعsfJl޼={vOpqyٟs-lt5 @zؤ&ՁI&>> cǭ;{aÆ lذ|3agϞg~F^Óu[yz1MȀ+ #SCFp<"RJٹ9~YoΡCRR(1>>NX?q:DP`ii78‘#q7ؙC)0|bFzNZ[TҩM/}דf188HT" yoN>gvv_|X-(kpՃk,} HL&C6%yn{rmۆRWȑct:]+6ؐiiAs7!/c̨r 9E!'O}z!|[b0%|箻" C*˜?;ϖ- 21~!(]}-)0"bD~ <:@WOup/:x+\p#6!y,ߔxi'V|ZXځQ$JnHim4v0&T]܂m5pspL=lݱ}}}g)j o~&R-K'&?{N`Bz4'ӚQT5|eW/XEW&//pӽx.>t[79RyۄZ۲jl'׷ZN&cq-UnMr\Az>`贛vӮw3F^?QabRrOLԵ], IDATxeq'<ˬ\j/(   efz֮ Le24֌l4=p'H$P}|s]#yYYhfU{5翅}{?7/{ @!"(~XƟq,H)R"C~W¿8ߒ~(տzjOQ ; Ծ}. ПzP4\ߵk 7K}ב26nsl/\걓L,Ȏ{|ӨtZ] Wu8^cR]tq$l}S8NMYs?7/xý%z[nksc Ns,ׁ mS>by0[|v=fϔfxG}MxnhOO/=|m#d>k' 7EoH{XDOfB@7^0rͳtHA)E׋;gϽhCY O仿;2}߿Yf`,nS njqV"7k H(CJn J|c![o2+&NJm[/2"m"+d*ֿ'dk"hy;]ɅHֵ#O0?ǿz1O<^x0/z1m,oUhDKxxqܺ' uFJmA^m*akYJCa>Î{ {솙zQUUR{B`į9vVEJ>PSKkQQض}Y=vLD`n?4{]8 h?Z[1nS(CLbdn8˪)_da97d7QV톺B_SSk(SųD]ZYfS8Nv޳G 3ų+xw.>^|W3PdE(_&F)H8!<'1__}r&pg(wXA֓)m6]V{UJVY.&B{k|]I7s{ N4->:H 2 $iPH_pB]6$qb_E6n)}#NHx=gm×// ǀ 8Tr;:MVt  l0G> Ұl08Y6F[߁r` m҄2enw.sӋES ':2FpGB)~vuB(."r c4cñ`@bP3>}lHpo NJc``/hSZr*CE{-*T 12ǻ"|q|.]&uTח{|>sjߊ^E蕇ރ_w){8'/S᪀;\Yp u @PS*Ŕf=ѡVg2 EсExa@VLBRG](nBb )eS9<#;RӲEC:\pDؾX5I.l`[l.(#RꃜRqzRisn)t:bEUvdBP9nC;F>ܺ";~bRVK[췮-m^o\@":G 3(gJ#bJ_ITx9o8&>S9QXn86|;O٠gHF>q4֍o$"ˮDlèGqY;/gc_~"4ou8Jޑm͐#z쪥!ҡCs`Zaozy.O`4,0 J)į0r7@wY_&x|ɟ _~2Ͼ|;߁y ﺶ2}_!Y{7xDѮ5Pqw=)L( 'o~+k`}d6ۍPw b ]6 {:x*:e yrܳreyꮂP_UJ6 0wΥ32B:IY@)MBO Kq.NȬ `#! ?)YY:rxkAUgX .#sPliEh%PHQRY a.me B^,hn(*jxLXևHJ:HC8 w6 nl1(ʻ!8?ȏ~Www_k"7 d|ɏ'x?CԿsͥ kR\FS= < <ɂD\W.j hN.X|ubյCAV)kG -@$Z vV#~l )zmT8vٵ)큢Ԋnpm80Gf`Yjn6Vґlڊ:LB+oؾ8r}sᤚz.l}J),zEI@ŚǼgqA"`Ń={2,vxKDPa,*P7wkk"@j@>_>䐼qƹwɉZbǐZAcPx$z/AO'' [,j(i9<{F$WjgG==6a>Cð^8 KT"9}d|d~48Vd X ҫP#A-RǝrWPHRzu'~O>a׿o~/)y{A vx7_K3d`A-Qmg_QWn/ѿƣ݇<|?'euΙ9Fybi'a_b 53$5+YB4Q:a4흧0j6jR< ЎP 洐w9 J}1.<vN \fp0 @hɋ0os[d.{FwX齡9%(G {Akr"\x.wt`'wNY\n[G9B}d>uiYA"c0×銓Y0Nt>g[(丢LTQ/zi㴆ٳER)94U4,5 .Z2>3+?kvH?Ͽ<>_Xn౏e`)?~QןS6սGĐf oU `R"~ГƵo| !)(_ G ,(Ai4A1ޏԓBGb\~Cn3Fk eQ9,m1t\6M1lK\FȊcLͱEd<MvW<Q4z{ *{EuH2MćRn:u3us+>7G[WLPNPsً{}Ƃq`q߈{),ɽKP"H/{BW0#ߥ{|r2֡Tr_J>o#xS?iw28JNO}W~iw;zpJI/NIS+3~iڻ[&0 ݚAHӵpG0%魛8}) !+e,IN"Y%lc3A"VwLHiw0̄c"`j3O X##zSsҾHc KRthm֋*!z;EIgIBP;g@k9Oڬr J#CfbAYw C*J`OK9q/osչ8Sm\xX(^`p^YӁPoX#Ύ8OF#i-}C<7YD{I ۉ^ &3>ԹT $=(FMuTӍAY,*!yhr!C j/ϥUM {#62 s^}3? ޫ7n=8=0R"3a.iO!|J%pGB`ܼQӦ+3Hȹ'NƹW{,A ^غKw>"as>?? u"3o ݠFEHM{X U(]0d8α?Eч:: 2hi؂[Q/kG xҘZa. :EC`_|g*tJx+&F^ RHx)$En{8m-nr문X/>wu.eR.81@+̘r?sv9PKR}1'yNN)pYXwMTqhsJ-һ2eƌ0^BA_DQ5Ij~Q2X,s~$: ?/Mg\1|7N|pEe˯݀nBb|{S/r% hE eD+y44RFD⊝]~J9GWw;@ñR[~2 }yWaz>G_wO_BnXieCE9Q_DY*1M-}&{ONB,"ػC sdnq7 E ocw[.ZQ dSc[`t8 ә;KqOt BRВ;3 [JV;,~A魓së!LC h}4;RW}X`S\\8m hcHaԈfCqLnD|}*o>`j&c/7(]‘bh#F>7ZYҊ|d<#YS\ )@~΁O%a$u7#9|#.HXq(b[4<F7__ǯp! )JAq2L@ksHIu;<KlE/0z ߭D,L8|gfYB!&t_6:,5#TR`UJb>9/ ]F6q.|F.q।inM:"s#B*T"&%pS NƑR{B8ݓiy Ka.VRw*S'!06kѯX>r; 璆[|)FHe*}=`v(SppٿM='PENe 0i}]E"^Խ &'xz2og Gd#oK uL~u/eqr%Q5M])Z#i`͗_k/cQL9| _էa|~7f|ⓟ;|]56'Ii2A(HA%4QEԱsO75,@ c:~SW0/ܮAD |<᳟$W7(|0XyetB=?4#0k.ư3+QLh:pcMaYg ]?Jߌչ yU$ѯ0ڝ;O<[tbwb],uD7._V8E->ŋM}H̻彧˄E#; ,et)\wT`qq\\R7H 1ϾQ(?SaU  .Oj~ H1}`hڦ50憬$] ƻ`7R/v}'~#7Eic(f@ͼȅhWڵEf_(fYܞ2S9[s|/ÍW9wW9en ;ۚtƮ,0Z]B9?t䐂W_Gbf{[8a|葫`nKa<=;=W ]s Es*9=ݺR%uBc5rō8B@B9c_L x<9a}Ⱥk`E[`lH5ɞU7B6H)ȬjNh`=n%!1o,?Z=DO}wDT` Sy8U``wn*V_14bx.+HX :ҟ\ТNݻQGv:8d&(H=4f1w:/l āmkdіqUsl|ŒW4l1Jԭc=|0fL=j|Aw/m.wy]0"'O6R0&!́sQN5^#cB`ޥ $%8⓰(S:Fli yupNi i׻р:zbspޘOX֏|s…}✸[j,AhimVV|4wUmCᅀh(5*`IBi )zЈahG%/)QgUwobB8 }~q]]zLU;$& /NWRf̂d/vMD8̂3Me|[hJ?l.jCG`3h:R` < ܰtvX(d5/Pw&MKg=IOo(moH#m P0"$I:bfnjGF"\f y]']F9oN6:4ڢi˵=[hu.&$)l~Ό\h\hZ7gRF|:5uFpJ5ڈ~T 1m+֕T?V}BPڛk4(4tOV+:_i133nJGEB(uȊGRS4p.R$흅ylLgsTX9ǀ{2H\]VTfQm<*J X10&գS|vJYR4p;|0fVSXd)wr C~t$9tB3^z /zvR,VIo<3v{y8DD#vmoI"XYR2$Bn0b;Ra_sX^P JʎD+u!^FS1vdA-+TCp$T1h u"䎝o֤C`{-NtDQE%6'UE Q5~]LJx#q A [6;enJ(AIevyYd.E/i7,:X!:5hs  YjV\ M&U 78$50r Sx|`&*#{"%'/O;]Bgƥ45l'QYT=vkDn4fp/5 pS n<*mݴ@Ӽ@~ξC(Q@s*H%W A]mB9kcqF+\^}aĨcBMs!5 Wn-wp0ϖZBc N_ R4ה"Ha׿ʠ0uZL~"C!QLFҐ*兏f$)"$zK+`Cb!j?87Pu+[۞FQ.C>A9)LJDŽk\]N}֝Ut@68#=O?H'O!7_FἊ^uM@( ف9d'h[S!լoHҺ 9|8fu1킷v-+\KƮ@ԏb|W >4)y) 0+ET:,aƎR%9U{y$K)77L8Pu.VI#U;vօD)=yѷHO .I]Nu2#Q@$ aSVH.-I-SAr& WE[  h~hHI*!3IlYV6ͬhSJH̵ ANEOdEK/S=fq"H.d0޳I*z"T4@%X7=Uj8/ 0fOMz6_R5fF]SJaoyhPe@UL JA ~R'툙iLDl6"gZy$ajE%Cjtr%CO9vȞ:gS$I6tz=g8ɂ/=/ʯ3{?_7|^T7 w$)t|w3 Xn=7FυY(:$B,BHѼC_޿.6-#%~.k*]ґѢc&v"5A8# #2.VP46@g B`p7zBr]mj6%5@H<]ӨUl|T,@BIۊ*ީLJd|L" p8xmSn)H VkaB^3PnD(dR>A;cE8u'EYRuI~m@1^%ߡX͓0R#NN-π|"4$5L3]WmHZE!f2^DmUԃ)D JK) A!g ]Y1 YC]r#CT=wC8rmLQ>ehmкaj\m<+\N:iO&z_=ԒI(!!.5Q~+ΒYZ"s $Vi5A ,FCINOA7~I<y:g8}z ͬMȊHRY$Z V2ʝ$U:q++TXx+W>w.zc˳.Ü'zaWʃ8.e/R0DM#ء́4@WQk-F47a#, 'D7 ^Z_ p"KW6rKZ*OeS$۱#ɢc tzZ02\()7/h[a^")YE Y+XF,̄^3msHC6|?.~/L1(EQ$H•6!H'ZPG!Ҷ C"]͞ё?uAa-6Rcw</P;~WRpl-by795܀%5i P96OTD̑"{91v*zS J0R9k72jj dFwHJ~KI7T ^4x~&dGKkă Ԋ`$?qBƗdXNZ?(V0y05,21K F2S>nk# k`&eO@rE fˀ*wt慛 F'Iڲ U2y} "걃 Us7 ZF-\NLK;^5vɥ%diXLK),pl3Y)FHo r$-t6u#MZsrA 3ԌrtL]n-p&Д=zRPE*\_I7z}* (GJui}>N<N-+";)NMY$\?GDQ q+Nz-0Aᵃ%&AF”3fM4}x՟JңT )>lTb#o+IӶ|J>ʮ!{&gv($VفF(H왰ԭ!XGsw(c]3jYLl:UpkqG@?ǐ0U,ZrOCaDJMmeg&Hf𚸄O@AQ ssBۊ] ca;X'6:w.5{C=$`+1zxʋ +:,3eF2DX1 Qy7neKH349(E:J I`䖫6ޣ^fvY9(+*e8ԔZnmv=(h0^QyBdގ*Cu# &zQ2(`QU&ٴ!2陏75lʰxtA|-\:9ļ;WPq4 u .xb>#Ӯ5 wƲ]m~J$6"&H IG|GK7Gb8H H  yiIWl^&%Ĭ]4CHwk:Qȍ(}:&&򗀎RO Yֳ]Bv$FA' ij$EJ-[06t܀ΧQas Om.@. "lyK ^f6uk^{uv AW]GX+Bzϭl5٤=q6@ss[2Ψ%ROq2VZ9#ucR)QSDQ-ҮʩTͯp<&@P)W?(`hM5QƄb0q']L\R+\RJ(n0.ؕH߄Zڅ%V.Q%-3JYptriSfƔ76MKϢhuչ+BQٜ LbrEJ)~!aHeDIGj^Ũjnv%y/#snnp^ɼ _JȻKE RH_6'ǏCm35Ii_2%vʹ ^29tfY|G&уL)j_,sclosjpaaeݴ.,tnVҐ0ŕE cפ #jHO@2sK; ϥ.wn޵KJLHHXʌ)'LSK37si{J)(Yj3Aqy/p~ e)uWS4MV&w)`&aPQtH@BRIa]TݸgkaQX5d)҄.f+%DUo$g͏眑P48$)X3PtQjP(#i`BPYhpQIbVEST?W5PsZLv#}_e@}tD+L L9|^d<Œ@DfmCL :DK\ȡj ),Re|=tr׎ h>PS01v9rF)=!hT=j~r[Azmʲ`:;4C&vz E*7wN8@8.ܲ?OG Dh΋uc[$6I0⥍i&hz!ObpYK!XLgnBWwQT!wH<DYYq"/E 7RRHϦ#?=# 3h<Ps sm} Pκ|cnSƼW1%AMi>'sF; rvZ#  pԥq!%Ɣv"6wRMy( @9uSB ,Uڤ2P¥,`a}.E4Q뜤e\n)AR`Q\sArpv@ij|'cTseJ\`{LR+# WXZi7dqT1>j`3reY0^X L d+JRߕ"K`7oު+̾`(~7aeeA y0jTgȉ %Vِr)"YwyʘsY4i AaƁ vH,\YZduYxA# B saTȤqYz=ieB{VtRd,eQv ÌjPspu I ~QYGE !4Mp>yNv$R"f5ZQЌrq&\|7nR Sn尀I gnavHSƴ[X J2-j4e0yAp1 n py^pn&Np^ KRRի];* VB8B.UĻo)vѽ ڈ$zh%|cod42TV!`da.*!xCb71i nL@2C%te?X wIqcVЍ 0( + >{#ߋ{?\ w_" M%*h 8U(tn]7!U &13~NW/QcS2g8i*Qv鵺/8\G\*Δ+.a,A6UlS&;`W1fVjTS7tVi͋rΨʌuν茻#m,.y(O;z rtO9DP=M)R<–qn(S /EY&y7L KY֤ YE;&(%$!,\)!\,)g-/uvMraei/zJI3)WR T](@e8',):#>,l,T*9Uh!0s:3YS~=RH~lܢ]Rʎ"**2k[e;)cY꽪 *k] "h_{)8,U3 yutVM8)ݼ7|o|O<=n/+Ocg0t]|.<@(!M:{C/R SKE"y!,(KA7 L;`{C`j3r3b ahnd$qqӵ_"*+[gC*q:s{vFXX9!~v>|/>''ޏ'/]GN?eTRPA;z/!&$#08F"ڌ7x0q cr-8X1ͶPӣ{ŀ4j_^[~Tj*dܶ&}THN^Sip,-.P9-H҃fv)䏳vE0 #q#\\~L8X=ê#r߾ϘVA-NjiE+%MrVGyXu ̈YtQLGxKyBRAT_gf.ӄݮ91c]'Ai.+isXw4!gAʌ# =ŤuU׵ ~O2lnrBZ 9p8pE A)x"-:3ͼ,!N>śo 307F憺h(ݬ#\u |]QܺE~) 8eVN(KE8Pj|e+,iJ8~.}2Ȍ38"/;O|y<o:\v<27`5,bN4jYZ|kXO9⢄5}?eN^ǂdRUETXjAIY7x) 3CM9cEnu,U:$17Q7*\=CmFI^r6ӄrp\:q-!_ u\LfƤ-uV;נk7SJXEZO#  gUz0rbR`׹h\49_w;>8,p0Jxd:Iuu‰zKdHK1ڬ ܹ^O Ipʂ}:~?=>2g0nα88,3yvy-.&DwbJJ'; l.>#H,޹@V˱C d$lf亩! sG,vf.IIM},QCm09O+dMI]TNA٣zեhSg!%,$xmFI(A˞73ɩY "AA=|/ ѤZ67j 2_kUvBPE(ZaU\~Y yYu?F:NJyP \χ̺*@ac{XUs|̔jHo'R0h!\,X緎8)QM y5zHpE'^‰}#GA$piyˇu e)8::2(7j#nC\rfU5rBuDCv$94hPjq.USB&%K*IxLe\^<=G ~_~~_|7!A5lF)eik~Ȉ LE%⬖)!eyjV%Yth V w(A0;XTB]ޏ_BmJ=:{( VF4Su~~2 gNSDBch&LFH kIda8zg6ӭʨl]vUa ю lRuqs#+hh)l/ˬBI1oHW,Gg"Cڣ 3/sfha4W2Dʺ, .M,50z%Y]̒l<TԸ !Rݙ\oS*BjcIbn)Uê+KA&;9_In ߐfR϶Hۚ$ɴ%XF&s541YyquǗ.cxCٕmR4ƴd ָgg&vm.eK<=QF]~]A'hug?;>/GL|n-'}4M*]SaY"%c:#?•Nq]<^xg 5Kia4/25"`w{s8KҮePstt"- $r;꿤%0!< ͉l| w̶!B ֌faOL62) 1s?{|ϳOp>/8; ʬ5H5(mVe< &+nl\b?nqY47XZ\_*xq _ɓ٧.G9tͺp^?ÎeYnS#{fHA0+Ȧo qcOa6;nܝr!|m|{jm`_II׮X&hG74++v,ZcK)U尹n+NXyř}Vq:g9} [KK lҟip*BmG2)#+;:[D%vQX@S[g[=g!p;SwFmҡAN(2.rxCo/|W3Val,lU:S&%dEqtI`έ\( ˹K)Yq:>ӣbk}vIԈdQZJ!,MjM6?F@a8Pa:TG'o7?˸~:K)[7p֭. ar l]:~S=t[G\rF7`bJ~SJ s.\Žg=Oxg59Wy8@i>>禋F~7(UxPHYgQ^ Ozq aށI\ `27 =6C4ȃtLѫ[ VH!F7C&~7~׮^%fz&3,e9 e2MEuܬ!j9x~#/UA#7۬:}Fa7Bmw@vTвRw߆"]Lx DZM@;:5D\yYu `"^@hGl; :RIΤ R Yin`ZA9 X Q.X'J[w7iwuDfn.f0gBЍ8M |+czջ2sPdF)OɄT;YqM'=/"ͮOe7v{'v Vv߬xť6KPmYو'{|9? m|OΐHvJ3ky^L]%I@BGρy ~D&} ۵p:X2al&S%*zT:]T :}rk˞+MT?f$CґbsߤҬm/.w=}g3nel"!6[_ފ^>r%ihVXdڌ/}#E#2^-D Fm[q1#Y/;{ߣrDZzҥ9J`ׂ0/ƻ?w[DyQ?ufn(BµN)JˆqxnDUh8'އ^z^?g߄,sa<dk73 n,`ɏZvyqbƮ#,>:|вK$5g<7>uy}/O~߇U:?oT(en֘a |[Dek|y͜fNdP8o/ #.Z\bGgXGa,R|FB9 q-jJSMa$AF2QG1c6޸Ы٘qLQ[!F;N7ivyq[+CF 9} 꿈moXPtϰCb"4s-"Vk$FalCF~C<Ǎq4j9-< Hqw ?G qеϊ]+^k;"xBHnIsG@ܭUnTD]G(\Cܿŗ]͐g[ӻ;7TYVx&5j;W ^4jhgj4FqDܗyc #Hy8[_/w=3ӛyzV5 KL~ n6qn(%Mjȫ9͔-nwkSB#?$sZ'vdn3\5v#9hƸoFB8.W]R`Ƣa#6[6uj0uun2CyH(Lckdx|ucBo$#?o$md>%Wcͭ.PuTc XLX Qii~VlF_h!!SڕcVHTqFq͋Xł؊Cu|YDud) L#H8 yr<>ePi lnj#@AÏ fAqf?rAE]$>l$3h7<2<>Bo&y> o_{魛8Pgyd8ÃRtwQ5 /ZUmu?Gq, C%L^f,d|qi=Ű~;,q^KsAPc}[_K Su,b\8P.ۤ?p㛸1If4ϤlYCct,)LRНMy}UtD[Ǝ>vK_нy$ucQ#fmu[$ۈnpH$zIقFc{Ds O3MSUs} 2?&,Zq,Ru7匙E ̲uaFtkZ:Ӆvڒ/Kܵ<2%,\cˡ(@?a򕌇QӿO]__Cf_҅QytLy)H@ 7̍,!yR4ˍhN s G% 5իw+K|xqEDk>2-0+So`Q>x7 W~GwߏRg7qNjiL0uIMS.qDMkt 2. i[(1k=E--׹qnR P?Kw/Z)]TlV 49{ <>1qeTh2Jc5AAYPߛ"i%c?B\{dl7xQSl▭nDboPOGvekX'cˁ2rm1tI=k)*=b |R@R.rnjLpW%td_OVcR$5NM੔]>V&\~H Sn:_|i55McpHؚawk>ܯ:֟"[vY_`0WE,ߒbx5,{^7iũDc]KYRWڅ6?'WLz }<}/2 g8?? 7+h;:M{MkQnK_؄ǹhd\۬nc0##Lq L9,FpxDy%ji umLMpEޠq45WHAEbD춤#e|bA iDdrɜ;A4à "ih({7г] 6*Fs?m=?6V.Cz# u*z1<ͯA?u$923s}i%'!V%^_/\628`oE H MvmW4G-}x?%b){JHygeq}g?qC3 f7z5tdSJhc:RiN%Z4Rq؀ڒ XQHڸ_vsu4Ќ+.Ԉs̏?)DJGƋ+ҭk !/kHt R[,n7)/<ƇFBcԵUPT[FEP{^V?nMS\\(lyD͏N[lHC :< pEVĶI vS{{(߶왷56U㧤:7F"nbb&BJWV< 5,n˝Í F@LgU ϥ}~ִöc.*N>#ZᶢV-(#$(5@ D;bRp]=*irZREq~9R}f̜ G%EJ,F3Aʌ4Mx_u_ou}z{XN\giFAt R:&m ~ =UsFNmAْ7 =/.鋀H!(k~쓿/88=2/.]6|r_-󌭴)+h/87Vj.{i/ GZmC ȸyXx'$[ɚuohۺh,-n'>X }aÛ2 b׮x9I=[iE6D [} 5l+9( h[fn#6xoэ46GJU"ܶ=V92f<+OfEuG!Mbrr ^{i9|ooX7⭂zM_zՀ<]RnNgR (-#추XG֣A =n,ɡzҸQSl$ @+4#_?k7YimS6NDgXc񋤲cqE*ܒ5&| m ls5k+1Ioi!iүY BX6F ]׀rűÜt;EKX }3LzkuQ&W20R\+"Yy49j 9t\NNNOӟ ~"uꔆ5BqЛֹ=82p (9&rx8BXPZP7S]xO킦jh҈O}nK8c9;)+83C fB.]:5D5_;~)gXя~tn %j|ľu !Xj{A9Bti\mէtA,IQ3.hjNe F$lr R, ݄ۜ.*:"dhpY9댜F8k]` - {7Lorn.1z鳞¬&@붔Ҟoi >Kx(e ˢ8EKxH2(*عS W)#ishsbж#2_KY anɣ9UTDs) KЪvÓ =gRh[ }ne[/,NNN:M(R̃ jhUJ.*.E"Bm3݅<] ~}쓡TlE  xQ:5p!y.5[v`. Xe1a-]ʔ.Rq&It%es=?OGC) ÂhRNoQZyc"A1ev؟^e5,C_+,˕6%C[b1v K؞#r|`Ŕ%tALu 4wvZcs ( uEIZF3ALjZ7%hS9>[onw3$ 'Cf`XDoYlѱP=;"5a)}q$JҺ !{{bOAc]?Z,zL^le8 ?-KqTc$zZ/gGl9?g%8A Z?`X)"YCy3$EYш*FT9Mi3x+(1D˗/oJyFʕ?/q~mggxvGGz.\| yCYȉQ9~EHuHdo4AR_wp㴺YjV烁h'oLh@Gf;"ʮA{#,}i?<f%9}^hM#)5GkfP-4"պ>?@^> coлhoqL ɀ۫;XKȵڔu?/ˌ`h ^{U|Kz?8v(e v"ԫ2\%\SJ'\7O~srւܷ:'^kn#ڤUirMt~J CwNsy_@l]b ,ݬzO(4JH&w.3̹OB$a^8?˂dr/,˲>M0L54+v:ݾEpZӗ r-)Fl]f<'lt(@-m2:H^xf4'RJZ w4źEYWE`܏dX䴍{ww]47 ؆Pjv֩kr]PT) 5A]ҚmXshlV?ݐ(`ʟ{^ 9r "ݳ=r=`ѱhDgSEX!6b YrYX×bmP2QA\˞!ʲtH]Gۘ7Lw6V)],CR*3a"}7w.Ů'6ө'L/ #8:kx_W^ƇSLIDAT?JFT2IENH!][Py$"d0pt|gm/?<)¦S؉AKm,NjPHbт06.&s`- y+rnl nR~ſz >Rr(8gK xH Ҙzb_v W_婑9-PFn1)54W;3?Mg"ш~p;P:Yyzq/vYVBzG5M 9G^DW^y W_ēO~ʬn\pv~n4G.:]`H5K'?~87D!UYz3)MGf]-^% WFuoXX7 ,2+;t ZX1Cc]FM erCN<w1a.Z% /Fe槔p8|Auo&\~7sO7nFUaa&>c$ Ak]uP<%N%Њ 0 ~T|XODǽh=!uwdy`u"tG Ƅ4<@i8FtwEKx* e2-_xL_g?Ei%N ,kѐ:P'#IO蔎7`* $/kɭNsa$qёounSjO>J>Ժ)On $f_L ^"I#+,Ʀq %Y.4K h%%JdxC%}[4@4gQG ,YI)tBd_سa2^ͯ+?IqyJ6zS3rdZCRyĖ oY:O% @[?vx0,RuV)MHзEs pvF|~XJ<Ϙ2eegVuUN}d)kv u\<ϢwcEÍhxTb-}ACmζE1vZ@͗zUİ!k8F~$ph_X+2{]v:R+ބ[Πn:NS*| (h/"S\g}Q䈾C qp#"LnTO \ pžp50nqD}L֙9w\7)(LyPqSWdPRZ^~O dXƃ`N{h|{Ku*GR,1Fyvq%2(kS BBGXA4UW0* J@2)uH9# '`f꫸vU\zyFYg Zʪl@`/2iIS-=^W^~?ēx/*5v9Fe" R(vAڝh#(0![sl^\yw(#Pfvq8Nh%u ) &~?.t祛eYǻ%71D'ɜ\Ƶ{vYöB+*Wמݮ3+[6g_`t`ұH^a5A6 9fKvK 9MLKBz-%E5 SĬrRsd )RGB#p%* ًn Sa_K[DTSjg,KUk RQ4Qxrkʂk0:8ɊWJsRch -B:َ1ޙ63@u9k6ј8D4K`L苍VꫪG|PJ5 * GG'Z ^~e|_g>3(e?2\CbI~%1//I|_@f-G`[FS|AuE<>V~}D+PB(lEĆ@3~ 2 k |Dd !iW"$]uکaC:Q Wn%b9ETw#B ilFo[Bp#G?rKRp$N#Qan|Э q Q!Eu BGiҐ,f,f;)[bt trbeΓlF_Y v ]j9X>XxJ$>"!fJ(V neaDp(Τ<898BI5iEMilV:wMais}sn*CrAw545;P?КbZ9OuaW&'(& _cS7YbjYUI1̯1ס^G v3r١AJ9^zE}8V̳n ` ۬ n`?ƭxcQ\W7n$z,ZGݔttݔR 2wrk*2om@ϒE- 6j|H2)Mt~=̥@m g /_5g0׍R˗qek23/bwܺYksQm.~2t";&  }C Z\Vmғ:Kg{Ej$-h r KĈd d+u85TJ=XLR }$u yS+&}mAOuQ]#o5a4NQQ"ȡa|ptG K=tQ_Q#〃%W= Z<;̊fC]u^: qe;anCp"#Q]3#hM,^_X`FɉQʅkiʎ~,ŋwP*5- 8?;ã?nT D%̌iVQIͧj1 c?²%@#YwpΪ5[sNCgLn:ke57MNrnnL~x5>6?N"}} 9Kʅ ³'>0%\r m7RB &]9^ 4UPJѬaeJ-l;hz߈0{o OԈx$Μ8߽u"42wK}3O:E.ɓ%0@\JYsb ҺIPɤKNUf=/6OS70rP1^}zirPnIk, rIcC#Q-PZp\7pvv'xW( ~7 5(52t׊< 8fBP$,ԑd3;O9Z˘$hFDEi J5rㄕ瓷&^I?K<=`r}m3'ꋧV,FY1!JMԤVd'=EGv*R# u#Uj TF#O셂dՑ3c7УƗh7(E ~DTsEy7\ /|-Ak!BUY 4e`YMC5p?8|<3 #8d> =oBؐ#n×AlJ@ M$Jzm@e3xϣ}(κ)wmql2˓s2Vߦ;LGOw%Ir`7EW ̔RY-Le}25v]]j–<Ű{ݮKnܸ{_,H\ D* k{I}R@uDr ^{u\{^\zo w{4T\1Sov#̠ir3 Z5Yw_YooQ*Kn< Y)MGzi:YY0Cp(n1AC*FdE[ $LR^Ξ<3-tWD)XZ|!X ʞZaI;0O3ҘeX{3z7 O$SVͽ\ZD*<ڷe+; f,F٦}֘A7rG F$l5Rm}GYufH 6Npn0ľ Z0*Ją]1HX;/ )3PI!/CV]k|8(VFD v:]kC`Ʌ&X!-f00WG =n4SO=N [Os fO)d/krV58 FTǜ$);>̇:{XŠT`&d_1+[Hƭ7W|AV>6Clu,=s*RqDp:HXiVT7ڸPdK)9˦eLKpq,_yP0)1 #hS+>QӐ_N^U!O>.ӬhNrKV#@>wK&Zț ȏZ/';>.JPx)M)xDɔR,sA&_\ q\ʬ~XTӎcHn#3&;0yQmkfwGR,HiXQOJ\uDt׾^"Gw>3$MBkDv dzyS%@V<Y,J%)){"ͨob]O|mKlq!Ym()dkws%qɁ VUQ h', %?1^,hD뮊&gyH-,&5 |"W Pp׆RJЂ􂪢3CKTFO 4آk sXb4,n׈: Db2΄ɦ"m稉ԍafHHu~cpŤKČw. l';v¤ԺqHph̕AM=+Q wK9 z3lFG)ѪszH5:>j#pe=mRL39K)(h {UBwXVtܤ~>券L3L)ĭ=Z3݄y^ȭ0K 9MU9&Nϑ?_HӮ nK-J!vs#JSpc$VX6Z8nuJ~\}%5z@ >+Eb,Dv1\=Ye:R3ػDoJ$;04ݚ/ʶW9`ޣ@%re<&$p*(ը*xQAWh:2U\M^ $kXEJGAi#.e $JLleLsYUO@O=e7|Tf]}]PHS-tsMV.J3r]~!b!yaKekACnK\Bnlt~B4vRŚ) UR4ehVU>ߊj {k7[[C HޗҼ#}_ /D.n,}( ,"he{5]R,X9S w%]H5sהri e᪷:s2/0/ D:~8Ty8R$"WfrB&a%$xyޱk1O $p} 5I!#w6.FM S bz9+zF᳊Mx`jF@]x:1tϕ+~.` \P#CVgP|4^P=مmiv}ͣI+ XUr4M)/I4mF! :-r4dO7d 5B3S8a뙻y B69#JL7v 5) 9{VCR?¼>$nЁL7 rG$OJ2ڥCdEOo'sQդi$v* #кD.&Ǒ?<}, dbт~_[QaV fB|n$Y7̋뙧y%# h?ņ 5/:=3"k6F0=F)[9PLlb/C-mm Q(>1~a>`Q^qTn;Q7HcSsvG{qk^knMHJ&z5,&*1SGq;Y8y GR7`` vX7OZe;g(.hZJGi.+Z۞jηou2hgfI bD#g>*m!L>im )#<'lڲm>Jvӛ6Q `}JcE"%WX~'*>Jj63- $VP)AijdIY,JGG{'!X -MpuboB#N*`j\Q3p&xbt?i ^3j1클Xp&YuaX(?Α<ʭϕNM >|ycb|;aY/R`s_<^u1r@9RYUq~^ haiȅr^V=yלE< +B3i.ek֍Sia<&܇u) 2QRhNTz0kNʒNe\-mQhgeg[=+;3[ղ,\`|BYJ^JWg>ͦc ef.iWIG 5~i C5盌nl 4Lb 2/ 8::[+|zWr$YPeIzhm"z9- ?_e9%s]/,B6ҹv\Q%>ČRՅym :h?kie:ʟ̨T^ˤVYP2tE$[a*7HE.4Mzw)^RͼrN_\@ENt<ʰgsTJ]Rϧ5|$^ 6F9^y tlZ Q.^E L Gs)傤 )KE9TِH&9cr5qI2+{\\GK9-|Kd9WaPJul?Ѫyށ,y%5[&BUIFp!bܝ܅iR9i&œ7/yƥK^ JO٦8T$4K뮻|z<s.g6w\⛖Ġ`2)"jC]-!)o&d,QפդTYQRSnJnMPx-z FODLۺscvb7`KEսy5u1 JEfGKkH6VB(j6rzюZFsp,yERj@Nׯd46d)3*ݛj8?.F;"\G!ЈwX+WRL''x8u+0ףMKhP抖N T(#cYoxBml]e抔w I.<5P-Fuv/"3ڵ[cEG GwPo{d6t[-Ϧ{Q)nasZc:>VLPKZOm\YfG4Fu&N; py`"8$'!6g/*ɔ m!|>5JEO^y1 k|zv7^K)xpe_4 fD~= 7np&+.ΰMxp]w+8::RsK]SJ$h.@mf;s΃!o JuP=#E|+dpTԗLhznӞvTMu3`(JKpiŷlS=LXtb"jSfchq])DhI¶\rP OE9]nr~499\_JnAgkqd^ip~v Ċhpv~e,TUPT7@I1o9O R2B(JS< 1(* 9h;,qL%ujc$n\ } m3(H-B3-Q-䝻Kdmim=wQXQ({F|YE`#QyN!i`±{4IퟛlpQ)juMz$$=]p3GwEv37^T2k fMmp\(7^+%2P*%i$@+ |x0f;U.47,zO\-yѦʼKN# JƳ'T "`Y*bfNp~\IeRr]g yp 'Ma0GX9 F#?ZYp] ʬFP=4CsJdMGjBUOӾv^DUmGdtu$Ə3K%Tx0\jW`$]'GOpXמd6M ǖYCQbr ʐ 71$zHkU 1QBYr7ֵ4W0=)%W"t,whWn&F}QgiMD iu8FY5;c,rTm]M֩>1M:Piy{Ve^{ 7ob3w݅R y^mo3 `5;Fzŗ "xW/>p?zA&56뜒rt\"UH5[P4XI{cʀT""SEZǯ'w8`Ѹntm jAёLXJ1Ez4$?+T\"4`:`-6Y,l0J\ WJt чת8l~M(6 9#уQ`uU>;-WP JZ|N=(Q34ř:9S6wa@K(D$bŹanUv&Թ%H&>,zlq"w3r+B;/3^ ՌS#rs5\D445 2ώ.w Y9fn;xm2@ ]JY=1ցM~5SMx[2%IԺ]@Κu51+@5]JsA^ $i_R`JLsô‰bL!R{T}ޗ.)>J?SvV#v$ԍO|΃5MFL((KVH)B,,aP&)!vBz;o}O wwuq. >47ɥgXy݆F.iL̦HHh8t@XؾE!Y-vb2#oJA'{aU}43 FnR@':5C`)2eM#e_5@D\xӺ CcB>5ٶuqR=%xϴIZD=<^}uB??#:eEi_|E+SG|&ϫҕ."Z%ҜP 7a'uH͇ $ic4e鿫HP-ݑ\>l= !wuhMDV]I j7xJլ!z]a2RwoVt]<;zf`' |Eap 5uS΁E<{aDE%ӈ/2y9 %\u#=Bp8p8"x#9p$qE[d+?VLӄ^x}(!ZɹtP4/0m[O l=<0*nW즩:yHQ5hϭRJ_mjE"-1ԏ3񈺰nDw6 ^%w PΈX%!<}!@h rskqA]6XUmFy,u{ U?17 BUo$*!ǽl JYFx2LYESFIgAiDA?Ⱐ1œuZTU6S#gR;G)I5WHT…FJ|[x 쏎ki?8??"`kp"vcH<nѮ_7/G><MZlyRI2/*P"o--'LR ܥ񰙥owE؍Ų/G\G3s@+vA!e\ ]v_1xB Ց㜬ެ<쾹q`B .O?5l[QۥZg||/H),PuL*wXeȩC93Z9ӄsuw5{+*kOSr82w1ssɍ 0V6AIC +ӛHDGsS&qMݸ<^ѶA!6t09pk>ֶ7.QALXҀ`% Y"1ACI&Lm^AD}-s Jg#fs+ԩ1" .̓gB]`J@dx) 3ɝ&#=ר6DTR&q7̳ '';.Bls'H( v;ۿ/ýS= ASOзs)wMCsIv /*"U؟{8,3 5H Sk (isP۠-Yh8ZE=PƩ%4G78]s Nq?yFis@uQ#5{V@j\NVٻ]֡WΜ5`͎>{WUA @ &E)Sd[{$+aG;v[3C y=-Ye[RH .ظjzݛy̓y2o -ros~:€dXF#16btdpփ*ZBR 24 91}aU^[0mUkl @UO8(3i"K}]ZL,}) ./ +ѱ.[P֥D$˗riMљ-xiCMxH_ss c@(M>p)@4ހJDiLT:xݥñsw*FWsħ_ONF'9=P g㇏Q&ls5eIu Iee_5N>Yc3,%.9eV \׼g x'arR'f¯~j]${5=[k, }\p}{p7'&w/ Z V)99FĺYŜ ݯsb&*:O]|'n{ի iJyLdAPC&qFBgB[(T"Dd<`(:R C+TWdCя§ݽZ1*Yr\rj1@!օ뜃%Z94F\-k:+\:fMF͑$}>}dlN@w}J^띝 <`/y 5yPB"ű :H)59ʓdN}"g> E./e {?eȊ]rEyT "fkݜLVY$fg}#Zz^Mwu)q/d4a'L~%--˃UnyRyYEbgTv$ՂD \َp)R;sR$eGLJvO()& 28,PHÙ/WJX5T&ZMչb#^rD_F_tX % PgOƣ?#G6 z,){{{W5ˇ4-E@r9#&@̐~peu]ߚ 2Q_6tʒ6pY.' ҄ D6e'dW1jj*锘LHx/R358REV %H>6vd9sGH֕ Dsk_J$wauT.N<*qj1: 2%×1^\ٳ'Dc\ἋX°^o QB@$9G @II1TY7@ae[Eq$粹y3 _Hàޡg>R4<F@\ĪX4TY"ř.wALTajyY!"m`.T@^YSLK۽d>O&CpIG1Mz/'.UҮBRbE9/!2:'/b/:v}#31:7j Ã6] b^u5N'Q.*Ikbʢ) &5ۘ=+^d(zu~&ʫeYi}e)/?s-}k&=\>zly*v WZ%Ӊ5( ""MN'k~QPTzv=Q\rsIuzK9UnzةUaPk[fB/B1a&ER mA*UE^ْQ V1*\q&d䣘ZJ$ӧuHzg2@ ww75Rпi0?@nsDZ?7G^}AwH `9U]X) aʵJqȕAqo 2狆9Ϗ,Hg~A"rA. TKI}bV ykcl۞->ឧ dC@@M/`+ 16XV5@י(/"d_!ǺAAW` ,bS8٪xxSaX/:"OH;]lMbD @^{~9HʝewpuU*QgNd/?ƮI.LHTtyĔ@D8 PH߫L-@|@S3_:+S`Кs#0uH%~QaڡrDLbu#Hc!B$z->)“cxPA b[yI9$g#@0!{IR?Dd˴X,XVN0wwwG]e?g<1Z(n [?o|o{[["dKuD^!\)@ VWC=%uTBaaT!L[]Pb3*$cPjԘSRqpyU%{b<ʍjq! E|l&nrGS&X CB^CB=qu(u952eJ_V1^b8D&YW 4f"cq= firTu#Gp1lnnqŐ wu ״&iWВM45s$ÃV {=7uW&*)?}QHVX,+h| PoJWs:ʔ /9D"E" _e)uZ"D,=5Dr ' 8%]VGsvim"97MՒ:@:ĝ;RP} 5NYC+Xlǰ lnnaZ𰂝=,׬U#hT(V& 8K)RL REkv*,T0yIQdEPOk0M^EN@s܅M +Oc1[k#k"T)^E&_*EIvȶ1tc = ,/MWWLfk"1+)?O<>M q8q[[[b۸|r*򱽽]_,[~6u4sVuq%g>~[nX%ݣ ɝ@^MR"ʸJ>'V!.VLƈs5  /y(bhI1ZL5.j:+e]XSx Zgچ9~@-QIdU-?|^e@%lfqD.E ZL jՠGנrD%])8 H|)VTNqsL&_/UW۝VD`4:Av@rN+SXY=IͣNTmD6tY\F{lmmѣ9\p!⯧޿.s 7R-d~O=4>NV"5DGΰxXʨbβԹ&Wp !gIY6 6h8>zE^:draӧOc\Nf/cʕ_G-_ko.oՌ!{hmW ||_-7ߌ^dCvuȡqQx?*AJ꾋!`@\o#n>#o@ *–ڣ℩x`|iDj2+^1ňb"Z6H oeQ~LxWTV*N q΁c `w c6Z,݃48TXdNi,d%_I|BlN< :v uK%W n#6 (RA"<s h KUo޵Ir*cXmkd{ FQkTء \h؛$7j`e´TJjAɊ$ZJ8Q*ds,(MP ^chC\t#G)_1:6ڠ%?|n&= y k 72">TvYC]i Ou>F5jڡGܜ]p% .ZRzd QdY@mj/1yF2T-NH2UdOdDD`r2 QMDL:ҶM \ڈ ]Q<*3aww_H9!P_r(2`]Zſ57!IcҫmZBG =>I#VsdTQ*):3S=g_Q rrK` !lfk+t(bN$vFgȲ/C8 _@ͬ9#Wy5^IB:!RMv)Lx>.֫5yU6DaM(JݕQEfdG>(}pS 9lc(dT@,*虄X6rbR`WU$c Kdzn¶Tb ݒM 7P!B;te DE§O$'3 ŝ&M'd&R ̢SÄ`KHmfuBe #;7vX)c)ɭnQBPM*NT+TWfFS6{5R]$9L4Ҝ]\xq~_w? X7 h~B cpuwމ'O&=q#{ @/Yg9Yx w(餬 u6g"0s))D@ 1A|JQh ;彷ɘ>nLUDhY#rЌ8"'a\Yl}$ ]"9Q25v`*Ҥ]M.1حhVJ6!U2Av#(?QѸe(8/ 0j>(Z\R 'f͈h/(ꘌ12_ ?"w|M~4|+_XS; DIr0%yHw a6)ey1_k]PN_鍕 &8(ς"LE( ~T,lƎi2I؄EQ"$ACx?RPB3q5(JO?s`AkA\2[6M-_$<ރ}/sfZs7Z:u2M٘)Ȧ  MigW]z *r*О GOsɎ6m4eIPe>}!>i)ő|8sp>bU{s.i&o(u>M@ φFók  xMq?8x;cȖ J:- h < B OڒtĢnܐ\myvP2Ij EX'/ x.Jn)\՛S ݨ}¤ Ov~!Hi,y^EInmR"*4IBeV辇>(ΉtCH\w#D?9VO;w%5e˺@$-%XiM#>ʑ =WP& ڔd•+WpElll uԖ{{{*?Wٯ~\?3Ê=Ð`bq<8yꝉDNBV|%ҵL4$!,_ҥ4 R%qNsq|K5g'Ǝ ⤌Ȯg> ? =bo%ƹ ;S j}(#@lT2ѡ` BQD6"93{Ik5A70OHٍCP, = 0PO@6zů i /W@m.gk g9A[ GTؙ̪P877?jB qJrR&)k2ӜIe2ɻSߓb"7TLr&>Є$}qUcV5R+wYSC*@Ʌ4ykF}%g &FR jTgHFAQ|~;]Pο5ASAjj$@TŴIIz]8vXѼ( { wjvdPA*Q ἤ:G\H2&R5 McaG| lv)+Ɣ(FK* AR҅f˚JGs[݈=e gX$Lr>5Sf>Jv'VqgҤ$/b{(?7MR$'GYc-j\ NO)|><KVAj\j*@ FnWkЪ?(TOa N[i4h} ~jaa;EfVP#ZBs8xwC~1Ă~^9"o"+Q6Y N%߳G!|Zf3!23H^Lh.b0Mr')ֵ x r^bfa,7h_mx<5X&x^ahŋ!2l̴a`";}bqHzLoCm~P{T:;qB$kLH*b R\"1w nW~tP[$:HyǷT'zhtȞ 0Yk;Omab8,\~vܒ)xI *bnZkfSHO=(Hrͧʟ( *dquxE͏mkW!*Iaz^SZhrfV?{{X. B\-A/V?-nFIĸK?KM>zͅa.j}|^z*iw4aӖyӱBr0D n292S_9_ihwdTa iUzmn\Q"U;6K9VǴ`'R8`֑h1fXD`2"9܋McN! XkPHOD8eaI`vr@fߌ]n}rL?1ôaxɝpn'ۇ_< Jz#psSW 唷Ó|8G~c.֚ 1ʨtLz(Q _CPZ\R"(|ƨEty/Ri&4n?kc뵇l Md&~W,{DDApҮvM>{ rpJLH=: ᛊ21ǒkκU#%eCBO? EZx7'poeS{_E(L.r&@r<5cs2;~[FP @ O{UI}*(*Xh2||_jWB^0(cˮs6jbd*к93DP&mE9?K{ʠ}:x|6IgJDgz_23`Oz[Xh.5 ǂpt?a' %Վ+؍ce|1!ȍ~Kx) FQӁC1EI؆ftH{!'1ӥr^;q34%au>E)f(jT(!Ω.j)8Lց꽏7*%.C- ~3oYrfԙJk$) Jo b u(S8#d.EX@5TZ|| *|u7]fB(\cE+x]ˇ.z~Wo{ǦWF6Lj|oz m",?NJąlfdlq{>9r#Vi6HPk%\ljZ,#`D6ZvK6=`'|ᳱHvw&BwX,1LPŚ7@N9$!B=ROΧ $˼.9ZHD K3Y}6t7#ct"*#^NB#r/Pf29KX54 w&Ya?%b"CAٲ%[[_m,5R^QdY N}Cd9)P;yţ yQeZHK&թl*`.!$"=s}9 :,$7e|Uu*QZHN]t*5ٯ3GXos߻ WF@>Ο3g⦛nJӯ$фy=:S,X!S+V) uM^KՂP?{MNt,ɼLlX]$Fy23wTrB&8?&OÙR)@ފalэdywI&veRVĢ>"Dz]4XK^2F՛LID&jDmaD8 J5pacZ57ЭXX ΡL(v,QB:J1>ף.GcD#@@y@4HI%SdP$@x:%|Jc P@4{^M7=7Ƒ*_4$ @'jIsIdӝ.Vy+skZFmkyi.&I#]*\R.%i@7{S[8C8w<Ν?ͭ\nun1 ?hEV\?58(2 djP._ǟxrKDrdhE%f΁<53*1$KC.pßY5\G{+AZfPoaclH.$K=QB EKqM>r2'L8yâz8IjC]If蔡Gyxc"a0NSu_M9/ĵp>g5i+ɀbA}}Z8i[k&V0\\uBsPZ`n }:Z0 "sAmCлW[VSU0;W<6OMB͋If|Do]wɚש3M?Q1 c"CG!BmI P"LۘhE^UPT&kd\_X=c1Y*2CB(W 47N=R8(W0]^5v/^8ཁ1<키a\'~y({_h`f} D.7bù 1i[_km8XfniI2U̺QIHRSe6֟b)5 6(TH({hPiXq.(b"'p\1d@RѾfhS9H(Xv(P, ٿ҈ <  PKZDVoMg.~Wk[@kj?HypcC@`tcX,Tpv*L5W·R%a^E)xRYNXB$Ԛ/9q}0 }>/W1:&ga6|r7jQJQ 月l*IuK0b,d96Rt v{{҉Mn.܊I'Px]뿯'n^U^yi~S3K$Ց\dbg? m)Yaa\_qH{PN!E3YM]L%YY:,G z +s;mx>ſnZ{ߺ(Xr+>=}Y董eSIspO"Ư8/y9>%G M_B20$MQl|!L0꒕hF__"3+O9~85E`WRp}+Fչf( | xjap.HHu&Bӥkä@B JH9 & ~['à]A/@~:3%FxQ*ި& VG .14EJg.y w%]F+:so}r!6J2Y.F>`: Ze jI~Fy"CTS,Kɳu TB\&6G˷ Lj2Ԛ+aę`D;QIVs&>/5Mu_~ 5 m|Ar됧@@>򼑣5-^ny/5DNxb\Gq/arj!I9*.LFH sʴ˅[b5BQ\{ƪ,+P-1^;u"뀮 r:ˈ*鮼 70#ȣ32H@:I(e4PdbeSE𳭞ޒ 1c~#)> %Ȇ'b GtX)6ep':fW o9l5t,[T9IRg]=MrcPTx.Pǡ&h{s犌} Ś,>;&%:"mD[ 3bww}Ȭ on*5WS&Y皨'5lZPq#_ v%M6" RcW.Ɇ<ѢbuLXݯibb8z$cv@Yql}.\\:mP . ]|e|Hd"wKT6 ը$N-Ι's RھsyoiB7xQKY:*jQ4aL*AWfAiߵD Ok)}%E&J9jdSHQ*W] >?(η&* R=ׅfIvw +D4"/.Km6S__4QuF|L+ 0@Yz&Ƶ"q+%F ) c(*T_^1g`=l3PZʌ,R9`Eu ,vuTO޻M{o>5{}l? |aC:L&jPa.)9RlAbNHL|Y18`\YcjaQ {P칉M:U{h:VT#/\DqE!4#S`}*$ko=Nj^r/xY@T=^=OEւ9eځ"an#7#D/`^&%G)0k]w%m~ ]{׿~-^&5`1 ^$ibέoIVP|I} 鎓m0uISwzTp%GMxROEK!a h -KkqfY˓Mo59}M>1QrՍX٬Ri2QO@-9i&nEȜȵvx/bsHqȎR9t1кnB[@7g}5!?5O~~ih2vל!nhTSGN(䍵N*>$@nqz֔)GT6 :X ),Ձx!4^S Y8UZΫgkA&8&2Nk(~B/׊,C*X.0bcc+/>(΅Ըm+^^^I," DBT~?#`6ƿ ,Mu;7oGK4 Oߴ|hW^_?5+a-a6 *N !n$h 4tEKW tݯX%]d $fY=RO-ŚZLÕ㝾xI1߲dM|yY SipGawgvbZ! 8APJ UTh+HaFkR>`v_?h07WZVZ<'סl_spͷd\dD,Hp;צ^sF 2Ծ8Q.(vW!i}Mt.gRTk3=(T/(ȄC31ۑ[y1{$S߫5af=;xH]DGb$@r(oxXk&4"!O`'[좝o}VTTK 2l<~F[xӛ޼_.~,ξ+;_=}oظwQpPYl P#'"vE.?[VН $xѱljM[4_ijI/\#.*  Bx"` % ?LDbj.T&zSrzNRT&d(F*IDATiyf2 bz7_*8 pK!Ԍsj}k%\ 5QAšen*z=vvwptM%?bbS@ :TjykXǔ> K&g8 Gxu}sv84sÓ8 Q `<Ұ`Xrbl|=Cxetԫs@ @~%LThrW()zJH7Pf$"Q>跮G>n-+?z}g/?}:_^د#+{_~w[g'cAH$AfPcvԃFI!>1?3!35ι(XHM< }Rbij#)=%nLlˉ7}QvH ɧ{x9ylh 4$""A6"& ,F .dۡx{v'-8蛎z~3w~㑿}cGa@-Av@T@C"fQҔƔ\߶@cMԭ.\$Z^r2\Յ=59K7?*Rmߠܕ3Q{NFcUL\R 'dƴ+BhZℕ䬪l}I#ZCʥw-yC#1{e A} d" !kPX< PJTj2'Nq:s5m1~d-3r?(wT2A X[;̡sw=˛8qj9cLL >w~Dx)@-k.</,'|8fՕ ` aYqXj2 KL>d`c(6X3cj"°C)UfF7&v ֧+ 6`_(rem%ؒAA# 5XK  MG4Lb8kֱo}߃־%mn="#H)ٛZ$")&i=>XP./|/ u|EEf  Rj2L);?rsKJ&\/0Bz[1$-H{Zq-OO/_ nB$X Pֵ%\s n&MoWbccCll.^go} w/.^V#-EA 1㪜S3% [S)d@=` F!ئ2.nD AS(5 "L] K3ߪwZFWV,|$)| Yw,Wk +"1>p~s#l JBntXWo=<ɒ,hgXNIzԏ!.h]Mrӑ ufʐF "#E߲V ?rhArv5KZMT9Y]rLDD >azIVP#(&UVjW^% $ _8QMa}T^/_ ,:0$4MZ]񖷾 '2Xa]o;w/s;{6#-A|LI4Ԯ.Cf@$~d 7SEn 4vhpu~!Ď:\Ӕo;ƘSdŚӤ{L|*T@T+X40D!UXB=V!TZ$0+$+~0pհn3v*L-:r#cڑc'eGO{{?OzZЍ͞1/%8D$rpPbSĈ Kbaꠓb;SJ7`8m{/OQ.r0!F**7abAHsY+^(ܲR7<~$L;W|Rv+ĉ+~TPP|V|xb ĦCԖ:7Av8`ow)a$u5=9~?G~#X.X.D^qÚo;~x{ǯW-c+z=`ED%QY0؛5" *d-1'9\ں: <:j. S+|v j8XL6R Oc0ARO< CUIZt-k)u1 (7svg" ȴo.dfI."Kl_SG3kF~y,5J,bd/nv'lw`L?]f A]p^7StR>D'PwiˀcRӸ>RNLq9g97pkn-Pg)$,U&L/5@NscUEuNKE ^wˬF܂k֫5Ο?g~ }[xG"CuL&19 uL}=n >ĩS'qrD%67U(L8_yObcs_XGޮʜMLSz6)PG=sg2Kdg<77''@ ~49~4bJ*k`%.Ȱ9\&>X I(aMAg`,0 >HcVN1*^Uv9UУCg$Sv}ƈ,wW ƀmۃW#R^}Ϸ)~'.7Po& ܘa~X0 KĪz7tx1$ex%0$ nM(jamk+oFPZ?LWk\#zzV2VT]4i7VRN Bqqk6O JEzitVxpE-WrSeyPz%HJKR4r8dN iɣ!fRnƈ+l㼇G11X3aQ`zxO>"m\Xx7h~sɢA?9^Z1%vt5I71;0+ M۶v'!8Wq`9+_\M'LB,)T2sK֔hُg& #t-NbjH-s/ޓ?ܙ%i=sRV7vߤB)Ʀ&+|pBB> xތ^};6674:K?q7r o;|+zo_o&GދǏLb9%*wbIÀG>?wO>xpDY:R t!}Ag!7A.RTE*F>G+/K QB"ꢩYҐA)Gv e M H@#}4NE" b"t-.ZtY4̦̕OGc;swcί+o0D>0yUYPD.:|فq}Oy4̌_nm< Bق1Ih"۰b<|T˞|F?L yc8j/yܭ.3T1Sdٺ]WSW:79h'MFfY>U ZF666fFN5wȟqk}@=ѣ3x{ރS'N(8(>wF=yz^X8yW^F8^_t} "[51+簦쵮ix'S3G B1$$D[aAsVE&{S\F^Oз=VusFj||`jSC1 kXakJͽ`㣸NA=H1`U }+O?PaɟAN>CvK.p=ּ_'ox0/v$ Ek2W1f@kT݀|tȄYbHEM,(*Dt ]S ̗"1Ji 8`0Im%j iN0ec AzרZF@s RM*'* ToѣGq,KX;8ףOA@awz7?ƗYrw~~ qvy]r+%$N qz/z}Պp+ox2 E:Ji5R7-|?/}xᯯ;TmY\l{_HSU`yRw0\6I$Q&ɲ`č7ވ|c'5oO뮻'OoML)f8qpK@]0֢{ַ>˗.%ׄ3s%;zȵ73M' nRifOU踉( I#MEB´8'rY3SYH)w}?VT 9P?+2y"Drڟ'gsa_cGEjM,sFd={`CMEt3ԋ^/dh{Ϧ˺ "\aG/"'΂݀|ͷ?PG/<߻E"@zOo#QInbBe dLaV#̾0H>ΨQ#hJ o +nY> ˤ ͮ< )1o )UQm;sUQ,h¡*S@<CrT0F88Ӑ`o~Q(%8, ( Tz\ XbXL: 4qca= _=݆_n|Iivm8~5ܜ&;_-;֢,:b}E?{7t3.?7.^ X ́TH{%YDm :bM,4brA Fc99XY7yB@ՎX 4X*$lי*qI}0c乕Q"`UZ k 5 _c`l‚^\nHYNpW%% <[.Q\8^8}¥+5Ȃp6g <b] -GS _%r&p$'DG,z1 L(3d%Hx $@ \$N @fd7@iɷC 3ytΏY2k6c^= Ujz9gP6R3Բ5ԇ*b}L5b]1;p)=zŢ(TS4N"7d#x;މ{|/?gB܁7)>?w8v(9R0{](k-: ~ u謅5Zo~=n' >#(. _ LYuQA ֊~ƁYjAfI5"p qah'\;kT3;zyv8muښP9竔<{"ct}ׁbtCO6G@b OB"HZP׃=u p@^'H/)SDLy- `X_ww} ^;_xVeݸ甍^#$B8(w)!8E(Lq jFhGI.C:Oüf/ lڤ9klM"+I(ށlyvr.j^dV\<:)i0Xڛ,k)nhT'1]pajmN: JP3jc\`cX&vpIߋdbN8[G\,4Utx XkqM7ầlb PӇI5'N5sh)N0/̺ k,JU.Z:/;Ūi[ &>e@UW%7ٲMfAovA 3pJ !6}N3΍4>1AԌԨ(^I5?S ^&{#45`XGbJ~)Uhdl ֵ#;65`ߥZc#>_> _}x =Yݷ.qݩK_{N#._Nvzoa [3VIײV;ܢ"xig ;bS抨&h]/RMι酘Jhbem,Ŀr'qj-}0C.T+bkw,)mGt]'O 'Cr y\t 'N+_Jl99,KlllWx^nя⦛oN>bc"ʪ@cǏ[^3>[f9 3w0_(XzA^3(qa?VوRpH8h&A5v&4rysNyvqf◪BOX[4clYnfmqb#`dm9z3uRQX!C}r")."UDdwMtbgL^CZAׯvdx ?;_[~=aFg*"~}~_z~SWĔ`UPlrlk.Ğㅬ~̑I zkΑݦhA1Rv͌߬nFCگUXÉ.L':FkYSsnܟXbsVG{{f;^z,ba5.?g񖷼7x#|A<#>~~ .\//o{["% Q9eThaM"9+tQB*31%Ra>KMC+\A]3ݲ6"ʧu`B4Aՠ3-2ߥw<R aޓL(T2B$=%G<1=uM{zYYei3y 90Y,Xo?IR -V0Y;p{C8=v.oo>o|M_n_<4+/YwyȭB <ݺ؋ɳ&%V!&H.8v$I5d"T_= ƍc:gCA0s853gÕ yM)peaΥдڧH`Wa$VWRJ[NiFH!/؋P O&jp/[[G&M5ܹsGŋ?wݸ.z)q)|8W~%vw_0׾p}`Bagg􋿈}ck}q|cc=VL_җ {]WpK&XN<~j*!TVEuDsWM#OЀiSSؿ"?7Ν2 )'iC*OAIPz = ٛ麉CF{T3ѻg < YJ2{fX29Lt J\ Oh Ζ#+Mwv\# uXn ={8{gԍ7c~%k+3\vI, 9< ?{ ;}}{ 3 rSzb2P5❙\$iV o.s38'OYT h}귄?tqa_G)޳"{O_/e\ܹs-oy zl, 7܀o/<:q$tKu/~q뭷~?>Gz7_wc~OVs==‹+G_˿4\:残[nu_O5*qSg%Ā2r]j21r`!P U&M޻jQ/Sr'KhP\-M%뻮iȫěVGeQ>F_wKk^G:6?(i8 פ;8-۽#; \˗7%˟mBw#x\_W!z;w}7vww{++UrǏy-Bxr}ƛnbr,O~Sĉ)|~XVܹsw;M)Z]L6+}i'r]y"iuPqmU!ʎe\΢JZt 4{_% *s>>]V[s1Cr$]he-#O6tN Ok~q(/[I炃 i:/hq_"q4c#6r-X ­`.b]nv0 R$Bz~ ;tE؅_Dß{$_ꠜjE&(2J4v&7]Tiį1eD~WPO%tʻ-L l#Q\hbuEHA%'=U(_!*2fEBA8BwRZ6WD+:'!I^{_;< >O駟za?q?p-7cqN:v&nftbxꩧ_V+|C»n|oo[Μ9\qHPd5s<=jXE-JlKLZJq~W0PX] 4'|q;+5T5ڧ8 HYv%zE ՚k]~ Ѧ=¹6ů@ByS _C!% FgH:rNK:SSϖ#F:Dwgd2upORg[)JpdCO6bv2c]xV+$eJCNԗfjHC40UI̩qȣBNl˨*h1dٮ. Ǐc\w\r0L7 | Ǐ?Ecsc3h kcc]}w{}wߍ[oo}[q77oOvqEݺ Hş}2Z +Žo XΤV&q.D VJȀBC3#Wk)g`L|{d n(^PA:$LgL?3_눮X~UL4BlB izI.t}eQ⟙gΜj`v~=˹O>58["}-6zJzܠ$"#$gࣺ`ydAe vo+2̲]FA)A.![[`AX)@3<%;)9gT%1pX$41>l?R;Oիa nu4,{Oąq1t8rHQ<+pQlmmc>}sڂ_WCg˗t";qGL=V{/Esj\jl}F GID[Mj9q'L~USs^:ސuԸP _0}]v!Vd>PFK݈lz~w΍>0(A_<.:ae$ _z"!OS H:bt&NH~0Fԃ} I藈USkn W[@tebؕ @q:WXC3$/},;r 4MFrS+L*aD0{SdjR"d{%DAsh`,Bf4? q'W-IZ^Ø>@ UǸ&5^jBT'zcz'Oıcǰ(Dx]r<4^w1@X'N7ngp9p `f<8}tB(-D i񏮜,e<(BZ=A *7p̠ϫEghLLMAuXF_^Y ՚@vKЏ"VT#hTiZ(wqB8#]ya[jV&0> }Ŭ*<6̀#l!tx A@,q.>"!d0*$廊Z_@)1Ljm.$\z!FH({["<Dt!L*d}w[3m%.]br|Q-NEV7✝EG :ٯs0 q(֪y]nRy LHCk? }Yؑ#X.|gϞMĿrU,kv+IGwȤx1 bX/`/:6就WUi cscl/]駟 j\0O-(OD*MZ>yH--P-J8o3_" 0L\WI؟iqs\J4"! lDJYM]HYG۔587`9ã I8;W{ :j3TJdxT! }U+ RE_&,}"|N˓\" 6} !G %|!ّ{gʌ}$9S|F|:8?Z,M MRxtBV$혂JUda-b ר 'ܘDnؚm$?aKH\G0Jsv4ټL2TijLyRDʀ۟(_t*gtQT?P2ȍ ΗgœO/g??bwahgΜ^z%6%W}: X>a= _qEx7bow@;~#FWj|k'?+{Mo 'NvYqLM}r kjZ|LU-W%d2R\T*3l3}2ڠI܀gB8Z xj} ʼngQecES/ ŀDs5 ɒ8d+!.$ SKQ읍+kL"w@9#Fg%u1":JAA$E~+P:8I0LN4sˢn O#il>W({1k=Dz)] AVCQC GoV_{ST+7@Ad U-iZF[afFP{`!^hZBʤf B ʜHn|;;9zO?u~G~/b;Z2/<4ΟG70w&4{7No xmwx+ &sca<~3ŋ.^ݽ=c0k]nzu@ {v{[tx{0cp=._gzyBtQ o%|03MM_MrA>SV.I=\+- h@nuPY{1Ro־R0 W@ ^/hLpJJ\b*9YJ%9Цu0SRHe%e~=0MўDJ/턫<h0]HEA+`& CvTA&[,~V-eMhˮJm5у8cWm(MG^jPOGdW㠥-{Lc(j<<&>]?rEa+ uCb 6S{g%zV@æ@", lnn };{_=ފ"}//ww"鰹d;2|txz~ \s:%,vƟ|-T רρ^|[Bե]gK8~~Õ+=,KnİGo #[r,zoӿޯ~.n;}R5M#Ks??E\ z&nWnV)EBb\eMB59*{1r\s6P Y?@9n> mʜBDm9.(,_CȖQ>frc@Q9/ d0SR#sSN?.7;:I ƆH%"y$PkY&8E]{xETv *&}j Wng 670 @eMRk7НQfCiK\k tԬeNT4+>CT3߫zY3"!777[ZVw X._\| [K-1b;w]neNyܸ¨QmA/'7Nח۱=\ހ3q{##&v/ݏ˿K+tf `ciC?!۱Zp^1{=vwCQ*CO&JOK7~ QTp]8 XQWAh=`nxS_i W%px q; cxml 0t]RÏ_T!=B/.#iQdz\;FM5nT7iLܤ(! gY3Hi/H&΂Q*ԑ`)_%$Tk1ҝ( /Bk*e)cӯÐPwy%Kr@s{jg6 1@3F4)?}۸{qסҢ|#ɟI_tcc l,x%Lo{ 'q],'^v8u*243g;9n. ǎG݆G/a_ ?ƻN|A:`K9!q;ԟq$K+w.d?o'a_>\эlWD"#K"[,&bЧ|HskgU]qx!R< iаi09("/J5)X(⎺uB*3@)X@B(J`(ŵ]X|X,/ySYRdg` >ӫFN/9ƷԭcsM0U$qD1-6.E@&\Ԗ.hGbϘg;_3%+ɔ{ ;az ǿ8zd72ΜV+wBAd/xiAǏ]76ޟ{};e—|aƃ0.3Vѩ~j c7gWvǐF_gƹ3/~\y]e#ж=C-rYȿTs}H5LY&OmHA\TqetTTxnf 32#۳@+!{UV8&1`^ l΅S`=1q'"XO\Kj3:"tc~a7+`" a?{(_NxwU @18 FS!$ #&ҚT1].ؚ=^LWn0< 0%]l W Ę{Mdhas'4Emj*QgNJYí\h*IYyIӟB%S7W!.$-ޯŏb[o?wO;lF|O knQ._~Z{E6FZ,6>׿xI`g8{^lm HrO0O| E·O3~g/2}6?a|G ara(aBZVΞ}]kZm*"7qvPPi՞ܑi) ,4 Ap=>jwJ}$2ptC e^/#r^1 7NNbY~uv]WːgexcVl:@b-fS܊&(Z6 0 $t}l~-BwC Ry2=kLx]*DdE=AW@%l<.#NM.JFA D!~/C{{I!K̀nQ؁  EFZ g@mk1'm9 )Š(bAF@SQZe{.FXbā S>-_Z SwIM\%&x0@o_7, 7<[Ň߳#[%[G'fw 4嵿&%=<w58j576^on}w|Qb]oz~7uZ0ca_~+/Jo5kZCJc4< svŭ0P9 i.:3ă6?!gwd2rEF t Q4t LOIT{t!B.H6E[wyl60gt0SkgZC9#XoEI> ]$ { 1r% dUPÍF5ܚ.0呀 XBpQ an|9tflҞCdNjMX((9I#Ha]l$KnR~ LW}mR l[ 5sV{+} ~ϭS 2ȝ+h6Lj |A"u(zU7F8Qp |c:[G{^[w.\%݀}]0x҈V~A?RLtS]'] dyoARВ_uDv+G9[&C`SUu6 6Fq' }7dWl`dPx3cP{Z <9>1q3 }[w~F:8G7l-º"Yτ?$>A%l1| = 1t0c"z}l8X3GV}M||ZN\{5J˩#ͅ6%B6IYL6avMǍ:x'Ix%h%ety[]0_pχfzu$DB"]cDu3ٙ?qy~7=moŌ<}lihA1b5_RSJNLfad10 /8R,D8D9t$HB9 ^G|C P= v&Fǟ̡'&}J$D^.s\[,[iB6>uF@٥hDB銘< u5R~!w'\T\% ^G=}c0.+b)$9SA㠜XwWWQrZ7$*Y>ތp!.zצy%-YPP>| F|RlMNu,`Λ*BE?'F6qƦ7xD5_@˯Z~?WzLӆ4Vmm}KaK8*݋WZ_ׯ;<~ΣV[aV `z8? q{0 <%͋R WZ=|>* yiϩ P#0 "+y9e4с;m`=\k DV@ۻ;Ѵi!_Fh)iÛ+s[솈t59 r*"ɒLwe_TkT|o~ +2|N2y8`Z|(?m=p'5qPO^,Y3ޭXnX3aI5ݜ&)O iqd?t?#8q/ce/vvg.aSHE1DzQ2 wo>y ?=o-luIs/_u_V!RY$aqSnr6vOj^5<|zXXFsyըm``'$pbhb0lӋ!Hq\K'%-" K2&9MŸ)5 lxnT!:lmnbۑOy6M@nďdL|VZK,I3c?J7 @:L: ]i_ *(VTlt!/b6}`5 !&ZO]M!_-8}֗ӾZ'#\ k-Mc>51ėAp&W>(Ăfʽ~R·촦ca (,Xy~\W}Ü놀5%9n6?X,U{%3ΆfW <=&}3 \ݰ-|-Gs]\a_29;h Ԯ=;FkgQ*ݰ悍_A]a Bi˚SqHz`\]d~,Ԯ`ufq*[ xp4ZTD8Ag;{:,5.-:#E_ɰV0 ݋45fín y.$[f-| &ɣF/'6e :4,d}PBB%%BxʉF`{W%sm(W)ZrkE6?6dr>rpUAܰå>jπ%wD*JjƊդ%usH$F+xz#q>7zx:WS'+Fllz#Qm`>e>qx] ?v?k,f[0Gqq…h59H5ٓ r^嚩9tu*@PM l 9-v9Qcdܓ ^q$2g$O/-©r>7}TD!Q㨮b|Z R/4xI]V &"y2-؂0W!^| /ZGɊ֋c K ֲ*$axS `Tؕd}}~LVX};|&dY_9٤p.d  Cúk/l}5ZgfT_TR>Q׶ȢjxzpqJhTA<-PgO܄o: PmlU ]G 7cSjrN5AB)٧y ё$l{AM@H~G\r>9LD|gΩ0{_nig3*A 3)wܔ',i2jL匴VDJSjyH+j`8{xC/ěH||*M ġDTp#=6}KOí#F35=h\ 8-1nFO]`X˙&*K6I*}4} &eS=Q-PuڟA|eu^_)SD何c." [ihRz}6˂`N(E<6;^@,l'xP _O˟++=V'pM'ZB&{49%ů;nl*isQ`"atapXpqןo?:(8=)2pbVTq7V 5WN=<v_Mdb2f@I@]&f.T#[A nzGG?a2`qP:crwŕxa",>ҎSa} n,}cR T풛<S]c_N*wqY#yt>IR`ae\ znt q$k«I/uv5[(7ԱEQQ%HGωTfEh #TcK_7DBiEfAn 4?ꔂC'҃ cᙆ`!ߴel.ne?H# |:Wˀ ??ƩŃ ZSԾ_1Ƒ1=V{8±kYM߳=2$Ƕ׿oV>.\.ɓ|HNy$W'UT!T skfRJ PLSdjH0IN<:UOnL>!r6yJ KQE{1hs.:t`l$qXxsd1`Đ;uxafUE^G /76(]|& URF{ u[[D]z&e긐NX| \ZyPbjc&WVvy׌7P6s6/z20ozAೢ6Bxf_~+ q}Tfx~eZI^rPeǝ7㭯^n'"[.f%-vd争!7up5/ |$`OԹ>ZiG?X3wۻvmdXr_OfŻDggq)8ɛ *B:: M$Nݪ&5P핻JOLL$DG9z"~fXwf8.hduXR98a*;h#JFWP.M5S͈/, !>H.)`a;(JMġ]/˜8Qc2V=%ktQ1A"f'I jT`}ðbV^Lk}"i31` c`*y<5 0ڪV;4 ,A!u(GrN!:y O$c6ɷCU"Ƙ?gu&G^_rx5p5>yh6eVk}kxOy.Z|W*⇇}`nW<.].d<[ `w r"+Hht1HB%ﰰ&̑zUFM&)4/i@ I~}1)(I)HeU(h.CxNPESlJwra4-0aMDsAV5 +F)*¨=&$jGKHRܶdȧ暷XE2@J_^&%?$IF` !%4#,l.osmgeό~MG/UԱE(`׀݌0=2{Ea4!lUvGi şR\pp2Ү Qaǰ @koM&@o|4C;F4}'bBUㄙ+@ʬ,"3 *&2 9Œtr*k+;2%`ǘ YyĈwRm(‡b1:*@ %늝>*@Sih%Ƹ^yVj|P$<]{VfOyZyi&EP NM:]XxpQJḡa8ofGǧIm NNz?o/ j٠Q-ITA/pْD+G*x2?. `.5ړj/%c$AG=^@}?j.x(ɩbOVh{8 am+>G[X`S&dkӿx?6cl6.yZ`  p2Eً(c3Vſ2Bx駱^-5͆0\ |}PfJXd/#s0:}4PN2bF|^D:8Yū;ҹfAqLà@eQ}^X t1<հֿ2'{ p_ԭEdcSo΁DQ*_D-#I텠v`() ؓS,+w(f4@Wez?JOI1hy'+|L瘲p93\8wIuPxT!\I`꓂™韮;ŢCws%7]e|6v:1&QMaխ;n C@>^-,7(ib&pc}x.fOhq1S5'W/2^\qJxl2K#3ަG6́'핛$R\ e"@ .H~Ha!@?'&QxathOiNb\+juWŶ9r=yE9\rÑJļ-,RhD\5PL,f[IyDjK퐯(֦>K2fNIWpɿGc_kncqE큺=;ؽlFb#@v\:Tjz4U.>Q}.63灧3.l3jcV&ǥQ)hM{ᇿ7u|V _!hSs r0y+({N_M)z] R9RD;jͨ.p `0 Z8籹O{/<8rs@R} \t[SCS`kez5x쁍u|2$+;(Pg iZ8%N0J \|rK&^¥iI0{*?ȗtE%N흖I%3 7fVn9^+'6ZWT%Xuo=%h>h'B及H8wEv [;rYY\l=oOzlq!4}9H4 XDUac>wGS ڃ. !pF ߧO"0^9N+ɲb0.U<ApqJg_ :Gc0 k㠸MοB[#>.;qIF bJؼږߧ\2w0X#k#? Cw|?^(nLEYSD#+l=PEO\Ɏ(%MFt9\ .g}$W^NFO|r PĢN] RF 6ZÙxMjX*+fXfl䁦mȁNy9~5"Q[Goŕf"M>LGt0Ưn!ſSCߋv9$$0(k# 2LW2] ?Xo` Q0oA[}n.7XƯ]nVuOի)ι FٳpM7/yĨڔ0jaίBmAl&5O 5y.A&a OȐX-qD;u^U0I?J"GEFl&x0 UR3xs.XMzRZ B4خxg02!lşk`dn$ 7uxq+>dJ*@r]> upc6JHK%_^~uIRlŸOrƘi!k}{7bb)gEv~z-a#,ْIw-XV wtbn`uÑsy-&#0eAB[{Qm]}z|vc N(6n{p\LZ#]s0/Z^‘ Gd,2]?6F{X@nAu%+qT010z"Lh}z~DCS ~\}`]b<~9`=G:Bg5JDG4y9|IZZ鉿:, }!aRz 0#{w'OTmMhA#7POUӠu X.jٲ:ϹCUHDR"(hDDZaId2V~paCp;vaIl 1t=ggCZ2wsOU$bUݺεַp$3 y5'Uj-l` Jl1rٛgI|dufX71 CXg%&h6(_ko¹DfP$irĐMKFCeXZX.wss oHιqMk5'Cv&^3_S8s# بbӈ!*fNA%6ryEA| 9LNJS}Q mu"2.Q,+T ]g-7j"$d_o-{0P;=bgg'o@3q~8u4Ϭ&u3V{}ZQ}‘+[=}p,+΃Nh*X* $φ5X " cDL|\ag,MKɖ9Ź~hH.sCpvWФ}8AQQqQjk9ցN:!Ydz-s&FhW??vJ C |(eTt2a&uQ JhD\}U@B(f\w *N£)?<.\޸fīo2.&Y߻vkSx̙L%'vp|/\'Oԩx啗'*@b\ k{{<~Q|cE5FB3c<&^Iwz\;vIDATHnP0Fc^A9A?,p83s2V٧vg6JkAFS7Նxt%ςȈ0&(%y ׇNJ⠑M# k)d#"zJ/(NuW-|BBSbtnw= \s +¬;y4!IP <5O Fl$@hStF09 TpVȿ9 tHcܛ 7w=@a18o 'Nv{.X$IuanPL47SO_< E W^שkr0r#9pig %^' ¥p'Oӧq뭷駟% `gg{{{cs$v&f.^}SVgm3*T6(&!\#IتXu4Z 7wpC4 Mr܉CƸ CwD;ٟ_ AC(12àgy} s Ba #焿`J,0xK1f ::iҠ8TfWYF!\z=S|)&C2oEI!z.'$;!bO' S;6hC1d?o%2`ia,4Rb}L!]q|"2L0._gӔQL#eL^ (NA]e_u:!w"1ICfy92Tc^#*[,KceRY(gRlߑ ^l!,YDX+{GdCIjּgV?eKڡ1쐆U]w 05)?v{xB#+S Uvh%in-al}#}ގg{5ChN:SNk__eamɓ'q 0'5qTfOcy;7{ n*$Z,QxinҦv6uzI3{GLÌ؜Qw{ؽ:|U0\ta_2.G7d˙! #!]R_HC*Gɪ7Tpz끝#'.s' 0-K(.p -NJ m%U=vvvpI>}Z#bZU q\x|[܌G]M(5Ez+oz6>`UJ$E 7۴٪&MdgCVBp-l;W U5 KX"ZVG'%  f94e7#uwK811jrXFOL(p 1agoHΝ?}q%uera! z}QFV(ryh& ȐOCie8zAȅh!eFNI)q1Liî%Jle'Ny[vB !r=ӁM\Z MBo Ė^b\Guz*9dneLB/*uYgt|ֹU-wz D" ǟl̸kw =!Bx9/e`'w ?\'`6ߎDD><2y _ 9X\8Үn-%vN,pqqp 8KpIcXn?a] &`ŋxbsM@ַ~wygސ>cRtaq}d BVAdrk١YB`G1[ Ol_ z@'2gS-HgsV1 ]H1bB9"Iǵ+R&&p&a-R[xd)՛`˔N?Aȁ۔Wt&dk(=;wlлvEC.E͞ xn,݉옝l'?RIZ'Lfb`U@绕ڃ5 f͓->V.%G0w۰ yOPVZ<ߔU@WC VfY'W %k5)TK/^ ߂O_~ ~ ulcN k:A1Mmv\*gcDB\ȄH~ , WQRH5\=Xw2 65N<=\xb hQ^on6,Z;ű:i Cooj wqmj<KVӈ7=ȝ2Р٣HI]FJ!D#dEWbO wJ a=Vdm.H0!y*HËb^{:aXXƳkOb9VP>Kstm+܎OƜ;EQeZ"P%c#@YPJ¬z:v $i "mLv+N 24@5l$NL/ Bj}-rs@EE 8gP4XZi#6 IˢrS'/ڼ}7L_'.xWoN̸C %Ϳ/S@VrH)2kKg6-b{s-\3_.'xs8ϟk'{{EW5{{{*]wݥS|˓h;Kka^O\ې#|Ž~px1oN0aw|JaTTUoQtif^HU>mrz!ˑt Iy_@!HlA#8fFAZ|y7-D0АɧFA\ s(69,+pYkh"7{uP7(@qOsK8?ajXE=X$,{d/D2(=g^^$]^`N7MLC`*( JeHHNQhn6;Dmg Q"LY!V¨?lvn$[>'kN nxba p&Xz";yN ؠɱ΀OA'')g]xkxhE -bOƛoٵV+i.0 6?ŋ;^=IMZbp] К\;l!dGO\Df]knoϟX  m,Ȗ8lRҞ? qx4zN̓8VGGU-VNcSu -_P131LjՈ!bLV|_D]İ?Pr"gtyGHVc0E #NkD$ lѧĊ+DLʎM"%}H*y 9E9ەƌēFǧ֥M(1S8आ Qh@\-Ta۩SCQًPG^١w^~£4"D^{ of%E5:u gΜ)X.n1ϾPdL 17!5cK+>D&~X`gW:vwwO<ىwy'Z={Km Rqpp 3ZYEzM+R1 fzx]U3J:Z1,Tc|3#eDJL4y|q3m0|^ }kcvUn!pc%8[38 |f::  C!D8倨C5v"l9T%|yMؐ0M{6?s&gU߻2.ca3Ua &@4 JIwY$U;54kr[eMnŮl]x≟[BJ1ɓ8sL.,`-Vw}~W!|! cQ[/%-3ܿ{jZlї_GGG888ŋg8*bj*^@W8qtto~[x=w]7c'Ν7Tul67 D CO"08Z1n:Id;#Z|DNAnx}x5b1S 6 DFl 2S|qlQ\ 1H<"eގYG5 Lp|:szzφ/Y&K@h.z=hyŠ c;ªqu mJ%&X8G`K}z5PGp-@Eښ }yV?D[oU=(\YGq_:m੿7/ſU70r_v{E"/ ގzr(ͣ>}!'\`<#[oٯpG0wzmdžhC ~ϩa^/K!{\ a!<; ¹d;JL݅sGP$P~Ej߅Ls*6bʎ}iZhHEjX"Rԉc^ RNf:k WLKl(l|M%P0X2EKO&=h/Y_*d8XŞ16Tʤ]]TA*+=PMw 3a ~' 7dKdXJX vuİˇ=O|k/BohŕK^~:4-b՛5p#~ Jȅ*}DEGGGxpZUm&[p{%|3p_:$/=KX]h&eͱs"}ap5x:.M wpv"?q_qxxrZ]>/ƨ YUi{V^o|~n4%vABe]fU6E ʾfl,2*25&vsW$*g[Ś6jk eZw7g`"E"8 &W(Uv̵3>5DNtb0 -k:y#n&$Jn3N nWs u̬N WCcC,O9dv+v熢t~0:jMdK&}[z$41KjYxnCq Xi\"hDu.=xseK=Hy MԹCѯd́)5Lmpǯ*}jO6--ev G[@/ͳ֯cFpލ{, }N5އ]:Uv4_N(nf'?ps^/t^7<__~, i. dűּYTf"2"Ϙk >vcc9yYI%|Y2E}s#&Y YhSk'l/&.blGj]3#*5<& H׬SAmy<p wRKF@XP WdsO su8[@7n^ջ 60DL&VMx# 9Ő`wTO+Ç7>lS݁igjV~uhz#t9Z7dOKeVF-ҵVk̄L'aJx T/x?5 t彬ȌyDis!஻(6.ɎRs`w..z0v#i(Gpp#  Ŵ@۩7-o?q<:J~^BXV6&M |{a|1E )Ech<ka0I.%TNPl2]JZqGp'"mvI ph!=0LEBL2@ ֝j18&G Ӫ+UVѾ߇_6EV!xΎZu~^F1Cc&]Fcddh(yBPs8w ˅㽫H5y T2g VֽJڦV"7 JB6>Vb3+BEOYvT(Tq`8hGرRqh> j?;*NVD_x/RNo >\wu @ -<%7/fii1nlKkޟZ.ёY8m`\e9ƣ#|M7݈oqҠZ6ϕ]xVR6d#ewekPD測拰}<VEɬ|g_=;LhZh2?XFVq&YkC?x) QR`ER~xɒb0 YlrB4<38 ME9yaKlNm!Vc=+~Y$M(ɏ%En J˺VeeXOfUd’.-(JKX E\|pX,Zar 2}C+|)ɽ t^Kj\8%DEsR ӆ}f9<P#EڰsondV=2ox'pBE =܃dbLk2H@; g` M"^`k,N{xއ}{o8X lS` X C5aG]Ie{T; }sOUB;I1JAZ.-6klvj}5p78z!צ%@6ui9X5zGq~ VWhF]FT;(h`hKZh4W6R"S[Ӎq!!ZU+\P&&d#<ѡ]>*03 C00F8b^d#/ nI4Ѷf(g8k gr+9uj: فibaatH:M7%d9jub]|,NS@pc$BVLs0ǥDK*Wd02BxVKM#RM_gS[oSyB#A]q9mGNMW<ã qa@_=O&xnm H@naa2 ^kv?mКd~boQ=೟, gϞ5d8 mls !(Eho|[q-77]g:A:l|ta\#\chۤCi}jۄ ືR6\wj <1"! v#:F] [ǜz͂>sΤʀ6L9Q6i/٠ZU7Ieb9+Ln BIsu RCq.,לFVxdr*( wLyT6˚j*VX޺tCI-%uk%CDcL Jrjcf SdX !ES@[k/@]>wPtbiglV~m+c zWso`y/?h$p&=u@o` v v`-mZ_6@+>?W0UXŀsnR{+misxկ5>~ch6GU2gum!GS$lpV M1*Arf{qH-GA '0~ 2c-H~~v/i>jt$k.X0:G~RƩ ryT?qV tوFDD87k ф[ZL䀰íyQIE HE]}@ p #2sBR!2y8)Po,s2#]wN/.y.Y\X!;f+i' rw<#> ;t4z,yCO hQ)6>fp7r̙=XtOFvȁa1.\؝*$c\T[;HmW&@ 4(-` P}[?7W{D@8u|A_VdBm=~AHc!_Dӂ rSBggZEp}{l\c6mQk=beu+(Gc."6ADԜQ0TF41ی!,A]Qp/G..\2TV% Vl׫uDC؜_XӚq_Ʌ0S)o@+XDE 6%W-4deL$#|\'V86cCh!ƀ8״ FZZ>/;fK?E>iy !H;Y{r,=d=P<ٗm WlK<œTxӟ>Sm"GŽ;Al!$@C%0a& <4^_H{HqȀ]C{}*v߶ɀksqo}_}{'* +(k; 3IKI`krbkU֘dU4zy.dG\>ng/{lf%R{Nq^z/Y댙\ M$等gb@L!6ɰ&{389vN$9|w.x)?,y@uON=0w?YjҟfDbgo t Wr90΅eMI>tye-s&[NseQzX3G.^j,!mJmHt0~cVP$4bBŖ;m{ Me15 z(eBhag%5!@C&4.^Lĉ͐S!8PͅEv27\ 7l7.W\B1B4~B'K_Xu t= QRLf@va=*Jל9̨['yddohɑ~;)d$.怐^~c(DO&Fw%D$%ބAMQoW JBϿ"}j35[{;`M#`x۠ r[@$C>??+Rey-2"mBozm/_~7?i;5K.-<^(Ll4ۆU-kMZ[*EJ3Bb,p8D.AIULݜZf $ '׈^!s 9q#+k#àI~%FjG K;{11<ͳq>M,1${3AqL2@GalD@4yVL pd(~bzC5jG$ +0s~"<5Q[Ot|ŅdXlC-;ϋ9"FeO(Y*)x˚4۹l6W8%$ֳIE3 ׳UP:c*/T{m"#n}C+P;q;sVyFF`wwh'0M *]G6\+V(=(Q}.0u&_yȹe,E7PU.U8ޛi:,|P^srŰ(dOYrR\Ca uz' GyM*[-lr.ޱۖQtgۆvF(aX BdSPEYRt #!n âԁ0{&zI!;axnS&wLl2$?uN[caRbÉvTT }ӕ"D9ڒ0֨sS`..{2O /q+Y&|ӟM7ԅ7sSkFݾ:ה\-1p[\103N8/EQ d"Ծs\}Zn|SG m^ ƶڷڱF7sAō IYl3`Ijcs6%gJYir|H/UhfK(c);WXz͸JScd -ˍB[Ѐi}^Oq]Vv]ԄP_ɗ.]£>Í{M!9s\.Vs0|lO9v&W{f@-: Nw~W^{9Oo↪igϾzP+Bʖ?x'VR]IgtGQ~Uۅ(!<㢫TBHɆ@bd51f4@.1!"u wXJ<<GG ZJ+Y4,זPW&Q(n2'@6Yٺ;7>V1E:وl$]TA =xPw:u;zpҗ:@Q歖yJ #ďThc#?ٯQ-J``X,ԠWD9XAY6*T9 dnLyؤ }MS"cS_p|zOooC !#>ow\*N!*-ڗ _'Nep…uMkeئ' Z6]ut3 hάMGGEdqGM31O5mPB1]E@Th\9N!U_ Jgߘ99>2l=ev{kbbBҙ9PDw1ٳ/)OsF&ټ&QQ_ "I$m*`Mj@YgbDDup@PeE|Mʾ1Mp1+BMi;Ey"&=dgMdcY!^ԁsK\.] {\޵:egJc$z/cu0" mt!AvT|lϟ?ycdvvv~O>s`k&mK%͑ f'> |qRf7jcGvߣu5w=p x{m; <2ϟӵҷ0{'+^}]7ӼJ ٸ a4ه=(Z^D/$-XVz PlQ_ZyG9HЇtn%]x]qKLY3aq<ʖB))R@xT"#֬2iKGg P>QK!b9+$>(E F.msjkoR뉝+ۉCk6?@-A`]D=MGQ\ʪ֫ r%冨FY$cnCoy~O_5S?_?6g/n|:7 hIy-'6!==|hW{M 3|_;^o^`9n:|.]o~[qԩŒo. *aO{O}VV`'9ePxx-너2ܯ!E!!NH %4N*G$`u߱V)Si! 9"Ԇ8NW)l 4TB]KzwI_§LA)|c__vѱb~^2틒by񛿞/'J<<͵9az(lè+S(6b%?gXE61ץ*>,qABq`У#hOxhMc]Bd]^Wd4h=hus8QVK,5ܰa ^&iF>^~;UTyGCJ@ 3=j 0P*K+fF L(B,/kgI;dl !]D>esg(Uhh񛒐}'^YhE PAFcy&qC'͡!t4>wEO} ;;;J5ǭ ~% Aclt;6~_:&? ZrÏo=64sX2J^zfdo ߖ(s]4ԜQch(1#w* `L̯u4,~+ɻ*N&d9y,B 3vI0Un>/>JcHPxBqxwvgK&b8L>rNN6s b<#hKxXga4 @t*V V !1@7&{PH1Gk8f1b9'0l!>RC!J&5ud)ȵ/@ADZ-[} Q 8}jaeFw\A@Cl=FuԋU9<&'Vҧ$J$8Zy5FaQ׮sxӟ>uC;.M !0>яn$tm v @o9/@s>I[%Ms>16(3ӚC9[&^!o]7xcY'#V4-5 Xlm`ܥ 2q14pȒArpZ,R%ݏC櫴DfǢ8*̌˴kQ{*%4flE3"Y88KGf{Dp+&@+l W# S8]l,+Uo7#om'hwtdQ^M˰^s'c~ T=G^jG}/]h}?gfi0G`2%J-, pn̑f9!>_6o_ۤ}k{k4gh$ xŏbx'd>T|T{mP&ndO0A\;byD@dYw{%͙P+N\RcYm1?g$"LN !.N^ә|j&D0~DF';#,d9ʡ05-vl vӺ\zryT#g2C ې&1B\ՙLj3b QOq39sI.EEƘ"L ,3T yаj^d+@Ê GHG\;RBtUi{j*1>um?'LWڵ.G?~oR?rz뭳sInf?G<0p\O@&33nV|K_~9 \%> jW'Vw\c=[nwyg hkSUcv7_ߔ c\fYTN5az4 :`Vw($eaӏSX ĉ},nHQ)n~v1ʦ>^P *%psBE"W;H\ðt/U{X|rJ*ޮ c@@<)]KLJEZم+[ ȱѧ-l#a.SFp7(H!Q}?z BL_'ҿYlB;n߹`iVw\1=y/"siZi_STzՈ?̳;5x~R]nِȐ%rVdmhU1Kn]s&NHjG( aʂ@JcK/ϣɺ kFz1F\ P!+u׆i36(r !5*,B/nD U1p6aRāh7])@`Q^Y|m;BHjjuJCv 3Y XX(1$->Fv5!3AŀeG@œ*(P]暕O.N+>Ž6R%7D5 ke7 1{+oYi^ğ:xشQ*P35sJ]ҡ%P4Z̩Z1?W_}?~?ߔcb;Xhq0\x' +[_m|̌n _W/~}i, :'=a2]tB kBX]C..PZF[V aW824#/rsDLS:AI.ِ^= 3N#6.HhS jbl-~kg7RkowQR^:!_!F &"Vk96Hp?2D sA[AzP&wXpg(?|Ν59G i;;WU}Sm;&mU@s??׾sӊeS`E7IvU X뮿䍭)h֖]nj¬vĐ4*u(M$KqeuB2EN2+ȰS-@33:< 8qJJS~gSOZM_pm;mnަ R+m\ pkMHǶS-܂1U˛Hktl г{uqǝwo/8|M!Pdi·XPCzNs]׬C{jVosmǯa3P&xٹǘbKb ɡOTdS30U57NN21 `x#Յ/5AnVpܰb4T̈<<X߮_-NU1WAooTTreNo 3W@c EBgy2JA^!{=qXP0 堨L MvuSm-hn*D.vF/쥼{&ƨ0JcifkVfVB.۴)}!}Qn5`yqć?a|smmW؂CkoMzm~]`>__q?lZ7ljzEpi7?k' c~c4kU`o|6糂|{{F6[p0{\$}J˪N(\Źо% b&wd`.E3HsX.`}t•ue䗠aŐ\/͗ #\ ^]&[@E [\ 9\%7@;2p${bͪ5pR9g ٘b$ _ *pȬҍ%Q,r!]l|cE3曽ZQ'}07W\#ǬxVP%O~a6wm%/⮻㫺s6H6M>` 8n )e8n߶I=nF}/^|볩 q Cڼ~x~IM|:4ՌДO›֩Y+~js7@;1,0ƪYZf Yۯb,(M;2ܹ|,jCX~He\zO\}0xG oxiEN4G*e8`(H~$޲jhV$L6#5OE[ePģ,dD32Un2_(k1 E7kg1<B%*nC)lB2 f u*𱫺UA>9 B9{"G5 #ڏ\ F:L 6 n2!3qO=!sySKίoG}{?_695|S "n>.Uoӯm~6#33 >Os`{[hcQ*`{<ַqm;n 9kUI5aB fCZqzLoko<nj$PAآͼӳB }vы\Ya)/˓6=tTc y0+ǣu!4r>J4I~ Cpp[|"0$\\s˽$ U14,SKBSi.ȲM`Iw9̅a"b*梞ΏJCFA.ipuBȢ;W^vSuWu[Z6==PrT%g۬"Xe)X!";bA[L3`rU AeJjt3 飏>6YpiOqM7]v?%K}r(@o=i9h徆^{-6ù~ˍ{L][lBj73g`wwmg^EݿI@rΒ]N2B&K,=sGX%dd'H̓C?hq ?**0 y۬[:7s` K.!Fx>bQ#Pڔk=b⡹a }Q(`"O.*>!xp}x\NJ ɷ/yII1_J'+kDqGȦ>БNlbvnGV/[%1.}HKīY|u,AN.FIasBUo*ipmdgO@*])fIY@ aÏ:A;^z{Ь=M[FrL˯ǟ@u~%So Ҷ@="`r^M1WWO~?Y9Z`+5M(@Ix'}Šn]qjg,ڦT_Q G(gz>/Ձ}&-ǵÑ95نrL&"rQR #3Gfȟ ZF͆:IQ RwdecT\M 9tŃnH\djɺOnXi"G86 )MqU!&Ljx.O4ۉ`u^GWcq䅫d]T!#`P#kjm4a۬".Ge_W\.q`+A6i9g0Կ6?MI~sS75+'N%|oql Yצ^sH3*1=c=ƇҭvDjsjtߊZm j?N/Zxj6|5RI"͖7YE$vM-/ZbPs5e 2@Xl K" .{u"J*u򘐘uD BWԄ DH;~ZP pn ת&/G*5R g"wb zPqdT0R=c(DG#t]Ph&R_#9ujQ^M'=42ƾ=cNZXѡ A͉*|i$^OlbS4a9ccKK?3'~7<_r??Ļv%EjQm'ު`J|)YW fx0(({m"}= Sȯ#|w܎SN'i%{Yϟ+rd80C9 Q 7.GۢR { Hti2(5JCN4Wk\x1q*5.MhFf<(HydAE#~b.jkp^uRc. pɤ!u #9ب*yV1ѐPԨ? RxH%Vw1L=a-JHR^jUs~[(*@1K^{zTHJ[^MԙPsU;M~5Uw6S_O~j{? Eg ^q m 6C,/~_pn$mȷ6^ҮZ$@VsI /.~㓿eDlMaVݱI0Dq^$C>[aePLWinٝiFwF_oWUH ~AfظD4M*W{Ӓzdd6,Upbq6Z[R򟝇=cZX* Y&t me2ܹD|rR`0rdKLZ5 (b[&i0@i:q̑ I<4*拴0"UZs407"yxc{m !PuDXF\?iQq2%MS(~$)}e? 2m݆??3g&?߮s.Ms@ooD̩EA[WM(\6¦r[=C=w;,h.@:=LcEu0xW_Td]-a:I+Y'RE.LjlIZ%qiR[k^9]L~;iUc&qZa +V4鐼- PSx oO61[]lt1e}q(DهZp]L Ʉ(`Il./:VtPkit&0B>?#3p2ejK9ĨBF,J 9kl~av[m}ͅ=a pM>}!0{??}ݷoI{5~gQrM*VsMq!x7[F )\jo|7|%n1Ý wܘ4T/i8x6$_ KMC͠ ns-s" e0ʵ0?Jow2,|FԿ[$d,;՚u7PЙ`6Fu91`5ŰX 5$EM`lTzٿ%@)5[];5Fe0ơ^cqWj/0"I!hF-ДմOtb&RJwrHq8qY]zt2 /"IC鬝r4<n ŗLD(KsTZy*k GsxxG{ GGG{oouBَ MޏI6Ծ)g]qĽދO?. `-)PȒзhO=4z_ij/;xlJj̤n 0UEdH!Զ9-]6A;lMl5@b"?}UH(?opr3c\%X,GWަ: 6}l(8eԣrIPxĜXj1ዾ3 vQ1*Q0+yqנNo BVh2dhJz(Y ˻tYrRMޢ :P d@:D i4wYVk8z3!% 952VҰDX ꆬT1+B*?ՠ}o@KL{{isQ~isDxK/^''[&9 •7M!skmA2 z\V?WU':na Pa hz~{q̻&ϣ˽2!6;ĀحBZ!pbv-N*WUK,؋O)u4/&@!J, v1b^kS.)Gq=Z^,r P+2d7<f*SvF 1VGE2բo{M +(y9hX1bx\c"IT-bؐ1MlfH`c2$rWAȀ=i׷lts] ^5V1xt8{ 0u!i2 Sc`L&4ׂG26ΝÓ?y 1nW__mS߮U|+&@N6-mQ3Bx{ߋ|.mx׺h{\9@Y_}5|g| Me"_HØڔ:!jXg= -qRnM./#T}]6`.YO\ ؈uB~V_.wl+&㦕:p!nJV5(fC0bgk.PZ%M!+8q$cE U5<{h rUyPWX^HCOHcsY 6w,sc|mf#9*AbϕËԱ/T(!ղ&K=pj3I{re.7dJ8R?7ϝۚw\bggg.縦lAKնsqqm"ۿ~x4sM.MA? 9.LVv(#}}5%1Pce5e:U7*-TDF3W|:죲*Jқ+!h=RduT9hD"ú#Ra%@Nhkql1)fc\ao' T0wBΉd{.Pj"z5- O }bU՞W]@)M~@6ֱű J)xJ# C5O"UQX&|29wB0,_-LBVM\P4 ^51GA{[+PK,TYi=zP)쬌_450Okkxg]3&w8և޸^㑇gc}o椀]?/s&9 s*t__駟dqU\0PWZoC?& `wy;}Kr+lr:XKq"/E>'oF)=0QxZC֯hB%G>/őG':E"3`ȊppJe50MgW6cFR?W;_- h]a~ʨAăץ>]QvZ)PgsB^đ{` #bd,!OOouc9ǘn& 3LgYDz2vi/jgo< 8SuX7l h{gz bZ§YV`Ҹ=̳xW+kc~mW}C?#mdow%$mmHysļiEЉ\H~;>_g@ kʳ>ߖh|Ri[xᮻ-ܬh]eC<ͪN_CG׶4/UePAC"(e~-#dYk\%Ҧ}84 (M/&82Y\c3QUu5<ǐ  X_>Y'("%:¨֒28 iv ϦEa RCnr>gdU"*ӆRH\AIX^Kcu(AѬlâ g(d ^/ƃ)6< K3f5b;UK[\O΀Ws%<'0Რ??{ލ^sh\Mpk{|GNsVkloywL 2L9f*ibm(Gxuih$X=3(5Ynjݦ- N4=JsPGMԀȺ7C2OV$CGhv>ZNe@DGًJoqS,Q+A | X5vZ`C|'~皀a_f`vO J|75u=8/ƈn> xIJ[8D괤@=@׏xW򫿒UEZC)I8ٸֲCmJ Z{ ّH"娫@~.ٞ?د'a0xUyC0T+ĝ7$6?xq"8:'8zyo Z75D .o{xיw lnjW5/{Y$Mxly)JQ*8jPŻȬ$/Su˫z= ŲPTϞ*~((naІjMICn?<ŇrÁ 9rSŀlfMs -!Ѡdi_AѨApV'r1 Y3'bL72D][^ĕ4tj+ 04;);6iW3BM1|V;,Y d  [@0Smfp?6uzkUW[~pObg?C po@or r w3w 73 #sϟC+ t駞<IDATSO>{@%Ȧj%hμM|3XxPZvj(:t0J!{^6ˇ9ÀJ=;; F7d;hCX3(1 <CPnC IΉܘ uR"?T]!0b[P*zbk K,ΈBLI%o?])STY#}eљh27HI:%q CqrLnUAksYߠFL}ɧÂUPs ߑCXܼv`/<9s*BGȃUxOo?O[a`̋/⩧R}6T!/cXloJV$]*` yomB 69rSGوm5=4"@oo?~q xoékNblhn^}* UWmΰ U\hM0M--cەn`T>bU0k|芈L2l +v\<3,wDX19:P1EΑ 1 灐 `tɂ qw:e?w0_&BV$ƲPBtWڵf&8a<1_8)e(s<_DP̀ ,ř` LI~K' o(M@< kk d- n/>WkYcn)P?kA@dB$*[BԾ\|œ1@6( YK )<fz\b ݽ!91:X.֥2͙/5Aj*!y9!gau*!  4KpX, 7$\i(!;ྕ]5@RX#yLBN+qa5%V WA <3w$Z%qz cI˓O.fpNs⯯v iKy%aD0Uӳ8Hb0AEѢKQѼSw~"st4_3<\7Wm2#bxOzRb6i=)[nN8O}Sxᇱ^' _3Lڴm*$P^Gyw}'n馩3&L Qk!_(S D挰jPoiv\XY C(u*yqLY,<EZ\x>0&Ǩ'^;+>FsLB9f9jU `Uwalra')TI7@V"ԔApi È`r74)LI_YC)1}~NjH}ٿF_nʍĚNr9QPͿ]pM~6d%@beu÷NKeH( & w,(>hBS|VisoQ|򗿌'OBYM0m9sh6P'iShQj$ |]X2pQ=o9B`O C,{n.?n["NIbhE]O T;(?sT%DD*a (L`dI;` + {Hb_B)KӍZ+:)I P Irp"đAEc)&:Z$"Sԛ!1KlaG@H7s8]K8'NM:9Y:|U |ifn9#XO:8d&SX 1MI!'A^z>y:We}s?֫M[Y).8.o%Vk{6%d˻Iћx C-O?gy~ݖ[EvRz%S^f{}(V?x;fmFE_ }Dqq=`)P\b؁w#j2^&/^2fySPєY_LcHDQ5q2HSͱKg8M?w"\Qe\}4f?;2N Kf=ÆP \JZ,BȀcYM,@ݷzGyzlacUUvcl6>$[ `c L-`ڣ#<:K񷇱s=]5ڴ7m>wTtt`۟6oc Qs\%~{コ *di˥Z,X,ow"># 5~ҥeKZ䝑è(ǠaPTګEH+Z ydzFdޥ&BY5GMi-2isq/^VyVXΥ+1F"'2dajsuC&\3Z2 iϻP GIA 5nX eNs%"QW^{ |c@/y,B倁ELƏi(ݗuYy ;&oG59E)b$3Ns661 4f(fw3 ]ӟ ;[,5%/oM`_9pqa?s6h"gM92L2;u~=XUp- \Bm?C2Ѓޯ&ҋ/ɟ<{?t$9tCGyi _ &Wգ_SI) n=C'nA\SE21utʌ9S:NdV qL&\a=nk6|2_+&;Dik`E'3<ãcvbZaoo_pn\ߒpK+%ЂI@7ל un߾1ɓkED{ſF8x'Oc:ۆcE`EhI4)O0(`}6+)9,aH|>[By݊)Qg,51LjP<lxH"y)KS0]|' bHM @dӰv" TN%4/E s kHwDPrc$엹fWI`ejs}.8~(T0FyW/9d (.9 g!d㟂,*u\f&MkCq'ïe-B-3\'CCJᒴ-;cQ?Kz^*Uu,7&d[k9!.!%3 &DgW^">7`;W~Wя~tZ>߷+!n pf.w_qXas?s /Lp:o8'Xy_o?P_qw]~WucjSS4hYmzḐe@C Eu&4a ~> UPL|MΩa^SS:sX/zHUa Jċŀuo_Vń:Sa'-B$ҰVq8fu䷈V4vbIIIqd|&wUB!휒Jk DѸDr3{z-F3DQHch#%NzI-'˴5B%i4&o/I0,9?Ѵ ԰=8<̳li^8uԄ!mS[5 oEp\p߮du>֗o//矯 ](@0T(9b82}M.G~}e6Rx`i,(PY PPU}ߢA},a[oq,gXuYJƴSMnMۀz$F. Au<1Y'1'!VchEcج}jV"H*5?]i-|Tm !B)X(ߩLgO=L\a***v2  ;V&2\Y' ټ YF-RFI/>W$J"=IY%K+Yf?Fx6g<;+ Yދ^z gϾ1ms</">:]>zr z p5~8Ķ9kM `G\sͤyb]aoo80G 7[mD~i}51cQUP`Ơ>X]̯-:X>=B6 -y -?;OUIIcH@t&prz] V!AЌiՁ7@FG a(@v YݖWamrmEU3_5peg^dJMw͋Gdƨ:N$j l vّ R]B#a씥kllC1 lpS[+9stOĻNWeof_\uiV3`520 "2IK\0j$ȑi [POg >[5B@S'Ui+ JX,b4$(vnCb\Zq԰4fBqe[T7yn܆їyNdBkmDyyNpPT5 VAm4WMGq$$%޹"to~l%; .5=c! IȜS-D*w}?Cr.>֮p&o۹:sgё>ec>φ4S\ Ϣ^&h mK טvww}aggg S'l}qym@dnQjWi݂Pևn4H&2vfAA^)ܢDK|1u]ཫ^aL\aЁFRkL\xS19 H5s՝p"ڔ[2߰J%&8GQW .ԠN5U0&\q ټ0GUg:P:Fٹr`SܔZ~rELz|!vU 22Ę9dR`\Er4FfBH~s;#a*%.׊Bo̹sK/'WǙݿ56jlcç?imU7~բ?k4+Q*2/ƓI'2JZ-1)|m`.xN~S M/]6 ګn4H ={ԋ1JmoP_c i,bE*Aes,x36zvj-9ӽw s3YڶAۄ(5)\s PjjUeÀĉߟ4m0G& 80K8O=4.]nx)Gy5W 2+<&i ,W5MxӓJ Ȕ=M&CZ bN%ѐG=Sy 1B2sz\)򧲾\Yktl[r؅K@>IFVIR'C usfC)YNj#Zx 9Ӆ[!=ڢ%7QV(ef4܃0-@&|ۢb (Ws p.Ν; 7yu8N:5*nz;M>9nXQH|_W'd@៴S8.]Vj7z!A=\ៗu׳>}^a>.+ڨA=1V77jFjs)gL?e%հJj_,qS4Y&͇w)sbLR>G-\A.:4G^N&%K:"!$WOCP4Vw#YF*9KӔUY2 ̜Q A oS_ jqW,#&]J2Lh(a eGyan!Dmj΅ةz_h"ѺL&%I!&{1>Qw=3VlÆw,DL6ɵdey]#XO\9),鹾+e{vo:|c;֣~SEffTd7567dC=Fr-;OGGGXUp_j6sO?{{:}2S;eSf^Lw#onq !':QS1BPIiؼJ䱝EEn:"3BCekUPq bim4o:]NRe  0zE&X32674 ( rwj~<5'J۫LӛLQ2gk}ANw"ʄ)I_EjaSٳ8{,oG+ro4ʌ`>n#"p\A߶IkNzdM+dS`mBLJ>!u*8q.]… & |5?rz$9I`ogyF߽* ~_X](WDZ@. %]xZEEjCQlD^mC u.B1sXCH ,a%&YQi(gxʪ"3lDX J$H@LbnqLks'2Gd,Qc oȐ\B:mdJ-SLOӉBtvfOM'M:b1w6HX$*lvkȑ6V̜m%!ڕt^_F`>@1[J_P X6U[" F~…i;uK%9jjS# bg!n'vһi'\ߊU&k๯]s h=>ӧOŋzkm{{{W2qd?f pܯ1;;efNPľm`l0jD[WɠD9'&1*67ݲ^ CB}NԓFrd]eZd0"s簠!={UpSU!Sϥ90잸|B@-LV+^^adQlקo pwCѦCE؈b }R@DaKAH *%K7!&4)d e@?x;2|Bc~&YPL1I4TrSHB%nH嚒_ë=|\:񊤓B4&1_,Mk&ݻV+ŝw޹o+M6mk6fǩ.G&oqq뭷nPZpxxCk%,pooOm`^.s? 8QVѼ!OưuVC jեMa 2>pD&əzz'g?\T>fFB0HT`_̖ieRnyyGEfb!9'W ÕNcqʂq@njG/뱚m_SRcc,;{pr}j@/86MZro96} Zg@cggB=gN[S\@Νo뮽 F6<ӨAYUt.@KRf@Rk )987j@b9Ηr#&`I]4[\i )H!=SFXK Ղf005#n( FrU/RkT!ww 40ceb(Ƅ%X E<1ڃAC] { Y##0%j\.͊hwf<0ÓW!a &l:QU kh䰹1j@}+Mߜ-S3/p:믿=&AoA+i8kř3g&0WN&ƶJ hfƍ7ވ3g^.]<vvv4`XT>۠1l' 'm¥89jnf'&4XHG@OY(*i%$c BTH1Fxԁl$$9 %8[WI2lWvv|@#@cuxP."~*TAW(&zH`;ВځtS+Xepe By Do*]N |Da %bW|GpXCXP1p.R`윝b'(چǑ:#2Eײd6Ī2?{98{uV,6P> Pߦg-{+:I97Qz27kwq^|E,ˉ"r$hggG cc/hS`Wbsb~vkBiؘ{bJm*_Qg06|dv֐"gꇬ255F3Ñ7C'>PV$t`G=bc0ՆBvIR}YWV ,sq9/|''ˆz礑DoU5:s [&hlB~As.eoe+9VdLluY`{US?{$\ AF W Ncy-TJ<@pI茽դȄn 1D0/fE+ォ.LBlˁP&,Y0qj9. -vޫ9z$Enۉrw3פ]ichj *pttZKD>@q1RA馣rsvLr!I:/Y [il+<…iws{0 f 86!37MYz'888Ύ6-moQMMu=xXǙ3҂\!aNzKbAy$&jhl:H.;&ns>T,eX "¸2AjEOfL+Γ0$%rvvvw݀aX8,矕W)hA RC\XWO(Q.0I`$dHd;Js\1FxMYt3I{߂PV 1k0 K:auajYT×؆%zf>W~kVYy)A,v}h>13!xʜ3g`ggg{ Haªڂ pQMۮ9]8>˄Yщl>Ca)U5%^B״l__nW{f4BxH3QχZtVy?WFd=&|rɀ `Jg 9Cp~0_cތ dD Ho~14}tg/%VzeEﴪCyTenrW8!=֔<}&v~=83-2/A꺩^_р!^2-)V^ g;ȠRX'xW"cFџ95tm)NDצZd5{$}o-vSW|/cG]zFQ2Dȸ7@re+- K"$0tlz(;ɡ MV/,d^a]wBz([ĺ4yp >}>lumY^5*@Xٳm#r\H o*mU0=+u 5E,!%E\^H#D!PIz˪@1j4p!/{J H~`.JXΥ(`>p$t_ .\9w%U7-ag;xDJp“{.4֡l]@  imu @%ѓJk]G |qN IebID̰|v%1LMH,֥co-II3Tw7\ K'8j&?*`U0ʪAxgFn{*%qΜ93ˈ}oGrv6w~U %H}vLM&A-*I νy7tSk%@e&,4TH4p9GA5)d' grMEJmX.$:Y#U5YP4#CE>QJKxrk&ȭ H(}f(@N1bRUbΑ#A)FuNao!4hpQBT42$X3Ӛ#H$p$8_,@D-맡9톹uO֪ͭ,@DH.~hhP.E .o]l?#2$抿_+\pӧOo,;+J`n?G º\.qԩJ rVYl,{DMHĦfe'8`Yxx?LwvLolf ;Z5PE(6y1֦#lj"f827dI̙h 1kBX%C q>%b1'$ E.N/6 JD5b.75'Lf]iLAy9dv/x ( ˮD!i$@NX$SX\9W9)fU@vrgrhfw>Nv!]w}T+-^{bw|!u* p:m4A&z%DLZu6p˯vvv&L ۫C!uk_z׻Rwk6cݢXsqE8Nq5:ѐ dk':|윭w=eEY$ h)Vz(}Z܈39A CrQG4)2(7F; O a8fY5fH貅@$5 @+K+\/Ō+?(YH#s.@fo!$iooe *{P !浡"*7^A )1ffozEfGVT *[Q*i~wb L$Wvc39B/]Bb{=o ]d߃qoҾ& E hv_\ަϡiW^7ɓ'*wPrU\j+XypehW[J}?EG`WUEܹshUնmsa5IJUkU Pdѳvљ=1篍O^E刖] tUQ^rG[[\.HO|C` 躴Zvr[]cugUBV\J9!moM9p誂LUdV\TOdb4߈)xu00;Vyd1$産lD=e}G2I". xʶVybp8ߤ9 da5>\9e LVa}yz!D$QP2PJ P[)Z4DD]]޵soݽs- W&@rNPt^&_j(~n9ZϜ9dͫ+.J\E[GR]8W5x[[E"+dRF& G'URFպ|\wzvFXPkQ$$ JVZ|ZG4F@]Q uQ#H u9,B@sNv\T²>7@~NYr5Pj幃'5? v!W]ɥX x3U:_vjcdEH' ij,C6);tsBRwâ]+//z(T+(ITZZ6!GL,/FY7pn|%NNL|~ rcߗ"8\AgÛ8wRE)E;"kggguTcB.s[;_U ?Cӿ=: oa]'"lomg_2T~ iS%{b^Tg2A  zиU?c++"%^%;G!7348(5?:xrz3Onb?ׁd^P|iζ鉈;j9'3upe w(9BDƓkLq L_/ڼ39`jg;*6WHwrs 7 A2FBqKt̅3uq"F7=L,{yjKu^@%! [k.0dYe tDT"kW»f66ٍ5 Psٔpp3 RY6@]lT&{}LgSCV.RVI4. /8i]" `ɫBIזs_S5XHxK94Pct4Ȍ9C!)"Wb, > ]>K &PiM[ZpX/y;XWjeH4o Iv*%mL*$K@Lbph:!w1wqeB TmtO|Wcp7u oDd},,fW !c: Vi8yi]P1ЅӧNhҶ]ǂMl7MsF,M dvu{;-'! ~4N}k`5"C:jc `vo"|VV0~+pkxV6ZEipIq5ksk=#̚s@d.K, d}YݚNsY)KK't\|p/~E1jJ4vFoO`c =5щg*ӹ(,+aYՃ7d +c%uԮEl>G*oYaY;SӠ$"Yߴwo 6V&=R$P}9[trOmbnY0í]`2mlb{smꓲcܓ/4o0 ?Dۻu՗*cb ڔ F_MLYNsJI XjL8{&N>+1#(+3lA*ʊ!CiRl2|sYY_WrAxLg]U5.ZtllL:*vlW279dyby)>%@f+tP%{2μgm &[t5a w~ϹP+`r)',uz1LDp#(*a9<1JJUE"ڮ# '{GVcmL6uӆ̝X888ĹsAnPpxÓX^5u t~7c˱C?cUӿ6}+M o눠%Аϫ~8P3 0+E1G6- O)`Tghy|EU^󊌻XcjX3yLߌj ՉdCL=;N@" IBCe㽨 P*,&*2ڦV -kKS{ b 5g MRj~sYDdw$6ΗhY=^, N  Ș/2hdF?~4)4.77@Q2:([ ˵"sGYS=rrLMM|>\j 2e$+~Ó}:ވ -o^Ύ[Z{ԟ r~fNUW Io >THyw2yg^@;\^ӎc{J{]ᰡi:4uwv1 ͰLPvO4?{(D9wǡrũƶ)Na[6%m3F[XWV-7km?UwLhg21CvW-yUl˽\l2>y`ro,笞w>X3&@QJ=߁)*hCׁޤ=+lJvcѬܧK3MB+5ʽdlDK[غ@՞^lҏẕY}ԝRo]0#!Y]wTۘN.K|!bxs:[mR9 QwK@oHlT&_5¤Gm5T +QEuſAV8؄wFoGt!+W0mo'OM_9Q}ئ{I0V8C$mO?ȧ{>`@?ia{1"# U -OIvQ2Y2^az.*venL5ۈrcԮb~u Sftlxb?d2;d>t F)PjƦMofcpRLRFNZ~յ[BZ ]+|~ޛ*co s+æ{QbւuTp5=8p]ϕ(D8 X]5d$>ꅞqӑkf[|o/{.%گqo ֆ V`!N^SKDx<[${v8m<7 1H#*-'f0XR"8 'S|d&PQ{#RH{II&Ev<}~R9+Q5ch_% : gA D9;]hKOI'Yk@5)yS&[*@]GƉoTq M9ԟxPȴ[}y2&D%UݑDΆ|GBXts\q|1E!fӝtd'U#|JU-1Q;AP/a9Rl,I N:]U[fX,1` *ߋwx1'ZE+M1_1@?(߇׮iJn_5ݯGG)^al3-Ivgh# Y:ErBF@s>6 >bɞ<=XGҹ`dxEsOQc1spE2ܖZVd+;_ 6IMݼX|sdE,! *5Orb^B P =g;B"(d^'OuT_#P"i?iOiJ̤s'NTs}I'Q (C3JR *)* Jp t{w]VH]V6K8uvww38ˮ Nk֑7]!C>Zd@Erxu4j$):ef4$XYJ\&Ɲk*)!8F'_E&{!+E[F;\@)l2y$&H5dA|ũrxtJ RP 05p]6:nrlnߌܷs}:D8&`$gU)ğ]V}_*@nvozaENߓˁlTarnsDp;r" 4uƉ"K9 X,1RX 39t@AhUuMi{Qʲ @El~{9uuЧ0lF Ab&M$K\ [UN.KYwZ JwCTM*.>;Pѥ *%d-q.K>!MfPm~#)Jfb-NFY"sL`o|GhhV]UhsåK/:>^juʅ?FӉSYi?=m_ZSm_g3F>֭.;mb_o Uoe9գrp<b"΄ 4h_WL*saqCHvAQ%\?qL~y[ܸϥ]$(7e=j3Z^]zah~"rqS1*P_4W:dF$PdjHy% B=Hg{PN Mic2)3zA,AЎbU쭼WrmR,^vʣZmUъ^5[#. IfkfԩS1T6$"ɳVon}4Vԝo.o*g 6V~w.Z {_j7C߻:?6q!1';dz =gKeVkW.sa|FLNnV䳫,9D5sssBmbTQK˓SBxP[mQ&,LԼwC$LM↩; z} .:% L)/'+ \Ho'`/&G_ޑO/F[䀎s-6-w81WIT:zT&@W׉#yL,Kp6YjQEV3bE.K.f?(?ra(MD$"ϖ *L}K5 ZM$Μ9>}zi}y*쥟4o58?F#n޼ɥCk{VBx4`դO\,s0BNsJ*VIe\8DZr\&>z"8GYR8ńFcCyn+zVysv:CRtށrdPru6:Ƞ6KEwE! .e4q/ߘ0%WTήq,kf\el!y TvF[,D?ۛThUIPa*JԲ1"Đ?mN5ovT/;h ėQq[4 82N`FhkeEٺE(#ݨ(z}?CJV*#>PdcL~m#XYbQ}L&|f3:u k{X?y{ٰRlnJ6 9izݦM׭Rx+p U' vvvp%\|ϟώvq=::͛7q U֡_>*0L8w\]bLN-Ez]7aOMٱ.Qq-\ŐQZ`o&kv`[)`]ٍwbwUd>\*?|~ݪO,}2Ci8 TïY EF;ŗ] Y;.I~zc6a6@߷gՀNCcu,j0ؔp'V roz}R̙3x衇c… hG*?<<ĭ[pu\zׯ_}aS0XoCٳ.d‚/+^e+Kc)RUJ48)Ĺ\^j B;.L&#@IJu]v2΄q&_NƢ= [[3̏áqn##Ow 2siZ *t-bN&ؼk7dXB -WKұ"f TT34H=o 0oU %A.F%/Cz=;T!X?}ibM[(aN}ڒ Q'9Oۺ%8N \&j/ӻ]/Q՗{"5 Ga}xndڱ*zX`>4Y73C۶y-J`1WU*},'-L﫚 ?5 (~Q?<q rQj|0"_Ϟ= .G۶믿W^y7n@۶Xc2~"f ^I0WRbKFׂ䛧$-J!Q!։g22QOрbV't]YCB\l+5G=x.H=;!v-bh&3lm+q#BQV&D&`yotpg+H HS>gB` NHa@ӛXB!ٹ2kX+>9n`\z=AAݝP;lq )X$E: !r?Y{_C4ٲp!P,DWl3P2(bГ>d2 UbGZ/g qU-^o;בg]#03GҎWOf3QTeVN>I cR1RƉ3Z:'eW;9I糠1ܹākAPX"ie4Y}@5f ͋ΤbaBR$"s \.􎨘'%{c3(T8hzÆ!Jfo.21kjd>gZ T-}W* ȅʟZNGW˜Lg :6Fي8hO{̏g8>[嫌ۋt؂4 -C-I`Bq7 j7oϻɪ`U1|1ǘImlc7n?|pxxXٟ=0+t~?0/͛W3l:` ѬːLdfϛAbS5Ԗ\Q1ȕX3bL&b$vMGcD<ƌ(2'?xFD'\"'BT(!h&jKM}29v1+vkܰ۠PHɺ%Yy!tfN $=IH`lҐ/FjW_u pɍd g;~YghG'36r! 7AMv]#ZX $7!,f,@#PTL!8C(dB8ANnT.p#=?å1qD8}:ٷ#-WS~8`yǸ~:ޥX"cU@뚀7"iku /cUhJ+@9̌GqELDS o?& N>}8887;mq9s:gdm=y8oQFUƽ3!̕ӊ {YvhO]}*<2inbX,*Yq$aGNu#"1ж]V!~?fRXy=}R8P3 үaQqDV ܆PPًs'j9VD+ G-\d1_|l4fmi~qJ0Th`]1r?uRF6s$Rf(ź1)&7I fDi~Rz&EP@B۵?ׯ]I=mGSxB8ױ71 ]=?2ßGO\Պ:9]f3u]MO@n MlO@x'U *U!_3mcxWG}Gq)V 2u~x;ޑbO*PXm;L\)iusp\J|6U\q& Aeu; h]ޓ(8*r9G`G̓9x6K0QdLS: 'WR\#Hx5$7C+DSXKѽm:ma.rS_.=PO۳yݠ 0O{44teEuBb0]fک (?P!dG+])b]QLI)D!>R2R, 8T- "$'8s49ދ >_KXz p`0f?vYԕ9Nǫm4M3 % gjS罓L' SSIϛoC PNuxpwG~G~NlLSmtt{! zVw}9[3gPRUcŭBE$Xn YPWQg)ݞ|R\E,փi kp.cȟ_D@uP=lA}\x"9"b2x$D잔4+eNR ҩ/f`7Lʺ~]q 梒E)Q٭cxJATIH*Jԋ1(|d@KL>,rr= 7CEA䊫I*``wOp9cq=4F2Pr::NNW6#& ȶs*1){`B{ymb~|w?c; aq*7_ n_A8B #!{xxz#[_Og.C1U ⋘fٔlۏSNwojIa?6Ᏹ7! `ã}dG >8::9AO&mlV]ϟ?_۶xL&o2APD%>}BDqExRgX;Y(g Ȩה3]LXڊFѵ!bd؁#)ԔՆv]I>Źب[[~1dߜ`Cd8<@^; LNV!@Yέ\ t'{Co_wRWtWY ._"!U4}%Elжmnџ50N[}M#(͠TȖ$eY]jz}}^J*?]bo]3d,3f.39Ys9BxO d0Ҫ5[!V@yhL@LXW}nbJ7a$\ָ14@rh7p;<Lj=zaA@YR-\npO̊M! xd)+ u54=b1Gx(ûxA g0#=!S!"gOSO1]\iWX3` aݪ؟1fpt*/dp&auſu6%bP_ ;fܺu .\Ⱥ"C2:9mp6akk+[w]K/rD喔=kd8&y pqrLlB]3kW8w"N`B*BAQAA;QSAtkj̑;BCO! vixޖv:ɓ DOWMW YƱKQs]^fc֯dvm2s)?9"BgS?JW:C qIG{;>aUiԎ:ƀAO)D€$RjqvTJ6hH1S\Nk)^1w`Un&O*BҥVf[*bӂmvi<~-l#A-58Mj]`BHſbK6@%|DBv {98wk sUv?#`l?0w'*rP],ΰ$N&U|ٟ1*a(/1k3i5Y 5C GsDEfCMNk1fYt/ev"-L7E"%V!Ds!`0~p]N_b|)pBIK2idȊpH\Bt=mгx +n}oiEP9$.n+xϽWqi_ň6cok33}W !5Gǘϱh]׮y@7G4zH:^Яf`f:ΊU8W>Hl\U٠%aTg5ml'o#/F!`K5M^K81]D}rKf>.RC`JYt2>N[Y)*{Mb<"$W@L >Ao xjӼZ@f ))i!ֽ@ce(bM͜pηt Ml\lz `gvQYeO> \hd@ _ M' 7iVH'!N'uS*ֿ{c|o="m5d,V8"g8K]_=S9k7•=<ry mļh;Μ2,Xʘ~`Jz?r/2ө xUҰss l(dk9s M`ƞXx,j*ekIh;u\vbҖ8d3RzkR s\H[-Z>Xžg]iȺD&XbMf .ߵXk"XϨX8&=)C,@׃CMT!q1Od#q\'EU:e2^>OAWzhC\"h6J8r$Ũ$2;hW$D0+JBb~$|$6qVo Z6`=/[G<|haԴ~O /9qg?s\]l&Pa]- ɟ ~!ap¿qX*қƚ7 ~̰gU80û/O s AЦSWZßw;" [;ƒ ~3/aw?``oūx9}eyy6h83GsF' )"" 0%Q@f4Mb6b2b)PVB}vYo /nzXjVgs&#\bL|6-+*ӑxTi|HMJGRj,c A:%Y3LpHuk{{ ˸ڪ'Mx3)\0j.RBLşPS+?`B5ݦ ,"O J]n9MZhDecuC &"gMgL8ϧ/ t1l3&Iu6vz|&[r(\U5.j3Q60b9c^^A/ > ^/RwUd 19&wq >JzhC?cH }SN&15~l5f`]MNϜo]^E 9CP8 H_G q!;pLG`Cpy \?7G1C`:ڮ<`(p`ZZv I32BIuod abq kq|tm=5fΖD()m #Yž TUy yPl&p-0 7J#)NOralK\y IH 7p4ZP5jfr!څPZ3 '?S5k#>ź/TCɢ HW;d:2 B{sE4`6zO- >_[ \*'汄Kpuµ;nW{s| _}5MF_p|SMc2UYerc~cvCCYwq~g!9ȧ ^$ Q8`JѷrP*WA8 ¹v`4$f Ҕ? -¨LwZ8/\g2"wܢLjxi3O 4Ι{SHp*x"AZLP@kM2?濫=4ylO_'SV?zI#!PBu @ILة)SBʇt0˙ز <W#wm9/$BCS\xx~vqttgs{ۑKQo@:dsJZ*O)3܅4%pAq4F!v2R"C`V2y>d GCu;gS_wYBI¶vXsL(e–%g ؈$^Z[|!x:;%P rsje`<5 ?3˪q^/x6~OMۣj]|sC?lXe<6o&C N{W>cz~ v5x'EXG >ӽׄadkIl냨`P#5Gâ ȇ6d$vLhKfjHhiy`LB yb.z bBW9+))E4vn*FwS^Qi|r4S#@1+MCLhSHr(Y3/U<|lm?p/~ܼzPVf1~ ° iKVƿ)<"1yMqG̹ұ:Eϲ dP6mޟO|͐mн+L[Ch#d漇 VE DYIDAT1 U D%=ţȥhp"x0zFsvˊX6Q!^ oa{wWc26̌ȀC!+ g`0XXlJ2|⿮kƠ'3 ا(ap &idi1[}!<}䯍@.BXSB" ]7Y0b7`2n2c8]%(Nfg:xEbζBN*,WqyL^ϿtpbAvKc2rаW 5,+MG^O{>GKg6Uڶ!ƈ}C:-6\n$fwukX-cȘclOұc;E "/E-Ŋ> kaGO&l@(q'A̛N۩ lNx͸ϻܘ@aA-fnpjkxawpG:=ƚ byPhp$ђN^_=%nrdg_*¾Jګ\WDPJTubLr9 "c:` 77;}Qd rZ|"ȊS\8s6>]:{ ~2wDzT+saC 2?;QjUn5tAxVrH6zP-f O+T'J>U4_r PK'iLm6l6O-}-'ц*&elŒ{qq~<h_.Dơz{bkd@xk=o8::Փ܀b~`f|![e;d%|ߓL'EֱDpMU+J >fM L B:Na('8)g̢ڐRн=9Y8 0W iQjDU!U1<'<-$LN[xq4˜' ]_g66ي0Fa?ܨBFdU}T'-0!tXk6"&$,iJ#Ik6i}S ~ruDn^I8tɻ7^])\ =q6jg18 S "<1&&"oUFm߈%Vhft}Gўs1 +!J\6H3}zbҐGY7}~yGyWw&L%ߘFA;M%2B~%gmIr R(c0/M ŋ@cdO܏.A mLibq*~Wǿb9|ӟF??{ uҹW5'U7S:~L0iBIDA3kN\`}4%9˼ZUYƖTSr/rD9z߀#)0H4i.jz!k%eZX*\\8]U (.bˢ"u9=X,l^I&S# G B#c-!%fm-zW!ApgO9+u%ve(PV\Vj)7%7 nL_-Z@ rv] %Qcb!#AQhs!αm:(% 3"nP)/w3x3_MDfvY)-|#B.l껌 9z܅"\$c)Q RŲW)Nxai#4G6rJ"ag2X$X|oL]G̈́T+23~IҋQ^S-X03=z}gOEWPЊZ}h-#QaIUUUA>RpWS_xuU#e'dO} !|céS 7 0d;$\nz+RNbn+v^X~Ժ;Nv xUf)Hs])d.h^Z=z[2#7 D&P Opfmŏ1+<0yHlP%~ObƐˊ,֦#w@$ DcXC??"'4 -;+' soѻ$Xr=73J ֙a3 G{kxk&h t bn2:][Xfx߳j 50ƔOO2]IdER\u"X K)[lFߺb95!D*$ԅP^lY|g9IB|ʰkֶٰVn{t^z N ̫?4SEbq9kZtOq"?5W",nݽ?(O߇_UXbO~??ӧOBVpV&k17Y+CEAcL1ʑu"jRqmȸa/5X5AhWo @  s9"hcqHCu.]\NN2ϫXnsFY]B >. z 1)A2Pt5`f2izsa!~[Z0kUE9fOf:b0gDA5#/Mi0b1M21bj8}N^~<%ܺjH6qRyTOYwMJ/ ﲍwRIJe!=+뻋UM'?Is?s8{l}HN}h8 j J #VBOnQp0|ǟvo.ط k m.Oh0U ]LL5hOdz޼ilZRJOJ 9bXPS) w!dX*Q\&,CϪ{e.5"&RcwY_x@]?Κf1̘**@...1*>c[?鷰Xє`Ut]ٳg7Ѝ2d&`ӟsXMVoUOAC@@ۓN.=wF&z^k s@kг!6 $CY؁wӠS1kPEU ZSQ㴥hG2 qVu\Q$\'ldX$RB\ Y1jh׿cdy\0O06Z BqN(%@ 9JP8Wo|"fޥ ^8iFo< Z]_P[P"pJ+hL;rX/zm9&_ 1kCnWޤi2ϒ<g-8 wp=RH;c 񂕓萉wىoCZo%c\X$ۯS38)k|a0_ ̟uN7rhతN&,M} \`xbpt|~'yK(mu]n~Ν q8ԇ7WM 6yWuEyeAP%1Dr)x,L#BVʽGC ^w [4n8Ɓ1k3^rݜ?Uʫ$Ce#e'|ңI0Zr*4RL:`niJ cpRYI=`L&@㱿[8w9-ܤxT?{?5yZI< hh#0GG|[o%Δh䚂 }Q.3;  X8Pba #w]^ CP2Ju*/mj R~A+B^Q‡&%iRԦ&"@+5h׵t}7?kTF 2"hIصGq|p NƹY3-f Ks uP<`]444s{A2$*2M']IR Pwn*.lowōചM3˿ .$ъ}^@SNJ86!'E6)c:ɟ-]әCE9 =ؐƆk]<0J[9p,VZ X: )kػv1t:1!n1+U/q!p$F-W,FIds8}1Iabh/ $ϫQJ?_b^E3Ş(Ćv@S*=0$s1@1$ݲ*+2149ї»T+#O:ʯ .^8Z4aT_C -JDa,+` GT)p1PC6 icEuZpO26-lxnfxa6)XȜ}uMfhjU{PrvHir=bTs^ܛM0MrJ8ۛ5:gc0 B01t'37@ sphA+J\Tuj8GEۃgwۈ/Wf6 gIBo[䧨ZH.lj)] Sxk㲬v dڄ{:rJWg%Bk acXu- Ү "igT8gxv]nq`53hNMq6=8G} n+{@u7NG 94l&\dGp#\|=1KLhyg>7˗ѶmUX8&ucu@CD4w(WU `$-;8#(r [W{kXy`"ȁs`IjLA=SIM&!HƫBv")s ;\ZV`%)!s!L_&SfB8[h/w]l0uG834]plCJHρx 6nMPmZ/9\qK!o@S @ '#? 1[-1F|EᄏB{!Q&``ϴ0TWI֭Vm ,476>y.A ^1籟a?m@l Q2ƒ9tsdc\)Wl XF\1k+,uBf ]fe1jCMŘxQ4PQ%D %?(j4ù$cox$9ey<<5Udau*|"u1V5 x'#?w -oӿB{|G&`XYIJ0B\;w'km(E`z'3ϴF"|@8W}a$ GW]Tz ZV_-Mr9'gnB`,P]wpmkk{|Ę8.T>( ߼-at6Cq4Ov8 ,ƩടXMg#W\F;x>`gB8j#N?ĵW?/soW\O"e r%)P" 9vrVr坎+L:l&ΣC[!vL45e*=Ќ&K 7z|5.7766 &VI†ۿ}O⾭W;hTтh!=3/@Xqs3*\SLIkS5#쁦:CX OxcxЅC,⁻N£8%'+18 ::*`irߏ^7@CdM'`ob/m~ޟ `k҂T#(F,sT<+ ĿfU0!5yơe`PU`iԏB󇝦Ia]ʦ$$Zl"ڹB3 y﬷Qj'+jr.03&I6J=74Px^ש^x?t4Ed*"NJT%3xᇱ3k/k ۡlydƨ˔n:ANLX|_Nm,ṟ)l>m<0XPcH8޿UʁMm~7b1zonZ1_.ʨVFSv{7b prLc"#E{h&ZŐ3XM rΥtQx^#J@ꘪSAAKckSʳ4sVTs]Ȝ>K#pA(vtp!59b2ˡn.# jCD@:;w@ : Ӗyd'stٚL'W `6PpbKRr*S|E%YVVh%f2?b p[u \ t;\n?!nFOΩQ:h`\Ŕ由UF:9QxDbQɒ@I ),;#iO<'^=P&KBD!o|"XeCNR#kV!')}h~h?hC ?kiED81s ]?HxLE0u<3|GoM5 b*pqޏ#$OѢIfzvq݅1Zl3S.$ˁSPZFuBؓT]98QaE#GTFF#gC2q^Vw:,#4ΔRJf@qKoJn?@̕bU|+O~s x]<f6 i9F%#"W{y2ވ<ᄵyvtN%pL;{Ny䜬5KnԬpJ EɐW) aiDf˜I$zun5*д> Sՙ_5ZE_!MZ3jhsHEc9PvȉpBC{K?ه_Bhr/| `fo&׾AzD!2 MUo}^YS# #^{][*>QHc=R}C K4a9c3Esfnoj)NᬆPu]f5N8cc- RBF-Za..$,&5J`9-P dfFZY; y _v/Y vl-̚+n~{?㡻`ß|Y',m^mz "ЉUO>zE)"%t v._)5‡H%vQ`wWi{2UiU.tY&b0dOq)Z= 趘fUq{Q7؉=Gi }I5$(/^u$}jFd r@G:<]䩞cFF9̄_^g[2KB{/~Ϟ2fAlpw3!Z !t\ 6U3$&$$>iVKS9,MVO[:%VVr.hDfk 9,ΟGbxp+ Fl)?mObϊ^V 1"TB`HA 1 :KW[{]&1/d|9o&B; T>?ob$)`UcCCh?)qb6lVlC}45RϞ(2z/+.9 \x}.vΗ5Eo=A6mt}8:*5 8$a>Dt2|>^LytM sUO0jdp+.Uq|R^ ǘ\&;looܗΐ wM:C'$ O[8w.l]i "ެ$@~Ʋ? =@1!$n9.8QF(2 ӗI7L0I}jI \aɍfY<洫VX*QO]"JY{n_ߛ{ɠprDSD'$-=Y`xdl$i]G8Dw>ȃ埸8Z@mѩCi` |r (' O0;?d .giWT^hkvCfʯ|1N$^ȎqoЪH2\2R?G[ONKd`St0zw0MIMXV?xT||lq2'EVu] <"DtÍu>3Kch.Lgu01u/K\?ڠ}h.>/G14x!'_SHDwh\BՐu^^r&:TX8f$|> !"X X< tUU P|`+d Piu >B +нD҅Á#O_԰ *JxbaF7hty5B&'p$(ۘ}>7n~_ǹskkrBK*M@_:j֙ ~cĿU$!Pg'1jK^Lo!CgV+Dec<_GS>ƣ;/;Zmikdl5u=%$K`k>vw.N'Y:pTē/(f| |ob}_1#Cj>lbH<.# u. 5aMvp)_>0o_O}z0^ḑΰ1cM "!(F$g7A \۩c̩UJ:yՎ+ZY"I=kd$AW5Eߜ??Im`dt+|cDp1c7S?÷жqxڝ_ڶſ{/>O`:.{EUM:1}* nRȎNHcC4PPyLºhg %OD9⻲Κ;\8=q1kpz}K*IUr_,:vH'%RVpNK5ے|`n2JQI^^kJ< YP|+zk$E +noLw%jt)e^ˇd:D5BCh9He*zaAbBb?t WQǫ"xE [[x{ߋ{2botɡ~#J?A&1*׿1D`徜XFwB0*A~Y-7C|^OmwT#>qSvK۷pxu"Җk6RK;rIdle)FMo 1]Z")FY>bgoeX#v!l}td >CL`ǔhm$ m֫+ [I(BD `?La-E.͙R;9x$ooyߠ]KM!tN\ظ%>O"N`{y 3MOhA?jŭqgl83z?3,DJx³BXMfް dl,Z4'="6^ׁȂJ-f4>S#ꆕu!tYD4X6F ӗqu]& m.pSvKX*yF;)l::f-ݿp_zf^9[?C?ڶE_ >H5%!CuU[ 5c>W=n߾??/&㦭ģćG#f>?VM( \t0"eO˫撥bé4+2,)`eel{G>"Dz74ޝ+Oe֚wBB') u:ZCGIum 鴚lȼJcɸ)(b2dNaH)($~4gl2> !;5}.n`\< bqמZ}Q+OLW#9Ucc"ȗɟ$  F$0⣯Q9$ҥ"C'@16_upm ͌WTNSQ5[gg@u8އ5VahS0@o0DjE (M;&A^\Lxm݅_FQ_x |ȓ|:4BW6]UX0_eh}oo'ٚ9L'T\ĵ=*+K½|z19~FX @lx3< nj@4Óg#^l[a[_G)dPϿ}ROC MGН ^ Qxd!IM*3Kb;9U)?1\ g#z;F, T8> [wu6xKo.`TX|Ţ8 [,7rV?.T%rJ#~8%k;[J$+ 1GX>2UÁϗAy1Aai*c {g/!IvDX%:$-&=a@v@S"/v_:?jCSSc?c|>G4K&_Wƌ6YkUMXTX}yppOxg{:!L<Im%`'J xx+кvsh`]6ei"e=9y* &`;pK^|wv+I"*@Og&E2] ]u1"]Z,Ud&t]( @/נ4^ڐO2x !EhDU $P5X+_ "@R ({@̭VЅ٦o&ȁ >)rv+S^ӹ)', @~r>9\DB%Qh)l #@_gYKei MU18Jj(`;?1Ur D3 |WQA lchlʫjaP(91P 87Ư2!l7n#q, W>z߻TV5?` b I,IxSkMP3U!9#|s7Fa84Tr>In@VG<MIa~̠# HdP%b,h,^̿ASܿ}gХs,:aO|ه;!产ypKІd!.gh萆u! h 6S ru-<{7t%CnE#SZau7U&åF~ޅ![/׿u @3웰p4rusݺ{a*r}ɒ&r|\?RO/v"+,$Bg!Ph}IE̮ IWڈeBů B$ttpS 'gZ1. D9&mDh4*ג>204X+%⢁ P ?b v^\$)8_ ·3+;|} [[[[ɟf}j{N X5寚Wy#tߤ!4SZ~8C 0( d6jN054 pm07f/MtX% w:+Оa̻m*v9U/5@~ mMZg| 4!f9 BmcF̈ƽ&ʚ8rJoR F@]0M D,m&T{W42W|"#F :!W?_c݇S_+p `Ȩ8Q <̗br ̯%,H;zî|[ ŒyI:8]tSCmG&-͞N#TJCv'~ gqPhȨ,rA~Ļ+>ePZ> `%o#c#$ K̴bwA /9}$۬gK1<: i2I ( Qv%!5r!kBÅm& 1Մk᳄&1ް}wNCC׀9[[3y\,95(Ty#!yhhc06ДYƋC,^/}g/vA孖G9@ =_!p ʐ́^L섚2M -" c=-`Xzek?W; E qd4A3bLlԲr$)v ,Hj֒;Ct6'(huA p=(K$`gC d]vw܅s'tsq}~p}ԠN}&U ` XWבV! >ׯ/=yOSskdk_'m\,= 6R},M3\UXQ)g6WxGP&<{[MJ;@.*ÝY {Tct 1'3䁋Ert8y2K[pva0Od`E+]k> 榑x9J>)k6/_ܽ/ _} &jkdg*#5EPCaݧQpH]ӝ"'L%%/t1'(9y_T(1QحZ"a#,"XQec'&B9 qO[9 5>stsxA[f"?X! 17$-鳩GLiqXI WΥr %և?{g^9^2z?{o ah?f3$Mb5'-}Ԥq!^{ <A.tlz8-b`-B;䣱T-_I?I:NKڦ#,>͛}JlIIlT_sk^YB?2k ?a#ɴC?n Tӯ*wJ/{Vp".=p'/)@xN6٭Jťr "95$k|iRpQRKb"K!t]B"yR^E 0~A]&x~|KoKп  ]4\r4ā+%stآ G&{4>(C_ V6&2h8pt4oΉxM=n/>v{i .}{x L|6ʒ&*Xpogu?s<8<<ܸa 4uƀ7>Z%Lvca?E8BC0BKr!1W::'q~}x ^'PM,<)RĢڶڑ.TV10it!,G'NΧ:,f\fB~p 5</\73iH0H3A`,q606s;mĮOz*7^bQrÐsTv}gL(S;TUp7k.@5-,GCT*"T!,(AUy>7FNn~FIa`!O4e+Cz?!7 tu o2 ƀbsxyow<GvoP3I?IX[YSlɅd~{{{?S|Sզ:qx螉uydŐ%X؟O@|3vZ&Xmei_~T%7SƐŔ;0M)3;x |qYz.pYX&z!y[, ;vxĮQDp {lUbϫ\YrB̡ 0Ebmo>$*>! :Z7nx"jn"mEQE3ZW,~C0&]v>G.*N]9 EO@fg1)_=~'Or&95!Ks^6Rȁ0A_E YOE\#lRj$dr&O["?z~uDԃE@ @[ts[?8o[8Ν;;o ]*I:$`D~S_/d_M =sxǽSz?uզ_A6,++JLFuXCc]-#B )=vF6-0 Pdp)IL)盲3 Ynݶ UW$Ϋ9P),kȀ/Kׁhg,Wxdt1 -Ԯz@fDIj G r.RnS1! D3/_b{u +͟\v"`r=0MDIWC, 0tX t tmw,St*$ϢpB!R_ݱF'[͜oMd9dn(QdBdQP(\ ~l)`Goi_ߜ0L#}A ;EiVC.eDbDw+/]ǧ?)|½޻5TOC6] }U>nU<3?cܺuą_Eý&r$qʫ*dj jj^Ý"Ҏm=ChL$!vN?mBDV;.Qܘgđ3AإNJ`9/zSN|L0kP#qTTueΉԲ8G>&NL$Wdb9dtDŽts?4x!~{xf2̎~V]H.\*7!BWwmC&ogt9]%"OHR*NMyQ8%\ J8[}ԕC.;=u_9:n:x}k@0H`Kָ^,f7 h%fy >9Y 1 r⻜E \˼KӮI]ebOY|QB~"UGFt1:ANs, Z*/!>߇mE!2OِbEbD~{F@h[tz_?իW.\F?V7m6Շ "pEl1;/+9̦#-\~0b˫%^95=V 0j?6K~y#c @h ]GZBTFPI| cr}.kЅ(;z$@w7v]>SUu% qB燲/& P2[ >y@udҏ xW`"a%> "AybVD_E|9hj-i\+t'T1A덚 *;wFуGMr\K.,նfIJc0(7wn9&]dԲq,пHTX_V0yeM[*& M1l;F8yK$WDW7I'Pܟ*7@́OD@"pM=}WOի>G}4p )X 򗿌8>>~Å_94N7M|$X!NAx#25\0ԏu:%ߵR;]@؁mavJEݓ\bD.t + Zu972Oc5Eul}>oYB ^щm`LD)#Hp͕Pa! .+"A^|o>w"0pkQ|[pKW掲E?wQF/". wT̋.EGZ}*0i&yd ̨#"0-j@E$!df&ā]gBX8v\e^S'QM 3Fůf\7嵇PZsIMЊpiW(sBB@ ܾk ].>_>\ti%~s0T`OR7)wR\t /'ĕ+W6Z-+?8ôANS@3p:M`Ђeӈ!Ϧ.qZhə{{|Й;B"y05p~&=h\Q/~.i)+JέVr<=_5 H\i'o}1F4ɫPl.R D%9/]̠3h)s ~)9iܔECtO=O<6c<~Y|'|wY<`p&0)F`cMP.avRWҿkwI=Q ײԦhQU^&<3kBW~8O)!ݒ?(O%*rC3 TN(7k @j1)~)7+co]'zO]v4[h9ʤ@2(iwW"6ۧ~\|}1F<쳸z*}Q<8sr+ ǚU<;Wg}vi_xˍl`eކFV]sa /`*6l3Wr?XT/pjw:5~4S.t3R:9zWO"Ny &#@''ӡUo@gP`H}X$)L4 ڶE㽨p\@a/NCX[-XK ྋ1kwssaxD.@< D;dلF52{iKgU0Gk.;xIU)q% TCESh/22ơO9A E I3I+SNAs$Ed"thvo^bfhxU2( (5s[2-7K+’_B%EAy PexMd$ "vG߼K[gģr)Q&}_Ƴ>wxqܹ_5'm6iVi xo~Å Sx8s") 2{? )0L CRU~2L=đhޭΟoM# ?~O/asIeM(˓pR$ӞT`#+_Y`!E5+ T$ -Xӡk5T*cM#kIn VbsN"ۃ1,3J)>db c+ץχ-[n8b"Qi v[XsY>P]xbė9[Zx~̀ХHPr rA GO%!3]ILM98$HؠT!  jsKT?q(-G;_ qIsRgڛD8 I !K@,7Ih=J=5(Ų;`TKd0?эxC71W隣w '|>,{1,Wyb+!``_egPaWQ4-\?pv.WW(IM'| ^;8AO)b 8^,rF:"&9x4i]ڝR#V!d;… '6ɱD`#='D$9mY8jl3t}pK ߗ&@y+?w=p!F〗_ýfZQz9v-,ř4$+⋌P% P:ģ]L&d&WڱC-LQI4$ V0jCCVCD!7Ĉंj*#ؙ2 kZI<_HIo]@h hm9@t(A+@B7@nТի/1Eܒ[nK_z)ƈk#%X^c'$KDH-Y!׀LD\* VF~Xo oui5&kѐ0̋@4) &{/m1߽,x zU0ʄJ}kַsx|A?lNM۷ocww=^~e-BL%>׀Ai(2䖂w6DNJZ~ eTÊ_z?ſ(icX=#LgYjv,Ayv˒Lދ(*N9sѵVs{ mWyB%b6zsYIV %{U}]bqAh^`[DV]';\]^7M>}Kf >b{YE̝&~IU/6`#8xǍ1"r @IW_i- 2fU 辺O(~N) Hu)(sLJ3nc{˃]{N= ^yL7۠+^0t A⯽/_=S3fRXk׮ڵkW{Νýދ M,'m B@۶r \W_}7o 37,Cw-lMoE@+FbU9 s! PPXosRNSO(."pH,D (#M/̨rCsh ~?z,HoEء$(UL%IbŝCx#F$ :mbS:J~~k-OK°;4#oMNH?yR]>('hhbȭpX`>xӧqYLSL&\t .]x S+u68nܸ7n:, ܼy3CBC[ ,D51H0 hE Ɩ%!Ҿ1@+ѯB:7@ΟGsl 3ErcjUc\ًz[G9 #|A_ɶ:ž1\kgsΩsG DI¡ob>/8_ö.Փ)Q $ }}:mfךs?fεs*2'̝;^k15g5Pe#]ܝ)$@j@VXstUبffJT<'`SIÈQ\8⣿/|Q˕ó/ veagIm { p?w"L̓ыW )tLSVs|Tw,y w'7PrcV:,QcV%ʔkWVHUtD_v~Ͻ&z;[D=ن<# pw=@{vh T.ʡSꬂ[@@Npk܇w?^?܋+5wkNiQ8888(4vjsy7ҽu½*=؃#|.g"rзHE'm*~ԉ.r {` xGO:ߌ}JWs&J8Y=-Lmȏ+ExI9,ks6f9/ ^IƙZ r.2P\%gေ }AsdՈ4~]aѼc Z^y@ܐn!G4I dqd-CVcɶ`t@ܤb--{G596$"֧w0@KցDžmOou>]0.z*}+``K ]q|2#Z|O04@(H nݗ_ƃW2}ᭅ1.[{~(Ȑ]]>}G.h*~gq pPUjE{c7}T:D؇dXF;r6 s@RF~1yK#zc 2#BVDT.y)AX.mت,g`J EMŊ~E<}6ݿQPArZ*z1%q%e )d$23Cv j4ͥ;Lt>pHtO(XF*Y $^gн}G!lMDu-Me|(CKCd\V|<$u$HbJ2\cDԋkk$% uvY;N 4|rt=Vf1|w`ݏ[XYGlnl-3ln\_?ǃg?sފ v'H~ok.y_5'GpE~IVݘoɾAv㽧fd?UR_ In>;9_5۟'|T߿`ՆXVNއ .F~syU5ƒZ+RJBr.(HQY1"bUT]C]]blbŝbW!6ߴ]mCK{5.4)3)h (L ׯΛFOl{N{9vvFnNH5hWLB]L} e^@m" T$zraY ;:ye߯!Fuy B@kܢCyI.FlV+3=δ{1ve~{=HQz WϋvА=dD` 6m/= Э:8D\fL'wqk.߇⳿"s/"/d=~uJt)'5&/+S[XRhNԅ?ZA]^$ o(ЂX=V]-12;RdURX1gӨO6Z4H@eB #9ejjs nF^dvi~L3/RhsOm@́?:muw^}׮;?o|M1ҹB߯.r|xҽ'"j!bō&$;svC~OŞa7\`߹e\ 2??} GۘOoy4'wx!UMWlUbjWˆD< $n0 7Et!L:=R 5LjByb NTU٩e΍lBG Z=1Xg\Y 7 '>CVIgZޗJ.o5(gI;0uBڊ6"zn D 02.=ΓCU@(3]7_|gW~}?~`vNw xMOrv/f׎jێ;MoNU+r㛗>joT~v\wLZd_u7_)~/>;>GɺWS!&(T} mt< K>x* }M!vY(!/yoCFia]&WTV@z2IaO. a慂Bgg s0ꃏb<oon|&O:<™)$KC*"1YkQc =UTٕr,$$tb;mB0(מs0 Hi@ઐS{^vkBx^S oC`a?e1<7+<%'V/^ 2ྞӿ.'LJK@ ~ØL+E !AA'3 ;8yU^k9){T`_.蛁Eo?1>؀Rf_wm1rS\@/,+{x.T=R& IDATo1{W_Q_%1>e|3\Q$v5O<;+),X\u[‚UfP„0ioU*tTc rœ3b7ڟiŢ-zV"t2jQ\"~8,GUɬOٿ@Hx|_XJwD9`|) Q&XR)W4W6N຀M@` ۉQ x@~&`V!&+E_{()8;".X(zB̠h-u{eslM ]L }ϳ w ){W|{z>nκ$7b%j M~|C?~>| W7Hx7/jIuGM C!}cvp~7pMw*  A|%V-0Z7(*H+~F,6opf%; ĈUX!"rAɼ)tQ1^Os3[; <$&P1;`ŋm; tE1mN-ӛ4Hs;R)wnojޠ..hBm\^Z$(N<"r)j]{z [@n:R)B:/Pf 5%qfE#Gb#p .6?. C>`u\1qs?S V. Zjd)fP:: uM?i KL'R0  \*ڃ*Ǡ.V QP +6ba4O5sĮ۞H:o#}u}*Y_vePFRb:`wbN۰=e{ zqq70}y03 uF,28,W}j9 Wy\qrS 29_w>wSwq'e&\B&沸zyac:Y]&{DokP+vӛG3k-6aPwi]}G>'Ai xpKo2wIYU[ʜk2v94BiCol;~8gNOC|[zq*qYЁ%W1"*VuB@f)B z.=W 8 > ~\e+A;F(BQkv0M[cP2.TAgM5׾Ҡ /n]U݂b p\c䳿||7v/4r_'3@S~u .a]5|ދw<)J Obٟq>f_-ݛξl:O'ܙ._a*1<(<H^N pnUvJ.ZSF ?B$\qD4qCqwwqwߞ:/y&%-{Ëxvc +)m.y .qD[DU6 [AoUw7z│5(DRE̾٫tdi'4Ѥ{Wta'=L ?@ԟ ^Z^' QNs2F){ ־ D 53x+Prt> yTs1W Bv;+*PIlckK^,uRHNf˄1T4FYb><q+s}-zn}˜!H'4G_~\Jl C.E?  Y\{; IvFQ|`{;T:lu X9NtîC(MK pAq/Ĝ=k2شޱ@ 0~Wq60BD !@nZPDE86^6t޳3D=({0ڀv=z`w_s]Th=w2GG d@`{w!2qߍGE߉[}`{`1DQbtKgg': {+Ӟڽ2PX)*(EB.+Ly AL]ΔRSpV*`.eu8D_?={?VԺYg?x{_Ǖkc{z7xu}44rۻ~4)=m$ƞ]{W-8 :DZ!p!%[<(E)٣(J+'*yu~V"E5c~ ® J4u( >{8~I&1^SI&@OTSLܻ`/vs`eQ]^ & vuk#* :I`6h?VnK1x aH}۝c`'(.](8T\Z18[* j1-v#{{\uꊗn3nۛ 7ȿZ6%Ԁe|#x&?RJjsF<4(-@ۉDUl*,COQFiH~ֺ,Y{۞z3@1Oّ\!$ ~>J vgW <3BG3gY6@3NCEΌJZ:fCrP_/q<]qF=}ۯ [!oOVv&7pUev$(Ztd}2CAߴ FNP˄  dt>, Bp_ + = -CI1i1 ohaW../|$wDifQ j/uUO.AS Nk[{Jy*ѽoz\;֢@ SKAnR}є Och k#pT5Ddi5|/NN5_4.=ѽ:cwM_W_%o~5@4#sDU؈ .v~>4 OsDTj 7!>ڝPp2Ag)[Is*S{)O%ؕMcfH)cSEkB$:W d"w!<50\&l6[7 uB! ec2 nXw5jˀ%j`҆U]O•s" xW>wu@׎k͗~AE]^p€Ԯ"y"?{l0 텪R#@ o=7(sIBTi~;c0J, UR_AǏ|ӯpg\}Kc$M@RI@3 ژe( dbͼt/@* sRw%; B6z)H*o&$(h30Y[Mj 5e;Pk޽;wΝ;X +\=&p>."\{%\_L oDZ2~x~} D1f"Ĩgk0Zt]}GUZgOpTo @H,B\4T K-SȾ/ OPCE+ QyCIyBIɄU.:\B>%kHĵ5 i:<8[ K jQ8l̠RXpBUY5@D1|~]YԊ1|-=rz-=Ğ/EJ HÆ<7_}ttSߠXIQ16_[UVsÿ1Cw?s; Tq1/~W/bHm 2GQȽ˗~OD3^3Ew]pR`׺w {~ ݃o{x-=hwȿ-/z/K8&}n.{j/9Vipvv۷ovVC rl]W'D[%j.)Q=w&%(ɯB'eycxsW; J$`HhART6TA&!nĖ*8kd&ݼְ@wDfvR5dq@2]^=ZH=U8&u@ 㐉 \5Шd!j[pᣣ<] .]bndHNs6C0q,qpx. SnhY΍ܱI)/HΞ\Roh]T)ţkn$u뼬[A"Jy wnϥ6oNW=8S9c/oqgo|W!aBLjs3j@cF8 h ~|4~{Q7q/ܪ` >"Oup.# `ͻ[ynܸ\|.]!aXB4oU)Z4v/׾Z+5޽w'''>Qצ <ƈʹ-*o[y.(O]Tu y{L FgW߇'o]Cŀp4^s'w + v`oU7ozb1 "%nbǨ^=ߠ~#1ɛeC>r2B0bFɚubsyoJ'^N/`}p?ŵ_p870R5ԝBwTxGZVMpP@8/=^Jpn'߅ #/|gԵd w{pwӞfvŭ[0 05{j i/wc o]kG;v>!˿d#3"q 㫏œc~i׊M&ÓG}MNN]K(]B~"E؞HZzqHr&sEJ")1#gwE@1RRMւd\'_9yHC38IHj&x {_V-+ /~W%km$0_48_ xK[=FCAALXG=O1.cM~3)P6 <.2cxu9Pٗfd$nA; @ :>-lNoɷq)_GgH.$Hqy f<-%XipN_p=*} ~~t̀~{ w+{Y辎-z99nMSJ)^4SJ888!VVN{ߣ=1fzz3kl6LӴͰ ߄HIYYM; \Fx&^C'^3/o.~KV'eDKR /^gI:HIb 0ԝPRQ0!6VqS#!R'B'U{\(N7:!i 2myWW=_Mo66\J Woxg~{*N&{Oa{"1=9H=o~Jl I ]\H p IhV^K2o_QmIܻfFsX{J-YaH:?.Y4hoT5 1r'WP/>'x oE#\^!6*[C3.aw uz|un9oBĮ1˾Ule ΁kL㖢1a= 䘒e%Rj3݌7I)aZ8*Ge_)k>wVcRlوBYJDaud/G8D J4iw4Dέ"6\,//nݻ37jSj_W xi{xC i "(|Q3Bi:p^rRfB+/*ъ<-X/LZO%r1sA \_2 fHOyM1 h``00EQlܲAfx\'ݽLןƳQ׷@eB+'^8Â?0hӿ l"⃿;o5 c+Ɵ}'_85b{p1Oh؋PERX@@kDL%xe>W%QYo)Eܩ{Cv({.AhF (a+f̂d.~xLeFSCO: MX=уFO =ᕓ_M_zW85@ ڳ"0HۦxVZ N]&5.Y-yOdUd{.Gw,K"F'v;MSh9y֞6! #`5ip ,jЮ.X@''+;MbGr

Ј^K\Dmrd^" dsCnׄQݙbE#(GG_$?o;v3$|e[SmJm&cyr5~PU)|Σ@\\C~F@`W}mĹ!ϻxE%\+Rn6dgw_t`HEUDKK aAʆak[yC::Bh08Tؖ.,9 jF|ʍ·%[px@/?\,]i4ӹwBqg{2*o$eWaY`-ںV#-ElNޡu/:Ah=QttϦ%"LsFVhO)C] ޜ̌i]_kӚZ.3Ly*t#t N\^" ̗1^=3r蜝 1u<8?q}ĊO1PmU]MoJTiڈYz_ HJcx߃V2D{p>sv$}qo-͕6UͿSƍ3!aHRJI'zHND7gsS;>u}==w'nN K<,CC2k* MrVN֣ 5d qQ!Zon~\[<_/zsI'P!ЭC}M1ty7h `G9 ʚЙ-24 FD^%JΈkȥpO>~k/DpfM1`,4 r~;9 @!$5 Ңvuc  `^Э@R~.lb9آ3m?k@iN [E͈yƆe@Fe`|?8oz{:rpy ALZ I:( 1=t_k9a` Co'wg3y%ۛBFxF.v$ԑm|8N.VYZCb=+s0{^Maxx/{s/|u*cxv¿~*~ )v{w ToHefx\=֔RdMFHtx]-jxMG9` |GnlU/aH eДUC9IׂA`8[5O2RH|b.seYq"!J(ߓ'&prj2 IZ]NJ`QJB&eN̸z1DmUi?x?(Ӻ0,j2© \2Caٍ}*\2yæMW\+wN|;/6kQ+F" Dq`[ 784Ts4Mhu>kG. ͻ #ʥ) bD)?8ֹ`ޮx!&^D8}qɻYj*ȀrQ%N EL*Q ."I>]ɝ-EߚFm H+8G|幊#q0$Д05k:NJBYS}G2Yiߊ\J-,V54rIHd62F=;R9pͰ?'i=nN~ug7bc &\《"ze|wZ߯I˃`9*K "ESJKJ0JL15AQۿiBN$PWp[\\fG1 MP˻<82֛5 H)`b_5t!@m),Eoh{b8+̹ h5d[5ѐP"M{B: U6ҩE;a!!K).M.UTn;1temN k\Y?{LC</!犣k?D4JUm :OsJWxcC4ZxӎN) h?]5Oz^gNݮj~w?ƒ2);+} glo6׾?U/rJbͭ=*;@$a6|'wuT:Ij;*,o)E?:K'ti`Ym;: \өТQV^&9>3K"a.@So h92,ܨW`9*K'z}~ޟ#՝殴5Y4id*h 僁QKF@x4#:jFX.@Hɋ(kUk"BZ^C4(~Q<կϋ;--MHSB P-`aO -[2f+m̵9H CV`ԄIdwNaYݏ7KB m=ĽJT;PU) iѴ o@5T$8BeAUX#0 Ce[ҀRң]BA-)B) 5= ?3g>sZ?q'}k͜ eCa>tϭC h~+YvVe{W"1ps>ƥK+7W2ӗ!6Mwm$]Sv>=Q:tWf+zaо46-,ޑ/kH47Z1|P.g><+ٱu?LNk>8D<7?\~JS־zQ| 5)a+ tA~]Ĩ6S\@8hQ)EWSP[ diyq͘s0>Q"ssHjIonoʱc_I큍o,n!s؍$Tg> 2R4=CnCX'ë0# uxcv|6G[PZAs JRU'iWJТ+K2_Y3ײT8{0Ϯ,t% 8%{lp6{`'R0eG2BARfD]1GWW~obxkxo1pvBBw*F=H磌O[ۤ] Մ5E_? GrPd:aa- l_.}oK;=,`&_:Nni έxs+cx|7WjgNUHI/dÿO[3\?+)"'/~xHN>능!gP>-d!׏}=EޘV$ ?A:9ODCO)ul$mv _] rod$9{1浸iĴ]Z݊-5:Ywsxy:}Yb)JfT0 Ul6N1* 0F1/ӿYp}ѐ]k4;8oH"U )LKbVZQF8R (ƌ ^.,'NbZ*x3w̻nH! XՄ§mP2uOӬ֕˛!ME>Q2-dysɝwJS+AxoS!1\Z 26I6C\<1ʼE^.e߰GW| 3ޓW{?7w+";Ɲ A5x_d{Q 6J5^GDEZR[)#LbCcgG`"ci*mA2e3>A *2r>vF34bb5^?ZS}ڻ&\!SVbGIP+vg5\füt(륲1z$.= >8S|O??tza8ޫ o{ARFӐ6Yv* niл/v yڊyD^2HG=iYMK]^> u X^*H p 煴J CMwn7k%f@)#9-)ι7oJ#Xs5W=Შc p/Wq7q|;x8Ǫ_BoaaGZHKs0oM (6 (U&g͛GX,{IiArֿtB;*nlkfթef kॏ i:jTcb-ϻoSV+"XJ8yJ&WarSx;} +ŅuWQݵϹ&5vZױ[pn/ԈccYIݦxE S~ߏz$u,~S(DSs !Lv%k_g`S"28[ZR z幩BB䊒"20kZ+,p3Ɛm\g4v}^\Rכ"iֱQrrňlgmը%hWY(/~=SA ~}x_S99_rv Ob\o˵M$p;'vl0H ~ÕɹML"Q[@=z7 MlY$bZNMSb"3'Fvdf{M`"iu#¥8LFsF э 2?}o>[x ~g/p>SC ZE.hhGF73kg+ed3]ƿA6]K#VZW Ŀ?1pڱQKkwMBhi;?ZL!&F-i.Ŧ*%Mkއǵ|׭+A}y>BoşQ,̻%d5/8Oz018!Ζכ8x0cJc*ag 3{S`]0 R1IԞ˷MvG@LI.*K2_.U }kT󬫪l' 2nw<߸yBZYi9$-wĴ&E4T㪅 ĤS|\:Q}D^l$E)xp<L[>'/,? w\%&x:[ZnvC"TiE8$P(`=?g Ád Ea{ -z]rݸ/!ژ}0ofu 4:3V~>PX'2IaH} ɩdROvzlJ,"2@V旕\ .[y<_(ε .H+aܞwpot ZSÞO5!|X~ZZIߚ>\,v6ٵi$,?RΦâuRCۃcScDڠڽGՙ-e_ ӮtwWiy%!,_ke7猛7~|+ ߛ^KUI_Jǝtz;n0$Fvik͵! B 8oþ~i ;uUs#bVę|k,Z4`cv,ZŐcpWetE\9}o|n_j:E ~ .m/ݬ^ шoǸb;qjaZM?ozn'uޒOs3¥,j8 QfAv~HdJڽaQemO,ֳR܎p2)[ PDfl~X7x" H'1 MC*l(5ǐO1|sGXcjEޓӲC+)Fu0" Pc uD+hkZq '׺ K_2/Z&JLr)7'!$9P6J! `}v; ڤ]h! eh#Ij욬\ڹOڋNzGNofl % 7_U|~z!\}o~OO ^< zB7gzpDdHJ Ȩ\vo7_΋ i"uvd\ݬ[jP{ E1q&a[ MhO,),uH6ʈ%aQDA4qìZhJH)栐%WG(Pm{_ _K:@N}gO_w>q]->yy,9eaQ2\>X]?$ @J,Y;u~`tܜNY>[#H]AVlwN"@ ]@ti}@ ]1m?VԋE/IIo F*!%ۮGQɌe5Uo/#vƏ[%T}/@Wd},BB&C|n >Ħ]!OiP9_+/-mZ' 7 ?(14isd 9݅;5l~c{9dM$+q֔DFvdBKj`jҎ%<M~za#+Ֆs~km $m׷7?$=MpC" ݄턄tƌeg&1bo8n&AE $0T~q)zT<>8[ϧ_e_& *fcd( Q!?LjC<{sPٞ'vAr^5_Ryh ^ n O6A6řG Z@hf:7k q6*,<* Wa@ \`V.Tn慱b" 6n&{Yjteʥb*ª~=y]8tcKEYsgAi7ś/?p J.k?fLnn4"QZ䂂"lb8 P7u}K`M~R1Yߔps{γUffAg$II?%+p !+;EuR17s~n&ޥ6rLɺgNA B\ r5pC9W EAQt.FhjA8 qm"ƻ/:i#S'jԎ".VnW3:f.>\+-<^4N¦Ns,!ny?EϡanՎ89ޟg\0zp1m6m7jK  3t!VT"8="g.L/y7XoPȷI l:32i|;_ ˟_Ng@ZIɩeɍX;M!,7:g]vHY(QBtyZvZ1&f4>Z᫥X}Ίa9T5.\Ej*L@!Ղ;ZQQWu>|7~O3c% )9 ~,y=p7<DЃ5LҙpuX+{}b;5PF VQ:>Bb^/jƼ9A\KZy La3>Yz/0C3d!'vkٮAa4q'QIԬ 2)=خ6hk֫38=!O&qiZj.pŨ%{n$= dExn !"Íݞ:(~6|_>}y /xe΢–oE_$Mp *oPÀ#<{)..̩y7=il}MR}ӻ?0tN)fַ|rC̣_^4];gSTl)6(0Bd-)O޴ʚ@ fm|=w;T2O:<@JqĔz?.2B.Usl uUϴi6ӌ5 0,W޾c5k8. xyK {4|O}Y%{A9Qk)HZ,km?M=i"]?xIόl8-sv4R ж~5cc;,MS߿S1lY{j 7iʀ.E#5RW:x.^Ԣv1G#@Mcl DS TI3]q9uG:qe>Tƕ:"fBĂUDkuaċtbJkF@`=W jD)\G~im7243%rƔ:tDx4z@De5:gVW)%{FpU\#}YV l$,-0ڵYHO~;Gp: Uw_G{[a3␜SJ ]~+ܔ&9ia<5}.V.7ƻ8*3Vp4H./FgAIpZVҀMxscܮpgJkB RII lHw1F %/QWhq;$쾷ߡRApEU18o5N^5R7+jW8H:@'J-Kؑ#"3'; )kҹ.ufenb;g]wA$ufij:ukC=zuW+A fio$@-C\&U1F T22YHMeAL`<! :(W( Vm-6mj8^̯Si4jLz%, &2W$P\) 2˚'&UˀD 2G 7O!F Ƶ yZٜp)9Ϩ$hm"\ȣ!RfyqT3#;7<'덆]EtBB|MA7EbS|ɯ?sxʡn|GϢq74+qZe^&ͨzD,LSf"PA!h<͸yo.K(䜝Vݔn<;%{;O@ =f3Ȋ@$Z됂+ =Ů29GFY'?C:@ڕN{k`'_<{AUV@&vaX!J63l:aV-`GgIH"eLu2 [sZcJPJn6ȵxJct@^gR~ﱍv]±5x0ϴf^zPephRRHPłz?u&hkIRoV,-fIG"4Ct˧-1eA,vA5W# 3F@ qp?t }X4.͏@${feYdQt6;QȐlyz}5^)%GnjikLehVW=@mRL#H2V#R(LcdZuk=~"Q9ܓ:"u1vh9!I\=CfE)UqfMRn&i f;a4r.w[jT  T sFomMA>5 6eJѰqZC+Ï#[ZŦ zo`C$۰7OIJp(:Cy3c3x՗Q-Vi3Iz1.(=7`aEcFQ ʙ2)n:a|f #ZC3 L.+Nlnm~.b ?2MTS07޵Њ/u혒7ukV ˤa l8E bHr&$Q@'ìEB ~8;DǴ,0s9kbt&2:7@!1!`D]Р趾\V eJ)Rtέ "7v).,z%L} ƨAh1bӫiJt!--kv}=G"etu ]j*5*$?G94hp0/,?CD qW!V\ O%Ƥhi)@W) V@I Didsu AL2-iV@` RʌD0IMtIXЯ u` $̌Uz^c3.ѳJ5ғaSgBݳuݯ υíO[YRs4}!,9.Έn`өnL  }6B;5FzHȄ=KFX=c;p)ÁnRjGvNpCjjr-3kBkXKNW^J10UA.ђ jTJ/˕ )%ѵNz65 \4j)UxVdK;QM[Vn ﲯfֽsh<2Z~:(=@*PH`%U6m]xP<{h_ T݉]xxhDm5`kS]Zs#B(yfE  'S\9ggrF!y}u+*ʃ6i5؊H]ߚ^Rn4}xoʧpcvWkOwGzjh'5کx6&Cr1)ƚTɃA4\g^z/,>qÈi@9 8ɺxt~2 =LUXe mSrx"2}ijz j#yد#26F>ۅ^Dz<1aړD+\g5렱՚TqEWC׽(٧/B)ϟSj]*)nsVcWdu1{1KM ^(+ۻͮ*!=+*:Ğ%⬿1-!m␘HپMWvL޿+eQĠ / ¦oPIhvi%HʰbXvtmJL9P2;o n0+1b|b.z'U x1&.[dÚh E^Kvr(Bj~da*W7U)b~b9@p4uiٸJy0~.)v -U'}0جYE;^aCeZP#_JEne]]5bb#޲Ņ4([1ra*g#N2nNcΧr$,f RE#)Bd{@k~bkޭ:[@4 )T ]+$h9mvhA@"MMqxe,k(C%m IW9ћa'\$ƕEZܤ4?y?n&-h(`7߼bN{Hl)E]S|+Zavx ^Φ+d#>}!ngކSaG09 (9{ls71)O?&r!RvT"'q ̆; SBE3#ݕvPZYvj#m 9^u.umHRsc3<=iv7 Z7霵(S\ sq9YG6gaЇPC$kA{u :jw#BVۍ6f%?uRh"Ts:ݑ&d#W/ǡVqUCif" `5M "V֊B }ut!+@75Z)TC/{f<;o%^Va M˥O%uqQwxƿfitMhZsgB쾰 5ɪs_{oPs'L5@H4<] BS(P*= KU7RC2CKŜtHr:@ e @szZ%/'@iٯc$QL"yF<O? Dk2~VE#UB Y'㸴 c"m+~sț;O$:sC\g!h,~QOlOC8!5甑w_}=ei^y xy~ Flb.dVZ;3(l qMQ]`Tȝ<;`da:"rb5^*+C` ˜df: n]%>'/v m-ܚ\pZ|k/:lC#($irYO,+LY:rlItRl?nnHwPK0ܢʼ=M\Άht6Wh6ͨN׳z!ȺHԬfJAMѦȵe]mذHwLzm"3j"Z;ك=[JnAy1"mfe=OhSEZ SP%JQ<38FlNVB7'8F=Rj)[r}P.ڀT9--!F<#"ECCFqT2pM4K0Չw1Rꫵ\ *fiFՈDW/ʹ ߟ{b H>'ϧj=*RL- 5QmX*jn3u NB[c(58ۭZԒ7b|жڈ*( Mqa"pm\H)f]QA ה32f}ͺ:NF^.Ks&N7k[Q26%MX}:'sg*Z`G7$CU !ET6ϹvQt|??w|uxE֏Á {@}N[Z@Zt]y.Z ` 4E򘀚A1l _K?+8><] >ubqCp]JJ)a݈X i.n$0 by@)bL/f_IQ0S8z0m:֊19hmƸ:CQ+%+95/܋{ŨaCf䜎>6Y0X (fUdXzr;F7WZ("dhT$ S6m勀!Pl9YtG)*Wԋ~&z S=2WAcRL.r"ifii|Ť[MndG&lE# Ʉ:aL۳]o;@MJm?굙b܍\5A-{)Kl:8UpjT|<\*wipm/^a3KS:mE?@S(.qSⶇ1-<7FDw"%;A2J9UP |Zˬ͐ͺi!{`yB2*zRGhsځJ̲<*#avt.۝5%~EuzV>Xu6=6kSV{a8aL<$ZY{g)yF KJ._µkLlia$`2tF?9 6 t W+WyB #Kxݝ3>%D{s*gwAB x/5gWOC=3nn~/T\`KUtCg˿ב`L @l" MP oV}C/]s)y Yp^K)%=-<#Eh 딚W%yQT2͊gZH9ʰ(0-/"ňgFkŶMb\{}soGJ2 Z;(“(%,xQ ߖfJc헁`$ 5 IG(zE-2xTV5@.\dF,ZÐs 5R*YIǂ" bh^%Pe{K;4DƲ $|X ӳ3p8X0(Ӵ]Ϊc0j˗џ xװ΋]BH,;ʹpk>b<%J7U|O:ykr ݼ"vg 7ŷZO~p|0b[*V+>1> /\[G 7ңݿ>zsa|G/_ O`CB0CKTxf tP2ӧ]|Cߘ,'s:k`F   17^zD,Fv^>;3ʐa`6 /#v.`\aZVãAew7l0;x!Dy)%vPK4MƱEe=C+D<.ϓJd,%B[`3JmaQa1qR*f+C"YBP[sj_Y*{sn$U\Ҁ0Dd.~}v,24>o.RzvjDaX5#u=:ϳen[[b`i;#ƄW]|?yY|d 뷨!0Ρ _);ozDjvr3!2b%N*\.T4[ɓPHĂ@i*a c.1s Qߋc_۹ EWWWA A@v7YJD>a8B76>ٿַsIDAT$yilL{& aِúI>tPo^4m1Ox/=ϳ)m]cV!P5@/~[\*ڞKRCZ+N`\T 7M+!`|騥ldg8#y0]›%4wRYZxdr&Ĵ!<9Wmlxp=4@$w؍=C`wULg\iCh^]4 "z>DxXR Gٞ"'o գ?_Ѡ(f<׮އ'_7_^v!_Zfe <lq|6~ᓟ}`3mQyЙMYu΂L8)$_mnY%7ХKkʺ¤? J;d'(Rkzv;921Mj˧PPzgkm-H 3J&{ݫS+)[i~br0Wi*AS?~Ӿ'R>)>Iy d819T0m)W iTb]B$ՅC\xP0Y򹣭:8=D8AI dcՈ+ 2fy$)\+dL.tYZ2b Ԃy^kX0W.`yB3Ry %OS;ے@7Os'O*"w-N6(61zZk*n7 J 2Uɹd[$׊' ǚԜ'YhPJ@!RPQ:V C,0 l* )19ZfoZ6KȤ*M Ej%oAF|A squઇy2薺6ԀGGGXi2!`Øt`dck#o?t72_ _qjydPS\ yj> &a%q3ĈhmuDCDQ'̓(g:O|{zͯ?aԲm 7mPߓ}"鸭7o!!c\>>F}A$cݿ23ZCC $rj$DA"ɢIr?ՠIH\cOOOpHRSJH5ao|brDlZfX(zjWmAKm^=8)m_%䂉'q|K=nҪ$(Ө͒Lh GGG2ٜj`y(ːEV2]sAb]-CIUG89=Q55!<dH uFX.% "־QHzsO`9e 5'i$#$ !E@eF .ggg899inEl6[yW\2j1/Źd @C0g:$!U=#ߏ|U (D) b)vՒR0bJ\7{b5I QeA)Xcm/ʀ gۻw`@TLEW;sV W"DN!s.bvtp2UYTm!<_RNCSɨ+$[`0wčobb."* 4(CaYd% b<7sΨ*W ޮQ\~wn+l [S#L}"tCPUBmi+Я~3W W[<@^Z^ޟ៽ ~G+7q鱏?qMSV/+k^VV'lc.sTsWKm-8?}K>O/ ,{fA\JjmB%#v~1yNz' (8z_q9I302Pƞ002dGKRYh6 bt}Z4I_3XIt;r2ؒTNa}0u雡oL> eǎdz+rfm5t+,<|ӟg~3x0Y#QJAV.$8\Z"i!O#&/EBOļ³6O|aϸ+iNv+)F7_S L' GWq|t%p"SpAM\)+2]0Ʈ4N(575-??|cH 2$%,~5)dw1 V#RڙPp_8$ N `spq/A ݀' +jA=9:3[#;=dE}xKoV9=FGEj8#sFX{l+haܧtk>;͗b yn5 N,VcIPxg@߽V xV-W*B%"v|"{ TA$kXx{`P)]]cE5J5N^(66/AT/e[C$v7D3!T5Q_n|?3SԂ_! Wj}"@9L|vquLˡqHG>5u,=w y _FGN{_ţ#5$Y!F7hHrnd͑4+eB ¥f;ԵzP'\ tzr q&#t2ТĂvʷ.kF W>CǘM='>kXtf]}=4O'sX߽7n I*+ :`3]P]0Qf-ҝf&/M0]7O?o`QvOJʒU"D{#ԫSk-.B`!8˚ :\ͨ9MQ%g7‹4ٲ~ksoȗDbH$ dI&.IYpmGQ;UݪrTED<#Ld"7{{^{{ L"{>g~7䯪Y#0!h^6:Jc+DyluFCqa}aœBx }2p{ A5M<&ӋiF/SwH)@(5=SFZ,+K2{<&=j1Gn)QE,c,^YH}#epgdT@1q&xB#LHdj\t&Gُ=['0lT1%ω*# )b7 JF&Q4Pz5zOS9LYe'HN. G~N Hd߭(V+_Zo*JI}Kt?|Q5 ̹VE&"j*{pP[Ar;kʰV=*jF(Y'.91=} mS?>n&7;÷^54 &Cd;#uAƼN=Y|,J7J6z<LG‹eA7fYԌ ~S8b:ػ_7#,ZDpico}I\>eК@ 9u {_>FMx;pB, I"dE {5mTA(J/^'.&PhN6#v"F!Eyӣl ӱgm;kAQJ]KclyhWQ^$Vj /Szv\GO+w(zH}Ͼo_amc mJ ż-O_lfYHr^4]';)|+` T%i[;\RoK1qeŃgXcXC9RfGeܠke2ϐV1935!b>&U"Q2G׋G})"Y2MպpO]n :q*ص Go(U2!U!ԧDA 9#-JP\,BAtR\eT< sqs8 򏥐ڌ޸4almB(<=(|,L\0jIfk@߫W 2?9]G!3q m k./\lJf`"e}sX͇:"0 //G`gw3fi>7g8z8{헟F];5BU+ \{_SaKl;pׇJV&d߁ /\E-2WHbt.j\$ͬYG),@.qo~/{ ' ռ "@$nZ\z7CFə|ԅXG;ç13!܃[?COy=DJm0 @&-;ӟ鯃ܵ[9*>je $זٳؑ:K BT-PX*C#٬-TCJtkIVɆәZ>( >Nsy}%ҽhDdfڶKMfQ ?s)U8Oރc4iHzgUQ)9~fC*Uw*dI9;=ڐdT6XugLr9?>9Sj1!#|"rD93Cbj7|: Q919WHL!Շ^]1I yT &v 'Nɣ5D˦|8*L-*(Q#\' tϥ+j5Zpo4@LK-eG dŨ{ 4v;oF(lkk}Ej9kԒŖS Wd}^_7[c{< 0|&`0"7`\'ʮN:څx<c?|XZ§zoĮ=un Z P}Җl ґ(UI#璱H .lyoKQ|TbKt ]eL赻2clB+.6m<)( l $Y$AH=9 i'NNdXI^S-le}n<98K{>䀃d%0pJ3$$J|HmUFɵI_f 8 ٤- )/ElN>,#TDKJ;/x4Y<.RnHSpR.h-k>A]d4DZN n !ФВiP !uFĨidGtedJ&GǃPN 1h,7^6ɤ }{>EQϦXٱ_9 yܦ:;WsՀIьS 2|o`+xfcp-%PY[Lr.]yw&i=K$?|7Ilo=e&Zx؃J 9=\l@~X_n}ۏ,..cZLVVSJAٜ-m?W> @N L0s(UIYKck-+xX[IK̰l)!M=Ceζi^]'Nm2t&ཫ+Y w)<-1Åg`E_upP#.\83g"q*H saX`j|\(ӗpu74p,*i:Hw#G%BQr0:nsuEJ^F!jk;A_bvC"1#'Ψ LMYN*b4@:8Y$}dXTyC̑.&AL %y,;ˑ%Kرo&X>?_ۤUXP0^!I!(fҾtF Yxd*x^̒Y%6;{P ` ,=2V*FB AxIn$X_j$R3=!d%dWn: 3w+̧I0u|f˟({TeV(|ϣ^=܏6$ˆ2gVֳx4nn,.,/Oݱg<߉W ^z"3:*n,¹RH6p6B ?ٝdW{ѯaǰg`k :yhS7i{!u~DLT으bq}Iy= pf?˛NY@pqﶅCEX!#LeP'D%DNJM!#2X\?aN/U|4#Vl RRv{(S5+A̚zG>M-G*^XfP, ,+"H!T<L "Q-_a @r0hF>dO&/.z+ܜrCts~(xtfVÒע&R`Q1eeRdz ֯\#`>OΒYJMJYR+]vAg\PΑD\*]-,L^wc>b3ϸᑎqA ,W??FNoq4`၏뽍.@Wc9s,NƌB܃&uǎ?֯03ݻpJ,7C?PȻFRz4X!>>v.;nS7Ƿk6WOrOބ#͋pc/,#i]"/LF9*=`,t qĭb>_ڍ 2{\o}u\1:r =#AǃC2iw]7P!|![Cߨy 5Xk|c O*S9a;Ihܷm#1? =x=;x4n:Wsh7WA1#L9$Cg~%XŰ+ɼ9qJIWm=X !=SJxcN*#Ĝ̵̨v:r&K;Z6:FXhd=&L& M0:&)+"į1E CqRNwIa杗YUM }D.϶Q` QaEBWqF Fe(#"#ѢeR6bF;lC %uJqo]=Y*62uRf:Χ ,bDзk#bסo3;nɷO34e*w-6>*x2\Fh߇ k҈7k!2'D78I1|U]!>zszO8d:;Oɰ1gof}8'V%%%q|e78o '}]{Ïǘ-N__q 36ti,3,I,2@ E_E;};E0]7!I  _JtuƮx Gq~ y|Uu?"JP(8 [G^%B%R̎-/8zϮkgpYBdٙ-H"=י`+\iM `=y>hAV7/hVeI6 ڼ tCŇ:OY֧{e #L.m8.sc'睮i4ic Q:OV2%Ǵ5`Qդ)x)ĤiRΚkG <(:!ֆ2A=Q)DlX" T`V_E(+'Jx\gh@pN;2e?~Ha}=sl;ciiYT]\XTMAR=zףU-gTME}vypI8ƣ}%G`b4YFݞ<;'G;G*[6h.<^ #&ɯ,7EH4&ۙN<[R2@yUX4 5h5^GGN$}9 " ylђ},b AmK W`/7G!MJ0>a678;S/?{bcmJa3,qL2zMV'-W80ߍaIYΈ6O`{| O .[c4ˏayظ0? l *f)kTk @Z܏nzX["AS˸k'4ȅamzk_L&M[XXT1-Qu۽M-YV.F2ڊ1 FOUb Kߧs:DtBH \0Ge(ocB==lir ZNAAB1*""4gs t ˜(* zD' $v7jj(+ QJCbj0f3kpr0TlbQH:b>tQgEeu#.HoW~a"!cImem;dM[4\(^j2H(=ox&A?YK^7doGi@R|J)f\ҺKcAu&\QGzL Mǎ[[3m(|UQ!I0΅DEz1eH){ ޼gz7z+߷(WƋO0^d') di;&<5L܄K(7[7@3(nY$)_\#2H/g&p3)4v;n h7uuӍxeǎÑׁ}$ h<r9 -DL ξ O rJs=n%$WC>n6!Z>KjsȮiy Ȳ Q'!Wy6k@(>o.^Lk!j5 bk\mWqb bhCa+lx+'+H+KNlb_ʕR D46jnRAu")deoNgʖH,HcU;܊H &mD,{BDOpH .Lw hn/Iύ "|H]`|VdNFvgM^45vzT db%n1XcW셵Ly &}q7bC?Džӛ~K'my*㶢\]AqBy8זcȆ"}7ť#8gg.où^J2]L׮`c:ŵ1F^Э]Exb>īo+!NWKC7$Rgrz;ALsX Zcp1et|ԉ>wmgNĎ={ǭlIvtH]P`sښЗ^XyWCoW oiMNJ3Pиq^t"}'R.lf! `!0 \KN^nh?2D>Nn8{b2:jKj-pC$8gL2(!G HT:X\&AygsM+xSd+ODmbUԎ`(gu.22 {,..&3ٜcftKl6|6"KA4KH95'' bN9.dMҲY!|8ai>{}X][|5k*s' T Ο M4{LHxj?4NP+gq?_h1)bf"#Kɑ|ݿ}/]a~^sD؛G=^} _q#qqݴdTBA2h(~)- Kn LZ8ψaz\ۧO᝷ކhF-{%CšD*Xh6.x")'{o'?Z"3;'%¼t)]+eX5Q&\nycYdDDe lΝ>o~;X"@U./w5%߳ςއWUNaReuR 'ԦPCtk A4;6NA  ?׃@ƙ.j;Vv >֛#OEztyg 'pA!*QbzkY ))|~,. s87B㊱,Sf0hZ8q٬a[q?QT%pRʨ2Z6}ޯ{KoޓQm06$vVns{n1\nގ?8/ʠy:' u1#,;=c/ސo e`a5/ccccΏ@.~k~şZX0]>xu{qKoǟ3~q͞EuZ{w/ NI6y/&O! H֙neo}+S;Ph@n$c9, ]1y`O+iy'|xy^l8{tQd>3󦨹Y嬐 epYHi tޛ Q\vs z$mJxDqxeE.d oEk4#!J& M3dr%g.d}m k觛xgǟkǥ7V1$-\эZ39gg{T" *Xחx>*0vZZ#GT|2:lOkBm0YX|6z1rDϧwFl6/3}48 rI%\+Xٹߊ!.^} Y=ٝkqW1j[Đ YôFj!h49'GIDƪ\<}@O(W{<ſ4:x3.+s,z[ރ }P\ +q`FTlQ}af39 /տÛo ] 9&fMKhƘSv56Y'epRX:JsȌ`_ᗿOpm7{C?ه1Jׂ| jFOP|BlK%u/`[3`aQ\|)aw8\.#8F#(؉n60;wmNBSǎo7Obݷqh9r ˘,."DFH IW*&zd2 }"+?+DWnS[ F67CXaf}@:盘_A;17DfWuo i|3/bچz !rC=E!S;ށ>x{hy.gWW""#;+ S2.`cs ^ZD+ Yn?3[k1gxZTQa++LnKD SI2:z&66U|]xZvg.|K+8t0VVЎƘVmn$:IW-sΤ&D ]آ).mNNObl6 e!rX@:vڨ4$AI;*:)85&Z"+8u<]"lo60!mJ@v~r7Vۉ#I"h)̊Vv:l/ U+DhbXA%\&)Bd% gE5r}Jct^b%UQ2b>{g##%T=6ih<q:~_s] DfYW&"!K)$"Q%h$B$>h%SBf\f$%ݼPM ERۑg,K`Cn|AUt@e;PGEEbe/ƥEJ=&ЁgsnݻqbW_%\ǀ!egbkxd$3t\'^"b+q<j`GÍ{>1y1q8z14wgXX.C9 /_GGivKen2t[g,`R蚲;{t9ZыW,9i9R,$nnu]kуq` ή2ڃb%}!w.:"B4{E9<*bHE^k odRz]_)S_Rfo~Xrt]c=;w`Ą'_xǟ{gG@ʳU{m Or BJ%C j|\k5cQ=?Y+Y9&ȘEu ҹ, !k7O8{e8_=g]>SڒV,URlg%Tl\"f*STF7>!V!H/%/hfKx 2ykboyNܱ &G#)..+{kNVoN3G 2` xNEFѤ1SDk̻NIWSG<;RwN'zd*lЗ{Hс匃l*Xx+ DKRQDw0mbss"n8:^ >p(nU>ICЙi]9 oθg&V ^2#GFɻG/v̻Yyyds+CHhت&a!LEFt&yO0 !<&fӫv2n}R@4aPx*"MJT?&>s$8M>8ܹKtfD8uQa}4.~ǮwB3FgW<TvK!C=}H.emtәFN7MFHuyҫo0rQ+ 5!&z1kPKD~%8ny̒Q;LNFw̘f#}H}H=} Tpmqh~s>87=OtC3Jx!O4l)ߎ#@m:I㵓'pYnd o|1]h2X0eC^x/V@c~q \na['mK& %9 /3fNSq Yl.[[5q9z,N>d;p`e7ރ;wb޽صk'-(d#F7ib"h61";^\MОϻx ѴiDɣ/\du]y( Bw' zԎ0Նj=<."0je1KT_mMAo%g Q쏑/#0GtÐZf/<2.o{7ۇ]+XޱSGR};5I)4jN!I 1`S$9:5 1g$w qȹqJO1Ics/G8EJfA:ȥȝd|$ņse#|&g!1}OΌإQ^>+ ,MҡwecxܫoM :>Y<1], (y&6 syw?0V=^xq}'t e+âa!vQBԬr]HkKd% vMDΤ@P:+r <7`}t3w&a8عc.vv,--mr`1c \omFr@vj Nrdy%SziYN1u#Qӂ!Gf~'lynS]X\憘*d;jwMĜ6Kgn {w2._9.E`|5ɝǭ1kycI7<89H2UDivQ"d9Q"DP0UҪ ̉z7#yRc^!JyDMb6hel'~#_Ur!ɻ鳣eURXAdy2jJ],3,=rPp {iLzƩ7ʹU:}Go8]\;]qhɣ 1|^D>xA@٥ $%%=}!=8k,$<ŭo!;U4s"b x)4cs`5hB? oГCvOO% a佌b)1<}xw[3pBxz㄰ A@iuKHq>3$[CΎtNtŞp۟2a]$A)Vo23*>/p#Μ| tf'KSF ?u'@NTL fpثYjpgR d8 o m}=sIY~W! y͛R(&InL=6`l=6.GM όvxMlFV#3(9#!Rt`7F- ̒TS#8glc:s.M d&?Sg@[DH$vMta9M*-Ei TαDo:L5gc$ ƨ;8ߢQ+ޡQ5hnZMhhK;W{ ֧q˗K@ЂϒC9 $'ISu]RxkE/E 6E"!EaU̅jJRcͭ7-E3Zx4<@ؘn$Q`.9[@n |by?:3Cz}lq@q .b6߀kF>DLV%ȡ4w9бe!:g0h15M-;}%!N.CbC 8c+=bfO^[M|*#KFj![@NT9 y:B&4<;@GN"9"7fnBQ/d2dFPmCgʥ2rf2):FI>l9!TN)I/}Bu"Ї$ma3I%oSR1Մ!z:@ԱBrt ZH=@!vyVjJjCh\+š+e=·Flbg{L܋U6W^Fd#:dNPnk3E/{⛓S`FB* g/TSRMq_UNJH#G k.VP# &Uպr&x"te17"w,A68K`P}5 QcN"<]|18 97Fg谎M/b<`a^,/Fjb^")d1Bc߃"9KTČj!9ɦ yqlܨZac>9vqmv|+_on4>ubgѬv"O @SWJ}~NhP)6d#"*zAKXٵ1wt=4W5 yFOedL j4̐ԁ;%1'EA:?!C$?)Z̫6\|ّ9H,DIiؐ5R?hljB F"4Q5d2BAH>D%zŘM\OFX}xJ<rdUjSΔ=s\i`q*G3fpuTe a'H(Gl\u!nߘ%\X).u/Wj3^ZY,~ӱgٹO~ZP3G3N(.с^/i*|7O`DƮ7Vp{ , Sǩχjd R 3 : u ),ҖB/t(Fg-\g8|d]3a T)N8ta 7#0gK1#•Q";m;kFp1qZQŅIbmϒ䰏/gILL+Lj:y )%p"v<#6}KpAM݇q{s!~;)f=EN"dɝd͞>7 "}Lἥ"N:O! l~񮤍Y&>5B,jg"l,ET΁ #re^>_9Y)MBpޚW :0Q;FKl6DGWc:!ȑK<'pfi)j16-:WD%d97/ El@ f  'Q±1)T.ǩh@+{m RR $K*b[p!nn,'Z+xӾ5|*Uetr Dx%|51CˁM?VFܤ`3c/F4[ڿGᡩMz~;wJ [b#Bڰs) l ~V*b{ )Hgy\9̵0iB#fmagB&Ą0.Y" IC"g]=[>g 1;[0*jx}Z3  `7k0砐#w%s2Dbu l,xPoԺ,x'<=܊3oكkߋ>|wqizpc샷Ц` *pǠXtDO4LC 01}6uD[@(kSrY=O.!=ֶ։ bKHcu ;WqL`V9n\HlcI70A`FV;Ց ʹfϖ\d\`=.ŃM&>$9 WqOd>)kR#Gأ 0Ӏ ɀ'3aK[=UƬSD1A|Ӧ?$'DCGA#)@càKN|dsLh&uc(TwըX̰;g .}McyxҬ JI%WM`Qv7 .֠u6{-^s] |b'/x8JЂM﫴E Ju`zћv~$ 7[YҺ b %06 (tYEXB/֢̬N(aI =ܬCOuvR=b'ȷ3R"wzי.9 !锝Ë/{f=n}};ء?>Ϳx3d 2μ'~-uF լt`@If'#@n>$`/qΙ7\ vʆ2a'ht4?=iӈ@x HAD ,3L,u8F_MCbyp-U-2/JJ 2CvjǢ$vӽ8zoHQLȩ33'LW)h#cz s }/eCh"Qe jK\92CdfO,!4( qY/]ŌFF у8aVe]AHS=Bٽ<3nX20h@ѿq# Dgʾ\'A jBo%*sX0f@-;cN+8F{G.>aPWkߎq.$dz :ݨՍ:k5FTqVX_@vyy pNaC!296 -vLYRRDSi;3Nդx}#?X*;cӘcO8krGin`qRTb]׃'DhǴѝxGv4ލ}}p :AZ&V7 J6lv+9y7Ɂ`j—P+mzbZ0ɽ%x( 3sb~ÚNkNnzW */@=6&Q*\r:fg2L.HCb_DIOTap"w059ccY1!E6n ٕ\%Od4ҷt-M ǹ ' )K/9ش֤P1`WV}_:8VsR<# T7EOcU20J"=j3vV쭩lP U'WiE[^msS)Ve`MӚjr1K!=8.O30'#dtG lK$y^+3Z`9WɷI36 g(YZڲW1[ǜok/5ıh@.}Q gB+u1[qmk:<NHʤ<礸1 ]Č0B Kz~g@&h\·bĊppAd:(>q|C~5:[DaQtQ3\Aԃ$[ l/AJhdNyTF+G4 ntӸB?KI!4m~vI<'PL$dQ~)' &R?/(IXOsqKJ,ؘI"RЕ!4OrqKH'UBÄ5%묔+cLyHT 4}/=T069ald\z2@DB 'Q͖#CrPir)pJ05iC_mF#[>u.EzJLppQlg!ҭfds| Arnfu`>Jx@( ith :`OJ3Uvyohʜ[N<LΨ4) (_ʘ$},6hqЛ@2oj|r2l 3-^?./Z]oۇKc94$լLarb;آ?ev*SMj%9dyJUHΑ;.~K fB cf[X=rH5kk'0S.R@ЋԌ ⥟Wρ),9"d;i2⣐,X'p5mA / ϱ&ڥ(féA6>;8n/T(,b p!T́a=<\kWЧ0xnbc":$sAǘL5m2MA: 1У[v93MM}U-L khO4R ?j;Sx!laթQjr-6D&F[_ΙQ){sadP"ګ3"~e~/OܩE4R:1uD  ^Hx җ?7q$O0"!B'B0z|%RVHhۊ 9Њf2r-U0k5R :͓VRdx3^hI*N,#ёr>N,, :a6RHl޵I.7wgpT;dh;乪_Y<[ %UfN8509 jId#g%#e}6yWT*TXڨ$UFX Ud2G)ؠS\T\>OD*j} 8$h \09hQz(V6c[[S;Gk&xnqk%ơ5kY\ef0j XaA u BՒW#ѫV Qּc(c[HW؍qMnt)~*䥰4'bIz=\fd׺fEEA^wKc[Ycd3-_QџA5t נϯѩͦVz"{_uv!|b Qů;HܾN @?BēNVr#-Mrsl,VVnNlVR2Ca/3DIb ,E];i:M!'E}%Q^2s92 f`PfjW LIg t @C2b3fUdPck=9[Yٵ1bòs&llD@bGVc!A; $&mvT6J}.K0B.saj YQ4nSvW%֦'bSQ>}1xɝ*qVqY-M+ݖ0+ods۝+ex[E(<=OejT F^I͙[hI$Q4OP36b>ʅP|Z0/oK1愥OPMq/) 5$YL>Y~T&uZ@Y_ޯ2>4[Cgfl2)-Uh]!z7/.ޓWV̐ui~\"u+ Cd&&A7Q\F'Kb|bi!2H'Y8m]j5B7@.MQW\*M caQӕlOa--ބv!ed` ʲzRDHS0p-f2Ce!ֳ?cPJĆx"ss &| kbPUbvTYsXɐk>9sS@ˡATx:$KPR!i>z@sG8F/\x8èT1ѽzM~`1+QufKd4ҶRrmFrعmh$Ș :lܕ֚g֜op qi @οKm9+>?u%Bߣ s'2)6*wJȅ\U4QI=,\5Sɢj۠rPgws&۵CHՠw]zdBe$Er MC*/#R5[[\llKM=.?NٚƓT7JzaMl@6_OW.NьS+ٞa&ٓij=& \9Gm!Pc_+PX6}j%C^E,0i3Er`g}Hӆ*r:*?8O6wX1JGKƎx%yaޔ\9 z&o!r>+f*rc1B ^Ͱ/UVxPԩ_,g#0dӖKΑlaLJd) m hFٳc)*9C 'V%4^J$r͹[7> }xfjF#~^|h'"FP.%DiٟCSmj/KRӐ .duj| qkZM+~#qAm,p8Dig|jƝjDb_9-3}FYbz $qA$96!K X'a_p/U?[|WdLq ʹP΅(t(#efʁ|\9\{{>}1=*8`߱{羀xyk+{pܣxc*[q#k?Uxo#:03^{iߣ|nGo7opWq۠ŁO3o%D 8:.Z+gXXw4^{_Mv ( O#E/8!9MWk2O(P6k R-/TVÿ_ۯGtXީӸ_,~K9k v'|$aa.EYY_ڇ/ !Nx&4-3DYEUfrt&TS.IrYU t*K+Pd<H5cLl[-]h޴LvS}x"ȵb~n m#TV @=,P[Y5`Tl2_Łډ!9#IÎehN=Bʮ_d -8̛\簧%ݳR&*NE&Y%dMWDXXŠIvFP§kyv/ᶛ/;@ sW{?Ł=X^x.`෾U}0XMGoۧbY^_{3,knX=w~i7>_܃ؿkGǎcpr3gđ+[ v8x#/n=ہ]&=tk[_qmGq n(v^s }fޗ6lm=ޠ׊vk""(r._Wq0C20j\5g³/_,HUw[oxog"T JZUg ,R?2t1pQy"ٕĜr'-a 4cXhҨ,Ghy&;cy2M߳V%C=JGV;څ0P`ˊHm sשS[h@siӉH#Jzp?7<6d81:n4b'X*!((>[<02QW]|5@1nM)lY屦%0Zjy~aB*E+K:0/qL/KyBTtΠDFEm5kgb`kZhr}b/Lpȶss},P>7Q8k^]OPL"KY` ф>Ef S]eIDATAA3aq>-sFMS,x@L}wݎ9Ow݈k Z؍z, 2cG}t=@k9\{p}D}?vxxhGn}wt4Iqs`| hwÞ#qBu["Y#2w>R;lP@m hjC*~;i@•be@W?@ ytr;ol0q~({r ^~`z/"~,@czyvO{Wpx{ &#qKs<أW?0sIe0@sloęB6gl§tgO@&K Q36X}(̶bȆ>g=3e^$;33l0Z 69hQ^=m{UUc5l䉖(TRͼ{`쒡{ߖQnSCGJ AfC[%Wנmsp\=վUeNfe\5eyO9bw;X1QtA k@FQ;-рyM%<Xy|Z>¹U\Sif$іdpx\w{n$bE 37%2$eǛJ 6%ۙkPO2+͙0L ect5cAeB\LC ?cۭCtLDșѢKQ 224lZڈR+J >/; ,<˵ 378-pKD+j9`ϫ}4𮰜b6l.Yߘ5G_m%Mluo) Ǖ~kˋ#D<kx퉿C^ƕc1ܹ{oǿVb6DfYYL9&obm}Kn}{0@ίn.νf;C1nb$\FãOC^zaa"ĴG?{M-/ڴ5 ӷO| ^6cKuRgL5Zā;_ w;B*j٘y{$ 4`:^hpOo@g.~1 %Ms-&$8c* K 1Yo' :t=~䳘LpE?v;g~%\|kg߀-ŭ7ه˫kxp'+I׫G*ÓBdJvY~Fe`g~vmIXQ_z&eҼ)(k (泒 \Zbk;:RxU> m Mg%jk 1kp ̜s CEp5ϦafTTy2\Cl5汾Vb * d6<돠Eb G,^] JltjM^c#+I5v +2U]w5e` PP3MVpOB3^SO4yqz]h'Kr N>{߈y{\“DfXw,^sqW_~|.7؇_s=8kx'*8p]\Aþ±νXt/?(6}uý`e~l^?_zb f~&d_|&LS[Ln 5:vD=y0?_F˻ADІhoV8a;V^f,,T4wCTZe \]7އkV08;wzW9~_Js7ήqģp>sph=&{/G!C#֛ofGM:V&Vx ɃmL OW)Vz3k!QDZfz8Ɓi@ 2`0l2юYЧ6*00fʣ8a6R6v^9 FTԈіg|W~x3h8\]X]I5?K|(ߟl lM'XmWqS9^.L{ƛoO|kjFp~cԧpx3xG+^ 9;z34gN*xpÿ{+xs8sdZvᶇ7.ĻpS9P8n{w wW.1lK;vO"nL/[/x q&ġ~10.n,ZNӉg/Kw_hy#)A+',ݑeaB4l\7jV¸6WZNfH΋ H/07cȽ%y``ݩ@ۭ7FNA|_EؽYM]CxwSon9w.صr{fOaٷġngbIW?p+ٷõn+<"=m?C{p=8~˭Xν}qC_/Cp]8~hN Á[#pƣqZIϿ ۿ_x.ph7nZ&wL2:u8:cm×G6 \[dD32S@B@7OZSix)MɺoFB*2NlC-%$v-ѸR !As;p͞%=j#!=Kp;XDA.XʋB{Zvxx|׌ ȫ3Y=ct*.%&>]Ec;76!T %эvVlh`Vh+60Tm|5k6v5pf cA`5G+mq1`81뗯B Rk mE46χ@0i0jIX90mARKdK!-V=$jς{UrV9?d p$Qs5m}`DUvr|ALZYdy1Fz 8rC ~,MF]Lҿn7= d\{`.?pDZ#XL]olgvp aqiM-1H<(ȅs#{'u( t%hl4 NK\CeX4LH5PkP>j 0pDtn #؎8<Bwؿw7-ceǎJ"܇gvay MlKc{]Xhe?&d!w섛di +ˋ)VK#iXhv ƈK3Y.(. |:ٻgy~S ߢ _LZp(Cw_? ߎ:|FZ4;%שn/1 (l*C]Lߥ[h ^‹/7։gcx#*59uiǞ~ =N&} |ӷQ:,/x0].CL7"*C2N8{C ~Ҟm5l[7E[ՙ1pί]:CT3!!Q5ĦbR\ Kâum vZ!Q1R2r#YR^«0J@^Әb>-k/cz79b@m ְl`e̺+Ff~Zpec oܥ5 1].o{vyuc{8xqCJ v[+x/}|Pbuo*.4 +hvqNO~Z !ĸ csm.v a*ʡz ?}z܃6p'q';0_=o_‘C{qymWOs??Ā'opn=eVk2hҜfl|z YvK0t] h ϯZX 1 Xïe;%%ǘy_jn.kUp|unu6tnqUn'x v2ۻM󯾃o Gس nn/@8px qkgs~?$O{fYhKѓO#xa ?VϾ83O<;~G#0jϾvq>=9 < G['_+o=n8ܕ)N>$|4ZX[εj|RZ9=*&;ǝw~ lWX6hنmCl_TZgm$ކ_}ǸDž|Uv:ӶmINաM{ xIWY2GE\s7z& 8}}YO(7z7vډ+./`vM <ډ!nط}x͓x@Sbݡ#?87^xfϨ:hב[paqy'V/_/=K"=܀,VRk/?<&?k?fJj;rBnu<|(<s7*:C4eR}e˛*|l7,ǬJMQoݼ쿕"7'%Рs..ch?yt~'tW o3s&(̯XX?nZ؇/W}(~rTqG tQGU֎2@ⶻnTk+\~ة OCO);vBO[d[9U3 ~U`k J*~,O>jc֏l&\OQ͡hGO&u)/}- v;W_^}5[:2m~>o^d|1c'ڽ4;΋͔NƶR"#U`u=|FS4[ m*U3;??? >S%tEXtdate:create2020-05-17T22:00:42+00:00ڮK%tEXtdate:modify2020-05-17T22:00:42+00:00IENDB`CPU-X-5.0.3/data/icons/CPU-X_64x64.png000066400000000000000000000165231454622605200166310ustar00rootroot00000000000000PNG  IHDR@@iqgAMA a cHRMz&u0`:pQ<bKGD pHYsHHFk>UIDATxڍk]u{}g8R(zQ,[bGj;tV:-h6Fڦh-(~k6iI`#±,PHć("qg}^w(7R3{k__g~Wy/bP$@ cEQ[8o{SJ21Jߕ&B.{:mf]BP:؞L7m4WS-aX "Hym{o|cRb 5S+(]7yDic||.\gL}ڝƀbcyG{?7[M[ƐmwRdodm1~%(直s{=Q遠AL bPJp=fX$1~N26$ pF%w~۷> :(<+(1( ;2T#ŢR+4E BO rC*پ$! L:{iH " bL~_"IwimoL xaƇqWJaU bϞg5RAҸ~leA0AD0c$ܸ=s8%\(e-$L:a|ZRi]D" )0b߂daUWns+k8C|?zrv`7I h$$ {&+=(I8Y|{nTr//6"kxzk_%O mD pדo!Nb\ޯW?w(b5k0E8t? |q̲= ޹`Ӫ|s(7dJB 8{_)E$llBj_/x*N]ƀ+id7na0zQ8Akͮ1*~nC:5J[O0blLYYDyۅR%'CRUdrk%qRBݤޢ16 ^}bz0HJ%"LbthTۭm{r$)(8q/JrcϫTjhclJ$>-ڭ-<މqj.$&}XW(z TI#J;Geovln>.'Nƍ!3;;!Sva]I(F!) 9&IHkt,n=lM~~!#Rxo cd-&/_W_ʕ+!Aٳ8x _S2[5%*so$%qJY4b`vlIWv墴!MA2T)vd/(8fyeΜ9õkX]]%\ץvr۬olX/ۑ^tj{mEdtAUQ^~5s&l>,.a/A+m"Z/A@lnnayccc Akk`Ja$ZkkJRT׭1'ȭA_㯲2?skpt7`\dJr1-C9g)y^)8&c| ?>}8C9^t:]8ڱFU9;|lX:zc7C)kc}\]x_}_Sso:&q6,sҽyiXDzjyq066Ɠ(asy ?q׿NEOs,/-}k&BNaˎON_?{Fߜ\q{#WdTՈsS.J|/\`{^~;oSLN}7"$Ɛ$Y2α@4#C2SYy}?ɑk7ov;mtQ{ӗ8(6)`$)5lͱ@qHAcE;wf{wy~$!47ѫgj*W,ZPf8hXRVI0a`cqn$p{4bs(bR ҅kQzwy{GQC=>7[ywr @!nڥ-D S@7*J{d)Jtw(E+)yT䔪@ܨt*ǎILbxxzOLtgL] [Zys& CVVVRU.JRd{ݼ3y lCޝTqINEL-{䢈T2RAL8Ð4Cyg7/jVT*\~0 NT@0+˕dFUII8]$0 i=/߁LZ \$FB&fccRY|GSI:BkE3wUqm~:zƵk׹}xĘTfHrYMLT;-Z`O}FW8QHqL"Sj%IT.3%)ݾ,gU"e/SRc"QU!A.^˗yǘ=~qU0ddx(?,}}}q̃PTh6j5&&&frr'|j5:/^ĉgq]GA.)=[423ڀ+gSVj%?_)yx?cǎPٵkn}a|K_W^j!woNa4O>DmY6=ux/DrzVZjl.AaQ6A2Mx$bĉ/|Fbrr}g}c ǎ^Vf}}۷oW_cii(s^VP8ώT;*LɄZ1qA^V+L!^ .^SO=ZyJzF!*`<^z%8@@DXYY{W9u4aaɹ6`)p9%iuOE\R +} ˡ"%Gr9zЭ[3Oq}ky>JZFVRyZkDnˡCxh+++;w߿ERkXPZJ'Apbī YZMAVY0Nqm^|E=88Jf8ql8ݝ8ƍ!fE~YҾxuC$岇A;E]vB ,qq7o+LOO}q]׺h0Z8/q 9ԔH7665õkuK7ONTT^(sA;(m,v7M}&{{˗tx瘜;_hq]77֚$I8t>|i6s m(UEz,VtJL2Lv|P\ <DQaݻwYXX`llG}4Q:$c,'Y/!"FGGT*t:WX[cee% ILclOw]Nr&kI_H(1YrRz: (EF%cP}C6SV<3,..$ Al6iZ4[$Iܓ}L6 F!7ZVGޮoRY%0RtX^^<v{8opܼyV! #hbRe8) bPVcyIJ͙Sm,ߤnK/a2ǛӨAB{nByY]aRUnt'p$vԤW oZ_ѣ۷jV,--iΐR5&,70EfG~Xsnʩ7b[%3A5 ./TPՉlsaS=…]_ù;z9ZV.vDQv:6l6i\tp<qdciTx/W:5~ Ts\8BIѤD v҃ Y& (33DSC~eg8>N:""=)c5>򠃫c$o l)f6iSj\c hjU$LݝEP1.ݜC{EЕ,m7jvYp °' 9TUjjk()H ./<'4A+Z>,eRbz$oe?u# "ESgui/>Bmm*mxW<͂N[[#8N8 ÐV ״[h0m?¦\}rI=mjqkJj-<=͂imA!l-T{ռ^3ާl nT [UZxbr/}j8e7q*FBW-F[L?~kU=>*jl9Zc yKSk $1q$q8K n 3ou*o1tz4#ccGu4/DZ6h6G' 9ktFwG)Nfl8CVXQ%DcWJn:j-dbDDq绘iw:Dqܣ0xaeyh{#kPVRԱ V 79aa"N`dd~jjc1{HRi[I'] y7[\dy׉ЖinRqQdd鸚V*)ZA:8?؃n3$Lh9khK&@MaaqN7Ny~qGFюCswo\du͙7bzj ( bk{Nj؛p\<׵XE:a!*88Ư  )Yٍs I0{>WŸaܹKA9R)NLSx,\%C+g8S3uݠ[* %&_M7DPFJMLI5(h$%C >N Ji]1B A<7G;=|>Ґa6j|7Z|#ORթײ'MVt\zM)I+F!ҏmͱJcWh6XǞ~*D^oJE]DQ{v 8=<^nmߘcZ]n/|[#8a{n _>ř(n*} \q5FbeʂrhG铯3w] ~C9յu\gfmv|Qnm! s< qVwZ $ 1*IЀ_Ei71qL7fR&"D]i6SU}Ϧ}Pʁ$1ADS/冈r|Sm|FL[L}KثW,7 im"dUpLpbj`$o/\SR~䷤LJu=^aG!FMyrpz?8*Dh^&&Q?A]<ϵi*>`>w ZZ)ʈ.P;eQ'zEGQCVLr]>"@ҩx":o~q͟qkkVPJMkJ3Ș 1;iQJ(xΧgf=O }Z75,/& ;֛x#8Yn/SPJ錞%tEXtdate:create2020-05-17T22:00:42+00:00ڮK%tEXtdate:modify2020-05-17T22:00:42+00:00IENDB`CPU-X-5.0.3/data/icons/CPU-X_72x72.png000066400000000000000000000214551454622605200166270ustar00rootroot00000000000000PNG  IHDRHHUGgAMA a cHRMz&u0`:pQ<bKGD pHYsHHFk>"/IDATxڅyeW{sWU*  bchLMeB+-!H!R'HK"::-ujRN#L]y~;a9g钮ޫ{;ko}ǿ-;qVsBqZo{ %;_#yC5; I1IBHjcӔ+7kG |w:}l/zT"H.ZZVeKe 1tE`"]|G87ӿʞӜAx ܸ c@Ϯ?ž=,]/1=3C0||eOUygOb{kم;6.n+Co7Xj fB&( m/tR ͭi67CJ9⚲W^t ֠ǻ?yE"`a.vͻ&cm.il9Zk"h"^/EHT!LhHB(m:w\ʸG{O3?5JBJcrO xsƖxs ֨fJfKy5jQJQ.Uw;=w~ȭB:Mx IB)8ɿ'0^E1RJH9&EvGB\is8dF Ɍ*N !RO[,U'=j:=>?}7sJ! rsz>L5Fx8R'AٛNAV:M(lt2kt~E%m.Hgi6nI5(wÃ#A)=i$'%{g/DJ)m6!B"wJ)g=!O! ayx}<ϼg56VqDDxR\_a}}0)˼2ިl (M h4GT&bJjNt;m(4a<(^g'8R&F[B i= ƹ V801IK%RFcif&FXo@|K*JJ7F*{q8cViaWZlBqN~FffnLMN2kjj5:NaUjJi4 }mKiXqFRT+F*K2Cd1c e40{^:V8 iI":IRjFڵk?%>j>ߟ/t20B!4J *B8ID&<KA(lgmbmBLin.t[[tz=*'Oѣ\p>[oqe>s( Wm?!R)=s6~GiM),֘__Q7j۩ ڜzs0 Y]]h7^ٳ,--tc)&N (17?t8kUU86-"SA .QMi mS5!0Ր.TPl4[67t2?я8}4nݢ$Iuĸ'Np1~7>frByLNwC@ {KT2M+L*F0>m"l6)Y8?Vl69y$oV9IP.`tt!nUN:C/f2@4 ץB3INj&##54>ۥ@m',Sc⍔Ob!! c>IjȶUTbzz],,,033Ҁ%z2ۗ_{A|gtQ鶔>չ]l|rY _D[w㿖ӗv6Ml+)Q1W(E&j l+iyҿSffvRD$z=0D '}<:/%2~/$wAeѻRi ,שOz|G# 7gxSOSI44WJ_NKl%-6P)0?\ƍ|_eb|fe.?NpvE E@$OBy`BJ 'f36[~hx賟q7umRCUzVKyCh]2*n_{r>'gٷ/t +XOV¨,#)ydD2F$^ߢxSO#"7;7jޤSxF p[3oPҿ̙3vk35F}V'?ƍlnn8/#߰F%lK+'Nҽȶˁ+2]k`ZzSkZ,KIP9UZ`dFբ<7nP&;i4|K~]{0VG*IvW93E.ozNFP(A;.ǒDHHܰcp^zҔ+;M67[ ?ME_m:@ȵ oERnKX*RRt15R:+bLZ4Яv tVlf&s4y""$>>Ҙ`%@0f63JGneӫ[W)[GsGR[`rJ(`Ox/ ( 3IAJc8LOGap k`3IC[%33yI@T|Q^>dL uROdGشT+.Z1dmT/&Dic>|X z7|xW6s}S'}{ 6vN SM-Js"Ný4z-0W.q% K_Ƶ۫g9 Hxc4|mndjj'O˯g>"@9?t7N׍CáQJ]kgm7f{5A! ;G{s%aqIZ ~ȹ=\hqt7WE8~(8ob=:/O"(bJTB[+'@W_LAXlB3s"\vO L_!nݺ err 믿Ξ={t]{yffh4)v UE5%Q LhP5.:uCv8U׸x";Bk]HYzZY&&&'_2v V8q;ﺓC)I{!G:iLmHd[Bn:XȗYn(L…=zfG?Q:Q}^G\μ\.Oo~Ǐg*ʼ,,;g0E P qP; zӒ‘T;+.3宗Bvڼ˜?裏}jJ0 }zNV<>ٳgQJY[[ڵkk~I n1GIyQB ;֘νHTqy݊9`$ʼ?y_;Fgeff!S.ezz9i4A`$'?FRDeyygKDZSz*V*{p V'Mr"U`); s!i;*W^ BCj*J^l3I㘱1yzlll2?9t viҖT$Y0,mc$?e ?o9c-D&J9szŌJL^l6Y]YK;z<öȾvR %巬z-RVh I8QJ1 t2Vݻwsf3+;°HB0daa0 ٳgqLbkk7nvm3FgTwZ#J(A J _(/4R "߾uٳg$~rIJIETURlmmQ*NvVI2NUj=T헨,)~>bƍZgv J܆"׬ att_i;9 ˗/g`@&"z~(V;0<hplTK ёe #M۴v(НB1M.ziټ}t(y&fR\?8j)eRo lnn­[XZ^fO a?2Q%nSk7qt֦VVjB]`{Vxae_1D7AE*4fL^|3|+_T*CQ*5-SX[[ciiEZMvw 싎 9ȯjf?{N BUSiHsT8%ϳ>OfIϯTHK=p!0G4jy&'OdzzZţ(t:Z-X[[nJyQ4ICB-ľ/)tUXVJ[LKjfɢ(aSb(&I&I<}^Pfn*Ν^ vbkk`*RgZ*٩-)AT{W)ÕtIg\שFUC$X_]!KHǁu 䁬jfB~#|{qյuz^V)?"0$ C^ѣGY[[g@:dG2foQO__Ҕ+rIYN019 )yץ"L8!DmJn j-|ߣTKfL#MF!Q"⯰ӔRaW4MR:+4֡A 9Y(uRVeY*@g 4HdJ΍1c<_2>1x_33Nbۂކܭ*߹p# :Wn(ҳ|um:8QktLL4%^#$o.SZ~1F J^&\XD~y0 '#<3E{T6+%H"m 6V=^1wbÛafz 'R-94CZH $"g/KiHHsh8(o+ 1O\dsn[;Kmxq55ˉALY3I6]mJ͉O.j^UM>HcZFZ\ *DTh&C+5r>(-Nt^^j蟨nKfEW&cJ%91K42Ek׻YmpGF)0 ͬ#N9•KҪ,ԹzJL\JA@x4JՔ{҉m*8d2?Vɜsnd JWh zDi9M$ kCئ!CJmFAkBOwz~hbqyϓV#ĉ$vI 0 kl4;{y/DQ}?JnyA{ W8uM~C$JG1[Jy“xO`="-Idi80 #63fj"!-?HjuJt&KQ)ΤԪUB?VUX%4IrA?$DY?4 wF:1K/0݆N( c~+˿@ ;0OD*Kxkٷ4{*:JQv8#;zn#*MSV* ?s(=j/$9qzvF]i:U# yi_l=L1$z֥$|d ):|A'\G6+lLB09of*2mu Op;8֍7C1cTFOqm:B@c!6:nr;HҊYOyzG䰇dPAۋf8i5$&˔G8~8KR*%{Oݷ%tEXtdate:create2020-05-17T22:00:42+00:00ڮK%tEXtdate:modify2020-05-17T22:00:42+00:00IENDB`CPU-X-5.0.3/data/icons/CPU-X_96x96.png000066400000000000000000000334601454622605200166420ustar00rootroot00000000000000PNG  IHDR``w8gAMA a cHRMz&u0`:pQ<bKGD pHYsHHFk>62IDATxڝi%u;~=w1M 2AIMZL(('++YY?dWh_dr(+E8Y Ѝnwj8'ԩSu/8OR;V}x?G~ oQ8J*Ak4ٟ7 9=?{黝O go(ybwEI!h]E GPkNGD~m׼ }Nj4ڝ. ͫ=TFA%hR`07:g"8/ĿcO8F`vøk藾!}(_Z(JI+:] W>67ݟ Vxࣟ C)@*Bi I',-wa*bB(hY/]ڍvit[P.|Vta[ οOu勪,Fhtv}ZYP_Gc8#tٗp2 wE5i9R/>y> ^YJB;U}4i]u=ŭhnPm$lAI|o n?zdJ%H)S\D)G3W/WiWPϹ~7z{t{=VQ7RR7yӳym<(Hk "#HEVcxGF(H@"0&I(P41& C);fZ|9| .5B, IP*!cJaDh!>)~w=3jkFAGCDIX\\|0d:ESnB#]UdшVW%'Z036EHP:ZB$IHBA SVUN?J36S~^L_>*I#%R8(D#B[H,#p33_i.J$QJ҅ITy D%ʱƑa:Wr3TR\T|5F>|B Y9;@| 9b9#R8p{AB-lZx_f4s1{=Ξ=o+W١3NQJ>fnp8}>G]l# 1'#wZ{R(UD% ͖OqllnXfȢZ-ItPD ;'<ѮPOSwh-,pM^x^}U.]]!L&V ?[o[(U3 # 7ZX74U$LBMk#P%c RIN0k HkUr#\$[ѮvhDǜ;w^{K.qMz]gIx"/ Guܖ*d@+e*X9`1&,RWj1Nb <{]|h[}אZq?/]A#klΒ0c+KaUBٮRt]unr1JO>$NVlR(鲊gɠ|KlSd@ dMLKU|;_k,:a-<4^(SAx \XEMyf+ad(d2{#} oV!^ZZ{sLS^>*_{gA'I%Vp i8W )J7N93SۈIzQ IWo!~<|}[^޻t9ii׊{L8Z\.g-[0Y)E^Ghœ$Gb_++<Ӽk>t<|8.Kn!ٌ5c96[ԀY(5Ϣ̉ @%.~OW׎*kkgߦ\sТn!EX?m^TY:{a3\IMeE}IZʕ+.јzooEF׿u^׾u&Z4!tʼ5Vfa ' .mMQXfN}A2ܡw#~O$`0 u;5飓(PS.3Gf R.9.%Stv:o׮]KZ#"Z LÐ_~ k3 Lڳm^sP36ࢳVcm,'i\Q(TYIh2Aoؒ Gs 2*q#Q вX sn?&>_P=ccc"C/q[_ Čn&H,KaR0#"s;QP1'#,7`|/To2a=EW uBVca٨#dc NZ.@g=g!hY fb&~XV@35ϘgePG x<7bj_gaDtj$mJ.fwPa'iOX^^66>T/`ڬdIэp se f{(d3Rе4pDהX7`+-D],qt\H&goHWb7,Jp$hln6h8;M.ΩS~:;;;<y7֟f© 8~̔0S?/kLQ0,w}W M;m˓7 1rfrRfDnzrkld8,AE'\n>s2}&U7X(A:HoיN?v%?kl54A}>[[*N⥗^̙3r-!H˗7яS!BJ٬ÈZ(00[^q'= ׮B2Ir0c}ĜO6:;;;uN `muxY_Xhطo+++4M_%~i.\@E%Nv+s /sB^b?[atdž/[xjfrzn=r#"6b-{ߧ=INx׹t;;;<#?~z*FF۵|~A'Nlvݸ^h(dRVovA [1'S/[ BC+ҁm>w\z=ΜyMFY__7)xaaUٿ?+++Z-*6A9r/}Kj5|O Q`0`oo-}y67̉ nk g#J| 吖9L9 "ĜI[;X,EKً ;IC>/'l\6wO=SxGR^ +++,---|4 &!n=66Ҩh:@1)i%ڿr:Ev~7}v;M\TL2("*O[ךzsαb}}\}߷ܟjjjh4,+ӵ&c2˴Z-˞|믿ٳra ;wKƵZ,EwTS[Ak"3g~:{{{|3JBRZ AX~FO0 >oxDkUS~kMXynF/6 )-L4#qk7A2U[vq"Ν=ǻ^dkkGj5x3L}<+4$It:lSOYZ8z=^/([^,l=c.5%JL% L糲d@8+2>=9LgϽiί|+8q)]y'?3EI0Lx9uZuf= fYͰjp$EDP;I8&JR7nܰNӴZB( BX< CN8h4Vq1*J)k)u;'*$)ݢ5BiWvmE Ep5 #aEDSkڍ tڄ#yeEܼI!9~xa ,LnT4NY\\}677Y^^ԕE= ÈmTG*AmzR:3C|B8Ӆ"`& 5"sL9{[X t1t@ݝ]1 ,,,j:6(=BemȞY\\իxh4""0s =w !T*5cf;eWȬs (҄3I E2M cbE|Pf /Z,( ƶ+ 8IvO?Y6uWN& oZ#,gmuR3usW%hBafê0W*vX%a!Q ш8I۪!Zk( ?˾S\)7.Nt(qH0eP8ɛ.S22kT: OV#_,C:eg W$7ܸ#-0NT*˦Zy3=8fkk5?NDQh4b<l6Sl) / _P3ņ}W!EvВ̢vB*~َ^yLH5C6x4 ]ޔkزjFW].-0 Ncq3>r=j"[M̙٘+h^偈3RIgE.V. @)P9W)FyQlW͡|,NBzR;I埽jMhJV (-F:N9} 4^՝tc]ʭ'nUW Ip_STi:GEjajcKJiN|ҞgBWaLJP0^2q > wы#Gc=V(de ,;l>AW~]D1w}S%)vےXޡN-v}ѶEKʘCO#͵_2 T\` -;1CH+E]^c%g-d-C;4:Vs0&kilk4-:)+4e5}`rzx*oW+\0BԕJB4 [xLeww]6^G#tE [+ @6Ii(UV2͒vWO&BaGxbȑP@HTn,-^Z rveJU5%/Ň[/2N׾d2iZ6 H;]0|^rHc<KlLݷQ?o$A>6 VnP(]j2A'Ō[ QLe ڐ~t$ads=*nK۵Uo_zQ6( б#1 ]X,iSPIʎPڌׅy( ߁--Z;3Gte EЃkU"XdY2K1_x7s-=z+Wh4j@ ; c23rv?+W&+Gb!9AL]-^_,NsW/ cf|L tN߅5t?¶CJ9LKpF4HlLo=17nܰ< W2'2 z^ӣbkaZ%:2ָ6)uT$)R5ԪU?y 2j6f,Hܖ>!d%ҨJBг-s!Ȋ&XcZZ6Src,4㘫W/~5gUR&&sI(imXنE;T\l.%Lm2/df9OL+QB ROsnkgGJFա8mE[mw0BNq.^HHjrlM.G?jNh76lh`*SN gV=GYG`&ԐrXrϐ]L)&S}<=* FԺ$,Ǩ\E ZZmʧor瞣VZ"npE[glTAT N<(0$to}WQ'uDH["*L9QL"&JCF3Y8َi! FtPj$qk=Y2Brz5M}oݽ¹kK\ҿz8g2j9tŀkܶfv͖Sx(u|.pgC f p3<)R0w øP's )fFp J̈́6aD6V"1c @,+PiBPYlr}GiAǝ-KڭT*sծyp $SA؇{-~2V>L3Y5蓨:u4 IʔvZhL'h=3aSwJrn}7&QnObG<ҍgVFY6D-ArHOW4 񈚞l6QXɄvR#ZjG9AxÎ*޾~V I Y7Lt ScA J{EKz/ Ŵz̤] Tb.)=;R>P>]{oPi{>ԩ@|c}N˜M x uuj,/R"=i2~(aA4L{v.+A]ei0!O_7^>G+ DDAS6NLj!Zx ]Dsjr Dt%5[RhXR洆vѨ1q:sl)ebh#di?.d,ཝzi?gzԚ5*i;TR!Ty7z%+gB'ulBz4Z-*me#=A5oLe$N%wa&Gm;O}%:j_'Ț@VZ`'xωncuer !D\A"Մ,CSĂpÞxc?o+ -ӎeRR^R >/ٲbgM*O8)̵3Q_A SϓXl~GNCCNAiOҌV5&"Kws)hT6RDqwmt!gy9e8e9Di~v# 4P{l ^71p2++iϱYFN^KVM`NðD:+S3h4p4"ra"gLxèF$է8:%6$9x䜞Ga5T5"~v>V z7 0ul,PTOpb+dN J3T6_1NGE5L/q"KKiwբ^Q|Z:Ccy*a8'Si6[a^LȚBJm:Ab2@ `80N9*fcDO@6y<-VHOPQ1(͊ɼQCl638A|JK)O{E{&1IX5_bMڞ* l e&٨qo|@t:]abm˼s=eۦ/fK9uǝ(^@c2q稓UpLe3STR{son$2wBZRRP,j }n(&*,-UQ8M fTp6W3 k)E4q&?~eڝml (N?4GAr`%1xժ^eݕ,3NZnO$8f4PըjxNb^~U.]kid2&d2j6h(GoIv/O~>t("F$i3#^(ҷXR=psfjbӥ2j =S ٬/j,64M[LkM^}&_?qm 0J饬/.N(or4HOЀJ/iT~+V|T>wT0y& T=O>o@ Qai?>^P+J/ H;fRxsx-ٛG>8?Al=357uqP0ӷ]~pd[CE&T/PK ; *P(h5ւxH;-;/Y*HRJ~G67wy˜y8m̓(e~8$:F3ByUIKƼ{ <^ $8X ,K7E +i&:IL"*tzΨS'$ Fhs`t0e> Ͻ?IWA.3)5&vǔ1:6 0ITjӮHf !qę+GD*H Jcu aY`!u@6h/~k)$aZEHt8f2DA 8{R,}R9^f06p611!)NEΊ:=--^xRϝ J!H7ZABW,;l ۽INn` <1A@}Nô30S#8l|ig[vm~azUP9-^P-&IevieFE+֏Ͻ$Q؆#LsvFJX^?/7( Vd;3s8+]V< {:Z:l8)d13p<>'ha8e: YXX`4H+^qw?;|+?Y]?sCKv qtiwxϸA0>dT'q404={x>ܙ&Js,Q@~q`~8_(bN+u0DV4j LJsG4W!szk?%VeGj¯ $X>X)T l H.m0RVߎDsf ck;7}L=QhŚET^V" *UAhF!Z !$ɘF֚[{J^|^| !udͳ- [%tEXtdate:create2020-05-17T22:00:42+00:00ڮK%tEXtdate:modify2020-05-17T22:00:42+00:00IENDB`CPU-X-5.0.3/data/icons/CPU-X_original.png000066400000000000000000023621271454622605200176500ustar00rootroot00000000000000PNG  IHDR""Mw^gAMA a cHRMz&u0`:pQ<bKGDIDATx{m[z1\k}=޾}[V[% lyq%;U)r*UT媤L%qCdcB juݷ㜳k9o|cι{nGպ|9 ɍEmS} 3_ngݼmmxsϑ~6Gq证KnV3wMˉd/YNbkFwwꦼ #ZTߩz{{›\-.1nG:9-!K//fz,^%ZF݊RcgrO;Ir9M} OS̯~7ZV󄻬;V=Kq SN/  c% P C'{8LsE0g#B쮱^g?45@oimC8ڵzn=qvmzzo* >[sё7;?3_^KBwooqfqNJu~>y{,8A?G$촨Ldtǵ^=ϿV fYTDwV'K}Mvm|sjPĿTgSKD@%9$YbUuP9ܴ69ߏ\N\'1}jd*E}sk38>AЭ{'I,oy}=#~!7tḾvugi:`kxI?={EƐٸ>ff}iGcZ@D/`e5(XzÒn5ot>tcyϳ7W7#ik8`Nc>|;ǥuAW.q+HK'O-9hg~t\v!6z}vza-?_@-oOtw>0I0avma!Ix }9 fVyXUhs}l/ߺ~;C6syn>ݜ\G_{&d^E ߍĤιó9=q_>؄{OTt\y=W7DžeOٛ6~<γkJ۞;qo~ r͝ p^N=OxwaZo}KM]mXo%%%KBy tl EQ.:Y.9Γř]9NkI;23COj&\ Szv;"%.Bb&f cyYnArCS#kٽ>g?$Pٺó9e'%mď_Epp*)X' CN>Z.0<ak5G6_=.^O<_/:&ؤj=t'X{ǜOwA Z07lBy oD {p:=J9\oаG8{xqlq*Y~"(5,(-͚sL:gs_9?4uEyXkiѾ[cDDk;q{vzߞ=U]US|TmU_$X]|*TU"59,d%7Lqs &9om'Z >.|?NEsy}!jqx[w=jv2Xwó9!vk{0ȌE" i]gy=sJ4ЪAqK2,>z8<+ xDiG3?չtE3"0juVA{ "G9?u ?7y[V"+2'Wπ뵺DC!,EQ@z4q?p<򃯀3\o[P!߼ṗ{G_77o`/qlw\9ŵBe )N 5Ϥ\O'Éw9HVR ȷߘ_s@Hgĥ!o?ן+;W Y>ピTvw2 &}Q֐Xzd[睼:]!! hw-Ypoׂ[k2I.w%'[0B{XR%HDk(M!#=>ӓy1ZXgGc?|^.K~˿pv 0#.oߍⷼTp=<ΟYa xHEʮ!s 8ɘN8At#(J+Xv?EWنfժQƵWW1BB0˝nxAdmw['|<JK˹UcK)m{OEik<<эjzSMq7>N&k O+*mD [{^=Fp]=da6$-yR ⓼7Ը>c< 5+ kAYa6E}_uR}UM?$'\s 4UǗ>??#/ᕫDC/ ??1}S1<|Ϗx3\o[k >xEu YPqxBfwasob<(b/UJK9a='LD:%eg+h)ƻ”&i'|âbG"8aԮDkQlcUh˩ «jM-:*9yiԸ \` `@F@#XU\Kl::aqGI zLooi_T%_q*6oURX\ۣ9n`Xu)z^u+y΀[zx"ysޫF"Ït>o8&@ Ch]~G!x69]3w/ۍQ׃X8o}he{X8G0Fm ޹"KVF@n.u{\w ʗEza.GG~y|n aΌ1xo)ᓌ0~/mW2vf}]O}p9ׅNΎL˦w{͑$RW8) FMG4Q t$q@A"$R%a'Dcġ ްfk [/Aq.BR5dI3 銀te+erа$×P6o*nk\n DN/љlI͇tn(9)oxϲH-~!j z^vB9F (.U8gм9]XҳJVWL1hc,ǪE68g|07n3H7O9tpvگ&½ۂ8N\/ܛ/$?Z`ۆ4m.@yxBK{uG+h؃∳o>|o={FO=gQ3:_`; ܰONc $ysnIFײ(UXttT<õIM]*E,/*FShMYijca@bh6'ct]Gx qmwdr]tur?x"gP*E *? Tǜp7Юwjt]dSAaâkDyqَݞߗZH*.J+v2Il`|G9^ \&';N mT>uK A@|㝸nOe:y;燤$zdg<"/6h>OMLA\Q#P&\x%~5kw5O.9@#麢~-Zԣ8nf_M.^(oMxy|-.!`?s%ѠY ϥ&H^.^.8 \e|p{=:^?|;Ԭ3y<5kgq GJڞk قe38M )'|ܾA]7{{\θ4WRZb~\%tkQ+2OԊYmEYsB';tAɸKZe fz]uNLIunaw`-SR0LNaL+\PJU:CبP'~&@l¨yirꥶB͐+jh=3mIó9@eVE[%:gp[װ̱uj l4N/Μz^Ωvb+yj}8#߼a"&}ӠrBZCOi{4kVH^kpWbԀي5$ߧE0s OZ(hxGV-xEg_P=/E-bYWq~H$n]f54ǏIaI5. QH8̌Tsf{("ˌcŎ0e. vJmϖ{0Ux+s(+d}w{~ \v }qduDVr) XKmKa Lڵˌщ7+\ưrPrP%M*񛛴UnMmR4oWVI{i in69o6wa^c/`3~)E+yynm uD KԠ}9 %}7\:v;kmS:91NmX;/pkwj؟pԍ hUwy å E,8Syrf+̭n̾] "#2ݺJ} JD@ɏGg;sGzI^y%PE㼂F{EƠq Zp*ZUJ#3YB=oJkԫI#d-ɜdL=l$Fsp nA(ʼU};p31wq33I8;_z֎OJisB@"ݎ/x?)Py."?p">z tDLSVMM FI$ۀ(`ZR1!TˢC 8V1詒~%irPPX ,.ڳͭ^yEӂ XZRp8 1U Yra6'sPѵ܌6#, @ ZTIZu抃Ԥ+w6A3uº"?$஽ܠPkASj R'NJ.w!*;5tRQ\#R-|w2e#|EwhhXSyy|^y? g9QC,q:D?q= pίɸ@MOG0;CxzsdtX u 98I/;"Ư_Z dF>j\y!ltXx.j(_$(+D ڱ!m' Gi2c U@?P#OO79-+\ǟ¯=B O5L_K}~} #>€/Ko'qOhH'|s1F9?kҽB  Sf܉|AB^e߲嵆w|j$'`$gӼ} .(T3 1@e%!Ԯ Պs_aqM}3CrŹoB5U7̲xxJW &m {\`% AV z)TE+;wvq`9V[KdjoWIKq|w5[ oa=#m,T[2~>Nv"H9w dޔ.KUON>/չ0|*s NԊ[ w^ڸԠN炟>`]Un& N[7 8yB!tm>n4n~-?6[U7Nq労W?"t\KBUoxUiG}K^Ȗ>Ź_y)6w{㛗,~]N+.;lm#苦V,'9`q&dV"e5nxu\H;.as Ɨ>|g0KWG8D9^c~c|χ%3?OpA_"_,\-h8i:9R s>DžY"#럿B~%EZC=%tJTj6ܪ Uh-}#)[wX[C:/A#?j:.Xg3RrKg畽*hFu Q̔dmKa/eѩײpK48Ře.sE֛)s [: y9Lov0ZѦ0χ8NUz5)˸JBNMiG +^ӜD-zaWŢP V l,f/㗼"8'<T-_.dH-KR)DujdSc{h}u#ClOkqbĶ%~)*3:PܯQ̸: >ƌ?/W>|އV'|n2_)~!߼t(Ӎ֢[:܋wi0̮m9RrΠxn0^EOgWthpwVqOŠ˒84O tWfF;Fm=UеGЍ.n#jUA&Xfq>}n]]u_HUJQIe6> v KdF>}+sV4'?LmA.NDn$ltp݀wu;Xѣ׳6~vN7N.a75juq1~q iBZ$;_?Vgǟ}D7;7}DwVɋ/np)f`Q#vI$9}lB *`\د\B%x>1-kG .50ϒ`A~Hp\~w=?3zqϟo7c~Wb?ůQ߆ҝo2sF|;/3ȷ=J'BD9^ Oe>OQMB{q73GJwcP[f,~A|߂!~cD%S۲ٔ(5gZQ:rSkUP۰l\t RiAUښ't~5zb j֔51}p=SAcųU` ,\%k_Êgc8vtmCϳV PkA;ZUgI5H'48I +l+< *ΧNv{8].lpV VVP_#<3s@7D $* o'{0%˱It],a4BRZUu=YSreBS|^Qm~ՎEk]\fpTFWz8Y<#54'5hiVàNǸv ~O>>_9.ߏNfxQ<^WzJ5ڇ bi| CUds0IiwzTGڵw"JKұ5%!5?-YDƽH念Ή*Sdr8M;]{?;+ ?/ȇ{q? #~_ag#aJ~~(TyN|| Yq#:LW_@H^1(+e+-޻-JN?6tÛZJ8D.@Aï[FsƭY1("{ܙǑޅ"Y~\R_E&#K#8:ƈllIX#qY` *i%?3^jE8Dw}ٿԟQtN52XUMfh"h.-dbrܴkwj鮳Հˢe.pȪ+)Œ:ؕwLl\%*QaUMaOs4.2sϺ ~,4pf,PFXbfj q% Ԟ8&/; _-u񼞹v-.֝xwz\9i.M˷>K;45.c~& ?1g+Hj+8bhnQj\an=hqr7+~Ξsrͥ#K퐬WI KM=)GMPkѲ~ت,vw/݉3㾚pqu, #~}wWo^gxHB(O6>xR 72ĺXF6Κl<(X5>4{t@z HDf^N&J,Ќ_:J( 8ͦ%#_Rҽ/HVFP,(:B*ʦhb*[Zŵ+bˌ.kW,D}[b\c-D!SNuQnDZx\ %ځj`1w*%j?w8+*hi 4 JV+Bz^CY/F$꯷c/wc'ZZzE`Gc#Yj0~/'jc$"П޲U߀}XȇeC` [Y:rA3tC2ӸsKX.vϋ:0*}*}8 Nً{o>v8krZVr[E#%tzMClCkj*kW xsLFMU Jm4:wVszT2~.㙔SqB5e]*#3B5v Uikܷ& aoF$:/loLnqq@ @x"F%kG8=`|#sf @L{ c$|{r"7Be0|}#@C3>kt(z~Ooy .nx&"\ ղ"ZQ$rxxC/|wn Wqɿ ߼nt0QlYl^c$ۦh0"0JNJ\x6BaJ ժJ}dFB8U.5琦FתnVFÑkꝘ&"^{nUQv.1 ^;9cB՞,IIFŒJpP(5Xnh}ʍ|.2lvCNꮎ>ZT!`l]AB 8p5hQႥ(ɰGx3 ܨfH7n3.A s9hI j %~Y'FTZԻ ׯIqp< %G~o߿Ƿy%ne g- IEEa7)qvmU]O3N/uQq/kyQ D+YݪE= 7w , Q~ pSyӡ^ڽծb: 95;=c6K $k`UL]kwʢ笜:.Q^%(+ϚmUkKRxp_6F艿~ Zm@l*5h1 $y O請pPʅdrYRE3D`Eee:( =rv;2΁!?WS] 9]Oxq@.cа>-l5f\!1)po;K /1'x^]ⵄ iSY_ Ժ.]{n^ I/䦫j5'K2_KE.V J) aan֣׳5~z7Įì>Yk]4iϣ De>Pj4| mrp&h}ׅĥNۨp*0Q0ⱂ< .b,h\;5uW_/닚8 7fl@ cQ5 v4wkhH1W4dD;>N2yl5UYka%_H;of˗#>// ̯?o;01Jd?>?o& VP8 0*B-d[۸Ohp6BhGޤfLX-"eIM9C!oRKWQCPL{@qŷ0_v*8&!(} wnиo+dsx{+WH&Ay%Fyܴs9F݂܆R>`43"=zV##'\Ae'WU,Y^՜u,3l* <[Bo4-q5,e^p@S!_ OxxI`_Jv$>nAS]Iӂd m-U~|qA,p#9Y==N٪f ]eޛĥ'/eG;@[r=gj*Oce0=?  W.`[ÏÝt~=+qgڽo>onGKd{ ?{QEPݻC} |B>p#^è/0`u*Z:+vxv^a$rSh ]T&MO ,;bO(rMMD\9~g_}=T0gϋ#~心K?xeD*},'/%>n2{"g`%ah|DՔI{iߍk9wBB;@yg;"' Z]k5)kq_?7Y'K?J绀 pʌ7n2>҈~/s~zl_9BC<'k\7*qvO( {2p]+:xKIm2w {><- #)k9\;JD8ǚt^<^ N.E[7J\~%lƦi;inaթfhT\^8_'u0䴘|^**U䤓>ys ݯ.9:ek?6(]ب٭d*Sz~\Ĵ#/Zi9z̍_ r U O(eQ"EgBd~}D~6R_k[}NDR&{_;?}8qhO~:D0BŶ=)z[Ѣۜ%A ܨ `\UU`bĹp9؄6A`Z $ M'uCꜨ4^%|}LKfp q#~~?^?>#~#~\d~_8~៊x!BP3R\UuJi{Y{NqȃW>a3$Ԁ[LzڵGg,Y޼~7G8o?CʂNR."p/?x)ڳ&NG ۝q}JIb|w΀v`G 껺rK =S%5TNҮҌ$צ SVƝx-׳6~>ٯ|:^Udz\D9AwuQّ놯fTBݸ*b>v͍ay(Lpxȯ).-Ӯqi6 J "O[Zz:5+{H%1Yw$P;1[w8 D{`+h|4P2'HKCCn'=.hQ :;d*<W@DYa*u:EV_*Cqe>vE@Hw+W_9< _ϴ~Q48~_ /~lWbI V˃a7XSCx*g]{ފϷԛ@MBP!4ފLxȇJVłYvW~#cG @:|ο_'%G~HbԵk@=7e+'CyU (Mwٞ'ʂcTku3ʙ-CI1q!J-^]~npHZJ^}[S4ɣ6~7bz0MWJ"^9m2X 5*X$!Wб흒ӥ 3RpjU@Z]F  `r 1vVk&)ԫuVzXxP6VX"i%!qXt1Uν|^?VoQn qxeE`*xy359bEjr ,FT;mܯ-U7F}K*qWހ%:;XH[ϩ, vm) b}suGa?3EۏTyI=3Й+uuvs/m\:%dU:ثS6 #³%c졖9 +u-#8]\Ư5V2:W댌n޶hAP|o[]Q*U%Uh gW_uI%YRy<7Oש-F{;7-UN&sd~' `Uh rDGpѲ0c}nUm>DB?@, {FڦUW'gbƂm@I!\=Z֭ P ,0~5/#'p\#qWy51 =q-p9Y|<' q1 n 7ֵ ;_bd`_ NK&.Lq׸ATYKuӯ`&ݐRD2JHXqLN tDG?gn;c`ǫKdV$n{\+ /ִk^ܸR3wr@ωs9!;[?ݺ|?~/9c츱ztt%2THKeUe΁ɇiFaq٠ ME{pfKjX?`/:CM^U$^"͈7uՠvw:wsx`zsL!jNem\ [p:t CgF2w<ڿ}3,uCFа"Ly߬XQv d&)= 4B*Z"Tտv>" @J^PƝ}@ʌ\z@qDgIR>{|QF1^l,@v",e=F5:nm!Ҷ؜yQV$YՀ:4LJJ 2$w GEǰ(gd1{#wݱ+,6n\[J/HڇAZrBƱ-X@U=E/" a@ߌ5Lƽlx,9t;g Hj^ hhsc<|ղ@k闍1 ;IYwoPLI^IVS >;u!!Zދ'W jV=JݘteM>;HSn杮VOUK#ׅ3+\~FRGQiD:yqu] Nccp{q{e,Xeh4[\Wy}6^tu¨GB]6CJXzME1EPX5. _ v 6)&ŭ!^cA1 4]Q;?qhYϟA4P@1k^a83ƪ(IqpM.aj|Lއ\QK,Ck'kKq+ӭ< ]F=쵫2ogUTs_|ˊc.`n'qgGMQmX|uMȩC'\oB˗Qǫl2#/GMP-q3q]Ɠ5\__}4o^)e# :VmqIJFy'WF鉃p]oua˾կfC·ۀ !~$ m*]Ǫsdzɰk K9UXV+gRpPb / ㏐ a{ ms-b|(G`]qbottñU_V$ϮoCy 4/hoh]xn_1]uqu@ N=y=Kwj>hr ܦLyFm+$~\-Z &2& BcUs_ri!5IUg]g"n PV}a]W}e(kx}]9 4E4 8Q®p5ȸ* 8VU7̷r jeZs3pB5xwV qԂo}'r $wsNRo 'ϵֆ6<#.Qy8ŪGa\LFo* ,QlJcPK?<¸tn3+RswoXSչɉHr{i-xޕI ZswCGv'p.b*uet@gȰ ȱK|'[$p[WɏWC&RB'hw1s m F6RHEk:6f[T%ܯu(}Ewnv9N` ʈɺUWZbK a..AR+G*5b%v)PpOh-`2a]Ly[v9P?FIA;b=SE .`_^X BN867&!N u#mN oTKS[9.`Z]&v$[`Lhx[vf"7!4bn +F €ǨE ~A}J6=J'?' GRPYeI.=G|^qL*@" ]RS}ݛK'eiIf>T}5܉;*aX(<Βvt01yݩs& g(otc~ %$׮l($7t+(;ykcn||ϝGO.![ YώHҰQ@9^2&S2ثc%K₅L/0 Xa~ScSQGmM#QЍ>o?+1-MKi􅹡,kV4sW$̌3Fsxu~ — ra'Bp$ou @N}m1AUq%;a},,/JIL'Kn2 YPkY{uN]$4'#Wgy4Jܒ ͥTzn@I+xX-.Ih-׺( puQvn^uld]ƮM]4O~. ^{2"9/|w/0C@py9#2!8)'0RJ9gL"B%e0a8ap~~a#q{ܔ#aD` !uR ,C oÀa@eBgcQt͘rBjt!ؿEL׷PxC @cw88"qxÜƳ=[)`#grݙ3dJp QSJ,9PJA")#q.x, 0 " TZQFeN .S5" 4 fԚI(ϧn҉>D|b!cYuRF;J%kZ:YI~gBC6BC:_볯cTCD.q! QogdbctrM +D"@ 1gaIc Q3@<@g18*Ռ q "qe #(n,RJ1c< 5s&v#”ePnK(Cİ;w67P`D {<Ϙ H |@W8ߟ:ԡ|Ti8Z|+p$ԪzU-pnj:ePz)_SW8w|L)Z\ t.}"F7-1: `tqV2 @)&9/A/9![j}5 HXϤ3۬~0Q*8f\5fo.]^"sQBnZL#VFhWҚt3hHo|?]~÷ɦGu}C፴wlΌo >ˆ/1O髿x^Auh#4-IRkynFdU^Z|[[{fy3f^pURVmMoXЈ]+I1ɜ,$'UI%c9 ǞHP]f Q94a3tLd8ȧ)Q3h\t ۡie1:0Z=qablƯ)M4˒W.Xl~V\RO5\v}JU3IcG渉 TL3Lso&]t;o;)բu5HY|c_]B5y'RB9oJqL=j<|ܺ"rkCCtBޭP 🧖)(WD&ӄx_E˸Y= 2&eq.WpF8{^<7C%_,'r0. d4Y*uW4{K6:%TIs:(W)[%$JcT$/Ȋ-i&5j7 z;e y^Ff.Wb%3L!z>NAŸ_fk,!oFmTqGxQM`)a}gu ۤr[M9<@_:wY%|:\l  >so$ൟOPWoK~n-B kЋe[;ؐ=^)C+t(yTs"0[k_W̰*O]CѶX)B,RʼndU("ׅY&ZTy9hWY"Ss=6.:8|ƒa3n󙰝0Esb1 A!*$ZU(B'>ڲVIZjkL$ " H*!U?S" #R@ԼB-(4xN$xi+5b aF)B˕AQE?"4'!d1X,8bU|JMzeQjnOhˠU|.8DVSI()& I_Q1) tf -# k(RqhDŽ0lMTz\v%J;eԮ ,&qw;@%V+쌸-3TeQ\+R$nJMI="Ǫ&c&ץ㴈J,_Pg`^8rFAAbĎ`d5f=Ou͑"蘄@H{!iNa5PV'NP dx !\}N+2*1k 'Q qgHu1兘k|w YngwsW~ ÿ˗9G u ??7q/~ v(8p6iԲj=$j($gZQ`ixCĕ?D=PBRחh-XI4^+yr5ˤ`Гwj ]A iU Uh-~Fu;O[uV~d=*x^R^tu#0=iv$A[ B  %IJ_C^z]#Kuٙ5 >htaHFYgu]z(ܱ%6OdE쐢$dTMהPz89u3s-!B ?Px ,6F=%+e!mܞm*Cѹ 3| y5x>[z#*8bKe@xy Ĵ)rLXl/T3SΒ;2R~ɺxu$L7&f 1M_5ìδ G,Y /xQ vl^GY]'n}dpxgcuoP.>vמHml1iRWC/%R뵶$b;A#[%N%#l-BQ5(g#yi|~%\~׿|;cb|Wi~o!=xa)Xa|SQ=7`sĽҰhsμ[}]k\@䩻YMkI>y˜йA/*IM"YLTܔd_! M<5F Ou(ZfDZ,տu@mJlsxulZXBT -[ʀ#+a, J.YxShP΢6hb8D`Y*Pt Ì4c6H%a3ԠH6[WZ4 D׊<Ln 5'q;H!߁hvUa ec] $+9IhHҵUq/$J)ٵD$r4+4 ӈ ~t頓pp\]5(dؼ,]GiE%KK DUݡ7kTMf)Tq(`dзQ'f1yҰJ›PS+faپkśZmEE0Nr=wqG.kqn2i.@ޗ}Ž|*t pH^Z(..(q3yjEΛY ]B' r8iUkSh]E3[i9%p%+MPdLnb.Zs-P_6h#\j\Tka VqԨhKKmu~{ҢKG=2:x4ms-8"?k]70·8#;A m& #cP[R[PU%6̕ЂjEWK"2 #*W81I:Hw̢WtF vgyKA:InϽY ~y擘"FU⽹l'P*’# Ny,Thlɳtq*SUUIx4wGfwxǣ36L2qyoMm Ƿ8UebB>SiiIKh@ypD> NU=u)R@(WTFSu*^|:h\/8W&T{2OA1uݪu _-x7\^ j4tfm?j=j {h}z}=˜ACFH^k(BCK:< kŰosbyO9tLDBKV8&(ȸ="r= 9@1CAg2@t33J.F%_3x 2B 4Q$3-Є sJ@`!#KPj{ޕf Q ؁0R՗ u@ĔU]+UբLT9=ჄPFJ@2&I9z>+1P`.h@R;*[PXN@=Fm~YW2$";#ZsujwYL1DrcDs@&f:b#,XgCjI2d͠k?w'h&Y18#JXp «h k-Dr ]%Y9aW"Tbh`;$rۡ`PTMsaXz2#XdM:gYHYV#"a@H$2^d A=wSWO#l_w?¬5I],\hDsRD'+' ONw$ T&FjO7*W,EE;4cU:mz jcVh$f@NvFڍ3QC,MR*`ԓ|e|Xu8EEC5J}Q4wr|pp5(-2{̷Mr"LRuU/};ϓZq蓠Ψzcy3@(a!5gOok|B-wɇ%L ÿ\fvU' (^u++tx/ -VA$*&]oeQyU&pS[U`d  cmrN]'Zvw8`H(ҎHȠm.4k{dB < T4b9Lq\՞Y*LEQbdU)u 5Iդr)k <&EK`GC+bhHȌ=U{-iF$|ƃ 9c ѼDB/|eR5QTrΈQR BʗQOi>B|=?ĉ)[*IRJ(gS# գ~р Y&,tœUNUg1FCIdKqYafܖ!DSy +Atdn.& k`A%APTlG(;À9)߅9"P/̌bV3QmbΦUJg9hM d enݣjp1# ͯHl<"Tf PXÐ6ø7! #"1)p3#$ 0nf Hgg-G]EǷV] Us3#=݀2.NPjtL=D8sfׁhDjLy[Z|`Rj Aɚ9*?~n>Q*u^@w=C ԝUź2e}jcr-mP#6{Z WY5;rEwz3jhЬ-' QDlbl٘x̊wTlŮ&3Gf*Eġx&ȝO[TU07'D0ysZ;*sVOfV\fz97QL2Ui~aN* ^*~@*?~?WM:=mwCx?>"]'-͵srxU Ru+c5j0; MV 0Y43*[(yx3cҝPA ΄Hy`~FGChr~!Ex;A{;j{]Xyq9>Z4;7wU*g3F딒B$Ԉݪ4U n5ڨrRF&&mz51t+R0V:۹ | dJnC؏sv-Tr52szp+4'qDGDѨDj'Sspa=8 rҠy(.X#d\ #룯pPMvrƞyl:RSpʱl*lB&P3r5ȩ'<0Ji{<mX)ylvGZb632W2Co[wYTƼ;sKr՗)L Ӣ͇ŕt M=OpT w! M c3z4J&yFv?P=X-nMc5 a%4ZF ZYrNH64NwE5YUO'ZQK%3zxقʞUCOp}u5SX,ΏfJt*`̸&SjOҊDVaj@"5I —Wq5{HP'.H}̦Td)ռ:SSG3TۄB'Ut=GJ#3h\ !б"+f  :^i@vTPA5*捂q1&28.tMMx+rIMYx69*tJqB XzSX&[tԄ2oWWj%}( q;T8\Y4JG ߼X+űqadv:^aT9 >Cx_XT+ξ7>݄E % U3 vqar8TÜ:gqx%&ι.KU\m qf#;nO <Z:gZS .uI5cvNjw͗ +haK/6@q5~PM3dp\Cǡ@ܽYu9(^)`Ͻ8\K@\`R+) D]| pcFr!,A9X{o3M;\ڦqLr'vb]bw1֊$\3e >O¥ 寄seВS]Vn)L>EBJɎ.koI WnQp|Q<eg&Cj93#J y|N^SvJbN`]Wkڵh bVAHTIDAT!*LyFƵ]㒊p| {$ҹ5JvW#V Qy;c.>YV)':9N[Hit }Q\;sa9o%s{)m-\SmQY&x!1R:6 D|`cꈜ*ถ.]~ˆ+;,~eՒqю2ɐo[[3,q曑]1 X"uƼ$,Tۑ\(;vF]+ًJFq.&9 4{LJÙBgЈHT) Vlt#ҝ 8h wvܽy "H?˦cխ\^ݮK^xTu@DF54DKQ!NUIʛ=Z0H%*ܸ"_xWWWV[,!aTV&J)ȿyF$¾\!`L)gLӄ/` 'FJ 1bOMfW&X3ڡ@G"@iu|ǥ*( <1X>+p9xgZc ͚ X$_rsh#Ȕ5w>#5dE(oڠݐ#nAsxG]RxkGӵ3WRoZgUB.Narn13fnHA\U;?4M:'[TIr% xnV5A`T,0(9M%$]Wg+򽜅R2HWx Kb@QX:ԬМ0g,U(B %lT:v*Mڹ(a{3Hc;_2? .T.gsy>ƽK9&;λ1܌gˢ;-gNډ\gǝ7jߣ6O͇ɐ ܟZ!.I4(KTcCOVCdz hSs=nű? aw! ٬,I[(V~. n {U*:\`hmtgTdkֆ:zQw~ma ZtVnu Yr"[/͎R=FJ9 R22u&!&I%i5M%e*9xSٵ">TlС1A~ Hj$ (RкAMLʨ1vDтT"y a*#cG0Й\k0GQx4j$<7FH\##`g&"p;PR€|rfxM4@*Vjn sbGILv;\__[3k Q8+ħkGDakg#BI|0Xei ,J#V[Q3ZT B"wB.;3ϊQHTjڂJD "@PȐ A+)% er\.Ax5`Gu%@vFd=]Z y.4QR\ , p  sO)a ~u%- |A3f\FQ/, Dp@+2TԶ1b$1"0(w18At!n')JPQb#8ukYuR0M0v#ͭ#5 !$/, W~(D$xs*SJ&)!޵@bD) B0jǦB\sxJ-F̃)&q'80Ml\w$Xi9 kE:xْ ¢wn|"K:qrjPYA< R!pnRpȢ#`%M(iƅspn1z}E9?0 c=o@q)[ ΎG{ˆzp̘\0<(8&kW@ ͊\ɇ֎d8c>OF%0H՘x /׿joC%N UQR̘ O*;) ДҖcD%`>kq t#!߈AY"C< LɪM% #޳! nbXG)MS`(")A Y3q7vw=(8N3;}y?>px (Ѻbq< qgk4k3$0"փ+p!߹Zsb ƢKF&fn35Ze4~13#vx7:^}UYG㈳|C8@"K=xps믾nggw.o\~y13Q̋~/ 0bN'L8DZtp@ݛOQ HGrP5 4q]ZLj^2=&vׯL71u-a z<ㆆ7({UZaF% r:Wtz (u.KH`Q[kh/qY8ͱaxzalݟP LA>Fq/]r p^+p7q9//߃}/\{{>Ƌ%Q4Y3nh d5,}?q̣͌7'V_Ax;jUœVRuR:tpanCj RJ8w,DBɦiHv=db}"t<q<x<*s...VTTb6ϲM,lAܸ9|;x4#@6x`s~ tMhU o3"v Lm#Al#,_ZOBD8 th}Z.e׊O)Iy~I!={yG:a5fv1F5Q Un /;5h-pnR!|(d^2ĚpF#H#kV)ϵ&"8Zw&c7؟qԹ¥)"yb@GghIIo-@quun o0 66`&P0 )JI:% (?y4M8;;kO)agyWwЯCN׀^_Œt7qGV$08ha$t+B9!S.?u-ƈ2nnnp~~5n٤IŅq;XqoJy:~pVזc_.ںP >=q-qI$*T̘G B0SqصnZBYwd~]]_`< NwRKk cl `u=nkdfQuKŸA1e-`w6J&YM+|-(dBf;zM 9#;kg>{f|K__ n_^CZfu4_[S (;~70kbF )x{Q,T}.MBƧy<\P!%inTU',M$UR0<[r ^ZA8_xnCAڐ:!jȮAY܉I?<\R 8V%c5bRVdq.qB$ Zt/WY+D{c/9T4!HR8"?D. 倏pя| w{ރh2I2/.@M]QL$^1(|Cyloj94K'a=_"LIHf0KuҚ;F _&d{(ZX7$in{ag.1 Nx54m=\Uf3랺ۘ5kiUfX vYe"SF9c?1H޽5X>*HPᅷI Q(a"NaODS[bnEAC4(ZDdrSȹ "8I0J n|u*L=X$=GKkg%g5 wulq%VĤ^NvIrk 7ݫjUxTy0I׭taRL$"P8 IqhvԔvjv&J0DZre'=$ k7o>0qz|1#;x3;%A|=pE`q3MAǰB:KEfqgwcݗ@,| ")=.t_~҄-no7n;15%\}_B4% =,;!+?dLҺoQ%tXo L Z!8NuqjΡM[R U^ɦ4T4{uj T`x+8":Zg'L 7חh,Ȇډ ˂vվn+-nP/ѻiy(&dq/Aah CE2>|_؇?_߅ox֙,܊iXLAVT R¬r*̸ |'c"0Em(M͂СS!(]͝7J\uA<7[r 8U_U(8R/tЛIu{u#q Lnjy%iu<|fgVT[!< 2{1֤.54 :_œJXy[o^,h[ UZyMmt!qʑ#1;MmHO!uVK*"yq8.Vɮ^ B8\nw "# ޔ2I^ 2kjP-5qg RwC(`~k}0P;5NA^':L 8`IOV)!S !9*&`|KǬfi,a6scLES~l1 ^( -3n'|'L߹vsCܭdĝ8AH(aq<^=d]8\-Bnȑ1X @0O(a1x QoW?_+/| #9[ ԂaU/“ک:CQ'Wz01%:ru55^w*2G8 A):Nr],*}j<EIA织д!PB~c//GML=jC+fW|JT_X$E mtlXwOoqQ$z3/Lל?C|W}7_U?sƔ45{~9gk; ڮʕp`Yv*@P?*(HHreਮ^˱ۜ{dNZ6mAt6 Z@^ ,vZ#6R B.1LƃH{QQrJRufT [H(8S* t]A:ӄˀ}7Iq Qgl(V2u΃HXBs SR9L+Dpe5Q={fBKXj{FCDj$Р],O$Ud[L=H$>w-*X 1&lE8}3!QGQlR2@SP4O5.F$?_4ו$s8]z)t,[b<\v+"~N]($e{z' zCq5eZ!3{AH&^kpRAG"°[t|;DD .CL2W8si0OBAϑZpuܹg86OqĻ D"<,)&Kyx.tD޸ =b:o23)k/kPJ++w9τ8:r:@K\U^+ y}ai;ѩr糂+U$Cs_ +BB#BhA(rl4JD>P'T"U`"c'`ґKv~w'߻t[}+xU?׫[M=LL`gwK7o~7Wxw y+4KDNA`V<9a3!P&Pb*Z:d*AI7qVS02ø2' A _fpl\]us 0BW|nJ+UUwL=hHb{[~_ÇbKxcF~<υi&`I<͘ 39ƨȹ3xՂVV"` =0dCqX\|\"H(GBଁҐJA1@2fGqRˀg.N* ])"J,.de߫ w œm6Y2 p*R- H*G;ߣPAIo`r Ao *\ #pB֜RL#+ԃP%atpr7W U$ H{-t{4E]ׂ KRvD_ Ԍ޴ |4i+d/ni;3$Uvo2:bD \0%ynT^@IHaJ0! n rлHr>Q4!tVc qV$q+q yFLR]ﺐop6[8"!`$&*(R\!x9#zb ;*|GI0rJ@ (͕9!!Y58%Hj$@H*ݰGNtJߓ|>f8:lZvS*(%8 Ǜ7Jkҟ2eFsPrXEЧiqS>Z"fuB0Q0:DxqQ2{ -ySI󨐱Yo d)*}mj7uf52Mץ Dl'8# A`ƝvgH! b@=wC2Ɓ ˻S#{q8ʫȯ}~Ǿ_?p_GE6W%h+ʸ#&3\ C3^)x*+D, Z6epLY,T_\8+c#qT]'Nv$&bN wY Wxgb]qE̍S:#0: y M% LgI5٭?E_$^)CB 1 _oƿC???}̃xr> ܓ8 < E*E 0He2FL9c F a@)` -TyVlε$`$!iR q@ T$. dbbaUX+Q"@;X52ϒΌjLWa= bPT`<#XFQJb`3 ȂQ zVJ1' ISQ bǢ1V+@wGqR@%#93ϩ|sqx_;uFrJ"5 ȽtPS(J {(ɔ_HOY4?gTߚd8ؔJA(b0V MA0 q@ݨ DużG ;XqNډ0|de&X@)&q\TV<{FG0DY)D]~&!8#,@( bXxƔYr.Gy휵sU0ƈ(6.̳t8$ cn)gt%Ih ]k01H@^Vh8-O)aӏu$Y3e-N8(y8VQ.Rd**AJB $}Y Iv$b S*HԺYP *S2B^EQ) b*:;IXm 8!&\=RΖd11*ςX֌tTq8D@G!%Ĝ1.%Q `@T 1It1Y;sҔÈQ;MӜeX$w! HjN]ED|~Ԛ I1;U侮0S(z(.e 9'䒰QR4_79vM/g$Ft\GqkW7Fqsgmyfε^\ 6HIQ5%zHe[8Jĩ⧼*)ǩ$qXqP EJIHDלs4y:~ .gZs9_ww G86% {>Q|?_gn _C8;Le)(ld>b&`Tl;uл\6/۪C9e'uJitzș  w.F':T$:-dɕ6!!&rѣUfɘcWBD{4KN\pNT6}k> M;ExH*!T>x8PEC&9ȟQ$ -+Lx-E)ga]OfȦq<^[8<` !s-׌$0^;qplȲ!Nyp5F6l(*OH> 6#Āu͈ec iؖ@oȵ8j#Ja]5'c@iK81>8˔>S|MS|=,'ͮwwd(Q*OjBGGpꑷ\ 5V +\ T@M ҤLl}Pp8`Yl)U@d$2sDZ?Ig[(<] EڨMmLJ :< JhK/4w !S=; [2. à V5@gS[E'P*\0M^{5\]]!פk_eò9+ _)FB(:bc\ajbvt<#ɚR.Z<&\yu88}q8̼#")S҆iȅК)NLM(ڙ4X &m?PhѡXoϹ1]i洞)1xDܢT|n6VQ2ןsgب\jߛ{tSe5E+!j l_[II565iܨ FUj-lXS((_~mQ.QvݮE䂜'$ozRJAE\O]]/vbPa^)hEYns[ř?#LwW;_·߽W>i'AJ4-;aPЦob㟭;xxtPR'wFձg9\sN7R9IXu6_3X|jl GR5 KjVo,}B}[uG }}#X\Э#E8O;UM>r=nk\Ty'kD'{byd׹y.V{,Rskk# XDE@)Jz}΃+Y5%gDfc\kmNE|gE{s؇sڠ]{,Ĉ_s\5u#n|NTPu``)pV47[?+6Siﺎsbo׭yVSem5.XIb .?Tԛk}5{fu%9k73 %ZmtO=-Yp\֔Þt>p yNj_?M#cbZ e}95odcFBLau[hX6aYSS)'Eڃ~Xr{~yI+#rH,kof ynߴșxfn's:f= ni}jmCZTRP?ha?v O.u-lvbWi&k uق^S|e|mv<㾘k:+FZp83쐽ߛ5 ku'j!]D%,P;4\ŀ3qP%Ź}F.ʾU{a,Zu޻м63;^i!!+ }6?HH߇9zz]vcngO~ӟw9| së?4k4wuˊYJTup>uu_v)Le k gg P!VYI)lwuUjW3Z֘1(n'9{i]e7k#R\?V^)QS=M6nr@׮@"]mc!&U>-8u#ų3ϙ04ߵSJI͛{lMSMӌ q墳YÑݚ߳#{y(نLJY]0_vyl]:9)VOSoȈx2]^w&a q-16͝ ^GtҮoٌqeYHo YRp0aǞ`:22q#劒+n[ފ :|/哘_y'^ƫg?Q U( E!*&ԄNN fX7_º2w2ɋ86N5p͹0^WL!#k_';WD&MieLp_Ceeԯ:z(hL/H6!M;b }]ciz}h#k;䠄q ܱn8]\eCznbQ΅H!4S{*n^ğ ߄?~/+Bs#A z-R,aV: GǍcܸы Y7'b'2 y3_[p-Efcai[KN9m07!) frP 1FUCl?[<6{SSjkcAnQ l)cSC{= m:U{tNG:5&P &[`E f\ǻё'ƨvپQ +{sά g ]#{(o u#Jh)= =-qkN-f3l,iPQ˽ 6왨6N{| 1ȡs~f;,gQ/34Ѣ10 MrE'JO$ ocHž4=vbQ :enh/͞9Zy5{sՁ}߄-jFRY3>.Rl_W4J|H%d)Bk9Ix%Co/Om ;z] Fu3|ݏd5{C׆z1Fy;p6K8hjbo$A<0<2kQFu`[eDk({s ESG*JRzz4sHR!%Xzt </^?_E,t x2oO{ӟַc>\^Z, GK^ ë{S^[6{=M| x#mfoZi'CvB7RFZD}6-lq71tٔaq6ZUڟŨurnLXWىXВZJ‘ gt /rZd0tNuQqmKOw$N)knۖ3H~EE*!u\XiTwf5tyO_#w[D[ּ|7Z^s{MvXi,N^Ugg;5o#eY{,i3a\_fBقX-ƨs?X0cMЌ3JQ.{}-Z :g^jF}v?k{N:h},kkZ<نAq_2{ArV&ӮM^dMwͳg@dvF]Yz(έbY] 5DdG-hGgө+NFڗm6-Ul,uśh-H34YٰoH@fvf)=AѱϭKklflEPz,rH(,=m>Fm voTČu)r%̹!/[ۂ8)l[O/>>TY YBC)SߤY13}h]+{8@uͳh4 zg>m1{v^__w md qZg1p=xtw|}IЙ9xgʗ_}o_z%lw@s75UuR E^r9c+m]$;[||y f8Bto}ֆ:#sHC" ;O/޿rZ#e̠?uhgk&dS4D;jk1Ili-v<, ň-nC_zq< tElBCP9|$iVaB"³ۨZ)`<.Wv8RhZ޽{:eEm,z}b;p8д*mkV.hlY Np.`v:?#Es!x{*6w_GC~g i:h:4@ajsE!L5zሔJK&&L1,XEÆ@Ma~YJᆛӵsƺ&릅ct&s=V(?]0V~I߃sEvN֜?u؂mtt6rJ&ۨDuSޏȵiU[\Ks`UY=78!osnzypZP=HhT#_lѴy-it 4Rno9NLLiPy6YW Y R BĶeefҩT  }xWWWXQGq'M.*O~Ҧj]78;x*RiT۶pi–(27ɲ?>(s?kn!!O>4MB_֨Xʒg)-j d db>{Nn>gT2C5jF1]/VC(~[V1_b F65&Ꮍ.#b-eAY>y?wwwڈXŮϫ+777b=7,*P-lόb4?%/^NNd\uVڜZ3:M:% E\&2e8?p3|Tāȍ+VI*^Ě0[*r K< r~5 R̀5 x(S!*ҵ9ñ݅H6R5P+ oW|Zz(W[ 4ܼl 6,[}L#e Q.  yDp? wĹ4D_WWWƚ6Ol!g],f'v8}״x+I6ssTG3j2VB9 mӮ;-G#Չ15Y#b0NE"8Hq(!4=7=-e =Hc{p6UYmG*.g„s.3~0EԻBz14snh֣U#ڔGJ<1dTW=eTu+xmW(q#BFhvmk߆8|`7\`}VӃ`!pu!QOiSWiz;XYKӜfg'䫗n_w~CXz7 w .(n s 8);ertɠ s'T`PD*ӧ^NKz{HNgMNG݈E)Xpu0{#Ln=.vΰglᓠeV7eތH?yŹcC7i бX?+&$~$[H-M(׸N-oHYq-|vZJx섛ָc?$ɫ-ҭf4 PuBzF߮~6`۵,E]GvacHݴkEdƽu{먉blt!ԴXD҆FAv/L(Ƶ7!{Rq<CW<˵8MDRֆҊF=h`4c`Ew=sx\.LFo$,0] ϋ]{+з5CTם|@M5WxD';.Ä|3xOᇾ{qMݲpܠ$%gzҸai{+psEJۖs=+Dc`^>׍S1LJO%ݚz:#]lԾQ$;zi:k =vl؍ҌƆN{t8푯nIa\z0Z6r;m9Ū-o7bx]'$;ѷ~o>0۵ bCnyMk=%ZpYNnmݾs`Qrq5CLdPZj->D٨Q(o冀EmoN$hAEl.ӻ;EeʺT(i =M=>32ZE53r-t,(тk7M aͷd[lZ((EVl#S+5} :'cRAlh-dd[Q)CL©  *r-wp[KM٨XR_Ҋ7ԚQJbFqf&*MߣPÆ8Jfu6?Rl=:_?-eknZ:8 EX~qΡf֙^xid[fFY-ZyMkڐJtt=:Wm6JIض,DΞBѹu(k"m7^t=%H7jY6qaaU{*5gu=66Ubasp":_{&R@CMJEptD8tuD5o"(Σ_uƇ>|>>oԏ*gtE5(l]q߂6y pVW9FiDv]mQB7Y-u"_=H*0.7#ydp[T70ʿZeDWJѲrg֨Z9!RVH\9IDHLJ_7?}яe|{3GS!p8؉=iC.ZCL4h׸s,գeG=ݑ?Z1p,GRlF-GZ5?Ƅxx=(s"g(.NuELTs-T;+R3壘RPKԱ9NrqmQY۪x7x]3 ,u27.#i!f ^FEKs&^(ˈ94{v{.A{TKک2jh/L'kTɑ&{ lxgu,{mFӉd )@bR1k.@-  S,t/}#2gnd4\F+`K0jqJ4Ȑ^m7$fs3{E)߳mW3ql9!@>#j|qZvE~g =>1'-:Y9D.xǻ_k&g}y7?; [zL)4stsdQ9,up3mmԞC̞@%5lĉXjup;:bKQ!(u^># wtΡX76c:F(P8kƢIr~FJ]#Mg6[Oג;`.gJ2C:f? |.4yr(>G6qobdKo å@VF{w(:faԙ|\̃Fxm4=أZd:IQ'Yj>CX&.ތTKݽU_A}lsECF+t۲'u >)IġkTɒ=p8{Ç8fOWc?l[sB)^%? yb f(-Nj!9*N[I Ӱt@0Ov %Hy}] "oB׬:P.;guY/-i]kۥNt ˭[Tu8yH=&QD~2\uS!? O]N;em4)935"NՇvBDkT[M !yqh7$ Q(Qa*V4`Dsl!3*Vb={qJ=fL{.7*49q}"FSQk]aGjy]{nC]d/N.\F'1d,~Q|46n'py}(gB:+p2REѰ> z2szlQ7 10clFm,^BHV1a㚽D]sڻ?wtObGl j}2o483F*i }/@p[C^gj1#BQeȐspll eObGݠ39/:KϪX^jQ;9Z.[J۸EX_жg<#, *j|ϻQ ~ko_E9%O@Zj@YR0u,RcA䁌;pW1PNaGjս85Crlq-\ұ^ lv0أ>.M3M ӞHyqP{MՈ\LT5M^ϻm9>CRa&e~ς@ԑ ./|w3@ "NPKĖoB== ih{ Α}-kCRXM\8NG(wu`{tK{ƥLi=|&~ԞDܳcO;\KW1WA=\jCwdlBWʟ:{ȃg߈YQ=5IawB hlH|{m+xw5ϣ{Fj%-] g\gu65QkUԾ{VwqV"x ܮQmb?4ccaK@&tlܑ= l/p\j\'趗^kt KG4DdyNZnop&?u>Kb~o7au05.\ ֙Y J$ ^ݥb>^?O~ ?ʟCKc?Y6 fTo+6UukMag9Qu(Q^m%${yޤH. CAlZ`;XҤQTu< lwmѡ#eqRsrz7@Cw{va +8wOÓO[u VP{W3V~달[xyoc8D{(ɸ#'Vbw(!R~K˟$W>iN1MY a!ЦĮ&h`{E3yoHlCyI簗ˠ``= Ovo‘fQ=$w@Xh.`_Ԇ{66?vOVJρ\ʵp8hՈԡ EQ [{n]"/r?7޻w:Ju>zDG'nsozz:܏9唙u;,fרi!VԘh-)dH7ס8jM8A^!X[ۿ:7 HRZr0|A͹C-\@d ' ^UEE!JԾ.#\ɢ(7! p+{cD/w%kytD ,XP 70M .lJvvys)o X6[Ȍ=7mQ 4 :`s;n%Pй&2 AekƬvDK"(x1pD߅=-gk2Q?e=shʳVi%g94{zcѡU4_ߙ`@{C)] 2<+H,z׌y- }-ںR ci@ l rQSJAR*-=RPJ&up\$k NM#v_ĹM'l` ~=mCx%[[Ǣv&Ic3ڍw+xk:73FJ8FkvZt{4k  T{dhpQ`,FaɴJ\ 9{ոV-g^u1t:u|DR=Qo&͆Mhea>p&X` /vCIYJ(ǬE֪ٽ:m'uR\*=YE},κHdY͡hQ$+,ƀ†8;jh!Ju(iy{‡?"8[L!1b4laD+֒"LAEtA;jɤ1a]w@WYkqC:yPHY|޾ϙŸD~޻0KQLgkm:(ATZ>\lP9 -(S:yMmoQ=^X>n?{a{.56e# b#"y{nsYT=6QKf6{F#]Ep˺`bZK=}{1^sߴ5m9cbop"5EhtGKc.a˕ɹr:x6]>猼$\x!b|~gN;?_ߏ/' ՙ$0q>V1ڐb* C a+q*LNg͍GMPTO}m ƛݾ ?4\ou#ScuPҎ3V54bf5Bj{nqA b.{۾WOT A ɩ@d8IaJi`D8Ɖ {BKA=cȸ- =!{䘏W^e\ҒX_o IpFK^*G1~Rew=Ȟq ~vD({&oEI{hҥR|P]1cF=%L_Zg#tlɣF/!Y#"wIgC>ϑ7CHfYN=Aج?Rl=goFKMDΥgc q dBVu|NQ=hl~Rwm~BΜ-g?b YiHWAs9^P47{[1tꔵM3OKX&~, N˂;$vBQG}ۜA"eYSu&ue/F|KK>{T= z,ƿ+0ķ+=;K!^Rq#~s _wQmoYo/]KI˂-\ҷ45 쭻q7k/ܿs!AqyRwIl;ޓG{^O{ Hco{RPn>܋1{Os]Qv4ek8('{eB21e8,4fMU\ګhbQu m?; rp-ϥe:Hc褸Q cDtx<y-?psә SG٪% 4!:ZVZ)QA'IDAT%*@oQh48ZMFӼvYFoRHy!HhH^4s!݆zg,,z=%HVY08 \ă\k7fM}!x$e]p:OnByiBۊ 4R9ԬΆN9ca۴iL,^r"g|\qp˴L]ɼ89$O_nTJ.v н}a-ۙ@Tz^]}e+GH}ghwmIC'h/^E9Mߜspa/P +Z(f $+@.YXј.ѳPpYQXT]8X{0M{%cwaoFrtq{dj``^QfcqЎKG3.c˙ ^҈9{|ZhYaa7gDWqb=m z; ^wI'/H^ubs)&]ǥ}Z_O{,5Ϟ0WPQ-}铗S[[ft=l 7AR :QAb7%ӝjg蚣1(D=dN3$;,ۊ#+{ ǫK_~ۿ# exS9|-4- ΉRبAa4Y39aQQݻ|Hoaz6"BY[b 3575o~G'r ^ce]Ch@|.+?>|oC@ e[P6`K4i(C%Vu]E,v 2MKwfmȗ'oT8vW_3x/{FȩT}Dio:hU݅1({qiK*SĮ`F;rf%:{: UK=7ZS/!{rk-Z7tT7x~/ $,&4qL}s{Ne#߾=RNꘞsÁ/d:d>_`M.!n{v֮HCk3lJ4ZhȒOl8> fGXYܝ3gP1lO@Jf_tY^籥 VP>3?R:(t'X-"M41^Gm#+hRց{[Qׅ8w!I?H5gJA?M,R.y9c]]}v~W#$#uz4<8'EL >mAp:ps %ULSA/??׿%I]a.3|&;}=cʹsS[e⅒{ta$Չo.ՙs_N/]9߂Yj.Eo8=}OgYq%jX{x??'07)mx}rASS1=Ĥ(18M\gG${L3Z[quK龄(H ֹ(u|^͊4z)nvh[+M1LW$ZoS߬n߁~OH1= ƂqN^~1i81+ 場ZxXJ=-BF}|8w &F!|gYDU'-h=)Qe]p<맰FTpA ܴm3NUDق#ս,Y?{ڜ1rVK21F䔐 %O9j]ѸVBRݧrtW_v!I{ZJbіΡ=\eë'{MgװXPGtԂeYCˮj^ {h9L&XqDL(b'Rp8v[jNB\~f {LضVfsV Rjz>4! m )m:mzHYab>u#S]A<quuPq@WgzɥkLK!gy5HqYiSq6)`&L9O8g)Xw,Ⱥk׏WW]ݯo622M ;iºC&0twpJr_?.~!Us!2qaͅCB^Ws%s>jODm꬛ RX1 wE?f0&v>RrD NlTh7$6A]"8w,ůd9wN'Viauek0 ÿO>.1`2%GlHF ARD3DSd>iӘy+>,~cB ۶u I.|D)L=(JiPȯ#SuvӘ~f&u:=H[ֿȞvNsp1 H;W+xQqb`Z7(6YXc1~叾sUDY(퐖v+TG%b'%'{T: @{Z x7Seeiq~R<}2*gr&X?xʦH TRwWg;ӄ)ZR=Y3}8WwB׶ ֐tT-u)sa\u% ]=STm[QjҦY) CNES'!y"OY"drsL˺x8Z(Yʶ)~X9Gaےq bڛ4R*nnk6%SRv!>3`_dݫ)Re&ğM\.ÜJ6smX1$(YqEO< 9', A-ME&ŷg66ɑ&f&k.kq )-[/"bxHx7_4Mxꩧp<ējDM"ִ0gLu]qssVTL5`Yzp(yC)k֕t6פB$BZ*;dn)p;~'my5$ Oj2PJUњ´#1 ?iz&<7@ݦ0&e>.3".FDP735kDRL`nڐ95A:Dv eC|jR"*iRǯ0'|7{ .̅6G-H2u1!R6pBRINks݅5k$8IGL8s<=؉ >Izc#.zlKKT8F=shMD * !#"WK=zgM rs s֊›Z7ZB^E8myj봼pMPIX.S\KEiDLǍ@S16ZZ=EeTИ-%mILN>kfYc(9EUrZ8.JF0"E``3̪̌HcbdBWRRrf;xxdQgvK%,rtjM4PdN?㖍``goi&.[m`NjL$yhR.Ep-F(/}j ?+!R VoMm-VLMBAڂc7- uFPA 73KPK4V okE_T]۵VjB瓚v?LS!WU\jaKf'(Y֧^S%pFc,Iv[W_]]u ưQKaA)~ -{4.ӄypwwu]p803^}UN'|7O駟m5Gnۆ{5Ä;#h&uԊ'~+>O?G{q3glCti!U 3>0yZTe :C! Zc˛UT~:O/qyٌ_ryWq|>ھܴ}+M3~]rA*|B݊nòu,{GX Þ-l,["" Ԓì=#ݻc׼&Uw#cOFG9wj)3ڄf/M-+[\6){G-*PXpAgiZlEnxF< 2Lh^ .2JD߭hlE${ a+7mi:7v_SQXLBJeg8Ͼh:>ڮhQsAuT`gDT;ȷL0q8!sS ET yTUoL+# tmj:[YZ Q=h3+rz/R9+֍(Dt"ukZ.}cCCLO;A])d'g>Y#]2q Y䚖W cj!xbpp#᭥¡*<*#q(Zp BZ3yY<*U%'ވpJN4(z6*MOہ-(0 lsDɦ )'J xTSDVn}19ASE{4fvI}hC8E%BSdؠ=m4˰I>n̘Ŭ)NFσw\\_?-/cmxǻ߉{a:Hf>o uE~HZ .3|f1!vCr;{?s?o}݇P\+p ?_}N  !\FEgbd$l7-hXdNY/df1Y($OohBDF|ӱ`:!$ZN/ҹ\Ї<!$|M8\U|=vdL-wH)a}x5 \)yn )aIQB9TjFCxnnpss} abۗ})&pT.p^?x)ex8dp/wLTO*ό- I9 2k==ajK1P? Qxl ~'ň\s{?Stz5oΛ ʁ U12XRsy-VD`hި&E=*ؑ*~> $ E{}BGMhʅ&4ѮQ)3Sl^aζ B|*|pt 'BF^4fF>^Sь3~_4%]YÃ7 7Vg]6-Zb4;4Ez{?EDB{A r4MXc;ܻwKe/PREΛSs,'8p6VNҵ~%!CK)gSJbj>Fsz<Q-|ƿ| ug|( aX4͇ dmLQj+H:P+Nv>6d竁~Bևp^{QAz?A0)t "x;kD.umhuDw 6i8riʿO $ #du1LH/La@ '{/c,-)ZWzZA۽wL7+âpx&! D-YA{hQ~Ԋ1rt_WW3'e#}340K2V-h%TT )R^x`gjD ri0,(> &jEIIfT)ŲGHPGC'-[ (/i"L{Ƒr g3ڠ^ j)rETꫫ[ZZڈէgMVd}D4A#b\u؁¯ )RSyw5IՊP}\U"Y51Nٵf3*u@l&Ag!D )pޡ(XN%BWk!c&"MLems}(^v7.,{Oe/4Wf;QmI ~ّaO.3'X'=i F]eU]&6GL=ӉZϓK,W,FG;+# kp<q}Zq}%|7+:Ko*Bu24f{hrYY-A`_7_.I<_S7wɨۉ jڐ^ӦDž״S#ׯ]ylBlfМl*_  Յ՘ymuF'Gz0[xJnj ߉BRx-jOEޝ"߹0ڿa]}w#dLw/5ab펡Tst"mj2qm s]g#oGVVxlyc>CYY8/[Zr kr.5;o{BNPHlܺ3ؑW+l7 I=oBJ.nGVp9tl4n,&y}eE,F8(ޟ!LVsETH${9:7 hBr \Z 3Ԋijq8aAnAhj媃Y;['TOa[ڴ!&4~1ヱFBi$T 瑫c`xj1 wS^K9YҎ8nH(#_)*Rʔ>YWQ%3ơt%EZa"CN]B", \ Yַ8}TsZgĄ}dk9ΒYP6U>SΙO_CJ1ؐ"jC(`Ch<5,=7[iHh*znGGI{ަޟ=~VcQjҐe[Iw}CC"(N8=[}W ??ook|FWFlsN&Z- b$ɣe$̛kψpkr8^XO>V?/߄9p*KfK]o&բȍ9ۂ/0!\=@YPy&Dra&e[kab4,?ߠq31 DGDv }kCQ8P.+!)c`CK`WW$3Y[j:n?_i#Ss2ޅFt$ݨT7]Yq2p}ѯ8*.6w)y_khF;ߵѽN m;K?N!W;eꯉa{Jl~.PD&]>J629̝ vB R`#F6TCbޘSG4E$MZ(\HVftcKI0"TmJ09Z*6&_B'еOzmNW݅vѡw^4ׇ>E!8ܴ2«R1C#;`G&q%0HƑgj6Qu&6B0[vIתb+ c%G-MK;jRk̓yWuaq2Y6!nja -"xw I;Sȹ`BYL+ڧ˱.+|)/j2QAlvj^;`i heER1c'[4GZlUH|:7 YUIt/NhWT*rz&JYQL}.BmԆiP8Ӏñ%!xaU4*CRR&A)h*AN~*sVTCFpU97gaA]a(\bP<@흝6g!K H%x*h"`;b>cʵ!7 ]@tg0MJ ,;l لfQz0l(j(Y3i$tӵxfq4&̮5p-k.yKNƈr=pcOSh)j/til¼4xgiVGKma}])6ă剩 D.$V@m[L_0іDuziLdİ*=|ӂbrs4ŚĢi* bL XW ę.:ǬVBy:-I>9k#2LJI*s(MrӒx{<zQ)Y@!KcLD9|~>F-Պrl( nhAI)ٳmD'R<&v1xLA0yh]EC^s>*3i(4Ju54í"LM JeUə4OslEYeƆ[P2as2gYɶ5w `ԁRa_PJ$掵EpCVZwwT`NrRN5k4tVJzx_]lEF|ց8цRe* ߋT2=&]~M{48s]W.E1"m)mp-22nL Ɩ nn҆O~Ҋ]|\)yK+]ӊ' ;9NLnz#&|ՅmfmR0&JJ{V8G(5b-n?o s.<_ ]pӑ&C*k k˄>puO"=z!iA)5'"&J`*ޤ,XF# 2f0Hj]낥Hɞ(Gh R,Wi+!~͈nIȿ88u]5Bl7o56XDi2-.bSoy Hq9:nUzPXcDv:`P=^'6hO?D]x7`Y:C-?^qd]e X,ԫ17D2dg9)jt(zFɗ5P*  QQˁq &u[JE?`: V)*ŝ7r˹QqÝ'{T-XpMAkbF$*&4<Qhc4Ƞ†gynr9vK 0Zq)J%qV lZajiNE2z%2J+:j`UQeC_۷8i#]KF|*Bn"YZp'IZyQ#nz MLp\B\7Oۚ)9?${l&;JC:yFՀ[:*ƛ5bqzYӲ&s\E׾5 }m9.b(c+y~ѐ 6UHc(D59)ex]kbE.!|W;y - 4Ԉdz kFcX@v?T\+iR*s6\&e8P@51 ubkg'՜7zT&4wzl) = v ZxKPJ;N;4vV!Vòn)J̢64d,TH\+K1IY~چ`o4gK2]^LJ_!΂f{Z*6=I#zUByȹb҂eY,+^ye|S»l+99J{2FJ SĶzR ^G45#ݟMtpo}x_G;g*>+tEs!+A" Nd?h.DnkC.}oMKٕu;Q9WlY&i9\vMqW132B>Knت >R~|*|`a|{[(k'(١YJqLY[rF%'8SOtZdܻwO?4- ӿ̇SۖHf˲6HFiX9s0d#_>O]|~>@G E8fU/!r8% _;#HsDVqnx>ڠ$?JIX;BÛuVAUSZ_V3tV"9(X}cBYvgQhZЂ9w|!• 9g3q&g'gƳ{{p}s#^7u'0Ϣ*xMWld*ѱ\rəZjȝ^QJB[եrP9Rz0[&,Vćw`Eamf6Uq%Trk c-X]  JIHF$sLrQpc!8pFUl[p# V!*x9xVEe/Eb [6 DMӦJi#7^)VS%5G`UiUTid~p>x sk!آ\qcejrKMyT_̱RtMhEIy[m !H(,QY^joZ{i!,6Egۺ$tA l{[0E@ҾjͧT4k#LO71 qS?%3MXeߞ߈-Cr;iXm9"Tlt]YnT'8T}*m-:7JBAtA8 GM"1Fo;4=R{TK)AX5&=6/7"Hm! !~yW1FB E3* , /Çxu|s?a\]q{{ #<bo+?5v47EK>Q|𸺺Uױo߈xivCBnϛjB)Ǻh8=q{d;)x GL+>8_8*_ _;jP \8#gN;q]3bN3ajH"GYH__㦼o}sxrR tjRk=8s/&c|_{8'Ivh:.`'EB:W-#{\ fg-W휽y^Ҹfv!m!Y-3ފ3 (DWXZg^xw9\ͱȜ-Q 9ZIS(ƌ i3sW4Ձ CnN+ "NSTQ ]YkQ,uQ-1,Y7Q~ i0uM#AXZʹХ\FTN(.sa{ToD gtȷBF '98Y}wΣ{s@0s#„- Ĵ3'JnD@v3th́Wʁd TԉJ5ZzK'Dw Qt2`z$:?z;uht'1D6 IؔZIxi&>/ 6Fq,sfjm-;WPq+}J4EDt@i$ޛShNεsG'A, =)[w79ysE~Xʢ6P dz/UG+$a4SPDԈy+}+PjjG:,797G<}>,^}U,߈_#z NIkvmyst%' l Ƚ ͅ|k߿W^y U~[ނYx$g ⍓k%&MV7fLG0;' 궐$5%-~jwCX@|woFq KEu=+ApݥI9c nыpMp.z<^|}+6҈LqRD2Sc d'tjaŘjj $ NVu ;zN%6PbJ<顦k7:49kc_ ƂA"sr8ә(ZWz:=%׬ ~^5~̀f$]qȬg E 0g҈lu&6T#x }ܾڹkA\ay$F"wռn%-OJ<6UlhlبSFb\ L_=#D\:  g[9lE"Y0d`j_=KmXM=jP nfž : O3_f0,n@E Y|9Bg$~v0Ϟ0+2#]p\1UD]D9QL,Ӯ(_srZEӋL{4"> ojZt}8"M^'Nr0dB^ZFEE}ӣ&U:25aR]J@ib%;:KC :SDBp@*mw"z\}N`K\ rb͍\'TeBʟ+"\o(:mEi?<(4H8f:V7?e#{R SyPrf)gH%؎Vd!s ki8*YDPrK2ˈiF.-Qh᦭pN!d++9ME+Z (Qar䜹*[WQ5 K>4"#ql)-S#d_>˲KߌiЀNY`+֪h\UY5‡bģ_(Uݒ kfՇబz;/ѣGⓟ$>᳼ c+-9r$ D/[WI>N޽{H9tB) lkgox4+A~VZ=JWpEQSԆ h o!'8 ߤ} hH@ʝ3!zpeo\oOQZL7_|c-\<":mA]y )CQ m< j=„Re4X&6 $?kkvJZu$؆hfoEP CcZո TN}nYk1.M?)>PN q#jܹ)")pZjgk\(M2TsTSmCCQ2 ~"L$"$i1S+)mLyLY)SRrǨ>:vk(kP9by3L|懲 ,ޮbb+n_ t DK|JC6jsgOV=9U LڸGf4 U2H**m"BfTվ iU5 {Z=;ձͨJ̽KjRڤTwI3%E tY mKz.ˢjAPNNbq襳 쫙˄gi[N'A"9o;WD+*21 +hϨ%s>]o=aˊIRrPjŶn_5$4?{8֦jS2YO}>|>L1'NkS!X疇',tvP7yzaÏ9!&\~˧7-D9n}+>ޓH>ഝH,PN}Xk/-yAq!H9zhm^hlZ{N=,LtcAji1-Um/oeDWuszCa1wnf"Pg ߥkdKT.0fKqvt+`sU- e3hdgTLS@jEpBR)E%E:qm80*exlX54qRer>,@#Oz[ ,Bf _ ) P 4` mOc4]h#5+@g[E-mkT!T{&"XropB֛$MkAK0qD%eE7=QQkhcz?ADtJ.U:gS(19D1 'Y`cI֠R#kO4 ™X(ߑD(!Vtsj}\6L+m؂Zh9XjEJP"ԻF)$8o8k5wQ 9&7'ĚO}Oؙ/_55O h|@dN"( %z3Ϟw賛PRJ!",׳֖YdnXESke:Vp0|lg^ֱ.^}UܿW k7a%7V}mz5P: ZM&%V#|!f)lE Lǫ+G8| xہO~u=$^Qw %Ўejg}Muz_J*FD=KQE Ц;[jVBh⌧go> ^Q.Չ)P@6R m8^9777gnX&KAJhۚ'r#BG|X6cHOSs]6R Y1~՛ZZr< ?uNӞumN! h"ຆQ2I|&wT4'~ԧeȼ{X cGBDN*m ?uُn=1ng?uB*%#e Ȣ$p0RFHxYwMh'mFP70i r.=*%}KMWO(칽HFhJ%.^:388W.iuGCF#SKl,Zv-,ڟZ`m,EK x޳xjKҟB5h0jХ4.fqcVxdQ wgT^tO>4'ERwyGsH0M\qqc(w&a2w򉘋9ElNEU -\l*knh%u:VHz$5vOft:{񵶂^nz_nŮ#ᰮ܌򌮛 D7#*L3ݏ6p昶 iA`M۶X+i3nc0mʴ[v~;簬 ߿N!<쳔)KK<`3A,O hU_#$,+ln5nN.ZtPF>- V0Pԏ׹uR78e}u&ص=iiZzz!%iYۆEz \C^6T4Xs:z1W)rhT0%04kg=(;uxΙ ɳͲMUQkX9/=U S K5FOkkT80tDI7FX9McUL 萩\M ;Z#V5)YYSĄ}u?TJ-LDKn¥fM'շ{Ě<PL84FЀ/rE *bLKi袖4q!n ]SB̓,9氣$.䰢57JWgLd*G"ȴT~gZ,>˺KA\sKu:C%*j%$vwzL`A=K9{g˭aq y^x3xw#h)#`iXQldXk>u Hڱ}]{nh"жiN z/z^o [gpYm0Lc k!Tkb#b/e!?b،YdgfnDyS9}/&|Qmnlz% }}}nAfahDFl߻iPIs͊Hx ɡJ`6M 2]B7P_ww3[ [B:t)u%ho{D7P!;&*VtAݛҤ+ī3Te+-}4:ĹG\Įh"RG*8c R5 0DXdh8ߺkh.F  ik:g]RP}Q2/ŏdd8R l#* !b ӟT섅TMA&0ᷓYT'$h ˲ЄkRry`N咵+F_Pj4nfFdz_KA,(聮!ȹ4 ~n"x4򼉕5 NQ©AP0P{-92h_v,skb+ޖYB6v9*+zsiAg Z)/C"N\]>6 ?3C!r6lI%%n_8CIղg83G_XOu8ݝ4}<64M$Qg6HБiV%̀A[Ƀ{n(%vֆ SbYY=G;ŴmH>Xk4ϜsQAks08ehVp" 9GqL֨Yr iRJmx[ނnooquuy>pȸ< 6-,X;;F8)ިq?R]j7!d3?.xW3WTtk1Hk LeЂofp^Yu/lX[E1Lp>sڷUZUͪpE9$bF.5y/ت%;>kL=$KS26$W+I$pѲW : R gnҔJg+^X:֜llغh[,ea$s9 QuB^ѩ̊$J (.rAXLaA1ݠx.WCD0°nL1(uVmK <-k'MKܣhq,dB_٥'1zef?U[b.ϪMQB8o 0jcӵ!5B 6msv8W6l;!ACm -&_n*r9xJШo>x7uRҼjh-nJ#{LəҝuYnz4 HwY\.61h_E#xI 5272n&|]7rsېG0A35Zw 9tV:!ft5)U:NM?4xs#5WpZ$c&eh )9gIC&6Q[B|Pې!gS\!%GmT!v/ɫв:T/u&K9ESXqK<"˲bYxiN$m:ֵq |l,r{,fz:@Id 'B}N~}} a'pt_2{[/}~RS foyVju[~jr]i9j};)4W_E/<w)N (b:ps{(,;"n$4z$PMPfYiU] 㫻Pky |quH5"*ȵ'>(Ěx72RJYsi/Ŵ-~LIHB&|mT(߉GmB*Aw rS_Yޮ5[sQKEڸ k@!oKsض I)6|֒qURNͬ Yna,;"C*TkyNU\h.쩉`Gmr KR ƹhv.yt&DPB .NsE,YưJlcΈ8%RbtдvK+MlLϠI ˙ ֨R1WxCd$6-tl]Jӿco4WCI!%(MB!Z]Y{_ GtAM-jfbVfO_bCWo( ]ȴ7X=CRj*-rԏ\"̃wqF',u7S=s0tsgN@\޼{yn3iS.t6Ρu4 Z(f nt!FU^Kq鎜fOVRnwJ*#Ѳd:+2[}`[E9aڟbkA)8H#.wTʒ{i͓ F4hќsZ2sps5Ҷ.Q:zJWEG;u\źfEjJH<$ƆҺN}PhasY)eUw 8rKGPm!gR%͆KgZB L 3痢/䩹m?G]NfP:[X)3Om۲ 7ks}/_LIVk 7$>PUMTP&LSUPP.j pCc0P6 [,Rf=朣>f: 2*3#nN^ݜc_ԭ5QW-_?x4a0^>G(~H*(`_-Eü"Tdl#Pa EN߿\^ldK@Fx$KS) ~~S[ E>(>)`GBCQ^Lqr]d=|UJFBYljlf;lzk:RՇecA?'b7X aM5r3z&Dg7psR06`~PdU3,aTlL7=?B"; Ԯ7M9dh(*?#au]T~hZ\}dL)4 wB 'Jt >sg W<}eYgVydd49B Ƭ^4҅7j H<^;7iIu`bL>&h?sqg8zuOCM]liX!ۆEڝgr \ ;Ii}eD,0nvnAL*BoHi60Mpꊸu7lkDB+-6qVh SK}z}h%idҕNbeY}f]5hS}NkK#ny5bm,E +vEϔRIخ[J}m<4=D bVu\Kꆬikfxqr>{_3n`߯^HYv3m}hH+M'd8ȞǦix౉#go]~Ǘp<5t2(IM)AoL eikl䀲Oϴ7k& A E u+?kCvv#ke/Ҏ75zfl9P*O&a|('aaLYsg}#zciTx$nOYdAiH @ݺ_NS*Hy.6w[P='2q)IJ|#8B<0&h?= z <&kl RhIZ[w+Y$u|ہNt]bIb7%^QdW$Kf b4mjSAcܚ\x$a}>Ji*YBYC?8,o 1,,l͉6!Ԗ`dݤ)K(d%8ؤ9 pRWTghk(F$t}[x͙Sk y~O{@*sx㌐ysnLhoGr`7gnMКs-i9j"ňd c$XTLGb %<p "SpP׾]Gr~) l+r"7d 1X mU}X(=b?GDhԔϠc,QOP̍jj10z %{\iS@fHMD:/f~;*ynS eƶ?"Q޿iB}@NctK2`Svʝ4wH6S}Q"P\ZhqZÚ.`lێ;d)tDY턯Nf i|ਊi9o< ?:F7wg\(̆kl4Ol?tE;52'/<| 4U:C`~W$v @GDѧD[=\OЁ}a͉k"|]BC"khFz;2Ji${殍f":}aVԞU`{iE,4v )\ǯdmLRC⡅~,@EtM#`d$EDݹeY&ǫN^ӽgxׇ (>8{k h> vM%"Dڻ19s $E4!)IFAeuR] FP%!>zD53-=܊d~HJyJVJ@ 2NM-hKF(nkGܶs6Ԯ|z-E?f%Yva"t :kg]54Z ZCJf4vɝdpm"ELROhmÕ!.]GMU/֮EQV+#<ıZ`_4a7QnkòP2feQFRΰi&t <ફMs(^&N~U40FuY SL LVrƮ kP}FZkWhLH:Ѡ<'3r.bQ{V/ ^cRҔm(@jn'vm8) mҎU,e=$e$crt3`2,BhƨmHIЌyiӵMh =fI}Q]߹۷~N. r'x ^+ĚX*9I72!ިuF7cZk">jCUlCZI7'8hGd""֮{!{&)Hqg,ÃrUgLڢ79&SqR{Dz~,EcI FDa>{ɾ70Nc"ca8-pдfwtӽ2$ly8W,y 9"N" eT\loqjSQ P.yA^ G Vɽ zW1ص AQBb`bÛUKr}wl7ժN5PD)8i^EwWf-H[k&{XJct-U zE.ԣgCٹB&yqWN*FJ3UYʒĜи;R։fMe(I,kD=!릝4,dww7f*OY)Y᪤f^PsW. L2 -sCCU$SYY"gVҧ;Ke("ҚԶmՔǪQfQ-#'K'2pJ;Zfy4 õ+F")1p.Mو3N:e?3#%ְm} @Kv+"BYWgj-d;g$ ]>X9gukKN*O]BLt!)ik&`9  9.2hj hP]@#; غr2+r*h]l%(OnW/\/fIQ"dtJң,DHA].^3!ۈt@y aѪby9&ڨ Y0[eFWJ!ЦrX [Y$~l44/*"bSH 5!c^.?iZE֞JՅrU HX)/ʇzOޣoZAs0|A6 >y-:裿]W264%/#dsFnh]=tyC><'?C͚Px~*mGZuY=xVpDžߦ}SkHh0{CYy<62Dոy1'PLJX/]P'xۧ&Khg2˩ΣomMNu!584s0ry#I:H/,KAh)E[}õx&hz#e;٣B2!;VQi]Vf۴ysZ='f]뵍 ʦ[Fy4nA8.Tzb%%1Ou/=&DX !6xSi[-"Y3prʪ0 9H(=dEtOٹ}oJ&bV9rYDwOr֫y`,) M"k 뭢,Z@ZP*PV 45-5=DE|kK󜱦n/+ e%j5X_(t(NIVлP efG"TÊVR"liaWTEIDATDI| SdjwE}왰5PkVMyӄ턌"$q(8``.VHlᣴLXpA16mb[+VrUˑX,0RdI{4baͭ%ێ\fUk zEB#c;|_Vhr.vG}G=D}Р0nWp{~]V<]3/S\:㶃"2bt=HҵX *;-:$Ǔ 3:^߿/Lz&nV^rJz51YDC̮(S )ќ=n( ,#Q=%傾_*U#7s'6/N,4*N2ux3SgEnБHM9KnYf=aoSbp|OQя.7˾wE<5%VDk/(%rE:1 _†F$sþV_Y2#6:c&'>ZvXYBU}&4ezfsis:u Y1ENA9 6eI5M!fhChH([^BsB B,7)KFE?i8 VpGaƒnbEh<97C қ K.E)2^dYAD8;m24RFBZ2,N@%jY he,i`!g-%˲8=hYێy;@Re۷1FQ\Y&kZ7W@(RtϮ$8-ګI5u1adK*CjR E]&nǪ#3&tc\>ʨ+%<=>b{ OoQJƶonq֭͑AQk;Wwē^׆fltUrPuE)r|)۷_5yO7gd6f](sE-'F >*4iB"5鱭Ο<2D#rlBީ! ő651MsvzMp(;2\]'y}{iĢOukHb9Ni;({±995+G{Y/a\O tS%.R}4\͉ьy͐A['Ǽi`RDիCۮ _/}ɓ?#|~w} b-ElbFv;8˴(:s4*&wvQ 3䘫s3Yjbd^wi|zoC3]Kk kȻ9ge);xѕf~"Rk׶5UMm'jwdV985}\{ ,XhZ=[k* D+b(Z)Ƅ奬XfCd _nϞ/] .kvÍK֧TPݝXҽkmMJQ?̂ȹ&\o^aߡ4恩6uld]땬CkR],oM!-ֽɰuTGhm&%-҄'X,_[77'ȱ[ZǛ/$HT.+Zg|aaY9uZCelD z,0z K ;Ʋ駟" /_ǫW|2B4,O҉f' +(/#/;W,MNu_&OG'o8m{0d"LB},4~Bd^􋈰n2P剎40Xጄ:r+V7oh>8riZ߃;?بx4'L ʬ.}.Lbarlb^gUv}D|b) l䦁;{.yOU3fl*7NJjm,|hqz%hO Z}2 pG~&NcDR%rhdx%\IDHKWf':t)֕%iX-wj&Myp"γ)6C| xR¢^V=Qd/JJvP̫V4xWjGcږQ,WLK=[HfxlAkV)_oowE؏ 1*ED;L/~qz~W'|mPJ|Wʠ3fM;v+4 1ܲr}Fy d{-3qo{&jf.nWC;t98u3D\䜘ВL&W=T)J* fZ@R<[rڒR:( cͅ[7{fTbd\a2DW\5Tuu~6q!FvW%V&8SvkO(NTAEgCkiDĨ(aSxeuukBɡQ/Yjirm.͎#,gcZE(/q+tdCCwt?d{ɶ]fzsڞ^,4'ׯ_[@|e/-Q=k!=;f8C~rPژLKb0|xhmR "T"9|%TZ_mڮzPy>̠&ӆ5&C<-mܽ*̄t >kL +o&VP~Qٛ]oPToh9emD;W Nܙ@lB!gȢTcUK*JTJbM#< ] FaC/GiHN4C[e$h䘩mlMu}?: j\7lඬȽcY,|4*?Ĩuw 5vEm[Mwqȍu F@WwF5c6z(VԕGl-CuۦT^E, u Nښbe(B>PQ렜 ΓFBExYվW38rno mW^;lo;ֵUƂ2<(*T2Kt_&j4Suu5(M3nxeYr{ιҡ(Z&ֽ6u3T.ro@cis ?J}G3oX׬uS$)Ѱp z"uAEO۽AZqX8LvG}9ױ+ضm "  WGw9ZMa@nZ4i\fmAl EOK ^ы<ŎLFg?|bcMfdtz [kXE0 f=qYi7:V%ul@,ؚ-;Q^YdoIE"UD0Ѳ#u@ ii'ś " 0dܱw\@9[W\Ȍf%&M'NWXdV *ͪ?_iSP:WR e]>_Yܗg̟ŧo>w{=<5gƱو/1o99[cۦ߂(9?C/#m7&GzRmP&obgFɱͤtvi^[dmb$ +cSI48zVzAb> H>tvS3;~W5~U _$x?mCcP[sj"ɬU'4~Ҁθ4b."r;"/{`|uAxFR |a 4T*ͅO;HsV 329l_zGY+޼y3(Ձ]m,' 8cڟ~De唰<>>>EBLk]mm ᾛhR&yF^>xZ,P?Cp:B}2 d>E Ytqu@'’ t/φ"Cc$,"rA*E^լlHEEDFU}CMp+3ݺ5HOsS7F[~P&gڄ`BJ67 8rՀ.ۀfjݼz:MrF ʗn)@ħ(Ba\N'ǻ/9([MCgb/zSnTE&Nm牯o e;9r(SGqⵈZ\v:B#wƾoⰕR:؃d>14޵6,:bMK ݍ  RDWI(za6lMSY]>^+BK'+sv,Ȯ"rd4;fYpx,iI#Ep4$L Id%makkRRE G\bSs(sODƢ_Wom sh ?o<<ԈߋRr|NCEΚ`8H9zH)W*' ȏ0KJGjj֋qµ7yB9-O|Rw1&7# ˞=0{Aof,w xWSd*CC? ɗzJ E3]ZjSlr˞?ʎ.˪:Bij\2D{%%4}uCfi!5i=͈7G[^B[)ƚWyĝ&١< 0 :ᴈ""j`RTN+֒|1YXĦ4[y昣.a"| I( ԫoH>}4$'y;g L(ы<';&ZFk#=j #](eP$q$:ʧ.{ "5 SڪÛ5vNe20V&G% j%ЧnS7- D{)'H݂c]8. uɩEJ& u![kiv퉂ɀMR1,k{ɪfa^grXp)vI )]k}X*}uwՀ@~{^Bv\Wџ9|w~~׏&^5'K_I șh9s;R$#m5W^>;|w~=n =[)Y\bZAkB7z32J z0z5L&ڱQhg`l>!ȂRӝ̏[ӵIH-Q~^0)ZZG]6lS:hERNh=&ЦF Xa^wu 5Ӛah^Q]Dk&yZWRbUe[Rn9%ƬKXZe7H: Yw rR=elHmAwÅP޺.<{cnr?S\Wg~xsT\Y(h߾}΂^[>۷oqw';>+*ȕX[c$zPY^<X?<b ݝ[S^ԂR U")JHNhژPx]ޯ:5kW=傴J^ q E=PwqQ^HaD : #Y!y|[[gǟO~:(OM\Pi4i2c #hX& 4ӌb e(i"(,EhߙA>цM%|͟tDtP=P2rdfb E8Pa[k t1\Q iZ8gMI~K)QwYP2aN^SFEug5CmI4HĤyc5C !i]QdH=V21J^R@y1ϫhP2 A F Esm YvC;Gjf:XA,iNb,%Bu(XA`Yu5B b^ 7O "߽'R* h$L憞:%Phd-jrFfvKHɮ"ĩ1UZ R ?=VRO$n*GPBR^ ;:ʲC b-{ "4Oodm"Ѩib )2`EDK)ңJ#PgISѼË&Re!SZR چЃ",9"}tޣ‹)5 (LD) EE`sNDS߁b1aBc?au5}#SӤ8~e&xO5ؓjbf;a)PX|s.*^WB#ivs!aݫǵUI5˲xedO*%eѩ&ùʴCHN%PGUkL>tJ 3#:ґZ }{E%55H*fQ?<#~Uz$lH$S{r1kJ7 nkE <>>hp;4Rk OOB-!=Kc6J 斴.vrwwJv=*Uv7o|e]˂G\5~7\[tQw7\FKa`DZV+Q&v4}BĊ)l=RH'f%x M2uh?́E,T-CNR>^joDrCg|ynb-PQ>ϰYSA巇'jqѲ#Eqo+zucN;:#u9ЮW,l"7I]X][ gvYj0Nsr΋ JYPP꯸{l]U7jsCQfO,F]mJ !}NJJrAeJ(e]ԝזӜ\ w5d\:3݆E76Չr^ԧQYpP"llV),joc-sK)/~?yJ:I/ְcs;CH^r:6C=q<6GzY#bT':'؟o_eQ覔$^hjN6eUtS;Ejo 5RXrWBTwEJiܚHnNm۵ .ڸ6 i3ZJg()>@`!"?~C5r-MH@BI tZy }zsY8.رt' z :7ֱ|5Y-٢Y@Og:=+HpNEG)Ŧ6 Hk7քaARg8X|,h9sА#r# =s7JIZ^xKsŦjw̠%? u(UB.)%hQ݌k@mZm~² J1]^Є`uxerW=;OaU.M W1v Kcw*wP&w!띜.]ՠ4Ȏք ,T 9Y?.Ap!):j?7e)\DKb,6Y2/ ?c?̥L\CrZ\c#sO#bŕ}+?Qr'Prh$@J+]+]픒OLZ='-p lIc)I-Y%ĕ.IjV]^dͬ;92*F) ˊNu noޔbe)%wRԘ!J=OEq̯ZH]|BȐĞ])EVͲrЩKil31]i"BU8°P4sqTԻ4N5XScRt1x>1 :Vr>FjDK}VJ0DG1m߰mO2 BC~~>? Qa`b/꽣,Q",ŽIeěeb$N\./8j}sPyqզ XG=g}h?F8~kDfiXg(MY l\uw8$z5f7)aX.qs)jBČZO8N\{e눘b`>:W֦aJ"M#C:ũ ަHL o( ^ SPPF>=h抭1Iw:h@4OS:>LwC#-Ks.BUӘt0c?.Uw mUcV{!,0s E-7[BCL}Nunly L}_җpk13e;Fbt:0uefqF7ܧ&>c4~ED^&0gGD%'t'|Ea=A$ZP>A\҃۠.XhI$ l=h.* ,E3nfNVMf(`h_AN[ Io, QDY$RNl!S Dg쎼-I_YkJ1DwkX0+s9"69iAv?Z!O=أRhD/Ejߣ$E8yɾ6,(&G nP)R?=-F޲11sKډZ=## t, 8ya`!?׿7wj@{Ək4G5x8uuj"G~5+cHkW_?GC¬)UL{ͶZs壢MI=I:=[: A$K۳(鰅\ʑr)6NFIx{r)Epb0a\kf%4RP.9/Vͅ'aMv2aڙ%BdQPhB3wSTW$mÃLsJjxU'DoN{iBqpΤ?Gws!)tv.R?LϽaNi|Aach P6w6=HA$EZT7:ӍF\0Y>7a)^! ?D"Xj{# 7Ұ n krD^xcC *!H#62$<o(P>_%uuiRaM8YMvݰѴi:r]󁅣nt.9FP/H[2ryLlP% ^An.zI7Ef56(IŶ۲X'p4nP0h*\۶g ???ukc@Y?gNZ>uF {y3#N>Ϛ3_~m-Y ,ejTuJl͛N!-I]jtzDpLa4))r:-6PaiN_p1POí6E.wz]V[UNvjqݮ4_".6B=Sye@V^yI|AY Z@{* ] R)X6 ˲NJ΃`kI/][9kV9\%lNzT 㣚MT=PRP/ K5Il>qõ j31Ӿȴ?)}l:iPR`LA>yY^7~S Xx?C MAWzemi 2nt(tI@Λqdw>&6!NxeB28wv4D ϐ,Xf TǦWa|ca"ԟGqZDwv@sW-U6XS"4N<VlޑܹKӼBq7~yOMAf┞8=k:}5;"#F9d},`،~G4"g£>CCRr&_ " Z߿i| _?c@F/eRhqj 3 'N8A, '1h~Tcr QV^*MVO͎qHXTǘ6~FD \4Lྠ]S]hBT۶#;5UeyZmۆM=s`ömhqt|mDz4\%ut|81;\Ycሉ1x}FH"ttK`=!Ӎ!X-6 K5E~Y< iL hveĎLMC|𒕯p H@ͯՂ@mYRkj) ;,t5Pӿ]6A sI_?aVP'?n4$<9sy a*JnklyecsD^\rp&KIk59e9gKڲi(c\[2&˺3Nv;DT4ZSֆOX} Q Z1mC|cI^/G uO MIcc$6m' >mmzuD8o脇T#sMٿ3D9df8ApZw4"/[_K)'_u;GU\кPMKY0ɒ4]t:Jش9%htub _ lr[MzЊ8# 3:F9cc: 5K)F`%{!;eԦXS06eQtkn_C;¬UL}&Uhvj@zDօ rۖڕ%Oc-Li-0^&s u,yl=gClJCcnjPÇ IkȦa 0zuF3[yzzIJ],scoFJuDd>iLo|eJ̮֊rE~~桇_җ"ʔmDIhhvd ǬEj ȋ)Z_:nQkM?+NY˭n2_D7XFS"]ZQ;̲=CIMȍ߈q()UKZqzhapO ao;=Z&H[ n/гN:uk<&K1ɕ'9ʎˆCԂýfEatJ~Qo!Bcꨎ3u=i):䰊օ˔T)n.y<75t {lDTo"QbMEN,A..uSmFN(G0şC7{ڤ:gG޻ݯ|gwݍ8&^S6 y, :I7mu:<ݑ&C)ЌLt髅-nN"LQ-j4[L$0ݧ TI}ٟOOZkDMz.x(F9k@t#:6/"GѱQNp<g3%osww ~?{n!447»䘛Ӻ|-Sy4Iv$k1EChn̊t!;uFW@Ǐ¾_Jq:dZs~fZktwßstSq~ BRn}򡕢'd@:6cI`[cR03 hŦIAxGZ[ 0:DLg²Z=(f!(6 M*]C>ZcQ2<+5zY<>>R{QjòH 7) asjX#boߺ>i۰wx^XOd|tSV/EsSj7}  4NxFc4FyZ;Ӎ|VEOǁm7ӽmL"9罜vLĮp& ]+lZ5>c+9'wAJ`;A{ɋ~竷!@v ol;GQMs.7l G LE$S^6Q2.F++o~)֘ar#X8#?xDAΚk@mng^9CDfZ? ?9 }=6$|Ŀ߷?~7~~ʔT6}J׹dse҂[ڒRP8fBdJJ-ϱ!gX&h$J&N2_5Hf X `75"7XTD`aUt?ᡆ]a˝4 ^3^DttRvGmL촫 qÚgR52 BM`tRQĆNRbz&QgYOL(FsrDv9z>$`^e/}VOhsrCg IhOԣK@CrYU{LA-"}/_}P'_[U\)q[ݼHb39Ez=ie #4RQMJӧc|9FЈL)A9b҂gjNCZu#v)n$9Ǭb󩸐=u@18ݦ@4+r"F 伯]q2sXf2H?s)!db2QSۦ_<޳S"{U ݇s\>A]&/?6\nHQ\U' sRm Y`Yqm I5Χy;+ 2@B9i4G txԊfJ gܥu i62{U(1#BE75k2UTJH=sirbzX/~'rψSW|6Q rl E1%iCXUlZJPD;a{9y0f="eYfWwڮ\Dq ~&,0жLN s:5[LaQ#b׫FD*oRQh؂/a"wi܈!3kFr~n=gmCD^n6jc<|rAڂm'`!fD,;I -+#U9d5y')m)9mlTY>it[H,SX8s1]= ]g +MI=v2d|:qI֒ҳ253oGynêCj~&3&o)e4w yI9͛R\9^7YĻ_B  [)ᾴit?'?5 &S:m2A`]ש yI5$Zq(ujm} 96jD`/} ?kVZ A4y (mEhiNܑEQ pZM.:t8rtHuc·)cË;է}dq A)e( 'iQԢQ r=GS&rn 6\2>mG CfoDnOhA5p2Ё4X"RFQR%@q͹$͑ ,q]G ˪km:&MC=-'xoGwT~YKw\r=nI]^ZGWL jZQ3q!lԄ#y407CsՂ Mi%Gd4(_?@PqQ'TfӤ%bfaAN)dSm6EqѨ7t>M=*[3dR$a"ZvZ w cNgyQy(AZ2'iE&Ӕ:M {ݽHtL!S@Nќ>5Wfh8Ddt,@B<(09vFӓVUh6&C9$6ic$~p`C0 ʂ 1{A\9/r /G!EՙƼ0ߚk6"aHlBY4#b_yDC,G䥆l]z9ӌ؟A7-g-eYп9N`vJ܎vfS]bzӬ٥qH2՝dMe$BbN Y4Sk@C$b2N >Pĉ pNzk2"?R# WZGרɲedeY~) {ݫ7Pq"Zm9S  @C]JQ{b7eլـ:C,6 5=SkMs`K=(WH`ΡOO^#uyL/ٮ5|xu>(ھI;sv͈)}JI^Oa!L, ]/Ra>sݛ"x NDՂs`St7wVH^Ks .*0ѱ7MYՔQR{UH*zkD&oЮ.x.79ByO%"Wͣo[IpUZB@Mx;X/<>$]v]}o&C$1v ڰLj|{,cxs#yFqR<5b7 O䗩[浧saK<}5QZ 0lv۶58Nӂf4zuېB PEqSKp&?c.s5}IUEbyڳ6[ZzJ5(C3(/(C1$PY__ord]M E>\.!z=mJ"rl@bfHeя#r 9M;4"F$E3),YtkPkhXkRww7@ᣉzj1rAFVGo#`~Z)t6J >(yeጦjÛߚluYbhKKI)qw_ ic0]P{GB O .+ݟm:6nCtu77C[:Xmo蛺 KZ-]M.Zյvl})M DнV,*}R"wBe];N7<<^%LQ8IZ;a] 6}>ob^ڞй 9ݣKZI@.KJuN'rwd콡p7콡^:=kbs hrW I?ʐ_5@9eirރgP^4Đ?p^Q݇Ǥocx".7/By?k7ǭzr]ůs5ȺΜIqQDEo>gV̷<|`u#N7[TXX THG!qwBWO Yy)ssN3wG[- cgğimʌaE0lkiY X"!hµA`p"V%zYn:c ,RbV "N1NnX]W_}>> [,^,ئxlBI 5 &%R#-YYQjxe$Vit4LjT=׈5N!83~?℁::l{_0QwoBa^qg`5D=obzyAIZxP|LI(~cyRǭz ab[ ,QoY;%0}fR۷o8.۷oArܽ*X?tSYnOcCKhh"&Mo}Gwrl:hVڤp@yEZ_˾XR^^_W؛ 5h:By^_Aj7K#BgnW:s(`{='+4aϭ;R2DT|'ȒOMCz+0 mg,zd4Ӥ3}f%ǣ}o?~Q".NiNư%8bS1 +xχPHC"B^łv7[!}E֫84nYZGO½,RĞf.Z[ Z 2:W{pqs,ݴػS-$X"eZcpYr a=QVA$h5hSL02fRZDE ȤvT$gGG\'\.Ƨ1 $6!Ǿ\!%9b؀qАԳF$6$|s"g__ǟ/K1<m3kvOʢ@gvh .K(!/E\2 V0ge))z(u]'Iz}6!zeES]JC_I)R4KRÞ؀Mu](׫jRBAN]:]ruW,<>d0~F #P+_zD78Ȑc Li!Gus\Eyd24[6 A;GXw{qkB@Y!蓙CNX#QrZ5>z X9Z' Do;J~%M9 Z9f|8JSm.^! SƎ>F~EO~mXCb"VSC,G}MT7a;#-Ak*K,TpV &HALH1m]pə`z SwI F',iɳS-ä9>G1R\|T@O/:6)F8kBܕ֩iOmzm#Bm(|i8VDRޏ=% OLF1"|_C4'*RNbTC5tid)Sd)jFHmG֐i7Ɠn`7u3Iy^W7w%ˊM.!H(#0$E#Y8}ON'Vv 7ĔhZ 5ݛR!fIfN,i Ҹmh|uGJIy 68 WGL V?.m% $gXsˡ\CKl^p6l[۷o[G}W^+x-^}^ƪ𨷄g4fsDP8=|mu">KڎR JE6{q:#ژ/OyAWi%w$/j|E%=v̛{Xl3 M#Gbք >¿]>HLPut7r'LڇLۆ"gjؔ9rm"gc2q><-ryWAGz֘~miÒc]c2*9`Yr0$_:J~8/Xk_˰6G@zcfeX0$JjDjb|soh;&r:u2;P,MMeJ%dM9_i5mmz6,˂?4>PYSONq}KgWv%gZeNW֚  0](d̨֧˺m!ڄA_\nj'Ԭ6ܲou}[&y>mjR[sBX7CaN_ JNs"SlMܘ̔f \Li2X;U~Guo唰t`YWl.{'|˥U;0 tCVNţ^U9kuS+ ?@ao.NSӏ>F*B+Bџ }VĄۆ`}3TBbrtZ_qmr&r{oPKwe #eK'1s ^uI6MHըXɩ;Q(|HV~pgⶅ{~nZK=G*g}BJɶxph+o(LDĮcyF8G'طd9 ]Ď2hRVrFbQ"uNs! P_0;ĜdٳZ5QTLy@yiY$KQU+iэ TXyɞX}>= U ԪRPOߚlYvU }dp⒥>uy1+pCA^zW^-Am#^x||A9Κ#-(`?\xl@ܐ理crFz =k@ξ, ??O|GPD/YCQ!©Ec n j"rplb&;:ic4r'FkkWič|OD0 vf>K|C-MtDY^ܨ/HU )b-ܥawUs)X8jwYܦ*VfgF)iq;kiZ܌>VqvDdWv1'q[8O !l"Y?ܯbtbY/`320cu?g¦kՊ7Ž kU9 *eA._ @zYRf(\ZhlH hgz oDÏݠ\fR O aիwo(zDȯ> @Dex']5IJk'V dDa-[a"8ݨ AlB" kl&B*x :PGJ@D6&=hDdGԙhu,E3ȁOюq\}OeZD7!e!)=$OO󳏐,B4i< tr`YV|sÛpr>˲ 0;.p&GMɑbֵ2Hק'u!xzo.ˌxHNBU JpŌT.ҠԫhӶȄ2D2,"~^"9h J#a='@Ͳ!oݰ(Yc J5EX;I;I|4!avb3[@#a]AHJԪ}3{i)>!lY; *u""PZfWE1P{ӦA衰=LT127l{wפЪ$/eAaYV_#R{ : m"wqHJR j2> oꀮDً:T<ǩ{F 9LxG!3yxYGqDHMW,h]5WV"˽ͷG_zUП>CiзP*nkF{}+[޳Wojd_]y(ncX[`"E5vz.YK!99| GEAd(KSjI\ױ`tl1 ~!  Xe50%u9ه MmջH<^3 6G96 OTBV΢0? 8%9M;y`Ey|GkY20DL ]Oݚl<-0χQPm Jhӣ8= +"!OOOx >3<<<ܠǾn^ 9" QrfrBՄDܙ9V ėf}t}-~?C?4ӆ^vf}[Y+X 6tnoA4}v}6dC0-ˉl}ڳ=g2I4%˻cL~6%::cpN,tț6&F=.&"iZg˪`Ѣu2U m%g쵩əB}⡬)뺛AɞrZwIz+ImDj\q&^AZUzuǾohurnӱ[k$gþ8WA@؞7zYe Di:'O??JQ *zշx܉(OAV$*,Vݛюf6ّaqoa&zzzgCުӳECiXO M6n߫~} ޟ@$a7A2D4*1FCZP?;zAZA5ԈXmr iQ-Fw i.w44wGSqH99k3w71.*pňMGgfX X/O&]>u*''5-NHyR[z|lj8Lg ;AtsoJ(`hl6i1J{R vޝh8(B?hM 0+LϲF֜ChVcFA 踹\Ld*M%{GXc46h'vc?ďOXF4 25!V<>>>g}oiY5!GmD&p5 Ggf}ӟ|i#]-yAV3,eQw$j'L/bc*DJʊ)p-r4\1w/. oӰMF7PO ~l{}̉~00ڒe>@RqoMmۆ18튜 6M9gl׫#4 Au֯vljZDzduG͉Y."fEwM&Eqi~͈a_CΈث(#$c۵{gwdb#=㣄^.h*5p$d|sbv|kfeYfF h4,}8} j3BeK5u\c\'"/w0uxSiO$ͱШViFLb?ֻid2]G|Xws}rLG #+^p`+@Rg{c7ZnXŽo[fjLCCܭA +RG"](Ҵǂ*g6w#RxG\wFnJ{l4A;2N7L7RA1owc1sG~H6FifkPF>-3L6(aW>6+mZQ*ص(^AOp7ƻ.!mS(pS1o?2J\: lcBGUeiX^`kH)>N iGǞuav,(D[^F}}SHөe .Yg"琐3ޣ6ֈqztf{֜5%g#G!s͈ s~':lX?g 4” \NY&ɽsZЂ.}NW,I .%O,)]HfwPOC7uv|%цVT2$Gw_{f̰f>H:jk ։\v,zZ&3Vftq!`701ia]̪嵸`{).Hպ,&wܭ:{{Y[-=zih `Z] SCh"dhu^Qr'<==eY2MzGHJ rq*YU?`eV+k6o[נCMY ګq,CVJV"-)&"+јaBSLcGY(=b]4Bƅ\rvDO&dq >N#?M+?5>y-#<90@)BLE/6`}o2 N-y0I>niN~f|Cm\tC3-qw gO 5^͹ϛ;Rbwqq\@12 \{1KQC8$" RAH {u?"Mp7T9j0)&k 7{cS(FBuH/,Yq?ǔ^ؽ -f^KMȨQ 1J ٶmjFch]Y.؄UsEZf'5Ohh@Ӥ5>_'_"p41ZRv״C=[dz ٶu#VAq4=]AFiFrhuck e+drd alh5BlmЂD>$Rc"jR z&N2h8Ef-wC_}Q|)p5UF9h2+_'Rꑤn_=i&SJX,>  q|ZEkFCSOr7ύ̲x*{]lPk)mxn7,oQ,K X6} ZH%+RŚy߂ܣo)!,|(X@傾u*gx<#x^u44$W#B7֑t d<+LF#PD|mQA7B幜uMsLz%|nȁ$Z@$u V̓ ' K".6~]/JQtڞ5;mbr9#n=Ҏo.549|@#H!5W@?H? ;΢GLYք<>>h@ՌXz# rlx~ꨅEYo~!B߅L]wP6vٜ'GV%CaʽO5 +)FMJ&3&ǣZm5'pZ2M kRN&{@gFTz!:ŞAUi Dpb>Bf|)VyeGMk,ˮ#}&jYeM˂_VO_zujNgf AQmᇱw6]5|^$hC tX k։ 15(<XF6Ilr̾'uGjtQin_ߔX'A?C5\҆ 4#%8ӆć6nbçNTav/6 NuvL.W P#ǵ̡8i3Y Gc-W8N^`t˹Wo~q)瑎{ӓ! yI~&N./䈄uwl@^}IHK4ӳ&H:jx_=ȱ늟?Ou" %MkEIx"/0E@NL+|{o, 2aRc٢nH\k"Ra>&$k'; Z5?v<ֻ猦N\U٩^M\NPhƦn^4#NQ{7i)˟^g!W}=ҚV#AXDh[Ee[uYlh8H%XHH(BuvZt*ybqp~Kbs^ffV* .SpEX=-)z 5mIVȫׯq>׫ ms pMar)ERl29;4kR/.HE Z@h}CnKts$WB,hH"p;_ l[W-5q4>~ "-5 NѴǦ{EO(|et.ދNqZ]YV 7M?ڿ9, Bdۈ7یI m+ )GpaH#8һLn M'm1OED3A5<8HX;seN%1~9Lt)oާrKM6iBdЄ$uy}x(EٝՌf3[VߘSZCRlV-9%2]Yv(T @OSцƅY&hcaH=q /QՄOQw ]Y#Ro}_U|w},{YVE^n*|OB,?ކ={m xh5YQވaL@@qyϙ|mvI^d mTMXWLi|+4.Q J]=k6ZL t}0;d :в棘 {oJ%rw6 ^Sm$"iv%QB6lsD,(!1&}8Uֲˊ%el[ZeA#X]/GX(xc"^.Sױ5Rba,I @z:(%$Z$6fj"n+{Z.͡Z_ӶkӈX ?oKO)i!־h<^ҜN"iM(^ۓ? -.gvͽp'<4(T|w ɯ' Dy$A )섌΍o7HG1 D#llFV@yxعwiך쀙_k 8McQ_k޾}M6n}O/!!兜5!G޳n=w=CF^B>"EuF$_?_֌ /_ F{db)j?n`'CQ;V#.kbkdȫOs?Lhh,i=pERpb> rI؇'rͳՐ^~7jXzm4PC~UZ 0PQ(Gq̸ 2B)vV-x9Z}2A0ŞYBrs>CN,PJ)aswE ||xIJx||TE]?}\ג5 emQA3KYc E31";4{ǧ}C{B*Pַ/žu/0w,Mg!c:"Q1m)OO.XAՈ\+OPEiOexqF!o $h_x6C}{1PJm]qzj.Hb aXwzɠE]mh@;N'.> Y]_ܘד e 3IƜ(#'uBzЗTўlMB=#4u'Va{C3*@~$|&=[՝q\dA^$ p3*q >m@*eY(Yu-DzŔc;*|-/ &7<Ɔ3Ȏ"Nf?938 :7 &_>ӆk ض 7cziB? yWrlDg96#%{޿9tbېϝN%dxUB}ǯw~w۴i6hT+2\I>RD*iTMåQ  g(yC3m-f۾Na OdyahP뱮X4ҨmuQrAdloM\K綫#h6r]q)gFHSaZ;9%P)0 PA9Zq4q ۵Yj%˂GE(.rqڰmO,rWpC,; 3v0r K2huFF#C ֐"hVzkhOx1}7 Y`}0ZGV\_}^L?zx5&S2#R7h24M@DhJ 4Y}H kֈ_SeIMhY|]pI t䱊@K4B !f#Makc7;O)両δlq|D3_?0A!Pk )4FxV~$q)iwG- nv!OAi5[_`9bH"'#rхvΉ!TXXa3 @mM3{ 2]H:<;ݚ-0ĥEYe2-dBXS4  7@0&_jG1>ryzz# ӭو"cvș0uԈZ%P!lK߃>-k@b3R/_K7낡$y`f9;&SN磣ai9zK? .ӱ(hlrN@LnO*oyFDSpEע<io\*Y6n \'\.[CY.nulJz,=cE6¦FC*;eފ}#sCRe]sr%*nxzzBMsV,낧7=VO_gHg, 76qFv2huŮ5k- %OJa5 rt  Tס{|*"*u"1C U½)}19B!R7*fpFf1} NFpvS@ByL7W#g)۞uQls3I9q ֚6Kb5!RnD^a2'gn?0k&&-D )<|,7~o{{l)$P77؄ё|ݱ sB\Tu,؄bX NG5I) ko1犊NjVXU"ӌ!NK<7Ze3鰗E]ݔRFBCyiF-hR;Öl2w0Dtc!"9W a=W7ԫHYMϛ~8${Ų.6t%46vgv[5DC]1X3DzN-xW{Ւl-h)!CHth}DdHHK▿hHqY/.N&iYW䒱)+z!aߤ{ 因' w!p ]oscm;֕],jy$CKHlOW}|U)Ұŵdr,ʋ6:%^^מ 9k@" >m@צՍ<4><׌؄&3猟_畊;HSz 5P)"&4C 8lhb}6# vx\~͇EO!X\;kJa4&Rޢ6Jm7OdO5/Gi ̬0;m3籆k!qoI BL+g4SFуv4펖M%& JMeŬzX ڵz@TӬ5*]{Z{c5$7޷>ɧ`裏p>(W3%o22C5eI=$+*R:$a4UJ3qDF@2 Ώov&O-Pʞ9ir7¹bN&zʂFQKV_::nDPMW88BG7*yQx tLq[Lq!@D7[y9Nz qSW ^V[(4,M&rDSԌ9DXǤ9H;h"L<|kh '=F]x~Qw#3``iw؟F6>ۧY 2ܧȿO NDchU|L8aMe&mkkiw2/wœ 'b`uA%h+M(iGP*),Uvi5;Ug ZTLR:v$8QF@K+tM2i aw,y +ksaGh{imyjLDJAS7|ϽZfQx4@TWBj5 \.BՂ:ɡ ZU +` 7i=߰Z E1$cW>"u{KY/̎c6{LG”Ǽ~ FLB9hiG|G!s ٍy!l^9/$Or!U>c(%əچaDN41LSzj`'C^{'wd 26.T("Dn" Ѭ_0Np#Q> r*@[rjRҔ#Awij|@7zֻ75L#$SBM]v_o[||TQC5Q~;j@DZHWZ rԆc?h\<0݈o`R1ԒR4h0aN ]L:4%RZgޑ uuY\{kv-]XՇ.q39j:9 Y⾵ZCFxL(].9M4 ^-Zض+jk,xxxoZ'| @~g]pꁓ9)pD, mv?sO e1i kPፙ)h(/n"R=P xޣ=~ *!wPw#Q^[:G' [C4N0)8|C_Dg X><%(.fj rgӣrp D?G#]3 !Mo& RK-7p̭{N֊\w⠰CLj>s;`06={VYѪVއ  vi\]j *,Ȧ Z,a=kQ+G`=)''Jr8-bi*?>IipmBŵQuN4͡s OCClɽZ +q_+ᩩ ƭ u5 H!$&$"O _E jsBΚAAާ jPRX7x<"?~?_=+ :U2ƾ/O *Ӻ؝kۍ CV TT ƅ~>^Lk݋Lɝ,`SęӼu]QJm-fM t1uWL&4>oa-ljm̮U2/[k9q^4 J>Dk5{nò.Xʂ>o'$BqDv$6! I;XRVtjoXʂ RR G\`je $a)p(|}{@dD=Nz?vA&sW󍃈Ф[߬5S@G֡|b5d;E1nltiBDKSO\di֬9*dLIY!ÆNXLZvc;eWRE+]Cj5+`Bbh qwv1tf"a4ޥ[0NyjyMG6$ˢidQ>R\{z |3eMּUĭx|&MtZร}l&=yc_Ǧ&()|e:eL?d4(|{{O k@Z/k",$ ҏMH}39qcOrvҫ]ϠOĆ$1$~9T)~y@/3 Cq Ń>C܀<TsMc'!ST$]@Ygq,ks kT v_ha i@Sssݏmm&׳ͺb:pDɁY7esŏ$[^}BD֛7;uu41d9:JNKV3s5-")%O?zk7WOW%UL7yl&Q EO@ap뾔9ڤUe',i_pYﰬKn@3,pPʫ4T{u}%06!M菟=UgЄwWDpZ5xq1F$2`'UP%F߮"ɋLNfsH ּRb = (rTpHJ(@׎zHԐDL_XJER(dj雄89ODwb=&JB9#eDq=e_E p?ze!G1zDB!96!G1=yN !_ fAG^Ϛ\7kl,9:Z>.90w`:bW /p1@4=)ƹg:nt藎RoTk $%Sq/J'v] g,Sѭ Õ92C4!Ŭn]Fr`k&UH >:WYG--LdӍSj4O {ݐeUkGN ޾y!ޟۖ\oEϹ|rPJF KmALVQ?|LUMCllWv\6`̴@c BC)޽眽#VVT5W_wgCZ7)" NS֙pFgCKSj6p9p).[ẴP6:L:ial{c^}_Trs` :ီS)pNNz&thոt8h&Ø?R"Eqb= %4 r=o6`ĬCǔíWdJIÛR򿅓=[dX6 K)q)*SZ`^q9c]D4IU-V0FmƷT Zf2_'jbр hM\DiS+/,Z.VԴ 7B*~yC AcdLM&g~01L5J7L#LbLhD;?DMѕ7bKQ|\z,xE아"I&`)"Tɵ*jf5A&^ذGzG6duJ?DMq& ?~kMHKh6m@A%]EB$1NUdG^kF5WmCb&}l6x;ށLJX~LE=]y6Cr_j"5ȴϕFX;%Vo(b9a]Y g^mO69v;CH{9ܺu >&q0lBfurSuVt.&võkwa"L{c4NQqJ0EUJ{7}"PO"S7NM#s 5dŭ8}{n aZPǠ[ePߥϷ]f,r'wȋ_k"aوDiiyhAݶ>g⪥HH\mH.=pJ垠;gW"uK""Č$H3QtyӉnWm(ҡiSS`Ti eSnFJ#h0^ZWEy׻VPyiXѡH*nY#-%謶hI}M1gJPنL, Ɗ *Ƣ)1D0b,$?nqmCu4 A)iݹ`|Jh)O&H7œt%UPRSǚ sI\ 5L1S)mX=I{]#ƀ)G Q-UϓP\~<m-,m(fdI.hH Rx-Т 5!e\%C񵆎kF.kHZ1jՊm>'~ +xpѬ`G}(-.i!9^ Yy]P<޳n[4Z皜)՗P9CxgAhA`W X׼I&;B2AQ39?TۣׄT1vB$#זDʥcHt+mQ6Yj+sR/.> x6@@>4 $_s멵cHSxjN6G420M<MnV3~![ԃ*קtM=i܊X[-R#zvSC% Xgc7e1-KŒHm W/t# SҌ$sC(4:ůǓSbd59!!`<5c\ba:=WaipT b"-1&/'Fc%1q*QB^P5ˉI|ψxߍj+P_i֒w1Y҃Cֱ5$X^ȇ{rfXCv~l~ך%T: o_{lU^Su?7 PPtBt5ѝ=Ќeq_Das_)f0/Cgu.f#7Ǜ ak-Lӿ9kp|Im2JO)~p8TIJ({ӢSh! ÐP=9~:U:f ;dNEB@Qaou*y1볳SLӈA8]_|\.bчaf1ql861RǍӔz CZoDT!i[W[A]-˜_{ Ativʩqܫ$FzՈKlf:<1:OQbqǩ3EZ={4O5%<{3%%JB {r--b'Db'"zB%:TQ%BW)e<к4<PZ^dTș׶5@23}݈(JAs J|<`X!F .ꚽB^+s2yMc ڰf' 6[-,2l:2Y +w5ǹNPj\]DH$h ;䗁-J?cTdmA&_u0O ^Jgj-ېV>ː%:1MȓՄ|0ˌ+u5#kzF 9lѐcұ!xы>vM]#ERdz|F:8ZqWz$Xw2L*fS~`aKH̸R)-✩DH5SН`;=g.Cዾ#┨ܙv. o*:gEf #"(>k>z$#f ] fw֚]fLq=;̉pqq00 =v!ios2Ho#ƀ圍;pͯ`;xbrG{2tyS(Mi\%4b?`l_Ŕf$8i| KHP4npQΧߥ(9P̴Uձt#ipFP墥(F.$,]H2ҌoxKX1$2=ɮ~|+ZtMh$!o>_Nv[dJE7k{XqQ(Y09A`Z]rȐVےu kñ"DKT [0-@J t^8d+ m@QeB!|&-dv.(yvBEX I #esP-P=bSk#-*Eu fɲDoiV|/M5(0UVPz4hFcwV۱ԀI1*I&*MU~iQZیU~n l4-S#0K*%EE2=RC-M, ( i+-"N^WM G]F_}Lh(b&WY7%DE4ezdj&YE~Wh-fhx糋*qE"vlrY4kI#:)bs-^֬BF S u&l Χ{)lMBQ\ߨiEk$h UAr|OZG $[¤+ђHmLKc&Qt8#qug6@Q8H_/`qa䙕/îyo1(DHΰ'h,6$!`똳e!74S} u'ZKwG0*bp6ƈaDwژ:r1|-#v]sm(0w}>vɱJ͐Fk. #ELIM>_~^aB9d8KMHJ|? "PB#lpRxj$#ƜH4 3o$Åf0ՐWA17F^Q̀s 4%ׅiL!wBAHS"V5V n{NF"ZiRi Qe۬TkQ!Y@l)֮:jlu+ 7KRs!`fDV*z-֊avYEp1Lb *$eʄLLB֢k14iR,UYt\HATAJ^>Ʀ*FKU>R쇙ת4-aR\6Yq^0,¨4(buc-#rR^Dɕ$5D>M@ZEf"H7|DP7yablAy*y`@I֩0jtr"n[%\D6qXj*O\,L@Uې͝kR@yL󣓳!i^ϳ3D`& WszlJh!0ɯ]{Dk'p\BMaG>ǼwMӈ۷q5v^n֭[o4=ݦZ>WrFFKt.A@lKU! s2.%#nݺ8Cߕe A'g]8GSO\3 *CHy궈s<F]ܥӺOMmS8⑔T@'mgۄK {"bCϰ2h/.X/ki4T?ofYbDbɵ[BBlſr,;fLP',:<)ġkmt(nU!Zލ8`ŖUeVP5X@R? 2ͳ0Ddt ȲK8$ӄtM~IcƼ)Yj_ɣ3LńA<rYI"Am]WyR6ciFr<(g.Wsur'Z5tiBhX-!&k e J՞buMcrzeڑ_؏YlT|yٿbN yڱʬB[:nTWf=:7ݚNŋ1^)Ϻ/b9pO459+-1F`ʹRSYe7iA&5Ma4 -@AC[R ;tH(b=Pi;Qv bꥡGuҾpinBHŨ&ds)G-L a+J)P/ƱulMxw37Ȓ~/ ;]aHެBe6Q\`4:\JVWif2+\P qdnl0 ] u}P-Ż4pu2s;d%xim69:Es6!yϼhd4aR(4f}sKzm{OIW)ʷ@vU$@ %L&pJ"R^P aJ8VdLm9׍zAyҶV@! /u(K7\C: fȅ|VrߞKPVU:Ht/5C, OkAlY)hPO5ȯS")֢wg/{ w7*mϮ] ݫ-EEC<ЎcIN$ bD*H,$>/y5tRL ZZB1zE+>h{ s)-m)fX3s 4ubƑ*|ը9[dȬ4!T,Ǭ#A@&Ĥ&3MÔ58"rP4b DmT!B}tXA>[q3H!]E6Lu(%mFL:;bHno灤 'Ai n{ BxF߷B)䁜눾'|Hblă /iGc)Vf"th. AD/Źpuͨ wrt۩Shl&G((pkE˥HF;BP T 2E9 ;-:A8ع"?c);JӊֽHA{ʴq4+KZmC,7V$eU?`^Vʜ 7?؞ cEb kiJZ:eVwx5WqZkB֨W6ȤtcRS._FϺVeIjQMr!dU斾5\vPa5؇.cr r )ʂQףLISq,iR;Ɇ[+qyb5IvURcť@QZ?*2PMVhbUm+4jcv$Μ?p&ui @AXFҠdȿ9kE dngy.\MB B8d1F*^Z3OWp^X ;N?J!V˱.%zTD H݈4;o-BDYw,oWJ x_Bo#h_d4^֮ꘛ֊c-6с[1h6ĐwAM"ye͘R[9\ZXcV@.q1D5P s$ NZ0 f41!FLV'#_)LY! crrRpwl tL}a{:=4ou׮_v`KԯfoՋe=hx6ݐXW:\c ]_{$hK;A÷oDLu8!}t=h#b6:qdp!!wAMS9"M˟ރg4&ȍzܓV W}m#^<;t^Oxnn绡l%A űMh zӏtj;⼇2/Yrua}]vdp&bDȋ83FD)ߏTk=SLHj'!*74j46a"QcX7eU"bL|P[WKSw`= Ҹ4c䊂R8瑦IE* >*"yY)ot:v0m{b9P[(S!qD3%QaReF"5 8X9741u rxW#it k:^j<֊wMsԄ|9քkrD׫_:w"o~< RV JMqcYBiM e;\F:f{9 Ko]TV lY IъW"ĚIv<,By=QDqcRyJC>Rykğ\x}4%$"kYK J%6G}#r@9t]o֤`Bt;QT-ӻ$ݼy37Qiµkגzg)s މ#| վa `XW݄jZgH[Xr1;A@ZcAoYuXMi3i`CS`P H՞6Jo']m8ԓaԴ:W`0lTZ&-.^;YS{K:t 9V kMm@lu"2Ҋ׏5Wщh\@h]ls6WIk?&^SD7o[)Y:h%xKq^q+E4&QjazDBBxf;kJK*qۊ7;]i5 AjD.pjht&I&/2t-FDGpUw1=1h ze0q''[51w8P0:߁:R8+}7(ۻ^b1Sυn%l)Lv}jD%AY$x~eZTns}KЬ! n o[⸪ZUa0e-,A.YW\HaėmR{h`DyW.=妃eu Fpۻ(XօK܀ྐW޻O<oS')xۤCr?"wEgW48P\{!Q ѣJ"b9Q J%gvl1fb]艅p*)Z!HEb`41z$HDK.fӰ[0#y6 YM1DVTYS^eԁc!s4^EZ^Qp)cd=̲~5"(WkJzMqR7++g+1I>dPĹE ] 3' sF٥3{yepQt^<Ŝ;LS  1"=# {”zv[%BD]Ei XN,jNgK,1` i0w*hKy$f2z[[?]t]~!FDf u H%+`PIY:#H2FxmOL"pyszN0Oo\O5o6 -ኈ|\_?>|翿wcDgR L_!5+äh()KXk'j!Jt2$4əE<Vr!GX'd"=6^Ľ0{Une1Q;WX#hNpi¦U2mzXj?+igKVB01B\Kn#r ܞB-hPݼFQDRTgz- , (Ve39lIPvDAMjJ`񙗩'Ϛbix+߸gXQȀbɾu[BL&A5 WiH5!kּKh4 H\hڼABl3takn[kcWi)JB qj?4FK6+Ꮛ9lk|YSp鎶1wǵ%ئZ?θ4=J-EN1,; 2;Te}gLTGr4At%F( Ž*:=1yrRFS nȢ*N1 Хa^ehi1`$T@4'ND-n=@6 LA ~ sBy*d1Ze{s07sčEbk._PA!U*Dh6DUɫ^" <퓮$SҠ?'~sF'|1> E9%5E #"TnU $"5 s, R35 [fGXZ7%} - EEFu⺀IC҉ɴ9CY5k¢6Ҙ 5HUSV>w? j8h-מe+4…fPD-YXѥ A" d׌X*cm]1Hlդ[yye&3ٲj/S7Ӝ /p !]wߘ5ðG6n J[l%OT~H-{cֻVw&2AU.yilW)GKI=ΐ5ąc'ɳf-ڵB9jE PJ`=ѠȮG%؛Uk`B21sN#3Xߵ%%"b8hj =:WRΧ?uqۙC?tY'I !$L1I1'BKl0uqRg(ǀ.8ٞ)Bd 82B-jm  >{縎P2$fov3cVrrET (gBוAn8-wAu<_|Oׇ$G3>wsߡb)6gsTIJz3`=+\q"^ٔiATIBL5Fѐd_UӱDh9Gaڜ]l2̘INqaP84-P^kʖv뉥sE㡋~L.Ea޸ { !}|^5-\mnm mBur̦i>L q<ӾtшM:֡WHfD.;oKTu봕u!n{4ƮWlnx/LJIoDa=Y/F=6W}ğOo!Ό#$^x=&jr8M maL. {~OΉ;(A2[dB84 ru.|mY뜌2HFeT'7=-RKc[7 6M ^'uaF3153 {Dzȳ^hnZjS:ޔY@ɐ);5z]7'dBLRc g,6G݄rzTϥc欅rU\0Jg\xɏ>W9-%s 1MGuFRZe 8F+DА%ٱ&dDw@K}=&_h- ֗=hoWAE~ߎ{k n]؂GI\n^EVEȲ{&,}-#LDГA`=rf\Wuons*exBqC1XS")iF ~^4'!C:ly,nl%p)N=M VH;L*Vևr{69)p 8S]']B=&5yl ߅!:cNqYD(;s(ܔl|oc(5YZ$@:]#u1Y ^ۀo l !MQ֔| _^T4"҄׃w';?uC E(Aq)# !.STWNT41!ɢv1u**E=y9 RP rzcn22rHJ1jO\~FRU[!' :;uP#b;BZB$&iH+onB+)H9lQPU֩P ITئPRJA*n@tTg #FLQ)q<Đ4yb_\@l53Ni~v)gqhAz2Kt0V cǼ;|aO4eby(ji:~8 }w7y4s@|v [!#fd)'g 1=:L.ܸtE93w/HP֔PIxl;a=hѓ$ }9p0q W|=xjugӧ}[?Oj̧~=' G$?6-aM>/0]Ss~Q/,̑t[lXSc Mf+{WK3@A8k+髒¤7oZ,c޵/yfl^* to)KbIg~kyl*Z5NhAǕ`SnIC)FlbmL:ٓis'~t t0ARa-V-QS r$gc Pzm2M ӵktqҧr%Չ,ѽ.CEl|0(ZkcU`k[R38X:Q.CDҤ<9؎뵭C #ua7MCZDAj mcp5P T-_ Nu%d`WhZw粶 =L2*d Vd CCKQkl Ʊ 7bILS~z F'F.:Ѱ@aOeEaR7QP:HrrC!iE#صw;8Rzz»a3eTW2-mΡ*Z/LݬeEI< C<qCcL !ֹ́f.hH,uy]؉XϯQO:<_OS|)|m|=#|^wo*CxLB x -gn$)<{_nD !!f2IIq [ɹܜ\6FՓUr0l +ܫfC婴,(W2;`f3i0Cd^}.pvW\<j([EQӸhq: i Y>SK (Ac,234D)M_--AVcUԠzbl˦+7av Ӥ'UBZ4"YcfcK4%msnVȯѱQ> eeǒ 6oѿ&4FС#gCb*vЏ''Icdʟ٪Ujxb#.QTˀ^1Zn;9vYi9'^ 95BOfTKF@';a^)@$M]lDѕRSbuQ^,ʰ<>v)Ce ձmk+hЮ2C0 JBo6jcx܃ ?9ҏNxF%}˿y~5ȮӐɪ T HR(T? >j$D!&nyslf}!S4Y`}*$mbqy"l 58ZH "k_S 6~ OSaKBLDel3G`bI MMiv|\#b}6GE*S5˗vJSw1_P`T2FIcK8_Z)WHɾq[^cdVZAy M} Y^Fu@3C1vq \z57elv1UBdѴ+]Ӭl׶%B\ Z _N9F5$Kh"(eX4VZ!ׁ+IɤyB8M( zFb 0\ (vYKC@C;}BnJ#Ep1Hlqʢu'C$-ByVHd46eT%je}.;UKi%uM(>2^jCUƉ8]-ƈX vKM5{m(9M!}/g]Qd7i_v4~_ _w|8^`|¾璇iQ~|FN[dD#AWt$B;CÑ" Ҕק <@#`ceJ,nBrT'IG'WzF}@l6 dbJKa3z&S OB1{X) XzUzp]WA.[vfB$ŁVm7u'NXb9L0;q5BR#U P-H;mrܲ9saZ+J[PĎ44!KE6!!,T*Mzv'˂ t:Dz^ZpT; \kLQxnsd8qBZ %+ޱnՎiْJtU#ԥupٯN%\D1 !K1UWO&0R3rA`zl5&' b"xfCG u݄a)n I7pu2*i5 fBD$.F'R6{VZT'Ŋv7YJah9wynK~ac.t*.)##?RFaM\m$Bm$qjCQG4y=fbT]#_.C1Ytfw"rDb dËP?=~բBVҢ-X~NMȒ;ٚYED,=k Źcq9"<9f"a{] +Ӽn8}ūyu4zذZ2Ϗd5$UBV I'wgqQ =.:G1d>Njx\B^du]Ǣ0Ki4]tRk"t~ a,hn!LXE+"T*rx@ 8q=z q2obRo/vJCsnfcruCt Зa4vf:^΃?PI !ՙy%rk/|7ihDwop/Z)eTcn&:atPss4hDδy%949taE{)b؈M|&R ߺNbPXB2:Eo0c#UHB(9a3m ޤWs YnJLlťu>56\,veڣDMMA8>%av>chL)Mifh V!FZMM[E9z=zk7.ʯnu[7i%ՁX$d 9j]) g%4cв^Ia; =^EE^z-}}c;A~BQPרW̚vаG۠n=?-}'~ߍ\kDw@-ԢAun8A8wUAD*z_e,fYǿ50 ߼P#.SC5]oB5+v#p-ݳے4!4˿1mbQi[{x;mFZʩ^K*JП|w}Od}q09{79, Ut9f?ld_-#xԤ#P07.Rj}-::XAyF8e Lᬓՙj]=OU-qU8-1b^ڞfxH Ly̙N}Ic 梅QЌ4q#Ix?uDŽ$|ّ˲>R1)Z"vSr!SY898 8Ȟ2P |gqbvXԘ8@ ~zoLrW/ N{sq%RSqY8N u}%'#tw#xz}uO7>nw?6I?myZtd3T4#+\ 0V88\ӄHqqL+DÍ{$:tU(=f4peqKDeQ+Rn2 ʋsՂ>O((E@vHv{A}C+"oja,cR8pyڢ*iP9GiD,h60 t2Ѕ-YFXd*:\<ͩa Pul 0hVVu4 ۈѷM?%שP->?})=/y x33z44}}{K'*M)lKK{]jH֜x MɝىSWj9aTr+d'1^F1pj^Z_(H;!c=Ol PrTH++Ι=){sn8N5q~$g]fyON|R%I=8̇+kÀ>h|4b lܾ} Q%1n<}BzOSQ_'pl6d89ق+D 1 Y\=f6\h]cn#Ā&0=B$'wd̄Աh m:s/9QΆN[]U6"k_g`|]\vs})Oҽ$u'6%hx 0r42-v)ħ,Eŷ^ OK*v+٤jOun8ˢ-St˦H |aƦӒUii^9VqO=v2ǑuN7I0Ղq&>1bxif`L|qtY <*digRrFdBsXXұLnѓ]kI?r1x2hYkZ~㋿K◼0I &M&p{ŵs||}.7_~wKW eWKZa\vԬw_uffmVhѸT6̅s:/-jFu{li1QZ$LwkVnSɿt0gDSִBΌB6쑹Pb葦 MU4*]ӡZ8(8^Br.Dr3|Bz!WD-)ѥEm:߁x{itvvu8?O]ާiIDAT1SXS{^;6 6À.;pض9?BsBՂ<]aaq2./XV #ڐĐ} ժr)kDbE<{'p6#ۼPɴS̚kM NW9ɹwo%?\>(̜2RD@\͇hCZ"&e5#^:kYe|0]%EW?{t}uO ٤[n_\༡n7[8|| /w3-k5{cMy[Bn>~ϸI~Eli'9#_mٙǯ m #ai\B̌S|_Kx];0lw0`zt}-mUnO4$^ktAwOGEoz\dwcIGҚ5 5|?@#8@ x yrhhU) ĸ5췺F >W.a ͊&tNo#=-Re%f?Wkg==-D]שHUKCy,V-#NNO_~5' 16&ĕoy &2r^<7ٸ+#/50)6Zi2GZVUgBAXFT^&*965D$TP]rm4p:K6}+uIcnHJCK!9JX8IkHDK+}KX JFwjD#.TVCEx9GЃ:){q#' b0*S=r=CPk!4ABDl2tAPu]N=c@r,Iu[V$]ϺiU?='~0 *"`(t*XZd,ꆂh6DiBy=xydC --)lp"fcL̒Ci(@ED}a6znZg@3Yl)Y$aVEX3BA8 S>G9e1\yh֍j-MiA*@}W uNrZpp[m;C&׫hO3 }㱼Sc9m! {|^g[8&GJ0 q.zy_*\v~'~|MXoZD6!t#K_0`ڦv%"ƺPKe 6OxNj{uJҨEλk5fLLW;Rn+1'c*0 |^OyEO״Ǥ Eʤ0d.MJ(hZF7b)5#hn߾ܧZ>fd4rY {j]]eskei {ql0:H(r}o;eO2:A\j^p q̌vӓ3\ ㆺ4"fFd%d$.jgZ$ fS5AotU5^jӰ '퇛blB>kDl 6X RfM`C('%K5:^>f[X\v yIS??o-{;-v?ȱ5|} N'8;=)N[lafi7SA]v7r%Js0Ol_/^}7"yfI'}bHnO{:*Cwy>K0LGiI=MS8CD "0&VQ}Em=Bnhp q9xQ"p[<^6mwx6zjDD`4SiPm ecF$XsB7W,M֊sMqh~n*iXh׮nnxhP"vqI1[K,c[i]ZD,6#1tS? |Am̭ tW3B^CpwKO|9#-5 V0NN899S\v64ֲl !&LSACNSA9z.g~+-=߶ 5 1i.kB=y]DSķ6zUь|%d~LPn4x+D0{_]%ߚ:=CCl,QُTeDF2Vw(V}W5͑'fw]J ѠQ jɸ5 c $hOMp@&B98tܚ2j@9<9I H$] `cz&|ic#FfPp~~EfHK"gs3MPCD#GJw>Cu:nnw(666ݦP 7r(N9?"Cd{oMۈz{}8'X+0 #/tucX8  Gp.HWn|cNݶ\8Vt{iJ׽mp7GN'#V m#BJ ,)Ÿ )7i PymsE3 a{FjjJ< <]pu0R\lm4lΖ0m*PK ZqOqR&,M֌gJݢ ?gg𾈮 "|>y/x/{;k'bo^ӓ\v gggnZ(j!1p 6u}:5HCMB!7}Sh>K'-T i]n\i4eOѩ*#c% &LՈeqCR#i|| edG Uv1;OQ~h$sq\&3S=D)X9bCiH ^<ŏymY7I91 e8 ZϨGjlSzsY+R @d@3NOO v;]wkff{l6[8xl{0NYe7Ε _GeO"x2!2]E3 pp%4w)`%G뷮{ZS:c,FU:+Wmj֬bIAz"#|{B4d^dSP˨ :Fl9;&1d$G&`Y#]!;D]aNF9X4i%.hF!f=_4 TAkHhˁ]WaUbG6M&.. kDafAol"d|ak P{PA, e.!&py)L],/[v83lq 3 e ҨTqY7&S6I<ۿȱ[ o u*{ˮXq” ګߕuAB8*9ӇDbu^0;U%3H;2C yժ9YU sU&mvx3MqQ,9R-Z*H_7>lvWcm6^pRڈUnBB%}DХb_)5M/~|Z)CEP"6x9䣽-جra18 UF Tai9 X>RYLV3JpiܲNlyeߠc0C7U R^a%{^}Auݮ‰qH81سiJ{%)ur ԼL:9j'KMuIZׄL Xw3Gt}{I$ؠw]aY82ZY%T5kyUC{pN'x<_#fLUڢֺ:`q3浘cBK˜~0""K_?%\?8*/NяTN9ǢQeCbun-`f Ϝ$vR|lkg s@ckS5$`ARwNgHƺ]C]#ySxK+,UpM?O|17cE#C2 w=MӸjl1<AbZ<- K|x=|.x]h8niG Y(r,kKB%GibddsYKDzڐ^ZEG2rO+tH-1ú&/W-ozS2>W|>?g m{j2kN`PNX <82|Lh!qʖ^s @='?/.6"KP'`r?g8ڵQ<&냀\˺|4At 3fF xJ_3'PmZ3$<֠6-:[Ss,vJCZs:}-`3pq3"^ϑ=Ksj ̀.7%:k&̕}ҩR{(_:u,H!p to[E=}{|BB.=~S}w>+KLAe_iJ!C\\a3M>ւ}C˜jBk 3Úo q$KH.%Oȴ`j{y|}6"K_O1cctP 닳5[^R`ƅm/9n҈H.~3 )_K-PhM`l6i:ht)~)oC3/v/EH)tYj$0q_c%4Q&15ꫠX`, #?IE}κ*c,\Om O*0vJ4Ee‹wG *h9k {`D`7q^x-iDƬƪEbSՎVz B+g}Y!]Ag2Y~HrҼ֨{;O^p\ pB ŒWs&"if}߃!!(eMBndO>77*`帺'ʄX!d;aUc^|'.RFEi+V_BR,-7;|fy֕NY@ض$VB/1MmB?]ES41Oq{T V.':yrHkDadxNJ,J*W̴@G#bsb}l5 K.mˆ =`AVbgi'D\F%rMd^<#!3 QҹEmf8E/xǽW~y>Y}9Wd޳3 }X({-tS)9 Q'wt]nDm{#?hĕnlF8u}W"58;5$ {|G𑛇tF|6NU_!5тfEkF0seo4Igj炨>өVX;HuO(ѳ #)*%0V6_1\.%*1^a E,dqCng5C싅\(۷ot}BBFiP%EhT!lf9BjhxE8`}ߣ{} nqLv&O^u~6WUn,1ͯte8=&YPpH){ǻ#~z$>W{0=PERIUXuX `%]W*+z5k$F q>5$v4ї}ݪr\[b(oE- 6nyژ4!)&NbmZjْ{-w@Ux6I:/$!=VVЖ TA YI2|P֙f9Wv S\Ӽੳh&Ԃ ?v͸ 񚀽 [RʤQc'ղ>{V)D4 1SF,b!,xEp[fJfvdFM Gl|_ywd<Mɫll8v0m@|6+'RM13#zΥw~ZH&|??Vפ5#'}>g!,yA (S;Űi}ag~x \"TD4u*OTdH>`d;WQEV? $Gܴҩ%X"NA冢b{LK&0&)U$f#k@e$FZِ!8\uX aRQw Nl "]W…Aqq\E.O~T5ktS*mPͻ4PΥO)Do6ۓ3|wYqm{Z]R5P>W&X{v]cCdcgo?Ԭޚ#'~[#24ʤ꜕vk+ޔ! O!D~B ]\`V鹦} <;Λ.`e2Q6P6La0s%"w|@]ؓdt)5-M)T{064 9?4QMV$ijZbn+H%)URp]'S#W {)% Wi@G]^h\A\6{cEHE7"䙔\&vK PSIRM}0L_ K޶"7K_ j(WX2ri\WkuTvoh'c'Ơ<â#3O2C̀awߍ!k6V7kluX,B+J+Z"l(QH(:Vq"s@eڱ[ n|rYɯ] %4>6H%:%PoؼL|P; \WK@jy)h&ȉu3)^bQUf*Z qKW<kl>%gRtj4gF#Ӧ/2={sG)Ǩh81iOjf[nwA6&5Qa4f Dq'nbzn7"pJ\' 6S`$w)qr" ]& @ԓ-&5Dt=}Nw'8q9G9Y9BJz\gtƁ+7$bkiRa{:_53uO9*5"?[C#h4%ye+jU!Vul~E:Es Cz)Y@*j25-c<BW:fT4M<1F]_P$f2t).TłR=|l"rשI97w^]R#U|O,䃡Qr?aۤt45CjVpD3+WFNy@8jwJ"uZkԬGS)L,VpY˸$&+'BDA9N(|$Ia}eF5-K.ȿNT&S OU>KI7uZ.+E7])e,,~^.dӁ) <*{6z)""KEN kliY') ,Mt4BaRAk(Di'By{w8]4־q3Sx؄&v,T 0`p?ij\mo{ʄ}?K_j Qd0 H ?3?C=>|ٗ}nܸQ5lhEӀrQ݈~{Q# ɓk=<_@7#]&q+O,;@BקFpu)vcScsad*\b#h9j֒d}6M Y)>nVfؒlʨ0JjHfޥ}cluE5/1Q5%=}e%݇lpqSCo[u><:\eWyvUQ\Z]L?Šw=0?ZK i+c( ف$Sr^),A:..t>yA߃ԫ9ۘKف }p8|<ίz7"߉{ oxqrrRl3m߆oo~=ynH\UoMv9'׮-YOx;Λ<( yZV%e3\U;H;aE".[`$2h\ѯUT2W٠ɗ:q|xuG2ԑ<āqa^yp1]4i-;xz2+q 9q<3iKܿ-IiAG7ƀ0>f)o0:%8kVCzwźH He,dH5N _d4!:; ;ܵt zt17+J:<^ n_/FTODՊ!5=o׿)EFF'~|7H $'[n,4q*V|~✎JCKsITZttƪtÙm[Pf-vJbլ'HMe_&{XSUy3 !Sr VNfFA4 `ȔPޓB8tէE'PQf2q2龎#5 anSP5(>b7_ȈX6|>_0 ~:a| vٰ-oV]kZ{в&R&W\c(ZcDw99vnO3MWKXIڵ8mklV"sAMs׻8svQ0sU6԰:BBKQ=qBլ5}8 =X tZ5xbk|bR6ǰhJ"s \- |%:m>DfY~HʼnU[R,t K,G{ai1&m LA8s7]!Iu=Yfi]\iܸhWz'T+%|6u.Z9tpkq٠ǵ$Cbl90ͬ ܌<9tWzF_" ~鑷kߊog}ț'6V݅15!>Di9Dq7S0CjduM7ZM;Žr7^,xӅo^л& T8mBr"i6f6P[֏Aaȓ.>v,|]z4 a#"XnH,T&.vC)Xgq.Shb,!g+Y.{Ó2:h;ɻь3tLom؛dxo|C,s@:YS.fSce uK`ZX7u._^5"*|PߎC=ׯڵk{q=ě&oPy&{Fyksf%eLs[ڠ#i4A*du]815]qy`!G)EۗTw8djL ѓpLӀ)547rH4c%Ŋ{KX1Xś1i w@e"ݱ+Lu!vBzX-2k^&z S?LE]'" gHNv.v(MSF3_jy͛ "Ԯ+]Z:]xYC{黪RJ''9n=Ww(6__3w}xg?s7{pG|w}|9C?&dD{Ǿ)ODabž//>s=QQL|ʧ| ==9*/C?Cß B-}|ڈ|炑#dpVƊwלEsil~.0[*UbXe3 l#տJ&o.7@k+XD`_Td2$BWB^1[˾R2v TUrW1LyKi |~ݐl{g 1eD~ꌙ(]~A냲ϗ0M4-A=ӥyﰻ8q@^iaD^1d vBм2, %vyq9_,^GC$\' |2be"3SRϱ`KN4 *hHn!z !4afNb'?p[?ڏ⛞r6#>iHɓֈ7/R~GF6q PgZqˆx8O$+p=$߭VjK*GYGmud;-2ks8!v`D!O=ީp I%ˡ9!7zr97?!ywSЛ-"6r 9j&E,ʕR4NR%9Iphe?jim}d&E*N%rM.2Pal7f% 7F Q35B!x3K[$E@J-gi\*((Ed.iu?Eׯ| э77n!~}=w|||^W}kC _Ỿ;WYC?Vd3 3WFkPg@x^`3,hgdnGha msrՐ]h?J@F*ٻJ\;z˞5eڹ0Bm6eSc[kV2^|,txL!];r05R*bAiZ]ۍvMnyN4*ДsdhSDdzB U\H>1&;qSO:M4!(7M6HLu}a*|]j,e&Nj@6K}<&1r#pk@8uA{o_/Nj?fu@.%9/DO<[SsH͂sȖbk|E^Ӵ\Y"Z7M ?-@G)  ӃOZl_o{QbWT-*eQi* W.>$:~y:4%u3Uk WpWfJ.Li b0.NP* E^őŕnJ.5.d}`S!c EF) ug ^agХ-ptWYPUgתՋ[ո5_oƷ}۷ <^WUznܸwxߨ%Ƨ{u}4ap^җ?/"M?eqno+qms=x _//}ozӛ_%=n83C?c??Yuix`20nsN_)祿?V Kb###5lnaV?yg-j܂wY`U۷y9 z'̠|>4s)R*{ywp(Bf%]”s;c7K.iy%?OU! I I2_n}htxFjRqU]33: 8$D2YIQݺ: ̢5,4e34.iLC5tTFNqmlp؏l->ܸq#b+x;f|0'~st]~]כ<{?ykW{O4_un޼Yc~>T[/ KL霾T|q38_(x1- P-b\DYl(Tl8jP_(gV82#><֤07SA CYS+xYaа]n|0f#g5*n@J_/G J 2Ċ9R q\Q 9i&"J9VGn]%PK> MjPFE E "KW0bHdP4Af)D֘(5fe嫈H~uzs!9fMSx8`!3X8^X#k>$\iTɐR$TH`\3kI F%#4:8Iڈ4!5Gi d8Y29$X _g޿6*NkQ%OnNDAƿ-'@N>m\?Jqn95lPk%m tmDlA ^bdF+P2Ы$[*!lrZ3x1Eb 祬 _ B߸*s i//=( O?_s\tArS`?x!-_SXu"w7x3?>s>9O~G~o}[>(n߾Pq׾~G4++tj]Ld3;_]zVTX)KDo\6^vhL5b&G$d^AՌXՖsޠB1KQ)eK\zlrYg׮,2ŝ4Qw9"o -^Fk^iN)3Ktm4:x:#DwKϪ\4snx<AQ8“)iϜB/.0ƀ~w湈qL}pȽ w'P(DE:|p̙d'u+7t hD [lBKujj$B\ngj/9iV#8vII#-lk*\TԤ&xZZDD5+Uu]؅blwem*DApVw.YIrdt}W=kBYv-d,ih;bDЦ1FCM8FO"9Z}ϭs U+ܫ!Dž>Xv,@OkR!~1F<4~  mD>?0OO]znݺ~ o-wo~5c9y~ tN1M߄vׯ>^W9ɟOOmo{G[[fcxHQ6Y ΢6qi /h.ocdnR nZ`]HK5uC#v'T&%zj껋MTA 2f)]C\ȉً1L3HBktiiYHWC#G/9o65JoB*ͼa =u+۫!5=}ߧ= 5H*;FS (avSÑ"^l7 w89SseDpp<3Է6˄NFb ֹl\BP!dgSc !G? nAi]cL')FM5jn:%kaI3t+96O:q/gpML~{hsߦX(=Ŧ^LJ)"f<-WNVK^#G* )+BqiА䞵g8k yZ!ԡDEB7@ OI+ fTzRhhqE%j7r*mn0RD́kegJv.MXAE3{`j圪"U%IΕs+ ϣOd8i@P$mP̽оBwi$%T d'DøHHIJ3UtJΙR[eafW,Hi~=cy2)C{\\\஻vō7Bmo{R||f <:,}ýP־>/в_+ wu^|'|nuOO?0n޼yGM|U@(͵29WCi46,n[ôarY TKӲ=< >Bi! +?&x_E`MviD.- - %JIJ>AX<;C9V6~Tӟ +Vsn ,΃A5Eɏ #y/ρ!θ6W !M  '6CN9aɀ&pHDO!Áqq=cǒA{$eݨyЌ7jօTk\DCv9z3tӸ!ˌ=[j2Dh-34ved'濃}G`8M͈i9:!0ED4Soojk2!]]|PwmdUzE[UIVw*{% 6&)r':td.-h\!R5MLH,!`̊^|*xx0r~(-pߋ-x_wx#h36(Y-R}W.Ei*v?ji;I']f3X`\:ܩJVʖJxԠdϐ^C?{];:=Y Znm 7K&5QT5x, tHN:e+8j“/46 쓘 Ѻ(5ǒ^B\$սhc"i=|o|lvҝOΰܼy3 0!=#0^΁HRMwkݤaAl%;rdMI1qi7ufSiPJׂot̴b`B eŘ^X>[;LA {{W]lDF΅Ҧ8`,i!'<)OjcOɊW]2A`sI/+DE1ÐY\IKa Yw:f|Cufcz/$b}T^=%Q63{|1tC]QrNnZ_\90)BA3wp~HB69{X uly,$pN{]r^^ 'Ŕ!)$g?i8Z3G+Gn84-]9ct>9"e7,|wCMan8cruư\'ٞ/ďdm"|.Y0)SHo pbpYBC6mސ_OV7n0yHsE a:"5>OCH|ZBe,i=da'-9~0 xNEJexjݹ9&B(*~ 5/dbUUd}M*J`b)hmHG砺=MҖkGR`a-x8ggkW[nޠmn޼i(7#/9wk~'txF:|ijڈ|W{o.XBk_n7o|?0}Q<8??'C*jTrEhm6z׻>dhitxë}ՠ6CZ3 el־':>^8ls)iK/ =.Ӻ(4&:fOdH0t-*#HP1AQ lݾ,%#'/*%Y6_2t=[F9,8.i18l6zy(?G!Y %9"Zv]L %2K\y .;SR6nNoû* JDSgA8Rmn08EA-iRsSDi){al68 pnݮPbF,4 @\ĹcJdT+2l>#'1ړ4pzBW '>qZ=0MO6{2u^;"UqRpHn8ItHΗf))c ?s?k׮a À~ٟ{^R,@24lLJM"1)iCl4Q*e! @&ABxqZs1z}ǘsΉW"nk^{=s=qlgSsfScyr_eKy_]<Ν;ܽ{W7xk?y󛍛\7g xŢ--xDZLIyB...J xNON]uvFcP/A> dmBO3ʤ{:3[n֮6T)V\t`C7O ZPQwrI&[/fͯͅ4MdH]J8a2!GP\]B*md4%Ҧ[%#&L<Y':> 9,%0!Q3~""n)F5A-Q')i0yZBnyͻ^XfѾT ~"m81iY+lM^]3S,64e( ίCEY!1ԃ@4H&tq,)4ڤacM•q E;En}ԱЅ B@&Wfnjf0/al5GPxhcX7\I30oxvXqt[b5/1Dф/ `RnsXe]PQT/s2w b4k,+֕X/ nc+ǡ)߱^X߯͆o{b6m鋌nZ `fl7T!s韎'|x'JXQ/a\-prz,8NY7?uZ<ϸ½{MBfO L*)hck}ŵ4:֮ZH0 7֍uM4wl*iej{3l L^ˆ*ϯ '.OSB6ZLd-ZZÀtj&:>5%0/ )*=Li&̇c^d$[l*3ilX, n Zg7*f~- ba *14+6MzXA_G{c2 h1` & U02mqv0a+V-t,=ײft^P!yT?2@4&ɽ+O~x"?N 0 A<<(n-=ܣG.k`F/, -c/xmZEtdOFt}In{U ~(lxOjTD7in;)W/3>p}}2Y 5oPuq3pyy^ |899}QlP97Dre9..q}}%bT] X~ޠyv2K>X|be_'ӐCnўK ѝJOW:^'Ui@Pfbb`iV3Kvݺ\B!m԰"*}iQY&\8I*'Uغq\S}77ZMjM`sɾTupƝEwȬLuJ)8>X2ʫ`8iJQx]¬kP `a~^5sJR1ՑrY/ʩ%I]"ix0MRcYkM,T ;G@E+L# B9ƚSf4P뫾Q^>@d~(*V#Zw)\m~=6 VA&jV !p9Sa&\&VXjlqq?wAh\z[nyh'')նƊ5;B!{6y4Ó;.T,.UYKWn2Je"1+3LM]8̐R'h5ަs@nC8. NY~ϸ1߰KYvz_j0r|~/puuUh֮\,Op(1&Qjr"n$7syy}nǘ .//puuy!P); ,׽u57D `CIyLDqį=G4>7Bh랥2Ug4Gc">48,׮+ zgM+a޷Da;n iAͅ|sU;- a%PE۔kSL=4 u젆b9ADߢ"߼5? Px 3 戤{Frދnn쫨 ڱWLc _!qH(tE,Gͦl6MH6w-3%LIrJBѾq,=aCD)`~vvRRtmXEv?%tN,>/bqrKkhbfX^"M1XWEs:PH ]'U^VNLzUk"S6LNJ{Z)st[jV'ӍVUR3 x 8y*(]&9Dɯqs` Ġ~K8?9MFץݽ> V?>R[+w. P)n͖mbpms-t~4|(ttFd/-_瀞!__+\^^WiIT&̀f"cw "P h@Db+m b50tg dauS5*L7f:7x1[k+SfY@բP-W(>!=` X&:7*^En9zSKFjE6t6JW-͟t*^SS^~mE +H%')Ʈdbfh?Ay.+e69;tE!`Te8:A1Durxl Qb fѩꞹ9TbyM`G>SL˵4MB"q+-YH&48lqk{*8Le֖DdЧBdi]N_lKR 'Di(t{|m(b@]5+BD*;BtN[4j1Fvt.e,\@ 鳛IN5~[!4vѳVT/b&T:&UbC`NpH::݈#BRe2v!8'"TOqrMB…*ǟAC5)Bv%ݙYs?0e~6b4$"E*%SMn9"v#:)`2l~75x䛬=VGd>{^ajS ısD̙NfDt*^/SJFQih.sU&V/MC.?X ( qk["8__Tw(1R:h~'5K#E(XRKǭLsg,A0`g8rCy,s ir0nN~%j%3D&#xt-hIףNJc'0)^9%wq!< ꊕJ>92-U sv*{mKJM$Lҧ(nI XJ5G㎅oS ",c<.0`%vTT)Ziv.GDiXs:HQ7vHs,qiʆf*ӪރW΃ _Zl2(屴!"R`4@:;qh%9:ClGPn1Amlk9Lڨm/\ ,.4 *PG_[4A]&40%>My#ѲQ[z4*Ԥ o/4M8=6W|Wkk 59W24BZG8~_e_['~ga`Z;u߫^ |Qq2yx?~Œw;03+bXocP}k`z wE'0\=_wR9/͞XDA6a]}Ι1 H"Rj ,  n,)ekʱ6蛋vnlf5/3A?FJ Qa9?tXJZxa7]$j1A[C}t(u4_مQ&!"L]*/][+>؅k5bUR@K:&-|^?seQR >=^w$|L=(XtujeEm08y1sg9[UwӲՍ9Sϥhxö:n^UB]le4=$?`$vGinmJU?耠URxn?zI5C8կv|{>s8kh{˿/0N ۑ1 j ~gO_Y/x͟Nxcݱ:w|y/|_`w3޽{0#inwb{rzH70Oq$c8xG8۾?gs?op}uSh/?=tr+*ip"frӵv.ͦd)v?9xb/ӌ]_|x2ޏ0?U3fҐ#\> o*8bip4ySW)dyqLzw碾YS}~h/u'k Y c² pΔMk^'Axg~( rHJYd)&)Qi^)& ~D0:5/wj,c@nO Eۜ34{?H;i͕`X^ݮ\ Ю \`9΀t\op=45&ˍ>jJ;8K76ZZ$}K"d/(c wʣ&&9Vɦ-Ԙ !tddh].O^8j"%_+*c^T'vEdՖπfs\^dՕùfaϏ3 .@03>wqzzyŢ"=}ز8Ѳ>ap0/)#\=S@gp2FnN䷼36bdd~zi{qh";6-{L!hLiBv0L,q)3=ܺI4_6#'|&՚P9SI*55үE Pf@J%0ĭj}:CK& >gN`O1)̕= T=uǴ1J)wA@֨-q"vN *M6grN& ZffvM7Brf=V1] $ [Q.f3B_ѹ2<MH_gJ_E;&l]1RXP˚/* DډI@Ntd%{O8(֚ z4~_%'9_O?oo%pn2Nx|מV84cs>7^4,ϼ`3YiH57 lW*W?s[BJG]ODY@Rtn`#dfl` l4yS߈OA9yc\{mCFô{XB\,t@RdPjDAp hA j6mMi h1z"iջϵv".eQVΩzq"^F^BέPFl\$YhLۅd%^LH5~EobiGN;*-iǡan*v)cGG\h*SIy00j6L^DԉԽ$Q+eS6EcdDp܅,HXz @nJiLq쭼/~nYE;wz苾;3 8wOW)p̠0Oqy \^;7MH%X؟4Sk'& L›^C@[&_]_7C@f,\av`ADN{7.) hRw\~>hWj,-:ȶM[0"="\Z?zubNt22]ee1ͬи :hą1`}1OEW?pz(f<@dD/$w}'~[ނql\ZO$|}K$fN6 p=&4Wsޥפo3\|^ǫ7d .@ EPn ˧w?[oA| D[3 un7v%vH9if8Rj l:50v bݲ'-_|n`ϫ+<77f{ڤsj3֎1VoB 7kW߼V* L#k)*LbcB5m>IK&g47A5Zg<:ùA],K9J qbRT7Kœۍ6R$䦨W,Y ޔ)Fsf)a[Wr1LӌNN6`8y`wvY0q= : .`s[N~7|NAIff^Ri< Ɛ/ 9lY&:VC 9IW 7 JI`gpI"VOꞂnP I:i*2JT,lhJ\E(}DH]j1ӹ`8qwZ ba:#o;a(~t7zjy]lFAtꐱ:MbiO&hWfub&6n)0nFd1\DT4/{0jTAdԝJ:4(QYR7G(1$KG3V/Cn@o.o"I}]²PGH<#z~:Ї\_0XS Y+ws8|R4M |3VX{br&[;f-dKx!yë[Fxy7m?5R)_PT#u5Lz?њ+.KSt!QD^B G`o09j|)<أՆ\KPMŽ4f˫TާC`diW6w^$tNXE%{d-N#EY)QDZXo g:@fύ%lPQwIXb$b-'L}p*4ᅬ50D]KoFxIv A6K _\9?<hEl##xݸ2 ~@tP"I:d4%dpw6{&O\tϓԠzqhka9n/lGgOHY(RdP4N_o]X޴gSd,Bk44^bDfamt,[+JWPFV+Ot;L1[LlHx V߾Sϱp k8/LnsW4v^qq;wM`&v^:vf|yBvBB:֗?Lx#h^a1y7į1>~ Ay"ܺƻcY*/cU$|oIFPۧQ`#9ѷhJc#Py$s{AI'vNBbnqK?cRMI./:L:?h*@&ؓB.9CZ T'ڨ{Ҫxm}qE-urm+M\yݪF^i*.k,Rjq%|wp&Or)@Pdw\{Qf\[Z̪ĸf{8~A!cH`DfP'k?\NZĔ0xI'! P ,HG\mg8Q"78‘4;F”TH!NBCtD0Q♱l0]\og[RJ O 36 k4l`@3HH )a'5PN9 DMt"©9j g_&E]bqxs&_]Z$(97N&ZދB*#QhhYFVQFE%VB?.+le]y6e5e+wu%I@ LAB' ۊm}`S- f²', !X5Ri3:羳 i ,ET)>j:t괓+`i&Ah9CZ"2K@#џy.޾oU1͟wUI!=_?FxlOKZŻ޹!ob›~ y78MZ6kwxWDjR̤5/m4~?p̳pu |+^;Rrb[ \Y ն7;h)/'|iǃRy1\J=){'`p+ÓڵoxE#7dˠt"wrԮYpP9:H^S_֖>+^];Iy_u#wE;uދ؝RR 6X–NB2{ffDԦ/IILJ8EBubD,!! ;Ƭ$O)!;b=:&/E Pqe4٬msŎ;`%ؕ9?H6#𲗾By٘-C1YgwӕRAt #x U $x/#gԌBA"B.Ͱ?PXbk v*7se,Yu,TT#buXᎫKRj s.)ZaއR-U@fNJ)ƭx;R2>xQVܞ'/Pg᏿f|/&|O1]NEvӈ7NAGJj>b>*|6Y#~A(X&ȴл HVk}E=/sH4><4sY\t{ /1Y(u@^7VJ=XFʦNHck5 X𑴮Sk@ ³e~x}!7)җ{ށw~yܾ&\? /lPCtWx H~|k 09q8\49M"Swd·8c#F>1y$hH$6J5ƈBo*1S}ZC_WW{ia֘mn"4 tز{rj|ʇF74)x56p9Gn)Brm(X􂝽yvBN;`D@' Q)u9SKQ,`Y'viS*)\El>~^a+kFYm su*Sr 1qʮw A1L.F͞}YburB%/[erTb#1FM| ./n4%I-UߧXaTTg1~)t;]b'4lKһIi |5Xczq5"ku-2E,tb`h}bZS9@Ac"qRQzJGL,J&\:mۄ±"y4kLAYTZ+rpq)T/E{(VIZI.)[AI-u)6+虻B1;x)京D8B(-&MeI|#g1Ԛ~2woMbh΁_I\G:_ |0.gTŕ*vT ŊC!᷽@v.Z፬l$nmo, 4^S/iGZ{݄fnN{v-]{]ԬA5~ui'^ڛlZ*!WMyh>%*M:qݢr IXlaJ憇o% Q{`%['Ch]Q]ӳoLI36}LWg~t0' 0`7M,qX4"ڟ"B6"Pܻȹ藁=ΣɫKށy<]Z#$`dzf#, x`65؉Hg`Dp_tu8\!Mp)G "yͮs A"x?6b|"NDG @t#4n>VѺ "%͗)H;,Bwq5 Ԃ"Zx.9=%/ٝLa@_0x/.6%+;`)YDOqմU0Ea@\:0֛ҔSpQiujScd2'XPavV+wU h!^6 F^&0͖lրvװcXH7 > (QbDH}9R{]5qv9ԏzsעue&vaDί%^D5=OIܾExןA_sb_C@v-5f#?(47`> ^u9XиMW1wNkoK)i/С#,Ao*"'AC1 '! (1h S( Γ"e03)g/=Q'^6.,r\(e`Ֆ.jV^ c,~[[P`i^v|ciDT,Z bfզ- ܸ٨Mf!`b/1dD4* N! >f(BR?rMJʿ۳Nzats}νӞ9Y? Ek4csH,X <կ7 譟=u8yIU)-i_F+Qdov>qWZĜm:6'77Vhaa?c>Tx%'~pCu\Z8nL E^8Zܵ. [3l=mS_{\{β猐݆ 9gR^0hF^jqy :6 q19wj$ypz-mV' zF'Z)ɸ:0n6v>8 QԇaPC}!0t܂iDzpp^|M^L"xxx ;;$ 78LJ#N}1BYjav,a0M| Y g\$T)3ׯPa*`9+~EHUMWJnͩLZfS9סыNDS^CNwMvkFŊ̺`oW:r{; F4 ʀ"ܭ+rX#~ӝc0ca F?Zep_9wLLyWft,eeqH5qeol|ENKd nۼ>oD a#`}C[boN_B N(wGND^Q/tϴȷ1ֵ!kUV#?+xoK`NFjmB]Z<)H J2m6Aa5%tdĺ{{QSi 'އ\J߂Oï/O\|.Xr?wGGZfZ5$XAP7\s}7=ڔd2HaajUP5ix]H,{l{^Eĉ^cЭ4mHast>!FL /C4W*NCdYnriң(ӲrҼadnvk4Tx+Ͳ<\eWio 9ㅙűP4;?@6/..)|9l69o}ݏ.di1Ms ,5*Ծ|EQR4P% w]4GDSD|6rhT.V yWzfs#@ R'phJbc.3`JÕD6:ٯ椼9ĘV@DxqP@UZ},$"tt?B;׆(ڏdvPxx .[ 23*9oSOvʼX#𚓕т~=aQ Zay"ILQWdZSMi(º$1/oEjad qsNG3M@s[c$?f3.+Bٱ«Fj|+ 4@3@n./|M:|pd1 uR7_z`ϩe-}#cb: :ͅ:Q>=>: wη>buӇ0FCݨHКJeP!ii후:A:V&#:nhQM#khQCEF\e]$ƟS )*O69D0Du)Ʃɪ-3֩B>Es2p8iP)Qi#1d-c7Pm4ɲxcJ! 49lO6Q>DN3ܘ~F6? ꆥtbݫWY_r}uUʧgcw=k frNT6(SvSU v^&^D JӭHкF+XA&0έ6?q\ Elz{ 7(d5j׻|, &du*9tF[?t_ቋ}n)QM5.sY(gk.*}pc\r𽸃,ZP(#҉P,[qAjk,R"+@ dV^ g66=N[-rf /&@ je>H#?5Q]c!cf .b1~>+V9i.X^AY2dHq<3>%+zз`V膂u:bގOxl0> ;ş]=o!>MFMAo8f%C?Dp'#w *WOTChG*5RܶL`ՙ܋L5kD,m67%ay ڬ*F(ugt!TLerD`×\ 376cq 2c$My6,D rvwޑduY)49r6 :cc;_r 2ֽ H=IuǪhJYiwF bYJpuOc1UJ7F0iHj~1]H՛dv{ѝX][ޖ8!>ԬFpV V"pd]5!t\I͔9M7,r*^R} ,k1rcX~]k0a@,N: H8, u)MD|6|=5e/}l`ى%=Ju:f{x8W~,8 m_h!/~3?gggU $Vq*?' BNK>hJr]ÁG;SKi[ܽ/' FB{,/}ۮU ~FrddMH>xxnvG0d4мBh-p=YU),7%p)R?R m pdUI#|݊F$cO=JE?B<?i#|u޽e u*L3vn :ͯRL <zW8_SًNr<~cAO }^GI4(8Qx9 N~zuoF2DnY(ի8p(C7gfm֟J;(J wu &XQ{$nKnXCCe 6 (|N!IXρFvqCmMfE-5 xEB }j/:%ƲR*m%.ao5Vh[7K|s/&E>xkM-ٵT/y nUZsR2)3z%sаրvdB}t+- ZSC"r>x짟_; cg @2DnJ[?S~bq6Lk)Ãoб ,s$UMf2X /lj1IQLڙY3m)!/tZͼɜLHkT \s_2Ke?Ēƹ(d 꺖kiEu\h-{fv4lw gmFuJdT1F증Uy|i&ﮮ1M㰅ϵ`U'"?JWjk& &k к#z=>K!/Do4q^7v ϹP)e20K:&?`3nꅒ8cŒt"–Ctߴ&jOwnYΞ=B˯k-+uKU(=?}WKNP0LJɌBqĬW*iq&'_P޶蔵v- m~:-fmKE6:ux+uYǏ{nvԺc\c|_JV*ebR 5-|`xu;l*ng9{0H |߸9uSHlN. h!Ia3%NW|' _5z&Vf1#,A=Cx"#x-9uak&sRwktuꆐ%GgA64VGK$RquR$#Z \0m^QrI`41gXX>ٲ6ӓ~^{bX+rSXVATUANn0x챗|Zt訩=+ >7NIj0WKaLGæ0׻o݌#.w#̫N7k^O9& nIH޻ͬK ]Ǵi`E*ԤDk܏|AVӧ:dM, ڹgPFL%L7prQPSe×ҀDѐcf$=7j3U3N "_L`2yi$CEf7%pA37&{F)qift1Ny\; V^$ 8T2!*? MSO"0n6MAm:u@cYv'. xHɷ c\R:R[Π8V7b2̅V%V]f"N;=/P7DDV=uh '4rB\LT1C`=cD`qVؕR ~y]nT8㪑 vt;jGufjr[K[dMI"Gb bꐒJ9[u(hH' 5VBzC!LL,h,6_ ӋdIkQ 9rXCk2|0#7X̌/  "Ju0{PTkld]ZqG JsT?p NTSB_HB$`b0& [wEdx,Y})qX=]S?s #Zkvpw*cԠ *hRTwh k?6)M NXOڗ b(Xr6 eQ) )IzJBHN;/A Ęm8@^d3jӗ-ih:I:Skbc*Hr%RbHE?#q,bC#Ah=˨+ z@0MX'qXR ; X6KY 6ujv;9%BJDj3/eu ^ۙaA؇8@$RzpB15SLǪ+dԟ("Ru]I2˴†YD =|UQrDhY`EIލN_R/PlH#a-苰Dfbo.wJqG`dL"tݤv$nOBvQE<DMYx*ӧVbVc}ttl PsAb0;{> 7WʙRj`֒nBK7Jor-WILC%J )~#p͢W@1H R$NHZ" s_0KEI_MN ?I ic3ctQ[2ݧ:0axodF_7c VNܖfB慨'h҉J';lX4 2X JȔ/qħf5+E9Xy ?>}5.[`uڱ4%{CMC®]ɘ6C =ͼb2S 2JhBkLvspyY 5|ݟm[& ^{߷HgfsDȗP1?D+U0`r]#PÜ*as`۝7%IXl8f`aS (̀jw ۽cMx~HV&kf#=0C0yΟI|ڧܑo3yӀˬe кWYWt?t*QM.\]K3ԺּLOjf:R{ :ݪزEf%rA]s)\ ñSlV\h1Fdo6 ELq , Ƹ4Ӽc )%~@kaК(;#pzA^9F-kT#s6q)#U'A|YO4M/.٭vAc29r)pxXԃUT,ԷL6Me9y:Sfn|+ D8N+8u%I*0ɱOCCI$r)3 al6BBi24轈ܴtV?p{qe-6>=6)HݒMceAy>VC$ :;XWE2&81 1Da0 k3LT"MRC\lɑFu$&2]ǞT+ne)=9fpZr@#Zf4of峱XwJ,Nr\31jXico'.fq15}EgK&0 FX:QFP#-I(H&,P'@u @ <N(;jr";8C"~S>>uMDiO)=ޕQhNlm;/sBxLE>עynIYcC1 x t_oh b5" `v6A\mjG+4tu4ᴗU,Ƒ/f TDդ|bcia6d~ `ݝO]]3>7B|ێ1d#Wqy&gNl"^D)otT<< +< KF-9siHke18Z}'mEqr$Y NͧW^k48Λk'g-J&Ot}yݍϞn4G99p p (sI:Xٽ VfĻw|yY`du#:uGҳzГza@NL#\;F.wK˙1M"R& en77.ԝY7Z3ϖ=~iR4@0hk=|lOZquJiM2娬dlATFCA.|EC2@Uh%aP@݁6QܶkςkM:QbE#}vYXťb'h7y.]Z  GXYlL$Ol{yaڅB^9G:#jvm3C@8/̍:NJUX&$H,LCX_GʓNE,5 Ց{#-H2,I:4 B&` q0M qqpy\ 3M`c"G{R聈5Z!ҋקi/o|>jB_><'W5uqJ1# v zdpqB_ItcA&{ձKc0t R; RœbG#B)0Q\>?(B\xA>"Doxh[6Z![)٘ sȅN  /@~M ㈨яa*[y1/ɲ1 ըfPW*&G8D8:1&$mQNӼ 6ĵpVt(Q' AC4 6?#9 X'Mʻ-zqa^:l~K$NHztMM \uj\ڕIfn7W`;N}pˇ^}{tAL5/;$AallBNHQ4%wIH(`3Ihz1x \n20H:jAoS BcB'JX6T`8=qe^oi\ͪ ksaHԸE 4r1VL OU5;aĵ9G2sȊ'+a4df܈L5Y=LtbwyhJ͸Ai7i=o!&>"܀&.yGɁ#h*ι&~4)R)Id'G'<җs3:iǰkkö8qrN9Ѩ4(BsEAnP*Cpchgea"‹,N5Fl7t%3U ǖտ&K2ey"zOߘř"_=sgYg\ 1F[AP>?砭z-܌sXA7S4ַ0ǫL"x,lrN ( mTllL̺ҚB;Ieo?p0kMvm&RL&.Ǔyac3(Zytt&znoCC'C<汻 މ%0 \ YLGFrFb0BRj𐽭l m4Eu{}SP>&[7l<%)t,B6 3!ݵ|]\1+=D%\٘0ms ?2(.=Oiy7i@Bnj:ol|<5w5[hA]GDŽj?߬B9iݬX7aBI\A9gzS8)R!{wWx153AR[|eTK*\!5ũmPq, F9~0B899n'N_4Ν;v T8w 4q,`F@J M\ ݁.//qoƣ=V74CZ0>uԻ7~T,R^t!! 4(JrӿkcރR̟(DN0֕J)L1XE.cjl*;I254-):s.ErU9z)ϏU"CP׾rWylĄӢB  ?\>^U-n%E."eq֜x~Ծ '*T c_Hjumg`^H#o; v)yh& X7{x7u{G oI}>_dD_2B#>|Y,V_]ZH&4jg&' R6m4r#Z-[`\6cZdbcX71TTMOAL^-'*9q"&`k%p{ܻLwEx~G4t'5"Srau|"v"?SVܵ9h=svR,;hQ4Z86n7n>p3}78V6Q=k0ߚgq 1:yvS,jQȕ<yXjIOp2ƞjCQvZ ӑt$T\A4$ձ:Kt90ㆂ4+M\ > JCֺeMg>F̌y4)ipzrqld꽍YWI]!)p 6:V2$!SDlތ wls~alzYMi%ʏ`7B9T8qc톒-W@{'3js,A.X #g0 Hw ю~$:!uB)%dѤ$eBz*wt@;r ; svׄ{ 9 {0j^Xl³Hp1_ 7M|Nw4>-oYVO#)779kp4ts3c"܏{kwYVU݉V$6{|R5yIjѦ$P-&vΪ0*Rh-iƵ_DjN%88)ECM1P+`iNȅ{Lb36ۭ$g \f Xz?"a#=qquݹz=`nt1Ӹ|k_(;/Y.̥͸EW8:7H};']+ȋvN& w.Mw9QU)E{̆>/XXM?Ǧ Rhۏz0Q]%H2,V}[ԓk(\5rlcYf dHسpMSkW*m`SH-hV:\LaknTQ~6a6\M\| ~Py_\buc[.}7N,y -W&7?g)"P<~|hZl á`^0BbӘ4d-:[5ڢ œ0O aL71%(7`H<˄F20 Q#N'$Xi2t-52Q16?k 9e0BLA$D1V%#\M58 <x񜂐1b$x: < T6xPkR ZȨ 1*aV۫h) @5u/O;:`&iτI>g+5=bӯ\n E;I< :GEً$RMe{nz؂%%(U\k6}>0% 'Xtu H#BH͉Z3DGR#o:)jk=6S'2AĚ/{x;)4ӆfSՈ4#E(^"tIJAÀ4]{7IB1GA:#KVFʾNY24u >,LR}-mHz։3-]wIHN(PHvTm^uT#%nke"m8 1"FA?6&z!rJ= |U$EKHAO s'y1).Tk fjÌUJX:Q,X HA!:n#0*.N'2ɾܶԧؠ΂c_;^C>]xrtGzJq5sLɌa!!!R RNInꮅ=_0t!{N^`?ĽI}H2Sh]|mQ#ۚ(& _M+р_=g<9]'+eԯ td>~@!ֲA {v3q+T0t8'jJ?,< kcHLkZ괘s+hWǬTN tR Z({hJQ)\(:Xсy*JbGX[pHx/NO\L "k_V@~'qCi(#Q֮?3zVziNX Մpw˚"p@ H5b~ 1(bǸ$ܽdܻx9=%ct#  aDt;z;iD!Y->ѳJyՃLBlx#e4 $5?gȺ1rW*=aid1gRPkb d -l]b- !HJIi ɯXi;A%/ Tw\\0z39Z1I q2``gG.s{*@Rxmȝ l6%'$76ۭhE9%fGn"bĽ{M%ن=f iCy;%5D`bb0f]vsn^#xG8dc2h7JXk^Pmx   hmo6_Ui(Z9y'5D<%HLec DJnGQ#.TYckYER J_Z+I_\/ kIQ$;&H<8e-ˎ< Tqh#1sHNHTvBaI^G2jDBbaI"+ +sCo`P^ۀOv _6p ȁХT)k+‘˃B4ck9;r~&VW)ZTvͦXLfH$܋(׽$В˱BЁie)>Y || sSb*ч#No3xd8N1($NYLCFHͱ5֯`s D>b r_?'39b`=0τ8'Oc`F`|@<#ӲRc@(g+HmD3h $/ b%z(zzfB81B$L_LsƝs{'$>|PJ7,BfƇuib*v)vcqEo%tQqJ_32!%k )54k1ᲷU8_EWĝQ~5I9c;cbE@p rUk$/_LyP빶In zwvyR9v\(0BT Ȣb[\8\ybMgQ:+ySujBh5Ul@W Hl][iwb(UhjAk]^^i_y '5Qns.b"FGpG2vi4xeH/bY!Bg+pځ er^7ZYf5iXTJ I$/bIH@.k x\ܰx?nm2F&#Q8: փ7ȿ4z`*H=g0MBrQMdd}~|+8|k!f|U8aMbV8x R1s*N1c2=A3:-liU{ "$Eʞ>biiyuW+}89};/KšqnCvbפMLis؞SD{ykpbuv RԀ'%.՛ؤn6%E]fx.Buζ4˹idf$n4)Jc>h=OIEGYBsL7FK 4"] dp: .S);eb،A:z/c.;!ÊH;RouGu -M]-iݼ삚:[<%janx,_I9;S]#߿:((s#y)Ɔ )]9I"S@*WgͦtRb hȡU䨸$6g jjoy?ejbśUVkN\/r/^Kih%@RFe;#sp|bL(ߛtڲ& ( 1^8kȡ0mZ\8[fmFXۉil6v:[LSnO\Da"8MN>w/|s7`gPA5,:?x WWW ø,cfCrŝ6j)tM7 ˓ ?J3|Uunsb,i$FF@t7lO.9oD!õz;Eכ̐8NPCe{~P*X\ P(m^xUˁT.7a'0톙==( n"QײCzA׭raFc¬ɱΌ."`k&'t +;e%مF1+A Hҩ 1-yeB Ce=nvuZ8'JG̼gAQ≏s I ~RZ -y=%?!btLx@1*|XR6 CTIkQ(W ̚$9I5՝ƗXl|9#ROg^aS` %t$)WKYj<3R0+E 8{\$<W;#(WׄҀtd~36#vF>5k}SܵSKҭi$='q:fαϐ_|ߴ6yZ]:8B&W-.+-fט)yʼ?Zk-7N풭+T ]cg7g$-։{2 59bsHdlcpu0 %OB 4B$)Q Yh?[ܽ{;qrzh)1&x$.1|Lpd5ZwhkP#K>&>1-R6K2#='C""FW"jZOd| `[\eFqjk}̀*ž< wʗk([*wY0-UyV'՞nVuAlP}'̨y>.i-(9 N-J' 2*;y p:1 CMÔ*>$v ps|[+ыpMR%>$ѩŔTPS\9:>x%a(YS$Ƃc6&}@d=`ϣ3hK~ev;{/^#6m$b {;y)Sb:=~C'EEΡWd=t$ſӾ+GXjܦ.SPX^fx9 Seґ"aR4Bv5pwg>̑-ts 2mɼBNnA2OGxLZhzzMbaʗ؉e՞lkm}&<|w~'_Œ'ye@I@?1&"A+ >xܮK)am%lrrN'^'I2s ֨b b\Ü 5Hɰ'~4a)&I*o]IC'SB4JKJ:y阃PDプ+( ~l)frJ'[YnƱ4Hw]1 j40F`zL%g-5e6xL*Ur]Yq6.b&1޽#\&8O:fF;ֺ~($kċ=tم$J&EF'RP+u?{Da3]p"ubGZiܨhxq*jy#EJ?&9Tqq׼GF{ 4 *b=H*AA;-90BwMfA\8vιšb`FbYDsJ[vc.0Y$̽Xys1W:cu!bCH X*2JdrX@Ni siU6d5.l,vqd)A@7}(!VP4C/Vh=UoNG>@$ӟ}-Ws%p^]3y08p`8!8I38DyW'!f4sh-s]C3{A+qJld(Peqg BW,a7 p2ᙻvOxٙdV3;|NBNE6#f7O68z|_M>?ՋW$v̮FM^WCPWZ"3+FƑ` уpwyqxde-Xn{$RM,qVhvvb!cUIDATWE̛EJj(Ⱥ&2%{6""s{?LGy;_I qaO&;_~N DpBѦiDnFCMOj]k,iTA 5Lmbȵ#a):|iV6J Ϩw*Mee;1_ |@bϯ#z'If`fKD%X81^ڀlPÀY~) pdnI.Ooi8eDU^]&PO޿lԭU~;H)/܈n? bī Kp)JpB~_"G$b#'x;]bW;~@@@4oLŇ1O{!BJs0PHthn.fYi%q"9lY"VYTnQ5]xށ"AQ$uE9{-"~y@N(ђ9^38>ڵLlH7Q~}]<:?OC  UqK@I)#n #< nʨ-Iy˛lP)bHb@lTS8Ϻ?I@I,SYWawi\Wc<{%җA^ӠI^!Xt@n3dG^|{Ň>VM #$~U3LoD{}S}ޛj7w+Rժ~4TOs:/ry͡+>5h$!ck`'QI8:S`gVX0zm=&BD"/l4PMw-7a1Ϡnk.Y4i 9hS1L/vPR1Dip}+? 6M7ec5bTa*8M%)~&" TASBǹ8bMO38g JNHvܜhYsLCД}|'WgMM"C¿~Ly|WFndt!y2ی_ XqdTo,U+TF*ZHS*Ǭ{qI9ŮPـԈn։F^Vo1vN^7"zyNcL mD'*+'t ] L\:`䈫N:zPaGP.XY Z(&kN!?i/σoi<ԖvpaQ>{WV"z/ ;\ό`vt23='Qan""d'ީk KĽ7wy?1@ gFju2X-h_'LՃ =dg ;%p^ĄGNۣ||1SװR amMHt%ˍ58_q aE 3O5p9W՜=Ƴw˝PGnF't$&  ` BFq6#fCxw ''''''899^W6@d߄dMnHDZKu}B {dL?)kS{y!|q7]Ch:_[RK4E5AkS(f̹ЉKi;4$4whK=0t97rGJ_p4yi(Kav0WƉ6I\9) À0 XrxsIRL;i)tFUpoAS?O;0KTS)qYs2kggGl300 1BH,@qݻ3Ww0=6쉔!nEVֻ8 dgF7Z#+E(CubFDmYɛ Z|r+KѲ<{F|`hS$d:(QIUvv"roSsaXYg.Ջx7C7Zhmt@ю$N DZ,j7BD U".XXT\a͇*Ƌb9XˣtdJZvT*E9ƽY#|aG/=piƠ@w |_?=WAL:~4@ =;n / ~NNaZ縸@jR\. BL\b;hYԃ#0Ϣۘg`rvi.ϝ X9W&r>P2B& RTuBFuڌ'1=/v)Ӑ ɟK:&p=k;<yb;u}}OEߋ//\}\&|bɇ;]9h&Pbō~ҬR=y3hPcڇ6 _-mIv,eY2WB9 (sLZ XQN>2@CSJML2vdWPG$I94H9g$;e7r/Dlpq8АKT`j13t4{k!my/fdze}2d[SbR)` 1 'qS @J5Ð߇Ôa2k8{&I@^,g1+|q3faJM4qiF&5QE8` ޏ^pqySMso+sAtz-RSB>8'6Ѱޔoa]t29Gӫ,=HL n*}HKDwkXL39M '9Xgϰ5OFא(`f:Ii&n8a>`F0%Mj1FpYn7;i0Os1G~lį:!IVZߺu  8*U];@̙Mip꣞źMxddctxj/C! fշ=7Ѱ6 nզ䡇츝6JR-6OMWo4[)z_}6Fu|fϺ/w#BGXsf-ܤ͏R*S)cgʰ+J&p7UJ0A1"a),#' ebRvL(NQ̤M͂ FU昦91U>OwDpމqibLZLk_L.C@9x > esD6qDLŚ8;8pΏb+Z%P* 4ŊtgsHB*m`XseÕ0u^J1~D א"* K0Jֈw)_aGF?4ܖo3cFȏi:9OIRQ7笂'#'nSQy48m +}IS*`K1Du2mMfLcY7= -|l&1i3/B|+,k$kiKd cvβНQQ542ZT*Zt3 80$uD'I-4]g,dǨ\O:M&ۉS \fv_98UzFSՠ"53~?o۩daF~/'^y*nq\J.- xVhϫ'q$;Q0:a"d# ^8 cc:u) exM)\\.+{d\NM/Z"MpQRϜ+^emzS/mw-!/3nLܤ9YZW>HYNqOwރ U}ȱĞ?i_ '(:q.5adlF`;epF$SDqoǸ n-a'zwC eaiB"$i sHZ脆E)e0pa+`EmLR4Du!wmnݺuBwzmFٹڡziJ&'6?^3aq s~h>ݤm4fV |łOZ)B S]G7eBwwx-/,\kT ڔbCcf$#!\'Ţ=/Dɲ hD,)CJY(Y+5~pQ,X/f>USa|)g!&AI ~8{Ν;nkڻaO0`p.dK;xccb\XQ5*Kj۷oﻳ-:J|q-sH:?6:? uTC~^ӐiMd\ CNH65Xb#y TF'RNLr:T +5+piNX1z %xTJS))407[1sr_*adBN<;cE/܆>KwR( qrdTY^wN,R4 iʀ e(OQG8|FՠH<4 a3cnK/8abZ߬ 3ۿ3RZ gOnР蟷gڐc1~D>pw_ /WraN5c& xbv$c{'f٘ KϊRЫOd?~ ;np6FPmZ&z`^YۈT {.*ᲕuW# {lp9-piM-΁16fiBa՗ X&R,B-q hLdU#\'vP'[s;P־O"4E4/fH0dZiJ_TŎwgp9%GٺWC_+K>"xW\aAE9&Xʶ:b3D2&Č rRS5+tv^fǒq.\wh >$'=} o"\ ^P9,?kp/_1]MdhDN-WZ"'dK.τd{}SPMPLXc(%lOM(' 3 K3"CYTqEb _y'10bz<\j, NY"ruz^#1b܄*MkLK9&(EEZ>(G7oLjmchS?̬S#0lXqUw8wop|#Rq TV$y \9]rC|bַd c}d}t*Rצ۰>D ތ!JFN#C{bADh,#"vWiA!-̳z.  K@Ij/̕;QF26^h%]+]}-QJ "X7&W) }: GtWY;L:t9/~qvy|ɋ1O E6 nKTh`Q p{Ki&xLى3'{TY 4:VB+v2F`6(ei$$( p)%}B@Ɣ~qr1ˆ/2<,(]mB6 ^җkntZȌcEN\ENS;:tĿ{#>3?,*Ӎ@ǚqZNjp> &{J p7Du#EݳrXbz@ARۇ!Q<9V@nv;UA:~Y3sy+RхQrPMn6n\Gܺop;w)׭:d7*uVWb,+M˝tz@p{I7lh5ݍHCݵuB:d ,awuKFP̉lMw3ŪZ֨ڷh BrξEUsД4 l "s$qPҖrC@p^ĹBgMva0QF:J9ظpǡ)oVՍys )+{lnӢ'U/^UX;T\'Cd03};~9Ӭ!! /~q5iSx|? Ǡـ!v[Ji݈I%bD@Hwv:KdJxs-^d3Wq}te悴(+HwFXg1B',?2/paА (Jg]Y(DXͩރVĮf"z=|5 m/>ݻOWI Ϡ5fTYMaSQL:+LtAUS3SݦP\lmbz9v >KϲLG~7ވgLlNe%9ULE†q 0 XcsZAιybg_Y#Pi19HY,I엇/j+E9ۋ LE"cjQ Fqi@A.R2Tcnݲ`dg̎YYPoؘ]pyFz y;ߊ.SjX>ə |,{qywEۡx/7ڤX\ X&9KhZ2 &u֊fc/úl 2> H`mŦ4HAd 6y9;w"*

^菺h-jH00d!6#^Ƒ'6=*3?_(k<~EZ_ThZk‹Jp">Be-wKV!Vn4^IǹP$(!SH kpa{a7o0 hۀXEAwNDx+^??""kh:,}K|U#bSHߛ}k?~׮' - W=ǼbSlz*X˞Xtz[+a4rGBqoX7AQ ]:iSϨij.۸Ԥ {߻ i΃ +Nh{-wnCǸ/t x >˙wMmұ?* 2o_NFA_Vbڄh#ki_m6 uOi~~Y"kzYiI{w&>}n]tB^ nϼ3) tPζOAh:E*ğ);cT e /ʞEo *]fqQeګyLp"猯D3?Ly8VC9]A\T\o% ǔ~&"Q\i9Lf 9S b70qF "d D=L!@KqtO\B{Rr-g?7t?&8M* ^QB=rj&C<@s'Wj[H:JLGSu/Ţ_%ZjCՈ4#1n-I( Q[>iΜdu4 Wg4a[P1cϩ9qV,g.rG}g+fzBrԦTt*'HfZ^0X4T>obt> ¦8!2/mȐ<`Tj>3u%Jwc6@O829L|m3Lsls[\*^y??w"59Y"/yKB-h}WwwfW a)gHhfu(B.$=GviJ*J?Vͮ%4E \WI=Sr0݋w}4 ufѐ HĢ*F/=MGv"lyc]@L6GJѳAڣfmb7{[ZՑ;Qm*BMɮdM^TLתhNHlsE(Lh3t C547farJ@ҘP; `P.EXK{d-.W!_$I~p \v^CvSءhjBkB s9#nAn")8Op(wq1 qHGB|` ĀI5x7#֍LS*'SoY` q}:1'MRck\v_6Nm^??+?Â6džCCFE64D:6Sh{ZX@$SٰhA3z amB7m_ Q4Նn6ȷ͞]sx?< j X8sFDvREt=*b"f= ɟ~Wg& AQޛlTDWֽ ]lP^5`iĝOn؝lVB-S@T D.4}cL]+go`Pl4~f+v\&r%Mƅb?(B8!!׻(D~BI`l6<&WR^+b鞝 Mב\֑FJ[͸IqYWRMc? [< ܭ1}Dz7v.;dAE }J I;>! )ɍ^G矧aΪ~HY%#pmBFDw "&TCoWi&jmDACΗMܪdoI"%Fb*Ң%6D4'ͮL87r~zIa zX)=_,^ZGuݚCTqDYЧ SC|%/A> 3HMFk-b 3KZDsa:c4$9l=b]Zr&9 ܆d yK^\zmB=Y/C˥W[j:Lszy.,.@R~pIBM"IS.! ͞D2 Fa;2~/pPV6ͦzEBs~g|7DCzi !d$DZ=G_ev(FEE 2+={Ajl_+QbM?26xc=Oԉqƈݙ  XGsx0@JSVFȮ|N&zD"Zl6#ݻFd b%aemhxGI>QY 76qAݭ9ks qCas0>mkҠ 2?bH 8ixjW#{8C߀G_I}Qt[dA(ds59"fo۔hv|47o]8|V^uF/y"Z)ɛW.;S-l'MN^}_y^kz<GYe_.V#h"(O" R>k$ TD?Ddp-~2#ZXEDlqآ":Y^a<类*=lm6rC. Lmfb Ұsp 4^+D?$ďf8xÌ[aрhF],fN-%JYG^MozSN&DkFľn 6XȚVO<~g~9:iy=NtƜD׬Y&2 ޟj]Um9 &&7fg3)0+%v|uO9IeJǘ?w]_Ai"aN^<.֔ rӜD)@MnN[nz6Mr9J 19#HSUFbS, 9yI}pCI {xsy Уvx{zT8>mn΃WBC%m:W`?mnmjApa/k>d%״D`bK><`/7"yRsօ*9y#Us  %ɯa]N% x 2b7rC:/vC#Oo av\!"A]qtRV+7fR Mj+~UNgT&,o.+IiL19ĐDIyvQPbu2:%3\ }mbiO?3d"sU:V(D(NC+^9H1T`9{=`VHn vsRCՄJHǂ [' qkٸBaY8 8`fY•@9Ҳdٻ]h+‡/C׍@%Ϩ4,fsMD+ VhuWsGrz۷+4Z)Ǭc͈^ڄhaݾ=8|;^د* a34#l9ҢJv]Oy'\ AΧMi1xǸpy ~?y9Zh5z,KYu=6ڌؐB4!mDDxK^O}9˶Pi0]v"V2&DU?uGQ$I{lЇ0@ q ): =...p U8|e0ZfLP0$mm(ѳ bOb\\\+p w.=vCuEQ;>pT@4lX8?bq7]gwR&) fmb)$ χDrX5FQv&h@cV@a:UFՄhR8:SU(oע*=B?pz\❊:FQj( \saVeJk<ʵ(X փkYE絅17f=)4aFAzޏy'G&9!?6W`CAQ`e;O,?$٪kcBbF :U(R ϫ|X2 cu3vXTNk˿Fh9I{4Xa^~5sx~>\K.ff* a&bKBb ĺ\ >?Dl=zgȻnJi(l#blom3>3ַlDDQTۀxsbQ>oK!;y{4H[-=|>lgNs<₎Oԕd!gzU30SsоCoܴtBl6fO՝Ŋ8߂Ndc]QoBoI M {8FSh)#Yl׀q~?+kC5*Aa4`UA(ƤFW^nos?Fm[m)؜7UP?ezw't/.XCB@6[?|~6 F6!ιEj@,'No5g[.ɚmMu bk$6\uXa ?(:T1}z~qY 0Y1 39VTcZ2vgl02:@+df43 R} ץuRg$ G8#ڴwٸ}r S弩 w7B{Ysj GLQ67R1 #'=r`Rl9Lٽ5!%qN槺t  ##x>__ JmёfOeaoBFɦ1߲(qJTx$#, KB>%p7rak3h []9 I`xK;3I?fɘ,^*H(pZE2Eqk`GNybDlYPXMnkdFNv( V,7&eީω^a$@Kֽ&5qdG CElN6ȱ@db:г(Y`J5V9)a aVN8F\ 3zXt x?GC|TrLn|s?PFnݴlC>ǽ'/MP_j$c|h4"JRW?8p|h;bo/ - fWeޢ zL-U~s?ssXt6$j6$mckM^Mu$ m:;^.($ %jBp Z< PBW@8hC聆% L0]ѓm^3֛*F_$YrE;#JY؝BRgl6*#V> }8sVuӤtcvI1KnȘC-MafL);9Am &Scp~gRYf2="3pp1̚(AiN5"{Ydh&As#U$QDGiWlrcfsjև1yZj46y ^š)&bM7XܱRP1{5+tXfg&Dlm1TKL4ɕc֬zz(! j˧z0Q^ld\G!P۩[{æ^/Z,oi! "+IXI4O.,\wɶ6"/C lhygl?AN˵zi"JM+* :ա&T5+#PF]\zxDG(tʂx+1ϱUǬ}D棵ibX;ϯ{ލxO~Oq.WY#lv'YD7 LcaȺV7)RZj[Tk4+Jۮ+O8"a) $KӯHe84k<Í>Y>2B*{aMp&g~v.QT01g{p0! FC"i{GlK~хɓh[rDmK҃Lk`ڵ3X; _/-Vz'idtЦ,` Cv0ϣ9I5gfM6J@5dSPq- =["tjxFn<[RCEg ʇ)?gDrHiNl,0(.TB@Y Wnȴ1$&^GL] Ն- 2و 3΍h2m0S0#O Lgѻh|ġc4-ۘD꽦_%DpxXCFl;30O |pA=jƽ!Z0: 0:[ǝ-<<\wZT1JV+nk iWUɁg_ՊȈholCK Ϗ,o?ckbi x|=4Xwg6K"`=jp4ф|~ u8r5f+!k6TQpmpPJ,§!J"fVօ02BgE%;WJ~jQf2xP0=RN 1~0Aw%<ۋŠ|ƨf -AԽ,CŊPQs:h$ c fQ)y *]$zŐ?G) KcU/^5ɬÄDm*gX󿽠'J5jYCpMpZJyՋH&NnM):87 N}Ť#5"EiWYIJg/1' mE$<sWZ) yשlZt(c4Ft"-_܄ԋIB L|YvȔ^( ٰEkbJt*wn,|yjG$Oys:I2ooeFCzRkz Ң6!JҀ1y'Cϯ Ys=@4°֐5޵?ujQcHHs`...w߭&w i&=63!1,4kVmjFlSw&/1>>jq/I5nRܥ-J1Xӗ\Lfm~9&5f qŲ>7^i <ɂ>2ΡanXಶ "Ro Y?eB]M.OڞPepK &Fu y_J)8rɺ\zG}6<9vIXj4ƍIv ˗(i9#DŽ=xuu֕=-a[LL^ 4T4 $?=*-ԠX:RC AK ^D;U x=7x?}"+yzO9}΢*ѠD?ӢbDta:$`4/sȺl(=dh"7ұ㬲y׭Y>nrTMYR5e>f<0gћ8q9Ӯc}5L\8jOev"䝃\%7$Ky J!^s\ k |epigX ^{)iᖛ)1sַcfdow֭[]h}g~f|^3Pې$}M+bmsL"wݴ]8!6a 9MH}'~'bc͈=F4uG9Mfh1sfu'wafuߏjA"4ͮmA ݄61w5wz\T_ 2 'evy$k]YV#XG}EYn'haJ.AЛ,RoQBg-GFс<'H8s@I >mι2kKBN٧E;;Af1#i`chb#`G7r8 P6N]?lտi_"ÌmJsl0 UVj02e*"u @4ꎕkL9,3w#,N'?p8ΪP={YB =//$քeq^EQ ,z6v66B\hX b xsj]:va^zBӴ$ILݻ0,XTK_\^ ]N(-)r툈ߑBV6.qI{("$v@rr|KJPVyL C*?քqm-~.іlMnq=\__k&r(9&!]σK88p:U^SOf61Pa@R0D،).L{l|qvc#cnd\L<[+x{?T%2F)Q4(4Fhr"7$AJ&5+V%K-E ʺxfŚQSӘX Zx0n+A^rG2ZdeX -{kdkuаEb9Rc# Af3b9P] Q_! uk.FO[n4n9墏LϓK#;T)P$ 9DIEnL`"܀ P0x DJ&@[hHԥ9Vy+%όI6e s]!oÈ0"_{x>5F0P킸2|&@Sݎ$ ;n䬏VdjaRrJ#&AKnр TKt3Xf(.\3rJ&k-lWWQHCfXفSf8} jI(EҶH:&ȏ&:Uw'~)'#Rq%S|Z Fk6Hf2)/ͩ GI,a̅]ѝq=ky뽐(F/s3c.9 E,lf@V4CaaG\cuҦف@^B^PDcr3@q%gbݴyt51lԣiMx@{oqyyۄT'&TUE7Zmaѿ"sǐjl 9U䷈HO&6=ȚS1;_}g}g> jz,n{^֐o:XkE03wx_E}a!)i.jODPL-YQlzxhh=ܴ-\bed%%L` $,IA[έ5l#8*jGS`r4NhÄM=mt(03 JGqKbunΥp0@&5b !Bj4M w5ڬ(2U-u(Dc6AÌ>8#^(R 2a ~PRB7⌦4Vf3K3 T,㜩`+;0hDzl1j!;Г%P*ꚛ]Ğ\_BҐVvIe1<#a6FyI! մ"Ih@eI- ZN|Q̹hi>SF* ڱ r~fDq9g< w7 CRf :0/ӮD+CH }R?&My ߘ%pK((Mܐik#ؤZC2G|~,1tK<#m;wֵ!d{ wBC-mFZ;Vt+ZRi~5G.{m]CDZ޶Ys_I eE>Q:K9xt476I7=T~w?Y M=ޟ9;w,Ŷ_`QZnkT5TKT#rs6!d{kXze|OԪ`UWVVwDѣcn6F߇7U̿E_1; Yʬi@z@h֏u̧]n7Q>Kv}A9*t1{ѱFօ>ybbO͉2䓃lY2‘s {,ѯBB559'`2:0n62LE~ҍxẋ) m5g٨MĈIrGFAFJd'3 -8$k~꼜/$Zydѹq*ͨ3sFA4Pvg`wN/d(?U(rd9n.$fhшiN `&: 7:b{—K NodgRcݑvExڙ5T t7n(JJpnZ5BӤgYĈqKb;euyQL;l! `2 /LUӆqõŝR8k~GNJ0fDԬgbo`T,hb(hKvǤbeΓ^ u&Аӑzv6:8~bS$ ^_6g{̲W^Ww^~Hxi֨Y"iZk4MUxZ6ʱ&cm@z5!D=dž77Ut"w^k8о^bTahQk -}~^5wUj5$ Rnly-IE)&/FThT"VGu3R+-RV(ۈu93#QrrZCEPQ1!u|ːs &Z{qL *O4O9M6_! I%E>pE'O1QGsF(a:\LE}̬vl.)^a\ 6u120pClzᄊӔ5=%p. ~#tsuIR9gQv*whx7MO.B\(}&̃:_|۲6DѐYkBnb|, )zKjm~c ꢣA uS"-5k-Y}ek#-s,%/TGإhKzIicNY=t?-6"-:ߌOԗrIx%뉚{MJƝqڼ(1wސRcUg~xMGqR7+ntCκ*Dk.>;D.9Ab,a'10WzHEZsAEJ./H0]Q=\y rP  S#.jԣZ]H)M 9rF`Ba1 Ӱƙ5\C-#lZdSBtx~8L<5=.R񼸾rd&/[1mRD=~u.Đ-k9C΢.XބljDS尤aAT1,BծcY #UIiބΗ&" #x ؛#؅|:r`x3@I]`Ul\r9de;մ4oFLɲcHXTZtǣxjHg b9͚ͭ~[ehy0RbjU{] J2W-, `ِĝ vP,ٞ/9[8y{0pv ScR(aT&e]My$x.G˳dgbQnOzc(5\^^ѲzMgg,⁛ [S6cmH2(HFe[tђNZ#sZkBܴABN!#95ww/AO,=АFF?osbPJQc5oZ`{r;`a,*T9S"PP6!h|h3ax# yA֚&B PTKS .Q qĕɽ)6\'#c6vr%Zv,9R|FubVCm Cm+Q\[gMܾ1[}rJtU1i9E.!ňH]7[ddp8FxykBL" ~ @lWM]jL"ϩA!d&6)P]8"]ka8f%xsAy=aP:bl 4q݊ޮJmfx,] 9A--"Oyes6Ui۪!&i($̘(Mp̟9?޵vik11-Sjb8clǦB,)(Q7܈y*aHa+J)Y\Ӭhei]fQLٱ@RmXUѡ3[16 >Gq 9uR?{衇W?c?ֽhZǚֈ4"=DjGϫ5~oOG}G- oZԥQT0SCB>o1\"3.R=ZWUsiBw@^[Jr0x90Rd_XD[4:S2N(KTBR aaTO.ma:3c e0?0xЍq̉D(5lsalPT"79ΓP͆|: Amb'&tTnvw v}4Eԗb-'ΩP,f8qwy@_)7l3C(s祹$g%"+LBrrd݌噢)+""C&I1 FRI^ω4KڬM\D7qY4Y ɾ@1!BFD._)TQ75WDi,k<]E'|pw-֊%i{d' .UrU.nF}\jH'24%\*.70ಈQѪlh%zJFh2 5oÉM]det'\ܼzvN] }F&@:&=UL!l[W;7~2D_ڀ<zֱ4//S ɚ΢6ՊmFp@n}^a+ךi)^ $kv:9yի^x;yѫqBֆ=TĚ@ivɰZ#"#̄׽WUHuqMLPztϼ˵Nv9p? 1#̙<R5ɩޟ4)DvU[Ռ$º}vdTe2ZE[kG1kn3iX>,]0.B2ތl0Cy 5%*Ԑ,x hzhKybjvS"8AASv1$zivKf ]"-9!){(!L !WI:{"1zb|]a4^H,.pQzń  ϮF-WPqhyINlm,ZdfhWz qkgڠ"! !3SȈL= Fdtgd\]=Vk](\Uk'vl7=4!eS-ox "1"hOY+H]WRRY轠h1%L`τth"|/9ZK$Fbs0Yowi^Ÿ6bhEnŵ}5QX.[dw۷ocEA5=zVn_;U苉(ZCGzH0j-O&B:駜k*9$0%m\gk\v xL1>r̺KKp/^kPiH=c5*-ѳZʗE܄ny&Yk//ww~Ó IkaG+kѱ޺6k={-?OOn-ֱ$#dk4m~&? 잜b)e]r򂎗H.ъi$G&UAgJS sDoF bBQj[!7WW9eFhuobaIfN8bc:aFx U Tcf8٤NkU!ЊH%H Hsph'pq@<\ADJV<܃/dV Fh}m]3ԐJcP,]zWpe糄Շwk&0(ǕǺNq6^Va삙D&̰If^ͦH xi4fBHa?0PaW—HS\iB:b-AEͦ& c'j֔Ѐ0Kϡs29wҴL`Ԅk&H9 BDsuŴ Ʋ3TePF VS.f|caOAXEzE3ĦكhܺF>cm+^:l69e]CC4>7[䔝-CK:[ր/&&ki(Y=J {G ֜D^3/5~=䢇ZY*WdZELz{ZMh%PYwGqP-*F{հ3mch?jCx[ . -j%􏸬}L\T"?|͈YܝBs\W Agꕤ[ 2Υ=87=kpyw ie:0:Reؤ{8( 11BZ8 F !LPR 0I7H1V<#:q, BB} U>*jVn1+0v;;<@ö${W5VY%1l!-/Tn[_gW0/uQGiވT\#>c%B4x,!l9f=2%+2*miW)'&j],y>Ne'Fdv) Fk0")͈HjTp#啎CMPIBS+^FȗE=ipE4/J"bч7fZc\H/gPG4"\rd$0!Qѿ`2cWNTgɾ9 5Cp/*lt4b=kz^:# 8"Gˎ&Rգ8T&.BZ+ OiBy.HUOr *=+T,0$ OD|gPf6zߵj }vʿp~B%D+ru ҿW}?gx4XccEzmN^E\;,Б5Vo?ނR7∛jiKeJkLFI\,ϥiVmGSrJ # Ҫt=/6Q, ʆ2 Y(G욧J%v.(m܀C*ՙЈxE*\B BւB7-l_•\ 1a93{fZ [rdsS)JsQNzX)Rms%ȉgIerҠi} ss]^pAc[\نRö_=z)5"7k8?7`fV~)5!SVی|WYE釃e'~ƤD(+IG~Q/{=,+X_kLъ<,y6 ӣA-quz5G&4)ENz#~'>k1ueQ7rb6k9&DT-5TE݄D^;ZZ^)G|PIN^3pν☲қNɩp>#s6O3]9SEiL4a|h$6C5dg D•Ȇ!ѺđJЬx;"* OMʸ"!#ݑj_}l4JQ eDĴYrD^"j!_\5̥ @򄌈3O`PtuՖL RzD,\whlm] W!(J@a kY /+\;r Jͅ " 1IP jѲs\;qB̒4ks5F#OB@d~SLQ'7@0N.7_X9!5HX9f̏ӄa 8FxW:!`pP83cddA& m.G7OICBАWxsBj˶A!: vV#f66;hjpJs==G*{ H,eĵzc|M#b586;<=Ώ ͭ kǭd4ºea'E LCTYLŠaDJٹ Υ&5(ׅq>+.X3]h=1W|Cl@F`>hŪh]JmPJA|ⱢzL{=.Y9]ꂸJCŞ eQ\20qH,esb)c5\V}^Zp;/2eg!stM;ap8}ֵ̅\rbYY:? iJ׈q,Yr2M]*AgAPR:GCu W__w] rܐu#\NE5XӋQЌ 4ڄ5%kǚ5F m)XNjOx׻~'RsI)̥Y)FK^kJ[R"Lr@jDn/RxssP|]'ʹZZRU;j".K9Q>='=GmtzcA4p8, 1T(8' 4kiviR0gxJ G!&`GhZO 86p JHaS1iO5%g0{x\%õ1GN@)AptxYu-gځ-O:qA̗Rc"'-^~V~DQXEnEXFFEk^>W68E*)&/aku6fҜ|bsr-=% t'VCmbbj\(@SIBԝRԭGk@ o/9ZRrÊ{e@MqIt*ޕAP pnK6t 5K6.T?:1SVhu|.B'S$zd.XuEZ!kuIBITo>?zիN" "7h&iBѶqhݒ,2n]&{zv`lMDrf䜦OCkk/ſ6sk0Ƕf/fu7Sm,zGvRz9'߄OOH*ú A7lև1ƳW(v8E:Xn!%KLB^y4Tz: TB534 >xK^ :%_JNC%oPm1ռ276q*lzrV"/!DEI/M,f@,gX[:5 @A*Ds`q8U.7' QCZTE{vMCXZ]h9H9>|7ɭj2y #lEu00uTGX9[ѹHf(QLabD~MxJ![i0ctcŊPKCiz}mۼ{_ڜs}RE>#5k Ju(<ϸBx LFy2>b;r@)%հD $4ƙt2 Ek&0=@U*.;dS*|5&9va䆪)Zma f!w}F0"6,@^#*PY !zXq ͑u/ǹQ2HrICgo dXN23Ֆ!DYxb<L2RKQHK aDmDmF 7͝ݻ#sǜ!NsC)6` 5=Մ*_%ݳIȥ)x rQ,&̙$7EEѕ$wxɫ6Nz*ByD.r?w(])XL soхkBZׄ㈿M3M לzziCFTbddٿE/W~Wu{]<9֔CEzYkkQ|}l9hzuug?sqwMbQ نZa{H@Ccsa6ɚ7SE!sTSzUrO.J͞Yܣ}Kkr0ٜDЮYMҤ? eXʉ C, Ł3e&Y(ZI,!^2E8LSjP,s3h}\čRĒFi^!Luc7M..7DzQ̓fRGB;nICjPDB@d"U2o@È+3 .\w `ֽrsC= ? &Xj,3 6M46.Gnئnu$[#H19|1.pdѦ) ˄siH![BQ)Mm .MP >YDEϔNkVsIa2lڳGWexU'P23#sɭD,#Gi 5kRj&0#RT~9 2S%cU+}h dH-D8Rc)ނ;m4WńG2{ңbXt~& hY_E_z44RC7ɖj^g|4_X2M󙕫أa?$mѓHPIpMԟ EXF!=ef+7&O[4X9sYII/R YCG=﹂5T}Q!!e׸XkF㵯}[Ng2!y{MUBPr%]',2iQi`(fQr٦W/P s̈[T=QRkT)B.&ZVzшT{YhzppD bcҫr'f1r!0R!Ob)}|ݜ%Ԅ|u!1AjEb Sd ̠bu\U9*^H7! C"b8wn{w؊ºY-:4ּbkv8A;&4n7\_q&d an;һ>+-I#CdBbtpKxNc4PX^r% )z9J]g/ȱO8ñjib`/&YB;!nTdEB p#uQc>/ųǛR c)ۡ?GYf =ujֹ:SMdu!(rߞj}8l@J[ScxшFGjsDZmFOWYI+ȫotKpLk-sjVXJ;R5l 5C^ܪPEP4!9+pnepeoAwV(ιj_IU3!iAc".EfDJ%<#Y5*so5 "gtg@!>4u޹"`7{ :*d@PvJd{¹I,Tz|af~c?ÏpeNNY3h؀%6XiPCppwD3i>x,V)p&R=jpсuʕ4>MC V5-~t7 f6,/KmPe2UZNgVi6Eё766zY#of(մф,soE)S FB;B,J?hH}?QKlsA$);DCs$m5mc&TrÀ Nqq@ Pkvf(9Y6#khȓm..V&vb0XM5 )d\SAA.x_Kx[ߺxBrzXysjv`C=$0ƹ2 ΜC9L;O@ e+q>%[,E؜r"nL{ȹL]oS &sFט !wu:1~,duy஁n].-MP'J՞9;C~,3|xN/p^oؘ{'T~;[lݍU-xH9lٴ[`BN_/8HG8f<9&Q4ZPU`ÐRJx)2]Pj}E^tJMIވ6X>]nuY*)Q' pj#o#lNApK& 9pHU]J+ 2M-M4VaqvjLdjF#V/7>y#ѽDzF {.40'w\޺u2Tc 2}݇گ}.ZkE-u-;IO>XaiƢG:'?䙲=!ov-o9;^jHzn[9k{KZCzm@l>E~ވq9@3Zk+u fcTq>9\ZRk1BQvM(X"]ЊYCyRŽ9$aOt"#NlfK&IܯC\0 ŋ9xܾM15_3^(,6%Ja& es*Jz!D i.'=eZ )_eG\^^Kt\؎` JwsF n=tAq2j/(s,YMϦFdFub%K.0dy (lCzz}ZY5q֞8ם:mVi[8aȊA1Fޗ32,Ro[BtY+9+6!i*0C҇zLLʨQZb6PY3z竜t|9Cڠq*vV6g(K0\*[;UT8{煟htEhs H,%Fל(VrY>˾ގ[ow)Xв! ǨYoM<O ]ȓyyL/IwQEFZV/GdME__#` b]fqMOa,V!H!leaiӭ%jR]v EJ`N<{N=4)& ),%U5W:H%jG'HuCC8TԢ| bYE# L^piڍjly˖%C{xqu}0,wqfITbm}l5=j*]D鐲EC1a wi¸ fxtxۋt6{K FwHe/J"@䌳x G -o;1!2N\|,P 9NOZx6"DSA鄨~?EKж@$$+ن)ћzT:QiOR RL N9(4'QlkN09Dw:' L&3Bx[$%,2 96vA+44L.=iER^79A\^\H6&h7aIϙQ`%2ӸUWB Ѫ6cCj(nJM*{pwAEGZAGU:o5u?/֍ ך|kBn߾oo|cN u99 9}e"̧B otD/wѪsА^;gǜ°`\AZ1Ddc?___ ,cQQnՃuWj֡6ֺD)Gd&14!EJ8\c [d,pT5M9Y#b%ay_9fq?m.+GN" m7WeONnUB ٥aD@'PwydWBnS`c 2O n!O"9<:Y4(yfȉl` _T0rnN Xl7Ef~(HA_=!7I,P0NLC jAЄ4%4ꤢtՈ2WNZT]5̉52UIGEPwOð|>s~8dHԶ~)M7<7>\im3ZZNی5Z1t}CDA?SMS9߁V }/ [cf|L޻fz6kH9s7oGnk:,ǸF48Qy2:ܹBP63N?S]) թLEv=9s*cHu= #qؤ\lpF)ᇞӴ|Q.sF8.;kc+M#(ԀCl9)p%D%C:ĬS# S ̚h; :4 4l A4.$7ۅrs.8ˢMQ=)iyabuEU&Ore!L!^-4o\WYלwiilhKeBntڍI &L&A0,3Lξ8EC˄2MTL QX9%bƍ?Ѷ4ELtO2!osVe` } wo^n!\\\`(E>S}ᡇzА'K:t -饬(_]ЇSY-Jr*E=iV˾ /kk'iYG _o8m\֞kیܱzȩFS_ggFe*\LEM:-Mtq[P|I Tc'k* !&"4FEIi)tez6br.Y K#18"H93c:LtDqL!2!<@Y#1iD:8bw}nC80G2wIފOt"30qׁVy8NשyR̬_΍B2=\i0dPJO/L95>X4.z2s OdgXAD$S&|zD>|'ЀҘRA6I+(ZIFjdӏ=QeI.M%2Tw'v#P0t+pX87B1ƼXV6)iZɳ[M"f2ۈ}AL}!#ӦֺT!]0/0OYӢA&9i}dfXG;I+(*7P |MO+zLKRјu\8Ff_,Q?s@ α6}PK."fx\B2D! 5w$di$]NSa*M0x0^b0 <1S # `LctG8J7&>St0cLrWqmf G-fl=+:NӐxzH1#"0ӉdcwetFir7 4[͘-œh`:1r(nq=z/G- .xֲЩyJU\ܵrLwriM)Y #-ԏk^3 {::`<٠µ&47E/뻾 __~9=hs{lek^@6ъ\]]~mx+B"18p V_n,\/<R&2W y͕6@`HQᘆ]Qw(5]֢p,A>-}gfDP쵤2 bLVz^û4!ƈ &S֜%\0 뽬Uq$a48Idn C1kdZ+Ѩ#B 8f`yIs8Fwffz "pksH' ?= b"%(:f$PaS$dq( VhUJ<ҏppX7"۠$BՎSC)Vz/NG`ɧ-|Сf{&IX;!2(jC`vixp\R7ݏB6y+1,@RidF Ykn?-!%r c ݋½ ˟mG9߱IKS-&\zf:q)jfAP+5IZe* +^f~ g ԟL+k?3ֈk ɞֹK֔k@Υg 6<'uZt^rg{W/!Z]oVБB;"ZkHCci`?sqyy١cI{CdZBe5SJ,m>F uD:myѻpŮWu,vd9Af(0)7T:*xC7Pt'\^\dPfn08l6#vkL=n]\=쯯wqƳ:>eJM$ ̀/5kb\,~ϦK`8WI IU<Q\z7׵ kD8mY\8EDjb(Q}ogsJ1"Hȕ'oyI,j2zZ}ʲ7RЧ3> T.J`nT:ikG+b$jr`Sͧ\3 S^IzBb}3kO̴YZ(W݀фdؤ{g}9v4UH)C` xW#9Cܰ.xi^,l7:UxʰNDx8 y[ނ;wX~ 96&ѐs#ӌa۔rǺ)r*H1g )mw~wo}ItS#ki-guѣeP"r 4t޽hg+~ jV b[uWB2|Y+Tl$쾋첨!y'y`4d u2X_V-4#-aH֘Y0$-nEG,lK~O-S8 rа=Ms HvSJo-6yCkg{}yFt.<r)0yW$V#v|ݻz-b>I n߾ +NגQZݜ ~8q|Ω4}Ԯ8#ra%v( ÙַLm,iff#9ٯߜ:MlVVڼ6Zs3; B~̍ Ӌ#F`nW^wB7'%rΙkiJRQr΋5WG5Vv*l!h[x-SqMIEc57֍,)$\ mR>r6) M#I8/|x? f*Fs'ΥFEn$ʴM8I}j0Lb=5̘^1ۣ5uhPpںHk.lۅ\$X145y ^>F鰆=|FmqT+ MXqJrؿW/Ro|R%7u1V%Ia{=_|>i-i5"lC:9w얏!{ÐBTJYCZ[QXer\=>PXV%DA+e#lxy>$+kb<9VkˁA!u3Ef#ja"./np8`ߥi3f4{MK*A‘'ܐ{=&a%wfB)!>=wv;O cn@RX9LY4P A-\zKMBDѲ UoҜJ)ǑqRH*$*Vz`bX6RL:3O>:Bhz*REad!Whރ_)mZurF,`¯)[*BCH:W<-%҆ 6GI(Js4(})G8A uI^ 3Ez κoL;1Tw <{U&[va^(`w8lk>~10a J1t01rTLv@8xJa} 0Q\Gj5݋=(nצ p~#u,U,Z3jyo|y_FpDCCfp̙v:"95",7eAN\:HS)mJ^SI stqDUE_L͂ V P޿G۶]u1Z{sͽI$5=<ӽxӪ}{Fyo^_D 1YE ?=sPm۠Re4C1zVƹ&p/i7d@ 2I uٚXC!gH5'96,/4X+'$fC݈6"`5xgCSc Ͱ BpӅ21̌5׻+ܹsa~?>ͭZK0¸ZPHw ysӪВkA$)h68͠YEĭڈߌp(BO(չihV5Ԑ!"Ri.n ayv4$9U pV>eXyѥMhA9n "O17<؜DeLЅYMHu5waQR6@Q$-BդrlOb>F k.0oyRݧ ȴ$ErWJ06B8*FFfTmSLC=D#kY\VܮR!wYRDeI؝RsPzfUmE Q 6w]e;Ąq,(O:i)n'Wpm!5.qe. 6}Q%[o@vbRkJ:sqE_UnR$݂;Ċp_ b!p!G fS*T?,D7_9Z7x=W,5ƈ@ŀR¢mkW37iʠܮ$>\2<–D&6&ԧR7FT"]6 ;TWqtd^[x-9zj@ߝjUܞ5I?3?;wbǣ&Xcr ʯJ|YڇX|uѵEFN !c?Y[ 9GфK""[7 o}[z?KuXC1 ?qތ҇ 9?ȏ?Ӱld'_Jc /DZ }9#Ò6d溶wS:} +Rt'U05}]B ݇QA~Tauib p.[`yjc󺦔8 MPFIjF9c*|q!Fv;n 4H1W1e hM;hlZ-$M iIPK8NZ-C<&l~Ý˪Z7-)nH@åHJ~q Zpk (&VvNrc"!5j%ASSEiZ8hM oy>u<԰v!E]Ziۤ<DD$$\}]B8q#QX ݔ"g Xbihh4M5]ιR,1Ba1*y* B!b>x-04HT-GB6- 4B)OH.Ju(i)IלP=EdYH)yÛ8kbnov9C0 9 떹=pI3~}ȢU 7-o;>OODrS*SOG.^~]gY*fk)aXsV g<ք52ܦ y-7|7;;m!=u^i+gQ-{_hӌ,>O;xja%955V@*.[iɁk-XTDWtV%K Y;Ӑ ?4do"¥pZ^9?R:6a87buT:TF|pN)jHF$$ܨXR+f1A4MALb(T ԧ Su^]̇t1\9Gm_:it֛cUJ֒Kֱ?/cwm}t[$X}SzNSM99zK_/'sQ!Kk*F[kn揻DZBEnӌEF;۷OX%Z<5熻rE{;r 6YPxb5|6hnYko?8y+v0Դ{VKJG|eF?O hbn5~VL s5Y)8EotⰹXpkxJ5pB~_U#!Re{/B|g}և-Ek-u{uM+6)?zǴ)k McS$a[VЉߕ u EKI--^,6NlH- N)aw0ʺ;Xg[k@1A 0Xqf\M {'v|#.X] y!JS6ppsSfM:T#Sϭ{q50 skCRPEw@g̋Z-eBFϻąp XaO-.Ϩ ]3oU1PCw+/3Cqyo(mz/xsSRa԰L s>~>FU{&QQx o`zL+ˁ:-=1osﱬo=}OyuX/ I k_K#9PP[?fK3}3)1Zpqdw%7\RrkVH3^N|{Sa3AT.p{]l'Xkoj4CiXn#pEY^h?OK^r~sz/NGլS\BJk~SJױ=&@I꫾ Y6"d4bѶhZ(Zk OeoI}ʽ䰥Zn9،KZ:oŮ E9saq{:Z06= hAUMB@ Tx5Dds"\g 5"ۿ=&A~G΢Ŝh.Pn6MՖxc$a;Rl%u44>T c^)8S6N!b$0 (9c\:Ū7]-%# 5Qݚ@2^tEha{xP(l!"m{qɠaM#eMPmy-`)`6,Υ~sυuApF6:VxV" ePTUvmp"mфN@xPd(+)v?j͋.Lߝ#ObU)EDMy5L8BT?EL\bTM6Y:ARBqPk]fds.C6Bu%v%Qn&Y"K13 w͒ > m|,c8m{f)9wb7q?/Qx[H7e#[-OA- st%:Ej[bp2#WbH&3l5NJ %w(Q@4@s53 Fg"ko/߮V[j,Uh*z*MP0H 5&L\,}=4l0w\_cbw=NV=0 .{^vT9Fq{ge{0c3܆BPhsPm$G$mEn ebWFHu(m@O c`@'yEDJ2D9a-73^7.=bW{˯g~+WLGl <;^>m, eK[Z(h6Ɣ[9IgDM-mkpڦ$+dHRDi]G6P㔆&4,N:l ŖX:} 'M2:m90H n!>յRu@"ƒ'<|S|?>(9Mm߁;w,&/QM9!k77s-y?>'񜼑ܧr9Qn*J?F KK{5#4"0~0Pv *֌5&~ַ~;H="v@~y\~ݴ?QnAiN[uCaE,A^#Rp2BX 2HU7f55CC V;s^T>l)cF@)V T=j^ #el@ lw/.DGfNJj3H*xޚ3y 1J}T\YS{vŰg&C%3 rNk[j:*Y#(%x`^C【6ڴO.{=P ọ/YyR!jC@\­Y;5"€a[W-ʧESx$\) K,K|$ NuU_Ž%ÿN I"4R]`R$DߗX=JS YK2 Lp;tmop](nXX4OxŐ,nP j]N_@a:WVܟy|Taq}odţldn5$ktX:m nrLohܦ195 kߟD'^B`qjx[ڹ~y!r?'|zr,$ _:7HV͆,tp}nh\-ϩ7[B{RzPPKF{Dsu(u|_R4f^UjH5GA5L*$BuhWX  Ϫ9rZsbV=ۤCbn66KሬnĐBVsz\L1yi)P1U$ɘuu1%G\_@;gfCWx ]3Pp")e!JHL=@AbHb*s5$$iDI @x1 "g؛4yn֡8j`îYa^| gY[ڥz_.";h."p^-KAV-@ 5h$ٓC ̐PgՃY ʺ!<:atZtKEͱfտ{M JW \ZP=5`4=ܵP>\ZLIL]H^Ax ċMn6~\+舨j|Ͼ]ߍwzVrLR'Z![[>dҷECրY?j:V2uct}XvirmN z:|7}و1ֽs ߵKMlOzXTdwAmߎʯX\o1>:C5#VoH=Ap-j usQZ7} 3rr;r{;DU ([&ÐTLVXOQ:qNx04Es) Eex\k8gL~쎵)miBztVUntq6-bZ#vWWl؈X +G|qrs .ŽՃvi PyؽbG\\\5c5!4*h72yZaj]i5 ei4BrgK]CatϵQTݸA@yfuRD <&\ @/ )Ayz"huEkHt0` ~qp 29au*Di]Y{41iT](lU{&T$"O\aUYъ\ߜuy)'?5y WtvHQ-I(`fAL.&sW؂kl+ia택>(4n GQH:@s Rs6 DJ4!e 7kcjՒHk(Y6G=ߋ]ZF9S_c=vPm\5{.dIDAT.Ѱ֚&)N,6Tߟj:UO?&YoQy35$fdެ-!#+ǚ5TdsʘCėUunDTy^w|;>:Ժj M) S V$sr\4?wTh* Bөr?jLj硖^$4fxgMcMȺ=hRڻ182J ie0nJr&ӈ/ /+>(F:-\LVJn(5b 4 V 9O}nHiZ][ZSbC$rq8@ AlzAMlp4͝_O`A":iTzV Z#E҈tȼ9g(I_Ԯp}+& 6.>G$,bs\Ԇp/eX4芃ZnƉ di(Vs&U~{~S4K^@(*.n:I[+z A-BH@"H=QJ@(_Aq0JbOl2r_ A/zm*z2!56-au&;pL @onKv캹j-v iZ?{>l6ᅧ51?G_- ͽ Z|ҵN5Sz\zعt6 k[Y>s?__\mBւO/5#XRcDtcM)gC||!UƭEъE5G0}{:سג_Z,:/u D$.nwufZDݣYHf5\8 :J+bThr]4hnS;. eG";}S =;WȈӔd89K4)˂\35޹S5q6J&?9z[`PS}}?$b<LxG~p|FseDi FP% sH8A8)i-G4!8נ!5K Èv'X NàȈr!fPtVHcNcu̒n9kՓ9ckv&m[ e@#F-Bi;LthbM%K(mBa%OSk(,1#E03BJ.)BϚ+c/xa3ZS#80lK DHi>\p씒sk>UPNfܱй{͞lM2[^vwIqskC蓻3*P`ciȼ؆2?:injvǬzNY}/wGt^qw{ǣjSmu Km&1ۢ&hfO??g8}_/|u sDd~тҖ, ~gO /y+zh `10/!hTF?-?'!e{Mֹh΍ܭ(uA5HTǬEs[`*mpKb}K!X wrntP쀃5 d"R%6LQ!"BeaN)[ vPê1fmrZ hVH뀍.XD!-rKve#d!DD C rW@ݤ_a_TQ<^Q~sE{/ MoJ A Pu{QJ[c8D]KSCծcqmiP=~:Z`6N"l;J_FAv' 3?({Mkb Y  ooSO=uۀ-yX!Z/:=׍9Z4ǚs~ kM7?ӋyZ8&Ku[׭07#і^ZRܲ<3߶$\o{;>\q,5!CS:iuCCgP+q3\XbkEm Z) 629O Sk# D4hb9+B9~NnP3)&C(es"͘=z%:Bx~ *e Wssqa,Yh(X9ÚkY>5YԴ+!IRho)_$/Ѵx< +Q, . ֽ71ݴ"΢{jZ7:Ɣ'mPsZo}M4 C4釥 F!*1vW/rXWH]|RFqGƩɚHpߐRJsUi~ly.H(_:Wooln1"͢9׀bpf]dl.‚C&ط%O"p,'\mBnc׻}C]asx?ܤx ]ǚSk1LGhVۄܶ!9y[ނ-*2wZu-}mY{sR8F[ υO?/~}g,@\y5_\N#irz؝;Y)šDPQζ•.3Jο?G:b T(Q1%=Tyk"X{S0AC0*s WkT꘳B@ {=AԤA\2&TѽgtY7冠etpc 텡{/F*}ѓ5q4I3b͉qJuezx[^<6h`F\(RDZ^/ Z`MuIW+ԝ奙[MW>ۉխ oò +%60a{ZQL6B2azLUz ȇQĴ+͹tݸkjF`aU8p7Ϸ¶JbOOiJ RowhKYqDZ[TcV!N^\:u0/RBa]?4uz>mr-H-PY.-Pk 2C)-Fd0hN5cepJ:bHR ;4 C\5*\`sSAKcBi #9=DDUgϧ ~w=@CMQ_gdſ)X#Us2B\:mzk&gg4!\~''a9iu Şw;K"I9zTwmoM_<DžБ!?n}̏6<NǩohŖ?G/:l+y3ZlgtbPh@FuwH0 ȻkY:P/8r,TSt$k<weY{piuMō"E!uf:ͷ%xr ųLC2;)%>Ai>6е!$P3㈤JѤjO c 4 ?P+nK&fsaI-0zHj@X׵N HR5b PxvEJa5;|RT)HZH+=ܴ9fk oJvAO0߂ !mt%+1ᎳZߘ6Z"f49(l.;D(xW#C:si~4W ڏeͰ{uM_@T2=_zB4rA!͂aPèA54م>@CC^jPJIVyެRE'{N+e¼ wfx )5`bԇܦ&> }Y""!(R\>7vX{ust\ "A747MɪBފ>&9i=~0 $d 9bߛEQ45EnN.}nϡ^ 2\rdZjZ:r 8xȩ7֌"yHRք,Ak(Ț$}C{M[A=5_!(xiֹ& 0s>"P!$Wlo&~?JE6vp8t'̎F:TGB_"tfrgłfmT7-yiAnddۄ86rv=yBa`cb?sq\ jDiחg@MBӤ 1ڐT-, ,NeZ̎C6iBHH5\rmJdARB7c)6hsˡ0u 9>5瘝^:kKQ~Mk@sS*p3 R ط"A{~Z97x.Ϝ*âg6txCFII*Dʜ| NϱTYa~L|H82&A=33eDmN<Յ1/h#ys_|xUfZ, BusS8AKU?A4M55+cy3Dsm ۿCCn}J>oL7j@i8>GѨsqoBozM6$Ns%6(>?EvT5s>ŭ5k$-9`kDc3z=Mp9Xh8hiL^,~&ť$=}(T06>̹e.9ѿ6jCQ(]c@% kIO=-\|tI4)i;,þH`Cn504a\_G{Iv6,FT Wy25ֲ%xډgp|斗S65˚j#rrqQuTL(gu8-ji\D _ӎqIuQI?\D(ӑ"w]e˽2P6͐,r0ܡΤ( o~O&DI>hMBΡc=\1Mǩfd!ZH'mhZPc0åk%1dd)Os;qqqU{Vu(4-M 'H:jnUٹ(rnbi)@K ~R1Q!*ZKX.H-UXƸk`blttGs$fǡ`\#|Ղ KQgUŘ4MgHF&,t+?Sޅ`Vġ^7v;d~55^ܽs]"nf>yT:0lRó^%&φQR1*;7Wbk~gSM|x#"{.HsqIRKj4 efg3$i$Bmp,cþd* i30HNC)_ gqyZL+煍j.e&P&Pө֖A!բ0꘦* n %pj7I,"zFk,qB9vTm I^~ؐE/NIVpA8X[*\P&M_wCK_ 2fzӜ{DQTo{H4߁ۉ~,/}ң ΒRq4ɰ6wY aEDa}'dgMN=vVSݾ?h)!rEZ1j]|.\\,K4'+TiascMBᦻ  ÚPus7zOh#BQ4%ìԠ𾆊0;+JO+|[ !E2tBUPў~ec&䣐4ꦣ9;Ph"!y+ |ԹgjX qhy{n7BC6#/{ܟ;:>ՐT#(!8G(aAᘯC\یs\&/}KGEȩk)dg )=똋= {NO4EW.^-5+U L:>q;Bu$^M3'ՑxZ=d@t71ZeCˤ:bt iZU/@ڐӄM Aq|'Vz5!J]jWyl2qDЁ`LІ09O/yI{ChIV JK)`e65zoo({9&#ΧzbN¸ ߽6">^+,vp>^h-/LD)֗|4xg }:i/Z6K< ɂ̤NO>\b> D=+ h6x@(6^6(40ZaU :&c:%DF);wT$65t+^(8-ɜC< K~ u%#RnC]ЬIšrǖ#t\+5BޣEZrК79wތ0߇/o,ZXGX+9\*5l\MH)2_Rh Fɭ̜,M@Au3=ozf41uؿ:ܹ{39h[ў5(YP刜ܖ 9whGN_o k5Tvl?,ks),ߜQK| [?-^ BUgHEsajkroKB5]_["+*lL aj[z= 6v$pv3S>J~۱RS^]] d DRd0^Q^0ȐaB\l a n)ZW,Yj1DDh7Z$ӇpfԻP5&Z7(`9$a#t5 )m\-}]SQ]Mj#l)'|yױcDbQsjfC\^bu L&6jCA! lg(EM"x/@J+9Pi2?'˄=3g !?2wPm NN>hA -UxGQF"([ALvqש@i< 9XQ"#E|瓜G =jak>s6R/<K-w7w`Dx߀xTRV͎K͗vBPb5cv\\uaUUHsYBS+?e^Cmȹ!khȚ8Yйoo>95^19uM}i?zus{S__E_wwޢ{-*F2Rw-Ez*r =|[yqm\`oRk]z62hhͼQ uȵE1L3y`MLRuiyadH?JqʚJL6P1%@5\vy^8pAIs'l[}N5!4N(=&Mo>ܿ_nuXפEo,n^1m, ڴNkCYqג:mI0}{~?v{Ht5 z]5as:4 @@LEX yV.^9HύEF5nWsaSOXtN AݷKN< 9Mɹ׽u/B&E:Ne@ɺ E&ǣ@DnӨ!Kιcnck$ov|\lFEEE\|t|=ԝkJБ5c?׽ι[9iC:u44;;k\!Yίű7< ^gBnG i |% utqrՒ7aJ)2iBHiGPӁ׵ć*9H%+Jq JԲTbDLJ"tF eh-P^o\cxOG˚Q^Hl|̣SV 4][/a4lA5xjsRj~ţiت;P>L:9]M EP:\ўRPmZѹ>@|q[l!uŠtMP 1l,ї4xcKMr2|YV^K/\ň9:w<qu/`¶(&TA! ҵkB6T]j,yB1R"od" -},"7X\ܹ./ϱ= YBCnt,sE췡dݦx.䋜[D߶!yXuLt͜$-J9w|ٗ}>JS:EZ%7ذ㷦W XCE5R ԘpΎu4;hu J MO}}CeZFZpubh!TyƘ0[¥5?ڒҊ+Yd'n!~XCN&T0fy朧\n'ˋ NBAnzlYk9V˺xe{W wj9p v57$ [WP4T%Rbo5=h;S x]iY Łb.Cw+G@&]k$|%"⋃s:- ìe ex+Pg6 C&CB ҳW?%8-pYᵓpT+ NT) }]#:X ,ӤQ@ƩbB `*ܥjQ74CTNq &Gܳ6ME">xߏnWzXa!a;Eo0D.!!F>P@s1DQ=6k "lc^E?R5&.5S n5S<3,P_is'o߫%k] p)t_$;@A~5WDb { Nf9c4(@ yUι,1j`^hauBrśbB}3 IP*v , { ,YI8bF).!Mxy\svۊ*(mW G[C-'3w{\ºQS΄zދԭȥk** R]U:0NpFj*A'MjziѲ|Fâ!q:x/ꦎ4$ "ED:6 MSrmёSȹ4s M1ձ:e_ei_:k֔,!%t-sJ)T䘍oR֚cxWFfRJ'ۤӡ q0lBuR 19V$=NBk6B@@AI2j4@jKR}8Qk [ZxpΏ栙S%`ƚnk? U'\l/dGP\=wSvt*$l[og~o9a:YKILPz״RҬwHrzvGrvˮEpiBd@_Ѫ۵3I\y%|咄R'PH(iP"y |A̗,OU;(h7)IHwB9EA#Yҷ]* g%R&PY4iBܷ^1# )a>]F )[sg0{ik*R KQ&B> :M{(WRyD5^^#;/I-5Flznzq"@'z @AafiYUa .>Q$(Sk. m(5[pIAE>G]% zQh~ w~W /yɓgߤ!pqq;:z0i꧚aYkƹt۠#kts\ǚsSh1X>~ov]:YϯcikMK l8,e"kԬ]=˟ǧ|n$ :SOW:yX-rP辅` SŅDSAv$FLھbZEkq$ P[8#A(\RZ_#jaHiĸ":`M(ޱ^oEBQunjf;wSO0>3"&&>[ a? Y[R֊!GT8$gcw.{Ո|]?lO>$RJ쳵)l(XI=t,)_8asW ONsGq&ePoݓ9$R58:Ij|hyDɡ*qB؀yWy_y6ׇ$6v9#bd8Xn)M-rbC^gAi6.vitB?c-5/# olLQ!Ku2Ht(]*եe;] L4wVd>遚35!!l6CJLtb@ B5±̚;Ϛ\Ȁ6PMQ(;{x {54k+~/jc+Rԏ!_E_:1 a0(Ț}m|wO~.]nQ\ϣڜ'kHͨ2 W= -YXZ#^hȆ bPDn2hSqTR_̹)tFWrЁstIð~5~1Ei&EC\^FҚ$ 8d0R^81c2gHJ AR3Q plfp!I1{ 1Q"JJ@L}:nw񧞬w)YTQ-T~"sSаj%ZB${)hveUtJJO>dPyډ|Ë pUm4+ WTŋ{i8}Ȅ7k$=s2qks, 5RD u zvMo>&榙"ę , :7֖N*V#dpYD'B&OzZ=C)-6#ڵe.st!5k1kcǻp6zզ,54*o RqD~׷KFLHaҾ-ORk'1 r97 7}7ᩧZmB0ԬM:mYg=fd>%OyS4G QW|W&FĚ; m\j6k:V=|O?'x6?gZucoލkffm,%Ӈ MSR8˦ .XkMMI!!-<7#lͅhC&ƚтNSnDuӵh'͜'g^:}"=T )Jَ)N0B dl7_]TBByrܩS,qQgC0aof0]ӈWv@4a\? $3#mSʿmvy T, ER vN{@FsǬ%7* 1<e짳Uԉ &ďo(~uOǪťuu~MX8!]& 9`dڨ\͹h>qm+l(E׆.eI`GȐIڅKAP&UOӨԦ6EY@_'CO#T8ibPttBJѦΎOZ%.)|2@0PBk@\/n-{zZ4 z¼jN|G&?lVѼ  U趔m@^GՐ=k>fÛ #K] [=ek_Z|:~~8v2U4#kYDzJ!kȒ]95T$}wW:b}e34kG7Ub>/ScܽN0CՔN+5R;+k6NtE)W]nuj)$}5E Hɉ}<=!@U^`Մf9Q}BЀEj8XXpb)ȹH+BE)M>q^D'(@֠>[ڔЉSE2R[dns 룔ؘӺ?:k> :C0T1MRi %w#wG\Kױ kp]TOE1u"gAiXjJYkH0y4$ƈRO[ *Zߖb-|>sYR:cӌ{cȱ9ʟo,2r ?ޜ?~Ԩ9^sΚ#"jEOWZ7MHROםQV~eV͈U\@b9;t"5z<:d XHcjd8EMk$V$̂}COEtL>Ϻ1 ƄaG/ӋX!? 1cn؝57lv ,9V^9$d|4Ք씥viM" &J b+!rNk ;(6ƎվWU߄ewO(ap cI ڈHJv#xÙGuyQvlYA-؂8!*MxT-]RCg-$$Lŀʢ-hDЦN^0V?Ah~݆L/wZ("hDȅ1M{ Cpj6 j~WL{4= sĬ ְ̨S5N379Q-iRrnV6LPj]E\o6i~gtی60G>CYAi\|Gt 9G2o>goP̌گPgs oB˺)2bk@n۔$Zssl{50E k֔:))O4/0l,}/!#k ~Y-%ѳc&Lɯdsԑo+JԌ n0^6ǛZu~L1 Q}cʚOђ2Ne@Ӌma1$`#RI#e4\LWCP*ֽGiHM$0"hؓ|yN{w}|bm,X0( X'rc k40:R>HRkjnѽc|'>>l$Ji|—~P}^sɚO5 Ms۠!EFnc4S)De7MK/-f}x5? 5hϷjt=붨HJ~G~]9Я|աP^(P. ?̂jDC.ݚ(P cDD]8i͈_iDkXyʭ"`3$LyB.b_L08vPaFP A4,\M7Sm0sn!$0&ӄ.1ibl9"Z؀ aL"T tRJu}]G w\8kIꬔ0\$mq¼E$Z^'akLC y\d#"›؈qO2.KShК ZSN*9ГvRANi}-&YAv[ZۢJDieF8&F 8˿Au!$+J \f/ B(}_u-S?eT 5NӔ1 QCx)ۇ], ]jvbBT'v`FKG'{md䒑bc>F.YKiV)S͵!_Aa9پiݦ y ȹwhHnE[zSsMqYk\KaOd\-bpo۬Mcꧮ%z֩`yr YzM nqf [xv_E/;Z0Y`"f[=:ۢksm73 Ҩ ͇BAzvp!+FEjT/j7jr4WDq@008NsUAlL{j-Ċhc5GdUHhRHպ1pRE(=1 ݀ #hj>Hu YPb$ }IE;irQ*z.Rj(auo56xUE唶(Kiw\6Ħ3{:܎9z~`uΜ4\QT Q]C3 ժ6rbs儨VL(##dOpMNad:|JWCSAAF4TҊnNLjǖGKY 2A>tYx$!)$t,M˖20 5DD/!dT+\ O9"~s_eMd7ˀZ/5KBg1 rW@jѰ$49%7oǨs꧇ E+b N1sЁBakl NZHCmt 2OVvKMG>h9p[*"sEχMsA q55- :(v,Dѿ}7@fA9u׾I__],B ;nΫRʴFG sMʚEZSrޏ|xɧf+\+5PNM/BxCZxZPkrJ7it̗*oZ焔>(}5UA\K~*^淔qBDjѫ")Z358P5c OB'SLV+FqE2ZBjT,hHR|F=l5^9g\=xL W׸}3guͯkH5hWf+n*[džzjfبϠύx,{6"D23cVj2BAN"I@ExMƽ'_xSP;_QpZ hE+veՈLżYX6b0Dd Nt6} PIYX2$;~ʣAZ"$;װ$9^eUDXZYX7R,9,=\7Q_P(w$=hR0Ѽ M%DI8uϼ!x%s7)x}Y?ο|K?,Rh,LLqW$qlphBy*չȣjJn|4#״vsøh۔r?GW_]L-kz\ñۏ׬՚fX9vW|՗ t̓ز7U@E?sWG7/}nkPB,ٴ+*(I7P]WNr zDݠΨZuXB2B,7Àw;D3YR 29jݵGNd8`l}P\ s.(xi3']PDbԑq f@`P 4H0!fk5!^:pQk)rS݋'js؈01XY @ji&%)qk/M|848:9\ֱt|?7X5C)$uM ݮ˙ 72sv Cy0M^ZYj!4S_[+i"(mZm?/5xQK"ʮp4JcY`xJC|U֡}utD\yzmqSh/8bf V*\B=Zmk0JQ#^Bm?b<>wޘ5GD 3xem[|WQ^oIJ?֐Ӥ(~<}h{q!n&*-T}`i8=𖳆dԥrD2sߘ# 2ł~2|Vdvݱ2s@y,T ž3&ozsz1Od սAbC.B^U7j: ?A%D0sp1\ y)k5( |}| /R2>1\`j:&Q 6$7qzu΋Ns2|Υi-%Mk/b|Sqo %j\a͈(iEN XCbkroTOo !GԎ5GinW]HfOI kԨc5V;ik22J0匜 q_tSɈ$i{5TqM(\J>Nra~4-L!*ji )ڢD$OX ן9 50$ gL%HP3f:zx J[;O`&4We&LP=Dh#A j2JRlN܈xJAS$#k)(ъ( HRl3:-h"!*tTxڴwQtF ./s5aܘqIVYR^Q5Kф̧k57gѥX~v*Ԁ?{y3ε#y#$&_C"kTSh)Td)tH}&kk蒫q*]C۱Pǯ5Nn91+r;"3Oo x1J-E]Fh䒳BMa>0ۺ=1;L9睦fHj&q 0Zk=2α{eõwSbJqqn p}phDA߀E: lӜ Pu"{:oYs#clf0+Wypo8k=dMGTtuS έS'TrƤv SQ:x(Rktޜlj4nYR&bvǬ0b45jV -DȎŠ?}7)Ԁ*/MKB1Pt։m97A " \ÑBf>禃9 -p۵8Kf?z?x_H:e`F&}ְxDܴU-|&Q4#Ӑ,ǨO7ACNeB>nj;G%+`X!ODou,,co5e͛9USOQECY|Y.]w?,>gIDgf,h -#$AFIG1MpTq(}QKuʥ=CV)vzNٞC%)*B)O \^b?Z l!ʸ!!ǽP4Y= MaMZij-2jNdp\߇RqR̹D_0Nނ^C$bBMN>6ރĜI"m{]^vH!uM#QD244ќ[]hد`EMKǂtp. =8 zKu"u S)&+&"\C 9"xuz)80T 9s[nC@03vI Pʒ_@%Q6Bz u [Qqz׫iJ1[zQ@fy 3 o1$猠5M2W$/MKa^_5,YoB˪ ΋x0M*(k sw2}1胼JG g ߞ5ϋ+03>?WR~z&&ƇyMCrà!KMűgNkY;&^akݿo}[ZZM9Ԭfd1GYM5%> |_ЦjIm >Ik<*-QL @qy]=_fk{7""jS*U*cPȕQ8bzJOBm?$bu'.%cৠBq HIiPljnqu%8$ð꛹=&fbOc5@f,MT!aó~nusL! i?k(K9ip!)_2u&zń_Z7!NǾ( S[Bf`\b jT!|BshzҸ|Z*%RC](K戫r۰TeM-8U I:K :#m CuU/8i*a WWPJobPhVE*r`!Rc'Rjea׹XDv׎-C0K|Wu3]M>D*e-ܗg"Cޜ5?>^F)f 2]*,}a[lVNcB?K܀aӌk`I4,MSҴЂ n\%kn폇zvD>OdN/mB"%'srDIZ]v[WC_k**J _z6<ذK4-@I$udJ7آ6̌2'9qyCeE^GEws,)"0M'[sg ]jD Q 606J̃JZm): ' XIbbY(4z*A:X619Mz\;##Ntȓ< ^ ;j8)t$K(Պp]p UK)W {6R\ri~Y /`׬cMI+䨾'p\KBhVJ *И>YBE|~:wEOJ $|hsC wE[J &i&oO\^mH>`5 `v&T ^$m+ܷn"v;enNP2E *͡m 4"NA&R9A ԒoAi+äKfѷ]#͚B!JM~N3C=n(!D2']`jvrX̢qMYw}7>c?$2o@&P\Y׼ykN ӗ=Pé y>hYe3r{Tcr5&)Pnj$?4?0ՂUy4̋/"FǙ[D~cZ;ށ/i[DlRh\*[- buJu_uDv PڔB6Tcb(8F'ܮ+휵ς3)%{(lѭ2B:\Ijl5@CAQ 8:eSs(\P( Z9 aսacf\*=9U1d>w[Td kx^ٟ]E2ZBE2KךNX95-{{?nBܐ&f[D-2z=3B#s\=ښ坘u|>oga;Ӥ/R4PhTY]5c)BҤ sQPfHJhBPJfm~J E}qq"h GٳJ ngQHĨc_34#;+;4+ )?w+e>kۀ~iFLjU(c@xL<:Q:TLW_刔#s;( r9 ZN5C$9hKJMįZ!EpsX'2z^MJF ^ysk0-tK[,g .026v6[H>F) .JȂen֦h#sO=}TjVQZ%N(ſ29#{+Qg\8KiE/.E%Dtk,x0鋛2樇&8b\*D[6Pw RwR o+$~8x_WՋ7k璎uA_xz궛4n[jXO5K9 oIp %XslHkDf: ÀfSߙx{:O5&TRl|]cJR &HF@B6ZrEՑ2?4g:(t͑s bjvm9Qo\c79OO.dXd;޻w̌YZug6!kɣjB/t֌yzsZPSy',iiwm4w:̙X#"-9X)$:h]=f#[+ 7LU*I.&ʓ|-Pv\=}H M._Zx\"fo@]@\m3DsqJltjDimԿ50 * 2I J?K)aH i<` 8I퓭ɓ,j:tMm*+n藛H,F2 lO + \'QSEr\YPNָf053KH7/^%g['l`=~WF s>|3wJ)i|$FIQ(2>\ s_ȹ_Ӂ,9r[:x6J0:+??l,5!sTģsHaY*Pӛi@5#u}lk5Ua.x8HòE]^̨$/QhD(eвT00!J*EANz! &GW-?Hvj3Aw`f\l/F\]?@J !a܏6ר68aR\\.:a"ih 2kxXzc;o6Z iZkqD qл1@\Xx'  CW#sÅsR2kUPƫ ۻ8 ;}Xld. ֆ#`pXx4"8'C-\'5(ܐ Ґl6 0rnMHա6e!\AZŴ@lJnoAB&oӰ x0$Y v <44"}`M]|3wX!RV)!<JfhQϤFE-sAPkfyX zqJs&4]Q6! y^-W|m ۚu5)ބ^ԣ{LnM9"ynw h&< >s>x+ 9%\>s/&d^0䱞7q:&X_?,|מk-3k=r|}??ꚐyCb fiWo,tΊ9*2wʛS"^(9ӌ?yk ^H\A_+tO֨P62Ή z- ѧِYfp&mpY# <8e:T"uĹj)iDL樍eQ5Nn1gPpu}f[)f~wa r& ( GܻwLCvE]j\h߬ FC )R3f"O`,\FW*s'Э*m+mAi 'P,WP415MzYϏFģ"l˄TH L *Un0 B_ޫ7HVھ#>G0 lBƄ8ȄtIc+4@n~s\ Ĺ6׿郼rНj' LQaH"rxppWd'ZC)_7J傌 IūFm9SU p[5ѡ;yzM]8RC\v+etbC8@@@ =Q^im߅W~ҫ*Ԅ,Q;|Xo@T-eIxӛtHs)JM3Mȣև<sՌ$k<T!})h}9v],ox? ۆazok8}s6<joY _9Ek^12!"p/FǾskD%(E%Ƹ/l<Z^` I27F7Үŀˋ 0KCbCd[ O4([]c*¦jB?#,a٠*IՑK]eMnL,C{4yzN{[byi;u;@Tx (Zv%Uu,+ZBC'# 7pe.5Hժv)p>ҀS\-Mlc0KB ZaQҰ+ODzrr⳶6uu?'DC> Xx 65NsHhP (!F4EE X2$b7xv,z41[q ]w>vuhlj% b8h("iB1vQ8NQ|%ev囃gy__zB4Y ya|=sq15sBŞk7||Ϊ7"V&\v%sR32VC#\%ZMC|;5Rŀ8*;(a0l6mlo9t5 xCUfy@:Ƚ@Isf c4H y*JN!nE‡-6N+=-q¼~35;Y` qR:?4 ] ic ._EDDh+둈(^sła Ci G! O7W8z!Br*;s$yjkyn;o&Cl>Jːp &%+>X P,MpCKVrգ&;L#; LZznrxUO6%!QAd8Bb4U; [08kY.TzR@c҃됬M*EvڟvX7 c)駚Gوom)Z7EEnrߥ;W+rNy}Ϳ7{{?bGvcȒVģkksP%D{֚uuK:մ!r2BgK֋B#)w$;Zj+yOZb@k2T"e/Ր 5Iǂ @l`41 j^Do}s* X4s+xp}H +S20h+Z)gL-jcPcgXR{s{,zU;f% 7/Ȃ  LŽ 0qJϲLN_ju z򅲦WUNYKH|x'oׅO?7񍸼<@,劬,[KT!ҳ>4oKZϣЭ5#编y|QoosErQKvKRRʺc j2׊]Duẵ(s{Qf2fC5DQ+ymc~ BlΗ"OÀ<R}&ŷ@fujZ"9$1%YPݱR)V%s SR0撑1&1[sXP bj"Kq3tÐ:4MsyPZ`4M|``Wµepnb"688R~g?Yi?\'9~7Bջ&u6jtՃD]|& v<P Obt6O/4ԄqS;Q :HE씮ǫjUXQ-(]ՋwZ[3]?mZO?~_O%:żwQ駟'3A%Xqu\ӭ>"ErTds{_ 9Kj~fR|۷}bYggsTs(ZhYgݻ_x+?[@ %[b[=Ka?_?k զK цn5*c iq$V +%=n?fit⌁B Qw$%̲8*0b|m}EkX0k#4u"YtvU0=GGTvY=kFNOQ}C%/v6-_ =lPuo+E48 bJUtb)K*=3s)(bkbj!1EO5y-R$Cۃ91JRJoJlCI4)b뀬v;y^oJ i ɏFm~l{d2J5)U7~$$)$b8հ\o Ķs*J*- Z2wB R(S Y+ gԬ6"rtw-;Y:G(:%D a!'!P4@ޒjct+v(h  45_D=aqg G L` X{Q ׸d2ـDZ *&#T!0iXP TdrI%:|pZ7%2$&$P6+ QrW G "( 5t.b 14/4!D4ݺTG :4@nJ&0pS#rh֐h7F毧o͚}_??W'y29 76| }n4S-\&z9CP!'KuD~S _9ɧz ~KK]?FZh"ͦ6")Jњ7%)K4sR֏剜ӌ_[...&^YD=Mk^RrK.ZY!S֡[h q!ˤ.3iF-Zk1MPcA]Gٙ %*@F!qǸ˕q m}j>8kRJ-vbcuq{)KE@=SO 0(}*Q8/AsAf=L8_"LJe"̹z1K@iŘ5M$ .S7x'[vBr.&bpC_PRKo݄L +7to83-w-wV|,QX֊3ik^U.]ki pӦ҄< 4LzX$&ZS9#lEQykbw߅__\uZ J[ۇa(Zם{ֱx 5f\dRЏٗAQc\q709@B,J6p:Mrǀ@@D7~m^aBDe#(FcӒ~ˉ*fe?~D.YG SvRw ٰ^rk2+*Fd;xZˡZ$S DR]F.CL4Tv1)"k`X8'DȃSR*xH6r\7̊^ ҃B$׶הi(SeT ̌ {Bu0a7ijaO5 (rK[zbl!Y¦ "jDU-6i+-kޅZF 4!SaQw)5ҡlM7o=iYўwDž;8N:%X?5$8'N:fO5% :y7CmѥtG &4&&nv=BV:-5EٳZ5%0M4 N=ؖ9-8!Kk!_V{`7ȃ!Jbs0N[;Z&mdqtǵf,+d :R-=o$~ܼx?q-rXK %tAV:ZCG;xew%:kBDi-eU2 a* Gђ7E&釴?G؆ V {G[%:@MCt¶[ZWY`z"d H[4, ͒d tqa,lpvCfq_5MSX/'α(B59c`bǡlLا ejTSq8A9ORr1KXSH̷HJ4 idԔQ&=Y9%+ĽUx/6.Nh.* wFtvmN< 'ͶOѝ9k?%q8w4!yZi?JUzO[B5ohEi2|iuNչ)v>ȩ\}:޼Wo眪K!tQu6OͨSE]'Țm&*mlNe$5!{aa3Zв.iRyUK %6Rz hې8 YQ62ް$iMj1q}}%V(("I {;c1Kg ; sP .G|Ջh7ojaR_$28pӯBL($w g6Cmr]EP}8zAMA4sNjV z)1a :T{u50s}\1JbjRtJIj,F9z9}E5X.=dDJS=.7V=>N ӔxŦQ8S&:f_4$j`,Is 8җtzT sܩ!AyҀHfgah9-hPlצBT y&݄ZcbD:& Jjy;]VV8_~/҆l9l kb'7//m <&ᜋOvPiYyKmN5#k26%/O9goBもtѳ )Zrrl 9\Sk@={a)@,I@=gݜѬ.oRfk]HqC)fPc9'6NEmFRJQ! ' eoYr"RcHHSDj1a6{'iBf n0v Mn7Jh7!+1]C)eECM>?ƸN>Z%s6A׿YztвF|#=˚Hzp3ؖ9T*rכ{__lHvT ̧z>8" [RwNO\F6P'"qYdgDDEkS PZt1:, f ଋy0 9%17fR5+=O=zR*\P{NQKu2ƂכT)ũ{p-hZ+,nqԵs@;L| .v/4¿ΟZKY;:oܪ= V(ix2"]^ZdЇߦKVMGXr2ZP<ф47"[` D/j?&o,!zmZ\ n@8o fvQ/I 77˄$!]QG_ub_3Ihhuc)iX:aQ{qCRz!@C ?6AP8:3 FQʌf$.`x׆᩹)ݲ(,75$ȄrvWgH.^$D珀ZB@!/ݿ%΢kjClT h4uoWW77->}zp*Z/K >9wxc/3З?"BDl"[DNrF9sZc~>g7NQ4$,-VwndwɪӤFxP"38Za!ІLTMi[ZcU kJU!(THRyv$Ab'2"WWT͑5?lcrd4Cwyƣqi2V*9#Wj"d=@M 4Z&kC#!0`g)&*@xk?MiMieFAn[&GyFoAy4Ԑ[: kюn mNJ*6֬AݲjJ}'*D G/[d5=iktdBp5m lA/M.GQE9nΕ+E.n9q<HJ 89x&s[޺NNL0x"NH琒d5kWlxg>󙓔5K)BAG`k0Аue=[g/'6tZӳ5= sM)NfM%u\R4GsJO3;3TkCu(f264͹2v`b'/sVjmCc5k'B=ǡI(vkY 1@,"ud5f{rƐPFIϓ;gY# S5nv 7v"֩72rs( A .mb&Aqr, DpZM׉KzQwQW%?(}ʭ7b 4;bߜQ"7bܘe M_?8ٿ{M2}:QN-(ËMiNe l 9it50z&{Dhږ#g ZQ+8zWOH3rhV݋ZSm}STY1YOB z-W犵s\4!.K@T֩kRӜ@Z5d|?GhSݳrΘX3b]g6܇ҝL[3rκ9A ppBV€$R "n|I ֚S ERZk)#')ܣT0pyAJNm}i<4i7`0DoI)IG8l!uh&|!gEKԬZ2V[EwǵYʪNC< B4-,9=jDžk(6M-~{=Un^$]enE6i6^DUX.ȁFYq8[Z;i[孭BO4O^#‹,uBJy |HPCI@oʶw"[D)Pk(V=\ɣXSPY839F3! Q\jњRB Ű% =Jr;q[@9PҝݺyG3Cֺ07zVP{_VԜ1 N_B(H! Vi3#Mf_e3,76$ܽ- ?yv3bve/ 9%P]7* ڟao qncV d)mocEe1cHjt^?0|"sW׺'BhY'xr8F)- BYL q>Ld^X3kHJ$lһ C2+S[%I#)22E4LPv0nҠ `MYo:zH3Dyu@N)y׶״wxUQ^XaL2GБ~mj^j+Nj/t1Hы!7x_җ6Q\jF}TTl0FN(ئޗU8sL#I=PH%}չss tyY[5]ֆڳ_ΔCN^:A 64A|tXW]ЀS"PiK)u,?M kkMDCFU.xK(ϴrzj%̌³TYPJ_M<0ܨ,uP!z!z4m}}u+lneL.VrZmAѣ0jE% ݐ'@>ExR*ΉZiϮkBnY(YC {%ဦР 0_#4rC+IP169YBr1SZmj(]j!rCV뵔Z4;`h L_3\$5Y,Rhڢ[܀Qk"f]652k,F{y ЫJd\Z^/Ept|6@3^/ yĺqyC bE(4hk ÂF?o܋QsTð(!e׿٩Lsּ>m1es ybphȺ~W}t "sEǣSyfm4 |KR>)gA`S皈K/~99h^4͟yrQlrP"{$_ x\ҚïEzx->|R0I2~irRFCҟSbs|2Cof@ ?)I sF&Tn(Nź,;rј~RgRT,d(>*1)g7ǃRl85 Z|#eEy&.ռ9DH"j WMS*)L=AݞVo[QG?Ԭ؄p}J'٬PhׂX#"",YpgڛΈ 6IuC@YB8* ,ܫ;R-0T:(^Kx!3+4t%EDc,5P֨_|ȾBMA)vD^zӚhٍujA+myMP5 FW/?  c(SNtTڴOQu?Z7=K WXs?y&ĆHVEK5l\ҘB":E롡~q#DA8!v?oa]=+)ɒ 9xKHp_h1"".\Ln3qVDvoDxi:E3JA`َ,N2P悢w&PJROm4aA{n0 ]Dzj80GlL^I|:%kCs?yed@SOA7ɋ``{@ 7@];@jMXkQN`| "tayoD5E8*u` *Cm!гrբ:r<K»l'84$) ;׋p^/~)Nޑ< (b5prXdα"V,[`}+׋}ZMk=Qy%;4%6AkeMp"S/y>l5(b7:lӱ zםnRl#|LDX\2~~N'b/(p=Dq\O5 P.EL.ь^"Tz[ȜMi Y+vRڞAPЊ +X. #d=[ HEGR°2!˚2J5xo9ϕU}!UƼg׊R屻U ;E%ʱ _0#v.Bn:Lhh\#44T )Ӑ7vLo}C`~1yRkW;ʚNʒn{g3f 1%U-[v4oS$ y arN;5Nb#B*]@B<97ޤpGІxZxyh -j38kU-Ø0 a*R.HtlҿV9! :%@VdsF]V<Ƃp<I geٔ¬.$R)(u,'OnsL{irHsڲϛ-b(3cDžPO'N U-ӋsيM $mj}eY]X8-&OXowm~O}/mڧ~=Ƌ/99=5E>1MOSٟw^8Gڲ^?&ų![yq<S)Kz?Ps,"+|o^xā .{E~C &X-aT*cԅ#xCČȜҭ~LnV~̔C& =8c/YɜkiJ K~k'yo4hTq5WmB2*5͹&pa8£;r&r REu1?D3(q@I@g:QPSzGs/ṫO:}2w heQFT?K(а4úPaiGʠ4[fl46RScw>FH QGNMEt" EQn&p!3NRHp+7>"˔3r7yq6qVłuZ1 lYSWW F'CCb` RBNOwo^g#hȚe.b"jzBwe4),Ia[x^,LIO3G[R|hl;[.0;~/ 0.nkF!di~uKtIqC򓇆%{/ I˺D?rJ7a(HG-} 4TQYBG7&Kd~q >sv΄j5I@ܛRf^ ! `4*Qu|'6 >")4=l1!.wR a~i:0% 2wMZDJ"{puyiMQ5T4f}p^3tbCwIooӲy&&QeݻZ[ok_ 2f:p}P|A5Cܬ.m^K'3bY|Zo,kF,0%! O}pÇ%dܷ^zm>K}(Yd 4_P|2@D7ꤔĶNQL*g'Nb-g;"f1٩Y.v_5+j׭)Zhx~>ivԤYkw#ivIuth硔"VSq*R&[[@B4QJv%QK 2 &;r {Uv740.2$0P#419NAjQB#պܩ]9\Qum ]aI1p-E[( 'U(A]Ԫ֊Z eqXlJ7Dٳ'fNC K4\%!g4-YFZ7?qGģւLi1I};.D8t\ =I+Dؿ7f)R/4vy% A|Ztң`H#]5hi(" g[W)RZ ?Q#oxSz}(f{k=ytb\C@)28Mw|컆={"Ln"t&ϕ;}Sl:V ˑPyQj+nf\v p"H,ZGȆySgohhZt ̽҄e.+2ns\S(5Sl"HqiJn@:˱V~Vun7t8: unK#Dm)EoRf\O5 [>Hx "<  B3TE_'+ԅT@}^SH/c`Zlzk?CƯ{jBѐEo^~TޟTpIU5ZV),MP+Wܨpy#"t9k%_$M(2 kYdȞOnSJ~745豜0qjEz˩ Z-_h@Exu-0侗׸yEW_I&;&DY[*@U:,J֤1%Mo"!*tl< ڗ-9~& (am(|"!ﴴ Z!XL`MNC{Q1\KKt qPol7%HD;;B̳_%YxbG5;^AYi 5*żqfՂyѨj<378%4c !:ݙ d]!A;ђ"ز'r*F*P3=,x"EE2:ԌW"r1|u ? jHP;ŝP7{7q'I^mZօ[oш.A?>vǹyy҄לl%oצ$fGlDtЌl^B:yDТ#9B4xץ9wR0)IF!N ajM` [Iݖ5\DIl|ewZ5#cuF4 CtB"l˼2D~u%B)N8ZzҺU`FE:)0VzUr-MƼ6I kV^ЩD6(7jS[o2Ab:yC@MjTj݆6H: !r>5?I*5C-NџajuZڏ«Y IiC'я6AZjתYF4 @HETg3*a?0 ZZq}}%>ӓh$j)ش4`H:MdY7n Z&oY-4Mㄔ Ø Mf jhtS$|jC)L b%mjnX b@*RZ ٚ fXJvʌwk4/Jݪ甔+u4 Ck/Iv#_@MZ(blL.)}ǩd]ݲN5o~W~"ԇ #7}8Ə<^R)-f/|" m?58EB!N;[iKhaZp;~&k'>3f"pm@aUP71h[[]1 Fߪ]XPd۱wwY#=j-8aGKj͞np) qHb\8i~'Voi- J2Q#BR!79@)k5ծp71\T`s epZ(*oKi2&q{BLU*_RXp04o|Vֶl2ZZօ0h"X#B'ru'sm.^_कԢݞ[ Gc0GV6 hM3a*ߚ>GqSJr2㶲E1ڋuЛhfP(uRbՌEsGIj)R0g3i vܑ:R9t}1]O被;d챵6%K!&4 >ѱ4CK5qܰ{ZA)OQwIא.9I7/+'=Y0FmHgE-k7xg?F0\^2u -# ~Gb#bEѷ9YkF+O9K"!6#=2(tUJ3)B;=|F)lcRlŜ0{=A$U*RnRTmiIqNTߏӵjy8Ҵ0 C J>XVgVSFel'e2f&FȒ Ҫ眑tgٴr\fv{=BCtH\L(S8̫$c@ZoN@%[  ZDUgl`vϠQʝT$mޮ AƆ:Bd--g DCtXrpC7\`І$&SzXX{^R񭊦~aڅ[n0jY:pXl %d)9cwu2HM/!GfnERRfYc'filֳ֌VlRVoXn`5dtx($q5nDQM ,Q|̛6(=Ff !+JņrgחǴH55{?= &:};Z Msw~/Sem9fE#GV?'?ɋ}|,>>7%PNL>O㭷ԇHòFd{N~q$oNds>Dr7""|SB)ͽ L:IJ)wY 3u .)ߵ`O)3haKi!Xl3f6R.4ەQv6Gv;E4Rܳ3f%n0 4f È+hsA,jKNRJo}Yd^)Ҙw;չkV#xo?y9w;|NU\%6b! \mL,0Njd6>#" ,~ |" 'Ղ`Pո:2`.dIqY F85+V?;9t=ڳ-h<+bF~m*RI:;wNIk jŸہapf Ày|8 -[;v=)Y8nuQ}CeAUrw$VȥA \Pٛ$y|0xpϋ2Ѣc&c}C M1Z,ݜ9 &6LO Yp<gE\PpPx{y=|?zϽ MX/Ml#Љa8kcQ]$߯`"N f02@g}%TBM)E12JxHZp`&T7 E0i4\@znh4$ӖMqH0rS,!祳iijf>@ӆN363) 5PZ ^om"i)B_]TlG 1ԧ^L>׀-;caVzDD9x饗T&1].|?a=}cA4 sZ'3W_= I^Hz霽oݧQjF? ?qULFd<~,ֽr^Ŵ@ Cu_}D'ԝSRE=IA3%g4o%wJ)]PNaXfixZ8ssAD;@k\9CUwMV9*0F:Q4p8jVF䈏]nwpkavG}5 fOa^MMKXJv2jY"ׁ#`Mt9IDV|AT&R)4$BrZ5? 8diHD/(9gERn0v׵qAp[# ,<&izxAwD5y1R-D:W {4MUkj#*Ĉϝ,*ˬZ6Mc7 n&ѧS 9f:PEbRJ>|Ǜg)}2o~a0o@D8jggV2eXAZɯgcU0(5ȣ愈֚nE\<|ƯըVJ=op4шCF(buxFϪtR+K rէkuk|g@i p;E^䟺k 7"#yᖋ܂ËXJ>SLa~%ZOv!N쒄 MH%JnJX!koaĐG05%rhͅ"Iu; NHeϾ G=/P F E?bzKU{?"foc_c|߼>E:Sk;K3o6"禹)s§q5-ЃSE) h{ߚ`tCAl\h҇<}hک5\CP1CP[[v=!9/辞1e"v2"X}4D29M gʍ!-0Nq@ܕPڞPm?DWij*RRA^wXdGz.YP0Ur SYPH؃|hu Dw9Al VeF}!"[MfTuHъ"c.M,ry~?< Մ3?N[Xh(>lBY= ۧ6׵59|Ŋ4i:d̶)jT.Vnfxzpܘ#v,+-\[WרZ?ZnP*tsJR<*v{-7gJj8FsTE 1ҽ2ʣtqm^vDUiahJ[wQH4)ai3mB^WJ TTda\ օ]'nBfz`q{K *z} i"QYnR J-Nʙ0Xz |" Ġ_ 6ky,̃iJ !Cikv4BZż)[9ViR|wzDDakr&"٭~mQhU΍i^dvt+&JO"B-d*=Kc ͤH Mwb]pOنǹ(֧ľ?) ʥOOFk!"DDc:=ܽHH;""fTjyѣkƢCY3!6,wJ\`C6}Baxh$11weSilNm!T^jFQ=w}|֢1G"$0 0Ϙ 2i8zw%sGdTuBکSe$91h iT=ӥj]Rf>vv1ӌČ`&B݆=$e+-x H.zڮMss5`55y{?{NL4u"Fn;'lwT#B &J-=OHq#䇴VvN <[VI"qw]lHbr"Nޝ7RHV"D70ojRDBa'_f>Voސnnn/>O'q{ }݇\u40^T-|ccbh}KР" [?uw)Bb;Jb!fBBj|XUm0wf$&wVYIT[;f?A,"8 ޴1k~{ZsrzVnj< |cj:Aќ/~Brhucڍ:@F]h0P?Onnp<}ͭ!NZۓ꜍*a rxpU<+.i]EDZ'[O 26v~1k`17$"󪁩;}^"$7YjK#)J S `jZSEjzm!~E`iyX:)]u1U iOJlQҶZ7)iL]$s*E-JZ2Qi(H,!YqHCH*.Z['=kzAI(G܂37-xT>''xQJ4-Ut-?@CD ;v{pmDړS~%҆ĬRݮmYPvZK#ۜ kGp:`bx9Sњntښ3>]j7Cm8wY(-ee-qOdnבՀ԰}+ )z e#nF@vD uzx)%YiVDa59ՀmDV8j=Li +zhg" bt(A2;Э[FiNKIդ$E1ja}I`-~B`QJ=G:W%^̌ZR@I^K뢰<:G RA",‡AtMiHEqE?<ӻAB/~p{TқOUl$h,#O3&׭ttQ"q\` MkƥiC[m}p8rҪ eU1ՐDtdd?~%t$k!>F;ޟF9w_佮sD"H{;~$Y}?Yuk;,ʔv45ܒާDeSj {`Y+[sZ"Zt<8r ZziҰ$oLS­!4hP+J-&AGM Ero`Z.JD D(uMPN5Đu(L}8\o)k8tDj[*JȉZ.WFitn kGv;Ky"Ev"jX>>pfxAa]qŻ +/~G!C,X2K h ҐE){ !C?>Qk F-=iYu>[NZquuutF2t Uqx}| sJw[o<Ո5r}r.EDnC\@z.PBc˞Rt H5Vu!IY}FJ0YCY?f-8_爘dh 笻u˜,iĽԆޏkXFF#Vpd%}Fd;7d7l[L,J-ItIY 'P %6hRtSQvLFZ=čх~$t)b̑Vк'жnҜ=P[evAE㓺3&I0ɂy{fӜqp%p\ⓟԽ Makmk3kѠ}M)GQ^h%OYl,hWȭr["K \:"KWZU'$-Dj;dq4GpH"'s>g5 0b⹺tÀY"ԥ',R75O v[cÛKڄ6KT$6+AE>Ǩʇ1]*9D>ѩ&eߟ (.0Ø!r_rGuO[ԻG a۞qN9" 56K$B9'wÊ̌'wj!H HGt}1&_Фu4EByDB;M bgY#rnAJ."_"IrtăB˶H+:/ʱcbCw3׎O0H fs:o yc/ аࠜ3<)LADnD<Ϯ}'EQ24E]9[t"6(s9A"۩FS Zo:,ci;=2ƝNH@|p88=k)j.4_!#9eO^o|^22j)8*Rja&ZZnt\bjD-6hceNkm?.A]Fvs1["MD{ߔcQGq}{{I]b{F7NurҋÇw" /8|1YT,&ֹrgE!;-_SН z0 69gi0X=&+ba8w&)=uUUsᦸd52kf{ Ѻެ.?!.M7!7td)X*^ְ8_XBd10ÂuHcMT 5HXn0q<CP`S͈ ɣ8A/V!Cm(VV4S@9вC]]Y==wϜ^kF$ҲbCbAt̊ 3.Kt%pBG(Sr4´5X;rSmIp𜍸 ¨t2͈=9&rm;־Fz,UGM ƌZjCFI&: F i2I=/9uA^e 8faT.sk<r#W{yE&9fL/7ݪ9 9IY,#(uOg*ȋ¤F$pyݜzH\ h .q*X&M[Qل2N!0GY(#w 3?KF皉UEAW 9j9$8~A<>7/K{gDkx"sUݚʬ9|;u(IE,;wlUHsGw␸\p|||jS^ӵ܃tħ?SO%DDzl{hzʥG~R?j}CS%H橁sm/8{=0/8f}uРeZgەIY&9WmjC+C[;` tȂ4W XkRVC;I5{3Aw!zGV=ZJE.4qҭb)d0 <oܬIvŘ8Il{qi*}"B\s)`C9%5E ׏p4Ʋ vaDRY )8g *{bvK櫫+쮮0ͥzt:H-š{ﷷw$|MfҲӦ_ǥ>Ք̈́ط gB!$fuq8QZBeE"2F 6V4逐$gBMX<%q[4 LBk1 xEm 9VӨH]XRG1wwVGd-跚Ika0|)2{l{Q͵q{woTZ=ʹ@t9wԦ5`%:ٙ>==vY9vBfx!%s(I/ulS620@E,;d-L_5iE0pvp+s&$!-A#uqNl^d%yd{zkǸk*,bMir0hi DOkwy1[$PaB$U$M#cvw+E'%9[Ԍ _8dPM}oB[,Q&VeE9-5Q Qn,yțM[(#knnn9GY?fKѣE~kB{~hȳVp?C4g8:Ҡ]]dzC ^o]t 3ֈ}`a\҄|4s҇6'~?'>aUGyh@2*6'a^ܼޗsTl}VsnnnN҈RK%Ԫ-5':>-peGHlDҐ .(wC^Kumt{GKƀl]@tF^# >*%N VlY &I)%yT À8JcuR`L$1v(sQ]*VGM) D9MIw頨 +v]$f nn. bRXΓ#^ҺaY8vas岬Kg5(]A21D!&uf'3L Sf@C%-qk8$uPߜG2x R+ȨqaS^ n.\?#eRHpcϤ`p7O|">Jĺ@]sߧdg{ ^jp.n3>*Ӡ%s=>4:֥F|LιDȾFU#ꔽok OzC-f)ǹ׊_V|KӚ={3LNӅa.Wq*Q[-;A{_"uԀC5i|56Ner5wA};_ah&[!p;`vU zF@<2\7͒-2)0NFϛÐ3r04"0+Lk݆KoJ BD[m6& wEJaCr;y]pBJajcvLm89QvT&E] oڪ'7HC=6c[»CE$R[^/10p!2txS,rLUR0]dyn 7󀵻ʚN[ou/\qlmQ\Tg]#~?irI.SC/_]:][ShR|sz:Yd~~ -9Ez睷=ʆHwݪ^ШhP!N4kJ  Vt\Ң'Šp0r:o܍P KZ4!"s5PޜD\Q4غVmX nno1WxdF4֔t3*j`IIСaH ̵gc:v\4l q=S [_o< ]GF{$b:+G5rд 9y"g$"7z֖ɭ*2)ULTN@rv׋ukJȚn=xp?L ,^M* R޶vD@o< h%J03T ԥܧmAHQY$Z4 G EȬLb.~`krSy $.hS2>fD-rꉳ3`ѹqJ,0/a8ݴlF7L0܎1%Z/S9M/M,L `!{W>T˩fduպ BDRJxW' Fd{V>ĹZբn= CВKt§=_҄<\gRϓ'O6m{Ͻ⒵u/_ϡ SŹRDp8`ZRae? Os `mA sLp\*6k8!i C^R翶0ZE͌ 0" W# UCޡiit3&RD=ܸe%ړ0Nki ,U(V)gG׏9vℕNCX7$($74\h倔aI_W&y^ZKG7 `fjWŘvbygi;l:)oZ\ Ziii!a ::2DWJ*VIְ5Q/b2/ &ܮ)JofB>%VAxCNP@RR턺H)-Nb,?k@KPRFke"|¾jbnkNJ Y* & ^WBx!j {w `. d^GÛ ^+)qTAc˶(RvM `;֍C'rH"M ZY_?{i>~MMz R9*}qr*!!" Nȹ!ѷ5%sWtڅ&C")4֡҂٨׾[Y-%GiݬE1?"KƂjl5γςV`?dkauXiWWN 4 s]PQaŴ~ϐ"85ƸN1nq<9t`pUdbpI*iV# 9>r5ɸZÛD(epb"jXR1s 9'F&NP@KzʵsŠ+G/(-zT/nr5Of .*)Qmn w",k\ Os&BXICh䵧iR(5~k*|џ/,ނd5i(h$K C=Ҭ3ҊJ%;^9'e5\ZGX8d^ 7 9u~Ǔ'7JQ0[LW<xg?X}j:Бun OQQ>*Cgx?BT!i/EZY"[ײWrYmݿ64t(GDu}=HZfjjQQZ^))%2wyynt_ڶ7":6^8LkNІzn|}HNIP+c=(4{4M*fq<1 JyuTToOMc#f M4,BoٺKD.f}'8qs<ɓwpxXk!xHf4CPt@sYw鰝"z962m@ Ew+JވDʓN&j nkvV@[Wt pMN24 ZRA,l'ܑ̊V {:JPKZa[I"c8`uBSs~YAՉ.3f&*I"0V_ Tܡuu[:7вdވhi}z sDCu3)g>T167zf}MCw%.h[yK7ˢ SJ1eMj10qhujь\ 0\(BҚV5>F_0,񖮎;8qLkDtVtmF uF͐ -oP1P52Es44g.QSЖR1ѭ VfLt':.>? j"H Q։\\RLԦH.(֤ ˩&_}s- zfI_M*+4&qdr;byJ>Ǭ bHc+:),8X=j-hvʺQRf~uuW_}?~_'r:>aD~i*Ci?CQACNѳ+O5kZ}ԧ "8dMY#&T ֽu{Ħ!9*եCS[~>2rÚ /t&^RliqVDe:I9NWkyQ`.lcV((m%]"u4gepv8t$9_4a nG ;H0h@B bljA`Zifϊk!8y<~' fQZkAUhDd"@,hJǙ+2b -\Y* D2F:݉fa5֙Mo6Ρ )y\kSbߗR\<$MFȗpҐQK_HSޕKTQzxr)9|RֲJ-cJm-)r T;bbp3Ƚ-!!-K t61f.1o+#猟oW^yNq / W]kYz2>P.Y?پYy_#$u!~R&_xHqI3r{ p~^KN }: .ErqԮֹ5}3y0( kk]XAgGfnZ=z^rC4:<#UoI9h 0 9 0] xJ`T!:IX6"b4# )ZY&.z5+Bxq V֤`czeJ nl"g$3P40OPyk(zcYdm 1g($V\|6 6oq-Mc!"2Zng96( Qlۍezw2}*Zh ְڣrFtR#nt <ئV9fTƌ4dV8Qꛉ7 ae?N]&S"থP[v]bSmq_0.ω0gL55evM??_h7s;9(Ⱥ0:'Xy)ȟE{h6&snYRO4:?ޏ?6s?8_Fk d%§ч<6s]/Ax[_{5x.۠S `l&F еR!)= ͞ęnm*EERE]qimjus3J-.^qA\=aR\s lnY,r," j$f ]oAQjqO,ܡĩg͡UwRP C#gpa(B"H 8QXX8D}ń?ba^ӵ֛YOб)K[E:ky(IЋ5#x3ݗr kCюK琖}{'#Č^z g?|ܼΦi<8 .~?~୷:DiYV|_ӽCj=lfvsFw1qd_Uݙ3ڔ/ɐY(FL \' c3`V;hJR5xZcu&!9gmҭrꨍ P8R fELh^ĘiFJ2DYv,Hq4m mc_$ME]Ba8~,0~(@a9Ԭ^]M2`z@6T}Hh&₞BX^vs,R\г6]ۖMyh E[kr(`IrJD&~\EJ(\@a*0sC>xDŔC!'iv+R)EyEЖ9 pcXkmIw-Uq»'izfwĐ7jY5 Wvw" >R' AM7 I{+f5%@H4Zلx-`:ʑ|16ɠSRG:a hA[niD[-{ݘTu"vF|Mw#:ucH 9d?΁.yg{?d]~*OQhY皘eG:fwY}s7ٟ{T&KW_}}-OOMF'~8Jm=hUѬܵXdJisbf0PXb1su{+eľCȰo܍KRʐ{&v;l&pHjihڢ0hqC2ãGԦ`;|\VaK?ֆԒCsE1sq1"ip~)IϽ6EKI( U{DjC>SY# YJҀI4jibhRukQ?׳MJohz"7#y5,D6qiB+iiOTӉ\*jH@ rCM;hb e?bRurb(JL?5vCZmj0SU*80gDX[m"F)I*PK<\HZ n]-wID _Bq9'GVAZ2emZ{D]!I]'^,;7N $%ڠJg )9ddKn5<"ؔ{9_>Oo9du"tjHȏ#2rRǙuir q r%("2v3Xkbc9gw߽WCED+&>Oxo9DրqKK׾Z+oOO\mHz|╗docnwN]id$n;xkE!1P0hZP 2.F#.-6̫MhyȝnIgYղ_QzЪRhJ5ٚYLD!z `R*wXz3qns͌~f=[ 9{޼*y8cxG6\Z`Pk8}Ly ̨7O0$SkF\?zy)O9rv\2ܖYLsCˡQЅ8iC&tO L惷,F o"aA@-8lyfZv<~ybZGQ7w|!דNna""rܬ§-@mֱ13ЊxwXtYUMtGǮPwvP74Ya/\-pC먂Qᢥ!-"k#C{Xr]; +n%16|VХQZ\ݝVK]N9ɬ*6^zI3z(H&k:`m㻦eь?}E{ɍy֛CK5'[y С.e_)r*={x뭷*_'?G 8r[ۓ~g_җ@Dow'O<rCqW~:Kx[Ę@S3ՍHc!{ZD U8p%>.U@&4En~A3EX,H)y 㠎}dC3!(b"Le" t#e* &eh^X)&D؍KJپwuaE(jDy:;=a@ */u6qMa%mb`b;e St-^lBՀSU'b퐵(i1{ 6Y0KM =rg(z,0[PZ"3Z-f+NMW\anFfEfv-HVFJ -R*,OҝQwG=xkSL<ް%C_nGWy q'j[@ =Z5D;z5QK4a B:,)dc#Q.F O34X..`w%fcE]'uw]V!t'aNOiVqss^xSڢ7TV~8i8P4\a6!O|f^C$* Cvuu o~]NxQGKz;Xzk*mdք Я3^|W~yrjK7nH4#4UiBoRwa $*R5&#>)7տs<~wQhݽs_ХÐunHN5w5~w~_ ɚxJuoUTSa%DȫA#BDidfҞi(s<,'Ӻ/MjϢr<1}WZgm6ֲqY&0Pn2Ѳ9gLqq\_?R{Z磤j)Onn^:i.8u=[%$1!5ST(ɕƾIɓ>@IUiCh%X!\$$H/QJ>"]H@z"Q &W !-)3t) 4YoyP{l@C+Ms-3O^;; 1 Q7#V<"Z N#ZRǍރ $ca~6zOeiZqX7# s֖C4!T皈ۚiUmBj5y.>iDNQ#223o-_Uo>.iDNd[h""?0W_p8gT~]/(PMiyeK9X"2Ĝ SKLu5$ÌFst::X}6VЇ=Z B42g9V[C [Ӎ]-,Č`Bv& ܑMI74ˡ;,.aRY.S{@bTp@4UK^|%\0O:7DjԲW$#{qO4&X .Z="i0!6"qZGW#D@DN43E BOKX Ec 1X9-jxsH)pRUQVQGK^Y|*-7.9k'o@N 2\Yj %r7LRPAUZ-;$fsZX&9ɓ5yՠjw!*M䅽e_ԑ/w \GԧuaM*\3l9!!`./}K_fqh׾_2i;(OFy16"Eho~n'K^pe# X#o_7Cu3rnNeK[?D&\q_09}}?kc5&[sç믿<WyfFk}hȺYk_lS }ȗŰAe>4w͈jA6q=,dls"cئ]_b31{F$2&4-rКA]Cmxi{QA~cd{Lb65ÀY(nGpmwLiHl)]S^ϒc  7\ ;pzj\kHz_x/"h׸Fr9m@luƝ׮J0^RF;>VzʣY>7VJY륄{~>HnXc ,&== DK9-vh@R $wv)Cz.p2+?%MHH#"$w܂ bCCޔ2Q>[-Rښgv6.y JoKxh<ɔ"fԥt:b+sk,d%=ȤH lL_Ьs=ǡo| ZFyQn@y1pq"G?>%:WPƿnԭַ__;ֈ'[-Y'U6&_|mm>&dy皐5 x*jrκw}/:%V?>4 &Rߢi]҈\Y##[)ȺaW5'6#By/|[~~𴘏Ǿy*5b?E $~˾F-yDܤ94S8EuaӮjc$ @('S\-ABZȑ֚d(MD<-R>HHi&4&gϺo66N U7G)(fI8ڴfN94 fu>j:=Y Go!g]#Dl\3AN|@n*SDovͨXZMȮ Yؑ)m$')rvx>HXQEg$q,G0v5np 7Jc"e& I(ʐT}!6N@JAja٬m4y9n䘤,BYQqn0GV?NRI 8 jxVnj;M)K(NoJUכtO9M!(UoL)Qk 96̗p qn)뉳oV$LA(짎kΫB:>A=5ԛ<>h[@ }C'jPpr(ˬb݂ok:2H3E?%|m}X 'V [ɺHTp%S#`oJ,sH"cPCS[%qV۪Q/n"aF Wgr&Y0x: #jr6vhRQKS:!Qś*KbpiڂBuU|KKC~,u?= `CV.v~_=%L)%/1#~zь/ ibf}>}{[=D{zNl@$䡯Ez?(Y1EY"qߩpZB{jDދc}z"52ֆ~? |MnpJ?t6)V[%2Sh/5 m۝*([AA|5r;n5w$F2 z_[z 5MX2}VmKMj!\jC"K̚w04y,׊5C>\vzC :9猝搀: JJ[ 9(țwŘ3oՊۃ4XHIЁvZ ߃팤 4vd&$yU4No Y{B#@bK@N1"ka! P ݶ\Q} A ^Gt1[5k CтnSwm hM$w"6TPT`S} щ)J?w"n{CX'Ptn MLCU$J@T&x61N"0W Gh2}EMXLaꕒ2&,1R5u 3cDĄ!=hqFZtq!81P1 maV/hu@(&VУVqZyό]'O.ܼ~bBjWBOcf\XTh"0i#?[n Pj4lN.k@ʖ_̕j`MҲ숈$8%MUO@[c61GM_o@GOa+uDO)h\&Wj 6=H'kcjZC?fsE+jzy&g3Jh^G#Jhߔ?l͊`gy'zk=B\l[y.7)-sg:dii㵹2Msd1^ҊGӲkx)<4dIBqvv m۔yt/OjW ].Hj=3Ɛl)CVtèXTᜇ."YLyC܄%u3:B6iTBg cb&)U e"ζiᕮޠ[uMe/C@['+1VʍIM~jZp`ח~%bGĉk,V'>6|"6fzy?3DJz(H%DSbU'dX˔B<0$n"uj1EτQ`ԩ륀Σm\nBsXꡔR_\šzzUbyѶm憖TUsVNZ1 Ľ&Umx.PkmTSŦU ?_8RDʰMRgLgQ)4Mm/ߖܖIQ5.7_C 4p_GL`TN@rةx! V7 /Ѓ &\ov"8ɥ{iFMȴ!^$nxΣrԺxgo\y886x m&.*\?t^DZcqy姼 v S]c$mC|Bx݄lBאc}?r|p7$urCʱzj9O]c>_|niTn̢\v|e.1\UEs&{0Nz0ؾsT*Zl5Eq 3\ ֎0&H]~wcwpU4u&! 6R`ê넒ޒ4:kb*gFfY$>ϛ-UU6Zzg7o^껶).O@ Ա&v>5B| W+yCHIB^?e%E{WkG+,2!GF:jJn %ХoŁ#?ubM %}j6D kK <Ѐ} [4 ġ柧0\b Xt]Ra7iz{ 4EV^fQr9*f!Mvss圹M8ݴ͉h 0,TcDju R-Ǽh牑r?)M:!.Ș+ a!5'0٨by=iuj:,0 En>*o/gR<<$Mnx#-'7־ۜ2ZEhZ(FDT_Bß5x7 nOH7dH M`؏˾ wu׎ܾ7Xsz]_Ϲkh}O_u]ߏb=qȏ˿.]"\ڥSͩbg)dI31M+uFd^=Ry5QBgx5|ckq?_!%hR3R?Rr!4dg諫rB *ʠ3G_\2&u|5'&bSeQ7% yܴhRL!8JZ*S1ae DrdmT:"Ƅ)1~[j%݇qsl5 )RI^O u~5.̩ mTP:,7ʶ 1#, 0dsqv6b(prz[6:([S\m*c! z{.Rً UAэ^s*PP.eDT@$h:tiԀ!f'1?D1IFn1iJ1sj#H;ɇ_c8kCE"ȣ#klFBm 0"wYŒ $6+_\<)7yVͅ@Bu sK Zڃb ^ Sƌ`PI2jM=k D2 hH<|Z۽o0.'9hør bzy.NEpC?m:}]\ḧiD׭"czlnុA<dC H%]L5Pri7^hN0ZZlpo#7A:lEh<}JIr +ME>rY_ C@r\iR*!N-Ym#`󭝎(?/kE&_g3ґ]-xF$ŘJPdC]NNSo5`\ 1"cF>L+k;$N9 m[jaN'!`ƶm8)\Պ|q[0h69pTߟT,|Ju/E,4E9"ńUR-1ok)%6_qڢJ%M@εHQu;/)=9ḱ)KǾ&fN'ӆe/Us:&а~>)%| ~ T(+¨D3LODeiSNnKFe"fT_X]m<>x=z [Ƿxχ7xx{GoKȥF8D;1ľgtmpB7 eC4!S͠]`Z' jjP.Te˱FHꋴ1bŽUmӪIucPN j1(׆NR!Z΢@#db !7j9-d642dz9hx㘣jD.}q;b^>I,H[[׽%\w rU z*4.)ʐZ A\>"/bdX^M8U .hD8k<0YMn(".Ӵ+ubVu:f9dqgQ~-B—k [GN:O+oꚛ7#=UaDUgST)/xȺ M IhDDy`4<|JkSMj`xMTW vfή ˔-LVقJC3/LBd}o{Tp i?8<}4!ADUljenև[C‰IH SU. S@Bn/x>LJhy4\b z]0l6moW~W{ΩYuR}~-חcVNdnwu8NEYwCu Z2cM^iH;RfEѐ; @4ǣXwR)eøZ6m:[жHDZ&s.9yz 0ưŭMGonGz,#k| <ʲ2Ar@HKCmDlWǹ֪rqJĭe=@lѰ(4aI /{Z=N46Ws8 &*Ti}W.`n@LmS)krmG@Bʟu>3}23]l]N\%6:7|<oۇ*(P&.LY\e}pgy_~ f$m: |#wtO5Mv/꫾ O{vDVnLQ$KBc'"|2r8!A˺&dݩH}\~ Y&^w Y 81(e19'uZEJIQ$9.Ȩ( ɳ?o&y N bepoq=yIղx1% ;ѝOa*h S@L#buoG[ܼn߃o=Qwˤƙ3ƀ0ZoC 3{8B4pi^u̒:oe(Fq.̓+{utQЦpM\7KK9{&뗵QBžsMBYF1*HnyV{v o߮j Q~ 1nFIMC/]HLr,87"UHyCԠ̺ф:h싦Cpm:-1ytSW%F6 , ph ;g71mJA舻hOVDd!eBjǪ.0GVE;4&h ! zڧXՄŜ4Ʌ45mZOS^paEVcrLc1"U菥{E[KPL*,9uEmlP:Ys h927YדM,P4Ϋ+.x_l \htv'BD|NŔ$ $Ēs*Vr >OCnٜ 50R(^6BϠf}BEDvI4ҝzrhheȉHHi$tsǟGnZu=~~__>Q%E>? BrjֱNXw9Fq}р)NXCDgpM8wEdK2z n ` @ h=亶ƃWA 'CD1hdD얗 Q`+|`RhCe!sa I*]gyO!d-cc۹8 АcȺjFPj33C8ɗ5j!~:P.BcԠJ"}SΊާ 3Vޚ" <1sd[;ur HsczL{<7+L"Eč6pxTlSN^X`<O{Kˆu8|MES;#OF3crWԣ:;w1`'ѱ/"6`؞f {W I,f@Qd1;=ܨDm )1Ä9$˶|)_wQ+"u5-.YU:ޡ7Һ)4:찦ռZ$'Ű _(TAN2:,AccDVj'BLXMP>'LKd MAuVڇ .p<> ƫ@^yH W=uO;ʆr6ҫQG8f|%L8IH_E{/?o4v. k2[V|W5g-s z9cLq1E{~qItX;iBe9uLrL!dϿ##qA<3=@U$U֯Rp G0B9G\4m:\R-XO ( hEGR>kr.x&]Cq)!CFj;2/`kFgM(Zud*~*pITM6;G3%M$GCe<3)qR5ClRL1[$5!k&8&q̯.)aLthTuCMzt-ձ3}LbH.]!?M559K!6`tޒ}! |"bXwB{ ?܂m4=e} P9 *Qu% Aה9y\~͛ Ÿ}vN NS\< CIv*gMDoʉ"3u[ݾw ØLb$Nu$*ͼIk*u)'M/.kSrRYʔ*IsAdͤШ,``iYh꺹MdtkGDӥ)Ŋ[XNR~g6:Qa_*IQ7OßT'A?Rӟ *QpNq)Dx|#8p<\H ] A40yKTNC l.Z'R*0H&N&h8O\WbGo nxs?ok@sMj}yz[ߊR5zQu^w)9V~;s]ueׄ\Dr(+M1̻nf2q%R ppw?TiVS6H~h m-Gꠧ0W"s5H[ih g_b nT2_ dMeĐ5Ps 4f(nڼ": N4ix\#kAMZ\jVO?g{v΁lh8BFVētpCʹhjjlb)fX#zL}9a #ڦ͍J$81fӶxѣd hz-cB(f@}ߣ:mƚIQZh7kyal5/*+.\FĀa }6n޼Uӂ3 v5v+Qvbqt9M<\"j@NG0`]Z\z W}9m)' >ӞC)iΓ9ka(}L&nB2͊c)۲kR ֣YԮVuB- P+11k0Rַ"Hw:C-8Xm38db?ay" lUMGèI0C *jE}Z$dA,/Qmy-ޫ yR`5I1t#j@K~TqA(H})քXsgЭd<ԳsDXV-JdQU^4^G+HP N\D6tB{0.]<é3ɢ6}{Ac 4DPn_C'SxIeѲꦴ̈́}2=oB:$Z_2AX7$ssc)Zw`f,-%cQ<υ9 هیkB(](Y4&ץH2JQrڌ 5GKT]h&T\3Y霢䰰ebvCSQ2(8u!JNQ=W UHTe5Id*YQES!l%&6TaIH<Zu("\g-蛲;\nsP(_kӈmE cD:V'Cd)%z(;>VY)PGk:lmEݜ =i 6h@$j޲?|lɤ$C=Z'.2en=KUg 0ˈn$='Ddjt+ez*fΗu-EO/GK.[KO4"r'MȒ3V=V:%k_q޿wu7J ɐu)A xqfwOx`ay!pvؼi\^ӛ645>rC#7{D0Q@t'quʀ+S "̤CF|N+Ãx˾~2ΚBXھ[ZczqW}d5LyBŕ^q^",Թ@'Z'!ԍN zͰAY">ӵʌA^|i8iI۶&ɀ^ʚb3uP|)m]="3[uwLP2_NE0 ʵPhG0 0|ĨH=jp96>kD{PBO{cIDAT7Fn:iLL+5"s-ȬF5n>NHwg~a;!֫4 T 1NA4v9 XMiAށewbk.eyU I$j+Lnbn7BzXx,rش16\dx}f,WIu;hw4)672 ǦҍU煲)ĕo?e%UD[J xϻގg7(> :(e]UyKciը{ gW %.O/|oҗ"3ܵ di @h8힃׽7'fmA9/$k|oWFz&Z:iR/Lb A9eo^h1i$p14*틔mu|`& G1MyvyV+V8J:K=IQEMlczU+Z*Q:9iVA͑:i@H ٣ɱ.xBCKkF$DWkm~b O, ֈeȇWB_ɏ\t7)Oy 소-o#/zыRG?3F}}MRy6)R@{'=ssCT}Iu1׃IӱwO=QDǤ!s8 ]P.3+s}P*fczH^+k-5ճ }s_5IPEQ^R"0*y<;W̚5Hq,(kzE/tp@(#&p'|Cbop}ǤWb]\MIy )FDMvU=BUYGOkn⎙Tj ζRӌc#(0YKx:R&1qq>d-{SJ('cE?kl1?l 1Fl6_"D7݈m?C}M|QեLV?3" fFiWq2&9ຖ&sD7x>kK+FWn :ANV-BB 4$d"O\#R;JHXVя9uK<6EdMoǪ{sz8PIQTE.Z)$ń4^q*j(Z"ՔdEPF"侘B8lڼc˒Ql]AmA- 0cΨg 9cI /6'PJjUIm!ʞ'wa>цMP1yrTB䨔bMKi2}Sqj֔4Jsj)st9)1N/i Jא+@J-mAQg7ahVn MjI?)qҌ(š@^HA"][3H]c-D*;3RԾ"tOHpAɫK, 0";Wl2A˫L$g{pZ > qZDʴb;&Lza&ЇF3]$YXiIF-gf 'uN[ňar EjaVC5Q9ٹìV2mj'O5R򺨍D0쮝yִ>i]J&$%0H$ԺmuhH'Y:;|W>ʛ1^1SB|?W)WPͪ.FӖ:8Ie/k {sn''͆҈~#F7SVShl2p 1(9n㖥])[_':tv}/{9{.B"ܽvj ׿~ ;n]_??ͦ OF6IZH(G% 7dă)2HzDZ]\a՘,f .2VUi~)!!a ZlG!wr!EU=uΡi S&NZY\-D\U˥2X"/שILj@!r!dU$%TZ[S,L4}mLX+c( n'LQQK&4OJ>|/ __  Wxk >a:QՄfޏM\+Y"Waʹ4. :@#n >yҋ}t];oC^Mo+^bv^<ǒニ5UoX:W/5NKɾz!9&d"4c(Z"}ftOf0BbxeGN Z5dUCɰ!Y!π3/ǬZ0`ݾ4kS2L3Fty.5H8&$u{(jT|Q/Z.Fb mЇ O7pb^eHe03!Gj?;Z8QWXe`Li4A`%ƪmwɴ("w{\'#ue9QtM`B$}#' ʐ<4 B,%MֹA=qȖ;D^Xۈr04V{M#27Cg=$얦i0l0b{-u3+(Mj_cVDMpJK01lgfʓu5jJ&C|+\~齀opI~W$<]:3sy\]a9LHP>gU]UQKj0PR Of>WbD.x <UNٴaK^HԵ2MTs:OubRH\a.47ۭ<ժNNs⹓OduȡNň.gެd^F{/~ٳu > p|\k7bzJX:G58ahD傺zy]b ԱN:p# S|g_{̵yf>VW7GJ|}yn'^?& ׳%-1!QE7MR]xjd(cۨc,S=Y\ZVLP dwϊAJ9`ɦ)%i(>Әh(|\xE!![!H b&>ޏK3 @JtG%HGtS; (ךcӂ2Ԩ:&S5"&EMLo0+g1![p m{^?К Cӌc^syQ^W>>>TPP78!EEiXi*D7r׈=& ދBhȾd8B%EVZvQ^@Dg5}j}IUgDW&[S)Y'&-5"p͚:qv蚠fbeLR[&Iψto 'с1IF؍Xs<_WiOb8(RSڡprA5̲$gDQQTg"k8qVv6$$a 2Aj&xq,n7bTB `D6M cu5=9̌[3Am01is 9*?4 I!K1-5hnt&CtNA-!:GMn@*xX,SdJLJ^"jAKp'੯r_{}7q^Вł ͰTSUaLgog.!Om0KPGT lZPݦA}7Ts} #gn8LpsZ(#s'!k`¢ ]hYIs.-s*ޙͥyY336N54$8[5<0IJQ9KCc}'6׏Z6/ 6IwyE"}$#?V-n50x߂8b?Uҥ XDBhHi;L54锖 ahQ,V&ZOw-1'qC -xH)>OЃ!LP}b }2nX*֭y_F 'f}9MrJ1R.5EAi;.}.Q5aoJ؞9NX=>)} .Eobt0#5b2*B㚼 N5ʑnK5u& ŵuQ*ϜJmHӠC*ya䁲^۷7G #с}j47g2$iTF:I!cдT(^y _O}E|'oo_~pA?]cՓj)I^1욲,/r櫷Ns(kƍMEȡmZI4%eI([ʔ%ٞp?w.ݣyk"$8Y$SmUT!R$ȅ 4GJM,!2ljqxO#݄(7&\TDurk b̿S`.屛L W7o;Iu2Y?5O VM@]RïQW5}L>И.\ 4Y^D,DYwzpaƷaRJ)?7)%oE__wS:T4ib|xjYVt,ۤu\IyyyMȝ!IF?%"y]7lhGR[9OSF>PJ'V_;TI>4"5ґpRtdjfbsEyg[aJۙT5+PLS .lu&Cz3{0GWp+}'{3ˀS*nTپ[pmsA< 3ZX1-(M~ccIhҚ ĕY è%/:1*8Bo1V\ʅ!"XrLl oۭ: 80"ƈJTIS ӓhUwtJhaڮۗ67oaoatLk׮# gBROe^ Ņ2VhަÖ&ڭ@O ?-8i /z o|K~%ܝdՈdX!2?hba^x̹!X9HBGBnQ|pL#+ܘ0! - J^ϺXp͙bwfJ48D ]C b,ةV9+5T.S,6iiYRnZ2&C27r0yA?AtgNJlN1/PqNbudj+ O`y aSko!?( t4^Hà 6c+6a+nˌI2D6p%@2*Su'8 \G+)?_?P9Ye|?bxpt[Yj~"xlHXqBOuQCJMEұ5e驗VX& p[I,&q";аhjUnMG:0ѕ-o՘ǣ*cdŰK>IH!t%kkmα#O݇(/J $Шڪ*JQihэѽDRk{M'6ɶFˢpN~z Fə\J4 Rvٍ+25}Q]԰D_o! ńηu^RMn8qn^^ 1؞m[ܾ}^q/x6{hnPWJ(rI$*g1Y'k;4aDHJph%u 7jZ8t!NZM 4D릘@.y3W~ sՔ2#9w7Y/G~{~S+ /Pv|ߙYPH7mtx~8漥trͤ!"dzZBt=mVgjߪTۊȍBHA4,)Ѷvz)!B B=[!:މ41$0dNhFjrRM jM2,)NDQ]c4 W lK .WT;Em2r*%mXI/t"/}!p4^dx#p|{E}^yC O.*B%k_^|U|q7tW73Q-{1їLr dwwJъ< oOΏ]jFj[ f~^ȗ~.K: +P>*־|ٗ~ r9UR Rh9g`ېKɲ>?eLN4!Ҥa!Y9yo ,SI`PW5;u^nd0ӽ ELjJӗI,Qg&Fr %0ɃÀ{C \FIKFcQF9扤*{iGS-ˀvD罼r([&b(SSѱXz=k5C5h`H9=ڦE4{-6 .瘄`: ?y푪`ᆮ\k<<>[öszyݸׄ&8jx^qLO1(")AۇbIPN\ew !CZOG-3}UXݓT?6r8x]ygizkc PB;iSUV_@y!S#˜0"gČ kխybuRz4~RJH.HRnfӍ%jXːjKTDg=pS ~Q@%aBUZ(ɢ 95*1[u3ʴs)aN]'z-7-#ix|c5_ pNg@A 0^p ) bө;RreÍ> /cdZ2MPZJ 9qJ1SD؞k 'zbL g }fɳzNiT??q_G s/^BH`ZrPA~Py#s=8O'sk;ԄÎysp Jrm>El&hLPI8)dւ հcŬi4{H\sDcGCCI;i8-Vb|dh_!r$#r\C`L5*L WR(U/T.d"'z87ѽ)RaqȔ.4ʒH%kX6:qHBn6h?PfRXAL:,7ŐgJK.ލpڃ8Spk0t&spQ39 0Y2vc3Jh=l`\8ԞfnoEd׈T+nϝcRz6`445)LY7%\G,`qv80[4omf K4NUu$( cnNDP4)1)K"Va |ẏm)  AAa$ 4!6c0 =8rkk_Cu{ @:[ O@I "VLb 7o7>~"fqm>t|nPo{BW}WAq;F-5Az&o;5ONt1$ẏww[\SmܴcRF<4'̥AE N#ΖΔZ8j]:䳩k{1Ā[[޺͹tb0LHɷ zF+uη9"y&hbҚ xË/G'wVqiqw9a9'k#2ܭ\˜'NXus)TIE,IFS>+H(&ϻiiLfh?e U{k|iRҲ(V#Ac[>s}.;}mDLWQi`w_q7iq7"55FM>T>>:y;=Hq"d{,Brk}IՋ9QYZgt$S~<嘑⻢T=M]jQ14cb[! F`ɅYl<1Lc؊cNSUʄf1W ;9B82"Y qB XE)m4ztX ݄ uB 9&fX$[uezܨ1(hFAZeC PԂ9vn* 3|>e03ڎtg8xDb{ÀGo lns{˴y;dcnv+PӺR6 {,cuL7Ykg-Tî"(YȢ& h& }RvU SxBZDV)RZpmJ17q|=XrFV vxF44$%ATjYQ5b^-\byZrN'^Eo0YAb5NJ"nL=̹̒)񾙠MNj{uUߧ.k'#n r3ЊA+ ~X^s^5HH4y n:0\AQ7@i oхpϻ.ژ`*V[[IE ЈFqъ 1h(D8Wy-xo5Ro }jP1#RncN"C򔢾'.1ҳX;@)ao}ླྀd~{P!Y؞BYla>iT(pBb!\YoGݞG%‰>50 1r6:Dw`ؤ'vAQB"aXtu !|=b:D%4 ea=sTGG-pǬ1}%gNDla y,]5c8=plۚos񬮭]cɩ9d%F}]M pڡ| vlbW?p ܎rȈyx8益DHD5";BfQn\0!(;J{#ǚ+~]sv3\ ?0őBNbqINr',jUo&DL7SkDg1-WZDUqSE"}{ӟs3 2WI5U8"7qrfԳR$I{̎Unu(*(iֵH祦d_ԤC+kT C3.r9s^r' K>E%+k0>X..J:ȱDuP@i(0MzĻ|[ Z^@/]|`e%:Yj*ߧT5M[QhZj> O_"y[5:F";wWGrcYe E3cjhYg$`~}?Е4̒"{Ѕ0 :AkGxmM!ΊC63amIShSmT62IRK,ۭt9yڦY"$ѻF+[cm65+gRdLff;uz\A/p hHO~0?{=Y~o?#~K*:Ԭs'p&I+7#unH, Wֽ]oj)]$VX2(,ݨѳT1* hەҘjA#4r"g0yGl*ն-Pmr&XgkgSt1M^r8djBz΍>b.BiGS3>z=5&ָiIW2V?f$g/ O _@'Pqpe{S?gxq@0BsP 8uiBUpx 8 ^)&di=1ʎ^dtvId#DR8& N}ё 5#3Bs<|>{{Gx|H<-NpGGB}-FT!s'̲Fd})}dn]x KαǺE!!g:/=tcޘ #!MM@4jF'HtUn戕C |LCLs8#grϬr:I!.jZ4TfSL,$U,g\?FJ#N#]Pp5F %.1 QL,{"gCYh+iԪ]u; *V5i+da9w}U1B6 |q>Q΀' w`/Dλ8IE48L A#R`;7 xR0xίqGqi+4d!P*xTYBTuPc1ŽdjAM'uqGQ7>6uK­.# g?k0\w&Χ)œ%Pm:+B8·Ԯڕf=G!\V τ"DP~,=&\<L:oZ(\}֮EM[C@ *`o*E8H1VSRp s'**ݩN6pI3Ayiieyz߀yQ bNМ&N`̄ipnݺO?g>y/ +tsF\H[ mn5x57 ķ CcE:g"'}D'b7ɤtVs$/,FnI&b[HgW|{-_'}yA:׋sr'~'0#`!!j$0_jP =Pr<}ciB5%4&NJ^f*Pa STv-+[kԀPEV E5̐W:g-d/Z=H:i kc:8&edRD1g!;T.d'#UbIm>*r=R Y;*Ukǜ> Uth4q]+۶z3s4Br Vj^ }o!FcX:=B FB#cL])sb9t{4Ц] 淬8\_mS^jZ5^8^7%pEo,:$rd⠅0(O6_9Y4KHZkƫxDr ]ybY ll5(2^ qcmBͥ@EYCYN)+O#aĨnRCQ;01+VqsyY7TPk̗,Hq߶mn (GLAԏ<݄֔88 s H& M_N=, wYp;tǜo]P_SW?|xsg 2udF"` mϤ@ gk£hAK=qyFMlD3Mf2RZUN'pUHkEK(m_ ?Ȓ.Z8/P~!?/ӽ cCMj>.b{x<qKEc>4$(Ե)ǽ1-[9tT_sw4jQEL> %IX cXˍRvI>\9to@C@H DEwcBnx߻~/yrQubVejR;G2ZS$l%_y*p@: o*4Ú.ؙUZ_m&5*mֵU׉hߢsm5bl.Y:4d:$V3j,Tn{HTi +D& nkHGG5`7"bD ;H#ze"ÐO"3 r,HS7NeX`E'wßރ}_7| ̀[}/}t? N)*=yCڐ;vp5D)Z"&g*{!R|tW]r(OON1)yuXQKbrN~UTl/N=$ϽJgM40oƔ/>-7TYu"4E`տ< mo"4kPw CDPCFĜF\!"bGſ~yp޸/QѶKTd{^cu!;m@BΣ-5"K%vMuv ,8YEꍹ%2X p*BuN*:QċY8NQTAN޹2H)EGcC)%[c p頒J#Ezos>Mc MFJ!D-m(6 5QM7a?YNJCiit&NN¥KN9{Br\( #<,}LDPH3֘: A$W]o_!>݋+ p C/MBRSnH{"ؐdÆ4Z~VGʝv).\z߽\Ά+otƯx%?މ;$IzYfГƭ֤Peёq&MYN\DƄZaW!]M.T6P]qGGwi'<5d3K;vs MM3S.r;Ǫ71S8! $1k Xm&i3twsIȤ@W ޣ8ڵxo|xsJqs &\6 z>( FA>xC@Jڈ`x#{8UrYѴ_TP~ݜmL0glt&F"5h?bNE>ƴ,Tbi\l)6n%/ >/T~i_7&t}MA]ww[[Z̛}",RwH Du;8tCw*P?ԄЏiBo鵜z-8jqvɒyBEqRx yz=/<9Q9`r"Q#|=Դ}>=MI%BRRT]p@v*Xc])0{JtJc9z!kѨ脜aqRȺXP)Dj6p^)- uǜàMc)gwv>@9PCZ 5iI"68Lq1eҚ kܺu CӴX: öaZr3_{Em?YY6bAVc5m ^[f>2Mj+X.M'fӋτubwI"S2SH(`!W>zJej$Q!Z }_^u1lsf䋍hh /ܖw 18 7nA /cvww_A\7$V/7+ 0E}1Œ0},ѤPk E" cJy >MH\ 1S#sqwiAС[$lΊ*MXtPYS,dp`?0whXucʴt]p";Wv-e0FA|ĝCRgjc$$p8*ZDz7UԔ伖%gd+TVjuŔVL0|و&4.a=^xN5@S'Fqb:gYX5:2}/'JN qE+٩T_M~gx>\H M6׭5&MIBC2_k!T\4oHG,FJ%wUZ^n :Z1t,Om˾ɹ7nJ.+9w۳sa"7+jvW0{|[kHЃE)k\oViOYNms);KExsTe7]s: ۶EDF.NCcqhcD.LΞRbv  ͆ҧo5"$"yx/ _ҏ7#`Dm&hQs|T"HH,ucFL'1(Nm4Pq6 BǀtSϟsɁf ge dŒ6yY# + ]΍Δxas|c{\|׿w?S,/iD6`x;߉W*۾ .]Zl\%7%Fe_S2 6[hPA3k_D@B.҄SQuڇNQvsʂ!8ӶMH>yB9kf䚒 p9戗|7&BLdhFe["h'm mH{jSҌ )~nrJ!`2͎RW"f ޔ퇛*δޅ)#%"cmVVm}!g1DG$cFÀ qbxC.iM|K&+')bSz]\5Xp.3Bd(WU)@̔\No7*Ctu] 6+l|ֲp6$ĸlHr1CHyf6"r!VHQ!&\"Zx+7IyZx(ISBԦ8-z>FMXyNdL5 bB͊7#$ yְ%dx/Y4GFsWKaӨsww)%++8d֍IQ}_KO$;GjAft! 3lg$֯E+ۅP|k&S$wCKIH)aV 4)!D1#$0#B X̢E%BAN-bJr 0:c8; Ɛ&ɜҽ딄4zq/#\Y 1*9aIrAm]Q7#gzJGnGhwC'~DFBy2B_#'c vBHc/'JMͪ>T$FBa⨂89 c} ) Χ5g|ǡD""+M=?bF?.iJimN{L1P5wHhI]&;5SdAI1i} *,]ڶ"p:r21'& #r}'>x4 <0G}O`W(zYiTLFaXm MB6߷tw~;>뻶xL|NSǟ6Dd~{ـuX3 F0=4[=pkמg⋾gvkEnPy32/[[]]뮻l\BGj:$ HpUk.uQCȾ}BiB~>5m{pEm Q;NHH5+[KNQ5 rHrd{kE%"essGhk#H4C~ge9BCQ 5D ?9HJI"}~>L*4\P>dc 6 u8yEE2!D&FiR8U(yT^!M'niHSJhG뛉cOb'Ib]Zim9L)Yg>ADV.r Ļ/7?2B .r0F?-U5SUHOVDӂ*N*`ܖwrL<)&\uU%Pn>Ҥ k<߀B(iݍZ1J2? 1  %N".)NB jj\cHQAs)" KX-u"b0i#op(\Ih h%yB5KM'g=a3q]ﳞcO_jL~WM NQlp5b+ͺ,Ͻ&Φ^Xq1 1ŋ/|_CGw[[7wuW`5jԈ9q߇%Tx@汸bK:8iZK ǒNd*ru^sjtE"CP>G&;iba" ȜM蝴p%=ɹƃcK(DB1H\=˜)N`#"wgw^Tc dm29U!myB9BZs'돚@9һRN &e:TIjzc]` 8 T._8ƀD6Ð"kL;6 m;W[~qrdr~ddhwuVUgCDBf@MG= C s4C:JvYP!qX1)! a)_)N ?3l=3qٹODʋ.7&FI`fVkVKMNNxNV~jҮt) =0g]i#:,qM(YP*]sۚ*D „f.;[X w1m͂"A(BF} !n>]/q$L O ~Qj2L,"lZpz}LQ#c2ErX;"$*zO`Eb96uO&G7#K}AKl}{ۿo~qzz:5=Аc4#9[Z~ ʾ9EуCѰфb/Y% ϦG/O΄&J2A:$ ^!'(GuLa<1u3ᅥ??]+uKxvĿx=eS.'޿ yYQ@cA0b@IRgo[2D$!TWf&NxzOB)ktc p!u iByqw9IA MXul)h8i& -sCScP]$̍ Qbb0h5Y:`rqn)y(Na8ѤH"+">O)ц@Z݂#@rxj U$uNԒ9{'Z0Ŕτ$44JLU7%&ƛ+t ޷;ypPEkwװ^RRUkI/<=EEPc)cAAKL?O2oL 0\j6kBiBiBk 56DA5X Hif L&&N9\-QHy74 ;6¼3Dx KC`gm, V 4)4Zm'89nz;fuB4BӔ}=ցƑ JI] bEf8u*Cd$),M$s5*Zvՠ? nn]V$$nBUBj49k=6 ֫bJa !bZkNЏ#p f~/_F 8E160&AWicRcռİQy9-&5`8ݍ^5'bINL/]KN1 p_j~^gWc I㣿ʇa_]s,n>䓐#r=ɨ8lXOipGfSڡ ? ىcu'B޸dqΣr"SuT e^{LWܼвz[3J)^v֎]s0&w0 `jf?ˋ0Ey'I *<~ 8T&LH7i~W߸ П'ϛ} ־߁I5, gl, %BM!04!K Ecl{CAu:&p_7$D'$fR@j)Aaj 4*MKǞi0'PpykZC`\ӂuf@UPdYq\:(. IS _pzڶ }.'͊5Blb#M+͒rfD4BI_P!;`ir " PRc\yva(, 4t钄 :Vk# $^V"`&i:4] ҥKh7aMU\x4MS%^k*b7o t mۢ8sWD?F$ջWk26,+kgj(ET5͑!IލHkD E-nv-'׾wY0G%/g8{BV_0 E^f -LEhL 1<ɩ;6#Վgӭ<hX >^@`;Cuۘ̚l,7wњO.LH|K\V|E  7봱e >YdL=5NW5_%GcBs ]߅oo cё yȡyᾆb c`!!ҳkBΣA-5KY6!>du,VwTٻje9lL]<LGss@pRcvE4#d>kUukNBiɀ+H鸂`}# gQ󈻱ƍ_q﫿It$H`FiL2ՔjjIeS{V qsz ̝+xe*!q Yª/J9C? 8"7pР ʎà5Z^D5_QsAܽJJ1&Mm[_'J~icO=0Gж-V'kPwԽCLfU~HAV˂!WY̢}5V~G>`!iD.,ʿ R(XjZiL8*RB,Sզ4=Xt/箕-EJȋ21Eч8jP$d/z\(1^ *B6B-( )Uywdc60es""rjH;j >]-Ps2>w9>a(i1k?[5\@A ##DC>x, Cc>^3ĽwHBi@Lp]1WN,FpۛͣxӞ??ȢaތZKԬC oo,5F}t9Ul_T[p.]8V' }Ǽ99,lt]Sz)yGI0ɧIq#>_Olc<сEBXwK#H㘳D9gBYXe1gՂ gp$wnmzkФ>8}q 9 *یE28˰i~č14Q,Ը&$}>p%T5rR3ja 9/e:F | .d*t-F$NdQ)"U;3yyY/6\_8O! gpIg랸6wJsڒeEm0b 1T !t"Iljܮ\GrMX2G:P5"y#\kX_V;_h]E0)>&T-d]Ybrq1c1 <_vpv8; hˎ[;E](y7kB ︄9A6*%.MH/+1, SMjh-W:xIٱmc晶g5<|*RGdnT_t=ڷg&6qpQ?2܀vҾ"~=={ݗ +rSvKġLC 뜿O@8dk&PP&yzLBDhTAmaP}H"  yv"Q:$\ԧqL]Ɣ";)|Zs6\IO~ch}9l]1g8o9TR G8D @1?B@ӶX:!smDWB^_9 d'sҷ(n<52"ʁlR4Y\M*1Pź5I )tmP6%qr~HjgEOEj"4ִB*i9p5M)4Ԗ+Ōs,䤢vk$~7ъMx3>_̵[PW`/ggW~XNu7~_ < mZ*5KEcnuHHފ!.1XyW?_ !u!%XBg B?S'st:wD:3Gi a#b$ÓMAгbkFR_|&rJh6Ø@ƛ lwgiTדV7D %9c}"rBJSbr҂q Nj=V5RJ^u^qȷ13(L LᎇwݪC6nBH={U| ÀijV;׸.fBK1kjsz a>}2* - Ic1ץѮї9"2uh{Oú!^ރ]ϛSvXUvL)Z3ʃd4=^(ys)o#޺F-]KԬ\s仿я~졢N*=D[}(T?\KY}".%]_YiQ3qZhh*8bX-s/ JZѭct& f4MU(+al)vUD_,9Hp\(1X7w~e$t TAЫj&ZÀr=cu]Hr 0` -NI#&4e0]Йj8Ӑ &$<,Ǵr]//Veȹ{ } EZ\Qɠu]֭6M֪5}z"F8=YK6J3ǰJlGEAT CF&%YfereA2$ \{1DFLňfLBsr+YabsǺs4"XLSrj ӳ~wL ˵@L { ,WȠJD8ɣh%\-HIpp.!rc ƣm$::! Hj<`ԍBRQv654[ -m[f)QHw^F)!AP=|ӢiZ)IMyY@HQ|CH3Ik$ VQ81_LtnprA=LP}V ̓Ѽ$\`NOq"(K %MfB }ybr^Eg5)X(aۈb{oz"db_]7!֭[o]UqE&NB,5ۀ>-ȡkr{ۄ,>HfOr33^YNvZQ ]J/C 5 F"74˯СIsf_y᪴ 5$u`om:7B3HHg)=xϿ 4G 'Q |DU VѷB\wrQT *Nʂ:UXN SkDr60 M-Q'-[w"Ӟzq +K8fFzH#i>4.zqp Uf!"סYD}3*Qe$,b1EjCmfa(=sT=a'dI4`A-ትK#B53":^(V|eDA]lRsˆ}ɂfYJr>ͩ/73ğhh.UA ZjjvǀMȒj׎&d!1$Gc9|0j$-:I,R8\B@ =h{5{{35涺K!~^}ڈo|<@ NumLRͧhZU[ Zɡ;уXw9F#%~ 9;VR)INAd 2LIg} ZUX,ޥ:1-7!dRUX!YCvwZsc`Cna'֮dlUY"Fp!=龗?wm[r/">w9RR&@1rrE7v^\k.wժvu۫nQ-€ A 4Xh&RV )37{9{G|_Ďgs}R-\;{ٱ,Z^Qċ^sGz\Ca#vm D0)2 ސ 4Jѫ^ dѸTgWBZ5~:bX FֈKt})b41C$L)2V !d^hKBԕr 7:,$>%CĽhP/U]mgzs2$E*axlq Gh-& C>-T5=8H ~(xI7fۀFҳR}6G^XRz.|)<9E,+e!9* rLO϶mFo $&"oFvYY Lk08U9}|Ѧq}L&pY7Y$6y zr~<}Zi"3ϱĪ<iqXsY> dWRV ,8As8˓\#0/IDATqg SZJ+]dZ`AAfVeĬ*> dx~ޟ]ɂ_,:׈D˘cT{wC6#~ }\$)Y8,A`T:oC&ߓ!Iӿ%P`i^˔%7S‹ Y3k\.-8;X'EpdXhß\O}]g@^])cv__Ngyv;D+:sw5p}EZȍ]ř!)]S\+B,TD/U~F>y_S+4eޤa>Nȼ-cyҌTEuVy*4#9E>X:`4r $MPBEkM?3{>ۇ$a;R3L!A26GkT$Mz0h6*nS:IˤB14dtv,9Ds< hB0WGSCS`dWyNOO<ͬf("5()ݺY,@2ly3'Ez}!sf} gI'kW,]z> DQY!-k&T^Z'@HɊLI-Gꄼ*-r3x+3t7lS\Ǖ$#8,Q6聨~ 7.&)si7A}3dj'ksK>` MӌJ*ZFBA4&`^{?̓x>L<.γ*#sӼf n݃rm+Td}z6"!!Har%ʻ, $w'"PFz&O3 ".\!,dm>zg]AKαIHR "[X֣8,:Xg/=ao"bL̵E¬! y-8LO$Ndݠ`ĺdz#dJ,ɳDNiuXt.%+V !{c%zl&҆ӈ!TzAqb'BF,KV"ѭ(IJiD 2D?9mbԐnchU|on"t3\riI&I#Fb}:&0Z9??{<~\`5ϵј(ń+L}ůn;b`1;!f -d2* [_DZL\ʠγO1M[ UsȌ^HUh׏)~\'X|isb//-m7#9 i DI DzN$¸ k*Jrif xq0#ubD$Y~V/,MC۶}Db3 Ih!vu89=mГSOZ(AZf+4GfgY}pM~aAU .Cpw*H߽Z >ɮ k&Sl"2=g\U)$mwNԻuAn4Kp eLE> MUZ4i`8`HEczd/ln(Om]Egڅp#Ptf lĸ489=Eu888aDZҠ̌]e&> bQ5 ^NDDo&XYoڜC^(_n 2A&ui)|ȼc68GI21>XU!ObÂԍė:s3^kw֣bΖ#L}X˥!H($;HiX?i`JP<_WG?ϽKf5~ uJվ%x=;lHgJ11G+9k l*7>Β-M p+:3Szn`IߤK9b (񃭮{*|.MH`LLS9V؎>`9g^߱] /S! P >c0 H R$Z@PbD7_|O/|`C$64*!xQ~1Vik4$=>D ;I9J8wA%ĘJV8gȹn3HKĘXZbqՓqttbg-crt? J^y$"0ibZ X+G?-YaYTeٴ Glth,3F20kM|&Oۀ۰eWEħ}w 燶LiO;Fޘm#J .vVzi-PdM%iCfcfҟ~#a`xlc"Zl±`.FR4rrnσMZM~[ ӛD8+:( ;粟%i;-L "X^AT~e͑mJ;yr0j͛xc,[22t…U^]ңFu_Q1Q<>IM|9ESR$K"%Ea,Ըs&O _ 9Vx`2-tz4c9߳sxv!|!)ѹ, r]zP{czh<vd]KΓ5q?#?2rs6ICtRВ-#ct6bAh:Z4!U-ňZJqk6V bC@՟qq ҿ+zp1V&p` vf8^Wn\l!DD~<|/q~MYzm+iOd lc3 !jX,5Š0t}/^`-`Ek 2#8 QZk0> /-tx.:z=vaprZ A'2HaBfֵhT>432;mOuMN | p1e%zM;a5 ax,dXbV-r1'U : 5(HS:22{tx;_z|s x? au"3_P-$󍩢{C6~)/%*\(_ q5y`a ":2*nSl5m+o~3'F jɃGJ*Y"5~ ΥG\djl eWDa=d1Nr/242i~R X[U3xRt6)\Ĩ$ZɷMƶފ9qD:V% c $ݜJ&7~|6|?) '{DdINa;zDIKCaK0l' :uYϼx?'q_0r#ʯ|L1 Sdά^$!O5ٕ5%:I}NuR 7**?˗GwtTr4ĈaS"`A6SocQb+JwBl \L*dHJ*:FWPɰfRsBE/Jc{_pD"YZw^Wp}PXr{;H|#ଃ MvIfE_S,Y|?I–CZs' mI7M%I4;q/\_cbAPf^&}c򲃠zI M}p}K03lpzzk׮R+2#UP$%bUzbX$l))KA 1飗;뻿y!w 95?gދ؝( xzVi&FcH-I,è1=9*fD5h 1.ՃKtc-EAMVJob5&{ Rw*.f =l1ꋕ90RQR(AjA@yߥ=IB:p 7夋Om:LH :)Q$s؀M GF{0|vL*mo9 s5H~)2@&5ʻn4"C8jϸoBxo3[Y$!^`̠i}2]8ADA=!^q {ǷGcrwbZMo NwHJ9V 6j62 F@vyDv} O ']tɟI<[wP"CYڬ>7c6?N3Υ3@ Jw}@ttc15!`0fh.#cQMc"rO--EKf s,oq{NW| ͛Iޔ@IhA0Gi<׍>rܭ_K10.KK+<|KԃEnlx˫y*5K@DZ-%:d@ %kOg0>H/X` NMS#KEx*5 xz2sp֡HrQētc$HӨZ3*loI7 a֘  EU%CQ! mMocO*e{#VH iBt]n>Gw<0΁4@ _2svgB!XI1pR uV,`EXg%T1{9E3 f11")A+)L*10i,@^\qBo. nj<^Woo\Љrq$x/#cT0(*hJ_GJ^_؅a.,1wI3>90_8Q2<(%_JZS yP )2.2j]-̀Ƽ ~Pc1P8d& JOU” % Aу~}p ?o]Fvm~ttoo!S,HɀLyC<">F,> 0{˞ KU?~O|b9>95d[ts7beQOI }@ `+=.qw! M6QMOK 20Sl>{? ٘;qEơX7#"#!,Vub1nFqu`:O]J $ǎ1afQh% byFrB@X$9#y^¬mJ .%n *XܪnMm. *Ϙ0wEN9hzn@-k8F1'43LٹwR!o̿3(@k-2ԥFA,g-lp/25ufߏș^}}#S@;;Mxfߧd?],2JvN}zDYaξ yc$Y}c;?hi@mTg1 E su轇@H#.nð8T\w]D,Ƕʐ犵`8q{]sqrRp9:Ba< I"~N3^8\ hbՇ<[k"ph,͘0UczIg_aA<8hUDD~~ОT(:ⓩ(5m pmpόӎA1B Qt"="iN#=A\+udBv4fLY7GVH:qPs%" B&E! A^^kL\]M &UA--Z۽ȇ '!lU6e:3(ISe d3asP:#Gbj$jAMS0# dǀn9t.ڢ"Č'BFL0\gy&r_1LĺUBfqjL 9a7ʮ$_x |cx&|o UiҲjd*6S,y'9A} @ɴJd!sw?x`a7c ✺T2#6UuS9N%Ū)njbYiur2ӨM[qsةu63.~K;yc[AA&^ab8}g}{_gTчq~kd s%i@?ɱ:Ct]7#p\ AIxO4!{1' "]],`շ}[nf`d`/pkaI4Y[2`3O HZ,Ncܚ8ga"W10\8X"GRPO@"GDZptu0>$ъ,X2{f/{w'jd#R")=")~7@S'6h)Am`ym7Jɜ$b!RzA ^mm"c60AbO/#6-hJ`rz|4-35X$8 ؒ,څB6']iM/ZGJ|Z(eD_̜9 &ɋ̥ -/ YC uI,oܵ쉶%,4-"'s W7IvgfLr<$Ӄ3 $Q%Z3IѢ-K]=OHѰU:!ڙLEX}.Yy@H)pVH-:Kuy2XzB|;oϽ4z֤CA<& i+2ń~~9/'Bc$(+3Zдn`p' 3ӠhM.?*07$ʴV2`#dIV{HφY7(~O5?$YF[i(&-,jX i]"A?.Ž熷% DKa4~jR1h +o#UHC8pk׾(aѶX.z|Ѵxz1u-MnZX 8g:t :k`XТ2K-,}8BH`Co,*@p0}p 6DbbS?^F󟍲ɟ%|ntG fi,.606O[ 2{'%v^dSqJVDcmRv`uep EE>w!6Y%=<2çbӴTflN`C{mӢo:rkl: D5%O F}n4Ft#ɬK j|Mo$;@l1IΒ>A%7xmMau̦lU4*$'rS$a,3ʒ*7 au.; 4VRV5 vyCFK^ûȾ>"g'+:+rwLY's@dJV~JD5Pnr Rѱz3, FQ쎳e9q9bN:v > Ng)$<=(6OVIi'((B3 噟»>? ᬅ1.4)B1ȽZsCMth`Cd?$e1Adތ sòڲDۈz%rdQL*J^4tLJҮJj@V?70& #)dF]X6KN$:,] [r6k1888#zj[=;,-_ǵe8Dl0"ä,~jJWĈOf-,v=Bws X=o!G +Qt=$ eSȈJ( ~Ȍ<&dP`h]!*"ǒܘLIƒ7lK{m/I61eЖmbR2 $ 8>u:iݨ+/5{e4byKR8fSP1j;6Er';Fbzσv!H+5M<8`ң,5+pEѾ dqeLDSO/p-XZ5Hj`2RDjV <@,_bI ,2Gdx~l ©vb\lH/ œdBG3g"H2uޏ*/4S\pZpId(1D`CKZTx={ߢ}xٹaJި=^^sD) !7&7Cu 31"z"0R,6WMRA gj9@h4!ӻ,b^[By=q5,v+64Xum>=Ky62c^8"E2b}f9`h]vYUá;IW{n}L/]}'k^|kVG>vq+ϐ<-Ŝ]+?gʶf<&Xq.BjRsNoRf^(8r &/v@Y B+##)uq1BÅv"Ef 2$[#_YȁrɅo4ŁUL9%˘Af`-[jjAgÒ=xFen P>ÂlF&nj@M̥cv2fp\nVg ~r RZo&؇&- $j6Es:"Ld x} ? w͇gX~73l::;}'R"Sms0"7bߜ}@ydV_oC=tv٘ Ǚ眜U.8k?L֗/Ȭ!kz>G'os3+ ?LӀ~ZTY22f9 $~5֏cs:lD;~o{_G۶`Bp0ScI;dsD˂tԙ CHJhIkD} t=ڦA:#lN>߫jCҳ$0xy.*J ݚO%)j2M:q||z%!Y ,%{8lXA̹$!"FEdz^gIAo~w?~YÒY^*$*):D(wjE< 91k@ lMswH BRSJUҨ=sa+1Z'TQ3]mMDl| QZdci;V 4 B9)* sģ}R(q xHuB*t`J007&v 1G支Բ( dZXJ/Mn*?FQ`XoI2%٪nDƱIp¬AvפDaJzZt2.2A:iޔ<#ihexFs8IzWNƟCG͕I>`kkWr T˨Js*$u/#rYbWy= Xʱ瞙ַnv62laIWo̭E `8p68;:=>G&tlAgBt(΅gW&RgaE3t]ąч1X(e\ß]HD~aX,:SJ%H`T!bYT؀F)[cfp 禕Yk9pʘ _3Ce׮]Em+}m^ҳ 5-W:1Fڏb]3\! l64m.54MU>_Åk NޏT|} ") 8I٫bRߑәFe_ F`-{p }3?I:~şFV D|"9NyhBϲ)cG`eYU9R-E(`l% jz$mF8ʷ#)?΢'ihb?R4] j0 alI4香~2Y/ߑ[$[Q} N6 `!},5S~?$N)}k|5X]m$jg+o"ûGb"'@Ȥ$2|s1poH')7Y:Y6mn+xJd'XX:R-0AAX7 j# /I$:P*x_*^:ecj )GاU}N5':Oj>@d8(. dL!-o˗o^h$1(YX$h8򖋏:y}*@Ȝdy SKǂ[ ͅ9@Ѹ<_K h*0Cz`NkN^#xqţ‘5pB# K6mub h\BA>@ +R3D?EbcVjmb }$ɡ>,VrkXgG#nMdB%C 5ԃQ!DXRKk]],pzz k$u`3h՛ ўs~G 񤀊G&2AK.ԒL\\@θ1q׌Gmpآc$^#b> I]KLq1XWr,#IG(鐼g˜,"YvRU!5Ps2EV\/L;0.x33 i0MI۹<2*(: ^{1=i#wIA!i@0t?g9`=^nAYbC4<Fnˎ)c_Ydo2bB**Ll6xߌjn֔sW#NΑπ[i)gۦc.{fc|Sƹ{^%Kcv 0NL)Ѷt- iZO FԡQ rlf0XYR,ޅGxpxBQ N9$SW+X-ؐmVaz5œTR`#9+91i``Ӊims(YďdvY,888zo ]97ഹ=jnZ0Xk4! nHڞFuU$Ljr;_7'?Fܶ:F5)2sEFz=)6 ?b"k0 X>+?W,*́ _aHC@P"A7R.Iшt#K Q`2LG9ve0_ :spZ#F>/I}QݰM(SmG/1/0AFӌ0 H(jQ 4@ـc~'LCcgzG;Wۂ K, "oŊXYSlʭ|y"LKsco;LZxАfuHBFcd+9pTg~~=)!=\ČH+'Wy#~ B**A^#L4Cv{58^Ժn4=KP,`*>,LlHFsHjAA !I$3$6ޜ $\-`UW*'&5exXg(HqMgbRYHZJi |xږz{x+5 Ƀ\;鏎.97AB:q Upj! Y5i)-y X i$NXYTF9 s!m@As}jFmǧ'8Z^@l-dFpj]MC*箐t9-BrB1P+t +q->ͣ [,[U'[8 2-9l)LhF';=CjX񪂃6XZJ @n"\8S(689]r ,j/R0LCzTr"COY EW#YBi U^16D=R<VΡqFYa&œst]!`irW`lЙ"TpNЂ9%Ntlc!#dJ] [4q c`M!Y.c4mY Ƃ-[Փ _z?^j3I)9!"2ж u9`m^c#8 9/7z"$2]VBtI$cw8>b8p ka4A\yD4,4V%# F!A%~}RF#F[᠑F- @\,. Bm#>RBKqGfYo\">\U/?CzƲ!~h?{.9"\(eK)fE 8d%b[` `;>8F1I 2]}i &'pb%Yk#A:t]u)))=X(˻h,k *HcxpD U+}ȇ`@Hd$0u$M!_F/{YfD~@Gl6hh-$gۑR%5PFnj@ ϯosq7pumm'!50[RK;jP2%"EtPyQ&aYHa!#%@TdBVmKaDw9Aeoo>x"7{*4t؏9@+wwy~P;Aɍx<9gbU??W44֝Yߘ-C@Xw"8xb^B/s.%ѯ("~,y s"{>JO jquqeipyp!\]X*d a)lV1yƪD-_!w4yő&.'g`-896]~E4G)defHOB A!wl@3OmFIӶ"URb2%&U!%R' $pQ64XDgB$>26٭abCn>1"(g kAM'ҳnI4S &'$1sm4j2"!SldYlÕ^A) 8u#P.1pدAp.7ݎzMobA乩}gN9`250$7"ڕ'2ǔ+1.P8* ??>**Y "WEѠnPbM1+Ln>Js4O{(Y] Lvu"3RѣsH1îs.tV\s/D&)U=Ɛ" @a$Mp)aܿ}"Rt& Uq 1DbD :M9b X.C&gnAN %49e7E!K^Gc \X.и9hz^jsp ifVk-ڶEuSl"#X``&6jPgQdzVhe~ mU!71c32gXD߃#^|WkFc GkG 1q}=ňd&$pYzC*LI S320C1`# 뚁@+7$Ǫ@`Byp/nM%ut7X2b!4N"!BFv!*mb9 ቬgxI[1,>~U~F f-7.N!kSzPTx *SMTSq%kauiFK='mWzeZD%:lE3ҥoTꆴTms!ߓC+B"( t| ɫO!mo`@YwiX)ɾ7#F}Y.Սʱx;yH={iCF[s_ n05g9_TO0oTR1=i |̓;M쓀 G}My }Ղ|;F:o둞FqIA|ڿ%@`/@ xD psx+]G)/(pZ؇_'*' ~L^јICF>4Z{/m}/ PC0f#zagkyIba |߷\&OkM_9'lH#tk8aaҬz:EWf[4K1aM}\ #[7S-VqTBFQ-%:ġ0d>0b`!O@Wx{|oy[7 .]bCj02lɔl|mqHn&dYH D<O) 4('kAHf2TavBjUTˋ\1&؎J3)e44Ru~cM0GHޭVhL¤HKS,@C%Y(EWp@ G(/D򟉌wGH&Fl1FA@P_$wf} SL:Y[1Zm:'U\D^pF!:^fHacWy &GðXLin1€¼َx]i[|[SM c44Bvy){AmG9zf c''C#F<2KYϠogQ!KGv_$֟y'& (LOK ct7Bk441?8p'[I7C왮F9*#d[ҵéh,JHn2lɰiݴn$-! &"6g#1!T (c?7# .#T_^pdjƂ >T _La ߂lOtSh*RgI5 b[pE]c|b)2'c؆c7}SRt`NW= mtfH"')g127 }^GGqrrrS V4ċkO$t qJ¢HqwQ\#˿xOxߡQ fǍDx@ȳ*,'-I'/#xU*!,K,n%فg3}B:iE[ͦ[,=Hu[X,2HIW$zp }sx߸Oɴ.z͊_#O%ه o~#>xS΂~|Rq7)6DJg |TT=b{ CUƮe.R–-s?!:,,G5ؘ<ľ(sE7|*>U'> <k?2Ő"ijWS'+˺Ӎ|G5O={mo?ͭZ$L(W!%)p2b'&%P7| >'j<斘չ<DXqgsl74bΣ>'4̾x<ʄdСQ@lHP3;+h@$GKjRlms!+4PF"Iùho|fPȌ^b<h\El˞#' `6%s6+]UA=_u.4Cϋ5W*)b`" Ųi` SփcD㤘0EJ|ͪ!z#6uE1 ƵQ綜OOF*2NL?Nb)*,cU֟y//~ xW|Db Bg5J&,Cd%5K )X1ǡ(sS#''~G8B0C޲#=E6` !#e7Ƴ0J y`{hg՛D 1I@>rDbn*iKն]h+2l6wpP 2Cp)Uǩ\:5'zB![1 Reyi00ݶ>/L~b*-۪Ӷt`p%*쉪he +h$JSp Tlb$c>E ?s/?|~>Ї>r#}zH޾ FdYH$R7 H >kH%ľƣ>e S[tt # 2/3pO=TgX:{xz՛TkvxLuLEpЎڂx[P;@muK{)?s51T :I<u%T'&&)\s_d,k0d'"^"~^_$ ,KuZ[^̌EXKO2I*XO11l6p(\'D[KS.c<պ4x i}6 MwA-M# (2v@h700%=w3Tlbe>L1?F"|)F}TnI8M& wW1fvaV|~׿3=NicaGD|PTV"ڬ~55Co4'Œ&"{ْ4*.e^;Sx'H k1ZH̬‡:i!{/3*o_f/xB$̐)$sEzh.jL9υhtLbZJ{\hE0lu ЎeO2DOEJX Jx?H|$`&$RCXh7ȸc%+ŅzN2\ȲӴ !l#%},K)Kh?ʀc_+roFQeQ%Ikդ)ǻaXV+aMтh^Zt#BijX^$*5~NJ #Gp6r)mѣAfmqpxӓ@o٣mMFeMm$1<Ë+xdLz{z!Z^m[h? Yl/=?nq4܅A~Ji W6Jv )1;rS>s3~Y4%㐫jE"?Ti5-쑛s=r/l(Z.2y}`bvrkG`-`FAGQr!)AF.*zΆ3'K*&fB<y !˚9{t}sJ. bUzã~}Cr7 \9n#S+2Rc[>1@ĹLE3[> Ąlg߃'6S5Lظ^v>DD<%;R䃥WkbbدП^v {Ǻ=y>໾ptt4+3UWn_~"Sgט O}S$/rjl%191hb >L4y_ȄcN5 B&H x1n YGua**ea幸յĩO`< $y߽#1B 10l5hǂlpqgL#JW8'bY+1>xX`58G$9t5k{Ѽ!<4sl9m%*P1F87(]5c2d!814u!ldwzē feJ$1sńj*(23 00ऒ]mI*SK2e@AZ-٪8;R7h SVeTf`ayLAֲip#/W})ַ/9^nX}̱"sf Dn@bInD5FO|_3}ۍy Fˀ')D JFX`N*ۺ&:CϷRjg99g%4&ф'n|#o*6+Q RnHRgŠIB$ %(#HᛆYkgL@û{= dJrVYpMKwE'N@!nSr>V=saB ,K6򹽀2g 1m,Y_4C4V$ddƀҟ/yIK4m "2$yM:]Y-:³NY%+5 jAܧ,)J ɱ1@E|ya,L{ݳF|ˆp4#ӂ᝟7gʧ#7=d`!F PD n_5&i%9(zn,p(fѣuփgTlr S>pMv,= h(GuFO!=E/o"x[AF'g ~@$ %c@3*(Mibx0v`_$K\)Z99(/ o lnʜo$A(e\O׋uS@7udaxτg6^3uɅ:H_ L[DJF!74&:p- +WtE}W x+F}԰oyAǍ<'#êWo;o:q$)Ron1SZa~|=M1U(9nh+:_@HeBRSz@ <}zrH YXj`0 ~&?*R(le0DP% ~\.Q%QKGGa4Md'#IYaS7p1JM_kIpY6$Ylд-ߕD !*ǍBNNNdN[4X`!>^QYS7cO+*ݢI ĨvmDu4yd­ 618QLF<c95Eن\ ;EV(&hѺ%zo$5w_sY2իL)!K$,#yD\_€l3)c~ҟG=#jZVQ4yLf^#Wn%1kFŌ]g>qJ"߼DU/=fjeރ!mV};@H-O4tc{lxz8'K*@cTg-e[E"m,эzT7ET+f銲"Wz@Ta#_B$ E/҃]װix=~Ußzl{{ߋ=xk_̧؁f]., dِ}'!{/y䑛~,jFӒmؖEQ e[@5#+הk2"xL˥E-O'Q!M?wLKB;0Ljn )# ,59+FH9%+lWia7Bi\^R#.JSlNgY/zzgCtX#sL^KH4@l!MXhjNzڶ7\.EJKctrWIJ 00P/.G.;ROxZ 0FxEӌ;|د`G1K%\¸%$Iz F_x-NiqE͵U5˗J33VuH5 tM [F;'7X, יּiL{w}؜\ƚ ⩃k=g[lb&x}'s:I`0D|H+"npE<?FI^hAW#IRDb!'m8A,"Inu :5,ፑAlRFfw}X] `8˾I+9ذ@L%[djԝ!$QHF '؇]dc$à IXSlMܖm!u MTUeQ8d/*by==kIEH}t| s!o{%~#|tw oo77Gqh |5^Sv{D >!~YW ;/I#d%I6T+I]EkW'斫e f@HP^3=gSg~ eX[=J} 2Ԣy/,ha%Z>hOr,)c87x~?9E+J5Bit = Ի{-kIqaâ!7+&)>Wgt'ȫe %a$Qj}>XCl6\x fӫpG`I8S,/Cv"77J4DrѴX24BIKdg,]Oa { _8Sňmы6暀!kZ>ncDCABԮ7>uݳ@;f[,zG8 8 A\yfԔgYTt!|#9hIvetHh4C2G!COOD/Tm"nXz%1JiqΡQf!Qʏ7ߥfKd.0r*Vq 0$כ7=զ"lcr;M-];dNJ !(JU˳&MG-5ؒda Bmgn;j7L{Dxm֫cݴ^>Gs^wL'Y>W<ǑDW*:#aKiզgH(h@ cPs/ ?˸~||A8up\/tLד(E#J?\"9cѿ(# 끠%j>OH..Lu&5W40-VFxi5cB:3()KE60Fg?h'z||%Mۢd!d\ l6k0DD-nV,HؗKl6l6h$U)ckw ÅgӜYEZUSqfBDA#5pZF: 9Y+LmN/#yRT4 V:?0кh8O}iN5(νy_Ey% ŦuWt7muX_p9E")k<ݑFN&7 H#\lOQuXn}gp>ݾTlC.dl3!SZ25avCxΛYOڔtl8IIb6h,"hH?Ej>6 x0 `"c/"WAY*vuw z׻x0p^c{uFn|HP'woxF֯=s@Ѡ, EV=Yz'엦5)-/ M7I r,CJ'jDDVŅ&f1,C1}?(z/ \Lf<kӹEݩ{C~ea-g%l,AYmབྷՇTAZ1ՠ.t)ޣp0aF&AT#\ι(@I*%U=H RCLU'E] cn=(|B J4'wܡ1E N,"+ݪ}tWp;z#^xg6==Iݫ/[ɿlfiHҢ@EHoF1eځ dmv0UBkS)0DZ tD%daX/RD{ E DO.R rՄaܤ T.VeY&_"m%Ia֚ m7DƩtڶw6 %o 'feH6}s_ ?SS`[N4 h}6%~, dCFrJu$ ʄ 'x[>+J<[тTðGD#b :=v'|k^_w^113++_es=:u]74?7 X03yo_8I}`ԼH|A+Gb6 +rdy")kk0፛k` iE7̆z ͍PyW13 $j' DVcȯTUxB|xJ @wqB2D=b|$qipPӬjQUaA$KZ Sγu rXur, #`jw<O&Vz7IZܲIDATOkj/ضH1O^R*`HDXOp !vm̐$[i9tv0=Yr \ڶAk=X `XQs2rH/ae"PѸLPG(g{CV=9f`aWd/L1FĮ7CR I^ib "xuV$iT \1.Bf~HcJ? 6d˜U!t5Q(|r5si1@h <5S9_m3?\ &JGi@1*GmSH&JM~}\ma.w>n񶷽 DK_R\tit7# 7ʟ3 |A\v)@Ɠa?[)Q %(Jj2#Ŕ+/[Zr4Qևa#@Cí`NRIUAHֵBQ,,9FW21gC-BN6#;kmhr4Z3?%/i冝(R i%s瘏f}XۈjRvVy(l,N ۋ)y=g/5.!%1Bu;kz&Uϐ%YXRHʄI~n7 Wa߀? M>q++q… gFT a< -z2ϽAk[pw": `A 1"95%0ۆ`8x.J'y_z%[.h˾=U1R}򙝳sh I @ُ<0!!Hsz̄L[ʿ㥤ER . 0HQIe> ='B,X=%Z6ih]'۾+eyt'95C:-dD+g8c6-/~6k.Z44,7(眨m=oM)fPwI1>/}=88z^hVK&++ R*1+ˬeȺl sp ^/sooopO䋠 /S;eh^ybY7U)K21E)"NO"$$.c];P]:lX&QX)J kxLQo2XV2Yc0HR1!bm^1ߚɉ` > W9]ah-JzrY}Wu||d"ޒ|Kci=ua!m$͡{nyKȞ>`j[ZϩBrDM'm#k}KhddT'Fsa#nV_.L2O,?K_~W~%_?x{Y YzdW#{ =~߳ԫ'#s`{pUR7gAej]M$_ Adz@dom>bCf_76CfYؙݿ:W4ƭN w9F $I|(ұOɌNaĔ:XCw|?,iOA/cUIl:sHdž.t>v[ZCf( #rFˌLN0Ԡ]^.}庀KbDQqm tzZcYo{k ua,YV ?+ϣMEs27dT!14@P謂kڵ#愌y8JZe,: 0G4w>|/U%}%v3u;2#CT/4J*ɸl&ʀG``BG>_eC_?O3eTXg>|3.x3n +IM: {GG>|_!81B ?A!GP,0ڱ<"f&l5db+ՙ,f:f{\]dnչUJ́E1%H)AJHӲ" CǕ,b?0 Q!L 2ŔF \|?^DEbeUcYnVj:dE\x76>iO xs߅ʣ <݀a?fRNEJL2KZDCkͼurjEUT6Fh(˔|L,ʳKbXMDr%2B4->*bx3-bԬ*&f9:Kn%PA Q>5`HxzϺKH۫˓7b3|y9dk>f6lfHcS{ܬS >Jb~=!Aw,![˲yZ1Bi9OWSL:x?$7@ΐxx%q8E;wr(hȉXGB^KaɌ>HRj(P}ʙʘ|:.TqB2Q$WljW_tzhiɒ-!@AQO_$uPuM%1RdH NX0^mW`%!0k1>Fə5u]Mסqq8lX:=~eb:ܽXd_]#PnV7VVC}׶ݫ8̓֍ιe0ESuۻ_oz@c !2c;.X\Zo"^tWw+ AR 曕ԡafb-Wo&N6"|M3`8p8lR;iz^"ef? Q6R#UQe{HA D1lܲH>QѼ κP}|Bn'm%!aITLeDbHzG]3{G9 nG7}E;AƮjY,2q!zhݡ?m{2myHUI.f'i_:ƒaHJ+1Z,GA 5K4-&}%ZSH||[=5[q뭷bX?ID ]nɂ]2O K .^oN5QA!f$n61nA3,M0|L`ׂgPُ*1v}OŒ%'xű$+rҹ= %AR#:C!\4tI5ce }ߓ1p$U1@r@e089GZڂKr ,읁ѲD;Db&H,m2vo:X:l:Ij1xDsNg`k4M5 f{p2;b{Qvgc׹)9mH@ohq8="$`4V<.L2TAMFcPԈE jpǏ=B"0^ ߽2-7{;oiDkIِͱ!5+:?$݌m35 Ex+IGwrnE6ME)QU#W˂!E=IDql(O~C355uQG+8 `"+KҾ`V2 {"ەҒ Re=\C.s;1yncw]'ٛ:y!涊lv̀VtPNCi7 ?S U@+E2U Bn-gP#R1,kI#؊{j: x 7x`͸T*u'],)V@S g@ uYNa n: gl6׏j-/y 7L%s.@2J~|#Ú7~9R|JL#Te8wY(PWVo/$hvsqs$aM| L;Ru #L w` YF0 {͠ O9o%*&! Ƿ܂O?g>O᳴<("Zl rO $ I ƪa{(<{9,(/:]Red iaf4 \*%j%9Ҧl[o=q@<11 v"IR.`U;=48%beenx׮~ k 1DhS-ƌ8dt1;E@`Hȵs*8G/<%l|KK A>'Ǖtfޙ&ǎ"5KpViv`V2Ȳ0$Exah*W$ b~:ͬzm#e}{v|}ىi;٬^ܸ:psA4egAY=h=9(p&&ǔ|k ̢( 1'q13)XDR b\"DV'p̛Cz*O$F*d& 7ѷ$ #<\LgX(@2Ұ]Ku}D~Lqi I,\ ߜX_Y\@8_oOWN.SYd9 kN >/PbJaE/U1ْ9{0^!3@$a:XL)L̬&N$cO`q`$mG8~cg_P1pۡ!ip>K0#A6fD44d3:dD6 @[,RBlɭS{K}ʓ\L)jx$#ɩ1;Fd89U:\TkBXXXmc[<]ޚ$FsY50%6'LtnA/체Q+v &*呣Ysk#lV1DWaڄnLTuLɸ(9&MȔca>qWOKЩ7$9Dӿ4_sm&"?%|$j.,Yl[bޑѾ6j{PoOOY\Fsp{5_|ހ_d &g}Y7x^ʮ}. ,Ꭳ@e (uP^t cҠB%?{Fyx@3@FǴ|cY*(=P$na&"Kޠ S!E2 prt?=_"v-\(=#}لi`˪"MS!Da֟=&/x6 "J̈{8&9&a~M hz ֭|XM]=VUN b9r(et(}in#C[l7]>Ct躕JMWၮgS,s`h,re3s1A>'` ߿G_Z4VkUY#_܇v/sS/͢/ح`mö@ d/ SIsu1H5y5R,^iNYLHMk[8h(KtSIHQ]tu$)ubXbD)gl[}sbMO3EϹ$l 'խRj;v'L9SHλQ<,vI~=M1(89O]7s`n !9Wd\dVuMU􀌢x+(̙*CPf=R*V>*'$ɯIF!R ѣůA?;aT-`wb ʦE:50iG\^15dDS5Ema!hW'HVTy1MXk^Pf'%mQMB41Ag cD#pxpj#.]zsz"UrIrZ|/4svuH.\htY Q â]$:cѩߦ52EϦ  &9tz-hc$aQ K}R"t8_O!^oǷOq;i\dFE;0krD:mKȈy'fVD^9@-:ha{ KvSăq`NϢmuC1P9 r`ݰ0p:E8|KZ#ی)쳟$x]'#FIMdGU!X<%_e-C 9)YOLDznBMt`3bL0-J3{t`:.%Y!F ۢݒ!2H_bs*bvyވ?;ɄF@ɾZSf/GྠZo%(R:)ƌ7C:&sȱv!y,x RA!U,yar d=ux0Q Saa)5.⽷Iu{6^1<$qhF@AAQsBjZgٵ},-NW+tv!_Wދ7Usd98 (CK!`yȗ\0^&}d#0FsXCo&sGd4pNNN`,ˬƤ:}Ѵ./IQԀe0/%|Xә̩Àb^cѴ8X,qrz\6JTDXeнo!`Npj:fpw*i (Md5&nņ i`}13`2fS.|,&!G\{O7{eh|`,6m i/hJpeOo 2C$YFHS+ziYX2 F(_NqyY(#[OF,'znM$X")#8oh\8Xڝ Mْh$1N/q+;|)e>{4MkQ>Lүa -+M4"c)Nx/wG; v`Aʕs5hdf¶q* <=EYNz?q܊v ҞxKLGhۀ^Nz;]ے!K"a͋)9EeIx:+]"F\B$ =6ۃU^ `. 9Z{s}{ @Lǀq')WIb'v!0F#ꑐkz{םsk9Gc9|wg.߭[}k9uUEiJnjHnjJ^dIkAA^+F"O߻*"A\JҞ;fI8k<7h_ E")GoeКnB\,ز:Ζ3}nno< ^^U JfN8~ɿne{wAR Rcz`d cH@Ư.%z .]70S-;k 0X<} ¼5z701 Sv 1Àဳ3HP..A!`"u)WH&Ks 庴TyFva}4{IyrՊidUƕOt}KXo{Xs6Ѹ4Z1}C8|6Z dfPJSfY $N]@^Пh[0-ף~*_Fm @ v,b%4r͊,(;AiR4w/+dk6 1Œ׸ .(k@ZX/N IFgجH&~ER Vu N RS"u ;jִ:Dj}p&^@Cq(0B%TrpX]Jv{3 ggO\y5y5(ȗ* Tz˙ڝ*)0I򐚰VNmlSY1Oykȑ% ]kLu":Nou] CeKELDKoPx+?r}:47* ֞ {*/2g-Fe}LUD %4E%7)"єpd&8s2*in͇ Mgav• 9>D"gƣK I svvY#uץ1I[4BBzL1#fDXMeFA+ =Mama=HVGŊ-Ea.6?0$$Jc!3Toj;o_$1\@4fy]SAоoTY?!;(uڡ/HOlxֽ 2QzlYWZ, hC JԑsCDÈ\mwPvB樺,͙+)ҊbTH8CD)Gk6M>$@H[5"!y¶؄c]|J 4@ǘw\We.t,sZURgӆy|*e"q#'8ռ}QW@8Ѭ~W*HK_'o||i̡"f 7lZ$;o)Dz NT}*sep hZnwOE-yա-а! fotYuA(ŋ: C WSF6ގ~ۿSf||Sg߃"?+Za ot׈WPB·cx:cqFi+_hs(A-:={ǭ.Wk-l/9OQŵC5,fdUw;ĩS}|f7AUbDi@ C9=wD 1RVZ֥qGuH \"ܾui'ye\W \{}xc W ?hQꦗxGq|CSr!N4#XG?Ѥ(|`5E5|&db 29U3Z"WB ۊJ? Kn^~5驑'5&׃F7" yRho'e(:pdMtezE[66<%;}4dx~c5Z4ԣUf&DZԑr^ki9aUCF̎W s**RGDe`>?߆w|b`*1di@2͂vkFib<3}i4x~CP1 (z\Lɥ.Happ4.I/JMqs 5FRR8 s"ϽvQl[BP$ RP3c`1&yOr|/\!UҀZ5Z;I[K6]|s%0b%5 qp%d]6pCEMU4., LTQK@zڷ>M"U|뗟w}kqBV7{TQuhU(PBXG>UBitPm,"襄L3\:h!-ma^jwKAx#*|Hz圁@ TpDh\ŮNsEǐcCR\e%:|XRB3B N%H&2BEYbs[R׹xtU5T/ٞm |\5 \,0o*8"ܬ(v"8p1'{7;ISE~՗rAP<%.YдPS)NRL@UΈ6db"FG>t.gR_ R;͚w#1޺3~+=U7YyMȓx%{5y"믿u ǠB+ *@'G{B;~L3rEoM<5xs#j x,E}bh8ʁ՜2uo֯]Bcw0R$p -\ BT\Uz 3qQ,jFQRQ7) BAr!ҐtqjR;>YjA4gf46yDGjH$Ca \k8 iÀR+yf⚕3R1#5skW Hp(Y #6 9m8`aPP.T*C)qxRwXhiӺZr%(X(ؾW|sOg抯z~}_Au#ҚAi&fU@z{ܶ-]]!HL3(y24j烾^%Bơz6ifr}Bh~ݫWkBnQMu6AkipAW{>s{Sb TFYj;ȉ 3{s3!%5&4 s&O2!*B=:lkK0+ ujߤȽmFid"4N1J_ iDa+ua}h4R]7$D7׌8d8-_J6 :BK\x-P+C?Zs\ZĺP2/$Y!vLb]1k>p۷WOD@uX#Od+ #|=oDZwc9Vi>ň c.36&7ҭY XȭʹZ+ڳ ?u ;- ߵ&D! *͆)b"XfB|[dOR4 14Z:G=cfQ3YO0#5AUv9"@Y1 ϒQWs,. {,9K1uAUk^ yph Q:{ ?`4~ap~~+Rquu:i-7wZ0PA->!3sc|hxJqPLD:HJep P:TH]l8t^$tVegybays~^U\OwI"5\3`߂|oo⨯%Y~4iPK4;ϋCBQk篙 9*j+7ҜEXdb{~z"-<0]q8M9jP]?nƁП\๝6ϰzho9f | >qL>xh8xdY"(Dҵ4>P(AE8(ZYmM' mS.oL+ZҚ̧&zi/nt1?F3{ғ?9 5\_1p)Z4\_?RX˴Ğ /d ;tr"64y@=|탇x߲0x5r:r뚊z"#Vh@^&IMŮ0a"CX2|3 q'n+eb=9ՐbF$ea׌, [WuɑeFkV,hauv-Ѵmp7?}~" w)EA/B(iTgs Ti8V[4LIfѤVJCVZ8n0(DŽB҃uPI1&Yr?1thh!% H:V1FP)`w}q%=ϒՑ+jAۋ3&ygggV6J܆x~.Rj1)DqW\QS %ąH3nJwkuե&RG]aC=bSL lΟ׽9\SE;]?m??_x,ήi`˿욉| *b7q;)篋hlq1g !lJtn*Q>j ѣp>4M5ʌqHzL^evjH@%MJg}&MXcF ݬT.n2mW&r8B~f`;b\rFrt@ 緞G!SNRr"P`7#cemMy>xq6\Z.Zql7dvYO&q3^ArS 隑2R*|Ѫ٤qΊ6 GVZp3QB $TjATUO 7~ VŌpy݃8{ݸ}<&fԯxRF@^+JJS߿Y`kV܂e%WWam6>pnmsD3ZI^ů"H;[5(_glk acͤcӃRaf_`vC61 jP*#jtԨY$4g {)č=RPQ0ٴ$ FJ$A^j\J$i*ζgԝ 0čXp 0q@AK< iq&d9 ~?#3̳ 9a #1{{|WD"F.(ӗX֑۔dsi"&1%ܾsח3hP7##ޚr81/Φȍ5K=[ƈۡq9 SFzZp5@ό!sA 31 gw' ZGffYE7`LnFb WY:׊0 FIJRS)e2zfC2k$HT@Nh|uzBJNحo'Vaaؼuon#m ~7ކ8|7c<u\u4E 8Gqz u<ۑ^S p%+bQsR52r6/8N;!1a85@8J"rrB~'3E+gfV44^=NC'EsGdC(^BjU19b!QCML^CW%M˹'5.{;S5rgD֒=mIz ф:`~/ ! BҋE=txyz:NzS3r#=49*V7 B+ξtu&]6H Q^eYR3Rjg/ :{{QA7A-"%,W130 ʯD8^ Sڐ?OrE3bB&jvoV)@tp&]>c8c%|/geM Tu9O!IZ ζg`$L=4(ef㪛VP}IFc͸5 !s4SscYd jt`u`TˀIjMۛ˙ j5Ko7.А\ӳ(TL.e5mѾnoM^Wm1FDT0ϷKD7%`cEߵ!s Jq]KmZ)B=*vψ0D`!,\jKy6;nID\Bڼ "BVqXT Ks%-wy_gdzxZ"<_f bڧ킖tޚju??BuZ9l-u^GuE@+SE-sxB)'Y'5{m M)T7[rjo,7=Oc3lEes^ Zfii~7j<8uW҈< yZhB^m#rmOjDַu3>WMT txZhX7Ugx*w TqFO,+ݕ̚ @T(Vtek8D K]X\r`HMxa2xNTސ.1ӉȤKU(:,pVlJh1Ls"Hܪdm%5QfA^r 涨H x :"$O)aZncR8^(f ܺ8v{98Ls`To\\jQA (@yQkCPӲH -C-:bDBE6ę0*A]_;yFX#lRY/nUԭ+>£ 6BAg!?NqoF䕾p^x蕦F&'vx 1L9؃4U60+zu+彧[zTx₰֊[Z**@7>F]G3<uh:W MXRT fC{6(#J;bzOqIauk!]{BGkZy>ڌ.+4OЫfd-_7d&$*H=Mo,:XE5߫;Pp hpQ/eڀhJ6SdJK:yzw={q]$@\ZSk}כ~zbRdoKR֐Pؗ@ S!7:nBFv}.2psQwrRuI -*Ga9O&:"tCK* pPEEiA6ѿnsjad>W!7ň\*!!hE=QS+W* C-LabsǦKC !Ĩf 2A챘f!vX RW ƀaH 4i>ƨ*% C;$> s\]_crťqEuVJS|kR99cG#%K]Wp(tklE{H)a J[#BǮ E]~7%lb e|HmN`"vk]DޫyoXp!4aeh7/fڒb& À??`S'"5I1ho/Fݱ=Z4LOucJ`?ǚ&bQX׶X4kcQ?XzUJ+?A:#'Q BΒ61XhI &$6u+p@]4Ojc`SqӍ)BEN6Y7XVY/Z/5%xZ:VƗ4fVDjءWTp(it]TzJT~SCJ~jPWҐV]Mȫс<-{n' _V ԩїqNd<.ST'yS&{X.Ŷ_Z]F!II:6p GNbz-K>9b+<邀W_6 qqR7:[N)DU\Y9QOFl4ׂjJjHY6ТjN+WTTIf8HSP;R^~EAA[劚fк&qmkDCȹbq$"Y3 $_/1*v+(-Q%_ã\03il1& sJ {ՙ"/Y9T5JxifʓCՃAqY$^~~|⅏ybYQ  ·J×$0KOMyI\"Z5(m^kfgII70x20R+ KW0F@; ;SǁPWXte NhEbI[r2&;zb u|KMQ?V2d8•R78dӉDg%#OL|>zzkfڐWKz+Ղ܄< CEd) uaqg)3nMGiDT#"z]ZܨV=9rͭu5r>[vbHkC+Y̕bg|s~T].K )!4YEP"2H'zHw-)űgi=bacB͹YKv4栵=;;y͓йbJ 1Ԍyٸ5+q5 UB@R*!$Ax&}NJ ӄf~uVc|@ ׻15EjMX xc[k)M=;nJO:z lHFMvE0"]PZ <#O '5otrF !VrS6rnnYUn @"ܜN7ѵpLâ4!G'ht:H/FFcIC 9 ՉH /4䃋 Z 0Ts-g~xVBjEiJ)o4keRСA՞:2dNq#4)]HdjQ!-bi uJniΞ*Q54jQCLj~ъ(Y̐ZI& 0d a49Z܏[kٛ I]T[^JJԃNʮ2M9ivhy8\ jt24 Au-V"u"it1jJ*PO'1 DjF@Z gxS?%9}V[-J`. 7o#BÇ}3AOQ*:z`!M%nqu?0WpPÈB Cbe8{`1lFm'^ dq1i!Wj<n#I 5r(MbXҺq4ĒS}O-ڨyj),,Tf̵.GS}owcÒiC?H3(H* 4$X :io'ȱeMˍx^b^=Q\'8f,}Kާ DQQ_iцI.QZiX땼'5~9gV&jIi8Ha.cBR (I1ւcݻϠ-V#js.xML2g`6IJi:!h]S 444Fo{6\Po*c Ҧ g0sl5n+J{ 4>DX93XKQS!F:5 AΌBV<AA!7Q`5$ R@u\n*sAVFR;?bvgHqLQ9t V *6qGLTNGb葥i\zR(LB+ݸ#>1Чi[XzWc`ac̓G#ha3 wuz8S' kw}m:IUcpYݲc{oб]]WXS8QzuN>c549EQCʮ3祙" et TM:dY5 _󊀘uv7̞QmʠH (6gJ;TΉ19bZ~dyb+%3c&(N :d0=K\u8Zmb+"IuϦi4!D =n]`vTJA'EzwHgY$m49;w``'O4c&bphٙd9<,LnVܹsfԺǝm2㰯RA[l֢uG縷Vn/Њch:7鐌ae;$xY?ֻ_׿~/"g^~eܻwOh#{&S˪Pk")A&DL7YU/Wpi&$7-p_WeWnU0v?Q΅ut赕Չ4, l,kDrBrV^ pC F 9u}LRВB 9+ RXօ!TN.ؐV 劔Em?`= Ҙ9ȎI Uծ2J!*Hi@e>a[5Ⓗ(a;WDJ%0gL! 8ӁCOX@`% QdrO =BWW)\40v*'rH9AԊR0;|(Qj֐`w0Ϣ t.\R56!5XKv`@a0IаL>$G!8o[_s|RRxo o_B,@  ?,DM*ո+̉=TOO|D8ܰuc@N.4M]Sz.bAc4>4 N?Ҹ ^;E1_ѲTPBmXXޢ9횳V+N.Wɹ7_mZݲ)k}z4 lwO5 vn^z Z^Gwstg|c'=CKN7ѣogP~ g!It?7 βqZV興`ŌS5| 1>P "T)(H ϼE>i* xX R+Lm߫F"q}(Dv `O5 IjaJFl(hhUSSٓ$UYh&b #-8&iCJf );C@Jyp~~H4AS9c;Yi=ſ6ZC9vmI>DnQ{{$ >n; #$ 1nRGHz*iC)Eur{UҌ@u!({HDY o}?~7 C'C$Ll͘_DJoVDiZpB[g8skWI~C 6iiVIA=kk׎t\mtHA rwsH<ap84$!4 4Zj]/ZQ!B rC3!杸W{sZC\/"@^t4y`f#vCG+Y㗿[?֏# ꄋSVAK(H '~T?rD7 x[T}'h i)LiEAaJ?B' r :E85ڊ `B+~ ay-k ױױDe7>n `oZ1 r;i =YRm2y#z7yZՓ2fnt^z O}3h#+"b kf*n2Ͱ7;eaMytװ0.vȞBGNoJJQaiSb!U\ u r͈?ƣ| A' JTdDAKbzDq D"X:*pF s%$U34  PQͰEι蓹R0\px%@<=GD&VXƿ> '.i=kv:HQH(Dx"_x;=PPWݡMIZѮuz 3l.M D)4J~čMLlES6q:, ZƂ*U wsz`^ B4[ÀôCIj6}9gI5[;tA_TFFY(*f3l;٢q3/[e1QQY)RoB=ͳ k Êj6i1EOa1i 8^{U0'f7de='`0u8]q$oJl^\Mn\SM/Qpb¹BH\PӎЛOЇ.3g٫*xY!-4"Oӄ|2l}{w,,:J>n N$ qYJ.jfupMIjJZuG֢>!H;MSkmnHCjy Ҭ(';qQ f=I# -ileWoS6Z}Eyt-F _/b3ZEU'v tRUĩ)E(8+26cs :-XQ LgFӶs...pܾ}8d"Ī6!k^/6 á ߿#['5p&f< lA.Ju֡JzLOu^rƢ/tPZRH|LhCCK5Hmcec5a~e:L=x1:#[J/n6+0Qe-ma0$5Tx& %a(n4im6'q@,G0{?p _3 80CVH6$bіT[)QLlͿ ,@W}Wk~>n_Xӎ`??QYj/Up 1i]c%? :X'3{c( =fsw k /ӜMfVv֠xj{arcQ / ƈ;w- -y\!]R C^-*JQm>>|=e4:/ W08ф@xE_83ߐ#@& _e%X#G'PO",PoN^" RN2E3",s*Cw{.1 ug,귯v^-=Ǔ!'xYȒuOMD\$A}+qHnP+0Dq*LY2&\R W*4@b$nUC1W<$$ 8NԘ̘4c6KUq3pÜ%4o'ܺk. f&4p[Ө+_ՆHJhQ\/nRñMA;ay۟~.8|3çq|"Ӳt ,YCЛ;O/h J9M [$tas{)bEvZ2NͭOݔ-!"+8NCnp<Aܾ. 䂜sR3VSP!vSuະ[C}>}䛞fӼbi(_^|U/-ynZ =R B_Ӗڄ37fa]MZHAG>gT 肒e 4tEצ]k&8Mgl-G\˿_NhdhJc^AvEQ=ɺ%E. 7U7x6|q#\^^<1bWC!z=EC^IS3 p8(ciҺ PWڄMMtbP8Z"sAɥMPy1Fv-Oa ӳk5E_MF ߏKJV C_%vYۘHLЂu|kFXk#HڌjZP{.Q+2]ۖ߄%E}BV'GTUMX ὖcX[RKb"ހ'3 @FҔzrG0NP--)ik.WWl6 pvvJWڄq}}~+{\__cnuu76gػ1ҡ 6֯V%őfm/n8WlX%T 5g[Rd=K׆ݒэRjtCAaME+WRހ@E*n"g~y-Wu$$?%yB!0lBTȡ*\8e 4Uh9'%[1>Y6%X 3\ x({,A,>.w M]-å PQ#$"! A&XOàq [ H&m,"EˆËy_~H-7M6Э~`\ʂ ] |jrJNKeQ7֩1f%wSaH;TGvW^eePAiJǦ N7-5y~@Ci8ѹV±~(q2Μ7!QrOˌ074)"x^Vho6l aXzXmf ks/QH- rtOe`+k6ۣGnaګ戨JhcM&v=,߈1F~w2蔋]@6F} ή-[CXp?E>wqsC( a:VN]Q2pBݗ%NCm@֐\7+ ܻG6hIZx;;;g2 M'bx0!f1"m /Z3bhQQ!atUWa0$ a1ɛUDz*Ji9Ia:`M Nv$'OjI唏On70P #餜H!4?vxVk| -K"N q)/\C {D)~(gj_PfS-P0o?}'>uA?OkM əղn2VX"IWPȉIc`͘RAYpAptQFr憜HDJY➴nlR1l'5ކ4&4Emh mH w=p@ubIfn2=|ZQ۴HNx:C55gCmyF=@& 12xp'A akBkcͦo*18҈ay;^+asr}O>$Ǧ/> FDNPN? ^γt1'+/8ޠظ3hzfyKS$H刴T9gĈlIK&Ռ?G<%*mP:ǹx;^FnnRF-$Q(`IEvþM._OTZֈ]멅P5#B&E4/4a2ˬ-[ӿ |_">3vx_ܞu{{ ǦSG hd#i+'&GZS\`gi5kTխ5ll+imM~8c*IDATz`WhjőMjOd%4-7Л3 8)`زJ 0hsΓҾv$,dZxOC:-ĚRӳMFt?fdݘ؅x}H8,noxX U (e+/Ѕ`ClI>:#H%,uP k,)7lXֵFh \ kX eu}w`Ǧn35wRD~A kfߍCIi?>t(BkϷl9Py\#3WBe qYn *wYC RWS/~?PJFsH\A(ӡ&sØ5G +DR )qQ ƔPZvh!aH@o]\ 4! Bޜ Nu̬GCTiQ駨jo;֘l8k=;C^"'xA(h|hZy"rȵ9p#kGPPwk w|W\NO6?!\p8(\K_4 mD LwBI*1QJo'O85 dDJ׺18FͲb[ooIJ@f-{uM~ *.B6':AQaGk& M0$YhGqם)y~oS\!iJb8ׂ\a80cHZU*Mb4kw}[3B|!mʝܬCh9+D7*JFK9 4M֘R߲flS^L6eQ\ dXOf\CGbю@W2o}XqȚO\i2OWN Qѱ>uRcah)+;>vu!!1ꕉseZ?k&2kEn٩Xd5BXu+G*!Vtn vk I:$975)&Ml i涏V)( J`$'PQݿHB} Ytȥ+# AQ5?v a7F({(`FҚ*$z5Pn{/ѓ4=풝>#k(Lw ;Kc=8`|8w%knIVs2jo 3S#mJATn]%P1kp5Vww2~7Ư{oߝO5ւ7X4 4уC1Vv}n$ "#rAβGD]NisG: Sg-Eވا Bڥ̡s+ׅE炲8qM\_w?8DM4RʉͯokrCDmQP4/1D̜ACDp O2e{r>)E)R&2cЬ0bovOatJ،T8\{?w8?섖Q6P ɜ{7N/9s.dvNlRwܦ؞ \ 6tLZW_Xt$t,^$Jȼԟxwq䥰nN|5 d`)X6B IC]g[s|c?ikC ;3<'Z4'c@8rI2$ȻAwckzbZwt.- N4+;?ɪ3I3iuaQt'PO5H25k!L_]/v\L/ v_ lsA7 BjJF%cԣ:RUdх ۈ}x7GC DMl>BЩU?C~YVI&FF 1.X aQÊel7:y&61=EU%0R=z=(ՋH4 B40 O!kEF\0Y]9ϒΚ Zߓ:a*$9l޽PJ9r.8;;C NI,ϳ zQP<6,]7"AQm4|El6-[.Č Vg ӵ{3͹էkj),kI< ;s 4^ l-_kϏ샌@🏄/3nm3/aqqqbrh}LήY7GKB /Oc ӕBcpG9bNg 5"{ (aaPkf dYZZ1De~>$#MNh(]aCm̅C6ɴgδXbA):Um(q]G8>JjjNh q.Q jBvqaK?h4J nvմ!hcwF}"J9A[<:C5+;JRhYEp͊MjUyIE=/.ʪ۵efm$EﹹKL9ZC]+ߨ5 Z?h/UV }bN>mjN6 |q_#ouÂ=(W>աRGMqnmPQ[Y!X@XWDď/\n۰ϨjmPKkSt8:sc5hذ:>N@!w}(\+A 4c3d~V*/LE-3\\1#y.HCpcNѳRB-^1$(sņ*ډrb=!wf]JѲNbfݼJW7A.qL(%cnQ8{Mm+8f#3N3!&i@ Ti @Je+EjO@:;Gn8K[ܾq{ E5|  7jr!zs0Yܤ wY nm.ov_- 0;؛a]i9XcI[6|۲[K픭u M0Z94]n9oV-&nyFá"e]hE/ֵzW(Esc9̴z.7.Δ n-Bo9kI ).ޏp#ezT*].XA\r층&/S5<#jr}}q1F0o-(VA "J͎>ҩ֔4}CB%eSc #/1}?H-\PkIohmBB XfKQ.vW뵵0:deDk-hS`W^nJ]Ŋ+u4{W+l`jTy\@6*-++1'd-BӇDapG?\1bL1F$:D!| ,kk t>=Cmbޚ%nEUrbٝ5B]О\i0x!gY"NƮ !^^77 jbbQNX'9?1[۰;#%EIOZX7hBe'YaCCnV\=ZMKk,Ȉ4&\QV:uɪ ,T,FCr;*'|߻P.ePj(4hk956=%ib!z2Z]g4*T}/.: Y댊S/pD; PsT/EݫQ$]qPjlNTyeF),ꄨCХε.db4 5 {)q0ѣG(`n],EJT:}֟ űOL?ccJxϬ'k:P1 iPg=z$8 *Rj#5(ű5! %}D4)eAAKMK.f ;ۀ^D|3| ?4:44:/V*Ww=ar4#*з.H ~B%9zH:[q; CLLkxP-!ϊ.xxnq < +qbi1! 8G%{MycƘbwjsnADگȘ.n5l^ sʥ,-6ْE"\X5\T/Pu)%v[þx5K"iD.Eðu_ ocg{{xW012-&^DNfm+j5 2{ >r',mH9ŷUo{\tRZ3ph5ʆ`|2@`-j]L'손xAOfG}$MC(Y  %A7:EuP ˎyouY! HB A-u;5(yQt-rGHs;%`-+bMCGV F`G1!VĆU.0T*Vnq9PP }T^)G߯,Q%Ksj6;Psk4,RAY4U3oKTꮉ< IR!Fhjs ,4*upB 9kȦiH(s^4$u  Yid27>7THǧh q$(G)i((UjbQ*lZWK)1qK ^~o]aJn'Z;wMH1%i£q}ua0+Bf̍WJiÈa 5m&1ZlP{}}aA8@punY@<01\Kц%KœΘGO¸xrݳ)3uW~2 I2FropAD >2i>\W%#l.i,Fk0=Nߪ=rل,GqG^gQ9V[֜N3ggK@v whfB;L hQ>5=F&-?l9Kr^)iZhi0s^d0WarTPhJ4}1.c:lmej,g#9[ɘ3y¸5s |'~o,S>{BxqTZr+.݀V@kcÊe!ǩ̆jP/U˂i9mHʑ] ؜ndYs 4UX Y)EXyֈ b\/8.PH.M9?)a|yV]9iUTdoNpZ \uENg 8Ehr˝NwTwY7khRЎS߬@-Q_,ohmqauKTws{uSGA ˓X~ms+q:PvrǔE I&H%TV8DԳ?>{BV{@*f~eהD(,]ؑE. ꒆԚ{Ws0޻dR)& bѐoE}Ѯ@HǨͼM&=%(17 ׽ T"ILJឧ<ܾui}nR}n61Q$ ˵ AbCI]w)5di`l[bdF^"id4l j\ 'UT. 4ZPje\D?6*%3^ /9ʟjQkht:HhKzS-NaˆDpZ?Q:gX ! ~ \W>8|ubuPZrsӏp7|x_[_ukB$98 "7R^BSu#oZoMu65ܚo~]5DRZ/кF!MM+EfpTiMz.Pؽekgnt:(2sw-9WUWƝ :U:vul<579+杺6ܤGu"ͮ5C@~E K!$B@ ǃ]t Xs ]ڞ)v`a qQ"(jjvƆc-^k1>*2bbt",Djh2nܽwdZwgQr*?;?G涧n6e;wPJEĮǟC7N k{-6Ml=އZYie逐}rrE@!,?_7%)~WC}[ Rr.." 1nk0V iP>?Ϸ~Gkޤ+ [ez^gh;p>`9Iiߣ5]W.\ZHTu(bR.܇AlbDi\_1,ݴRF+U _:թWFZ.XwQ)mqaw)Uj6֊ 0ͦM@yv(7&l6#JfDE  U`Ea&ht7:_X,J[ؗ6'"t2^m2h9p\Rp/އ>~x8. Mp72j<q]>#V:I/p<\2&ڛvT,Y1G.mդ܂ݜly(_*mvn"vk4XԐvֽպ!bsw/_o1cF:|0osaӥicPY]/nZ`'OV2T: ~u+ˆִb!dZF<.܍VK$z?^t-3Fu=^)m_6 vkDx8gZ*"Z7S3 3:k +Gp/ -vT̺|EI5xr6#Pƨ_  RU"HE_%R+!SGm=N3KiTAuf>KPn2†\#kf۞iDBh{YjwӜƚܵ TH;ިUF"i -"ƺA(W }֗!>,FjDH@ij([fʄ~p8PA_!qAv ~1FlZqv(v{M4u@Y&8A̞^~qq*dXYiq&i'0pKǬK%AjC\D6y߇-xs@/|q_`zgwϣ6#E]ef-ϵ.(;B[F:h² v-ntSTbuLXڹM-vA} OJ3p+-Ç̵-` /~e.39 )PPN&97Z2CNaېdNW8̓c!?ԎK.DB3O?@4gQÛy`bSuTiMCӎQNٌx,OӴKfFeZZpa֩ݡ)|7,k)H_+yc2Tr)¹Q5`î6ttaBJӚf(bz6#ۡ5 C5(YA&]iYK5+Xfq-[=Y-,K#Z-"X9Gt$,փeD(NK]Iz$0ػzEq,*ņrFz3{iU{Zj)t:9"z붟lHZ'qXN:v}= XB:$њEfO^Fbn2>ږ\sw7jwXQ9궤i B(CCY3}oҤE U Ͷ8 gf`e!%gs``1` C*?32aD./ 5)qqj)xtyye?Aiaajݴ>ϳP7`pC@DDsqk܂u&shEDQP%{,f>JE!CH _ԆZ1UJ")%.14TLgtikݗZ@ipq' ?)/(HZgdy*ZHUzadڦPw+z Z>Aݹ}5,2ErKwdA)ow+,P .ߠtAEELjn|'avkf#G2D$)>)@\%"UuB+%c!6B:ִ*fKD^Eϧ9>(-غXTZ¢!C< kF,f̘sntyӻJB_5c Z @j᝞WoԨEu Am(YYa3AСҨX" F [?G)uz-Xۚtihȉ7]5&SwM3#CwV@H=1#9^ Fv!8F81BcL;Y(9#AWylY&Q0AZF-0"Z̎<ƨ>dRe5LFS4\ B"DEe/Ԙ |۷í[#.=]l3r@dT& fsCC`jEVâ> m!İ˸}}0JIJW+Bڴώku$et ҵzdP B҈r}_=9txSRPr6OЫ(`&$gBK'L9¸A=\-臽xUiBt6i=RE8rG1wӦ91ykJC ERmpl6k+ݧ ,ݻoy8kx Q* Eqi0 =r1&=HC.X526*LNhn3(Tu ¿ݮmza@ֿM?ghmB(\ڐ6Q!ٶQ}K^ŸiWF96ɲFm3R __pEwOA'm nAV4-rM=*bkfŰP/̭+v:e,Xc%E..GZޒ [вD4'Bt?J۠E6o ~LPټe0q)jT[\P\96Q.Pxx˧m e[\ZuYJRfS A3N**'hb+}aw-0:% 6@4PٜskRdԢSeSAsUH SpԞf!Vl@Kx;>+%͖PzV靗8V8 txzJސ3Qӈszepwk)z}f I먔+faQP{^L -0Fu0CF*b^s FaNGH 35ZP:z1 eMܱBRz-k(*Eڔ2F? 2F FRT"ef5&5CyV̂H+_sbOn4?cֈNi2 0Ol#I\8=zfB=0!LɼenafGY#VoIEj5k3;Ű\$ql!7t *7$U4SlPV`7̐ˬtԄĬ sD؜`ί5(ȏ^`~|@z\#>盒O5ʰ6W,s(j!\9!S$ZQ"5oՁK W`]OR͛S}/Y&oί ye&dM.]۸.^[;8@VrQ?jXjmM x)16xSF+>u'L4{Y؆$pBUkҸ冘3VR(U>uHX ٥P+mhfz;O~;?ƍ1kJrwrKpmt)QA!*eA2k[sRoJj#Te7Θcy(ٕ3C0p96YC+B=2"iW0 =X64K{n?ǟŒYvWg[l6Mzi5=`HR_RpF3ՕG8ZW " _jD$B檋c䔩#'!exQPu\H1A)y[ߌN]̸w SCu9I*7s)Ox{u Y9j+Hja0{H&>Γ4= $JJ '㤇(lJ (%‹Ef[#MrŁp^wmkLhhSo~sxG yO,*kxU3C"` `".Lyn^CFKZ&C$AʣF<975fA_)(7[^tH(,u4bJv>q!5 R1ߖ%n7ip;|ӄP(.j!U4?QK.e-ζCCi>MX]S55\ mh-m/E v5 #sNK_>Ǥi2L4N¨HRrEU{ҫZ{ ",D=4t; Z RP+@4(n(跪38f,C+vfŽxP;T56Lüt"kXvmUdt .TMHQ=CA焿s'ϗz =_iBh胳RÂYuWb 67 Z$@B@B>K`FӚz+y1=e .{ -n޿"vsn[ b:#yFj(}Ձoui4۳y[ SJnÜ qR]yqm#Pev;ܹs<|\lE"m15WZ+*: ) H;2fً5亘wŗL2%f f~*WqzrE|l9"sfEn*'A1 B" غfb{7g \G"ʤ[\\ "N6 kmȞd6EXG[z)g,G1[>?5`gك0KY /1[/f?i dFFu) ǵޚ3fx_P}+=.m6ERoZhY>|S8 Fe|]okϕRSnwݐijAJY62gijE-Uv^V3į i<5*MGHQEnFq"@gTW< `^d5=4!܋DsH@Ν'oHgW"އ!ĈaȀfka@Gs)2YZZ:L*bʋ¥q a0,s@O6_nha5g^MT4U*Io瞧Cִ&]^- !!iu[*fg4Xu%h(Cݘ,nA!(,it{C-6v= /rTзI"ѐu}kaHe•.5ͤ :*OjoBfPF*Sĸ[.GQ$}ʍ`fDEݶF{5.#^cktͲbF3ws_9Aq3hy;4/]hI[|hB؆TLGEMZքPzXb FZs[u2#m0_[0j7 8 ŷş@㹢3ۧ}I\($0>-eo:)ZfZNucC3l$ . 1+tU P,⣫y+&KM)%8ג٭1Kzire騈T_52mvm+ћyV k'5;ME?o ?^MdCggg)J)xzN?E0uI2кL4v7iU xUfFւ"6\iQ^QHR0i<^o4̘h1jd8ћcsѩ_ws|r)wTe:^sOfi(QLKVN>Y7U:nOO9![,ӟ -N?͎ĵR߹~٠!cV4q܄6Mvт>zM:F~fTaynFsrדa)jKbHزRK7Pm9i M\T"yY j`PBUkܚy6m$S 9XF[PB.U͡i eL. 8(/ ` ZϾ+h\&q!qF 7s([v7ҋW{悥. &lDO^T|MG1CCr PX noss n隌xrԚcmyZt@fbt&R7P-*Q;wmi 4AxQvkiP u {Ur M~eVCP)-tfl6zMsWEʧfГZ{γB6\!bHY5?,OPhR奸H1J`{iř1l6{\>z<͸8۬! >$ GQW#fz&libA20Eq{4JNj~n(o0!9ѱ-kiZրqQg%#3"ae;n'&YxYo|%}cY+"Jɢz罆 j:}ljU*%X5'l a<{AJTH>ϞsF5$:_;ԃtV*EG7R7=k>,>Pxq1_7!k[_ nif#i2 !d 9݉¬p4<>[8;Wz-pݨ;бͶ\W(^Yd-m{@DR:+`jA QS{CݾpY&m%(as%w}b-wIiC@e*.l-p`E]Ѝtjk&R͝'s(lA6M}*bF}SP"jƘ?w6\*M 0 ipyy&u6e^uFvT0ͧ sD~RfE#v][wa@! lX؛;5\%6AsCZ(e+1mHN:Ǧf8$i|& "X*ڪ ͇NkK`2 )G)o C @tJ-T[L+3M)Ͼ??/~o7b{oT"nZ@ h+挘\h y=ݲIY"OY& wAJ /6;F %nJҀ4D:t:@'Tls[^cDU2 (e^ny=f P0Z 02c]LXr8ǂm6B P(9u`HZ ycU傚rc bB0χv[E xSeE'D=ЈeC%gyZA%ڍZbhN\ LƳg{h#`QE\U*")#"F*P{t^h&E=V2uZfMT/hU ~yaTU[5ޘ =&:GӃXEPdZVTZ^,+3jҀj,P^36æ95ݡUHmX蜦fP 6Ma>$]{PF =Iu佛M - Ny 3(flePJ(MeҀRIk͈6BsP0WIXv>ۂ9#<8n]7ibI4vgXOru!jJńfhtu!rČ 4'>o[gomr>By46yvGuP9q5ؠZ)UUKbhޫ5jRU#-@]v\T=jZ1 ]_/ޫGG 5@/Mlkº(Ht /\V7)yFhhqӟog-<{VJǪm;3"UWxͭY4KqG؜naflM & 1"^&M:u/Bg$Ze)BЌaYv;W`NB8<0Dw0HsK1,ZN1wÏx/|SSnsJ +.FNYn׻W[#R8~8!儠"?7ŭ[Dl"%A&xAϿր CygBmagp 7v(vQ>Ĩ6f@illRP#j.mm4mI(J67ѹK k!CxWI0Ґ(*"%&AQ(WQ+uskT_q;/Ii1a1 A BȎ!K ϕ_.luBHP u&mfq]Y%z7(ulzӰ*,ֶ-?þι{n"TD"PЁ%#n@b<5/@,$H!Fr,)X(%*Ubum{mk+IT@{g|8+?H:?K lpw /C:e npRr(55wd $t2,0:Wt0:0-S0YЦOjfzjDӬZX<8URy _3ƕk[R:m3cN>/ßݦu"l}z651JìF#޶zVIpX iG˲Z@ ^=뷸E2]Q'@0BژZK[tPp|Ψ&rV $j   y1 uDsl1,MOX:fЅ% 2`* J1&0Lfx<8<"ѼW/$;&BC;2tb;FZP>6!P1FfZdd=NglNh@;o7'̦gmc }z@߫^^*9>N,yC۶)1N%MTc hӌF5:;˦O wj]R[mviOyz:x'_ISZCPSR4s c3F^IΕ(4WmгȋbPTFsOz.?G78ԗ$Ui)v8 ʛ%νubyH~rJ65Ѹ%)Px#M|W)c വ䍩+${|c:pÔN,}=q7*R0Ձ^5#(:Tf)BDNeq庵58c`cD ZyjC?#|0P9YJ m:S捘 s[i3dcҩy uEUWmևChXTQQP"ƱtloV 8ƉGD`܀<}gvcx4(s!rނlb5TPhFoXBV)9Da, AʁCxc\8]2YЍ>ˎr(ࢵE[z/C` hPjBmygR3m"0mgIg}w{{VLm۰xC)3nonp>ЍM|mt0\i xfT5;Fp7B b DTdpâD u0kK0biL H5|Wh8,({% ?>'x:X;Tko%O"L8PL<7[z#">m-%{anW)_#.3U ,Kԍޔ"luA4{ aJ16A&*FD?񂨏1r1dRDYސX."tj5BOEӦ:U&>/7%F:;lgnooګiy#3PыrkX̥ V}bbILb/9ZuH"Bhl4WOg.r'* )emaD*?m(V2kVN=z54X|dp?/?߸п{K:t-x<Qh؛MK/kII+MUHPoo`׈eX`Z8PlVjɴRΟA7 1hc?BHiL^ m"T4߽1֚m'8+Qn6HFwn-a:.+T?ŮKQs#e,s蹦m%3N5 f).:."\e[@sk(#SYCwVuj )彦!&k?$_tvn,#vAg ShcC{r.:ҪY(VFyJ8Hx/$pj@^q07?yw!gp*W9!WnYO4RHPHZ 62K+YX*P~^Y*-6QFicpXX@4#=ry}ȹr7#QqEng@l!}'/3U, 3rYR1yJ BS5( hpLD.ޣ`58g}>_JkU&#U޸]?~w~oUO!o} 0t%Sގ'_'/F~H{BΓ-'on7dF:ό4 "o}ܠM` dd6@swssIMl zgf䔪/J D{/[!E`\Xt;5 . ^Jk9A\_.Q kQisPbSbN,{XHDF5\ ɯ⌇vS;2?W*:Yya{gLEW52od(>M51vk@eI4pU[ ELĞ-< /?◿ql%3$Žx@$܋TQ me …C:m*50"Fd@QN6 eJlA/tTY '0z+3J[r)膦L>k,S%iM.7iJ c`95"Ҋ7Tq!CiU3&߅r гg>^hǂ~7Ԭr-쩣 Smޟԙu>n@AyiRjXΰa\s/D:pռ>:HW*oxB' TA7(/-tA~ ?pې'24"͚2]/Z`3˽0<҅3 mT97@r!N׽W,QҜ#jbaL  qՌЃPut:?'.f!_sPR-Zϙ%-*ZԄր}H.‡Lk ʥ^ORJV zwWjb/ȯi]#M`6TF96oK9|rX"˟d3 ;>&E57ݨc ɞx`@2o}S h,RH(]RYyʛewiÜ&[WyҰ9L Y,49)I8E|w_2t&4PD*{I4O)A2jCh]v8 7 r0両pA2:>a`b;!]Y d ;is63M.`/;$kE)Q,Sp)j^=*:YTҥ{9eh-myZՍNpdl-PĐKD5"_#)sK(OV AT5n"#VrCP!ܟByFY>kO7REBwWehOeXٰr.47U&@ t +PH]" {|MfTu.0ҴHJg< >j*Kdg`w NזP.3 esf4G$ VeLGkoÊZ/^ Se>k<|.\)?M򾌥w"1tG꧔ެ@Ar~Spx_J.]k}ψqE LW%p}d bO,%#:ƺaDI*/hPz5Q>0C.3s|}1O0ߒҬ/jI q[qma7f}xU.O*CVR Ow8g iL^퍩ό)a=%Y|[k+n*peR2S8Bzfrya)ۑ ?S_oT 9g8^mfp\nhLץrUW 2KQdެEwGb9Y1J΄unLSQNKkMj=t;\jcUռ:gHP|1a}ݑyPZzk-M5c-vn%k$YWXOʔ,-D#\Hq?gFޫ4G$jug:pdRum){!׊e*J6e4c^i2N&:ζm*sr_MKİKWz5p7orNzQtYk OVDh1!#Zu'|2m2*ZiJ`щyi)!DyYZ'ƯѴ\,ݳy2r0 Λۜ9Ήž%q5&. 1F/d2ֹÜ#V&˥8~͒о|oi|8{)`jؒtW9jOO eHz41L"F&O)b$Cy]12Ω}U|GGI0TT&9 XCɮIL*a^LWqt"|ygR2}Vd }H9% jAipPpލR;² dT'ULY&*:)9sc\I].E^}@U~ȬJ^4zkB$XXD2> h#bő__F>K$sfo&s.ˆ/סpK %g|%L65Ƣ٦C CIȠH<.hmuCvR ;18z@#Y T&ƈ͑ (Z+noo|@;63=,>RүN3̇tIaXJ}FLYaV~6WMuEoÁMQ±/:i,?( JWQCx; oÇo=Rh;[ny ?Wp7Z W>ވ\$|]2 ֭΢'ˆ~+tjQ=nb"rLФOS{1zi TFA/TlVhی45O,Kl4( F*("p8aYB ZL V}mJ;}MI-+nK$#/lЍ̓05$N!餤{ɖDD9WLA%#2\KM d0zMmLp9V5m?/iq΢i#ŁhU6v=u.61LHɵv ZԔ,'Y:og `IL-E5Kogk?߆/DފHFaw;*q@1jֳ=g`n^,~2P:>v<7tv-> u+co ˅k֕cl$hR"s pg:@) @R O%Ġό牭1(hn`gQ]QYqkPj} rN҄Z"a>+)pa]譡_X9eZq ieTBB&_͙hu>$*hD1ƠێV7U"o3!0~x1O߇?p*<x4blS0$"A YXn8%hNSѭu*\$R̉sɶFNͅ|=  bQLy'*s3*rT[*ClP 1nApقfN$WSyzw\5 ujN35:6X6PE7@4,S6tCW`hcr$&q `c`衭"XԌ픅;ݓPȏ#ҖDƒAY7f!#eA%0$0 sU{<6 E;ќ/iٯdؑAI; l%|f4WBG;l7ݨfI%&렝Z`UO&`Zuw?o~ |'#8o?Qo~z~֯mV6?݊ /ioQ𐽎&'GƄkZyrȰk$KcR3Ynw& ;ӥ@F’+eNLlq:KQ"\8,Iȴ_z!>9>_h窾;1ާ!!h5uon߆0 ZC5PiFg}3)PL:M/O4S5&9YuiIhu޸1E?T@.deZEl\S4VԜX2J- IAn8-<>? 1:nD8;$svR{P>_==[y:73}ނʦY,: o:Ii E$G=+Y"8p8І?#J*u4KBÂ8Ggi p74XKM,MUֱDZMG'U5":{>ѭwd9,8N(S{3Z\˦BtG$FMd#פ$sm9-HT*t>Cgy#sAhlif;L-CG42zt8?LcXw O`+Qjp՗[6sxkϨ!W :\_ {3ZqQ2ꘈ<1̴!irRtȴh,&xlTtY(=rћsVim?$|N,)R"45'tͨl)炲'," pi..Z+Jrא"?{o.(̈́GLA%WvJjJ< D?WBTᯱ,Lr>?-_=G)IeW6\9P<CdDQ.ФQVp'TE% y8Wí d"x.z ![C 6y&4Jl`&fpo]>Kް9ܦćxBW8^Q P\@ Ax9Kۘ BS h`bl\px YM-#a=˭*'y;kC2"f:dF9JVfi35akP(vX7 4mcmtAK@l|>x,R|@In[. Ν,`yU& 0E(.W 2ƐE}|*P4i}CǽNTzmi{q7ן^KRDR/ 2S$MIݒrBstKrAҙSa_* Tl4 N Ddf %lR6B`vU?L㪸<hx!txF "' ;!sE@5)8p$p8 K'dl!e:nh,u emXzܶp.tΈ|!D9@ $.Y*p~g& ܘ9}R !w:AqO=]uOүbaKTn89?&5~xwIi& i7ܘ6DՑLaFZFrE ea#3kNL82v3_:mFzCsth-,5O $N~V+gih϶4zFRϛvϛ5:LJ||DA.Zq̟MJpMs#B@itZ ZdrdDd<7x=~c=e [1Eˍx`be rŻ iԏBP~7zIq $.z N 0%VOQ76Ѩ 5q88X|݌b R3ԇ"~G |oD|v)0E4l 2 w5 e1qQ/C 'vVM|w~Mɰn' jry. U5%'v(D^$- 67pS+"f) LJ! @@4O~ ;i-(ך'JT`o$TiNh7xѮǫf;8CfbA6;M4Q3C:4@B䡔oe pb3k~{YJkyLS@4y9@eFBa:hߖLr΍w1&۶%g2nԼ- ܔzyzj-KD,lŕaHK& " k-oZ H򅪅w+x$dUNܤ.yL:Nk o9o6X SM#gH`<RN[.)ǖL[1 TA 'b5ܨL>{eపF'"Kia~i#AyR`:+CDhlAR/=[ZW^f)犼gXo$]9e͕43?AvjڒN[k*a5-c ۼ1k0?ZN8(\²7M2Zo jOgᰲq{3ڲ͑"Kl`H>ɼ$t[Fޢ~-XIrDNK#QvF;4;b~I 1(0΀&{I6| Vh@*5g~:Z&-tPixM|RP2e>4ǜ/B6Oۢ}iZW ."x~癩vo!!}E us%Yrr](2<`{>D dFF?kţEy,ͤS,/B%"ôzfR<(^mxBaC;a)% cP['ƝDnŵ[#>iS0`D$kۢ)}1wY>G:• IT4ɡF0D%')%G N[B!6W8{g- ܨcYtO7>~ǏⵃVe=l {##} @Xp\5b8g`FUҐʤ Qh"x{c% 4!miJ2~zG^*J"oIS8M5ƨ+_:jrxsN:ZOb?4] jɄ^ lDC@֠b,WQV&˜5a9eW Ώض  :?"rMl  ׿qHZtIu4M<]/lŰlM;5TZs,HZ4,'9g<\}.1e!r(sp~4[ƁT12N6)Q}dB콣o},{שRei0IF,?5K=7Q.gU !3Z;\Q}Ai {qw:"7E +)A ^ 6O⛛QS)ML&9\ZѐTFj-#ްʔ7ksxV:S5&5O4}翷׭3(La.YjƼ|>sG ^12"YK-KzC_c{"I򀍷\ Z8NQjE}CZ8H0ٶo<ZYY.`g)4a9\X"K0p\@z4#?U=Kj׉† r(pQz4FT%yx9铎]#s︒Wk͐J,Eo*_tKʣ:*dtt~oY@I#"~=mXךB6ݴZW< Yx loJ&ƎyuD^.QZzԐYB9a鿊z|[Ëg7?埃GS|{4"ӛ&;TF8{x?hB:gnwLHR+Š]'V Mv5&Ol/|_} .Y=='<;0*p X;V3 ؑp 9F& ptF 5 exL&iO0vЧ,,rbOTlT-C\gj‚u@-|8)Wmj0bK&쵰hlJYK 4PpQkHi ixADGi8p0ƈt9dT𨦠e=ZhW&\3JuYrҎݴvnYnCY\6&+5-*:B$-j^.9k^HNčLFR Lg#Xmߔ$D QuWbTDDtHkR ʙ0!+Oyz|e,iSNZxtt,qB-WޣՂ2⁧@J>Ed̴:p~Rڜw676RN@Lzрʟ{xle)6e/,߱\reGR;/7ֱ ;xg`atR# gGekeR3VKpDJ;K㍆&ID:#C 0,k Mj nP|@7zFݳoQ@#7`xvm }L%wө U{ g}FigzonnoiD7 ٔtOC.580z%(ɐTM  TXB_Wd;oP7nHUړ%)< PGCbGG3c?C@jp"7(vV3!g)WA- r9CǾ|s?Η}ga]7Mf]5d+1GڋѮư̫_Wmpyt:GljBK:Og>jJnL _$'Ҫ(?"7j3 J=Ix)vQ| \.9q+CLG \. 79C&nBbk\P:ٜFreSǖv&Vأ#rdg8K{ udcC^9s|V "L);q=څ2jY!(HC), >8B쇰ء$@ -ә&xgNyHt_ VonQmyIO^ 5;$'0=  QaD,lh,`]W݈F'm5i 7bI Mg OĠ/1pҚE&S)2ɢҴ!-eDg\*ݬv W֚9"rXaJEY*Jc j>;c0 M!vm8-Ռ^"`"'9PcH,7S[..[5geFŋ(Rs8ɎZ2ʡ5Ҹ ˦g`7 ou-m?@nrV<$5$+,st6熌띇8UVB tã'PVT$'-Z ӽCPy%Rq8 .!VYތq,9ه_eʆy:4V]8.#"gNsoh+#a_AId.Tw4LaVt.w{G7* y*pxFXCk7334d=h᝷Ϥ m;76!P77*Y,D`7TN]_y;awe BiLvc+1sd1H'"3'*>9T+c*~=,8OO#ߋYa;"+5":pPr0|!<l鳤Cޘ:tW2942'-L-F կ#)T; A̬#3]IAOhNscSJH) ױ|́|VRp!bZ{%ސxrj䶗 gFq7SJWyVszQ1ɟ?/5@F) y}ETe=71k C^eO2Kf J̕s"q}OHyp8 M~ZR$V4Qd0 %FJ#4IIo g=P.Y" Å< M5DCIOVTe ˊk9tȓ0mi'&Pv Rc;QX+E z8tSǤcRjb W3cȺm 1 pzΉQzQLUX|Mc~҈ T(9kY B#`u]~$d^ 2:?$<0¦[;F%֩tCtK9sV > Vp;y:ˊ=m p8aՉ~e\fԲ "!rI:$3Ń2Xj-X5r9 NZrBkRνc"LDt+%T:84gԵ{ Us4MqOoeC\8G-Qx=f2u*EKeو]#HgegHBscLa lt?f>ʀ^.cY !^)XxКRk^~q.m,4H4| 1~jR̍a=*?zUF'Lts `-zّu؊>BMX'6iD{ԩ M;.VS.:cQoIQK%fy9XT= [/~V Y_Nדɳ qޔ\M&Stne,(9QP PIjy)g+. k|sY5)W۶ bEn&4r0d&$I-ܨQ,&q0C)Ϣs2Qk=3mzfԲLW$#:%]5c2Lu%ֆ}4k6y_ɀu57\.'dn.yyvġu!Y I`U 팸QX6DwX|DI_ 1sgEf69:PBm]auF v%ҡmٺ eW8uZq`; u$'b 1(0*#!a Ƕohx_yOHHĖsic IBaF&] 9nf<* ,$Bz[$MiЬH>`=Ҝ&\0%8ʺz:^`n!MiqVuNfg*RPFf~[+8_(ٙ~vm`h Zk4u>W0ɲږ<,ʢ;vu*Pe$M-h2L!MuTπqKt<ڎy(03E0#cXjFf!_uVkY"#$-j/:,N6JUQs-aȵ"KF4 Jo3Ω 3Hi#.W9*%#8n097j[+ȹҔȁ-0:8`Yw0Hӆ^2J2cZ N8c9͵VngC7`˾8\U2 /WmejC\N޸zVpo jf O4ؿ h]Ze׭vn`uIZilSv{?C0_> G/M&J}FeCa!$㺚9;ЊJ,;Q濽jX=蹠n9%$gXgPG\p[ L2WOïSHY,'aN׌k;jၓ>-ZKƒv,{ۦE&# HpRGA<9RE5K8A~}߯x\\Ҭ2-TX\+PG`did z4#[_rX[k;y!0]fD1 pn"Wg>J+_"š"'4LmAX.-e <*5Hlr1VFhK㨡3i/in,C+fԵsm$)7OrHb"VŔAB|J;R;1z63W2̀fID*aIUx*= !6]L,Iސ#2>g͸ CFNːBcik,d5YeYHv4!cM)!+^zTba/S`\YEULN3hhὲo00xūcdթ{:lX)]}&foHSJx%KC65+zMD`Dk<^6&x-EHG5Wo#= !@$T_Mͳ񐚪[ŴgwZ7 K2ЈJ´JNz@sVcEt}. @C\](bL!wQ1Px B/ iBp +J*{ BX| $k1ȟ52ǖ26 쓠iGBu]p0lc %<ƨ0\Qk1MCYmy_+IA)*q99(1HZk /i4&GH_.ەLhhKJ-@L"Q.%!&چ @"8MIfa72i<*0:CNz BQdqmTL!3|)Q+ NlVfuiF*5xF FS2ذx7ع#5]u0כ 1[t@fQRF-~+_W%Qsa#O{pWz]ƴjh4+EkIrȆߦzrQA׃C{Gd"7O SJkxZvCEus88GU542lγp!j#'Lob(m)}M}"uXj[&scDX4f8=&Xȵ ȿc NԐɔ0ӁSKH;m i&s Xޏ'A%Fx%}>Hati3p`4(I5% *I D6x#Ӽ $aдs䘘JES.˂m`ᰢbqw{s"Y+[wޢáw(| \g 0⡢QP[4Y[uYͬwm _#e--m*SjblkM$]2hjNhi_:QoT)PZwYhrdjI#XyZ,vi&rD"lɨ ҖЌd='IڜAv֊H\25h^'hHaK__eX`C:H*ǸfHh%gIԶZD_hSCS*=t&fpKIх(u CD*-0Թ0NB7\,|~U$]2i<$".ɧu a&%PP=loF1Uh ٹ8M7kdCb;]M#A+IxZ`ZEΌgowGN;w_)4hn̈́O ;Aԓk-IH xؾV3tz\?leRni\R˾"Z( >Au,V+LX:to pN#~w^'-[ެn z%yRݮ(ƾhyPyga3T {/VzE)w1G|_/Oǰ;u;/rJ3¹О/9r:;sP؁RAZE LG~~ݘƂdbzy9e-z{5tsWPFuf[x6yGE4+`Kz${YO;*2 yxAMD PW5<8yQ1hW˲()X8ԦYyukD[޲oC_-v5wR?9256;.!r/ ɧZk믽? 3KfOuT(~:![F3"'Ry86P:7wwwxݗҗ [:WU@V}6HS{,FiM*Ydj[`/` @w&q#Xʳ;> \>{2,!z"Fo%E-5름0s竐BF1+_7!O Cޠqf\I{(e3 NW9Gp7b~I|Ʋ,*ˬҳDS)hQ-, %Ӻy ΏҊ\4֒1wb%VcCGґm,H5[ڱr!-ѪJAwFRCa]a#J`-*c,76@''Fw\ Jߐ WEG朐3l)Eu>59% rF ^m4pzf /7 v#+JHyx9-piKm2a;'v [|o2"VhB H؛-rX%r9,$ @kF Xg Qzh\4Zx:Q[G o<FtcT:wtLo8zȑ ӵLI%d57̞J:{T2,H0ΰ#'n$;ku`#Ƙr ZA摊gE֐7p &u]Vp`l vHLӴqm[*Q=. pp+5oh[G!(j1K? UeE"%#7,.~,02t4П},E$rB48Xp<2k/,d+xxOeSX-kp,sꔲ?BN{B!ذ ) e{;t7 c9\;ʞ"):*IXl p[5#7%U2XcMRÃrrmQJ|>r>2JErZJA}|9OIi6A0x߯浠'.#NzH7lX-9 rjEvq8{iKcrrDt!%鿇PKť^tZÖ5y]~ R8a]G{*wR)z2mǯ+,˪&^ \L9)Ssz8M.)GX0ɪSze [J@trmf>rcS(, MG:rN&흃 O퍳l fNH.1Y tpwxO\]PG*, ޘ-40~Ѵg266gݘZIR*5|x6YWFr<1&N E&}1yAD=aY5qQ77.&ꅥ3{H'/x~IJG *Bݳ!NRМ !C 9S e[Y;B%I6pILSFD)uAt?[QPa o: H 4/8ҦJ2+Y 8;D$*3I\#gMQȩPAejCk/ nk+mwyмx+b k <`=Ý+{梗MWeR襗\rfkŖ;Ω ܐ+mFZ_g*sDC;熼_b/#ZI ҅ 5'_qwTbY2]Y]1nU>/]L|uƢ"r~>= Y|sΓ :A*s8-&C/`;;C3Jw[~K?JxyU'^cOWLX)wF+_|s7"&\犨nlB .i֊AKLX#Ixa21kM87skoܿ??GX B%B&s6gT̡O$݌ªqүqutmEc gePz5rk 餇.IIXOF)dJ;\:kQɺ3V1F\iEkZS?LRR nnnhkq:]MVr A )NG572ȍAlp<:a:E#Ms 9G2F6d1zFi ,SykL;L0XBDBϟ+DpY`uYhQY RϨr0Γ!P#WZiϥwψ2{sD 7f4a 1*4bkDIC4>V8G!nrs\raѦNt4)J%tsA"S61;ąǴqAazޜJemjD6 dJ iox)5pش18 ^ ۶! >u⁍s8ߣe2Z͸=˜eG?_p7QzC6~sse&%2nfוA8b#Y$킏FHpS=}8kZ5:( 9d_Wo7R+]KAzs?|wt[Rg$$QMjBNUW4<^贵ʲ\*瓞k"fR(HdߛO!x W''b(,DʴFrD i5)?|mj'5 xmU|1Z: (7jFvݐ:r&ȼޘw`Ǯk:gL޻ c I[pN f:KJ? ˲r.y |"Ёm'yhtҀ) Yyȉt)|W)uk!B^(υlCdH6+2^|IRQWDA'pZl Cd+{Gv/.4/-?CWh u\ߎTu"PƪK=B퍒Ukx*?|t8"pw@O0>N o'|dZ`$qXayH~F/NdaSpq; Iei!7#GZS-hq/_b/;nJE0.j!Rd9S K83*w^{%4k>30ƫ| ಝA)ZW2_.O'XOr,Ȩoc"S{4#84Z*z*D|{wbiԜq:|R[Fm#R;nwdVmۮ\. ZŵԚWgpsM1@Ypt8j{HAdu|ٗR D#a+X=[H\}'6/B1J)y')2"Ok14-ޣ.2WS~{?)SgP^}/r9?oӈ< F1WU]2Oω ٤):r7Bz2НU(|6M,[7Ԝ]+9 (e}{;$pԠO1ڜ97̐'i{h)gXG$f__ 5p vڌ~;IWկU*rtMLJܢ&@+I?|KcUP7#Ce)ӤU}{hd׿5.~e-*Z"Q Y,2mP;0oFXRӳx<"ƈwy tx={W^)|>kCt: DbE+8ǫ2t`q:=Ap>oc/"[FMye}$p8t^}[ eN8ޠe0{!N "u+5JYߍW9 123|'8 +ԭjF)mf>K1xC-¹>`XZŶW~;B x5+3$W ZL [?xigï@Y/+b֢ f W.qh D 3аlXG1܌ G:F7 ])XSw9LNrT ^VZAz==MIޏ Wib \.Y CN !gMMɒ%y󹐩҈$,h0)ʼn`ٛ%[HY1YCa-ѻz\ݴlrI8- "Y٨)x EXy`bQ[kx᪑IzJ8~ `0K.=EdLVbpሔvmhh~~gX4VqlySEMA"-ӆD6.Rp@aE.$ xQ !7^Ծo XP[L7YEigL9]p$XOZQa43Hyc E g!sn5JGfiD{zMBWH[ˊˉ>}s뵡3jm)r;ON42{9='{yဇ˕ϱւ֌2~M)xH'T.4} Q7{R" KX+7I#R*j[Vtn;o#YN&Iv8:oY5iI]0{Qh_J>+lE3a'P%ӌxh؃*.Nw$AW9#9V |Yn>w*ۿ9~-HިukoUi֓ދo$uBrt}0-Ԍ&^FSF^uO}jFؒH%ح$®πo !^מ#_<9UnQJÞwMZ$n 8$]$ilS4[ MqorXv,Ӗq8P1.Dd +/p9`BeZT|]JeóT elx$XciKhx;#}_V*J g;OOSžQcyy{wT,M~덮t_kū $Bt.S\ =\E3={-'EsfԊ2֚KA PLb('ڰsc& GQJ{J4%ޑۛ^.'866^`C?06,X?xRΩ˯Cǩ!/6#߄U_F6!5ޡ$`#9gA29^R0j^1>ҭm%K:Ɖ켶1@ގp*zوT <\05w}w;?=8 ω6dXRg9ֿӴSMS.k剪uevYd:?x<=.TB{|yN)ҟ"I)1)6+*DK!9"hNqwn8>X-S:B_8Rir(T&◑ ȶ$qXpvRϧ+6F%"PF@d]=|,˄SQh<[86Cs۟ZR4CϗvNfOv0E1V-!G&~„a^E*GrM@hXzZ!JaӢ:#?F<7/YTަsMqYus2$F^"B `aQgiZ=Mh^#),"5Ĉ%,2}L08K0{< N9Pܒ$J$\mO3.~ &D̓ z>y&,[ۮRz\g#s Q~~LpY!úҷe:I2Oɥ-H|Nf^Э,{*fJɊ~6T%;a[SF۞].rʸ\6ezq ~j4 +2{nf̛Bo!?NPmL TC2D!i'/`a?߃"m4Ln1HNgv4&y,q UU1e mFQ255Z&,R[e]E܅)U~yx*#-l"" F䍽w<>>tu]u;&X {lKXD;M|,w-'Tp uCaWu|퍯ck c[aa(3qhě ;t*e㽕=*3R\`A;jJxx GϽo~ B^3zKfuꥏ+/d0IQ9:;r x.0p>w?"z?cpWNW~vG5g?7fu6p2tAA}#Ư0oy$5=*Wssh\s*[c=mE=<\hx_[o}})02JΌ,'',yMO>33yE|_/}X{r4^6 lI {i3mn7x'}NqnZ%sʛvP5%774/i`#?NtPU4!P"l4Y[N'&G-"i⮂ MPƪ w-Gm 1xpOn2gBm֫|Ad6%cTc`9xO;BXRqX|!%v^)`\y>pwh]W@U6cBDi"U,KT-K\I&vJfHg4PFS)8, y4 ʆA/Wp#=Nȥ*-nUY$uLȵR2Ošf_7D0*3=Uʖ);jhSKE `-5` O0ɀJĆwQ$̑sh;8E KhB8b4D["|q =SE"- shЖSH+V7˂Jޞe386|Q9{9L}#Zn(9V )##< uEs5/_"#:z6OӠ奤^ΉCH6ԈSymdBAK)q1`-sz78~s=b}w#I?b)OabX/W~ #=%I(j1#ߙa|U|@yvm v`k4)==<իWQMiXu]s*.Roפ?~z777CtM+-qBE˗/ڳgz"$ %`3C.)eZ'D*i0<(x|);put99_19wd5XVI4YO(JRۆZ+(03z# q%Ԯ2y`Ik%t>8D9OmWa!C.0y ۞zCtdl7+MIa q""RYgQMm3KFx2,FᆀMG;Ѣh`GA Y򠂗 ThuޗH9RΔ8n=yzLx;yDaR?y/ >ν8} 031h]vgAOgL5;N9k/^av?V|?W^18|}Oc ݐ$K! -!(Lc m 6y6ѯny>vwL$ W8UggJr42FԆ2~-~W$^R7#"C9?Ri9~{/`go}W jț(b67lnpL4^mG tѭC놂rvڰr~3=?4/:1p_y <^јڮRgLlRTb!W֜3Âe c+rA2A-tTeP~F9Pe!!~iJFy}8t(Y!5_JIaՋA_y.E͍UO8,dΉa7wϰ!3q8JF.e2w68;cB\c2E{||N)) Gc 6 Ac˾WS^Ygs}c>)azk 7N>35[3>Fڴr!i=M"p>Wˍ 3 ,Z/({ #\Xd&ۄ@bՑ.Ly᚝(5 D%qOvV+@j/h9M&w(׊r\ۆT 55ɺ֊5FɶYZ8jL2iBEe0YӺ6베3NX7pgVn.uY]+n6fRhC8MM㒿rsѶeY -1׾/"#2"JtJ9B$$(J*h h 5.(ՠMA jMp0ZIH*R".2#"3|3םs[9^{Tّ{sf9"58MӲFQi60 kQ@l띇cqܬR^ E%n|M65&eYk7/Ȼ庒EîP{|eI\Dv <7kU*d!u]'W22\0–s(LuPV1:2ReķX,&kQ)XX4'gP1۲v[[:( #x2R{lP,*u+^ Tew{p0BL&7!F)L?-7 ܼdT%ZAz=Bۣ5?aBzM8{όKiRQ1dU'kpJPz~{vw+ w :Q"֕qλuͯy !V 87=J%h~|7ߙו`  4}2ٳQӑwbכБL $IJCRwR:@hn@!n;`{ z7yJkaJSC>$n޼ z~qãCČrcJ#$f#:Ö{c/–Si7-t+,_:CcXkq)(MG 0k6u6M#oRO1 1}?m11;9z7P5gCUrZd]ϝ5Kڽ\_(fK cDIA2Yt1w =1o8-&@j -ʔ$|dH$A=QMqF(hs>Z]EQ-l6JPO!T Eƒ+sYÉ楰8{4W925̐CQY"(h[P~ Hw!{,(4 M"$n!D1% rBҴ_(Z ֠u)؏ hvj"R.$|}v4P\!wēլvi>8;;KPKӲX,Y=eZ)c " ʹ }<1>8&*X]/Dꕃxpzz,q{\atW}ƽbp=*0!𜮮t>筧H3KC+ha`B bWCW!v_Ohvg[\^ GPEE!Ӵv%^#s"_!dHiq2J}rLrL͜S4Mnlycրi)$iq1B&)B`(Ѳ=]s>I#޶-$O"1 2~5moMm}7 D?bjClYMې=V }7$L }ײKc1$qiN캞PlHjѵ;!""qL[&TeŹ' A(mѤіPB\OBߡ05 .4,J`Cz_ (jJwhybB@ߵ}o6; sfdM9?=#l-oQa4 ځQKhMYA*in{}(.toaYTCc}-(pב=rSHeu],TjIz.qlat={T PD{E@؄au||EUZ(m2E҆Ƞ*+keUbQ/8feAkb ((Djxc(Q 6 9c Viz\*Q"*^v) j\cU !*&܀XڠzKXkb+ 'K$^b}3r3HʩXo 4 О-Kb)ҐviC]eT/nCud_>T7n܋ggw:=mSewD!V͹h e,60&Cp!+4RSrx划Mac jМ1oiͩQ$h*1NtN:bp@ْ6 )<8@yex7Jc]ilc>L?qeD?|M7"Kߌ?}o¢|Yp4_O~#]Z8LWķKs>1ztNx"Tㅒ\ :" Rd] A_aP͛F;' S\CA4(Wc _I@ ]=K.ZI , ppzy;PГ|l74EwLKoHyj¢^``@ش@6i1n R۶촢YѰXEF$-P#Jړ\,3PQZ$(ZtCmQ1KkQi`B#} tzz `8׋E(т#RpP%kvLŴBX^ =Jo{F95hEb8@1k;;?\NF hچcHҶ-\. HӶP4;){"r%HD{Ӷ V)I@4F\t}ϙ4UFs@H0\r]jIaUU%FYUk2X.( ;;r`j=Ζ%jJFsȫjQ#nv q읃s# M$G`(@ŐBӊ1\V#ŅM3Ey&( Źݖtj Eu_qZ75R |$m',V%a.z ncm 22,v`,fFA 1ƀKFX1XVqc\ӽ*k81UjYQD[t*:!"!("s'?Ϩ5uHhR =ZX E{#cd_&ue؉V}*/.y@4, QZ+v n'S.3Wb:STئih],Rp À }4UUQf7Fg55W+ByquypWckAl'''v.UC{<zkI44 d)fYc L -Pex,<[BH),q32G#}(F{vs^¯{ )00Y@SztpEd1b+QmB9tVx橧\(8:9,X5Mz XnV!\\s:l²+F׵\,߻鰨mw#4ܞӖD* ]`XaZuhmpCl;k,K\l6X1lK_YUЖ8E',qݠZbƝSlv[ /@;bh[vۤ{Z{n-|qS R=%!QorVb`oo Sv 5sE֠ `+G ڦGU(Lk lQqQk8&˵Nz#JCa jvrIY1VkB+ԋu@aa]:,{,+eQao}@\c[VuzU2,$|F۷huC»>2m*Rj}=vE  ھM)Qm;D 9}2裃|}I"<[S( [h Jm\`F+X ~F""UY$|iɾHCM, My9(*[@50 a iD*[qs`R8(>*άEYY't 10E SPk/Za D Q 9YCȔN&.Byk{b!mU/ ]OgZiPǶP آ90#CctdX(*nk~P/иHnTGum4P@Y8;?)J8 fGn.6(J˔3UZaKZwʠ(*/ ,+MP-hA f5vh"-K\;8·͸50j JIDAT|ُa:8LTQF#cDoe`PEkn (پi i#0254AHhD jSЩsNdR26蚕)S(ȴ*foD4(GGGXЖX~eBݹ^7e%k m}r5EA+^#,5nmZ[UO;- k|!J.FJ$a9 OnBFF%!S m 4nsvEp~f Ţ^1}'gLTUEJZk2ڌ_!2ivLm2VH({5dJ eM{)YӴUUs=2S(l mA)ߍPW%...aM6.s.9,RsO 7{&Lvnp4mkږ%iʢ3 $@Q/D$nEf etB3 U#W+(+8VH${1^b  Cжnp/QIӬ} Q\{{QԩdN]eQ'=7Q݆1Wu]ψ\mlq8д]h#ZסZiw\]Ab ui%)c;mbp'- D5j&DDoّ-g^AyM0 u04 tߵ=Z.*]Cۡ2%QzvH}CRn4UQ;öۢZCw] c5]ktÀu>F ޣwQh1EU%6 q׾DU;@]:MDX`O+##բA_kޑ.H}vǎTeCaJG K `Ѷ=2[!Z)tmC!1c@ gEf6&(-UUa\fgptPUi XhCZ_w-PUggwQQ/J۳qw\jBa [lADDDl..}08P0D2t r.`o=Xf5I0o& dӎ(lYKCrrnwNWx߀#d_,㱧@ j 5di X auc X3ּ9 X%WDb`ڛpC=p=o~&m)!I]aҼKn&lWPHS~{ }zCxZvi;szg>M..j "_zt|#:q  f^t='Dz,=%;O ;reDgMJ~1$ F?RII9]Rgp]pC]З.xyu.cEaɅB n?NG0`E1'xO>!L8)e:s% 0' L||xb[noI$˚ }ܺu ;TZiܹ}JeY&[³qSkͮz1e QXl'(T,UDk;6Vh~\u 899vLC(DE7v"o-D]WI|ݶ-i[f!>OلCڦʚܼ'g?׆li EGfoo&W]Rr]۶زrH1ȪALp]ס.:{mnw@(aCB'KQ&w]?`p@ؖthS8?Ghf]CD<\ۣJl BF@xG.E_s]OCPTtU@@sdp6{kσ (tWaS2Xʙ]9XU<"tmwu@Ȕ%̦m^aLR4q)ջ[XK4-Vsvg{F[M  6p htbF8xh+Ɔ>X(,Mwj@sk*+YUX-i6h]QC$ Q,;};t` !.JS5^Xb&;O?CErs7a>\4jF<"!Rp!v{Te <΀P%z펩71$뢮GU }5 imQriP5Dm9"]bXCqWcCJղDd&"qۡ(JA4{GyBhEQ5; 18kO=[+`Z!:#VX+(򟝝Q">>JInN5 TՂ~:XݵpЮ }rf> Cv>F,EڿdOkB^+ 5a0tD6omQD!;??Zpv򼎏0C_o~kl#Wy (- \FLfN뇊@B .WJ -6/X@)$uEc l@0`Qaw77> ѻ,B&Iiᆶ<)#RHbIv$9 )soǧ<=(=]ΞFG ^ mJWQO>MwF3Xo֣s-92,| /qmi[=>op4&H cgv"땊+YIdAzrъ>s:fx40NúA{ @g /2߅*- }-Jc&|B4XĮX%\ˍүy ⵩U|>!ـzt>j^{ǖ-n/..pqq f۠^ThQ{{{Zuc x<쳔 8ppp#zSm7жrJ +X.I`/ L叏{ K2z-~Z,q]MȢд-.ΰd s%m]v#.~΀Zh"-hftӦsƭV+lZ,0F:Ɛ|ete5DQumsϤSmÅ8HaBjo ȉP GZ@U`5mEYq"u AOC20 ]b*1lU^հvC@k^Ӳe [(EY`P#^wڰ듇TB-DwZ!oQ,m:[oC1Un$b];!5 \#yeɬh1mqi_njt0_,q|PzoP5<'w[maqj< ` 0 ?[P%Lj1`;XzؠrAmΡ=v- wGhTCMcYV ABb  < CeWO.E}ʲA^~,jF!0pحgggumeuhBCa!UMâa#-ӒD.jkmZ1mZ}19jTD!_rh] ܳNzB*i jc i!4EUP H>`F=`{s,| g^ǟP[b^'?|ctO}(!ևB˒!a}E&M%@ o>%Z!vt{y _!ܼ8jJUѠ&!_q0 0h:!q&cL דFF3mA~OPq0eT|!Ўf"R(E$$.&C_{.Ms aYߐ'i B?}F tii^d<1`(~LfȤ( TUZʂbqp9.^,X8sgy vF<)H- IK)a\NMCy fkt{(aapp46gxPq.KTer\~p~: ً>Ѓ{shw;_2, [qSmpu4ar h_{E]҃?mW! RW4S,xmZ)PP+,4Cu~AYVmbӟKZ *vw*EY5Iq˽=t<ͯ@) jZalt1Fa5wu7Fs۾C\ghQׯ߅rh`Z^_Ǵ/ {{dkA\Zk{" &fu]cb#+ۧ'XW{X ׯ_jysx'z/_zJ{;yQyQ8~ Mᡗ>vgzO's7Ǯ=C(K' #zR,iJv#Y2t2Q\o3PR8`ĺ᳟"> @mYjbք$xľMw1rc$\(ˢt48NC8Dl:nr:([A}ѯD?p戼h~w2_-[+ *|?/ކ߁ꞯ'~׭ܸd;XYx k ٕ#n2ӆ`\,sK~G3O3p;0 5fY@,Q5[ƽ_GٶEYWw.XmR1FЯ{J2;b/7@6t[OdbzaV , ,]Eq*˒`hm&7}i)HB|jofRaBibj[Y3 2:5RX2,Jܨq\r@GeG\1j#[Y!߃|ya #xS z\k$vQc.MEyTiRB|IUIʊ¤*Yy!Bգ(*b~p-BBRr?аvPC8]` =4Mayvb}%߮k^Ov_b>ղRuAHfeY(u^Ҩˊliu|c#A=dYOB }Z=7*+kP$ik-OͶ${A)UQ@)`Y/ڶbQc۶PLDadX arw]a !tYQ~JEd!eE vL \.YZCbRޡ6-i'C{n܇^5CNVG*Nc"϶²{'{GhCla,5(낝KEa+ 5tUJGY.8sWJ0/Mn> Hm-1:a cG 49hh*eiȐE}@{( aHC]P0զ_cL$_*DTE=8q^Y<;-RmBL`Ƶ4#t*oECVFV{@U 1@{;Bžk39B)Z'G-;eMJc7 Bߠ)]1Ͼ y1t`7@l| %Dq6)E?a A1)Yyϗ慒#߉7[X`]iyo߃] 3PTA/Gx؋/bu"ѣa|yn/ԙ'G?=15;^4%,px >0oƻ?([1GNpVb Jm"ѕK2E ]:nrE(\hk}z3O9'r7VZO:K4"y OJ[D[#'Ze 8RyB  {[F"beHA_EH.w=I槪Fğ3OuVdD!3#lxUU##z#V';A%b?(W\~G6ﺮѻEYJ'!\su#&b ?vtUBZܗLilQLl%皲 %TGE&$j矓@#V+BS&*!ptt J)w o{O|w.A $v>a]\`P%UzCn] @#j mKh[b)JΓ-J޼^wEYCi*b#,à<*1%bPVP"\P57nmg :hDO-bPEy4.byWN) Ơ<-qtsmz谀s.X(XtC@9t\) F [P7@t|ol=-0C"CDx8gtLB})Ѕ>"cv/6XmGy]/~3}kGGdw͆.n D.")T1CI rWim8xrdrOy + (ĴXV%Bb^0J*nB@(!x?BmA6SƇ bW]צ<\ D.!Dc v=550@I]C5%tXeUIT~ZKHHa0 ~a0JCj|(444c^ip~rk}]`;6~QYg+nSH}1gJkv/Fk17x1V=a8^*z e-NFNʔC(ϋ-V  fu:<]Ý=МC «//c<{PY]OpEGUgp: r]BAH瑡l,9 vI.+<sϝl=JVfҖX?eN=w]rQCl/t Zk?.l34\">ewuÔd1 %ICzvs"?v -ٓQ щگX3GH& !n[gOeAG{L%OD@]ko. F}‡h/ zrD/?/ZiDbd+~;1 Nzn @,rr U$~3,ƌE#qAWJYum8C&ēM_:tƪh7ph3Wm4 |:6@V轻x56*5!]x1:9`J*صX#!Y aZISPK{\"*oBBBR%ia"OWUZ0J e S̠"֨9*ٓO>4J lL537,T =de咁QH&fDcT :KCTF!dZs~'>zLD:_ ^cY]Ym4fyU.qkpme;uXזhZ!RRwTznrмM C"Q:>_Vm4= v40fZW~W?_FX" bL2QL·a@Q/FC%zN!K{srX cD*(o \zko^ ʐ F@4q+2\eNE;$4,?rs:ωhHtcљO{ |̸Z{>qӚ&VD &ISќvL eQk{aBp kJ5Mi`&;i)XX$}S&k~prR4#E`=Fjf@n^1;2M1&L^}O aD&S8Nzl!˫&A%#2R\sk'hn^ɓ @'"iD JFǙD[* G=SS:j 13vHp F$s (<[ 0}*~^}S x+_;gFhභ!D }}XcZ3a3瞱s7Yk"2ˎL#%}_]y +)N.)_?~_2ԫ, =%k54r gT7Z)0RT98#b̵yQ2Qw3&ty qlUPБ+M{{B'̐I?r]:\ Q#z%kؕ/R .E͑9,Ktap(] : }{GWcv%\"K]9cE=J$j.lZH%LSӶ#ѩ{ϢsuPVyW=}eYJ'y18 5GK8m<>xW`w#OZ kmq{_iz\_|d@S#!'S$290j.`OEy>8آP="n{2ٷ+epzz`E:ФI;Sa&3CrS^(tq3 M\!u(,`S{)X&P.,(?Y@(S[$_*qA̓d'2}?"M9F(] =LTQU3\=1)lfLwU,WFc }gsoP4R! ZnEEk4<eSG?!p~qC@y pP먒'#%[ZK B16 r:O#_ONtm k/<>~sx+^ۉ٪6.2FD)hSi꬐'1fl^TZG9 ulz/7-9IL>l5RI!fNAzv\Fy#УU'ʨW &Gl=|͘ 3Z:+Mv$Xy# uvaIiK{eDB :(QAp4&_!=`= hNbXs8Z@oѫFt4^#%F Bܐv5jO$0DOCsy2*"4gGKn2\LCG 4ơM~84T-BC?_5|hVQx =ϭ0<%-|.?LϢ@>F06wy]ѐdhKKeF#RJtPWu#@.LSTXV8}O<MG"V%ٔp좕o*GXkI੶ )FD"/&f Fyu:[DT&qJo !,LEV۔xx 2XS m,lQZR"f:A.v)=N+?V?#!)F{ ,e,j|l Dd2N1&MT h' ]tj^4WpԔjr>|3Ud5&QWs0FprvE@bg}Jh>df3ʐO ȝiO~4Eg6 *5'y_T%mڦ*/'|?fǚȓwt*UN78kH- Bt_cS')5&4P{_+Ru"͐>;oZcc4̓UivpnH0qu<,Q3$ ,6d-(@Bg~d@ѽ3؀ jE,k t}p7 Vz;3bgٌ$!:|zFV"yn\kk59Vas:D倶A[wov >ϢXC5T?2nDЍF ؎b2/&0NHs<$, KK^o {>~v$qt''ޙ"1/Xӈ{o!y-E- NgDź=gߞ x{x]o`- ?~?Hbt0'+5J󛈂WRӅn@!{i1:jAT P,*|7qM!bYc3t.٥U]ra>\m4wޚp5$vWQjl\BwVZCn"z7 YFw/=aPN>8s̋wϩN17es' tQIsaYܡ ᲋HWN7A==auޥ]ؠ4B{N9C:^?_G"rDղO=oxÛc-ܿ11ZQZft(AްD.$hO484t\yz*űqr^4o*ox@dUlUQܹQ2з ۄE&{t/iWli1V(lp{cɱ6"([mҿ(ٶ0VAl(͎⁃VڨID9 *Λ #ClM%PVާkofspG {)ѿWKMމO.i8-B&՜4x#{5*&Cf{ZZ5;:7xo{-8 ]֕Ʀ׿+nVPf+jl>K/Z#Uӈ1BaQ V368X֑(Bzrm\5WM8?/ԜL%qnN"%14IHh\0][4CAM&3ʐ:q3jmPB&ikV)E劚q~t#5 .Q^Mz ӄ\J@@GIJ[QB^"v$#PqA Jc o&߄۷nSA6 X{] J%XddkL"gMΥ< 6iD ӫ3.Qpg+6O)UZ ^1̛9zvBWki=AGrZZFv/ZcLE  嘙[8j@!H95T\CT>(r F"b/?<οh,LI84Pb-SŬD+iaKKd6GXxQsEn; uk6J0HwDgҜGR]H6ZJc9A+pmIn5YpN o$گ|fyS̥1" t렛Y"1oEJP8״G}P 2Ѡ5|w_?D֠,|-{ZXlY؉>CDɺY ~t#dg6Rϛ";{HHhPHElc>-hH"l6McKaI ^:2%&05"s1)!i%O7D(hs{X(\Orq;)oOl3y|sIO%1B@К.r@}e@.Su]'{n,Q C@Y) P8W0U ,y*?CdoIzc$m$h mKr8. Wk8eyDf!,K_nĎ5{qPC/]Cf}DjR/G>$SH>mPͺ&f5IdznteY(Z?Kcᜈc``.؍G 5Js }.E[MȧLQGPJ,to_ע,K@Hb*O*L4(/xƼQKtp) H&9 f*ۡQ/ f YttEOI/y-r?'nb uey:yim |$+6Mjoι`be4EaU<1#B@2[9?t|#iEҵm2Wآ BpC`Vn,V8~[xjkA^hy"EP *aƬCbtN)h*u֛@qi}7?^{E<ۀߣ|W]jgQz;Y҈X Rkk+j@]@i)AK7a.{g T|NUOI(|3/ì>.T/ l=7~okhoWӈG^6?'?Oǀ0HRqLKiw9oT65ZkQujF$A\K$̧1 Dȗ)USy!Oyra|%(*K?q&8yZq >@Ř34+"&E*ZO)w4nLPDhxr~ˋiAHf+. i1y?kX9+Lg1:y׆?C/O J5Ms gB^͛7z?_ǿӨÝP"C8 Հ'ʴ\13. ʄJH]π:B4FQyh^`t$/O?}e+ cPfq05eRLvE*fyz0Z .>_?y_}?'oN-oţxyvÔ,|s֣;2$N?q&nǂd$p]D66@m{PEAiT <o~{ebh:,6rPEt~ !U&,$Cfȟ/\T8ʒYH֚>S6"{Ǵ(95&[&`8\c!%,v b5hv&;ԐY1Y57F4 '(Lm4/:V[0CySB'"Yj9ߓNf,S&LDN95'q (_EtZރJo.U"7Β!C{B 5nϓ5 a,񙽤* cK]?m_SזZ)DYf)*+ t$<, SGѨDLVL* [N(_~ )ƈu%CҘ&z$oU'sQYpv|~1;=чEw}GMh-з=1QqD6GZKT˵bD*!WQ!%TBSK{OuRV#0[r[ h mBԑ2Vx(C9 m#²+`{j#R<tYʊttm,`T,|>cVi>{DO1Lp` +60*&+@KjZ nDk`󁐴Q > p$hvh(^4lQB-q&ĖX[@FyTeIË/=[ڛ^X:`h ? X5Yg5UMA %kC^ä;vޜ_gѺ2kLfI`y gzMo¿nBh[2PkY&x'4gxz{+lzWJƾ/|z/ ~~|C Q- a{כ3`h=,] ⤳:gtAQ@%"SƁ>CxGWw޻&PW5vGLȍE/izY,ч I)Xn3#!)$mɗL[D*xFe&R\"}|N#e"LGY)+e!iWQWYU-$a]sjB#eMIFD'6۬,eY^0u( u=NR~$4+/ i߿o>-"DDK#DhR 9 dܨ?b2SJVs-&Z>4n&ډ'@ MrBTP1C .C:3 M:a4#QsRJ#̗ʩ9qD6CcѮ4?> 9>̛u~ՉnS@dpCzH'"C.b>Lwv {TKd:w ptpyELgJL0*! "oo)Jz Pge(*;%WebkK3we#R+,Nk~LBx(SY)&VSY[\k p臩Κ c o&4lh> !ëK{W JU2O)CKPccPro&T 9Jޔq7%5S>'{G>kysVC ll浥m[v;,УV S|[ n?v@(CfێKΞz1+ܩ&n/А\pE.IMf&C%.A47XwսA7Bt-D[%G/X҈ zm:<_7_8Zvyw'N^?6SOިu8{s"p;J\@:4 vʂ`NbLL GLE c{{^Yhg^zi-JTp~p@á^]9@Mox!$ m'/w8.M֒%l^`T':شwm7#)&ךhlt4 k4DP2Z#ԁd'( 24YN(d^q6V#ˢL:6l&z\F YbVSyΏ1h84<j:TۗC\kXSZ( SAſ%zA4 ޢH.z{JZqy#D d#z*x?1* l 2)L%992 M& wV\n=!'eUPB bQ rJ60Lg)'[Ɋy̚eQN|mvΥddeYehN)2aOneJ~Os\[~*AÐc!hI?9X4X2319XkHQN9I ~?B/jLL(t40 OP_t]j&! Zz;9V| ]BT,yEj2X4i=~3 h.8}l,:3m5/Y?Q"$ {o!Oͯyנ-8KO| PڲH͙kQbp<]Oۀ?gwK q0{IйExAG4d|(n:bw)e3H)IG*n"O^Ai01ByT>OM} |-p,Arm;/ǂ(OE|ӧ/نfEt*t^ MgH$e%avR64)˚eiZBZpi[jUgQȏM ^6(Etqr~2JURawhB@uD5q&Ge,Q&SP٬`z4 0@x{'y1XF۷B2T*Ũf/[kSC`Y X=:MZ_vaZ tjc&ZzkZ؁'<d<ŏBƘl{BR[f| 'QNѲ5&Cn8! !Q cxmǴq?NǩuLwQϖ55ʺfԢkҢ,+,dmk,d0QF)c4Zx;T,@&|'ZSfATeާ|1Bmߎ< v펬V-MLC7tH׆ػ{"(.^j\Ddcq> |3Vc0^#b2"$s|}Q9Kk. ҠjLT6v|={k/7hN5AԌ_6 Sn03@ k%gι,?/bԓ7rZk8?~xh`p z^7;'o Oܹ m0'txgd32C+G\ny{ǖ$)DNiENr%֯k؝Bc)W/K?@1Bu~X]Bu~(_m12M@a.G`z~MKy_k{5oPhCTO\Ϝ$$}?L["FR:Pm 5#3GsgogQ߇7}:܇-4&+jo/dq=@+5jѤ ܻ&**LKc~hOˮgi"OӃQ1S]M)z ڷ%a8&#x Ä3|$ ɢU"n"wrÏ1q#ѧb(Vdy<7Ƙ b8G"W},Ēڄ90_ ћ6*="LJh(-H1=n?bYg*]e(BE5Oft&+k z6M~/O~L~2/Q0&@jDl,*Mg'ލeCD#<00_H{悟|9in4nz9m1eYk˖e =q:zE}#I앇5 J<À9Bck:<n?/<$L} oؑ") B"YC2SPEت U'8P^{w}_5`&(qⷿW> {pc lY҇aL*e{?w-lxJ9!b6}^yPSswF4#XIʚFC@[#.ЫUUMᢁ-ۡC]z'} E]w6h>- ! L)}^O~F;>)qK|A"8_(? ӿsL>sOΡ'eY&,1o9WwZ̓q $os"?N4Mڸa>71yn9\yc&r"wΑ0^ӯd-PA} .N𲗽 |=fDhtaU~\rh#&/3\e)P>JC! +jMDPZ0*!')R< 4S9I=݃6'@Ї5"s\):ˍdщYLc1y<0P>VU3\bsk ''8??u=R}|%CBcSz)kB*S@6*EK3z5}4 MxӳY g*@0!tkٮ*Ts7|/בM]|'/(9vWs'żPk/s'G,^/7aW_\#|] UoK7 ,?^y((׹ 0WcVLI2RG\*׀eû(,|cQo*]ٛ! =Q!y0yEdVZ8knFä> guK*Y+S@7ju^74Kb56O3_SO/ V#@Ö":A#(L]{e|/y=?w>etP |o#R<chjMq,sH5scN ѵꐬ0 Ϝ ϓW6 &4 K8f4#K>v"TcnY BܗV2Q~D0d.ɍ Bۺ,S? aD syA B>LN!Tjbp>iDJJ_Vi9P.wb4)6P3Bv18hRcl@Vra"ʖKkyU 19bw1ĄuLzH;cuHS'{?"4??qb`4AE),fqHB(^SyÑuul}b =A(]=5dJ0@t{{{(N;J ZZtT\)j"6 u{~X1PVUZ/ .JtQy3q 3Oq 0ܲ${l:t0l. 6oRϚ:- OWePKD5mZviXOG,y Jk'-c M6Yc703vwhqrMcsq߇;mK Kijb}ChtQ!k(i3u"ƅkǐ)KFXfc&J '7>bxt8Xh >"*0oxn|Woogx`#Cw=|=ۀeNvSíp'p߁nYUx[t~>u 9E }vK2[P$乄.5ZIϯaB lo8:B/qk'?<߸*MH>/ff3;c䨃ēހea|tzUR m'tctɢf93b;? ˚OeHSQj29\>Ea/=,Q9c/NTsX$(GS}5M3sm;ud19ޥY0!B`*y](mێ ; 9`JkJ xb{Av I1On!R3kZǼɹ#2CcYer38^Q$'ʓN&Yn+P {0 B*bCOT .d&Bub)*2RWsLJM ȚUdN⠥1gMU3*dĐ9F (oV{'dB!Fqe>G&Eu8yFeA3x^M#//:srkF ImQ80Zʎx(eY@6] L֦k^g'syƨʇstu@TVa6ِCV_ƋHRczxKjzzi/ (IX)Lѡo;ԕ^8, ЪǵЊB 9:( | m} JQ bp ?-BЀLi(8xMhF uwFhҗntr>2 *KuʎQ1ݹ~4Q,5zOB}nNFJ(30ㄐ @R'7n cu)zQT^2đ1Vm1k춛XkRbB&K)H H4*Msn& , ]M>ZY]((% [0%.pt@i-,@_\aaKYAVS@J[*t?ɗ2ټB+KI{Ġеis>o]P>X5Y }ۍZ.Q2jskve}Sats+j6t+Oh+:z|m[ ](^v\xЊ2cAYWt"v޻4MZ'mkk50t82|c}"m<, vѣT0(Ca9[|/O~FB$P&m,:j$$I2DR`^~/wca ,e{1 )Crf.]֣ @?-BOËz]7 VS d Rd_kk#p'O⽏n^å @"~C}u|2a(H\|DnT&|w[Yr%vIcmңAEf6CFƇ>awgĭ7qW(t#:Q1i O=Onߦ:IsBmr1AUrzDm2?& ٦۹~Mi2&3(*^Z`K<ȓlG/B E}OѸV=w-sׄFeZH=q_Q&`'6@ɐM9 qFqyD8>:ß{P(-MJFcգ87[UĂ1K! Sf~=S*wH9 I65J$+_"[jHGZP<7O LDŊI8P-r(X89 ɖ7 M-H IXZh9)ZϮfڇdsb\h!^bHKГ]vJkCmi >,yAčBhe*;zkG璅FOz jrgߵ U*F|Nә49m50ea1k6h5]4lSS;EAS40KH\!k h5uk|s |OȇX n"ZӚ `8@4;ݼy1$vd͋JqE zԖ%9ڠ%"@.nЪE#е;>Q/}<"^РuSxFF4jmF{?#@*cI~W-  89MmG&Tu  1@=PLP7&U~V.-kkvh,&l4y> dd 4N]%nRɹE'jԃDDTJdm,W5ߑ#6WZR;"o7KM^kt=;k#i/ y4*B7tҘy2ᇼ9E9L99o^Hgv.`ʹ6"ʀ& \iәszR*M=4b]Dx3 /8vwߞC+C5/!$!QrcB׆4QgT$FJח^3Q}mW<>Ps8?}O2~ߏ?=F Qg:̿ v_M5"jfw߾E"BaדH(`V2z9CtMG]GMl6 S:UqNBI')bKoD!q]DNP9t@zx?)?P/׽}تPm L@D\9Jx \V>+7aJo<<6_%9S|έ|sX{'r4.O83QBy 9)JbO'͔l$>۔2Dw^TD$\B\RA| \^LE\MGyJ+frqb& hT k}6&C] 0"~TH |zQ1U/\Yd,.3"ˉtMd`Օ%L9i)%NX- xF>CQK!*='4lQC, fLGJD30LU74kZ<+wↁ(T: ɞZg^Cs^Zy.NUBٜGOpan5{0Jrr<'gPh8NP ygQLD[0sʓ*6|Mˑ|M￾";e6do|m' \= ]5ɹ|Z5}!yn,Q[4a )HOmPsW=&-̓[kA/*-vziRp}4GX>ݨQsܘ%_S}/c~M%Z'ŜeJ7}Ok[ɵ#7G6殙 PHGd5Ax椌l$}ɑ,gG]$oKDב~_3k=oߢs ?RcME]?Wooi1xϡyzgUN:[vʼЯ$S<]gb˯9Ԅ*CM .=X9ܮC. (_ |OG~~27C[jFsʦ qjz6N '&YD>=уQ%}PV擶yC}*s OԴ|26/_OdxJcu]j,hqD~HDq޳7A~ ˧Yrsܳ]h b6)֩x2)OBUa{= 0} Z9'}\ax7A6&2"uUqk!#*":>ě)uuDδg؟Sk1yfq='cg})K/т8]hR1R`zVk2S ?)@'[i [h,K ( K؜!)}Ixaʓz/4Wv AOtCiIc|pÞ0z6U{x][ ^mߍ[':RwVUX⠃! mP!6 -KaQ쮗K)kl6dǺZϧs oȜ$F>pv'?oX&<^X+k/e푵E'b|U zkGBc@v9 )!v䴪~6If- A9H-4An4 buu~^j߂OO}\y7łjK3"3ZaPNYaZ`Cr,]eP1$Xg5adoxmIZ{ߜ!>Yjxzd*1d@E^dz:i|sê(qT/!! =.ƅP'9/n_  X|L\yFDf0 y4,>#o.Yc]&EaNJS QL4"$СqKixr̖[6&#ӽ>"&\l%c-CuM4pe"*'qJ:8)(B:uwof:*FҀ+L0rm̃keOA% Ð-Ekt$w.5sNB!L' 0%#Ĺ;\.s95ex̉ &cIDATV#hIqRIvr3 @)E+hx_ϝr\=vZsh sYd%a+ m߅E?{?༅R҃/U;M ShpAL&ufzclXObImx0sjL <^km e,8Cuk b*LaY7"1BK-?0+_ "F?n\k}ι~뤧:˲lIlpƢ1` d$TaՄQU! @2 UESErFe˖d朳^kcιOVՈDD<{9{֜'_/^z͸u1ea;Iq1d 5%Shé~Pi1FC(tF ҹ=y/WS9G^ lhw?[ChJڱ\{;.^P!MN˹U*A_{a\^\b.t;a 8a'>tpa҈Zq{,2j)%'36ȳ:oٰ2ivܜ[r=|jD@hvDvNΰ8w'Bof4<]js;VN[x+z4WCnHEK-PmbQv'w<X{5>pa`LqYҺN3Mњbt[g9OtҬ5 U{Y#p؆ g1ZtQ"6̈E̦i*."3"ӈ%8/{[~7^S ~Ky< B2ʾ=h.Pu=`3m暥HK 65CͅK;;8߉U//Ő~$΀8>\xC~u㭸o6Ƨ]ݱVRNhjۈ|4" ]=E{=~~Q<G$/Őqkf`ɅMxx?_x-oq,\ݲHX/"D" v QɩxZt^GpGL- iyznƧ>\?{/<جWp0{$M % !CSą$# lȑTOr蒄 Mi $Y8$;ȓ Ag cS8X)6 +' )k8-'W&vI' qnH9;jpsBׅY#j꒖sB߭fi,W>O >xdddA\R,7)YtrR,MBdG^ơ';{X3B'Zz C>AWHY6nK14;SBБ cԱK~d?M8qqq7NV~?յy'9Ad6f/z1#1 R%L-BN9f@IYCmsftSLU#'=НF͹H9E?n3RXC= Pݣw%Wz\l-DP.;bJϨ5P?=*F$N -g+p6A|sN6J\6kIm4TR QQ.vh;G* 8)J3B p^8t]~NULekCƊ0 M۰՜3S71\P()mHBR$il+n98 )>p8[uz%=c?#sBAAaNg0#uB j'pw:Qi[JlKyjP76a#BuجHSDrp$`U# ]ơ]@S1Yӄd\ZM}&q^ ڬVr1uB@f8;^^:0t*V7-.y1e8b9ߊ33j[w3`w& ut`Pp0#f5iFmCߡ')Fap:pNv1"mm~!ߎ8   0a5 *8&X/<[5i@aɎkjJۢ:dWFMfWߔa+ˆ`1bN^736f٭Nq-~xxo}KcOJcZv+\?jFDp\Y|ݏ<g4B 傃4!ff|]TW!a6ڭe0ߟCG֖Fjhc9< yC"ipݯ~>/}13  ί.cj j"9B^aL0z2Fʯ)_QlB6Nc*@`ӿV5H9"Rs{>) ڵRA;&%2)uWGXIQiXz8˿ )0 3wkm(ت1N3L i, խ4فuވ~+4Jx;7s _øjXDqu~&nqzvC,T!OYB{E>3!A%Q[ꄼR96)UBB+]T8M ^}|T4/ OzI)PYP-zQlQe8ZRRŃх 9i#Pj݋+eRV=B߃a^W򵮇]z_+j+`y*%Nu>۳sतMk*zYIMRKkbjp?1cKh9^Wƭ6}_ҭ/E8U[0=!kNiZ@Ki&l֛uS؏R}PŜ0(+Jq=s"^hF7emҮ״vX+ͨKPЁ`x Uo6򮠶RÎX %HkGl2.T5I#Mvin{{N[ 7n'~އ瞸7+Ók*Vq64zn4!ؕ{y:6x}ZRWFVcV9sؼ1|KOp5 RvcJ^p~0=.{[{ +\~|uPX!~͜Wax*79[1%F Cd\_;#}~·~-=,ϽMo۷{Q :ªC{^&f$~Χ5c>h-544M 綼FݱF +„fhȡ@-9 kO G#bL%;v4"2sIr%\ -e)&({zrV1*@o55en<`!=3ivhL}[!#vJz='iw-OƩɤQkq7"p`t9aJN{s_x'>?\bNH Ęed8 JӲR睬iY*gro %4& )JAUlKX:5ɶ=40TYv0e$) (S9C'(Et,)7kx`mZUISױUi^("aq.M| jvAGYb{G2{lW Zw6"N b2c461~IS]f,;Op\8oGCO]܁s>~~um d]Oj#S$p$80'bi `?ADXSS4t;4L03gkLV9PƔF}N IR57""rƔ^܎ԁ/3n8xEW;?րZ- 8GWXJ6뵞1Y>I}#[PjgOfoi"=/(Z!~%4 Ìz\٧sP\x8Gfso~ q: 34 1E7N^.\OMhR^:a3[*: ry܂|p'mmB̌cw#vz_CM` !6Mf|EA~ x~M0[Bl9kލP \&H.C0b؂zc=<~~^G1~x^[<nuCC߉~QJ̈́uf0dXxDlJ_6)&pĹvϜ4TTZ-%{K,K4z6;! 5Xr𥶩2G#D@#B:1kZ6Xovz`$SVx{IuIP,cBT/itǭN@A–vׁ1{h3=t]]oa3u'Y. g*̌8P*X^!FDϾz;(tBATM\N֤W@HCq(UGcAlNjU?(2v?:QF6 BPdm*Z\}f#s J0j0TU!ညNu~kJ&H4:)'\߃A*.0@V(X?$S|Lͨ:6^&7 h=bp8)Cw^>dX8DA.̹2V {O4VoWbk΋Q3_]I: pz]:6԰={_i h)?vp޽^gehkhL@w`w˟jfhZ 2|Mo2]skB$9%f4 Q뵴m i$ A(vߗA1@A۩[2+n~&Ah<_ kYɗ(S;:fi WO/oݿW]D5DABh6 1 &œWjɛK<:|bK3։fkTTMHf9iKNmOn+1Ÿupw͍ǫpVӈh+@DEh]8ljaU2CK@m_±g6|Sn !pPٸfUPN*2ȈA`+ l 8<r16MMڼ[f<01:$BwWH-=[xK_O~oƋ^"i~Р '\`Ȧ=c謨5 hkvCpsʢiYY^̫\ Rĭ Qx۴ᏽr%8̈́ W;ͤ H cZ5vV݁ۋהg>@.cE9M50 naDa[K{R t!(B nˋKxH#Ŋ|٧qzz?!8aJIX`Y'AbZ"yS $JX<+JhHZ7f江rM$GɵPPDԮLrAnl*jX`Yˍ;Yii։5fkO{yj6(o:6E&oNm٨L^PQМ1"WPEΕnUt%0zS3 T,iD$ԛcF0YCOlb#FC ^ueWLAJyN|oal3$-T[$ueØ kxڸ5ǮU)QKS\GمPx~:Ͻ.mZf`R5W=.۳~#mTp,ZdݚnFQnۀT}{>qDk9:1c#zy#_;5s<]|^&KjHQ)Fvq4CЈh907iݺ2XG\t$q-jH!61$L|/1$(p!o) EK]_"Y^ ":Q䂐WxK^k:Ccw'_cx3\ B_Bc AR.s$ml4<.ƽKF. E yL3{&8auzヿȜ׿Qsg>9ܻ+4 9cOSR>GDHS~1FyX?4UzUNBڑP'w Ő=,꜓aBdh1FJ\nrV|M~ER{"i>L55]dk:sFzw ۧ8iSJ蛩b }n>Hzq045<6j)7D(ƈaM 1gLÀv8Mp>aO_O⡇_??k70M 9۬WWZ4`]Ycne?9gDũk^,cr9R7ֵ-'LEW{sc4ʴFFlNڈx]\[2ɇDґզӣRTvBaVĩ*ab)M Š+hLScӬ:1\ID+7E3Ri)ZX&W\'4 ӌ$X\:j&SZ:CG}89W@ꔒ <{4{AΌ庅SOƃbP}g(TGr 4k6 (X6ícXQ[=_Hȑeoi_.{i`rN椹8\(`-R$]+l(Xm a)ﳦ/;W&GuCl^6|jQf&i@DTd m" kRBŭЏ`/XPpMeI`L) VQԸ2N{;=w~7[[zOo?Ï7;~ϾcO<͛+>@iAd (nX-dgvj{:)GhNXp-unGTc$9&yGȌ)cGa/}zAqg?8xm6=_&+p8_B׉Aoq3'lY{T[t~XbzrۉuX/PN6mp9"!jŸטtMxq,juG4gt$wT7q8qN ;i/Ma:&%M@DIva7k`Bh fiXlSH/H"h)M wCpww}=_g?Xzb6]I4ed1M } -P)k5p-Hl`@L Աiv),"T fl‚qJ `]"Iet\̒a!h'óZDHB[\\52m@ҌӗgF="Q.|թɔ&6UXTѨj"U噥Pm^ZTt\j Qgɰv čX.&,$Sap~U[t-&֚pƙW1ϣX4K2E3jp~wn b2K}1Vkg,{Yp81a{TB?̘J63v(TS02+ٟ!VŔ37 .:Q)Y{x(ﳼd{fE̺w&ΦUF$S'qE&9 15aIJ2}c_XYSk,~n.TV9-F$axrC". v5w~ nO/'I|SSà 88H\mf\DG=T)7c55<0W,P0X7l5dAvf(+dGE^l!Y O ӝ'' pDxބa Up?KsZzjV8p-"O J[Gt{>'<0y y\oڐ 9k8t )\BCWqF3:/0gf/t KgMB@ꬕ](9 .u;G& F)L)wxg"t6'+n6899gx衇p9od[)޽_&xW6:fS)N U 4W(Bu XE-z,i",Pˣ4FƳFĖ1 HY7Y&9_x}@׀q?t>\XK)~Q<Gz~ c rWvjwZvanM1}nz]܃Z4yNy~6 ƈzp#ܹxބ W_)#|pZWXчoOSpBQҏDU=hgq33 q9$;)JrJx'ɨ ù,O=DH]& 1D- QiRI } %$$ T9)F!V ě-ۻP̝˪ȅDMu)"^ Yv;͐vвqy~! 5GSB:LÀY']2p()gq i)Nvba.2w찿Pk"^CE.I0Ww< }fDYR۟^FoW6OȂxMӄnx_OO}W̏}u<< `x:zl(uRޝC벲SijuTsאַj7^ϩkT1!j:.Hw>HwAC)kB %W7rC?7.FPAޟ~gnR)ӗY$eÿNs#8=H/^Gu Hn~F6e#f@΂GC.݈#:!؟X`nu ?-3R=J(A"%^f"}Jn"n0ms"t4cnk3\ȍ ܮ]WάHR4SbC|g7ߊ|"ݢHӺ49EzSVDMd{4a|#}50@C'U: tyWml q $PH\h[IڈҜ5@9sh]q&yP`(ZQ۫-U<6'rNwny˵haoSk,ړY֢ $]>]Z$J@czṚTH{ugIιPBG^#ƒ_2U/Nj_bONpv7oeNC~?"u}yd0n޼Q~_֔&A3YЂZBU'SNiz<SE wY0TfA1F8S/wS,C"`o ő3t&lV}AR9w]qC JHЉ{9qRy$ª =y{4A+~ Nm~ޅ z64c{.n1e8 JK}䡇 ^x9|įG~>Lu]V!rH8g- I8^fzt_|^wQ  Oǰ77JCg,:}!"Nܑ]lI6o."ynтgF8YeYA_Uڐ9DfFk{Yq@\t͂,F륹9F:BuR<0 A!>MRC)Dn.e<;]@gD)nn_+'jjjkkfSD\ ٗ8bOQ[pG:nu]ilRJXN*5߻WI3/20)D&>q'q=Y [k|eBexŹijwYD߹" <%EDrx]~v'ݪB =u8==-,.xܻw|zu )qv~7>ࡇð;0/ z#VhM_|#xK_7[99k~]~KlwbH1 sAZ$ܦ͟;gVƑglڨtZRxDE|gDދ5Z׳ZvU X#emLE22w!2zFm!梇Za[Hd{&'cIA_RrU@L{G|'w2Yf(ŠyMnN̸:Lul6 8B6(17/Cqjȡ46fjR?R+TzYa"Q8h%pv G)Īi'vВ\],xˤ{9}v...3/x y~N9eqQ˄•~@/XpZQ]!MIΌ#3ƫyh&[t>RF4jpү@Z?{<|@ajl zVX9pҭ0l sHn*bf,9 3eX;i)V] !C'W4{;0=n. `>B)\M>H8!P.Fq]D@u$XeXfIqD'ӓܼ~cx#s~>A:-s4{kbjPp39dJ e fc;q-ҡ|/bx5g4Ա|܇6]*AoĪwXS 3D''ayp(*_{xBUJͲJn= QS(mɗ{q9Y~su=r9NVkT5 }1!5E,@dȱH$Z*>w:scǪmH Ċ80$Cd;id~4^`;Z3b n¸ۗ\L^@W899Q M軵Ry7&T% +*]5\ (HӦ?2j֖&}4NȻ jJd^s899fA{Ya}b_|j;%bNv7ob8?e 9 lΐ|AKl6}t!6g7BIWGB W//x1N CN9!elI?suj9^1ױń1TPRT{ĩ+[!_<#dUN}/*ޔ+YY pyR$9ՂӮ~v˯1ё/40U+Wʀ d[jRu+# f/$&]@H9ۘeZ֡& 2JEN΄8ë́ˈΟðbH@qr)Fy!C]ҽ[tXĮO^?exo.RjxQZkM5!P#䐑N۝)A4 [aSvoh]tpQLri/H):9 wAs: n6 ^~815$_Dof$HB] S ř  ڛFX;/eKVO!/6١IzTOI<NSJ19Z:P Uly@IbGT[u:MR6+a#W N{+9ve3㴓{"FOY,8i4L4!]]`vr|mӳ0b{qia c)8'rsTrϬr2Bk:XJ4"y!]BNZ0KΒfie R㝦8ZrF$bFD}51GpދmsMpwkaҩm'M9Zw*AWȺdƪ -[s-½7N`jJpSשq&|SA:KB󡹸Ep9l%#zlpyj]=SRljxP5j \`46 :kw(3;{J֤T- f=TQK*0rb 1c(z K=qH4)& 8eI)_F }h ,I2sĕ=8O H!V/zS4*ř(2jj)\1%AM"@G$>%>pV8FqDj6;qac9J H!y1> 1l Lng̓d{ EPX2B ]oĺ&vC'~"muFM#5i}@Epk,)\;] EeG6&?cƺ_a tzmD a,ЮX b.qǨv!}Laͷ_. ( YX,7$kZL* WrkT5Lk3ؕVF-Yf#B+Y?#繸43߿E y= ,&m8}<Ӡ,^Ԅ~iafl['gzVhksq5m 1~/4EG%#rdl/4qyOfi\hx-}Y^24"LX嬴s +lߓ3FHjZ ѳ$v}06^49bs~Vcr9>Azq (# mLj?lڐb˒\6FW:vNrf& }S ;5Ϫd$Agt. !( …$SэwrZK3v-v1.D'9T,{0'S 4%8\\m[2~S4m]8Ƞ"gxÕ\/f5i6fLY;p:cEPSA ʚ?RsQ m}id^fg „8mn( 4z{=>ښ ȖzEqK4i*H 5hR-7DYU݈ ޯIO ֵ8^En&H$fQ7]YY#Ay r􍕮EASy[D y,0-{ "k(kF+pWUn%'9*@}D̪ј 2$ gpDFd_dO8}@G8cw)c؍߹ tzou60na 4ㄨ]ywڎ!IT7i(ejS.(=JFEqpP}ur_}M4)vZnB5া>"p=N=t|ۿwrgL$z)]%4e9IGFL<=d\@'y}^"rHARCFuNӔ1J91'-߬kiDP4#)%)tme2@0](sJj++ˌ4ðdr98vt=3y<W [ ʘX"" δ`)2$2x0iՈ*=HHҰeh $v' kQ^yĆI3;}BжSe Pېs`R;S.CJ`GsF@yPp^Er+T&V5xk)4CCpxt ! 3S/MPXIݱLm.w^5΢I祖Zƚ7ii3>"`o,v/Q;SϒW?F3̬/g#Bs ڂKi]HJr±nn+\EZ&-4 ?ՉS3!T+T",m#߁'lQV`>i@aߛ2qqBM9y51,caVq!`nVS=g0S)C2"1r\Hp!\ycxx÷_om:8v$?F%$g1 \W"64a:A e^Fr}Q nf9$Hl)G% 3n4xk~Cr6͟Klٰ[/HY{OUv_31& 5U״,&[L6`<%^J)+ZX5p\"<L $̆h,:2$5glC:FvBM.pDv9Iqroѭ#C.!oOrn1Em6{RAE*E[Bn}-%&/j-m,iZRJSD֣Cc>C-_NrE*9ƵhS jٰS)xS<_?_jV;h6 .Hx`7sPd&x՟qP`E7C J+2ZheCR_#hJ%vҵfqW5ͦ X]),E}c6{،.g%ZR6}fu(gmjdzpӁV61($ |%bY}Ʉ#N9pKA!ISjC:D L̞ R 8@9u D8Yi,ø8 8qwƇ~iHR~w\#s+߁y{x7| >g~o!=^~52u 9E4wRیg f r3ly :"{ RbŴh kH6}I*gFY:Ql*>)J}\r)sn EL؆ZS63ZB,b5K ߜfB/޿˚n%6͛ nC yP9sZiya_h4Fg9\% ϵiYdTRPEj/\L!gt'b|`A|T]RZ isoSoQ{bU %K0q2O%jbÉ&xI-D.Gг²Y`:ӎ&M~K]wk7Rvi"rSk#~՘$C)[yi"~U$4e9!_{NRL*v9b]!8/뗒Lv)>$4CX@pAS٫'./>dP8y3No= jP,@4_l!4-Ej̕zSB7sFL :Q)4ש!L-$D67sTfTDAB4t$XN K U !Yj)Q5F_U;@tVUD΅h"y]i|4Ah4%ѺV \*6 DrFʣ4ٜ\YU9# n (kkA6 y,$XEh -m)fXiXdw<ށC&h +"2ݧz^7mN:Y5j!=3U,: L2b|,xwk޷hNf d~N&B9רJJ3qx/L͆( Y VqS,[G ɒkkuq) Cc՚#r 4MH 1,#ݐVS^dh}xoi4RPT8q~kqC8X4 r<+J<"ԣ}m|uJ(VYzƖ o4}ڴHL5u)APcK-8+iuTjRdPPKFD c)/Hplu 2" L"ԉ tR Lք0ks5襯/~5ٻ>sz>^j; _wا~?gOHM>۴NpW A8< P--Ğk*.:U"d54شE>ڦfIj_ћFlR<[*5/t.HtJɬnSApe hfΨSE6%A\/[n5jV/=Pڤ"S*I=qciZzZe1F8}v+f%/Fij>R#^MF(v8 U@RtA6iA2y~*:C}XkC.$AbPqZ4u=38`E 9st%jrTFNI)?$ccNDϳ>L bYq"3mBCv|WOGkeݲtRa;V#C2X2::W5JiJ{3\# ZT* q0gHu~Y͒:J3 U+,'w#۔ ă-wNuMK{VE#]>g47K<\, u,R.Mͦt2E ,56HFQaŦ7Y5S[з͐5i\m3(0GMb\9ygZ@t,Sa"A#ןίK&q_An-I9p9# 846~kqcYh_N )CZcFRblr^h Eĝj0981N MlN:Pf_ů_#9ǟ vw.p n؜=~.5>cJaĵul"VBgbJJm}.̴HuR?GVZ/$2 |+]HEG%LsBgFFUf+&Ò,2nUvvzvpC/dY1o)g"pi85;zH@ ?kW+ɍ)&fqr PlZ^}kR "ܴv1X\r%Z$Q!&`Ӭ|0yCsjO -g)WSK_oH !Bw?RP N{jtF"_X(8 ew@Z/ui!Hi3ZT$UHДx 0Ҳ.+6-EymG_Ȣ lP>7"Й-EEMЍ:c_ъ4UATɱadKxmRg0Eu`24 &iHrN[Ǡs3<sLp}$'fEZgY?i )VK0乚8BuʐT?狣9{B]~?g,g }e {n- C#-E5 Ҭ%_]a:,ʀRMB\sIn X_D}y6!Rٺ0-r3w)hjgŢMTKMkn֘-5w0LyVS#&K,r gY4)iZjQKwjVD:! v Cd&3f|A2.EnK=WZ6Y[}p=CimW}/4)QOJJŚ}tsT! JsDs᧽^ś69u%ĥvPïj-Xieq:`Y`ۄ,E퍀R̷FC7+Z ʲ(F`8絁hVǬi#L4 D+<[ t" -9) F*(Gn Z1#4 O) +m`sL /Q ianS zz)t(-:)bY#g`wpޣci}aѯ;FgBX= =V(D 4Er+.b6tX2&[4"RXVR^и or=WmdX#!59gGGx4^":g57 CNQ@4EJjQr] khb=BmR Zp4;U=BS݂ڵ2AгCy2' shݰ: EYؼ*vdw5.0Kͥ4 !`sM1#Gs@Hn,@:eLϻDhhְY_A hjM [) "vR#.X&e3KP[ܼEggMt-qFk\4X3f}kDJ 8|RNas!&2^ ByB Ja<Э|1ȱ4Brl*w8ZFboս#n{):8&g ""jM!\-R"+m{;PŞM&Udpd:4{Dޣsk*W 8똆K)4%`D zw)`'(V6zͼϜ)idn BҔiCq{k("WC'.` OrvΙc'eRA퀄fɚI5):%c6aSIP0bI!'8N :/AaMY]YD\2K5I9d^Ut3<5v^:,fKO. e>Ip^5fK8rgNsPXHb qӵĺf& ^SEnHzD(04Epa 1Z_p)+.{DRS2-"Bw 5: Za#14[׫ ;Ρ[$/$JFyՎR-)|3|>9AJ 58ECI558? J(O=ܐq1]"e=b~F.|/i[[0LەY&d 0@å$^3Pݼ6AC$=4LqJ#J9L$ +ǬUtAT,9[iHxI@4q}k7ôșmβ+viT1SCn{CMJS8RR*? ib*fvyO٭1PS\K됊Pk#HPR@Sf p*{es]-"` DنxfwָkR?6CJ责n4j5\VOxj̭j/8ΐ.x* Rv"ڃ-VK%b[x 3Y9OʧL5i>biEi&GRf6YRiq9Է[ HP~q GB/9r]B{ kaMےڄ=6|<^A#A >Gr|R1ZR~?']Y<L`rYz0˱.M\g\/Tm7JDXЙ:Y4:Ņi&(@Y!8nU}Y"'(gv&k٦*cYd*K}UeYߩs*ZP&30E1]ARNb:RFLD23"W͔%#gw20pQ!~V-7ܠz i Ok놔=p(.,Lu9Hmg14bKdfVD# _F (]愔CMi/5fctq0Muo 3 h)Ff~ĒH4s/] -NMhtyͥA-gb.,ݳ6^Gŭ927Nd MvgM3?<\#]='|عITwAņf㫾&tun'S_)qE/EsZIkq?ϲXBcC+ZL]ln`  (@FmUf Pfrbh8g. Ysbi;̴4䐇97Ab ̬ :6SX31Jg gHլCfmsKaD?G'7?/UUڈ,;q Ji]w#G)sVkSM\Omp]TiĮɹpb^5HI zt 1Bd'⚔2(O3@ 8 G-R@=+"ꐓCƥYjmRFOa\kLY9LBRE\"bAb4!)\N߳v* *3c _VDւNbEoR;O#Iݻbѣk1GvK: 0+L w'5Eç ܤ/?0s5 YҢ\4Tap{Y-CE'6ZQr.;jQKna3Uޯ|Ӿ?axAbe 5Js˦*@5N3ߩ^[ZgȇF:8~S^R~>t56)mȡո?=ύpC'uಘEu1%uH`:tAbSfg Qbη`y`̇&€K|A:H5xBspv0ia ]s}HMK3G1l{Nqu%E{x)͇R4r/i<{L ,|{l ފ,ur[X&m I;)N& cq(9l6%UT NC,h(1=u-#Í4G`n0O fe-b綔D3T[״Nj!GKvF[4#< FIYIfk`%5g\=$; W50Bj3Bʣ߾Q-8bLRn25ϲiluG /ӛ|m\ af$GZ66*/ 9CREg}j[!߈N1 "bQ]"] JQ;=nTbɢr5» z~4{`zZ)"'m0o<3 `bIDAT' *%ƴq#Lk&0kQ9\a g:҂:kUK֦N5{7{v&}D @3Z(5|r:_";LIڰ~ҦsB}ab`]~>;.gBm:`REӿnzY k:,k)eyT~ }{Cy6՘i@r@XJͪT wh&y9Hݛ@IӠBS)vRV:bR4/G(4= tm5w#SDZYWiTe rsxNo8RpX~!XgLzxPI}e5MSSS3ۣr" r^FoVqI p˪ 1^~q܃<)5oF8EJj)j ߔ=RJuV By,4QS֘)3P4OɊ‹w"@u蔳Ћdw*[*Y5djJe(VK%[w2$'Qf2h{\Y)P8I[9ja9 gÚ0LR^=҂qEyA5k1,s,װJ.uKP6 K h 7 Xw͇`+k?kVe'MЧ;SU}[%raRPLk}ۚ& 2v~)BU Mz@VrڐKz۔) fo A ֍j&p? xƟ޷rfa!G~AW9"B\Rh4t#в JPKĜb) *fZH_}:)p "ik[X;9pHr脕Ɠ٭fp'n z\SDl4Jf.qCj 9g|bfjh*R,'.̙(h1N};#Ե(qy/cMkWrNs$6QTx\WsN7đϴw='2!R!^:eӖF9 Z'L2ߦ <.!w"7FqԂL1@_jVjgLOE5_-+]-kЊ2nrvoo):|jS=(MLiZ/Z f;eݜ"EdP 6뭓!bg6u"QT$NJXB^.12'`{kj6ԟ m!tง[ ywoW1M7!e(2VГy_ߨ= H3GY%[*H =ef.șW>PY5ViNP#f{ls})ԂͰ&'yR)cL]6 ey?EY*maKVL^ %Xs Pdkќ])^k@6lҴs^[PqLP5<z .N+g[md9/qWB}i'F,iS5b1mCޟ0:#Jj}__Dt{V1Fis"ryp\=?WM90I7:Y4CbZз] .]eCg^AjO_DT݈ƒT0Za]/Dc 5x][[A2 Ojz*;ȂihPkucnUc"I#˜ܬ4 iy6q B2eihvI0/ .21 [ވDm !N(ܟsT76m gԬq P槒P9TdE\7(ȒQ]t*lj]x\L>Bf&'Vnɲk;%ƾ84ۗMCD7&"7H<$XRw*52 f-gZyQ?Nvir/-(~eϡJE-~ZuM;0uh!ҝϔ5s:+$/4仒Qi\hqOa4RQ>&UE4ZA@ ja(l&`$՟= (v͵4Q֬M)kFDߥʨ2B404&.mb֮/y|+R4ɰ߀9`m,j- V Y p, n}M4a <\8m%uݭϐwt8kp @i{ 2yU+F=Cbui 4{}q[_7a<0k +Kq?-}"e\EseFAl\Ǚf )l"JQ C#8Kp?ލa7el:::?vU |mM'e8qAe*2, IYS¦\ 7cxtVgi~G^x3hpkñDУ/x=M S'@uprL_pQ _ %ww^i^ez,Kj&ƥVBtڃ0C6lvR^׌ɋ!" iM,9г&ZP@Y_&򶅸j/vi>OVu9ӡDzhkQE.o:Bl_do] l}5 0}iKGKA5aM"R j1f6SimחƵe4^(4ٚԹֆ55 B᳓:ϙs^:4gT湔fzl3(WMiaF'5^,o% ͌䃸i9QPQʙgp%vNIMHxA6Ѻva-T֜Œ,l*uj9Z*br1ˣ:"\ sZqb?C*"O$½虓caV 915V-4Pƅ6$qBXI$4,< 5RY>j fT՜U<ЗW,t7}uaNkKF 7gjkӃ]O}ʞgeOn"kSVby7(V7 *щɃRәҩ[rr Oe8ˆIcup8 ;mir c}V#p'ϗu+2<+VJ=s3iJ9 K7:ȅ=Vgy0%VZ2.`id~1IpsS+q|+>x~q҉-TَRHCMoj0 ˡ 0+cʰ8znD;lT`h^Wb>\B Zfd, "Oxo~|kN0%":- 5߆ߋS<}cu'e 7gGnxLI|?s<W{T:\4}sr>[UZNŴj$f!g]w|ţ^ ;\(&Ӂ?lֱ4eF y˭&FѦ5!(M#`b\j󒈛+t&cq\LY٬55aфqD L@"-`җ}ﳾ蘥"'A9l}Zg}I>X_Mj1_&m1 b!)zGL'4l6Y (B+Pb9gᧅ8~xx :6eJ\ֆ/k`m s=+REs3jw8.F?FƂj񨨫Q||vHynP^u+5Il@ᆊ5RA #]7wK,:Ou$̹RMw`s/? :!Q:數"0OJO,EfΉ"yyy/;.g<$rsqE΋(3} <ōt}V?}`= \{/:z~ݧ~W1Bדۜ0 b+pī xnt)\}0ƔE6CG&' o&쓜8k3W=or&dJ|ʋI1/?gAM봸 7+hnM^\Ҡ4VQU`^y['xBD5xߝnoķ?o~c~d Go7^!}zl^v{~q ;瞏GVx^_Ї t@a` m|=ԹIiFC1oVGaT@rn|-pi|)tbi>U~74 hM^F\q媕0_qٓ M7_N(<<^#hƧve]_:PŨq\LOb9Oְ9Z.RMpVIbnulٵ7j4$z/UBVphO旸 !毘5^^ rQE9l2[9ïNVX=&a#׿xo|+0t[5\[_~ßoko[o'?t$"H~[_{Km~ok)dƻᅤw/]8!|͛>琮[!94Vemg-9,Bïŵ7.{&Gp5f Y\C4j|ڟ =.>F Y"gz",H"lsN.Cgs"GAi)TE?}vUpN@]O./~ȧV c /o ЎO_'>!k ~[^S#'Cpݔ~#~gd†Fuky._ sۤNХ\LxZVk\*BnAp ϟ>V.UYJ26]A% j$HScRvEMõ9bXAաʚR\8k:UeW% +Hc'n]V ȋ9*E0PVx8LZ__[_CO85iGP0 fBWe8a&ֻ ФZH֜j+oZ(Ĝc5Yun_9:4zFݣ S֋׮%I z9K(r(ϛ`އigfi~LA]_-"??klU[_7v}5t/i}3nNfE:^'x)|g'<8[9\36xB.@#q10ƌg-/Z(`76vdtyDf^->{Ј7~}(L\ }#/~>gIrpg_;x2aLMlȫszğ_;ی11E}gBfq㭯y!>_c$ b4;[\[>}yd٪?j}Ÿ<½]w픑2a9L Yݔ!;[]JyшPqelDb]\^l2^5x49S] )L,RBD jC뤹$Nn>]ȸ  H Q \ b"l0&Y!\{k+Gz]wˌ׼EE'bwm%M>kP>:cWaW Ê6&o94x&- ձІ[i^ í xf.hBBCӮ %_' 5*޴ 8GqP1J6& j9wQ{(5f\|7FIvחy}AsL+p37"B 92/{(by d_쾆Gr4Ȯt{},`0A$!pLIMZb%Gd[v(K;*WUqRr9XN,bQJDJA H+ 03[ҝ}},$Π Eͼt-;'{`Ȉc.ժPMbĔqjPHHN9]Jt2Gh=ARWb<8WItP$tpER{ⴒa{]TQ@2jJ< \u. 4BlWD )1|%ˈ2`\ ȴl4|8Nj/J$u@z 1p5Ȋv*xJc^[ue"D=v.@P_aYj݃5CJt-G +!P9I.E4P#<BTKgu#pUIBl{%qnNU@J}v1tÇG!65=(1Zfٶ70p'TJ!Z &9␡ZbC5q5su\.ZvR >r:īw1ӿ_О%s2Goٍw5!3VZ}X;|fz+(Sc7/yI[D^`.w\@BFW+Жuc#{aBO4N({zT%"R ކ#SC'P] @Of0 t/Lac,3lΔp,M190~Ju cR.q"M+/|% E;Ck;"PI)nRfѩS+69 Ƣ7 +(HiXALxS _WFU$)`5{)zXq[({+ un."!Z4Z؄vnߒ}]nssϾ@Ёb֐tL;=ȄWE((# 3iWj&3e2 :^l%SZ&"$OgE*"Rj9gNs~!)% 6nHHO'Jh C#]cWIz}S&~Bݻiգ+&؃2E&>#˺e i3TA6`*]NRKz{7!8s-L;|n&͔Q-)?bؐuG!MXAH\(_VX;abch5?gڶ@Kc0SJ)F#ZDy.ܽZ# jI9UUj;7.2 V5R 0αJO3:&-߄Z# ER{K 4bT↍˵2,kwsܣhfhnslz7\UvXݎ Ȅ(]{=XE%$8R9!?an=33ۊ~~ܧr ˟cV$-c D(fTi'ِ T)+iXt(xcH<= wILrD`Y\ U3Z%GȚSfʰk%JNٶN&TH&Afͥ8ı&-#tVP Ysڲy"[p9~daiͼ9Y-(rh맏BρQz$;JJ^VfU9a\ɬ`x݃ʒGYZ-8T\I[BX5]I1wS:;· so:'MP/u煰:Ku+M~ ER1e3$OYLOgڴ'lHc ug /Fz ͻu-cU+s]MbA_[.E"@@}j gl EIz*KcD#>)Uq! NJzP'] T(%\HD?! TU# r0VCJ+A)PՙJ r򡆫xy,Q7,Ōs0T PxuؒMPtGz8,Eח "%W]ڶ_˪JΙ}@,q /a?@č%/Pe&A=5Oz ֳͩBu?oNͦCJWZdPY<37z,r 9NfkjV"W'| b'WP-q T"? <)NXp~kfg`.` #x(ƕ/3$ō@Z^"g3n0'MjԁvhxR z+Vn64{,INi!/%Ƞ8MˬG 8א24@ %-$X]3_JOPk4z lkE{=w?ϼu|B^ܷ^\]}++xYvrsocR7RG=ѡzA)oTQ Fw` k?I6bE=D9djP(;Y>f!3Rɗϫh*#\mϢaRacҩCC15BX=]|Cg5]]DJŚ%&ed!}l΀_y :'Ԓzd$c(t[XiȟMt R#Pe }BJa'2O!gNo"DO ,&=kq.daB"q̺ [y,,DXJb tKv/10*#\sm'g?4km+0,xh #ȬYBWJC䙅Z0YpteA%>}"?32YT, ,hvѳ;UsPj49;F׈d[m_"+{ sd^Ⱦ fVfCOعT$B; ȅs)Dw9<%063Ų5>U%c)sKdilցmWՍgYE64~+A)6&!<Br6т- 9\bx˪ tTӷ5|IL01h uv>G%63VXnH28cm H21wv'Z9PIMo?9w#)&*֝6XP/|G֢qGX,|Ճ!J+$ $%kmqIDF,]?W5˕eEޞq 5'wg*4/&zIi ]%5],Fe SG)̔aɣ-C?F#:0zLOr(]{y|{hxubcE{GgU8r.B ^(0$Z,y(}桘TlH15OI P\[Rِl#[lg'NMDY12w9`UE]W2Qd7 "Ob걂&1r!vEpS7c` %&I& /,*㌡4E5 H5No|}`A 3N4UWp5P%@+ VxlgEd㊭1m nځ-+Jh0PMOic#8r:bu6c2|&HZ%J&XU`%@+2}e=Dgβɤ,p޾mc 9p/ eѲn _apd5sm-$OsC}mF?d3'fM4)RSM7ztNޚXf(ݣ+X``[eP~Ҁ~ "x'{_s? >!?]mRLC6{{><<&Ǐڳ`*W57"^*SG/Lu<~^~Q|Qt^{Am;*l.;Cjeq}KHħ>[>E̼U֖Youk2Ynn3RZG8CϙRkKv' YzPIl()uLnHnFp(d5թ`5tVۉz3Rg[iqTV H!,YF "K6/@JbD@IDȖOcܰ-()zhcȳ7=FcyGhc=E14:66: H^ eo5E71~6Z8MSx 6QA/5wb򻖢7'=8sٗװ;`dl0Ot'c?UlYsx9[***h%N$c0Rjz)5Jõ8@t/?5,adN8ڡHC+ o=ڇbtNQ 6Bġ]H=-SGsXXa`lek_?B䈴 LyÒ5>,?8; il=ub|9 Jw$T)f]}y\GƏ3F$8;a.@> n6;=wͮ|'b~σHJ CX|'O l0.zI>t.7wCt)RE"4z(Z%xދq/硐>co0 ҴFjb0)K Yp۠ Xv,V(fjQۇCi4 9j ˿d_oOZd},a6c[X[(bbFl~6q"i2U{w>A Op 3RA獎 uB\RXHm0*j<۷.܎YIYh؝?n_H0%b*h,U{ؒ}%+$뉴6hh5J+E84sǐύ#?p` A}J)֌HnRJD 'U܀+:b*V^; E5AtOǵޚъeoDi嵈oT׉HD2yı8X]W#Z{K578㑯%, plZ1OlXp{ 3O| əhb'iC=d)=ނyu?[=ζgSͮ)irZ 䠷ɸôO&s1'~ދ2IgWƏ:I͑'A6 tK/ YgT¨7):C^vL@EƋ4ՋC;ӹq ~Ъ>#9 ^rgC`c^9 MDpu#D!} @;40jd_ @lUB*QX#vX;nShy#OHhT1|o(s<{&|!t>M\M'CP{]kHā &_~#_8uT/U!Eڝhv2pbj{>8#aֻ1>ܶ+ 9{@1B5MSTa UyYtO5mj q7݅CϤ8vp?:{rU67gh(I߿}xas1Xh& 8pv>5+JV݀W{nR~p3NfȄ5ZDe{!6rw:~QiJ\3mlq:>͐Np )K})h`^=.mӿ e Էres|RY0ŠY\CڨZVP7w3C%i`L杼1Oiܔ={`CaY@{tsa؂h́e KwY]oʒ}h[mJ%no +g*W$e&ysoA`q4SSz _cE^K y7^0ZT6wpom5f{~'OV h~$YäoɎ~a_TdxRj4 aSi *|ɾ%\ NB B On׶^ ۶m @-2V\E-V[FKx8}iU͹RǶ>؍ laYWMY~HOhvdAڻ+.Z,[aBޜRQ0x/# >{Bl[cצXu' HQAXWƇ7aY 7qU۴ ~%Z J?~&l+%lsZ,x=H> 6n~Sعw_3ۮAr* b:e1DrB)ݻjè]~|_qE9=ߣW$L01=HZԏcvyuzDljz|~,+C[iسAq8!4cy9Vl7IgaOB7w2_E+0SA®u*LH$9*Oi#9{Auw L*:Ïz0Ğ^Bvxu06b#jq iYy9^$)]H`Vσao$* #c 8Kx8yS߃vmFҲ<Ê\1q~$Y,5gs(`0p(f>Y5}SSG=UC+v5t/־@qݳIa=#a MΒ#ƽZu6Y ym>6Pd[k~Ovs;>.=O {Rڮm2w̨9ͺ 2X\4/yμيH;%H& BֆK{<~Iֵmi&rL T#W-$g{} ߴZD,$ >6q6l"8h%=|x{ZZmZ}C-9|nq*&04ص輶[ .&qdž L$8R"cফW`iƴ~aE=ľ.JC.ٶlۈ1^Lw~C r)-kpCA@戯ځ̈́Mϴsb+bn闟̹Խ!R8Bu3/G}LJOk}3QMIS&D늈f$SzI?<{?atV"WefgH1PD2f{7hA3m>ק11Zf4 (s\)k^ T%1g2-zo<2 ocW v2z iZ)ٛ6,錨{/v]s{45a{(Aߞ[DVGtz| ^tZy;d:AȒ}*4@; K9(s2Jߩst8x%Svtq.t:CAf}Y-0̏]G}E߫3Kê<*pSâ#E SZ)]жabɾ.վTPeD5XEߍFh)f\b|D`;?ppL߱ (+<9\bP;6VQ^Q>w)cZRN!jI=\'ǽ[(2y6pf^jV"1Qp޵MwSp -i5C8ciZr{}2T6܌ufJh4gsc 7uTFNeՔ)#RkMkn(1,x\=B,5p%2NP-Dl\0빞ce4Fl©/y >/|4ޱJZ?^5(ZRL1qHX #\@D4JMqҧ!}9X]*i./.jekzM1qha2H:ZD^Rb8LD{RGF#GԸ?!b?jQ!C]o  İ,C^M7z<0$i6=ڙ}؜ ,p]?,[ƼC\{AzțC\ >AosMXMfQ]gK/i:f ACX7> sdۛ#Eމԃ%IAE^_ޞ wGa hXfW7jvN;>h/s{^qim+㔭q¸GKuq%!sM꣉>dB8;V88X0ɓVG8(@6 gC*uf>pcזtju!a?8t΀((ߦ)&'!FLHL6spP^Kq6P\HJ0PXVU lX/L!ـ[7 a!hzRNNJ78>kkQ2i"^wlxуnũs*T/7$[WGhfhvIȝ2m#w$$?^@eӻ/~ y'Fj :DK3gGlG,$*0k%gZ=$*T:aQ`?-p-H@5ZP%WZUƱ̨)$nT mg*b`* "iOsý1R(]iXxG`A obˊ%Rkad9bp՘bTs}6U@en> EQY*w-a~4CKFlY?AdƮXI":F5 D7"_H;eA?;H=w J-R1ꎆP<(@t9\[ J5v*rCf Dwqpv p,*SFfß[8e/|7jށ昡x!.{bQR>:hIPuA=Y̵x=I6|qxeTT)3Ol͇4[w}L z^v,)8TK sh+S^Qۆ:9l8^jyҠT؀Mu)8ޡ1/8׶ xuTt=199{&s_H'>d3҄/(V;d}%hd /e>4Cc^"h~m1e_:)RϜ/@u֢<+(S yMW<{He] ,8qLH3F1>}a{><ٯ<xy9}Y$eH.=]^(vz~:SmcKxg9h"9-S;=RsBp둙M{ "LiBwOu9)E)C! EqnUK~-{.^SYq{^{}(e):jjOg\zI%ʑBd@7{{O}g`aΉ=C¥`ZmM쪆{^@@ tKXjIU)r #C?)::\8T} $\XT6>'gU!8S Mϙ"95!<=o}[Bک WJ,~ʇJq^UG{gB@R5!Q{.{u֨^!U6, p0CqMiyT@ SI#wѫqͣl+{ "/Q/152% ^* ͟kqS+\s WsHʙ6F>aE{+ V Ds7'T,'61?9s֬߄[WP?Ƒ/uQ,APP IWExϽBx.FR38-~פ8I)E_ (E=ʿ1Z~=7zu.a/w}cbhKE{}^<;V/ Jj}q^3wzأkJKK]{Wj`DgK~d_/C$-,X1gcPZc.S]>niY1RvHn*F"|%ݧ^F"!jSitN<{bNׁGEP[5lV_T4B8,/CޜT弨,@QDkWu#lQ ]c 5-#?8zTrȝo= *LËpFg/&p}^FfÛ_i߱fsṃN}K^ Rɞ.kd:m vXd}-ۗHZ-EeXumu7^lb3hڈLZn [o]kX3a! _Z?EUa9\}n[%]AOb~﷐ύ[?'oς哸s\d7ݍ/L)Vܲn&l_Y tOBuHz.ymEG{!]3D GzY /)OIͻO7̞d_?A7){X{=m,mJ,*6q'%T4dQc&ܺqI DNiH<ƿ+=p`}R0ӧtI7!.*^9zcy]Bc&PY}9%>}1￞]K%WChŰϚ>:%"Xyz $ύ+6+84J AP_HdҩݦUF*DRK2 H!=wU”)aB%`QۄhMoϚShyJE72iAmT6܆-@">=GAuQ2W,3.2O!}g2[ᛳ6 )l="Zr"G$9i <^I.!.1D_Ř"%tȗEeLC ]R &f55@-Y̨,,t} L+iqfg'o`'7A]0ȵEVg,;ǾJ$bHVгK&糯K|N:>KuŸE8Hq `Dƕ@&DLZWyθeLA34 )t ԈCUM`@8bIBLɂ{}}os/R=u{] O3@: in($8n7My˂AT@O 㪱u\po`,}8Sxp+2Cm"Ysπ36 LΛn [23$`A2c^1FKEYɕ{vǨ"u7ɳۯB KJYf2'bG!UdmH~dJ{36ߖ8/w3g 7O9;,~ cOiRٯ?Lޛ;bк%skJ ϼŌ0?#*̝?U],2iDR0cf\K.b d7H]nz髩vIyY[|zϼs~dQ}].: td3-3VeIvz*Q.! @S]tPܳXGf/4à->rYQD27%tEXtdate:create2020-05-17T22:00:42+00:00ڮK%tEXtdate:modify2020-05-17T22:00:42+00:00IENDB`CPU-X-5.0.3/data/io.github.thetumultuousunicornofdarkness.cpu-x-daemon.policy.in000066400000000000000000000015251454622605200277330ustar00rootroot00000000000000 io.github.thetumultuousunicornofdarkness.cpu-x The CPU-X Project https://thetumultuousunicornofdarkness.github.io/CPU-X/ Run CPU-X daemon Authentication is required to run CPU-X daemon. auth_admin auth_admin auth_admin @DAEMON_PATH@ CPU-X-5.0.3/data/io.github.thetumultuousunicornofdarkness.cpu-x.appdata.xml000066400000000000000000000045331454622605200270010ustar00rootroot00000000000000 io.github.thetumultuousunicornofdarkness.cpu-x CC0-1.0 GPL-3.0+ The Tumultuous Unicorn Of Darkness CPU-X

Gathers information on CPU, motherboard and more

CPU-X is a Free software that gathers information on CPU, motherboard and more. CPU-X is similar to CPU-Z (Windows), but CPU-X is a Free and Open Source software designed for GNU/Linux; also, it works on *BSD. This software is written in C++ and built with CMake tool. It can be used in graphical mode by using GTK or in text-based mode by using NCurses. A dump mode is present from command line.

io.github.thetumultuousunicornofdarkness.cpu-x.desktop https://thetumultuousunicornofdarkness.github.io/CPU-X/ https://github.com/TheTumultuousUnicornOfDarkness/CPU-X/issues https://github.com/TheTumultuousUnicornOfDarkness/CPU-X/wiki/troubleshooting https://github.com/TheTumultuousUnicornOfDarkness/CPU-X/wiki https://hosted.weblate.org/engage/cpu-x/ https://github.com/TheTumultuousUnicornOfDarkness/CPU-X https://github.com/TheTumultuousUnicornOfDarkness/CPU-X/blob/master/CONTRIBUTING.md https://raw.githubusercontent.com/wiki/TheTumultuousUnicornOfDarkness/CPU-X/gallery/screenshots/v5.0.1_CPU_light.png CPU tab (light theme) https://raw.githubusercontent.com/wiki/TheTumultuousUnicornOfDarkness/CPU-X/gallery/screenshots/v5.0.1_CPU_dark.png CPU tab (dark theme) cpu-x cpu-x.desktop CPU-X-5.0.3/data/io.github.thetumultuousunicornofdarkness.cpu-x.desktop.in000066400000000000000000000012201454622605200266340ustar00rootroot00000000000000[Desktop Entry] Name=CPU-X Comment=Gathers information on CPU, motherboard and more Comment[cs_CZ]=Shromažďuje informace o procesoru, základní desce a další Comment[fr]=Récolte des informations sur le CPU, la carte-mère et plus Comment[pt_BR]=Coleta informações sobre sua CPU, placa-mãe and mais Comment[ru]=Сбор информации о процессоре, материнской плате и др. Comment[zh]=收集有关 CPU 和主板等的信息 Exec=@APP_EXEC@ Icon=io.github.thetumultuousunicornofdarkness.cpu-x Type=Application Categories=GTK;System; Terminal=false Keywords=CPU;system;core;speed;clock;rate;Intel;AMD;motherboard; CPU-X-5.0.3/data/io.github.thetumultuousunicornofdarkness.cpu-x.gschema.xml000066400000000000000000000063551454622605200270020ustar00rootroot00000000000000 'celsius' Temperature unit Set temperature unit 1 Refresh time Set custom time between two refreshes 'auto' Theme Change GUI theme color scheme 'cpu' Default tab Set default tab 0 Default core type Select core type to monitor 0 Default CPU core Select CPU core to monitor 0 Default cache test Set custom bandwidth test for CPU caches speed 0 Default active memory stick Select memory stick to display 0 Default active graphic card Select graphic card to monitor false Print CPUID values in decimal Avoid to print CPUID values in hexadecimal false Always start daemon Start and connect to daemon CPU-X-5.0.3/data/logos/000077500000000000000000000000001454622605200144155ustar00rootroot00000000000000CPU-X-5.0.3/data/logos/AMD.png000077500000000000000000000211671454622605200155360ustar00rootroot00000000000000PNG  IHDR5mh pHYs.#.#x?v OiCCPPhotoshop ICC profilexڝSgTS=BKKoR RB&*! J!QEEȠQ, !{kּ> H3Q5 B.@ $pd!s#~<<+"x M0B\t8K@zB@F&S`cbP-`'{[! eDh;VEX0fK9-0IWfH  0Q){`##xFW<+*x<$9E[-qWW.(I+6aa@.y24x6_-"bbϫp@t~,/;m%h^ uf@Wp~<5j>{-]cK'Xto(hw?G%fIq^D$.Tʳ?D*A, `6B$BB dr`)B(Ͱ*`/@4Qhp.U=pa( Aa!ڈbX#!H$ ɈQ"K5H1RT UH=r9\F;2G1Q= C7F dt1r=6Ыhڏ>C03l0.B8, c˱" VcϱwE 6wB aAHXLXNH $4 7 Q'"K&b21XH,#/{C7$C2'ITFnR#,4H#dk9, +ȅ3![ b@qS(RjJ4e2AURݨT5ZBRQ4u9̓IKhhitݕNWGw Ljg(gwLӋT071oUX**| J&*/Tު UUT^S}FU3S ԖUPSSg;goT?~YYLOCQ_ cx,!k u5&|v*=9C3J3WRf?qtN (~))4L1e\kXHQG6EYAJ'\'GgSSݧ M=:.kDwn^Loy}/TmG X $ <5qo</QC]@Caaᄑ.ȽJtq]zۯ6iܟ4)Y3sCQ? 0k߬~OCOg#/c/Wװwa>>r><72Y_7ȷOo_C#dz%gA[z|!?:eAAA!h쐭!ΑiP~aa~ 'W?pX15wCsDDDޛg1O9-J5*>.j<74?.fYXXIlK9.*6nl {/]py.,:@LN8A*%w% yg"/6шC\*NH*Mz쑼5y$3,幄'L Lݛ:v m2=:1qB!Mggfvˬen/kY- BTZ(*geWf͉9+̳ې7ᒶKW-X潬j9(xoʿܔĹdff-[n ڴ VE/(ۻCɾUUMfeI?m]Nmq#׹=TR+Gw- 6 U#pDy  :v{vg/jBFS[b[O>zG499?rCd&ˮ/~јѡ򗓿m|x31^VwwO| (hSЧc3- cHRMz%u0`:o_FIDATxqG[ `6#88CLF )Q@pF`8"06kZI;'sr}gۂ 552[{Й@%ۧз4aG࿕fT3$ 5|?sKߍp 8`BMk^S?h 4&ۇ+BH晝lqTsϱꔦQw]|I/؀P4Cx/5ӎЮ&OK:j2 , 6cfƬ`5 {fܑ88MSS]f{O8l`pX.B`P3A̩'G_> p־j)!tړ، S=h<)_!xbf Эу]0&o7.-lgOM! YoP6vt&`P7xH3p1˗]b tXlj6xGЎ&J=lljNҳٌ x ``PsjXbmx #lljN,lSMl>DP=X:* Ԕ3Yı2w>N`PSq~wƀ~R36Ë|FK7vZ~)xFY;4vMxr7p;g?~k')HN߼WKMq`&M@~IZ3Df.XX;=Slg}` }YAZ6}fKO$owˋݟ2̙>@y(^}N熁ꃄ&t C܅3 By،6LRЗxa$'9R<sY.1Kͧ!ٛU?Ys)،6KB>fz{.O{p3rljDv:f%Uf>fo;.͍= c[$bw:]xR1} ظP@8.l d)q? 6P*7+.llI`3:ax 6KcFUIJITx9w 4p>҃=jt2ej Щs|] W_5Q`T 2T`jK#.[}n+$>2P3K$=:}Ax+t:u}m=PA>,=*޸|8ΰ̢ +tuK=h|ƒCʇ"mDygNŒָ 45d~J'Ws1 waelip(hjZL#ԧ.!NDfl BM+E-^r:+_ ?#eSsf 45CL?u֥ʻ57|}*֌@PLBw&}whuTk 45CD/ed:Y<>f;Kx;(@m ON@PTM[ ro@ɩ}vv ^%SMAyN8u?R'd[ Sc8m BS,Z=66=64\h`f: #BOqs *:opn 452KJ{6S0`5 uۯŎw 45h ?t uK>hQhb@PsiNy:Os'aR3\yb' #ufk8c)),v!߲N2fbT=XaXȥU&ԯe+{S& U\k:6-<Ų21MȿU*f8?TXhjP8vXNU&;WlZt3 `]x qo|*ݲgmVYh8غNj FETK:Q !ŢбSksYl9`*p$o.8&hB 4bS㝹{oz^;@Ǽh`45/l9`Rϫ]o\h``f:Oa6ftQ&J7CT_h`ҋZ簂My) 2)vkjF:Xl͐ӍJ}J7C4wj*Ҭz0ةV0@yay{t3tϤ1^ 'L،sh5S2E[Wg8qVyOq%tfkﴬt3tTh롦RES i^b3ΡtVQhbǼ<=hfZdInzg̥98twҳC52pPcI~_t 6ZمfNjRsN +45|Un.ìS 5xl9\on( ]WqE:faPf F_h<ɵNf9S 5<ٚa{nen}pB<$;&O/ʶ~~RؗN '41dfVl6QǵpB, {D;@t3'E3PQ \jlnԞ_8-/{GQ m_:ɿrOQxL.b &x65.S0`J@yԞ :Ϛ A>>M,=iMF]K`04ަJN# #ԌsK\،Y?ZFuEL1KñeT0BM8YP)|XGNLlr"L 5q*k6K[O:fi`0f8fw{.ӏwhn^{<9ē3.ivafڣϴv9q.)}nWF5MFٖx^j ƚک=[@h4I2yX~6| hPwq.،\3KCMosC8 p^fkNkһlߧ>^4,?2|IwX%yt@ӻ`PDY]R[1@ӫ`P#f 5Ͷ?v<JMyNIjUzVሚb7fNi2ܪXv0d秆IjI᠛ž68>S'XvƐM`Pؗaz8s_Ql p7|Ro&T~jg4SBMz|pM]F:&n4C)W4S T㥿[N~qpؠZ3 <l6} 5 yOfc &j&$|xE.v̳،j?kCCMkdzTt<@Cq/4>ͯV.jl @@3PS-lbߒ6So _@@::A{iMb  z7LR@gY޻I}9{hhzl 5 6ʵ2hQA@'4~'Q.j7Il 0TW `>藅vmR=%5û_Lr)hl 5ٸfYl 0$?f@P3M; [Fq޻xfPSmfoٌ4 6Q35վ47Ŏ8.Ь4ͰC 3> 2fgh=CiOł،n=F'L@Tl @Ml9h}Cͫ_ ȇLb3Nalm4 `ofi-l 0MςBͬ`Cr6MkaFi+T[ziyWttr7 fhVB49hgS4،]y"6->nUłMl p 3Os&J3AXjFW `35-pǞyR36&36Ñh$MDD$MFύU+RZ!S:g!$JʘL3RH!\9g|_"3`rj\gLJ)xtw]xwtww4͕B&!Dd2 pccc8OܴDlۆR]-zݟ,sŖ_{ur4nՊm L.xW:0JU({/&Jc1(@J#X3mqBw:9 $@  DJHiċ 8@'R@HY)YJIQE! RcC}ް~b!K&]]][,o*JM !u{B<BN7~_3vR2 Mur9Y V,_~=mߵwS0U~oxƚImez0t/޹DJ+!zApA (RT Lt_DV+y5(EMb-PJ'bH$yRxKޮ_{GFEa[鱱cPa!^.[\U"çD|p7!Ϫ`c 1pFK kZU,˂0L=.Dq яƧpE^;6:v|ۦx;vlO-4~Y ]S-]LU5Z)wv{>ջPJuݖΞֶP @B$@ͧ8!jHPx!*!Hi! xH)&=̈$ -7Z[tHpIz;ָ"p8wBкaT\.X0?.E8D"s^N!( cVpRJ(RbֵٔyK˖….`AQG%cw/u|qϥgּc{ns!׿^JR۵b!oX,]]pFjO;QA**BQBWx!bimzY}BO\pEBc' } $Å h ޫu=aer@!cO_LzX1?Vw]H$|>j0)eL&%j78`0fphP1 ׽2Jc5u9,ۂk;`*(U*ǒa/3} g!!7r;{ܾu1ˍ_Dt=l5hIUjۖӫ\~ꄨ`ܸI/y=ɦu1ik!5oẈi hHBBG^(s.??7Ù,^/gٖT*US8p]BPJ_M9c RJeNjdr@.+RJ-*aT&)BBRPJ2r+JsNϛL&=Jzl>JխҩN^EQu+ֻo=՘;xeËڶmyBQEeLQTJ)g͚=E_Dm]=soy]5BH=SKSQ#' Z u• )g0 Rr8hUU) :G)ԼoPP)ǁ6g8)<60LZs㣃/oX;6I$IvmH4 ѶmPJ;d=i; UU. ;=7nZ[{%RCG=E-#.Xy9aT]p酶a8;~y'7;)R @ !TU"xB4]!.ҫ1U vϞd܅$`LziTH B$lӨJBԶP0Jw=;oBz!!#NkϞ3oe^"!U EÔP/c\& @q`B6 vxs&X{! f?ܘ3Jm&W^yEoPp]@s@ BHTUytuum޺u'>m{2SJáp4|eW|dQMȁ]ϾLJH$̝1E`;>OK!5.8BzµeeR!\N1#\6=)Q*uj2F߿spϖ+V^rFeVWzbXRJOF±kD0 Ԁt,9B65^ARv{8o+0IRz/0p4 u]hvH)i* "Hvpp;w\v<b,^&|{ nߡ[O=)(J)c …VtttΕRE";w 7a(g3 ;8]^Y߃RQTDpױ,8Hif`wʳFIEUuUQu~ 7+Ku]0p=!i1&!`x~BQ:m k,8L#~+_sO=rr-䪫t,ZR`ΕLt'!i|B_{?v3`(Yuett,\xko Jغ~K?c}/= H5MQƘdيK-1ELzM;gbvm(#RHryɁ{wB6ضeTx._K65D&۶n^~B45w>'i`p]R!T8g-y] @%\)`(fF|g^~:·~?J{ӥjR~a#X,H[K=KW{ "\پ-/ox~x.N-`0tste/n=\lfll&=@㸎pk~YB`Xl%\v-W]{[;{UM#L v8\ ]YŹj"DBr0°ᙇ~7OK[&ͻlժUOs@Ӧbi}`׮]wߊݳf/λ?1{UT{"4pd^x|GCȼy;̞3gm#+V|mȠe3B>ϲݣvÛK/% -蚛u` \؂@@a vIPpH"!@бK/{-O /d2]~L((p٣G|+CJ)gϝw޹/ko_tj=R%$*bqu=C?<|pE-B@NN51$I(N8VK.K F≦9s$ȍ/nÁBw]a6z ')%цګB BVL3ֈׯ LQiơJ SwƗzeKO55ڶmkozEI FcQ(HJ\&oü*`!Mx[7 ]b.B$zد)U*^x\= mɦTUxuKe*޿嗟|o2ᡁQvO*"' Q*@ @8LJ!\Q$4Lj4MTcд5 R "kXe"8^Z WV%QG2J Hwxe!~:AƲlr#gݏz*斎EK]-a].?ImR ptoz&X]Ӵ+TU>{gg/˲*㜟7cM_EУM1t"h:=O>t`זM[^zLz|\p-^D)4x$H"w: /J88e0 ҞDzv.UրFh L<VQ8 @@8RC_'Iox5]W/;n uo ,ǙaxR`PC<GLZZZzKҲSsbgd!Uz%YwL: ‘Ξٔ1ee펮TQ :+Y|o7m|CuMz^TUz{{ߗdB~SHkF }RJT).$(#p]!'t{PH!Z 4~B0V7SJq! =q@s ~B֯{᭯n|јV&• z5"ԚDN@zNA) ! 0@0{K$\N~\kBjx.3 S-->4(T CaR± <}㱟G> xLӼֶmzT`29XU!u2IK ] `  :}z($86ˍx>&RJ麎S,rYWH8(BBHV2~.7NPN\ꅠo0[,ˊNaR EQPV9G,ms㹳&~q.p_s4759QQ0XFظ~{_;JR=)4EQDZZZZ:WX?8 DT:LZP"LBӴz4e/IS!}8u`*˓YR" AQ Iu%~̶m~ Mo~TP p.A {#n $$a(J$뀻I(J~id:Dkۮi ÀZT0M37'cLUTm\q[5sP*ZܨTD~tdO?s/j|=`0VUUw]׎FI(===BЊ^KU!˲E"~s&r>JRvHEQܱ>TUU9GTB[[ۀLTLQ$6~PJEiWR$ à ۶m=hEkBhEռD9 ܻkob28N])m`880 @ \(j0wv|{~6kE/,ӱRO?<:|W|LJ)=̎;6f2?RjuoP8V*޴4ڵkL&O5mK9G0{MzJ2F!stuuپGfiV7oxK_N lk*gJjzP)sOlϮe`޾ʶtCcrWRiwtvϺ+owV0utʗsUyy?}՗T̤{ ØTY\.sdZ4/os"Hzpppӛιd3 p݄ϗ{_{ӭnilLpz,#*9 \*KؐoI2q/j4Wom1J224='W~s_lOF/GPR }|pp>{vV=I9G.D" GGGΘqkL8mk璜/9m?}__dőÖ(cu볰|\;!;7oxn  L\׽¦&3 r|>0T?gU^p@kg|2( ẐQLzxdmm+>ɚ:hx s0FFGG1cL{ldm[.%5'o3!5=Y9pretd(y&T;L|]dnc~DʙLuɦTK(^sk.B xeC~g|^|DDgg4ٗIa:ϝQFOZ5,s$po4(஋x6c+Od0Y|{\ם3뀪PUp)p$[jUBѦyK.E"[B! 01z|yc˫/2ξ577/r7jG|f˟CĶ JwTƛqQp]ڼ''hq.d2x%@"ipmLujZW\}ݻ;]暖^BegH$i29\KgMb &XEKwg^ 0m0dv8(#!kQ|>۠X0g(c8uU7h4%%ҐҪITU RJ8W<͡(ut__߶!!@&9p (vv,Ha6 BHt||u};L^h̙TAґL)sYTf2鑑eM @K.3U*UU5ҸBUՈa-[<4p ϟYaƚ.XlǨ] } èX5$QO^CQT`B,YzaθPD߁=ۿo8EyT**J)4M;_BNg#U{4l)@WApבX$P(̎?_xʪa_I4`ddz89=S=}?`t]NJ+zСCe˖᜻2]?7[y cŊ~ӟ^o޷o_5IwrJgyO Bv +9% $WNT*pW1L&ǻ gBm? /V:;k֬뺟eY`A4!@P9s &ݿuر[j5&ٓ7o#۶m{@LZZZ .ɜTE@`&4ˈ066oڊB 50fK@T]%HOց6cI4ׯ{䴜֖jtf%52GR#'J Br !]uLgۦ};=" BeKTUc r?_V*{yzB 0Z @<clN> iy(n6%@w~N:BH[[Ry$ 74455ÇgO]15}X,;::͜g|eCt#BX,v]2]MR44ErT圻Pyߗx\GժF)E"bbRB" ݅gH&XM' B`UF(C[{;VB(c}>{uϞ)>o`B)Dbi_#cj|myhI)  :XB"Mgݽ|*I,[|ݱ-):**(I'1k"(EA2D ؘ>gΜONEQ]M*:O_hRX,"d)qeP( H #Np8r9n+nB9Uqw7oe-,Ǚv=i]ch4 08λΝ>Y\^!1~ONEA6kY֔|PJg mHd~?򭭭d2$)kBSa͌bK?{`S< T&)܌H$rړ/+ffw]{)\n$qy,s˲vRL42IOCU*n)%AIӴz뺈F`x$LUUU(NVyE~ ٟh\.tkzEQ@ 5N[FDJ)cx<>u@ 4[m^&PQE---۷O"u;2}/ؿWJ)L=vI<Ρ:@6s(p$Jق0\ PQK TR"՜B"GqkDJp?voߺ~ &XT*-D"ud=&Z#tΚ ))(c@%;rh7f+?e+]۾UWɄB@Qֆ|3ꫧo}[~hT#'3_UUp8<0IzPBH$zرF/o{,K/3J[\ny!ǁQ"c,x{K&pX,ɼ4|04 Gg:tGСCgeLoՆacgJUXZ=i#6W\hFPUe׉,@Rʢ8rW" ?cJ @ DJXB1&R: m¬Z` LSQ6oܵ}닣#ǏN455u&ɦr|xr;pHͭ5iϤs?ϯWEѓR9i:N1pxs\ B) 477# $z;xN:ZZZH)WdiH$Hc.c||Pu^qT*;MFcEaبKr*O?Db&Gա]h4N)q:ex<4mhB8r8!|UT*SRWEmoooS@Ӵ:7Ԡk,OKFqƽA"lE+/Fgg 0O# u6 "lP)ؖkwyƘq!?u}a}1X6tw"mwEMOt7g1WQ ƳY$j?.%Ǻ1iW__JpݣR{v\~h60ٍrGTbqZ5&^x>=l6Nh.flSJh\nжmsH$ru\m|8:u !qw6ϝ0 蘳W\3ZRm. 1!]茢R,BJ q! '鷞{ `&BЬL&p8\'N &'gpypBHIJ! 4mT?~|gVT-w%+*0M 0 Ri鯽!?/`Sv?65\OE杈Sєhc*6<}7:v=5EQ K|F"x<~ilZ J)yRmFy 6F[|ۨdz}}}Y`mdaC#_7ba;0zzz/^xJ2ZjιOxLI~8 `TΝ{;~Cv$N:ikkk,Km0W* ޡZ'xJ͊\iZ^]@EJ(6[a hLc@al$ 9o`JBe~9/33' T>z#[a >tpk;i Tu`mmtvvN* 9Qz0k&  ,lXi&Lt]G  S ^!@0eY ĝ?~ZD"8Z3y'< BnRiS+Wz…_>vu~M,љ4˲YkB JYǏM,rͧ"l9bT*NTR! 577(Z4M_[& 3W*^-݄ JBW$ZZ 9J4+';^y{7 4\0NkϏ?OwP " J\ׁm[hn#_:$5u,KtO ( yuO_>X/dbcj?,- /ZUj8[EiV۠u]Ml٩^!B0xm暦3iRH$RNcjO ̛79sk6'7A?7ƬeYOv?MH$v=ҰiYlvRRR 0@):0Ʀis^Quj [6 %4Ux.wD+V|PL) TMP5RpIJ"1 Bpk%F4 HGJRgA(j<%pS{,1pCR T0 MG4SHG.JxRx/~QuOu tݺu, ~({Z0 ߿qC% EC!?~kW0PJ7<<tX,2kV,bqzhK"įj K)7 #R . <}0 TUzd_5>J~iu21=Ny.=%`~c, (pA<;phą42' FRZxyUBg\@zB{o~?rdaճ5̛; k/ʚ=bضj:%@ Нg1MAUUeX4MkH$ވO*B:wL&K۶mmu}UTb~yumxT*q'O/!vٿK,0|Fnƶm\~cm(>Ri=700e ÀRxe(S$RƷJIjpMٷ}צ:xp?&]=. i.N?z񋭲,ܹi-Bdϒ7+Jw]~ᙦiP(14aYփRi_CL |>GHS& EAaѡ3R;BW_ڽmfcbu0!EQԶMPZ (SlL1ْR;'[ZZd2z"lۖ>ȧ2n&5BJVU9X22ϯ1{V#G3ommmS8$DcJ[[%j^`NOsm^d۶_WoǙ6jL#6l{!REj543qA/) |c)j@ g%ᠩE  L >PTZm7j*LǁMM-zu%T)vmyo6SJlI,O~?+h+D.(,EKfZ}0iYK L̿p*ڹe˖Sz@gϾ0 FPIB ᢟ߷m bǚ/U'Ztww_;ʥ"(AB&ᵚAw o kFGG Q  Da#ñm0H0J ]R1W<+C96lizgWܻ?߻|Ba\#!l4e7mR)_MMMBnfczG>j|Ќ1ettxuJ5lT?7w~驺6SLD"nYl~dz"~VRn{]k޵ʫmrxHEG_au B:L;5M<}{ҽH!s]K)|T]Js $5-J-)̍zj\NsU*n음8D"vXFAS؍52[ %h@R1#J{X)7ծ冦xSQaY;U֪m1 c8J\.7RB)XE0k"Y샊0A,{~H?h4jY$i8^+wBQ,D"ɮ4]fX{OK*Z;#G !xyاM7}[n uKK#s#CO?|e$~o`AR@UT8vA HI4&eY:w%YdHR}07՝$А<^NMZӴPggedmv?X,fN{`0&ɐʦ,˂6Z|Y,&7i!s='$obFhLYBkZ1t:,ˈD"蔳 ,XK(Ta+aUJԚ!.g$p%WW~폮V tfՄR(DnCEKk+2oݼyúgo+/=V~`B)c磟 DSK P(i*rF P0i|# 򑑑9S*anooq]7XșBmb|?vLNŬ(%gZc->8)_F]=mc… #h=I;υB!Ͳ,䝚vjT=X, !~8W6f t]/e١i LODzA EWwOwl= 2LϋB >RH !%xgm[^}o6(^r5 t90h t!lm!plP">Gb:ҍi˧``CUU0eq57-_\ӴzttNOfCm6IR\Nl,#4NR,^]CCC9]"DiYq ~__B___+FR4>;E7NL4Mf1+ꪇl6^ !! #L6{A$@] Ea.еFi!@W;BGJ UQvmbSMf[lWp? (jZFqAB5>M ]SVsET\.Fͯ/pEAX\Ҳ&.錺ȊbR|ѓ[xse<́(; Øz*P(|Sy&ad èfP(? j,?00pڎRdሯ2{W"q7K?hfB~SigT\MӐF_M&xyƘ駑x0~׬H '!4UETjRAJ &0zz 0:E0x.ܻƯ]a0JJB&35Gc>z@@e(Mڐ72OiP(DBg2#K.YJhxIkpDTD4Sʕ 40ĉ5q^UA0~?:nB`´,8O5Η ^i)ϝ#P>TdY=ɸ ~Udss{N  }iΜ9{ȑO eYN̎ťRzu$T!\tEd2dQ0zTZkkjunt<YBnifkOy=a m:SQa.xG?>o޼͚5D"14c,ӅR'b+BhkkÇp߾}nfͺs^!puC5(d޽Չh 7nҥKGVX^MX7hD8H$#ԦYp.lڿwړ`T;ީ7(v+\Դ Ơ*@rxmWtljB(b"DzvK-_[t%WD-4PqCOJ)v=ly%D4"lӌs|44Ϟ|?{3`DU6&00 !cL圻R&uPJTqu)| UUCsl&վR ۶H oۅB._q2rLM6J.a bJשmd2^`uBP88M)edri))+GMR+GϐyGٵVAH}$\mKX:s٣z Wt, 5:1 ( @ DS"Ӫ|_upϖgŒIg@h>rCm.`z.hɅ]Ɠy؎BH( ATH4r ӭh{{ܻw1&0SR=ފ7o[ZZ!.yF=թNX<ѴhtΏY.Jئ FOBHFe/= ;z $ So듿6LWiW( eQ (TUayL;ClF\088̖?gmiiYlYV'8'pӴ~öAيp{?>D`I=}˪B S=~{[d+>۟R-%7ߗ'~1*44nyU7d >\.]3ep8L)]m6g3ig@!`0%Bjfvo(tͥW[p9a*W@ cZ#0 P"-iZ\nw~oG0T{\IIR*A\E&&$ Mcqsd2L&36>{ny,rg/F1 H山o=+W:^( 7okj<[5{ />'-i^i-@B%~pࣃGڱuB9s$e5|vQJpS;e e! 2 ¦ԨE)pJwެRuCI>L^ |Vud:ԞJ,Jc;wnnƍw 8;f]xњkny{?6gxS0` B TKsoض_T`(>5k|(5 v x J%M)ND9S`VTT1Ne*܌M/ikk~bZN9N۶H$J}}}o}^fvTݽ{c*sG7q/Yd)q85IPdrYsY$"hm޳ݿk&+VVRJa mSCJ@$Z!SpT@NӹPT\mmst=p iEJE+E%&SS~u]Rtvŋ)PR{Q>OBŋoë՞PFQe|||޽{D,m, ue]zsPJݑ84!\]p @ : +ccc8peXl+/]-V~@< ?Rj ?g]_Y|@u;D V~#A @ -ATUa( MWРl4(M!!`Fո[n'ۢIQ cL,iھ},6za㌙SRz#*9w@))eWX/)0 jFj#UImz_~W^ykBT `ڶm J)S,sؘwݔHUUZ bL$RB\N__߶yXߪ+ġqEQB!YT㺌Rtuu}8J1@XKK? 34pCAI`imo]{㠹#oǀLBƅiQBp]!/5M7p⢋.O4Xa1ƫ*a5Kb //?ݻww:2'g%uuu-S.!Q.GNU]K)esν9/w]sG>dǷmiiWE"AblݺH]#NT*E٪uoz.1njJXRdSTb2mCpǻ?q+Ŗgx'A,ǭ7\N8zi!t-۲,SaLuL8UՎd2M]x<[oU{/֯_ui XDz.\xO.[fΝ{GU\ő#G(2Lmd2}qQTZDUBT:kĹ"8RJO5|Ի zb Qē1\ @ 50pil` p#JA!^Ub+R\Y1y6 J)YZUAPsYJ>}JZJ)Es.oH$˗o#Gf*b388OQL=CQǟǗxXp!bX?tP3R* è&jGr(JJJy%jz2_ Uӧ!>q{Qw9Xz2ܶ CS* ES#S_H-# \bR=_5E/WՑw8th6jrZe94Mϙ|H4\FO$m# I]ץad޼y'lBRASS3+d*:(Bp=O"_hU*]FP @^emNft $Bű}2;^ۏB t]G{{ryXQ9sgcٲ TU?QHR.bQimN&y1Ƥ\.gϮG`]K[UTVs]0pTUb1mrhѢ{ժ?rPT꺰@@,+8t]wSj5/w'=e#H"%`;:;qU0m ؆e85J8B)C0A /(BR$B6=u߯qttt۷o歪8[u jJH@ C"an<^m F#l Boo/_v}^ycсR4 ?O:tB ˲Z`k Rl>1 'ێpX"e-W( D.plPlZ. ښ[jiFJq@pV#BÇ0 Ԧl;wR@WUbqp׮]Rϟs``Kkk+͛8TUE{{;^0zQVRVZ]QQפ-3|lJoT!ՕP5^ U/`pp !7P07.p  pׁͨ !'!%NxQM鑑wz='NNhFϑP0FLxnѶֶnUїJE4I8.{b===wXs(Vwܹs,+̮^?[ʕl{j0B t-R~>y'.-XcݺgC,Q FF_=BMcWriBa,ZhΝ;smfT8oߎt: M0<<J뿾y 7 ۶L&J_F\@{{P(266h4JCUsaR)L&8(I|'3(`(8̛LZSZsQTpTs f5(`Z*l˂[Cוզʥ#iTUJ)Ϧ!(%`FJa 9{JH):D"t$Jzyc875o  $8ȧ?;_ڽg /P(RJRd2^h v6%^pܓ?Bzzz6==z=>L(۫2i֭Ǐ4B0@)\n(Թh, FE&H,;p Q49)K_~X1 j(,[,2myLYiٲm_n-FBZZm˲{֬Ӵl)o{4RTҲP(Da |ĶǜsW]el?iT*]׃r[z{{/p]wm18s[KK]nGGGP(@˲\/qVk?~Ou,mnmn?mW3 ԫBxJ):#()&1)\ `ph`~bM0cg.µU(^ C4Kdžn":k =dWQuhFnJUU9?T(UU « :pB`P(K$8q+aR~{o|K.X,]122.J_Xm}  8R/h4ڶEH2(<7Zd[{Nau:M8ժqSUU=H,BD]pZUU9}Bh4:OJI8RJ𖖖yK,JR |󩧞5 !PJ֊+>l6KT7o|YY??TU}QCF0!Ca UG2֔ `L4o q=yXHdc3p쪫p0NLjt,ӂiwmot=tيo?rH$1L퀻w?|gXiAQyV,HƘ"Blٲ_WՖd2錎~~׮]kjjZbYV4ZvYJ)hիQq8Ν㥗^бc>68P xj Sz%+dbpgX$%PEF(T^Y_$,_][^yvӏ̨V˖[ow w?~` Fe&О׽V]|յ7+h"1tXn|]6{'/R뮻Y/d2qM۷'K.︮+c!DRRJq|>ڰm gsvmݴ}j-Fon=QN^W(BJP: ^&  PBH ~`HJ(PUW|xʅ?ѿݳjZ-CPLQB\׵|޼yK)i%qjbH~T:z!SX, ՗]uˇ??I6z pvm}C6mxlzl=BQEQK)t`w}45{/^+):ڶcwuϹ % RZ8Dr0)0raӬZ(T%TpyS9wB7--Q=w.&[{`,nVK-/=}?W;eG61ub8[X㼥CDD G"nW~WX"& Ie yV5;\No $(˶l2&Ǐ ڳc+t6\8ʃ|~!v]: V_KqB)%D)J˜ B]g˗,2m`"%%R@(z0"kH^% ޿]eY*~^*-[c#Z8wn=QZF_#M֛o}=wW>ճKIңK?m[^y\.1coG5 |~]0O_ш6HLCL)Cm+M A;m u\oZ= )! !K)%Aʋ}B>C)~,FHM.n1I$ !\TUYs.I5u5+ZBA(%Q-]dMcR˖H)qږp$(#_|CRtlI%Zc!A]@؎4Aۘ;3J*a[o߯u޹lO?3鑁_xa۶Lql!N[e9c39؊Ǔ=stǝ~M麢0Ri#E2) HMKǭ52$%(x$$_.I\ NdHP%y~W !BRS`??EQrݷg疱cSyBP( ۅ''7Im'[.sEKVg@SKk\fx_{Φ9cL|4MpTM±8V{.NS N+9}, 0J>BO%5`vrX:ޤ/O R*@کdF>qB.+RPbW__cBe\63V,!!$ -X,ww]?Wܶ-#@`(ǛU;z{-'S-QHyҡMꛊ@'6@)N8 Z/$ u൘W]iԺiτԉdBBr!t R-::R.8|`ϯضmQƘcYf~<3/QUUS5]_tEkw(Fbჯu*Rqfdvooli똳tŪ+t-PRA)H}Sza eJhmz ؿRSħ™v;!u5^@1 O6A6^%@D-4kɗ^]RڦixT2Jrܳs`?eCC}9>K+ ވT0.p]~_y>w-׭{l_0-ٔj[ H4q׽77Z r2j h^!!;{Ѡ(c:f'!j-ChӄskIksj l2r@!\24ؿǖMBJnfuӆ<68p}QX2jI6/_{ͭ+VR-sãǏzۯJm'_0hh,-BC5b'Mm.x_EW Tr0X,nBH@ܫr>VuMBrH)ܳcm_|^k9ܵ98:hfI5T%Vv].{zΞ;o}`ߞW^۹}̓3Z{{GO$MR(iV,\r 7~=RTσv-!mZK^4l^ #B(2cGgABzp.mZ뺮ms<@_ߡ}=Bp.+l=\H0 G"x(x{?tpkێ>}GyJ3`- 5U m&BeY1weW]{#Xb*RB6w|$Ξ];6ؾyjԠ QضR8c̸ot=Ƣxa cjX4D*mjla/#<&36cS a4MgLQX"%(Bpè+rɲ/z̀Ɍ 4M[) j\Lx8&36c`0u=(Je!aTJsȌ̀Ɍ`H״iU鉜2ι9wOb) iC`0u èTf<;w  Y%tEXtdate:create2020-05-17T22:00:42+00:00ڮK%tEXtdate:modify2020-05-17T22:00:42+00:00IENDB`CPU-X-5.0.3/data/logos/Cyrix.png000066400000000000000000000175461454622605200162360ustar00rootroot00000000000000PNG  IHDRe1*igAMA a cHRMz&u0`:pQ<PLTEĄêkM3r"f_\ Y9vV%iPST,mƮ؞м]c`Oc{)k1o`_iκov̷JGDz;w VZQՓʴ~D}/p=y6wsǰޢѾaX_%RtRNS@fbKGDLotIME1(1FoIDATx]Z[KhB,gp&CI8}?jRlp_LFUTYZOz767QgYeJ"ѵl{gl[vlol[L|J@ WG`&"ADx}E~G@ 8&b6޾#% +{mK'x7Vb E=qIͧ'yU( @h.,hRC><9Z=-!|bVP*FJo>gy.7 tQ<| NpHErIËjarp "&"_1HJ*KsDB|޴J,D'K7H*\tvJ_K-!2\--g( J gy8k~ J9',6 le.Q&+S{؈XXruk&H`k˺k r'0 gEDwKH4u!3p#zBa! 2ȋZ@!$Y*?À"8{ 1%x2<[߲p&xwv4_gUOEXQ5&k+$8qـ@]92%ˣ0/Q,D Ǐ,60GzgL7XHXJ[_{vyԀ~Rawn~äG\.b+63R+v#b=Y؇?_.%~A˃DV)}@Z-[c/p—u#K!b8PxeaG/4NύriDw/wAx ℄ߏwADWO)Qo'vh_lUβA%0Ozw9to/ZJ>Qa!0}X'm"Pe'.?.VHyQDr[Yzr-_tϠsy\xD*ڮ쉬D?V1hǻ"lm|ĉ~5#.NTΞ:7Sb򸄌'1 y߾^t9(?%Rz)gG ٵF^|/NWWd2ٛL&{{瓫Lkkw2:?L&j|29?ۛL'{{WWd7maYb4.ţ?_ U. d!& 3W$w}da&fb2J1v7; aYeK?[v:݌nFh4݌nnFf0Fyf4 Fft37h4nfZ_6LQthH$B0 m6(8`(pA﷭,o4ih" #| &NA-דbF)ܳXZ%*L=jͬQmKy;ads ?ڀ"C`X}/$L`0:1 O(ET4}.˘w/KT+BL"֕=AIbC;/x4H/l?0)Vg_ʿ_.\K4""u7d$M߲/9]&[#d7ۖrʽD&=ǃx? 7v\/t`Ej2.F7K=t܉X]>P`l0s-$ a\! ug\:~f-WgQ孲"NnJH,!R,lrٲ5W*6XC4"+/@K$am+b1s;FN% *k?Eΰ?\2,yu⍅Y*A O"Tok6; > (v!x`O 1BY`%;rF%M~Ș$`Lnn^p9>xUo ҝd'Dnhb80(_8[23LcX.:1ű^WU] ܰ1}(ctE`7ufc[KilX!#tY (r!LDz8춐?ږ=#8};M |c"S]71,ME}i%}K_!U']=UA aOn[Ԗ$[DHs]B&%%)F?V")'IKanzecCd*"d'VXiX,i-1ĕN@ɪJGe3R! -$V9q<^1UqRSb&R?*1cwxئŨ~a.f۰ X P5CK[A2Wҍކ+XFPG"A e$g,|(0dQ{*iˣD=E6˹/,7s8Fz]+#u1Y(;;.c꽟* C6Ԟ{ӭ`"m81\,yfI4"mt&GӐ?߇LrO^$?1}KU*f"{s`D܍{$è b.Q!bfJT 2%N:U)9ZTK@DS0Pz%?(G{rhCk*)U B2 b)*$qN!_0 ^m78HTq|gC/Ji_(,*b.%";s&Kşho#~[jV> &ώ&Hd!em+z Ą]@T)aI%BU(ls`N.6ns4qmg49,+`֨An07 D4U;yL{ H(aΗUFDE1)JJ>%Jo.LɕZc~^uAI*Q1})ISk숀uvv-x:4+B߁<tI<ܷR A"U"cQ&@Q46\2(fHm ~yP4)j`b-3߇![NrQ|.쎪QWQ(2++uqEDQdoLbe0oV .1.ITUh:.gr1jV"= [xB|2Wj5|~?>jɐm|t/IJE@E'/촖OU,M`Ņ49Dʦ6ExI̧n Yi ̬KamCbSLGabbHD*OD7⮨7(Mci<`NLq6O@Ҡz5=2EuE&>- ڛg5髨z%IUWլn % ~ԥBgU#/\ŲebE{ccKR5aI8BKs+ Te8oH߅y TKK.˼.Y[( xlI;j^g%S),Cܑ4yWJN [ܜK9̆뜩)~xc.LJ/7)١ss\٪Z^Pb>!e~\c`F塈'7 iɽ.E蜭 \`s?w-ULAu*ncNB+>B^j9?fIx1̅$4_ 檜Rq!9-';ٲIKgsDr4Y kG!-F.\͒ʉSQMb*ffHpvbHy˕\K)Cb|vI;l}΍HDJ9 EnT% /Ca>vc)'8^rufD\QH!p(:Qgٌz`(Zd~;e[їT`]{3%sCA7 jx\Qlt"~q~+)֢DeCVN(RfL˜ܺO$EN&@ELOéf=Z%9b t}'顓FeS˜Jp3o^JՐxS ްfvJ~@'32I?nT6jP+{b!Ѽ ؉~莤R?Cc^9˲hsjq@"uK5)q`ѵ;ctL@,"D9|\BBԘOGG儕G^\$, ?r /Mc8by>`$ɿ%J1X "Iov<&rʠf}W}!Rh`eO7>'8F_Ti$$xz Q =ř#(s.),\ l'e(S8[عEEyO.)D2PRDY86#rh :NvS45IC \u@/d ]8`wYE>fcef-?&? <>?vC<1_EK_!hb&s`>F5ٟaS?6ҎlȱÜk<a^ins<,$<,+w):sӂr/+EgME'?$C ?(oa/`)81dΆ`6a"vmIvaWDL@D{gŕy1,lO.qWq,lXX|^efs>H8#Ŝd>GQkom2笘א}|lܱ=S32<`'@BQEςx<OƓX٤qNuvu:Nlu:N}5nl:Nt:Vzvcou:ͦ=y}N_ǻGV{8l5w>\pAډj>Oz>\Z}^Nkt:]jZ>NZ6k^[w߯keʳ^j5}~m:M]zm7:##C}3#͡DFI+a%6 ͕]$_*/&ɼdI`_G=!"Y i $0qҢkT!ʕ02\JJ~P!{+!-6ڈH9jd%Eׅ=nPJHÂi%E8Oވj3j5J_E?`%E:43>:&IWRZt5R}ę!鬭z *yҢu1̈{\Y`{JJ .}l$d?ͫ[Q+||dǕ\gwjDe֖ub?1;:ٺ]}ZZj׎%tEXtdate:create2020-05-17T22:00:42+00:00ڮK%tEXtdate:modify2020-05-17T22:00:42+00:00IENDB`CPU-X-5.0.3/data/logos/Intel.png000066400000000000000000000234451454622605200162060ustar00rootroot00000000000000PNG  IHDR [sBIT|d IDATxy\UsnUwY}S iǗaDNȔ;n I QN% EPDe@vHHz<!NwRϗOιU1c1cĝc)K-"V34V=^LcV COy@CD9A$=c10Rk$UpRY9s)X0,`9ħW*Jr tI٠1$$NF.1$ c1}bc01IbZ0'6 17^8[cΈ$.)c1}bcLX0'01 c1}b !lbLhRdc̎$ccLX0'01 c1}R|PQHR'Mc1e0rcT ROF1=bPv-:`YY1& x3Aq1Ƙ>a1I i^`cP2Sn,`c x( c1gcLX0ƘdicĦc)/0ʚ1eA *4,vҭ~ef%HГVdD%p(rk1Q' $!!A(m *uol +ޮ_y)y7Zbe PFa!3y ],{L .+y˟}"n:eY:G[Dg@ByvvNz"WHqp__YUrFou۪0oH 4+P*.Ta8pȑ8+KȅwĤkw$䊓ЎyHh̹۪tCe?`DOFsanmw}M.эoA#,ŪSA.%pBO^ dq\ aU\vXw.`0AvԫkDx \J}f!?gCۋC>p$K*{,ícY>z o!G_1eK}j4& wvC8 k]̇qgʔJ,7Lx55C 2 a3,h*,9W"rPEY4-zQM詨~\t~qgFv%0(#exER{PwkCtqg@Cs@nA\r'QK*8EfTŧ 8dY/Tg(Rpݟŝͻ1z~긳:Ad2/*dzpiZvax-]be4<ʑyEjQ>BJ>ʹ/\:Ws b_%'XivlO6x4 gCeFrnwvM"غ/y*Dd [ C8/0v6 Uqg)t VjKEW<W4]"Á)/%wiF՜PىZ}׳Oi3*I /Ic롸wĝh0@]{*"ONFH܊ a7 T8("ƀNǨϼ#:uBUˑݔH"#|麈XU,`\0uZZadDs\(44Wh?,z# ck?fݧᲀѻmDwFbU? f #?l\lh?!wF* Yuaqg5޳/"9dgB 2*;N1p ٛ҂!m!2k>TK׃gp"wǝAI) S.''rGH! !9b \:6 0LB9&ĝqyk5< C`9$rŋfN & ӭ?G{~Dp?ΦCj=ɖ?=P:[գҟow$ r ]էUD|[mVdhBEMԠ fg&oVPG/~NhޠׂL;+=y:͈nFe3d)M j="uoE&Sg?ŗ]Fhިqm$yLw#P#Q8?*"$iAoH%|}KwƗ ՞ Ӡ9 BB7a\3Lu::)\|z$ǡ:La1+dE,`|_ ܋8]~=GU\=Hp('`xBfnգ~:0D]a`B$P-]GY)I ZVXԍJiPqFNMD8S%ri տr'#O$c? GQ+=f@$ut443r1g"2T@|Yu8;"](^~@Lk7(rncͦ g{#-O| 9#J"E0T+t rʺeܠ}'.X kˁSzjn1Lt"'.!DnCs?uCE$ ͟aLn<g#ҧ$k``Q!%ϲ`ƃ,u˴./իn -j6?-Gh@TYJ- ]ixvfOQTPDѶ2tZ]ze((Bz1i:<7f={dE)(S><4Sb }rsF#^ЗazTg֎j3k 1eM(/VA)"&ᥙkqD˾SENe= <a|di XL^{AL 1VoYy (n~)IQFθ3'])8Q"9 dž)!/j()~gSxHsdkr 0<h&1Se G#U7Mhb'?c@70,Tdڿu;CJIDŌaiP@"؎S̺hbY 1TxGAM&t0zeMHHj @t ]EU;᡽1=,`*)ɣꫩBz<:PӸ<bX0 hVD HPW&%mǭ=44gį(9h5@}4ii~H[)Eq׍a@fԢ(-~gUIh5ԴhUMar]ҌZTEZ0s栘Ly4.Z:&z7 4(17S(#J/!-&wȌPӉBCsr )Eu2rXvF#@D$Ҥ ܦQ᧵mO5BO.-hdI3s[暸#** B$Ȼ-?zOAÞ>,s撖.h44WQ9"7 .T]DGg{䲻kaX@UTÞzZ":ΠqQtqʊ1p]eBNk\\èsxѠAK̹X8Y0 "J/ !Ѥףyhmޏ\:"vMYw9ȵ o "Qi@ ̹4Y+b`I'+j={9$ͦY/ Rr>9>sZ ,y\\E- eD& FIncџgPg:xc 2覈ӜJ辰%Iiyέ bM 0o>^Bn= /[AT':`hk$cz &rU840 -~ s[OfM-TH#ruW^3,B4vЪ1:S{>ZѰze(E <L0U)]}Q?Ȝ%cx^FZR~t'E"]LvZf>M{- DViOA -]D^,d*W!:(!pjH&wkɼ%?↙xzb !;@W*9-SLyO8cr I'>؄ )n:՝>'+_Wji[ "[+F9Qf.Ykjs/2f#uѸw4XTe kx#w_ǘcP#~)7f$RuJ?AR[&{pL;]?3QD_d]kjy4.JG+H9C@'ԄͅA|kew^YTҵORl iM4.ϱ'ƴ_Rp$!z.^U ZC|@ >ADQfe?V}Y\q$ȂELkA$mCZhsZ@t55g (( =Jy|PbJ4Eiچ~mEG_(.dOJF.B讹/?&|'B "=?*Y *D//f CcmиJᇈ^sGq-\Ekap߯qN"5Msij!|T36Hz-rQa䋠G,@t1?4M/mhMDsIϐ*2ZMŞ1*S)n(f&Cd*s*AurX!tݻ#@Fw)ʑ8s[JNquOXCF>| {hqtIQ \FY$٬DwK)  ږO&YO2>ŗW%QF{>RG pע.O *_Ct ^nf^k_Wgh)6ai6뀵qg%r f忉 CgRUTSg3+HFTOAu6ShVn9g_KAw}G;go9Iè1g@AIGTXo 8ƃ[?Y4fqھR<8u)fup7fza6Zd4k=AǕ5=GpGt?ڎ~67μqyΞ`^hXfthIDATtR6]};~ &TC AЎPmLc7" n:Y 9xq;/XQd*0ʣn+u-ى Ikq&M_絮[ R_iKqg)Ғ‘FP +{e/zCVDųKԈ(aۀac;lFc"duS@X<;އP棺(GuT\&fn{wBԿY_kkt.o"ߤ:f>kTFt! Vgَ2JzgPs@y`Hgg ˿.F3EJ@.a+g&Ij?݁ Hf}΢KǿiqF?dXtqVtShoшeQd0__DZlփ>p.m.+.9\lk}h`D!_0v2*E3B} dOk '%(#ڂj{`b'E ܉r>U9XNԡ5,3l4 D=bǻQ=k2Uz(bu,DP5T`H}i̟?DMA_A[l[_ Z]Ƚ M~^YXxZpBe˙w<&< ȁɼ%#z0RKʔg ,ʎӁi0Rŝ4MJos`f=޵kE?'PV~uu0L+ z+dӈ*)'Leq`ht1i= :e6gI=V=Cө6sү"Zz}|eVnFBu/۾lkpG,k0Ez5år?H[$iv*pjς>G?!v$UNB()n`X "M֐] /miw<0/ E޳uo]) )-sϰuI絀螯qpTgy8.2s'}8FiD~ȗX08/~-8CunA9rɵVt4NDX%ҸSܾ{1:AjPH5H%@p(۽ [+ɯLZ_+|c2{Sp2 L@!Ĵ4B'jĽחpGGHϔ*DQfg9dll+9? "Ρpn ^ wןުBjTSCsر56Ւj)J-qZpAeJMzI)PQb2 ,Fs N7ɨ:2a8B*Y6RXWDAADz\=Ӳ2[OcH>(AAD:S`Hַ'_Z AA&8d}Xp>4AAD%d}0,  b9QIf܏AAA#y`k?8zCFAA,1L"W ppJ C" & V+67A#  6A4zB!`۟1AA\}QםԿqp~e3CUpp‡  9CyKfZ.P-ˣTGAAQ0>e;A.o'L\>|AA߾az[Qםxc| )dY(pTj-Wf#JFOW= ' 2(Q(U>=[oHH/"}D|S61Gdʼn  .#*!pbA`!h9!Y4:׾&rv8AGiV@PTW;8 (8%%ɬ&}[lU.b%t~]_@wfߡr`?@נv|sCs?~7*s4Tװ{PP؋POP-h>I{W1m }ʜ PSx9ŘԠ:IF!9ɶ~Q{Lhﱉ"emcZJ~7iſ{Zh^w A͛zݞ|"NxPGZGX rLr6cv61cr~~*{նXкPcu h\) BP@{T 8nhtNP؋6c~P(Ue;/Ǭ{NؼImb(v͢7$6.KO ֘_9J B `ޣOLl>n޲s^TsWD`<éÎ? ӂ R9!;1Y%ėe27&rVwoJƙ'EG 0ΞRqƢ M֗У 6fbty4DZω$V}Ǭ}\MpA?&=deM} ዅ[$"'v[TscDx&-}=L݂KjYK.niIƣȪLei61qJqt"Lb U_|+W˦ jnʯƇ SucH"acU^Il|1*s1InZAq61<Ϳcѽ-x'5 ID<ճLM󻟢 c43n~T§ ϡ?[ūWrp"jX"qlo BB{'އ^ 96<|"0 K RCnatPJ[%0Q~6fM e{K$4 y4NZ矸(R#~>({iy,#x' @(Z{$ $)GĦʇUmUEQ"ʹtSE6Sйx<ō}̫4s6EGZh=-粓E씴y+6NS(POgPl7&gM 3<4Nl9~73iqa;J:yA@t* 5N6*;r^@Mr?b=Aqx\}DY 2d=ƣPa7PPM_fO},}tҹ A];Y8hu8@048-_2QIf %];,}2s6 uT2|4݃0M #&́RNJmwBs2J!zb БiwTk p7FL!I9qpYAؘ0b(Cv(U fW@X3P|Q3+$2&;uGlzqi+8JM0v߀_Jm[BNPBncP56sdTI=;5s Ϡ0~#x5D$IdhdiyjvqBn'B Kk1i FO_Lqv己&{ FM > ?ֵcTU*ho:<3wFڜhYfy1v13:bCWv37`wdDe΢rCr^jM@on&l J֟ȌB9y1_x2 Fʖ?L_ט9ݲ{=!cpR꾼G@y9-_ܖ-a;BtV)d7>aS܇0#0,> 2;[_jY'zECGe?hk qPp݌^c!8bEYw7mÑ yQi|/ZU% .؏R'>>\s B@N0zz-\bn Z'W[bQ#|̼zn!P2asubk3dW+&P`Jd7YB,`Eoҡ#3`_q[iVPomUVcѮX΄lBVq𵫤 F'ȭZpdJvb5wP{ܴE~;8alDj_:{pxo0;$6j$&?* 'YTϮ3?c cڝ{Vs6PV(`\]BEr!oaK̰ؖ4;^CFO_\%F%\2&JrhO԰vFxx"3 ո_|ƛWՖuVbc1K{Z!Rª2,a"*̓ɧzfI dΊhow }0ZOr^w_ȆbiwG QEy  ߒ6WCb.m\ʻʫUQ V@' :f!L ^r=9a.Z{Lc |st> zo/$.RBv[v#𩿂7j_45j_1Kx1-8Z&Ls29ŸЯpMZC^̈́x3&gufzFDEF*5u|j zsKk]L ʍ{z CbYWxdz&)bs6l'#THBr$[P\/zV;+VIwJ UOB?j~ T ) *Սm1S蠩X8yAO r$o%NW%_/CbKu[ 5aĒjۢ]` gkۢEgz|+--Kl*Fµ +*({"Uq ցxMc9Sj>G?4B_f@s4v HXH 5/B'hG00WRy1ް1i',|꯼7~$Q'j#îj, 2 <e;>I[L*}xe~j}jmdH |f%vqH>-C)_Iy+G'?_=p :{aO|g=t/K:iU$ql4\r]sKC[DAX9YwK)4ÓmY-gX_Lx<<޴v\^G7oh^ .:D3.HhIgRk=]RZ꼖=KI^oZ1)7F l3_j|wя vP{2iOټڑvt+۱QM<D(X}nmRȃ곲 seB:cl&mnd}Ua'7 iVdc;b@h7;$WdKb̴{dIL;[Oc(2}^5-kvhel&4ei' BnjvjiiTz4aӐ4kl;PFRRSP|)[ϖ4Uo@Ch!6 97{y蜨hn-n|{O[t [ȼJ8+ͽiT}ysפ)*ɂ!~\ż Z?~'iasujcKԿ"М :PMI 87֚;^}UL^z[]K9Aqd\՝c-KmC7Λ{fT hTO#yddF)Zc#j 7"VȰk§΃@鯩i$c@vy':E5HM-W. 0MUn~tq6)fɽu] 'ݳ=drlCZ]B$+WO9H,Ĝ^w.p %xG!# ^hdCrzkܿ%a\}Q^M[g9I"!uȖkc*OkO2'f06l"e96 Tf<_?cUc$vF7maXOUlr{4B~˰ Zmw%tX5s6SFvÒ?mEW5zTjϹEd- yڴ2V!HJĎ(wuL{Ij YwZ^{qW)x84RJ6&vd-ihKVw^ 4TQw]w(49Or)Ae/HZK&Kf7vFJ- ح'6JÒ#R[9W,#&>jq 2OXBIEM>˰ Ή.6ŻP "@xIZd>a<w߀>DڒWj _DyTfI'LedPAiϭ.ul+l٤$Zv]G7o%QՓzf ` 1727?/x؀JS_8kA^ ټ>~ ҋ0fN}56 K[\аؼ $>gQJY!t]#nZXtٵ]k6M Kcd5{7`7*MI x`ӡ6Ƭ'A:@/-Ht71z`țJ(}^&/w/G KB_X K[:OtRTf 2HBN!FT 'ufPd.\K^񽧭N:@w{il'^+n굣ty=:{@֗D}ִ&L*ΐXԈ"zlsv{lݢ'rVxM$c0I{j$ml\A/nfw?G1$G̮(ۨ?lLTƇ$**̷6}oHzhI| gp9yS0u]pL7fE?! ]}5S˺̮5O(Nݬ1z|GeUɃ 6dLjv]c#qx1==Wk*VrKa4Nev)U0wӯ~.5E& ?Aū94R]z=?ivT!V3e;ͮ1r_(J?*CLzg$'bRace\4wH=pT5TZ>#s0$??*鿁qac kCgM{*T]bZMFq9Q)I>ZczIe2%P( ScZb(lGcr6:{xZJHгaє'=zn^V'N"HUn(!Mż9񾮣7uUBUhJlyl CIKc3zGeֵ^xFO aYZGCøD}kz^]$#"P(gn6}^--!aY[1 xFwTl5'_g:]#2p 7nKwar5OquTP92&ǣ&J[~o0HGƛ&!SJک݂mfMZ+DUT˜x鐟`B_`8O89sȷP^kezO\RO6bk#v%r/r*A{X0{7dYfsc S)_DX#MYūf'mӬ.BR;80&gZQ+2ktN{p CCqCS~yȩ Wu7[QhD>j 0}2F4-2j#o]eؠT.W!Lon6pt1S#(.pCE\2e:nH,K1csӅ\޾0cRhG.yK ՀLU.yx J-=櫫0,n Fe~g7}h)ֈ 4ɔSe^]xV=S_IZ>WsNVzj16O9CY cȪ`(hd:bFfZI7Li9%4?bim<(>+Ld/7w&Y^׸{wId|ə{̮G0G* $G|ץsFۚO|1c%ȼJ 4 y$MVyͪZ5O0hBW|Ac?62eK sIZM>}'f4:Huc(Gz$k$;f,zc.W}0Gjz)UUKXer2td*L/!b$,_& $LhIi:[U΍弽Ҷ 1>aXD4_2a|lF 7Og9nڙXI(BURr3h7LNs?M⦙"B'IihV(V aA>:2,>uO|U+O|Yu2g)49͏Pm^V8;lc:(zkH\X kc d˾0c3|;FnF eM8m60~#=k1s!~W Y2J 6w>Xep-< 9M!8aE_6f”Pr9(:_Hl$0He'?/  qwjp#i,&? $˂  b7pQ[Mp {El:(|YA<DjVuйx@ceAAdpUA*X;ǩԁ  rQ-g囟a zmZO *_AA~ 5κ.^(WhQl',  .2qI_GUBwu4\mv/  ‚YS:pAB/  5 {B}hJ&oėAptv` %;[+P;PmhJq Ƈ7j 0gS, 1}W(UP("O_ACb!$9J`d^%W+9Mq,+o~=Z`"v|YAdO( pRYf⳨ FH^}eAXGܬ}SW8.%;ìljN7 7|4xF/;ŽB)%pZ yZX5@vِ4o7ǘy8@RSlcJY(B$5l {#P56W FĮ~d3Oc*Cv.^$kbQZEA#ul'tnFWdaM]o)Fm*aܴE_;nj:e]0 bwu},r[s)14a`uP2wJ7Z7'_ 7kiӉ#0ܪCVaT"LvA_ôvC@tdYBECrRjY\xQH4hЛ,-eÇ{urU}BGŒRϠrKhb煟 M>(k{q  +g\{@t d-5x ƆAqh̚%JG,/o{DO,_*5ʯ{dݪ'_y`j;$ZgԔ*3#)ໜʂ'^BY%7 s?@WrK| ^kPU%&qq7F1nT Ns6Io~A-[,:ɜ`K*W`7|h?̾']} !88`n̼9~;G+d{ﺤɴ1qgy 6֐ ɫrIZ9CN#f/u?Ap$u hxC3~m9nYuX;i]G蜠3ɕ _|/κsdX|1TyL0ƨDXOБ7j u9{XF=i+M}镫vK c4R} ŭ&Zk&mɔlu7R:O4iTML+f8{@ټ?_,2lT}w HXI m;m! C#a_1|d.\kv=ڷ2Da޳bk{w BIVHo=$2&KdQDgشA'+q6yūf:yrzDCS&x.^5^770P0}׬8z fdM[xnm~4:FnF qfe\̋<FMÿg4];5ݶ3,xz Gvâoc.cV<8{ɂmfM_o8v4mfV~S͌Պ^G7o5, up26^0k$ 캃2M P|O< % ᣉ˔?4_ <.ι7>K-^ %ܙP{ze@~^|spj>u1z^vtͻSøN b%7b#lQ{ƖZGp s?^iL>-[LbJJd7>lbPN#W G56 J72[̋6TFd=drI2l,/Zg7vӦ Spa 3=Ƭ>bgr"i]*|Kw9S$YӦ IUkaJ瓌#{IV]Zcuߢ'LgӮֲV]x+*zh }ʜep*ߴ{L/"!} ƥ`,Qrҹ6;{HY?LSiu Ct~׬4q_ p\tSC~BA=xKg{p#'u] /6'| BFX镫Auw>WP' bj'\5>:}R%g f8ZC؈8y鋩F;w?e#w;<2{+=0b3l7 6Π)IB4tdR7o?ߛ^eO?&UJ跫Eq ˢ{e7,(*(7%[R\[%ATjOLɫ4*&acSE%Z4_kD?Mnt. Wkio*`dfu]Q\F5VY 5*h!!D![ϖXY_꫞|pRZya5f0ck8ͪX'UBIbJ,j$CPxB#=[a 9?pA 4I$fkS( KG]̨Z#DPx~23HǾf {R/g~m`|9op2ci`.t؈칆cׁJcQ٦n/ZZr?յ V`݄Y!WLq4sVCRgkuh6,GTV[й94OvBBRx/|&'u1  ]}נZqGr?)YIKRUBuTх!VBpab]B/3CZN}J (s}W5 m/ ag:jg{YެWοQ; +Wl*V7b?k4:BT͆@ūHJK)~ߙ}1N Jͫ6ՆiL7QX~M)?ok! ҽL5Qui8cb2- WE F*8[1ƣP];:z/CW5kc]nm}]FwH 4J`oxg[ՓحW;nL9vgbOLWxzT5L<'W v/ r \q#c@}!%u }(fܓZ~캺1g@b%Aʪ;C"@TA]xMo})Tcu߸YԈGY(='46RUo-7{Egp5O Wbݤ1$Q)*7v=s \ڊoxt]ߙ\oTr⚤jҹRm}yFGL0yOIF 3'9./E4bUI7cWd.CX;jJ䇟=/\F))d׿x?9lzl |Kf1L$"z/kX4ZsV[`JZs2? `'cEqXλ"`g8y7La\L'}ס7k4c+ I m >!\X ,( ɴy1\U򰤓$d{߄DZ7%MysHAR4mMhd^X\DxByWh)l86zz-k9yl=qw ,mRQAϠǨ0g&<Bs 1.B".z"oP<\ X*o}!ir2o!iZR"=0 ~G?K*-T3g$KzSȅB$r&Dut!PlE%m TDwH BTpdSZnvCf!ƧLL/:/'>0U3[&FəY@6rpge<c3g8 P0LvZ=>l`- 5C[%NoPzk.ɽL#|%PԌ^5b؅@ID#l[w #zof؏70BTY$DHyŏ*Pչxp,Ѱ'}( o)RzRg$1`؀%$iQ6i*Z,$#ZUp$C5zfZCYNUHl*VrcϧqrNIGĤMk9lqRǚ͸M.nʭ/Aw H\k3שw} nޜ#(YQ La!1MmQ>ka++dYb6}o0+#!颇d-(EO**}R*:J5L\lmH!aGן 4PBR2BOm6ݡ c,G7oh9Ɉf49h՞쉌wH^ KRELB;/*|bߔ*5g"bA+lG]}`lP+`ͯ5 ց5#]( @ Rb@jRQ'd#߰69$ߵO|]}J>/BRndFGLrěL*,'Q;[)ړ>=fRq1eG~+n6 g}g Iʮ8&GwNcXʌ%%4/9<^#(e u2%{iIU(U|sb@ g慏]ޯݿ1b]4mɻ-~By,77HmX֋[(7yX|q|>%X R<,9BwBn¸̲Xݼ9íЍJF= "}:z/ NJY4nMpS Whin~T?X^=0 ڷ%mRZt.UmVP\&1围A-r,?|l|f!:\7;({"g%N> |?6\gr67N:Gb.mBBdH*6e ZUJe/(ZZ9CGw>WoXj:V/Hp&DD@51(Cb!:jCՋ3npxjvJmVb* :Up&>pIl|iɮ~XmgN,~la'$%&8>=ߋ(D߄0T8Se|O<. !'H.n%4Gq{|sA%L$>O 6{䷆V&K%5<|[݇YV0U*Ra=si1}IاT9e+(EveM 5iFrфHR !BArG` e5\q41]Ek ]>EJ,v % Y؋6 \V7Տf2yb]cUm cV6HHЕVv7%|~<7CG<x赾Y$Iޤ-:>*H|ɏ] %CMsETn/*ZN}%xO]ˮ6&yOZ ᄃGAD Qʿ=ɕ}yUЅ׫zcQ0,ʷ2(Ju rS"Q̏s!a!mNK֠8gᦷ2UqR6H-넼ZK|hz}!'_a-b*K=*gs3߂wH,k9 =B#0~G˸ȝOkؘ2xOw )~7H/L~6ƣ0zϛF_t]G,䋃~Bwb].oo/AbӂYMb7xi`XXb~Z)y'~ 0gS?*nށv;Ffr&*!=5=wSE!7J_FxpT/*sMd*ǜŏTQf\9Eͽ,i1k|Ts c vȌBb܍Uj!9`;PVkL.ns!_Ǔio:ʛU_oY=Yy_k|=%Ne)IMG?}+K-kǐu rFG`8|`۠fm*AZ/ZOC:§ëuta͹` m} o@@t*xNG˩2~Ѻ_)fܴNaFn737?o8?-qSkOD$IdsZ3Uj!'@6^LϒFu’p-뵘u'- sJv!3w{zDdF)ޢk}0zur#zwf$)?<= 끋f~Dܟ+*st 3zz-oFO06M_8Fnˢܱ>gx7I))ij:_DzhB~ _h[RtRmoҦDxcOxx5bҜcۢ0:rǵC#g9'K!§ͬ]Ole;˨'t8{CӱOKs;BcL/!: `Ɏq(R15[Za3a믗ÛLN<bH'l{O8--Rk  ?YurHrMfi˄kxIy!&GgZ9MEY<ǐYi:gwX矬B|-*qےyn@ V_sbF&Cu,8¸z`V\%5Y^~'H4i~%t#7kB.H^MsgW N%|:yt]r `;eUثZ*_dզ;Fj J79IՈMIg(,/7XZb|1|͒lQ n.c3 :|m9Bnzi&G7p]gh*CCxk7v@'ui({ nVR}ڊ= !1eK;hXr+ ajTԬ3ߚ[H,v77&"4}/[]0PFMoo7lU-QNXE o)Iz^nk8W}*xYTcZuJUvLʯTϖ$KAAs4{YҪ.>CYfFl@JN5(Id%Zk(*Q5C;LNˣFB.,1L>n+r!79Uխɸ 2|B1QrQ%9mlmT"%v^6UK6LvaR!n&N֙]->8{Fd0h5n~jjG 4y|[_6 jܴE~+۰ygAí>a;l;ɿM"D,. zOH֍Ϣ]1I#Y5Wah(%1BQ5*Ao2}4xyϼG Y88\xFӦ[u^L $DP(ld|BGr++ڷJI 2c|:ӟ{Nnl.Ys7e7E%2w4ƉgPkuѲ('B?{]C3O6/_Hmw X`]&};u:{հZr;=߃{`(sNj FWN:=:rVѫP(!6wsI!1~E&J5ft^,S=o Eο \G Q9 fP I[}aDj҈ [i鯩55:'/XQ#gzJ!(nd֟ʭ/ p ` g)XuLb-_( %̺80n"y㮋W-)4gan-2"S˺3囟$BZstnF`|=f6&_Uv`Kڸe,CvK>8y3~]ܖ-:R>Y<wN.˛W! 20f,d=rdD\ؾgg(X(,4_P'h?<|91NuVI 1' )NpS_ HznB5D;pp2IԏDŽ]^VV/8bUYYacM>Lqlg9)Ƅs?@ڣZ !U ם2=Cvâ_q3H"m-'%:V$'%8-=Ue?= ? &7Y[ÔJ}-h qoSY0peO%t] Ey冣7M \m qzr*r˭VT qpDlhM멌(gwkݼ^fM?EuBfݐ\Y%p_duAڼ>v^ chd^%dT5VUjTA 0*+VAFH*j)Qҹx@i_PP"3 o$"}WY͂T5 UŭE;xmhs!b% D&AFH2gY=G!r5-_ykX)%U~$G`XHUk 6:Y]hT'fè)UXp$jTEOyy,$RʑLZ ghu9AA[[x{HlieGAAyV M$q.7md%ȼ>^JN  ixCD7Z3V/   PM ƇE/W/Яy%AA3f2 G>M+x,/^X'  bNpbM 0r':wi m"Q  gNyڒЀZ+iϠ؋UBAAn*Iղou&   7I[lf(w]yoL]ƣXTAAx sv>!i3uH[%AAςmU f lF}KAA#qf eV-X˰`۟gV]'L‡  Уsee, HFAAf]<,a">XAA:|BGZ+| AAUH;xDAA;$ƮUށ AAmbFr@AA |~0PAAq MlFr/!*  "j=0   "1 ̼9]} aPk!  AsH:ƌ  =Ϳj >AAD>(*u]3(   "_2gAO$|ys  >t^Ip 9~8  }-[̷[=q`AA[dC23|sh$"  rA'@Lv9XbhQ (.ݼqAAAAAAAAAAȾΏ`[Z%tEXtdate:create2020-05-17T22:00:42+00:00ڮK%tEXtdate:modify2020-05-17T22:00:42+00:00IENDB`CPU-X-5.0.3/data/logos/NexGen.png000066400000000000000000000017331454622605200163130ustar00rootroot00000000000000PNG  IHDRU?K@gAMA a cHRMz&u0`:pQ<bKGD̿ pHYs+tIME*TZIDATHՖ[HAR7]P20 e+"$"b3B2"H*\((.B JBDڅ ,|D#62=iW/=3s~3s qESK+zZ|{:G1%.\j-ʐzA<% H3[ֿ2K:EnbLF%ţ~gE]|H%D"}+%H6~Q1#XN>E" PL|̈}bA=ר|H# 2X fn E?aqע)&ŽBކr E.Ɍϸy,zQPey&^,rZdŐbfJCQmDE+`X=8Kޖ 6&(/ܑ{IJXQ렁! ~ E:Wl(>cR+Ǐ_Fz ']x _mELQCa<j$BJ\ps>|D7 $n'epb˝*V GK_C4QAM@FδFM~,N, WCPa/mwɔTT DPa^+ؠP.V糢2"nexhU$G`ETbaѡaaQ{mv`QJLKWSAK%tEXtdate:create2020-05-17T22:00:42+00:00ڮK%tEXtdate:modify2020-05-17T22:00:42+00:00IENDB`CPU-X-5.0.3/data/logos/Rise.png000066400000000000000000000013231454622605200160240ustar00rootroot00000000000000PNG  IHDRU%gAMA a cHRMz&u0`:pQ<$PLTE̙̙ff333f3̙̙f3vVtRNS@fbKGD tIME+Sj<IDAT8˥n0 CiJ1@;CAUvgBܪ쾇םh)t?ۉҷ%g[a,ƚB6A@pe.vbUe: 8{u]f[Ŗ'ʸxhjq,=eܰg |VDzЊv$75őֱs I&hC%%tEXtdate:create2020-05-17T22:00:42+00:00ڮK%tEXtdate:modify2020-05-17T22:00:42+00:00IENDB`CPU-X-5.0.3/data/logos/SiS.png000066400000000000000000000410101454622605200156150ustar00rootroot00000000000000PNG  IHDR1>gAMA a cHRMz&u0`:pQ<PLTEԾ˰yhǫۻϪÙϷʹѹe]K)gĥo\J~7q&eXMF{lVtXa@w#cƩVO=u R6pY}G|4nN.jWɮ`#̥$TtRNS@fbKGDCg btIME28@,IDATx} C:.3eme (-V[uen$BiKzl4[ξ=`!mj|Tݯ~k;ЃaJd/27biqKV⯣L*ӄm9pd~ֱdn_P"jeسBdkn)^_UV#9mY;1c<4Vq,b`ZUۓ-۫r=kE? xڱ/(.sel5keIpoa]ɀ,2L[ h > 7+O$ϩTT-e5znBN岞rnYK_&rʙ 'ܗ5ٿٸ`dmK֎"/33@ܴ-Ez9**鶕߿YYmCmK{dwDҶBaǭꥦ<׈]ROS3a2Ni\jF lp+ORzs[̱fG. #h[a??\O1'_cr4UEI;c >T79{?b\%'⚁#+z7lܒqS{f[i ||fUO>tFzŪN;f9g\MUc/Ðt_tyv[B7J9i&}`~î 3@ywD_* TZ6b?Ա;/Nw?;u_s89m.0ZDM*D&O$eY#Ʋ?\澘S1"jРIBNd5XR(-vE䫆ԔZc&@O>H;FЈܑcEΰt.YkeGj0JEGr#C{5Lt<,Sp'$`){P;%j '5fBC#rG=*GkFTBaAr/g;&ؙ^Y?"tx)l<:dA!绫Leqa($AtN,ug~XboٿHYM@`x8s}L2PШJu JQ;vTdEQv;eqpBodG)K0!il٩񰈕jzZU>v{nVྗx.؝{/,J۾4cǥϊ{].O >NǤӂ[6kl̩_J4/ d&=8+U ?|;4oZN{fb~cڝ!= Lj϶]flf?_eq⬳9M޷8J[6UiX#-56ˤ#C230E$V_'ľӁq^b[1MJ^PaRL ŽmmI4ʇiK%l4?{{=}:S.>~g=~u5HF–ua|y@SRIm`2aQN3 k*oI+ˎ ƋGϷ ب$$Wi w,k%8Qyۺ 2z MΙtOs@$e2v$9%El%޵*5~ݲZ9.yry&bXfʑ 9-ܨL0TىEq*muژ/θ 5f뮺(,QnYgG('I.2g| 1ۈ Β#U5$̝ߖGצOJًeN+gX"gwE:g.;i ίPǞY6;'8C( q.2 5J䌂s> qi}vlx}wOm)M58._  L>ks ;[.Ċ4u eeW,Cq9D>i)[MR\J=1AE/e&!5Q/WJoP &bmQ W941G;R/4۹lSك]#' 6fCXƺ~BKZ3m{5ސo-І 1\" ^yJĈ¯f.R/~gG|JO #2Epc$8T%dϡW[o& n'P= s|.8RCDL<&d-~lg6m׶b{dNwr?h3{Вn^ |M`RCׇwRNW_NS/hH&ΡfoKPKMOz N}ԤF>_IO %@0>S>m;F/*}%kSU%G}Z@_vA}ͥ#LQ4H$ D8P!zV,v2U,7=*$m6yvp_d%\˂v;n<`YoBU,%kyB|r>ٞ1SDf;(>]nЩgݿ#x d]\q(]4* Nz944P硠A M i5ͱ+PWA x`;UbK#X=U",a^Wr&T@͗Oq/6da Lěs|}*="orN~]ŏU\OceQg/T2~rG;d?V7_;OaG$ҳ콋bvg<Vlu=;H|@`9e4rf]3rdrBi+2ȁ_Hb!7^vw%t$aÌٹA::"kCi:\P\;z^.%đ\" .Q}0L(f(R>fR]J\RW9'k%q~'e Uu1[j U9Z?фlېT悖݂:qQlGtqa9XYƝGX@\1wnq(Ɏ9gtp4(A=Iqrhn){7ċ5 0e#=j:..(Jy/wMLg?~&ʧ[v~&<HMEe&ᗷ9lbglj8[CQ[ĄZ!9᪛ ;-'Ø(a>]lJxuVVO;ƭQ @qAbqC).!=N剶|YSv -Q2C|^ Áud.î&=Q;qC]b 6k(;Z~+5szL hReH狫e;r,n$Jr'kŊ|v-Lv+`E tٸ;>ոӂ1w1*di,'6+tqcŕ{7F#E 2] QtfzZCE Hh>(S\G[މ$*SRvM}ȵ6oχ .6ӸFhR,)HʜPwₓK\!;x~w>񞏒E#Os*r,/}>|g8oXlWY ʳF3Cbq5Ǘ*s6XSmꂽA}gc¿~sg>%،9!_kW餧L.Թܶg2$jY19iZuKTx-e:Tg$fth^uOXC,@OtnghYmU2@ 6Xft0 Qc*lgNRȽ?YDc"S Lat*!U~jQye),rxA]ú-vJ707JT=ҢCF$ 2m}إ3 Y5y[-b|΃ŊEQtNɭk`=yVi趝 ͈<}9m߶)-@N]CuTUѹm3nAd+q 44zŁ{`J+°9D?CN8? r rX% /G6K퀰p A% OV!`W=Qª_+~?ўzo%Ϛyqx7"S拥-N  8-!9epV岏8JϷ4Y|rdn0KFu.5eM7$ k#WfMT[J^)VG;uwԛ;Ik X;=*l.{+};*Dw%`x5P_hܐWdҕeϘǶvj<{rKۇ[΍&_J=bdE %~r oa$Wk=: IGvTMc7c~%1b%sS *gEh-,?|pQIu #K~bM̙3̭^qdss%]'7[`(5M/I򮋮 >(w<̣& +29G8xLb$wPD2k# pl#r+,[E?$^vyM YI4$>O7Fz'ESjlZ 5bS CQZ )$] sI"} M@rdӸnZQF3{oACB, e͇5]a ꉱ->DC^T$eS.y0*`9bnߴl)v]cMP[uKfV'eInzrKsQf{i].w?ܿ:=ߝ<^é?/O3ޝDܝS<ܬ߯=]%wOmrɳ/, sU .Ze9˘ yI)F23V'(U>Ma%;ks mu:(ѱnخ=ԓ #V&g]g*MnQnka n21&YS d;fLZ<1qmU"t8,FxFRK6@mŵxYɷn n4,aX>E4fAÊ0C,Hq%rZ ӟSj!ꘀu8~XuM72!2v::vIXv4,|/a#BKֻBbf,e FܒŮ p?7a1q?刁*aǚCo]{ݺ"O +'@L7ca >zyrz1SiX^#Sިҗ5^ͧq9 @ÒDcw6@Vۤf*%''H}ܒJD.7GX, ϰkXr< =W3ѫ3U [^Bu_YzpVаԺ%@p- ѪCM =uZRo=n>eSuQ:(ҕ"sNc[a24,sXM!?O{^o b5r>n61¿PV7#+)/tt#\,T_[/,Ap :R1bOU.ZYb[P[Y& zjX(+Nյ\~Ŭ|n0-CQxΨ nI-JRAXP/m /C61lEL7и%疢*8U{MԔ4o,ob[P ܒaO qF2eLWZX&!-MӸ ,".f6i̓k >^hbK2amCCcԍ6mV>=qu1IGjA_eTlR%KdcalYWD<^%p-" ^al=FGS5.Ҏhd1Շ>")v6naI'zx+*b"S{_$?c`ֈiHU8ߧҮqin)-DZh鞢]ׄ?Y%`喦*PW"{brjl3ǩU*~{fL 3}*er@-,5#x(noZPw-h;EH6 XsK_j&7z2'RGq@.K>083[9|Ba.n۷<PV<W~b % RbIhqjH9RK4`z~$ɷA1{AN_Ӑ[_IXѰ% -e^z:8\3 KPF1󖜱LcyvBPz ˹%!!Cnnj̓2%?-\0B ál^^ oIϧ95pM+jRqg"n9xe !ChLv͏,Y&"n B : P9!^'$/wr.;(1瓋Q5n d `PԈV/U-VA㳘U_sK J&p^Zhn*yF]7v(V|$)N0p(qm41QDse '&U#T ˜&>h9%Fᕏ@Rd9!4 &l\[J/K&pꖢK5TOk\ZqX!- IQ\%a K^b6cu05 m(+>N [ ˧GMh+܅tGL| gFQ 'ԡs(N_, xE$l\.}h-,g -ϱ:KLLsu7H?fzBi*N2=|;hgXץF~OTD%e-q~n" HۺQp) 7^{X4%*qeX*$1 ~կBt|"T3 " `I 1 )$=+KjD/6=- D2)eGppy$WvV~í) -Zc(¾<3~'na%(f{·ga0NhDvc8HqKv&o` ֎ڑ?SuG:<>Ls3 h]߲rrS(h fTB-;AI*BFII>J%e$RRdhb.&N9?R#|14,åg@/|Y+45ߚN}RAs4?Qvh+N&M5.XSK vPhX r~R:$[0=O TLqJT''t!>~0)fD|YE`6eӺ)?`LIEf^a#'';hX^RXfJUB Gf а&ziw֔l˦$@A%KL$;ÚNuy%塚[^0X`S}n0U)~ݴ[?enZV{zۿ}{;9{ WW0 + wI!ë'80'tK|`vH~xXJ_Ϭ$m5tǫj􇦒Y]CLSm;.gGㆥwppB̞y1z#rT"sC OWkt%spe@Wz\-c@^8%%v*bNUG'uei> AtC{X8r FuӢA޲kk!2,W(_nSZmS$Ux*7 HHTXy"\ <*y,-  xBYٛH5J?u~L8͠9d6 ū&ɻƎ*#nm&-/ݞU5Sەp H&e_XX,%uPapBDJF Z jqKXI?xPB%[!!Wn1la,3R4PzH9K 6/,w{ܲDg%{f.<ݽ".$[Dn .[\苿_.˲3!aȸɣ0ˆWI)^t6ȖyC9.ݦ@W7|)9%2 ,Aw{.8#Y%W!qaI&hRE@`S \bjneJhqC CД ҍ(a$aJ>,+{A҃ J$r M%x xbQ%.%> s2D?D1N:JfG10/~%XGJW&"8z=~ }PhtڛA Lf%F7 c%%kl#~V|sЕ([AȕQ[eD1uTMV[=c:ȪY]#M!iF%P5>[vF`w{s|_mQzwqBbtߔAvk}o f)$eR/1Jdڧ[ )#PM8+H%5,/C9J8֜![̀@l#&GG>z.vQZ%Ɠk;2$;-y K.ꑃT! 7!8|EJsL/^'N"eZlCYhdiѸeiz8An4(0GxJV0M /g}dR|jX'F%Jռ,Ӷ#aFMtK@m&؋% 읙Z4Ȉ6Cw4P/$F"xLq ;dsŚCrr7o]of:%AInO{$]̘*RӡLb*,qvQOzV'Q\z~h)y1u !XX)$4?E5i^MϒKY[*o#<-G -d@[^wѳx!rQvR;[7嫈 :g|Z:nJOndv,.X,_Dv~1*޿)d\h>{u'ghϴw 9f[cHQ!m 2N52 W+.FCn -wsa0 zmd&2N 3V>ME]T:BU1çn ?ijNȀ ֻK_b\aۃa%z6gsIuZ:[,U<-Ѻ^bܜ.@°,@#Vsj{ X"pL$&K67-#2EnoVqW,#G H ' 2p/jT,_C[ a@?"|h|ECӀ":FD]l\\g)"CR4XE:ؖKb#B &\i7R;շwnܼT5J@_SA"mJ"(dNOinD,LpuL,Ւ; ʮ&<a)$icoVe 5,yiMx*!>v 2O@ep^R]t17A(mn^[_`旐ߒ?PR~蠵R*@i |ZEB,RyayiuP 7#Dw1<1q 5н,|UF{Zh[mKX,wCBOS'OSc5q-`'*ā%\IsG٠H4 y\c #\Y‘7=6XJ.^PE+9VneDok\L~la޼bڑݰR9 Çq8pkMunu . PV|ƱriokINX;#(Or 'ܓY?thS /)EIf,>g;M + ÔmEfqE kivwww\5si##$h3T ]sjEHDdKXjR)0Dte˧&[ g9Ey:q#-Tgc5 }xg̕y%Y7J''QiZ9bHѺb|el1ZmH\hxxܲ8;VYE7wǎ_m-+fT?ӯyrC/3f͵瘧8 }MCXo嗺 ;tt3YFDyy9NO|)90dṫbBW2dPwPYHᝎZ'ktke4uLuvYqGYA֌#2RY=\m&vꑘpe+t-AuֱMRl~` |*&w-xabeX-Je4P4*zSdfu$3vQ\'_+ZBe6bFwbG쮄Ÿ%[8e>_E^;!bñRHtz?jh_*,"*\^yOk'M|^|4!{N5׺J-sLU4$XE?]|N- }1Q+rzSMIM*X<n5$57c2W:Mssot c WC[G"%4L$>RT,_pԤI&M4iҤI&M4i ?p"h%tEXtdate:create2020-05-17T22:00:42+00:00ڮK%tEXtdate:modify2020-05-17T22:00:42+00:00IENDB`CPU-X-5.0.3/data/logos/Transmeta.png000066400000000000000000000221531454622605200170640ustar00rootroot00000000000000PNG  IHDR^4]gAMA a cHRMz&u0`:pQ<PLTE̴{{{lll\\\TTTKKKCCC;;;$$$ ,,,444tttccc򱮷໼ĬǶҳЮѹҺԴͻ٤Գڮ9NQ $% 3E -B 2= +<+A5E /J#4yFY_&5D+< 8G-C &;3Nc 6Q.J 5L4J 9M6J1E=E5R:M:M0:% IDATx]#w]=\eL6ǖ-Ev߂%I&[|T˖ZRjE D(SA<P,(x;={&{֝n}/~rWgG>P,+BUdId/*TjFuu^լWĶ :t&źRU P1_put.2Č1.~T@74C]]+h<#\]+f4*+GWoWwXM c`0WG@ aLZoh]ҕmkTDtUQ_Rw|@kԋ@ѬH&?P50jv&ʚ6_d - FkuKA]KyY^_QWZOj P4+oC4|3G ns!^-YZ۳V&ƦݝtQuR 5zF^/ʥzFǹ%u1f]F>g[ŁPky:ѽ!^o}hhH~@C;majhŔVMc0WhF \"~!0C*֣/`UM;[j|;X TQgV)?uɑϺ'j)X6`qKy &7(Ôgʬf[m}`gcC`N C >HAH8m_Fcq85 [mAEc=_[_5(k/(*iTzfd@`u4sYӽ11[-vSwcu_K\X.\è:0c( EiFd]'1./';b'.Q9**6#{͂K@ P )*v3?"иь pfI^ߍ_#\d~sWR!-[qR0 TGTK|t7 _+-*Y/7d|;38ܙ?wjfo,=?;={k;G2@Ψz,H(^SE w5*8 i {nA}"E{IPYb.I6:L]brU2bTQ- -6v{x˘g!ů]QUZJ;)j`颢>$b@oŖCoz=o:䇥G ^=:^r@JAEUzl ~\IOx󙙽g'd39G_[k{}q] uUn B> R(!_ .,9j>W0>`)4fv-줋5A%N#0f#a'N"Yzmo{Kw^go]zmW֋ɟU,yS!rİ܇&1 yˆ h H#fBQ5.<bB_bqVOj #xvz[ v{a_snNx GQ#: {"9P -LyHaF/EB "F+nvev1NrJt"gZ*7u֮{}wLchzq_Թ_ݎV=L?k3wx7;!&K !* P@|g{!4NT683:"k&˜jiۄ]]>]5񅘬?b]Ïxgl{yj.`m޴If@ 325F/gT4t[qMPRΞe &&Ȟ`.ّvֺ$ n;1o[x㹗|z>\'R׀Y&4 iS `U-[Jҵ Q2PV k! :ax:@؅w($Zރd)!Y'':s)gV{moOҲ1R%!)ҋ[E0ɄEY7>E-(\%4d mLnh#HъXȽi/.kKOa!#A*[ߡm#- ,Wqoˣro>lg9Yٛ'i $Gք~B5"Љ.~ h0y&>3vOjcoஓKS-:$co-'f^F{>.*[xvzl5Y$jx!^ŀب"t2D. 2IN7ՅhcV`.QPwVIPb/Zc6xYlF{9?co2Ferx8OI8dVWu -#u8pp_ pIۏJ.曊uP*>omRxpr?pZ>BHz5_=y ȆRjP#iǬb8jͿ.QAmi$Slu̍XU=+3YuUyQAe8YT Ca h& 2ٓ}߂P ;go"cߤGuuA2-"G@jHO*Aftd,&7AT*)u .;c߁Vrشʊx(nP,[<0N3 =fnd=-=6" ]eT,ϐzsE cNWQ-~ꢓ̾7u9ŐCG2j zQQ]^B ƚyO<Z0o$Odh h}d"2e;;ޝsp&7/ak4=jyUײDRHfD`mIށڋd")V^8w)|sU0j+DmcI8썏M 1m{5S_=*s" 2quHy-Ye]d3( Z)7s1Ro n1Ne'{ev oF^doWh3*yzrJl@Kf%ƙ]Wk@?)j27K{;gzmP96u4+:Uh 9PbACoBP˻+VXH)ϊ\-)Sx7ŕ̥rr%"\Jמt컣=vuܶ{w[i}y&哂f=ldPOnl`ѬJca:Dq똚K r?xDL74 0$9M1\8\۞]=Y,糥ڦrt݂OsDid˵{,ܥzooD5dVLx vMuN"Ayo3|az+8Ď˜\M~ȺA5^fQ$hn9$;`Y@# 1ّ:dH. :C&IShow`ä]jKczV^/?w&H21,pkbR@ވ~OEO,[X1C txƹ\j T3rA ޓTmӍ].XcAQ_@]F=h* zd`"hTdjx]x*-Цؐw/ 6/@s dmZHf,v6nnWYV#?0ܞЁH5S;m`Rk!:7YtF8`GD5!֠gMb[7;{v&l:wZ5DQqbF:J®d]c[3=|曏h$Ok5dr5=[Y_S'/Wiw5 YEx$E5\_xO{sH9PHCvAqew5cuN3WmXب3}(7j6sf;ikH g6u@2sm>W;NGF'nIzs,2sRG1WmDjFHa˨%tTT}ftl6j* ێєiN! G=sbB}IWUhL9kTR ˗dD R e%+.tZ @kِшUM"wjjCIZdʸ:\( p6,hxlU%3'V:Gf!fzUfJ,  Y4Sq-r!&+a} T5Hդi=QV߬mU" k`9Uu'͚e^2OW2o{I |}P:zQUVnmb4 @YN~dP:B|Z_Ff͔'~O,vFx j*>Gb"X7u C"`ƿUX}NOY nI%۴Q15@FkOtڻ|E[iYcԁmP.(ZZ08,ID]N(Nx>F A~j]WK<﷜)e¤6 IOS@X^*sa5 a+I 1S 1ؼSE%.SMdl܆'E+Y)?iQ_-w%-ЙU;sy&Z!5  JT: *uē̓?~RC?{؇cssDJ2i+YčpLEuиcϔ㻽vppreGkd~eLK omhZˣtw;7*Hz<04I3 =S},wZ4h&~-_^JA.ٺRh.h3M8q%tlo:Y-UY!Y|ԃ%C/LG+vI̛T:S6Y-*Wt" j߬f)M^G^ ~&e5??w& $%tEXtdate:create2020-05-17T22:00:42+00:00ڮK%tEXtdate:modify2020-05-17T22:00:42+00:00IENDB`CPU-X-5.0.3/data/logos/UMC.png000066400000000000000000000176711454622605200155630ustar00rootroot00000000000000PNG  IHDRJ_gAMA a cHRMz&u0`:pQ<PLTE᛽ۇxbRK>1w"nd ]WX`g3y;~D[k}ь֣o-u[Kخi3y&pӏWw`jLtIdaǟyx tRNS@fbKGD?>c0utIME1(1FIDATx [<r* m]AUv>nz$iIGE$7s$8Xq=s,*c[{u-p}lkwIZ|X*ʕTR-w37Jhg?H,uzWJSVA7\_"++_uu9脅yoؼU[)kUHܰ3#!VW=^sYߔ{מ LLJv{Ѡ]Xo޽nڱzoOgj"KŎ25G5:T8WZW!"s#PY}U!vɗPC4-CA-9Ttڳ߯?jP,3Pg/dRbقO ,PldZ`r8.23ҿ~vP墬D? J1+&ٴmУKr,eh/ۮ@k. `CjLSWg) 0`Bn׬r!(ȁAPd&(&hg  )Շݴ[XT ‹]DZ(TͧOF%(TβJSK4춦`>esVv,) E& (ǍBfPxw0 `I Ⅰt 5m>q$rUwHP2ʱHjUBV]F+!'`ŕv"EG ՙeGd1OnaxYP7F,/&\O:}ckfҙ i -/d]cFȁYp(}zj )$>#9s3|&8@W烨Q3}OO E|Zظ[&x6DYNNZ %(z $Iݧ ZMtMA2Zז;ME@,x>%G֚O3}ho6=4y"i(;eIIːLES@>$ [W3}bFWi%(ʃ IԴX:o)2C(ddn_HAQH+-K~j@ #\lٸ4D?2RP.qN5&$Q1;bң)YJѧd:ȋOn BAiЍ#oӏ ^ @PC0q| ^CJN/\XxIqA [BqAv"Ll| CSP P_+ތ[jP/uc)މSLf(@QWGؽRzCޫ]etnGH.k(/9*Y_/veqéVʺ{ϭ7+\|s\뼾̷y.5JAWHX E)(h#QLT(D zs`O>_#Biq:QT&SPhEr g΂O(iPqOeL_e'PlV0VKO.;fjR!BZ2UCP~x`Mx҆bxSbfq^ԏBׯSԱ\-򒙳#BƧ'[S59y5j4=/.u+j CQ|QF @6xP"4hT4 HW?jvO OQ B>qfRFI+ q{>Ec$ mp5_R*-Ʌ"(>;)jSdfZZGEǕ+Aq THjM9((m{F;I{p,~σ(F?̻|iJgMEub**712ni sZβD}Y鄚BLDO'xPhtB U/ P_ W @HwSҩѼsgu1FIh|8շm]atԡ֧L$[hoT!& /Eq.7B)n1Iz@!W$SE ,/߳'!YɄy>x0Lpb8"L4 fA  c+[PSDڦ< F#Tg 6:}L(4ǫm K:>* _D~2RB{[ E>_ L&\l`-ej#q|C8&y&ڝw8ť?>O08$ EBO%: O 8 fv% E3E Dy*}k y(iDÈl8S* H;*O^AmSOSL=0g>-wrO.n@<9>)b^`S(+;iKZKj=ԁA CAhAU֑=E!(ͧ"G;]S81Fs'R3~-ŅܥTP8PXH?|ѧma/Xسj)~`hi7fzя(,LƇu pHf#iib]~ b)m~OVS3)wF"VZ$u7@ ?yB_OS@"F,sbXr=vEOdKKS$d KGOfGmZE؄UP3bہ}̐Lyg7L=lA QOղbBm+'WPGUۃu:p 1(yy?T2]z =)c E i;no0|v<: @0dTk)awkk>JTZ` s.#C!PHOԵOS{F]Ax4 ;(a%Eb-DpkX* rGQWpBN\`3 ?aĞ詪hT=,BD9'  pJ.GBXwX;hXEPDw'E[# )@DQP)C4Zr\ږEsҬ)&y:5P+̻"v#'`1(=>b_M 9sΫxS'CC_ P%ɾؤ!bjcp;$?@!FmٗbYT>BcpxZ|* _ ]܈mM˲ZEI{lAJ_d|Zȡj %7{-Dq. ,˲E#.NJQ@򏹉LxaIZ苹G%2eUPl(Ȇ)(BORPN>!<|x6NjHGfR l(Ԫut*HP36p) NWk ^tNV:7ϻ+ ںNG\.(R]}ҏ9I_ W%u%5A@|Z&h;I&3oY~zti':) {FoT2GoO'dRDG"Y64Oq5 J* C:i*%0|x.++8\/UGӷ֤+|iJbq` sBBv? +y(Gi Jê:@A8KI {a$Mjj/ yOF;Ud??0$H1; E@U |Je!c^S΅p,aiՖ;TՌfF)$8So-Ql*6IHFPd9O:4ԫ*)6T1=RH6hџ-cX(xN|(֯;h5(՜s934P߁. d7֏yb^Es䪋jnY@bqSu<Xi4/'|m5 ^d4n.UI4XsPdB4b%NM_S5Mlp>/E~, ~jue^*o*+P8{? "O}Bp- 0/2B Mz4H>)K-3CoGe$x,?;"g`&,b%T5q kdvkhATUC"5  $hpfW_4(R{^Q$pVޫ䫌ofH{AD$ǐݵ@-uD ȻPW `Aҹ_n@=4"M<RzB a?W TgcTV*(O{"- /W˿g-xAȉFdա@8#z be)OE̊h!DOϦ!|&HRSD]8-M]-W/0%w<Ѡer>v.џB䳍E%nznjæbYH&b;N^%R2EX<{CW!>h@yuՎ~}3pZvAGJ1{F._0y3}<\xJUblv 78Rz>zYkT2eyou6ζ.$i~3yv\UOs]*g?o1nv=Yób=,C'ny-ebv~3}k\^ ӻs~6i.O~5rVȠLä9pyqs"bs47l6ے~wKSb~^u:eۛz\ao[L_.h4 Fr-]wNAR%tEXtdate:create2020-05-17T22:00:42+00:00ڮK%tEXtdate:modify2020-05-17T22:00:42+00:00IENDB`CPU-X-5.0.3/data/logos/Unknown.png000066400000000000000000000443141454622605200165700ustar00rootroot00000000000000PNG  IHDR>agAMA a cHRMz&u0`:pQ<bKGDGIDATxڕieuϽnt@ $DHIQj2EjHI5X%۪T,c)rTJS.%UŠ\eZI$˦Es&%N`A< t{^+?{y;j9{o}[wƗ b&(i NkԇҾl_/}!$@oM'&'ȏP܋_vP}|z4DfO "}{,@a=~<`?=y6 S<݇$B$7>)FfwRv'fsL~>Wemc""E_G?~Ǐw 6pqwW߃@}z2"00!BҺ b>mzB#csa?AܮDwPv(ТR}3Meh^7U#-s@€rc z³< g;53#"dH!:~7=xo!_ʻ>E`"aT!Dr{Z&-R\0= ~y]p)!jO @{8vL"p?P0a-~2~6uEpmw?iϿ >|$9Z@Zc^&͓6̆Jb ^!iWnұF|Csȯ\B7HOE1A̹oK@? DH`ET'd.E2}O5p[4*nv?'tx⯿W3x;_7_HRD<@q9xM7j2h &S^ `;Â#B+(&j*KG@@5| @XQazхz,"XPAAzSwHX'D@2b4" (!28@' Y aI2(Mgs\$NƷW"vpʻ]Ql]\xfFIڹ% !Bq~K;YH 5EjdA[BeD!g8A1> ؤ Fk `dl`} źIsHKBIcpI F!wGR>G4 'W.EPs1[pˍ7bkĀ]@ b$!L1""! zS>@.hd!,E@ L 9A;qMAX/ 9ʳ0"Vzd+!a--IӼFZ(D*ӧ݇C>݋ BhQHT1D:fxЃ65s% ,6[?ކ^r0s ^OI4r~9G[p*d6= 6use`T; qo۹ޥDF"fF BtOD;qI g?O~n|33i#olbm%Q"z<0l]|Kq6c-T)¦PT9`^:~FD)M.9ݩ.BY9 /%i}Lx "XJ,ڍV1"(aB$K;5\џˆ)?CH9 b ySZJ\[( 㐏fS@yEY@ `}A{f* 7pye7I(jȨrRw(( ᷾~Νø^("ˍjn(L\\1c`۴Ԏ9l̆3VKsԲ.tgF}aZ{`QHבz[q?.sN-I= no^z?…0k=K1#9_XMMݔ_nZ==t`PuhvY$A|Gq%@&r٨ԨpL"]$B; q0 BD@ na4b !XˍMy_ɘ#uIE=+;.7z+Rb q#GDD-_sM<(i}~AzLlу A4T=gDE+tT2 J9H)a5p0 irb}[[[xk_zܽOf =;DIZXx㝷w|=l$Rkמ)! ;$5IOICƊ h37E]*/H[]0IR<96K:_dO8.}1qM7ck8hT8zjހO鯱Zg.vjٖn.U kz/lC$U뮿QrBHʨQeʑV4+Kf|TII&irҢX7,B%}FQ~bBTR@"⢈XGiD W ;3OW(,%?y^WS__3n>52i|9Rmn \CP._{z&)%ʕ1FPEF^^vCmTolk4vJfRԊVsz]J;6𚉊-i)%5q#:zgq1\t W]ub ,gm;:d*p >9kq.MJ#81%-/uX"P{1 /yUDBfSsWr?T0'`9XpX,Y z;hJ Z C,H)eH|K^rRZ RI*w6iLmA*9UH4F 1Ga !Z_*85.R/KǙoihb5kǫ0#PMם@58nNs)u [ǰ9&=W og9}NfU7-E,K$ X(3w̹$ĩt.|p./PwL?P(K2 -2W1 cpRb\JjfD>'e J"C4VCDhTW0MvAY+7PȜN-w%hRvRAaBJf!el.ԬZ  T,hMJ:_H!o%¥Ě9ŕɅ9_ʜrĐðh0q3i`Zn E *hhLf )93W߆F?{<4|ɋ)€' ^2j8S`e~VMGF]5OI k"Ea+ BrxDbR}&s%cFaԽ_avf^8yeD%9|rFbZ$IqxRkH+2*:!iE5# ɾڍ#v XUئQb__ϰ]?gTb>:[2E8 t(_͐d2C@'F#w%%E"02Tj<{FVz004=4\IC /uiKY2ԴZ͝D%o&%p{BUJq #+ln,[j zQp!nTm;>+NPD8H^*"ǂ |IJE:vTŠnPp]Mb8U) (.c.JbHCvY4,NQFO]dcJؕP3,'FG_*P›[ГKĈW~(r̚6*9{휩dMl^jTٔG4qpjdRb r*ڎvf PT+ʑ4q,tXRe撶!NNjbPP1%)~ jK'Wʭk;6Puq2yoi $DecDx@FI_$Tf'Ie3\k§Dʂz81Ŗi=h}8bJ\;;-R'/zJJ5L\3?/ dLkKGh/LQ.6MѽS-u b2f1MX,?c8 0S˫O"qFcT*(Jk7?XH5WcVڨ;* {"3e4X摕 z}[t¹VVΦ7,lʢ\-,rFUT#3W]_ѫws.?)p7%5Iu=Ww V?HӶu~a> S/eR (05mUX|1N^}g??zG;P@dB8܀F#qɹjX;j(#ΜV&=LqlCT ^ٔF2]eMW6T0h|sF<.~ɯ;PO8Դ}1HYwcX7+gn,)KVAzc@ s{EM"dXV8V.0؋\/bt|Ua"g+혹uаr=J^pϏ *;|5+Թ(ĥ}>pM-Ͻ6}6 <,ݷ%| 5 RiZE{ Ptə `XĀ}^;9 Ua\ao]|Կ?t,ׯ,q~lҖM6']ܨss퉦>?Oi< }nkQO2JqEPoӋyYEdKb;kwS单tBף{qG~uwsmkCH NWC)On#bhJ{rpcP9+"u% %Irmek HrQ )bgWCR12#$v46 _)E{[[,Q5Q(=WPyw>nv]#*p,ҥ3q_;q1-Z(YFFnc@hQLH^U 7^L [#&Wl?LɤgvרB`7 (AŠUJ'Us>fCu7iӫ]tf/rE2xU.i̥_P+&y `X"}{EdXrːKoȵ|Ϸkwz}N"sXwK' vዯa 8XD6M&x*GS X@XK4玁acjSು`P N$b?iҋA3i4t!&:@2WHvN<ѡ~:VDKl☒:CA(GK)Gjpm,9,_kۚ:Wi"g1..z}9m!( =.ecQKCb{YR OM+k",H("F~N" ^S.5۽lT2TTm{(JiV!ʿmZtYRngJ'W-X-f\Wwۡu.a2ؘF<"ewx˛f+wb^e3 tC~˳&6v\Cn)JK*TT$ l/0Yھ?]M zˊ2U~:j:W+KJqIrC\ Nް>n8VOGە䀠amw&9>E-C-mW"D@V +89FL'! W$UJQ(4їE{>Ydû'N&Q/Ddx29z<ٔRm*y¦Àf4,Z=U50cP]V1iٴ] FZ^sl[ۖUc@Z<${wOe9UF/6*BA+qTbt_5Sdd/G)NXbdb-ܲPͤҭPtҾ)<{ߛt(jØyPІQW4." SFHkVA}4^ l/1) q9,=糃ZͻN-qJ_[L›LMoW̍A[3ZҼtHl5#E&JrF*j H0ft+9yKs@lN[7FO{mS3lGHh~R.w͊;Xڹr>륓N&R鼕"v$҆>9 }oeӆW:ti,5FpY|֍JGr}J3lLb^}#n~`N 4%Ɣvo%+V+R9`2䁊%o90}j`bI5 5c.L[NBZ4Qu`qIeMdFң9\Iw]$g`K<:QP,xՃ? th "&ZBT<@$ZGwI8+Z'kKabhN>onr+x%\i2IW̢阳yeKbo\:X:~h(DP#)Ts~;ޮsp-b(-6o+ Ӊ{"UHuQ{^sPi[BE{rСt鼅\RŨ2P zn,XYd%x8s+pa"4B(YƁ UUJ협܌L:kW""S B)bmyT2Ru63j;Wc3a3-+ оz=J6'1͞ Ě:O27f)N,܁15h"Sq[F4[Px; Bb9u$*"M2VW|W/nh%7ᡜg]gHo^n1 n(1v^i -İwkX eE(Z2Vs9E Ra)8f!oXNוOA BL0VB6YiB'WPy "Oy|ɤ{` 6( d,9zi1liԉ4® )FΦ !T65ibjGRzݹc-o|hr>@9L40096f;r@E#JփpV6R3ðn|1$%Dx+eDo);R( u^+\}N,5=-54DדJ)ށlD>~~˜<<dQP뻔CZ¨a>gf%TF>K@Aw'ټ]@a ͙ZR*W װ_L=y3tYpYNOΞ-[C00Oe]<P80ĥr >L=.]s R&ӏUs*Qz Ot" 1tn^|ϛKd&P2x Ʋ9/nx(65aѨ̬EqM *]z RΞW\PiXC?QҚGR[F \뉌l ]@viܸDiEk7Sd5Y F:);N KL=*BuNC &a̩vbs<,2 znLJIK_EV_D!C#D jɛwT#UHL86& 2$e˹Ѯ]"r6>4zl(c8E/!"Qnm( WLãAN#zBAҌ7LOkҼjY(hnWz҄aɾ8dI1IfXN؄(FN~6{;LaIFÎӣRn$?dVw??!R ~W'T`SHTJEQإ+00EEQe<[j Y ƈ3^pzC]sw눭nXPT #\Pg@Aea@gK#M0&2IiEh&:xL;C:uZg]_C6055C!i(xal?gpjF(bx="mD֥Q>aA&+tV+g7:o2> VЪ0E"g;o{um *F-7Ҍ+d7wC&FM퐮.ί@,VG ;:ʡmP xJQG~ւ"Jّ2LQՌia3fY7-l7b /i?&^k e1OL_7U0(Q:/LRUv1Pw)Z6t@#O:H׉䉔5Ј* E%- hwΠ_Lk+&Aمގr}b 5>`A@ ]Έ/<%,9p' ՒX(`1 SߏwHt8ĞI:7Y,KXݎcdŘuJRG[nGu2 ķ^wS]yde#Bh.!EѴU Ѵ@1|!2eݝx!4\~TI<60Hj":\]m\}ުsmG{|%4HUO@[VLX.]z8l'kfQd0!y4gj[G-܂˷YdՐVmlس@Ia1Ҥ$L(_d>&M77ڂe*4b23PuL$T)▊.zJ][ڦP:e7X;v/mSzAWw(sa:^͜~l agd١k ,W'vGɢmp[MmD}-i79QVf@AbP<lv=l6RTPnwfS+E#",5W{MġT]ˍ݀e?Դm-.V=naڈb1lbΝךHny6JU훫h` 77+8bggw(;*6)kB1G|̳,%#yeK+[S&kM,CXNMDǃ^W}!5y*66}_G]NX*yK!V&Yhy 1bXlrdc=x`V>]9)z& /"gPc in Ws6ͩ$fInBթ%%-5r<< ( HSTYTe1ykW&HՖ(¦3Z0P<>4nu D57eO-ZSἸtw)9Ad[hb1A5(Tz)1)^i\cgƪ&=4 L%3eah[xJz ꬻ:fU\%Eysi ٷ^.ζE̒jT(jR1 dmm2;ʃQdxkBA]\̐rDƑpu7jK X!HNŐ  Jηr(,+d2KsT)L!,Ky#fpޣXdv6f4ԅW/&w$\@Ɂ 3Zģ!t@v_]1 ObWWԋgB+K̈6H3E&tʁAnX\{B2ntI' tb'KPd12r*@Tui+]4X#W__,W+ I;'cEөZѯ\G.\!~ۤwӧz.$rBFThR ̊'%)N G#Pk5O lRq{^^p=۹tP捐u^@DfȉB"*bbncȱ&ڹjBmꠙ!UA"F"dZ7sr^dۻJ S lO˜c3[JCMa'0?f|﫾?No\CbSܘ7J6 e -kΗ֞ LD@Վm7/y?;L@v]g{3S*ZUm2(eFi\AUVWuPC,{MwgO=.WEΖjIXwXr @G })>ͤukTX)t:g"P2c#Xk$ҹ& H>PhZe!RxJc>s%cN57DUldgbv4̵7܄;[G5Lfգ(3ArhSQTb -"'7p$M6툩Uvo-h~~*Lkdr]L ĬZ٦c.y@AAȩ:egDAƱk {A|K_2R2TPlbm0ąl6>Wb),"k E|r-m@fߊj;72+Ij<$v)er20!DhS0Zy9?w+525dZd8}^ Y /x+7[G])JP :fiS?K`v k2n!s@*Ceb\?Y:^}'vU bWr(]QcY5․^!Du™NP-USB- 6nL QJcXǣm_ xv/m_cɐCœmɝycOBQcL#*߬%O4Ri(GwƒgaS%!VQE! $6l̴Z/=Zhv19`R8S!m@< =2^to=C-b*uLV;; $䇆C4{?w~9I[ :MnOP,X;urYHs1Bl@Kg!jM@2FQրcLɓet02${~Ӹ}nxOx- )݆'?$p竗Ms[]ɺiV`DGF:jK8IVrï+YE@(NA!"^BG605 ٩}z&WA̕}3ƢSY#n}kcwǮ q 63M6U0J Xl9(K؊k}Wj"?By.33{#FUe#4ZhQ瑹GTGb_cKb,\g>\8@85ɦ.X[BA&ͅ ͣUڋ^'p[s'2yՋ9YAgq8)T줾ABg6JhI،rPhR8s(;.l1hQ2هG _;x3|\")Wxa!c#;#qh:HE˴IfeX#=p @1 ذ63-c)P,btXA$k4 2sڤeZȍVOF>81n6՞Xo}ᣟs_N* 2:6/bihk+V+ewqr=z!D1]Uw Ճm쌭q_~[`< AEXo-BysҢDKH–uOHHcP[`%̓XpMQ̤nAď <0DX x'!DXڼWXVX )2 Ckq1̚m plN T*c]4NQWZލKTDQ̻bq⒠)Wu m$Ɍ K)Vq;sF?׊.}^\i9jn,Ea ΟCʯ ;{{xi;;ؾt{}} Nc6ӥg:vPX ^%ƩIUCQS@1Vss|s(GaA|@,0͛yVMT\LR=fsH Jڿ]J#4`{niqYoFxc? "tG 3{_WUrL~Xc6% ZtA ͆C@ v"d"B"LMPrX%۱.`яūkDЕY'u@3,@GX9:hí䘠JKF|l=v?4=!F$N0{0n.ޯ~vV\wZ|{MU_`*qX,8qI=v<)0:^̼^H3E[j?Y19 .TQ0Bs<' l`F6"HJx˿񛿁cbf!3:碵"B^qҲp_ak/m8,@q@#UGZa[nM`xE 8̣`5zzU)B0W5.IUfMnq( rvҬY(>gĻoc1,b-1ЄVLFɔtc ǔZmj(78.%aب<|ħqI{" _">sdx6@̀ O%6"?\} t#ȉE:򍌃Hk,#cSBXCvRwG͕`K(cH@NR*뽡x6#Xnnm*d^(HxW=*PHABhG! jr#U 4~/pwF6̈́ZK_uz[a 6oT7L7-A["= ~߃Q+QDW0g^iE8"+3!d NX*;tNF`QNc32 21bow̙D{j3Kb}U'#@dv\a@?gnP\j턭z_G?In<ɗ'{ _% WX ꔬ“Ou7Μ;G\։WjF*RAs-szV ΜџK 5,OSSQ:' " eXS=tY,hvvp񢗼MϿ Ddi0J-_eLkV{p` Ic1^v9|[xwޅ/?>iy8#>ѯc n8^y뭸7kN`XERMJ  r3 XOFv_O>6 U bdr5 H X(Z.mh!$DŽ_7acŦ4 ]d2qB aj sxS7OQvvE7`G?!\ġG_NgpĎ%o5pRDL1ӜA˖Bމ)AR Oڛ_Ǿs7K_$9mfώZIjICR, #x7z'Ǩ?#`EGd' b8=8(OҢ28&b\b}>rwy+cy@4,7cEw=ywdF#6QeTRkT)]P c8)TyyZbEZ+A4`8p58qË bP3Aj"2U_$+E;u<(2ycOVYD;eP'Gݵgtc%$21يP:.uFI5>rAO8+8 zU(K8U p-.Gu!=z5`ExN"xUmLG0Ci@P]+KTٍ^ ,̰Gj.V.Tݨ"N/U)xe?.mI8)^YoП~,7ŭoA' _?/؍'+3/ZߩӵPNS :lyӲ|Ɂ`^݉>;e_՝(uADx/7x-ݎµ/| %O'0G_MQ.~W|=%~SocO<~ gpY[˓)1!:zqB}< X]BǴTS=2fU-Se!"l,5:S{l{ 2=߷O( RZ-<~-8nm;Iϟ= ? <4°g`X,q9lln駞޹g먿{~񖷼D =V@蓂7@ò-RG 9y$?>*ͯ:{ Ї[WONc ^Ti85%tEXtdate:create2020-05-17T22:00:42+00:00ڮK%tEXtdate:modify2020-05-17T22:00:42+00:00IENDB`CPU-X-5.0.3/po/000077500000000000000000000000001454622605200127775ustar00rootroot00000000000000CPU-X-5.0.3/po/CMakeLists.txt000066400000000000000000000034461454622605200155460ustar00rootroot00000000000000project(po LANGUAGES NONE ) ### INTERNATIONALIZATION TARGETS # PO files set(pot_file ${CMAKE_PROJECT_NAME}.pot) file(GLOB po_files *.po ) if(GETTEXT_FOUND) set(GETTEXT_FOUND ON PARENT_SCOPE) include(gettext_create_translations) add_custom_target(genpot COMMAND xgettext --language=C++ --keyword=_ --keyword=N_ --indent --add-comments=TRANSLATORS: --package-name=${CMAKE_PROJECT_NAME} --package-version=${PROJECT_VERSION} --default-domain=${CMAKE_PROJECT_NAME} --msgid-bugs-address=https://github.com/TheTumultuousUnicornOfDarkness/CPU-X/issues --copyright-holder=TheTumultuousUnicornOfDarkness --output-dir=${CMAKE_CURRENT_BINARY_DIR} --output=source_c.pot --directory="../src" --from-code="utf-8" "*.cpp" "data.hpp" "util.hpp" COMMAND xgettext --language=Glade --keyword=translatable --indent --add-comments --package-name=${CMAKE_PROJECT_NAME} --package-version=${PROJECT_VERSION} --default-domain=${CMAKE_PROJECT_NAME} --msgid-bugs-address=https://github.com/TheTumultuousUnicornOfDarkness/CPU-X/issues --copyright-holder=TheTumultuousUnicornOfDarkness --output-dir=${CMAKE_CURRENT_BINARY_DIR} --output=source_ui.pot --directory="../data" --from-code="utf-8" "cpu-x-gtk-3.12.ui" COMMAND msgcat --indent --directory=${CMAKE_CURRENT_BINARY_DIR} source_c.pot source_ui.pot --output-file="${CMAKE_CURRENT_SOURCE_DIR}/${pot_file}" COMMAND sed --in-place "s/SOME DESCRIPTIVE TITLE./CPU-X translations template/" "${CMAKE_CURRENT_SOURCE_DIR}/${pot_file}" COMMAND sed --in-place "s/\\(C\\) YEAR/© 2014-2024/" "${CMAKE_CURRENT_SOURCE_DIR}/${pot_file}" WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/src ) GETTEXT_CONVERT_TRANSLATIONS(${pot_file} ALL ${po_files}) else(GETTEXT_FOUND) set(GETTEXT_FOUND OFF PARENT_SCOPE) endif(GETTEXT_FOUND) CPU-X-5.0.3/po/ar.po000066400000000000000000001127571454622605200137560ustar00rootroot00000000000000# Copyright © 2014-2024 The Tumultuous Unicorn Of Darkness # This file is distributed under the same license as the CPU-X package. # Hatem Ghouthi , 2019. # Allan Nordhøy , 2019. # mohammadA , 2019. # anonymous , 2020. # Rex_sa , 2020. # Гринько Владимир , 2020. # samhy147 , 2022. # Ali Aljishi , 2022. # willkali , 2023. # Ahm Asm , 2023. msgid "" msgstr "" "Project-Id-Version: CPU-X\n" "Report-Msgid-Bugs-To: https://github.com/TheTumultuousUnicornOfDarkness/CPU-" "X/issues\n" "POT-Creation-Date: 2023-12-09 13:09+0100\n" "PO-Revision-Date: 2023-12-01 00:42+0000\n" "Last-Translator: Ahm Asm \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 5.3-dev\n" #: core.cpp:135 msgid "Finding CPU technology" msgstr "ايجاد معلومات المعالج" #: core.cpp:161 #, c-format msgid "" "Your CPU is not present in the database ==> %s, model: %i, ext. model: %i, " "ext. family: %i" msgstr "" "المعالج الخاص بك غير موجود في قاعدة البيانات ==>%s, model: %i, ext. model: " "%i, ext. family: %i" #: core.cpp:189 data.cpp:150 data.cpp:342 msgid "unknown" msgstr "غير معروف" #: core.cpp:230 msgid "Calling libcpuid for retrieving static data" msgstr "استدعاء libcpuid لاسترجاع البيانات الثابتة" #: core.cpp:245 #, c-format msgid "failed to call libcpuid (%s)" msgstr "تعذر استدعاء libcpuid (%s)" #: core.cpp:340 msgid "Calling libcpuid for retrieving dynamic data" msgstr "استدعاء libcpuid لاسترجاع البيانات الديناميكية" #: core.cpp:353 msgid "Calling libcpuid for retrieving CPU MSR static values" msgstr "استدعاء ليبكبويد لاسترداد قيم ثابتة MSR وحدة المعالجة المركزية" #: core.cpp:380 msgid "Calling libcpuid for retrieving CPU MSR dynamic values" msgstr "استدعاء ليبكبويد لاسترداد قيم ديناميكية MSR وحدة المعالجة المركزية" #: core.cpp:412 msgid "Calling dmidecode" msgstr "استدعاء دميديكودي" #: core.cpp:454 core.cpp:473 #, c-format msgid "%s (configured)" msgstr "" #: core.cpp:461 core.cpp:480 #, c-format msgid "%s (max)" msgstr "" #: core.cpp:466 #, c-format msgid "%s (min)" msgstr "" #: core.cpp:496 msgid "Calculating CPU usage" msgstr "حساب استخدام وحدة المعالجة المركزية" #: core.cpp:546 msgid "Calling bandwidth" msgstr "عرض النطاق الترددي الاتصال" #: core.cpp:613 #, c-format msgid "" "pci_access is not properly initialized: it is a common issue when %s was " "built with a lower libpci version.\n" "Check that libpci %s library is present on your system. Otherwise, please " "rebuild %s." msgstr "" #: core.cpp:657 #, c-format msgid "No kernel driver in use for graphic card at path %s" msgstr "" #: core.cpp:693 #, fuzzy, c-format #| msgid "Your GPU driver is unknown: %s" msgid "Your GPU kernel driver is unknown: %s" msgstr "تعريف وحدة معالجة الرسوميات غير معروف: %s" #: core.cpp:777 #, fuzzy, c-format #| msgid "Your GPU driver is unknown: %s" msgid "Your GPU user mode driver is unknown for vendor %s: %s" msgstr "تعريف وحدة معالجة الرسوميات غير معروف: %s" #: core.cpp:781 #, fuzzy, c-format #| msgid "failed to call libcpuid (%s)" msgid "failed to call GLFW (%i): %s" msgstr "تعذر استدعاء libcpuid (%s)" #: core.cpp:914 #, fuzzy #| msgid "Version" msgid "Finding Vulkan API version" msgstr "الإصدار" #: core.cpp:926 #, fuzzy, c-format #| msgid "failed to call dmidecode" msgid "failed to call vkCreateInstance (%s)" msgstr "فشل استدعاء دميديكودي" #: core.cpp:929 #, c-format msgid "%s is not supported" msgstr "" #: core.cpp:937 #, fuzzy, c-format #| msgid "failed to call dmidecode" msgid "failed to call vkEnumeratePhysicalDevices (%s)" msgstr "فشل استدعاء دميديكودي" #: core.cpp:944 msgid "No available Vulkan devices" msgstr "" #: core.cpp:952 #, fuzzy, c-format #| msgid "failed to call dmidecode" msgid "No available physical devices (%s)" msgstr "فشل استدعاء دميديكودي" #: core.cpp:1015 #, fuzzy, c-format #| msgid "failed to call libcpuid (%s)" msgid "Failed to create Vulkan for device %u (%s)" msgstr "تعذر استدعاء libcpuid (%s)" #: core.cpp:1019 #, c-format msgid "%s is not supported for device %u, use only deviceID for matching" msgstr "" #: core.cpp:1051 core.cpp:1364 msgid "Enabled" msgstr "" #: core.cpp:1051 core.cpp:1364 msgid "Disabled" msgstr "" #: core.cpp:1088 #, fuzzy #| msgid "Version" msgid "Finding OpenCL API version" msgstr "الإصدار" #: core.cpp:1092 #, c-format msgid "There is no platform with OpenCL support (%s)" msgstr "" #: core.cpp:1102 #, fuzzy, c-format #| msgid "failed to call dmidecode" msgid "failed to get all OpenCL platforms (%s)" msgstr "فشل استدعاء دميديكودي" #: core.cpp:1115 #, c-format msgid "failed to get name for platform %u (%s)" msgstr "" #: core.cpp:1123 #, c-format msgid "failed to get version for platform %u (%s)" msgstr "" #: core.cpp:1131 #, c-format msgid "failed to find number of OpenCL devices for platform '%s %s' (%s)" msgstr "" #: core.cpp:1131 #, fuzzy #| msgid "Finding devices" msgid "0 device" msgstr "العثور على الأجهزة" #: core.cpp:1140 #, c-format msgid "failed to get all of OpenCL devices for platform '%s %s' (%s)" msgstr "" #: core.cpp:1160 #, fuzzy, c-format #| msgid "failed to call libcpuid (%s)" msgid "failed to get name for device %u (%s)" msgstr "تعذر استدعاء libcpuid (%s)" #: core.cpp:1168 #, c-format msgid "failed to get version for device %u (%s)" msgstr "" #: core.cpp:1190 #, c-format msgid "OpenCL driver for '%s %s' does not support CL_DEVICE_TOPOLOGY_AMD (%s)" msgstr "" #: core.cpp:1201 #, c-format msgid "" "OpenCL driver for '%s %s' does not support CL_DEVICE_GFXIP_MAJOR_AMD (%s)" msgstr "" #: core.cpp:1209 core.cpp:1229 core.cpp:1262 #, c-format msgid "" "OpenCL driver for '%s %s' does not support CL_DEVICE_MAX_COMPUTE_UNITS (%s)" msgstr "" #: core.cpp:1250 #, c-format msgid "" "OpenCL driver for '%s %s' does not support CL_DEVICE_PCI_DOMAIN_ID_NV (%s), " "CL_DEVICE_PCI_BUS_ID_NV (%s) or CL_DEVICE_PCI_SLOT_ID_NV (%s)" msgstr "" #: core.cpp:1273 #, c-format msgid "OpenCL is not supported with your GPU vendor (0x%X)" msgstr "" #: core.cpp:1295 msgid "Finding devices" msgstr "العثور على الأجهزة" #: core.cpp:1307 #, fuzzy, c-format #| msgid "Skip devices search (need to be root)" msgid "Skip devices search (wrong permissions on %s device)" msgstr "تخطي البحث عن الأجهزة (تحتاج إلى صلاحيات الروت)" #: core.cpp:1350 #, c-format msgid "Your GPU vendor is unknown: %s (0x%X)" msgstr "بائع وحدة معالج البيانات غير معروف: %s (0x%X)" #: core.cpp:1370 msgid "failed to find chipset vendor and model" msgstr "لم يعثر على بائع الرقائق والنوع" #: core.cpp:1385 msgid "failed to find graphic card vendor and model" msgstr "تعذرت معرفة شركة بطاقة الرسوميات وطرازها" #: core.cpp:1487 msgid "Retrieving GPU clocks" msgstr "جارٍ استرداد سرعات GPU" #: core.cpp:1500 msgid "None" msgstr "" #: core.cpp:1509 #, c-format msgid "DRM path for %s is unknown" msgstr "" #: core.cpp:1516 #, c-format msgid "Card number for %s is unknown" msgstr "" #: core.cpp:1541 #, c-format msgid "PCIe %s (current) / %s (max)" msgstr "" #: core.cpp:1650 #, fuzzy, c-format #| msgid "Driver for GPU %i doesn't report frequencies" msgid "Driver for %s doesn't report frequencies" msgstr "تعريف وحدة معالجة الرسوميات %i لا يبلغ عن الترددات" #: core.cpp:1671 #, fuzzy, c-format #| msgid "failed to call dmidecode" msgid "failed to retrieve all monitoring data for %s" msgstr "فشل استدعاء دميديكودي" #: core.cpp:1694 msgid "Identifying running system" msgstr "يتعرف على النظام الشغَّال" #: core.cpp:1697 msgid "failed to identify running system" msgstr "تعذر التعرف على النظام الشغَّال" #: core.cpp:1749 core.cpp:1778 msgid "Calling libprocps" msgstr "يستدعي libprocps" #: core.cpp:1752 msgid "unable to get system uptime" msgstr "" #: core.cpp:1758 msgid "unable to create meminfo structure" msgstr "" #: core.cpp:1804 msgid "Calling libstatgrab" msgstr "يستدعي libstatgrab" #: core.cpp:1852 #, fuzzy, c-format msgid "%i days, %i hours, %i minutes, %i seconds" msgstr "%i أيام، %i ساعات، %i دقيقة، %i ثانية" #: core.cpp:1915 msgid "Updating benchmark status" msgstr "تحديث حالة إختبار الأداء" #: core.cpp:1918 msgid "Active" msgstr "نشط" #: core.cpp:1921 #, c-format msgid "(%u hours left)" msgstr "(%u ساعة متبقية)" #: core.cpp:1923 #, fuzzy, c-format msgid "(%u minutes left)" msgstr "(%u دقيقة متبقية)" #: core.cpp:1925 #, fuzzy, c-format msgid "(%u seconds left)" msgstr "(%u ثانية متبقية)" #: core.cpp:1929 core.cpp:1984 core.cpp:1985 msgid "Inactive" msgstr "غير نَشِط" #: core.cpp:1932 #, fuzzy, c-format msgid "in %u hours" msgstr "في %u ساعة" #: core.cpp:1934 #, fuzzy, c-format msgid "in %u minutes" msgstr "في %u دقيقة" #: core.cpp:1936 #, fuzzy, c-format msgid "in %u seconds" msgstr "في %u ثانية" #: core.cpp:1953 #, fuzzy, c-format #| msgid "Starting benchmark" msgid "Starting benchmark with %u threads" msgstr "بدء اختبار الأداء" #: core.cpp:1976 msgid "an error occurred while starting benchmark" msgstr "حدث خطأ ما أثناء بدء اختبار الأداء" #: core.cpp:2002 msgid "Finding CPU package in fallback mode" msgstr "" #: core.cpp:2032 #, fuzzy, c-format #| msgid "" #| "Your CPU does not belong in database ==> %s, model: %i, ext. model: %i, " #| "ext. family: %i" msgid "Your CPU socket is not present in the database ==> %s, codename: %s" msgstr "" "لا يمكن ايجاد المعالج في قاعدة البيانات ==>%s, model: %i, ext. model: %i, " "ext. family: %i" #: core.cpp:2052 msgid "Calculating CPU multipliers in fallback mode" msgstr "" #: core.cpp:2072 msgid "Retrieving motherboard information in fallback mode" msgstr "" #: core.cpp:2085 msgid "failed to retrieve motherboard information (fallback mode)" msgstr "" #: core.cpp:2127 msgid "Retrieving CPU temperature in fallback mode" msgstr "" #: core.cpp:2173 msgid "failed to retrieve CPU temperature (fallback mode)" msgstr "" #: core.cpp:2188 msgid "Retrieving CPU voltage in fallback mode" msgstr "" #: core.cpp:2200 msgid "failed to retrieve CPU voltage (fallback mode)" msgstr "" #: core.cpp:2214 msgid "Retrieving CPU frequency in fallback mode" msgstr "" #: core.cpp:2220 msgid "failed to retrieve CPU frequency (fallback mode)" msgstr "" #: daemon_client.cpp:65 msgid "Starting daemon in background…" msgstr "" #: daemon_client.cpp:172 msgid "pkexec: authorization could not be obtained (dialog dismissed)" msgstr "" #: daemon_client.cpp:175 msgid "pkexec: authorization could not be obtained (not authorized)" msgstr "" #: daemon_client.cpp:178 msgid "pkexec: command not found" msgstr "" #: daemon_client.cpp:181 msgid "pkexec: unexpected error code" msgstr "" #: daemon_client.cpp:211 msgid "Connecting to daemon…" msgstr "" #: daemon_server.cpp:261 #, c-format msgid "request_handler: case %i not handled" msgstr "" #: data.cpp:124 cpu-x-gtk-3.12.ui:1370 msgid "CPU" msgstr "" #: data.cpp:187 msgid "P-core" msgstr "" #: data.cpp:188 msgid "E-core" msgstr "" #: data.cpp:189 data.cpp:192 #, fuzzy #| msgid "Core #%i" msgid "Core" msgstr "النواة %i" #: data.cpp:208 cpu-x-gtk-3.12.ui:746 msgid "Processor" msgstr "" #: data.cpp:240 data.cpp:329 cpu-x-gtk-3.12.ui:1968 msgid "Caches" msgstr "" #: data.cpp:247 #, fuzzy, c-format #| msgid "%d x %d %s, %d-way" msgid "%2d x %4d %s, %2d-way" msgstr "%d x %d %s, %d-مسار" #: data.cpp:249 #, c-format msgid "%d %s, %d-way" msgstr "%d%s,%d-طريق" #: data.cpp:263 msgid "Count" msgstr "" #: data.cpp:276 cpu-x-gtk-3.12.ui:968 msgid "Clocks" msgstr "" #: data.cpp:379 data.cpp:383 #, fuzzy, c-format #| msgid "Cache" msgid "L%u Cache" msgstr "الخبيئة" #: data.cpp:385 #, c-format msgid "%s associative, %d-%s line size" msgstr "s% ترابطية ، s-%d% حجم الخط" #: data.cpp:398 msgid "Test" msgstr "" #: data.cpp:409 data.cpp:423 cpu-x-gtk-3.12.ui:2146 cpu-x-gtk-3.12.ui:2517 msgid "Motherboard" msgstr "اللوحة الأم" #: data.cpp:437 cpu-x-gtk-3.12.ui:2367 msgid "BIOS" msgstr "البيوس" #: data.cpp:452 cpu-x-gtk-3.12.ui:2498 msgid "Chipset" msgstr "" #: data.cpp:467 data.cpp:569 cpu-x-gtk-3.12.ui:3156 cpu-x-gtk-3.12.ui:3761 msgid "Memory" msgstr "الذاكرة" #: data.cpp:483 #, c-format msgid "Stick %u" msgstr "" #: data.cpp:487 cpu-x-gtk-3.12.ui:3134 msgid "Sticks" msgstr "" #: data.cpp:541 cpu-x-gtk-3.12.ui:3780 msgid "System" msgstr "النظام" #: data.cpp:554 cpu-x-gtk-3.12.ui:3380 msgid "Operating System" msgstr "نظام التشغيل" #: data.cpp:587 cpu-x-gtk-3.12.ui:4960 msgid "Graphics" msgstr "" #: data.cpp:621 #, c-format msgid "Card %u" msgstr "" #: data.cpp:625 cpu-x-gtk-3.12.ui:4938 msgid "Cards" msgstr "" #: data.cpp:672 cpu-x-gtk-3.12.ui:5300 msgid "Bench" msgstr "" #: data.cpp:685 msgid "Not started" msgstr "لم يبدأ" #: data.cpp:688 cpu-x-gtk-3.12.ui:5070 msgid "Prime numbers (slow)" msgstr "" #: data.cpp:692 cpu-x-gtk-3.12.ui:5178 msgid "Prime numbers (fast)" msgstr "" #: data.cpp:696 cpu-x-gtk-3.12.ui:5281 msgid "Parameters" msgstr "" #: data.cpp:721 data.cpp:727 #, fuzzy, c-format msgid "%u mins" msgstr "%u دقيقة" #: data.cpp:734 cpu-x-gtk-3.12.ui:5444 cpu-x-gtk-3.12.ui:5552 msgid "About" msgstr "" #: data.cpp:739 #, c-format msgid "" "%s is a Free software that gathers information\n" "on CPU, motherboard and more." msgstr "" "%s هو برمجية حرَّة تجمع معلومات عن وحدة\n" "المعالجة المركزية واللوحة الأم وغيرها." #: data.cpp:744 msgid "About CPU-X" msgstr "" #: data.cpp:745 #, c-format msgid "Version %s" msgstr "إصدار %s" #: data.cpp:746 #, c-format msgid "Author: %s" msgstr "المؤلف: %s" #: data.cpp:747 #, c-format msgid "Site: %s" msgstr "الموقع: %s" #: data.cpp:751 cpu-x-gtk-3.12.ui:5533 msgid "License" msgstr "الرخصة" #: data.cpp:753 #, c-format msgid "This software is distributed under the terms of %s" msgstr "توزع هذه البرمجية وفق بنود %s" #: data.cpp:754 main.cpp:176 msgid "This program comes with ABSOLUTELY NO WARRANTY" msgstr "لا يأتي هذا البرنامج بأي ضمان مطلقًا" #: gui_gtk.cpp:61 #, c-format msgid "Cannot find path for '%s' file" msgstr "" #: gui_gtk.cpp:400 msgid "Start daemon" msgstr "" #: gui_gtk.cpp:403 msgid "Connected to daemon" msgstr "" #: gui_gtk.cpp:406 msgid "No polkit authentication agent found" msgstr "" #: gui_gtk.cpp:411 msgid "Ask password to start daemon in background" msgstr "" #: gui_gtk.cpp:415 msgid "Settings" msgstr "" #: gui_gtk.cpp:634 #, fuzzy #| msgid "Family" msgid "BaseFamily" msgstr "العائلة" #: gui_gtk.cpp:635 msgid "CPU display (\"true\") family (computed as BaseFamily+ExtendedFamily)" msgstr "" #: gui_gtk.cpp:636 #, fuzzy #| msgid "Model" msgid "BaseModel" msgstr "الطراز" #: gui_gtk.cpp:637 msgid "CPU display (\"true\") model (computed as (ExtendedModel<<4)+BaseModel)" msgstr "" #: gui_gtk.cpp:847 msgid "" "Identify the physically-labeled socket or board position where the memory " "device is located" msgstr "" #: gui_gtk.cpp:848 msgid "Identify the physically labeled bank where the memory device is located" msgstr "" #: gui_gtk.cpp:1052 #, fuzzy #| msgid "Version" msgid "User Mode Driver Version" msgstr "الإصدار" #: gui_gtk.cpp:1066 msgid "Vulkan Ray Tracing" msgstr "" #: gui_gtk.cpp:1260 msgid "Starting GTK GUI…" msgstr "بدء واجهة GTK…" #: gui_gtk.cpp:1272 msgid "failed to import UI in GtkBuilder" msgstr "تعذَّر استيراد الواجهة الرسومية في GtkBuilder" #: main.cpp:63 msgid "Start graphical user interface (GUI) (default)" msgstr "ابدأ واجهة رسومية (GUI) (المبدئي)" #: main.cpp:64 msgid "Start text-based user interface (TUI)" msgstr "ابدأ واجهة نصية (TUI)" #: main.cpp:65 msgid "Dump all data on standard output and exit" msgstr "اطرح كل البيانات في الخرج القياسي واخرج" #: main.cpp:66 msgid "Run embedded command dmidecode and exit" msgstr "" #: main.cpp:67 msgid "Run embedded command bandwidth and exit" msgstr "" #: main.cpp:68 msgid "Set temperature unit (c[elsius]|f[ahrenheit]|k[elvin]|r[ankine])" msgstr "" #: main.cpp:69 msgid "Set custom time between two refreshes (in seconds)" msgstr "" #: main.cpp:70 msgid "Set default tab (integer)" msgstr "" #: main.cpp:71 msgid "Select core type to monitor (integer)" msgstr "" #: main.cpp:72 msgid "Select CPU core to monitor (integer)" msgstr "" #: main.cpp:73 msgid "Set custom bandwidth test for CPU caches speed (integer)" msgstr "" #: main.cpp:74 #, fuzzy #| msgid "failed to find graphic card driver (%s)" msgid "Select default memory stick (integer)" msgstr "تعذر العثور على تعريف بطاقة الرسومات (%s)" #: main.cpp:75 #, fuzzy #| msgid "failed to find graphic card driver (%s)" msgid "Select default graphic card (integer)" msgstr "تعذر العثور على تعريف بطاقة الرسومات (%s)" #: main.cpp:76 cpu-x-gtk-3.12.ui:5910 msgid "Start and connect to daemon" msgstr "" #: main.cpp:77 msgid "Verbose output" msgstr "خرج تشخيصي" #: main.cpp:78 msgid "Print help and exit" msgstr "اطبع المساعدة واخرج" #: main.cpp:79 msgid "Print version and exit" msgstr "اطبع النسخة واخرج" #: main.cpp:80 msgid "Print CPUID values in decimal (default is hexadeximal)" msgstr "" #: main.cpp:81 msgid "Disable colored output" msgstr "عطِّل الخرج الملون" #: main.cpp:82 msgid "Print information for debugging" msgstr "" #: main.cpp:83 msgid "Print required information to paste in an issue" msgstr "اطبع البيانات لنسخها في قضية" #: main.cpp:84 msgid "Set key mapping for NCurses mode (a[rrows]|e[macs]|i[nverted-T]|v[im])" msgstr "" #: main.cpp:95 msgid "Add default command line arguments" msgstr "" #: main.cpp:96 msgid "Enforce the bus clock" msgstr "" #: main.cpp:97 msgid "" "Ignore CPU values reported by libcpuid (comma-separated values among 'temp', " "'volt' and 'freq')" msgstr "" #: main.cpp:98 msgid "Read CPUID raw data from a given file" msgstr "" #: main.cpp:99 msgid "Only print a message if CPU is not present in the database" msgstr "" #: main.cpp:126 #, c-format msgid "Usage: %s DISPLAY [OPTIONS]\n" msgstr "الاستخدام: %s DISPLAY [OPTIONS]\n" #: main.cpp:127 msgid "Available DISPLAY:" msgstr "" #: main.cpp:135 msgid "Available OPTIONS:" msgstr "" #: main.cpp:144 msgid "Influenceable environment variables:" msgstr "متغيرات البيئة المؤثرة:" #: main.cpp:175 msgid "This is free software: you are free to change and redistribute it." msgstr "هذه البرمجية حرة: لك الحق في تغييرها وتوزيعها." #: main.cpp:177 #, c-format msgid "See the %s license: <%s>\n" msgstr "انظر رخصة%s : <%s>\n" #: main.cpp:184 #, c-format msgid "-- %-9s version: %s" msgstr "" #: main.cpp:381 #, c-format msgid "" "\n" "Oops, something was wrong! %s has received signal %d (%s) and has crashed." msgstr "" #: main.cpp:383 #, c-format msgid "" "\n" "Oops, something was wrong! %s has received signal %d (%s) and is trying to " "recover." msgstr "" #: main.cpp:407 msgid "You can open a new issue here, by filling the template as requested:" msgstr "" #: main.cpp:449 msgid "an error occurred while setting locale" msgstr "" #: options.cpp:124 #, c-format msgid "" "Selected CPU type (%u) is not a valid number (%u is the maximum for this CPU)" msgstr "" "نوع CPU المحدد (u%) ليس رقمًا صالحًا (u% هو الحد الأقصى لوحدة المعالجة " "المركزية هذه)" #: options.cpp:145 #, fuzzy, c-format #| msgid "" #| "Selected CPU type (%u) is not a valid number (%u is the maximum for this " #| "CPU)" msgid "" "Selected bandwidth test (%u) is not a valid number (%u is the maximum for " "this system)" msgstr "" "نوع CPU المحدد (u%) ليس رقمًا صالحًا (u% هو الحد الأقصى لوحدة المعالجة " "المركزية هذه)" #: options.cpp:168 #, fuzzy, c-format #| msgid "" #| "Selected CPU type (%u) is not a valid number (%u is the maximum for this " #| "CPU)" msgid "" "Selected RAM stick (%u) is not a valid number (%u is the maximum for this " "system)" msgstr "" "نوع CPU المحدد (u%) ليس رقمًا صالحًا (u% هو الحد الأقصى لوحدة المعالجة " "المركزية هذه)" #: options.cpp:188 #, fuzzy, c-format #| msgid "" #| "Selected CPU type (%u) is not a valid number (%u is the maximum for this " #| "CPU)" msgid "" "Selected graphic card (%u) is not a valid number (%u is the maximum for this " "system)" msgstr "" "نوع CPU المحدد (u%) ليس رقمًا صالحًا (u% هو الحد الأقصى لوحدة المعالجة " "المركزية هذه)" #: options.cpp:204 #, c-format msgid "failed to change CPU affinitiy to core %u" msgstr "" #: options.cpp:210 #, c-format msgid "" "Selected CPU core (%u) is not a valid number (%u is the maximum for this " "type of core)" msgstr "" #: options.cpp:284 #, fuzzy, c-format #| msgid "" #| "Selected CPU type (%u) is not a valid number (%u is the maximum for this " #| "CPU)" msgid "Selected tab (%u) is not a valid number (%u is the maximum)" msgstr "" "نوع CPU المحدد (u%) ليس رقمًا صالحًا (u% هو الحد الأقصى لوحدة المعالجة " "المركزية هذه)" #: tui_ncurses.cpp:111 msgid "Window is too small!" msgstr "" #: tui_ncurses.cpp:119 msgid "Press 'h' to see help." msgstr "اضغط 'h' لرؤية المساعدة." #: tui_ncurses.cpp:232 #, c-format msgid "Welcome in %s NCurses help!\n" msgstr "" #: tui_ncurses.cpp:233 msgid "This help describes how to use this Text-based User Interface." msgstr "" #: tui_ncurses.cpp:235 msgid "Global keys:" msgstr "" #: tui_ncurses.cpp:236 msgid "Press 'left' key or 'tab' key to switch in left tab." msgstr "" #: tui_ncurses.cpp:237 msgid "Press 'right' key or 'shift + tab' keys to switch in right tab." msgstr "" #: tui_ncurses.cpp:238 msgid "Press 'h' key to see this help." msgstr "اضغط مفتاح 'h' للاطلاع على هذه المساعدة." #: tui_ncurses.cpp:239 msgid "Press 'q' key to exit." msgstr "اضغط مفتاح 'q' للخروج." #: tui_ncurses.cpp:241 msgid "CPU tab:" msgstr "" #: tui_ncurses.cpp:242 msgid "Press 'next page' key to decrease core type number to monitor." msgstr "" #: tui_ncurses.cpp:243 msgid "Press 'previous page' key to increase core type number to monitor." msgstr "" #: tui_ncurses.cpp:244 msgid "Press 'down' key to decrease CPU core number to monitor." msgstr "" #: tui_ncurses.cpp:245 msgid "Press 'up' key to increase CPU core number to monitor." msgstr "" #: tui_ncurses.cpp:247 msgid "Caches tab:" msgstr "تبويبة ذاكرة التخزين المؤقت:" #: tui_ncurses.cpp:248 msgid "Press 'down' key to switch to previous test." msgstr "" #: tui_ncurses.cpp:249 msgid "Press 'up' key to switch to next test." msgstr "اضغط مفتاح 'up' للتبديل للاختبار التالي." #: tui_ncurses.cpp:251 msgid "Bench tab:" msgstr "" #: tui_ncurses.cpp:252 msgid "Press 'down' key to decrement benchmark duration." msgstr "" #: tui_ncurses.cpp:253 msgid "Press 'up' key to increment benchmark duration." msgstr "" #: tui_ncurses.cpp:254 msgid "Press 'next page' key to decrement number of threads to use." msgstr "" #: tui_ncurses.cpp:255 msgid "Press 'previous page' key to increment number of threads to use." msgstr "" #: tui_ncurses.cpp:256 msgid "Press 's' key to start/stop prime numbers (slow) benchmark." msgstr "" #: tui_ncurses.cpp:257 msgid "Press 'f' key to start/stop prime numbers (fast) benchmark." msgstr "" #: tui_ncurses.cpp:259 msgid "Graphics tab:" msgstr "" #: tui_ncurses.cpp:260 msgid "Press 'down' key to switch to previous graphic card." msgstr "" #: tui_ncurses.cpp:261 msgid "Press 'up' key to switch to next graphic card." msgstr "" #: tui_ncurses.cpp:263 msgid "Press any key to exit this help." msgstr "اضغط أي مفتاح للخروج من هذه المساعدة." #: tui_ncurses.cpp:640 msgid "Starting NCurses TUI…" msgstr "بدء NCurses TUI…" #: tui_ncurses.cpp:649 msgid "" "FATAL ERROR: terminfo database could not be found (try to set TERMINFO " "environment variable)" msgstr "" #: tui_ncurses.cpp:654 #, c-format msgid "Failed to set up %s terminal (err=%i); falling back to %s" msgstr "" #: util.cpp:189 #, c-format msgid "cannot find unit in '%s' string at position %i" msgstr "" #: util.cpp:252 #, fuzzy, c-format #| msgid "an error occurred while removing/renaming files" msgid "an error occurred while opening file '%s'" msgstr "حدث خطأ أثناء حذف الملفات وتغيير اسمها" #: util.cpp:297 #, fuzzy, c-format #| msgid "an error occurred while starting benchmark" msgid "an error occurred while running command '%s'" msgstr "حدث خطأ ما أثناء بدء اختبار الأداء" #: util.cpp:437 msgid "set_cpu_affinity() not supported on this operating system" msgstr "" #: data.hpp:103 data.hpp:244 data.hpp:332 msgid "Vendor" msgstr "البائع" #: data.hpp:104 msgid "Code Name" msgstr "" #: data.hpp:105 msgid "Package" msgstr "" #: data.hpp:106 msgid "Technology" msgstr "" #: data.hpp:107 data.hpp:268 msgid "Voltage" msgstr "الفولتية" #: data.hpp:108 msgid "Specification" msgstr "" #: data.hpp:109 msgid "Family" msgstr "العائلة" #: data.hpp:110 #, fuzzy #| msgid "Family" msgid "Disp. Family" msgstr "العائلة" #: data.hpp:111 data.hpp:224 data.hpp:245 data.hpp:335 msgid "Model" msgstr "الطراز" #: data.hpp:112 #, fuzzy #| msgid "Model" msgid "Disp. Model" msgstr "الطراز" #: data.hpp:113 msgid "Temp." msgstr "الحرارة." #: data.hpp:114 msgid "Stepping" msgstr "" #: data.hpp:115 msgid "Instructions" msgstr "" #: data.hpp:125 msgid "L1 Data" msgstr "" #: data.hpp:126 msgid "L1 Inst." msgstr "" #: data.hpp:127 msgid "Level 2" msgstr "" #: data.hpp:128 msgid "Level 3" msgstr "" #: data.hpp:137 cpu-x-gtk-3.12.ui:1232 #, fuzzy #| msgid "Core #%i" msgid "Cores" msgstr "النواة %i" #: data.hpp:138 data.hpp:408 cpu-x-gtk-3.12.ui:1252 msgid "Threads" msgstr "" #: data.hpp:155 msgid "Core Speed" msgstr "سرعة النواة" #: data.hpp:156 msgid "Multiplier" msgstr "" #: data.hpp:157 msgid "Bus Speed" msgstr "سرعة الناقل" #: data.hpp:158 data.hpp:341 msgid "Usage" msgstr "الاستخدام" #: data.hpp:188 data.hpp:265 msgid "Size" msgstr "" #: data.hpp:189 data.hpp:267 msgid "Speed" msgstr "" #: data.hpp:223 data.hpp:259 msgid "Manufacturer" msgstr "الصانع" #: data.hpp:225 msgid "Revision" msgstr "" #: data.hpp:233 msgid "Brand" msgstr "العلامة" #: data.hpp:234 msgid "Version" msgstr "الإصدار" #: data.hpp:235 msgid "Date" msgstr "" #: data.hpp:236 msgid "ROM Size" msgstr "حجم الروم" #: data.hpp:260 msgid "Part Number" msgstr "" #: data.hpp:261 #, fuzzy #| msgid "Core #%i" msgid "Type" msgstr "النواة %i" #: data.hpp:262 #, fuzzy #| msgid "Core #%i" msgid "Type Detail" msgstr "النواة %i" #: data.hpp:263 msgid "Device Locator" msgstr "" #: data.hpp:264 msgid "Bank Locator" msgstr "" #: data.hpp:266 msgid "Rank" msgstr "" #: data.hpp:292 msgid "Name" msgstr "" #: data.hpp:293 msgid "Kernel" msgstr "" #: data.hpp:294 msgid "Hostname" msgstr "اسم المضيف" #: data.hpp:295 msgid "Uptime" msgstr "" #: data.hpp:303 msgid "Used" msgstr "" #: data.hpp:304 msgid "Buffers" msgstr "" #: data.hpp:305 msgid "Cached" msgstr "" #: data.hpp:306 msgid "Free" msgstr "" #: data.hpp:307 msgid "Swap" msgstr "الإبدال" #: data.hpp:333 msgid "Driver" msgstr "تعريف" #: data.hpp:334 #, fuzzy #| msgid "Version" msgid "UMD Version" msgstr "الإصدار" #: data.hpp:336 msgid "Compute Unit" msgstr "" #: data.hpp:337 msgid "Device ID" msgstr "" #: data.hpp:338 #, fuzzy #| msgid "Version" msgid "VBIOS Version" msgstr "الإصدار" #. #-#-#-#-# source_ui.pot (cpu-x ) #-#-#-#-# #. Setting: "Interface" tab #: data.hpp:339 cpu-x-gtk-3.12.ui:5807 msgid "Interface" msgstr "" #: data.hpp:340 msgid "Temperature" msgstr "درجة الحرارة" #: data.hpp:342 #, fuzzy #| msgid "Voltage" msgid "Core Voltage" msgstr "الفولتية" #: data.hpp:343 msgid "Power Avg" msgstr "" #: data.hpp:344 msgid "Core Clock" msgstr "" #: data.hpp:345 #, fuzzy #| msgid "Memory" msgid "Memory Clock" msgstr "الذاكرة" #: data.hpp:346 #, fuzzy #| msgid "Memory" msgid "Memory Used" msgstr "الذاكرة" #: data.hpp:347 msgid "Resizable BAR" msgstr "ميزة Resizable BAR" #: data.hpp:348 msgid "Vulkan RT" msgstr "" #: data.hpp:349 #, fuzzy #| msgid "Version" msgid "OpenGL Version" msgstr "الإصدار" #: data.hpp:350 #, fuzzy #| msgid "Version" msgid "Vulkan Version" msgstr "الإصدار" #: data.hpp:351 #, fuzzy #| msgid "Version" msgid "OpenCL Version" msgstr "الإصدار" #: data.hpp:387 msgid "Score" msgstr "" #: data.hpp:388 msgid "Run" msgstr "" #: data.hpp:407 msgid "Duration" msgstr "المدة" #: util.hpp:77 msgid "bytes" msgstr "" #. TRANSLATORS: initials for kilobyte (10³): please put initials (keep it short) #: util.hpp:80 msgid "kB" msgstr "" #. TRANSLATORS: initials for megabyte (10⁶): please put initials (keep it short) #: util.hpp:82 msgid "MB" msgstr "" #. TRANSLATORS: initials for gigabyte (10⁹): please put initials (keep it short) #: util.hpp:84 msgid "GB" msgstr "" #. TRANSLATORS: initials for terabyte (10¹²): please put initials (keep it short) #: util.hpp:86 msgid "TB" msgstr "" #. TRANSLATORS: initials for kibibyte (2¹⁰): please put initials (keep it short) #: util.hpp:89 msgid "KiB" msgstr "" #. TRANSLATORS: initials for mebibyte (2²⁰): please put initials (keep it short) #: util.hpp:91 msgid "MiB" msgstr "" #. TRANSLATORS: initials for gibibyte (2³⁰): please put initials (keep it short) #: util.hpp:93 msgid "GiB" msgstr "" #. TRANSLATORS: initials for tebibyte (2⁴⁰): please put initials (keep it short) #: util.hpp:95 msgid "TiB" msgstr "" #: cpu-x-gtk-3.12.ui:1184 msgid "Cache" msgstr "الخبيئة" #. Setting: refresh time for UI #: cpu-x-gtk-3.12.ui:5721 msgid "Refresh time" msgstr "" #. Setting: GUI theme #: cpu-x-gtk-3.12.ui:5745 msgid "Text theme" msgstr "" #. Setting: automatic GUI theme #: cpu-x-gtk-3.12.ui:5760 msgid "Automatic" msgstr "" #. Setting: light GUI theme #: cpu-x-gtk-3.12.ui:5761 msgid "Blue for light theme" msgstr "" #. Setting: dark GUI theme #: cpu-x-gtk-3.12.ui:5762 msgid "Yellow for dark theme" msgstr "" #. Setting: temperature unit #: cpu-x-gtk-3.12.ui:5775 #, fuzzy #| msgid "Temperature" msgid "Temperature unit" msgstr "درجة الحرارة" #. Setting: default tab at startup #: cpu-x-gtk-3.12.ui:5826 msgid "Default tab" msgstr "" #. Setting: default CPU core at startup #: cpu-x-gtk-3.12.ui:5839 msgid "Default CPU core" msgstr "" #. Setting: default cache test at startup #: cpu-x-gtk-3.12.ui:5852 msgid "Default cache test" msgstr "" #. Setting: print CPUID values in decimal or hexadecimal #: cpu-x-gtk-3.12.ui:5895 msgid "Print CPUID values in decimal" msgstr "" #. Setting: default graphic card at startup #: cpu-x-gtk-3.12.ui:5928 #, fuzzy #| msgid "failed to find graphic card driver (%s)" msgid "Default graphic card" msgstr "تعذر العثور على تعريف بطاقة الرسومات (%s)" #. Setting: default CPU core at startup #: cpu-x-gtk-3.12.ui:5952 msgid "Default core type" msgstr "" #. Setting: default graphic card at startup #: cpu-x-gtk-3.12.ui:5976 msgid "Default memory stick" msgstr "" #. Setting: "Startup" tab #: cpu-x-gtk-3.12.ui:6004 msgid "Startup" msgstr "" #~ msgid "Calculating CPU multipliers" #~ msgstr "حساب مضاعفات وحدة المعالجة المركزية" #~ msgid "failed to retrieve GPU clocks" #~ msgstr "فشل في استرداد سرعات GPU" #, c-format #~ msgid "Core #%i" #~ msgstr "النواة %i" #~ msgid "Distribution" #~ msgstr "التوزيعة" #~ msgid "Compiler" #~ msgstr "المصرِّف" #~ msgid "Dumping data…" #~ msgstr "طرح البيانات…" #~ msgid "Freeing memory" #~ msgstr "يحرر الذاكرة" #, fuzzy, c-format #~| msgid "failed to call libcpuid (%s)" #~ msgid "failed to call wordexp (%i)" #~ msgstr "تعذر استدعاء libcpuid (%s)" #~ msgid "Press 'home' key to scroll up in a page." #~ msgstr "اضغط مفتاح 'Home' لتمرير الصفحة للأعلى." #~ msgid "Press 'end' key to scroll down in a page." #~ msgstr "اضغط مفتاح 'End' لتمرير الصفحة للأسفل." #, fuzzy #~| msgid "could not reallocate memory" #~ msgid "FATAL ERROR: could not allocate memory" #~ msgstr "لا يمكن تحديد الذاكرة" #, fuzzy, c-format #~| msgid "failed to call dmidecode" #~ msgid "failed to call vkEnumerateInstanceExtensionProperties (%s)" #~ msgstr "فشل استدعاء دميديكودي" #, fuzzy #~| msgid "failed to call dmidecode" #~ msgid "faild to call clGetDeviceIDs" #~ msgstr "فشل استدعاء دميديكودي" #~ msgid "Exiting %s" #~ msgstr "الخروج %s" #~ msgid "Skip CPU MSR opening (need to be root)" #~ msgstr "تجاهل فتح CPU msr (يحتاج روت)" #~ msgid "failed to open CPU MSR (%s)" #~ msgstr "فشل في فتح وحدة المعالجة المركزية MSR (%s)" #~ msgid "Skip call to dmidecode (need to be root)" #~ msgstr "تخطي الدعوة إلى دميديكودي (تحتاج إلى أن يكون الجذر)" #~ msgid "failed to allocate memory for dmidecode" #~ msgstr "فشل في تخصيص الذاكرة دميديكودي" #~ msgid "Finding graphic card driver" #~ msgstr "يبحث عن تعريف بطاقة الرسومات" #~ msgid "(%s driver)" #~ msgstr "(تعريف %s)" #~ msgid "Retrieving GPU temperature" #~ msgstr "إسترجاع درجة حرارة المعالج" #~ msgid "Off" #~ msgstr "مُطفأ" #~ msgid "failed to retrieve GPU temperature" #~ msgstr "تعذر جلب درجة حرارة وحدة معالجة الرسوميات" #~ msgid "Skip some GPU values (need to be root)" #~ msgstr "تخطي بعض قيم بطاقة الرسوميات (تحتاج إلى صلاحيات الروت)" #~ msgid "failed to allocate memory for benchmark" #~ msgstr "فشلت عملية حجز الذاكرة من أجل اختبار الأداء" #~ msgid "Root privileges are required to work properly" #~ msgstr "تحتاج امتيازات الجذر للعمل كما ينبغي" #~ msgid "Some information will not be retrievable" #~ msgstr "قد لا تستطيع جلب بعض المعلومات" #~ msgid "Ignore" #~ msgstr "تجاهل" #~ msgid "Run as root" #~ msgstr "شغَّل بحساب الجذر" #~ msgid "A new version of %s is available!" #~ msgstr "النسخة الجديدة %s متاحة!" #~ msgid "" #~ "Do you want to update %s to version %s after exit?\n" #~ "It will erase this binary file (%s) by the new version." #~ msgstr "" #~ "أتريد تحديث %s إلى الإصدارة %s بعد الخروج؟\n" #~ "النسخة الجديدة قد تمحو هذا الملف الثنائي (%s)." #~ msgid "Not now" #~ msgstr "ليس الآن" #~ msgid "Update" #~ msgstr "حدِّث" #~ msgid "Checking on Internet for a new version..." #~ msgstr "يلتمس نسخة جديدة في الشابكة..." #~ msgid "failed to open a Curl session" #~ msgstr "تعذر فتح جلسة Curl" #~ msgid "(version %s is available)" #~ msgstr "(الإصدار %s متاح)" #~ msgid "No new version available" #~ msgstr "لا إصدار جديد متاح" #~ msgid "an error occurred while extracting %s archive (%s)" #~ msgstr "حدث خطأ أثناء استخراج الأرشيف %s (%s)" #~ msgid "" #~ "Network access is disabled by environment variable (set CPUX_NETWORK with " #~ "a positive value to enable it)" #~ msgstr "" #~ "النفاذ إلى الشبكة معطل بمتغير بيئة (أسند قيمة موجبة إلى CPUX_NETWORK " #~ "لتفعيله)" #~ msgid "failed to open %s archive for writing" #~ msgstr "تعذر فتح الأرشيف %s للكتابة" #~ msgid "Downloading new version..." #~ msgstr "ينزل الإصدار الجديد..." #~ msgid "failed to download %s archive (%s)" #~ msgstr "تعذر تنزيل الأرشيف %s (%s)" #~ msgid "Extracting new version..." #~ msgstr "يستخرج الإصدار الجديد..." #~ msgid "Applying new version..." #~ msgstr "يطبق الإصدار الجديد..." #~ msgid "Update successful!" #~ msgstr "نجح التحديث!" #~ msgid "Temporarily disable network support" #~ msgstr "عطِّل دعم الشبكة مؤقتا" #~ msgid "Built on %s, %s (with %s %s on %s)." #~ msgstr "مبني على %s، %s (مع %s %s على %s)." #~ msgid "" #~ "Sorry, you cannot update %s: 32-bit portable version is no more supported." #~ msgstr "عذرًا، فلا يمكننا تحديث %s: نسخة 32 بتة المحمولة لم تعد مدعومة." CPU-X-5.0.3/po/ber.po000066400000000000000000000602471454622605200141200ustar00rootroot00000000000000# CPU-X translations template # Copyright © 2014-2024 The Tumultuous Unicorn Of Darkness # This file is distributed under the same license as the cpu-x package. # Hakim Oubouali , 2020. msgid "" msgstr "" "Project-Id-Version: cpu-x\n" "Report-Msgid-Bugs-To: https://github.com/TheTumultuousUnicornOfDarkness/CPU-" "X/issues\n" "POT-Creation-Date: 2023-12-09 13:09+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: Automatically generated\n" "Language-Team: none\n" "Language: ber\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: core.cpp:135 msgid "Finding CPU technology" msgstr "" #: core.cpp:161 #, c-format msgid "" "Your CPU is not present in the database ==> %s, model: %i, ext. model: %i, " "ext. family: %i" msgstr "" #: core.cpp:189 data.cpp:150 data.cpp:342 msgid "unknown" msgstr "" #: core.cpp:230 msgid "Calling libcpuid for retrieving static data" msgstr "" #: core.cpp:245 #, c-format msgid "failed to call libcpuid (%s)" msgstr "" #: core.cpp:340 msgid "Calling libcpuid for retrieving dynamic data" msgstr "" #: core.cpp:353 msgid "Calling libcpuid for retrieving CPU MSR static values" msgstr "" #: core.cpp:380 msgid "Calling libcpuid for retrieving CPU MSR dynamic values" msgstr "" #: core.cpp:412 msgid "Calling dmidecode" msgstr "" #: core.cpp:454 core.cpp:473 #, c-format msgid "%s (configured)" msgstr "" #: core.cpp:461 core.cpp:480 #, c-format msgid "%s (max)" msgstr "" #: core.cpp:466 #, c-format msgid "%s (min)" msgstr "" #: core.cpp:496 msgid "Calculating CPU usage" msgstr "" #: core.cpp:546 msgid "Calling bandwidth" msgstr "" #: core.cpp:613 #, c-format msgid "" "pci_access is not properly initialized: it is a common issue when %s was " "built with a lower libpci version.\n" "Check that libpci %s library is present on your system. Otherwise, please " "rebuild %s." msgstr "" #: core.cpp:657 #, c-format msgid "No kernel driver in use for graphic card at path %s" msgstr "" #: core.cpp:693 #, c-format msgid "Your GPU kernel driver is unknown: %s" msgstr "" #: core.cpp:777 #, c-format msgid "Your GPU user mode driver is unknown for vendor %s: %s" msgstr "" #: core.cpp:781 #, c-format msgid "failed to call GLFW (%i): %s" msgstr "" #: core.cpp:914 msgid "Finding Vulkan API version" msgstr "" #: core.cpp:926 #, c-format msgid "failed to call vkCreateInstance (%s)" msgstr "" #: core.cpp:929 #, c-format msgid "%s is not supported" msgstr "" #: core.cpp:937 #, c-format msgid "failed to call vkEnumeratePhysicalDevices (%s)" msgstr "" #: core.cpp:944 msgid "No available Vulkan devices" msgstr "" #: core.cpp:952 #, c-format msgid "No available physical devices (%s)" msgstr "" #: core.cpp:1015 #, c-format msgid "Failed to create Vulkan for device %u (%s)" msgstr "" #: core.cpp:1019 #, c-format msgid "%s is not supported for device %u, use only deviceID for matching" msgstr "" #: core.cpp:1051 core.cpp:1364 msgid "Enabled" msgstr "" #: core.cpp:1051 core.cpp:1364 msgid "Disabled" msgstr "" #: core.cpp:1088 msgid "Finding OpenCL API version" msgstr "" #: core.cpp:1092 #, c-format msgid "There is no platform with OpenCL support (%s)" msgstr "" #: core.cpp:1102 #, c-format msgid "failed to get all OpenCL platforms (%s)" msgstr "" #: core.cpp:1115 #, c-format msgid "failed to get name for platform %u (%s)" msgstr "" #: core.cpp:1123 #, c-format msgid "failed to get version for platform %u (%s)" msgstr "" #: core.cpp:1131 #, c-format msgid "failed to find number of OpenCL devices for platform '%s %s' (%s)" msgstr "" #: core.cpp:1131 msgid "0 device" msgstr "" #: core.cpp:1140 #, c-format msgid "failed to get all of OpenCL devices for platform '%s %s' (%s)" msgstr "" #: core.cpp:1160 #, c-format msgid "failed to get name for device %u (%s)" msgstr "" #: core.cpp:1168 #, c-format msgid "failed to get version for device %u (%s)" msgstr "" #: core.cpp:1190 #, c-format msgid "OpenCL driver for '%s %s' does not support CL_DEVICE_TOPOLOGY_AMD (%s)" msgstr "" #: core.cpp:1201 #, c-format msgid "" "OpenCL driver for '%s %s' does not support CL_DEVICE_GFXIP_MAJOR_AMD (%s)" msgstr "" #: core.cpp:1209 core.cpp:1229 core.cpp:1262 #, c-format msgid "" "OpenCL driver for '%s %s' does not support CL_DEVICE_MAX_COMPUTE_UNITS (%s)" msgstr "" #: core.cpp:1250 #, c-format msgid "" "OpenCL driver for '%s %s' does not support CL_DEVICE_PCI_DOMAIN_ID_NV (%s), " "CL_DEVICE_PCI_BUS_ID_NV (%s) or CL_DEVICE_PCI_SLOT_ID_NV (%s)" msgstr "" #: core.cpp:1273 #, c-format msgid "OpenCL is not supported with your GPU vendor (0x%X)" msgstr "" #: core.cpp:1295 msgid "Finding devices" msgstr "" #: core.cpp:1307 #, c-format msgid "Skip devices search (wrong permissions on %s device)" msgstr "" #: core.cpp:1350 #, c-format msgid "Your GPU vendor is unknown: %s (0x%X)" msgstr "" #: core.cpp:1370 msgid "failed to find chipset vendor and model" msgstr "" #: core.cpp:1385 msgid "failed to find graphic card vendor and model" msgstr "" #: core.cpp:1487 msgid "Retrieving GPU clocks" msgstr "" #: core.cpp:1500 msgid "None" msgstr "" #: core.cpp:1509 #, c-format msgid "DRM path for %s is unknown" msgstr "" #: core.cpp:1516 #, c-format msgid "Card number for %s is unknown" msgstr "" #: core.cpp:1541 #, c-format msgid "PCIe %s (current) / %s (max)" msgstr "" #: core.cpp:1650 #, c-format msgid "Driver for %s doesn't report frequencies" msgstr "" #: core.cpp:1671 #, c-format msgid "failed to retrieve all monitoring data for %s" msgstr "" #: core.cpp:1694 msgid "Identifying running system" msgstr "" #: core.cpp:1697 msgid "failed to identify running system" msgstr "" #: core.cpp:1749 core.cpp:1778 msgid "Calling libprocps" msgstr "" #: core.cpp:1752 msgid "unable to get system uptime" msgstr "" #: core.cpp:1758 msgid "unable to create meminfo structure" msgstr "" #: core.cpp:1804 msgid "Calling libstatgrab" msgstr "" #: core.cpp:1852 #, c-format msgid "%i days, %i hours, %i minutes, %i seconds" msgstr "" #: core.cpp:1915 msgid "Updating benchmark status" msgstr "" #: core.cpp:1918 msgid "Active" msgstr "" #: core.cpp:1921 #, c-format msgid "(%u hours left)" msgstr "" #: core.cpp:1923 #, c-format msgid "(%u minutes left)" msgstr "" #: core.cpp:1925 #, c-format msgid "(%u seconds left)" msgstr "" #: core.cpp:1929 core.cpp:1984 core.cpp:1985 msgid "Inactive" msgstr "" #: core.cpp:1932 #, c-format msgid "in %u hours" msgstr "" #: core.cpp:1934 #, c-format msgid "in %u minutes" msgstr "" #: core.cpp:1936 #, c-format msgid "in %u seconds" msgstr "" #: core.cpp:1953 #, c-format msgid "Starting benchmark with %u threads" msgstr "" #: core.cpp:1976 msgid "an error occurred while starting benchmark" msgstr "" #: core.cpp:2002 msgid "Finding CPU package in fallback mode" msgstr "" #: core.cpp:2032 #, c-format msgid "Your CPU socket is not present in the database ==> %s, codename: %s" msgstr "" #: core.cpp:2052 msgid "Calculating CPU multipliers in fallback mode" msgstr "" #: core.cpp:2072 msgid "Retrieving motherboard information in fallback mode" msgstr "" #: core.cpp:2085 msgid "failed to retrieve motherboard information (fallback mode)" msgstr "" #: core.cpp:2127 msgid "Retrieving CPU temperature in fallback mode" msgstr "" #: core.cpp:2173 msgid "failed to retrieve CPU temperature (fallback mode)" msgstr "" #: core.cpp:2188 msgid "Retrieving CPU voltage in fallback mode" msgstr "" #: core.cpp:2200 msgid "failed to retrieve CPU voltage (fallback mode)" msgstr "" #: core.cpp:2214 msgid "Retrieving CPU frequency in fallback mode" msgstr "" #: core.cpp:2220 msgid "failed to retrieve CPU frequency (fallback mode)" msgstr "" #: daemon_client.cpp:65 msgid "Starting daemon in background…" msgstr "" #: daemon_client.cpp:172 msgid "pkexec: authorization could not be obtained (dialog dismissed)" msgstr "" #: daemon_client.cpp:175 msgid "pkexec: authorization could not be obtained (not authorized)" msgstr "" #: daemon_client.cpp:178 msgid "pkexec: command not found" msgstr "" #: daemon_client.cpp:181 msgid "pkexec: unexpected error code" msgstr "" #: daemon_client.cpp:211 msgid "Connecting to daemon…" msgstr "" #: daemon_server.cpp:261 #, c-format msgid "request_handler: case %i not handled" msgstr "" #: data.cpp:124 cpu-x-gtk-3.12.ui:1370 msgid "CPU" msgstr "" #: data.cpp:187 msgid "P-core" msgstr "" #: data.cpp:188 msgid "E-core" msgstr "" #: data.cpp:189 data.cpp:192 msgid "Core" msgstr "" #: data.cpp:208 cpu-x-gtk-3.12.ui:746 msgid "Processor" msgstr "" #: data.cpp:240 data.cpp:329 cpu-x-gtk-3.12.ui:1968 msgid "Caches" msgstr "" #: data.cpp:247 #, c-format msgid "%2d x %4d %s, %2d-way" msgstr "" #: data.cpp:249 #, c-format msgid "%d %s, %d-way" msgstr "" #: data.cpp:263 msgid "Count" msgstr "" #: data.cpp:276 cpu-x-gtk-3.12.ui:968 msgid "Clocks" msgstr "" #: data.cpp:379 data.cpp:383 #, c-format msgid "L%u Cache" msgstr "" #: data.cpp:385 #, c-format msgid "%s associative, %d-%s line size" msgstr "" #: data.cpp:398 msgid "Test" msgstr "" #: data.cpp:409 data.cpp:423 cpu-x-gtk-3.12.ui:2146 cpu-x-gtk-3.12.ui:2517 msgid "Motherboard" msgstr "" #: data.cpp:437 cpu-x-gtk-3.12.ui:2367 msgid "BIOS" msgstr "" #: data.cpp:452 cpu-x-gtk-3.12.ui:2498 msgid "Chipset" msgstr "" #: data.cpp:467 data.cpp:569 cpu-x-gtk-3.12.ui:3156 cpu-x-gtk-3.12.ui:3761 msgid "Memory" msgstr "" #: data.cpp:483 #, c-format msgid "Stick %u" msgstr "" #: data.cpp:487 cpu-x-gtk-3.12.ui:3134 msgid "Sticks" msgstr "" #: data.cpp:541 cpu-x-gtk-3.12.ui:3780 msgid "System" msgstr "" #: data.cpp:554 cpu-x-gtk-3.12.ui:3380 msgid "Operating System" msgstr "" #: data.cpp:587 cpu-x-gtk-3.12.ui:4960 msgid "Graphics" msgstr "" #: data.cpp:621 #, c-format msgid "Card %u" msgstr "" #: data.cpp:625 cpu-x-gtk-3.12.ui:4938 msgid "Cards" msgstr "" #: data.cpp:672 cpu-x-gtk-3.12.ui:5300 msgid "Bench" msgstr "" #: data.cpp:685 msgid "Not started" msgstr "" #: data.cpp:688 cpu-x-gtk-3.12.ui:5070 msgid "Prime numbers (slow)" msgstr "" #: data.cpp:692 cpu-x-gtk-3.12.ui:5178 msgid "Prime numbers (fast)" msgstr "" #: data.cpp:696 cpu-x-gtk-3.12.ui:5281 msgid "Parameters" msgstr "" #: data.cpp:721 data.cpp:727 #, c-format msgid "%u mins" msgstr "" #: data.cpp:734 cpu-x-gtk-3.12.ui:5444 cpu-x-gtk-3.12.ui:5552 msgid "About" msgstr "" #: data.cpp:739 #, c-format msgid "" "%s is a Free software that gathers information\n" "on CPU, motherboard and more." msgstr "" #: data.cpp:744 msgid "About CPU-X" msgstr "" #: data.cpp:745 #, c-format msgid "Version %s" msgstr "" #: data.cpp:746 #, c-format msgid "Author: %s" msgstr "" #: data.cpp:747 #, c-format msgid "Site: %s" msgstr "" #: data.cpp:751 cpu-x-gtk-3.12.ui:5533 msgid "License" msgstr "" #: data.cpp:753 #, c-format msgid "This software is distributed under the terms of %s" msgstr "" #: data.cpp:754 main.cpp:176 msgid "This program comes with ABSOLUTELY NO WARRANTY" msgstr "" #: gui_gtk.cpp:61 #, c-format msgid "Cannot find path for '%s' file" msgstr "" #: gui_gtk.cpp:400 msgid "Start daemon" msgstr "" #: gui_gtk.cpp:403 msgid "Connected to daemon" msgstr "" #: gui_gtk.cpp:406 msgid "No polkit authentication agent found" msgstr "" #: gui_gtk.cpp:411 msgid "Ask password to start daemon in background" msgstr "" #: gui_gtk.cpp:415 msgid "Settings" msgstr "" #: gui_gtk.cpp:634 msgid "BaseFamily" msgstr "" #: gui_gtk.cpp:635 msgid "CPU display (\"true\") family (computed as BaseFamily+ExtendedFamily)" msgstr "" #: gui_gtk.cpp:636 msgid "BaseModel" msgstr "" #: gui_gtk.cpp:637 msgid "CPU display (\"true\") model (computed as (ExtendedModel<<4)+BaseModel)" msgstr "" #: gui_gtk.cpp:847 msgid "" "Identify the physically-labeled socket or board position where the memory " "device is located" msgstr "" #: gui_gtk.cpp:848 msgid "Identify the physically labeled bank where the memory device is located" msgstr "" #: gui_gtk.cpp:1052 msgid "User Mode Driver Version" msgstr "" #: gui_gtk.cpp:1066 msgid "Vulkan Ray Tracing" msgstr "" #: gui_gtk.cpp:1260 msgid "Starting GTK GUI…" msgstr "" #: gui_gtk.cpp:1272 msgid "failed to import UI in GtkBuilder" msgstr "" #: main.cpp:63 msgid "Start graphical user interface (GUI) (default)" msgstr "" #: main.cpp:64 msgid "Start text-based user interface (TUI)" msgstr "" #: main.cpp:65 msgid "Dump all data on standard output and exit" msgstr "" #: main.cpp:66 msgid "Run embedded command dmidecode and exit" msgstr "" #: main.cpp:67 msgid "Run embedded command bandwidth and exit" msgstr "" #: main.cpp:68 msgid "Set temperature unit (c[elsius]|f[ahrenheit]|k[elvin]|r[ankine])" msgstr "" #: main.cpp:69 msgid "Set custom time between two refreshes (in seconds)" msgstr "" #: main.cpp:70 msgid "Set default tab (integer)" msgstr "" #: main.cpp:71 msgid "Select core type to monitor (integer)" msgstr "" #: main.cpp:72 msgid "Select CPU core to monitor (integer)" msgstr "" #: main.cpp:73 msgid "Set custom bandwidth test for CPU caches speed (integer)" msgstr "" #: main.cpp:74 msgid "Select default memory stick (integer)" msgstr "" #: main.cpp:75 msgid "Select default graphic card (integer)" msgstr "" #: main.cpp:76 cpu-x-gtk-3.12.ui:5910 msgid "Start and connect to daemon" msgstr "" #: main.cpp:77 msgid "Verbose output" msgstr "" #: main.cpp:78 msgid "Print help and exit" msgstr "" #: main.cpp:79 msgid "Print version and exit" msgstr "" #: main.cpp:80 msgid "Print CPUID values in decimal (default is hexadeximal)" msgstr "" #: main.cpp:81 msgid "Disable colored output" msgstr "" #: main.cpp:82 msgid "Print information for debugging" msgstr "" #: main.cpp:83 msgid "Print required information to paste in an issue" msgstr "" #: main.cpp:84 msgid "Set key mapping for NCurses mode (a[rrows]|e[macs]|i[nverted-T]|v[im])" msgstr "" #: main.cpp:95 msgid "Add default command line arguments" msgstr "" #: main.cpp:96 msgid "Enforce the bus clock" msgstr "" #: main.cpp:97 msgid "" "Ignore CPU values reported by libcpuid (comma-separated values among 'temp', " "'volt' and 'freq')" msgstr "" #: main.cpp:98 msgid "Read CPUID raw data from a given file" msgstr "" #: main.cpp:99 msgid "Only print a message if CPU is not present in the database" msgstr "" #: main.cpp:126 #, c-format msgid "Usage: %s DISPLAY [OPTIONS]\n" msgstr "" #: main.cpp:127 msgid "Available DISPLAY:" msgstr "" #: main.cpp:135 msgid "Available OPTIONS:" msgstr "" #: main.cpp:144 msgid "Influenceable environment variables:" msgstr "" #: main.cpp:175 msgid "This is free software: you are free to change and redistribute it." msgstr "" #: main.cpp:177 #, c-format msgid "See the %s license: <%s>\n" msgstr "" #: main.cpp:184 #, c-format msgid "-- %-9s version: %s" msgstr "" #: main.cpp:381 #, c-format msgid "" "\n" "Oops, something was wrong! %s has received signal %d (%s) and has crashed." msgstr "" #: main.cpp:383 #, c-format msgid "" "\n" "Oops, something was wrong! %s has received signal %d (%s) and is trying to " "recover." msgstr "" #: main.cpp:407 msgid "You can open a new issue here, by filling the template as requested:" msgstr "" #: main.cpp:449 msgid "an error occurred while setting locale" msgstr "" #: options.cpp:124 #, c-format msgid "" "Selected CPU type (%u) is not a valid number (%u is the maximum for this CPU)" msgstr "" #: options.cpp:145 #, c-format msgid "" "Selected bandwidth test (%u) is not a valid number (%u is the maximum for " "this system)" msgstr "" #: options.cpp:168 #, c-format msgid "" "Selected RAM stick (%u) is not a valid number (%u is the maximum for this " "system)" msgstr "" #: options.cpp:188 #, c-format msgid "" "Selected graphic card (%u) is not a valid number (%u is the maximum for this " "system)" msgstr "" #: options.cpp:204 #, c-format msgid "failed to change CPU affinitiy to core %u" msgstr "" #: options.cpp:210 #, c-format msgid "" "Selected CPU core (%u) is not a valid number (%u is the maximum for this " "type of core)" msgstr "" #: options.cpp:284 #, c-format msgid "Selected tab (%u) is not a valid number (%u is the maximum)" msgstr "" #: tui_ncurses.cpp:111 msgid "Window is too small!" msgstr "" #: tui_ncurses.cpp:119 msgid "Press 'h' to see help." msgstr "" #: tui_ncurses.cpp:232 #, c-format msgid "Welcome in %s NCurses help!\n" msgstr "" #: tui_ncurses.cpp:233 msgid "This help describes how to use this Text-based User Interface." msgstr "" #: tui_ncurses.cpp:235 msgid "Global keys:" msgstr "" #: tui_ncurses.cpp:236 msgid "Press 'left' key or 'tab' key to switch in left tab." msgstr "" #: tui_ncurses.cpp:237 msgid "Press 'right' key or 'shift + tab' keys to switch in right tab." msgstr "" #: tui_ncurses.cpp:238 msgid "Press 'h' key to see this help." msgstr "" #: tui_ncurses.cpp:239 msgid "Press 'q' key to exit." msgstr "" #: tui_ncurses.cpp:241 msgid "CPU tab:" msgstr "" #: tui_ncurses.cpp:242 msgid "Press 'next page' key to decrease core type number to monitor." msgstr "" #: tui_ncurses.cpp:243 msgid "Press 'previous page' key to increase core type number to monitor." msgstr "" #: tui_ncurses.cpp:244 msgid "Press 'down' key to decrease CPU core number to monitor." msgstr "" #: tui_ncurses.cpp:245 msgid "Press 'up' key to increase CPU core number to monitor." msgstr "" #: tui_ncurses.cpp:247 msgid "Caches tab:" msgstr "" #: tui_ncurses.cpp:248 msgid "Press 'down' key to switch to previous test." msgstr "" #: tui_ncurses.cpp:249 msgid "Press 'up' key to switch to next test." msgstr "" #: tui_ncurses.cpp:251 msgid "Bench tab:" msgstr "" #: tui_ncurses.cpp:252 msgid "Press 'down' key to decrement benchmark duration." msgstr "" #: tui_ncurses.cpp:253 msgid "Press 'up' key to increment benchmark duration." msgstr "" #: tui_ncurses.cpp:254 msgid "Press 'next page' key to decrement number of threads to use." msgstr "" #: tui_ncurses.cpp:255 msgid "Press 'previous page' key to increment number of threads to use." msgstr "" #: tui_ncurses.cpp:256 msgid "Press 's' key to start/stop prime numbers (slow) benchmark." msgstr "" #: tui_ncurses.cpp:257 msgid "Press 'f' key to start/stop prime numbers (fast) benchmark." msgstr "" #: tui_ncurses.cpp:259 msgid "Graphics tab:" msgstr "" #: tui_ncurses.cpp:260 msgid "Press 'down' key to switch to previous graphic card." msgstr "" #: tui_ncurses.cpp:261 msgid "Press 'up' key to switch to next graphic card." msgstr "" #: tui_ncurses.cpp:263 msgid "Press any key to exit this help." msgstr "" #: tui_ncurses.cpp:640 msgid "Starting NCurses TUI…" msgstr "" #: tui_ncurses.cpp:649 msgid "" "FATAL ERROR: terminfo database could not be found (try to set TERMINFO " "environment variable)" msgstr "" #: tui_ncurses.cpp:654 #, c-format msgid "Failed to set up %s terminal (err=%i); falling back to %s" msgstr "" #: util.cpp:189 #, c-format msgid "cannot find unit in '%s' string at position %i" msgstr "" #: util.cpp:252 #, c-format msgid "an error occurred while opening file '%s'" msgstr "" #: util.cpp:297 #, c-format msgid "an error occurred while running command '%s'" msgstr "" #: util.cpp:437 msgid "set_cpu_affinity() not supported on this operating system" msgstr "" #: data.hpp:103 data.hpp:244 data.hpp:332 msgid "Vendor" msgstr "" #: data.hpp:104 msgid "Code Name" msgstr "" #: data.hpp:105 msgid "Package" msgstr "" #: data.hpp:106 msgid "Technology" msgstr "" #: data.hpp:107 data.hpp:268 msgid "Voltage" msgstr "" #: data.hpp:108 msgid "Specification" msgstr "" #: data.hpp:109 msgid "Family" msgstr "" #: data.hpp:110 msgid "Disp. Family" msgstr "" #: data.hpp:111 data.hpp:224 data.hpp:245 data.hpp:335 msgid "Model" msgstr "" #: data.hpp:112 msgid "Disp. Model" msgstr "" #: data.hpp:113 msgid "Temp." msgstr "" #: data.hpp:114 msgid "Stepping" msgstr "" #: data.hpp:115 msgid "Instructions" msgstr "" #: data.hpp:125 msgid "L1 Data" msgstr "" #: data.hpp:126 msgid "L1 Inst." msgstr "" #: data.hpp:127 msgid "Level 2" msgstr "" #: data.hpp:128 msgid "Level 3" msgstr "" #: data.hpp:137 cpu-x-gtk-3.12.ui:1232 msgid "Cores" msgstr "" #: data.hpp:138 data.hpp:408 cpu-x-gtk-3.12.ui:1252 msgid "Threads" msgstr "" #: data.hpp:155 msgid "Core Speed" msgstr "" #: data.hpp:156 msgid "Multiplier" msgstr "" #: data.hpp:157 msgid "Bus Speed" msgstr "" #: data.hpp:158 data.hpp:341 msgid "Usage" msgstr "" #: data.hpp:188 data.hpp:265 msgid "Size" msgstr "" #: data.hpp:189 data.hpp:267 msgid "Speed" msgstr "" #: data.hpp:223 data.hpp:259 msgid "Manufacturer" msgstr "" #: data.hpp:225 msgid "Revision" msgstr "" #: data.hpp:233 msgid "Brand" msgstr "" #: data.hpp:234 msgid "Version" msgstr "" #: data.hpp:235 msgid "Date" msgstr "" #: data.hpp:236 msgid "ROM Size" msgstr "" #: data.hpp:260 msgid "Part Number" msgstr "" #: data.hpp:261 msgid "Type" msgstr "" #: data.hpp:262 msgid "Type Detail" msgstr "" #: data.hpp:263 msgid "Device Locator" msgstr "" #: data.hpp:264 msgid "Bank Locator" msgstr "" #: data.hpp:266 msgid "Rank" msgstr "" #: data.hpp:292 msgid "Name" msgstr "" #: data.hpp:293 msgid "Kernel" msgstr "" #: data.hpp:294 msgid "Hostname" msgstr "" #: data.hpp:295 msgid "Uptime" msgstr "" #: data.hpp:303 msgid "Used" msgstr "" #: data.hpp:304 msgid "Buffers" msgstr "" #: data.hpp:305 msgid "Cached" msgstr "" #: data.hpp:306 msgid "Free" msgstr "" #: data.hpp:307 msgid "Swap" msgstr "" #: data.hpp:333 msgid "Driver" msgstr "" #: data.hpp:334 msgid "UMD Version" msgstr "" #: data.hpp:336 msgid "Compute Unit" msgstr "" #: data.hpp:337 msgid "Device ID" msgstr "" #: data.hpp:338 msgid "VBIOS Version" msgstr "" #. #-#-#-#-# source_ui.pot (cpu-x ) #-#-#-#-# #. Setting: "Interface" tab #: data.hpp:339 cpu-x-gtk-3.12.ui:5807 msgid "Interface" msgstr "" #: data.hpp:340 msgid "Temperature" msgstr "" #: data.hpp:342 msgid "Core Voltage" msgstr "" #: data.hpp:343 msgid "Power Avg" msgstr "" #: data.hpp:344 msgid "Core Clock" msgstr "" #: data.hpp:345 msgid "Memory Clock" msgstr "" #: data.hpp:346 msgid "Memory Used" msgstr "" #: data.hpp:347 msgid "Resizable BAR" msgstr "" #: data.hpp:348 msgid "Vulkan RT" msgstr "" #: data.hpp:349 msgid "OpenGL Version" msgstr "" #: data.hpp:350 msgid "Vulkan Version" msgstr "" #: data.hpp:351 msgid "OpenCL Version" msgstr "" #: data.hpp:387 msgid "Score" msgstr "" #: data.hpp:388 msgid "Run" msgstr "" #: data.hpp:407 msgid "Duration" msgstr "" #: util.hpp:77 msgid "bytes" msgstr "" #. TRANSLATORS: initials for kilobyte (10³): please put initials (keep it short) #: util.hpp:80 msgid "kB" msgstr "" #. TRANSLATORS: initials for megabyte (10⁶): please put initials (keep it short) #: util.hpp:82 msgid "MB" msgstr "" #. TRANSLATORS: initials for gigabyte (10⁹): please put initials (keep it short) #: util.hpp:84 msgid "GB" msgstr "" #. TRANSLATORS: initials for terabyte (10¹²): please put initials (keep it short) #: util.hpp:86 msgid "TB" msgstr "" #. TRANSLATORS: initials for kibibyte (2¹⁰): please put initials (keep it short) #: util.hpp:89 msgid "KiB" msgstr "" #. TRANSLATORS: initials for mebibyte (2²⁰): please put initials (keep it short) #: util.hpp:91 msgid "MiB" msgstr "" #. TRANSLATORS: initials for gibibyte (2³⁰): please put initials (keep it short) #: util.hpp:93 msgid "GiB" msgstr "" #. TRANSLATORS: initials for tebibyte (2⁴⁰): please put initials (keep it short) #: util.hpp:95 msgid "TiB" msgstr "" #: cpu-x-gtk-3.12.ui:1184 msgid "Cache" msgstr "" #. Setting: refresh time for UI #: cpu-x-gtk-3.12.ui:5721 msgid "Refresh time" msgstr "" #. Setting: GUI theme #: cpu-x-gtk-3.12.ui:5745 msgid "Text theme" msgstr "" #. Setting: automatic GUI theme #: cpu-x-gtk-3.12.ui:5760 msgid "Automatic" msgstr "" #. Setting: light GUI theme #: cpu-x-gtk-3.12.ui:5761 msgid "Blue for light theme" msgstr "" #. Setting: dark GUI theme #: cpu-x-gtk-3.12.ui:5762 msgid "Yellow for dark theme" msgstr "" #. Setting: temperature unit #: cpu-x-gtk-3.12.ui:5775 msgid "Temperature unit" msgstr "" #. Setting: default tab at startup #: cpu-x-gtk-3.12.ui:5826 msgid "Default tab" msgstr "" #. Setting: default CPU core at startup #: cpu-x-gtk-3.12.ui:5839 msgid "Default CPU core" msgstr "" #. Setting: default cache test at startup #: cpu-x-gtk-3.12.ui:5852 msgid "Default cache test" msgstr "" #. Setting: print CPUID values in decimal or hexadecimal #: cpu-x-gtk-3.12.ui:5895 msgid "Print CPUID values in decimal" msgstr "" #. Setting: default graphic card at startup #: cpu-x-gtk-3.12.ui:5928 msgid "Default graphic card" msgstr "" #. Setting: default CPU core at startup #: cpu-x-gtk-3.12.ui:5952 msgid "Default core type" msgstr "" #. Setting: default graphic card at startup #: cpu-x-gtk-3.12.ui:5976 msgid "Default memory stick" msgstr "" #. Setting: "Startup" tab #: cpu-x-gtk-3.12.ui:6004 msgid "Startup" msgstr "" CPU-X-5.0.3/po/bg.po000066400000000000000000000702121454622605200137310ustar00rootroot00000000000000# CPU-X translations template # Copyright © 2014-2024 The Tumultuous Unicorn Of Darkness # This file is distributed under the same license as the cpu-x package. # Georgi Georgiev , 2021. msgid "" msgstr "" "Project-Id-Version: cpu-x\n" "Report-Msgid-Bugs-To: https://github.com/TheTumultuousUnicornOfDarkness/CPU-" "X/issues\n" "POT-Creation-Date: 2023-12-09 13:09+0100\n" "PO-Revision-Date: 2021-09-15 16:34+0000\n" "Last-Translator: Georgi Georgiev \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 4.9-dev\n" #: core.cpp:135 msgid "Finding CPU technology" msgstr "" #: core.cpp:161 #, c-format msgid "" "Your CPU is not present in the database ==> %s, model: %i, ext. model: %i, " "ext. family: %i" msgstr "" #: core.cpp:189 data.cpp:150 data.cpp:342 msgid "unknown" msgstr "" #: core.cpp:230 msgid "Calling libcpuid for retrieving static data" msgstr "" #: core.cpp:245 #, c-format msgid "failed to call libcpuid (%s)" msgstr "" #: core.cpp:340 msgid "Calling libcpuid for retrieving dynamic data" msgstr "" #: core.cpp:353 msgid "Calling libcpuid for retrieving CPU MSR static values" msgstr "" #: core.cpp:380 msgid "Calling libcpuid for retrieving CPU MSR dynamic values" msgstr "" #: core.cpp:412 msgid "Calling dmidecode" msgstr "" #: core.cpp:454 core.cpp:473 #, c-format msgid "%s (configured)" msgstr "" #: core.cpp:461 core.cpp:480 #, c-format msgid "%s (max)" msgstr "" #: core.cpp:466 #, c-format msgid "%s (min)" msgstr "" #: core.cpp:496 msgid "Calculating CPU usage" msgstr "" #: core.cpp:546 msgid "Calling bandwidth" msgstr "" #: core.cpp:613 #, c-format msgid "" "pci_access is not properly initialized: it is a common issue when %s was " "built with a lower libpci version.\n" "Check that libpci %s library is present on your system. Otherwise, please " "rebuild %s." msgstr "" #: core.cpp:657 #, c-format msgid "No kernel driver in use for graphic card at path %s" msgstr "" #: core.cpp:693 #, c-format msgid "Your GPU kernel driver is unknown: %s" msgstr "" #: core.cpp:777 #, c-format msgid "Your GPU user mode driver is unknown for vendor %s: %s" msgstr "" #: core.cpp:781 #, c-format msgid "failed to call GLFW (%i): %s" msgstr "" #: core.cpp:914 #, fuzzy #| msgid "Version" msgid "Finding Vulkan API version" msgstr "Версия" #: core.cpp:926 #, c-format msgid "failed to call vkCreateInstance (%s)" msgstr "" #: core.cpp:929 #, c-format msgid "%s is not supported" msgstr "" #: core.cpp:937 #, c-format msgid "failed to call vkEnumeratePhysicalDevices (%s)" msgstr "" #: core.cpp:944 msgid "No available Vulkan devices" msgstr "" #: core.cpp:952 #, c-format msgid "No available physical devices (%s)" msgstr "" #: core.cpp:1015 #, c-format msgid "Failed to create Vulkan for device %u (%s)" msgstr "" #: core.cpp:1019 #, c-format msgid "%s is not supported for device %u, use only deviceID for matching" msgstr "" #: core.cpp:1051 core.cpp:1364 msgid "Enabled" msgstr "" #: core.cpp:1051 core.cpp:1364 msgid "Disabled" msgstr "" #: core.cpp:1088 #, fuzzy #| msgid "Version" msgid "Finding OpenCL API version" msgstr "Версия" #: core.cpp:1092 #, c-format msgid "There is no platform with OpenCL support (%s)" msgstr "" #: core.cpp:1102 #, c-format msgid "failed to get all OpenCL platforms (%s)" msgstr "" #: core.cpp:1115 #, c-format msgid "failed to get name for platform %u (%s)" msgstr "" #: core.cpp:1123 #, c-format msgid "failed to get version for platform %u (%s)" msgstr "" #: core.cpp:1131 #, c-format msgid "failed to find number of OpenCL devices for platform '%s %s' (%s)" msgstr "" #: core.cpp:1131 #, fuzzy #| msgid "DeviceID" msgid "0 device" msgstr "Идентификатор" #: core.cpp:1140 #, c-format msgid "failed to get all of OpenCL devices for platform '%s %s' (%s)" msgstr "" #: core.cpp:1160 #, c-format msgid "failed to get name for device %u (%s)" msgstr "" #: core.cpp:1168 #, c-format msgid "failed to get version for device %u (%s)" msgstr "" #: core.cpp:1190 #, c-format msgid "OpenCL driver for '%s %s' does not support CL_DEVICE_TOPOLOGY_AMD (%s)" msgstr "Драйверът на OpenCL за „%s %s“ не поддържа CL_DEVICE_TOPOLOGY_AMD (%s)" #: core.cpp:1201 #, c-format msgid "" "OpenCL driver for '%s %s' does not support CL_DEVICE_GFXIP_MAJOR_AMD (%s)" msgstr "" "Драйверът на OpenCL за „%s %s“ не поддържа CL_DEVICE_GFXIP_MAJOR_AMD (%s)" #: core.cpp:1209 core.cpp:1229 core.cpp:1262 #, c-format msgid "" "OpenCL driver for '%s %s' does not support CL_DEVICE_MAX_COMPUTE_UNITS (%s)" msgstr "" "Драйверът на OpenCL за „%s %s“ не поддържа CL_DEVICE_MAX_COMPUTE_UNITS (%s)" #: core.cpp:1250 #, c-format msgid "" "OpenCL driver for '%s %s' does not support CL_DEVICE_PCI_DOMAIN_ID_NV (%s), " "CL_DEVICE_PCI_BUS_ID_NV (%s) or CL_DEVICE_PCI_SLOT_ID_NV (%s)" msgstr "" "Драйверът на OpenCL за „%s %s“ не поддържа CL_DEVICE_PCI_DOMAIN_ID_NV (%s), " "CL_DEVICE_PCI_BUS_ID_NV (%s) или CL_DEVICE_PCI_SLOT_ID_NV (%s)" #: core.cpp:1273 #, c-format msgid "OpenCL is not supported with your GPU vendor (0x%X)" msgstr "Вашата видеокарта не поддържа OpenCL (0x%X)" #: core.cpp:1295 msgid "Finding devices" msgstr "" #: core.cpp:1307 #, c-format msgid "Skip devices search (wrong permissions on %s device)" msgstr "" #: core.cpp:1350 #, c-format msgid "Your GPU vendor is unknown: %s (0x%X)" msgstr "" #: core.cpp:1370 msgid "failed to find chipset vendor and model" msgstr "" #: core.cpp:1385 msgid "failed to find graphic card vendor and model" msgstr "" #: core.cpp:1487 msgid "Retrieving GPU clocks" msgstr "" #: core.cpp:1500 msgid "None" msgstr "" #: core.cpp:1509 #, c-format msgid "DRM path for %s is unknown" msgstr "" #: core.cpp:1516 #, c-format msgid "Card number for %s is unknown" msgstr "" #: core.cpp:1541 #, c-format msgid "PCIe %s (current) / %s (max)" msgstr "" #: core.cpp:1650 #, c-format msgid "Driver for %s doesn't report frequencies" msgstr "" #: core.cpp:1671 #, c-format msgid "failed to retrieve all monitoring data for %s" msgstr "" #: core.cpp:1694 msgid "Identifying running system" msgstr "" #: core.cpp:1697 msgid "failed to identify running system" msgstr "" #: core.cpp:1749 core.cpp:1778 msgid "Calling libprocps" msgstr "" #: core.cpp:1752 msgid "unable to get system uptime" msgstr "" #: core.cpp:1758 msgid "unable to create meminfo structure" msgstr "" #: core.cpp:1804 msgid "Calling libstatgrab" msgstr "" #: core.cpp:1852 #, c-format msgid "%i days, %i hours, %i minutes, %i seconds" msgstr "" #: core.cpp:1915 msgid "Updating benchmark status" msgstr "" #: core.cpp:1918 msgid "Active" msgstr "" #: core.cpp:1921 #, c-format msgid "(%u hours left)" msgstr "(остават %u часа)" #: core.cpp:1923 #, c-format msgid "(%u minutes left)" msgstr "(остават %u минути)" #: core.cpp:1925 #, c-format msgid "(%u seconds left)" msgstr "(остават %u секунди)" #: core.cpp:1929 core.cpp:1984 core.cpp:1985 msgid "Inactive" msgstr "" #: core.cpp:1932 #, c-format msgid "in %u hours" msgstr "за %u часа" #: core.cpp:1934 #, c-format msgid "in %u minutes" msgstr "за %u минути" #: core.cpp:1936 #, c-format msgid "in %u seconds" msgstr "за %u секунди" #: core.cpp:1953 #, c-format msgid "Starting benchmark with %u threads" msgstr "" #: core.cpp:1976 msgid "an error occurred while starting benchmark" msgstr "" #: core.cpp:2002 msgid "Finding CPU package in fallback mode" msgstr "" #: core.cpp:2032 #, c-format msgid "Your CPU socket is not present in the database ==> %s, codename: %s" msgstr "" #: core.cpp:2052 msgid "Calculating CPU multipliers in fallback mode" msgstr "" #: core.cpp:2072 msgid "Retrieving motherboard information in fallback mode" msgstr "" #: core.cpp:2085 msgid "failed to retrieve motherboard information (fallback mode)" msgstr "" #: core.cpp:2127 msgid "Retrieving CPU temperature in fallback mode" msgstr "" #: core.cpp:2173 msgid "failed to retrieve CPU temperature (fallback mode)" msgstr "" #: core.cpp:2188 msgid "Retrieving CPU voltage in fallback mode" msgstr "" #: core.cpp:2200 msgid "failed to retrieve CPU voltage (fallback mode)" msgstr "" #: core.cpp:2214 msgid "Retrieving CPU frequency in fallback mode" msgstr "" #: core.cpp:2220 msgid "failed to retrieve CPU frequency (fallback mode)" msgstr "" #: daemon_client.cpp:65 msgid "Starting daemon in background…" msgstr "" #: daemon_client.cpp:172 msgid "pkexec: authorization could not be obtained (dialog dismissed)" msgstr "" #: daemon_client.cpp:175 msgid "pkexec: authorization could not be obtained (not authorized)" msgstr "" #: daemon_client.cpp:178 msgid "pkexec: command not found" msgstr "" #: daemon_client.cpp:181 msgid "pkexec: unexpected error code" msgstr "" #: daemon_client.cpp:211 msgid "Connecting to daemon…" msgstr "" #: daemon_server.cpp:261 #, c-format msgid "request_handler: case %i not handled" msgstr "" #: data.cpp:124 cpu-x-gtk-3.12.ui:1370 msgid "CPU" msgstr "ЦП" #: data.cpp:187 #, fuzzy #| msgid "Score" msgid "P-core" msgstr "Резултат" #: data.cpp:188 #, fuzzy #| msgid "Score" msgid "E-core" msgstr "Резултат" #: data.cpp:189 data.cpp:192 #, fuzzy #| msgid "Core(s)" msgid "Core" msgstr "Ядра" #: data.cpp:208 cpu-x-gtk-3.12.ui:746 msgid "Processor" msgstr "Процесор" #: data.cpp:240 data.cpp:329 cpu-x-gtk-3.12.ui:1968 msgid "Caches" msgstr "Кешпамет" #: data.cpp:247 #, c-format msgid "%2d x %4d %s, %2d-way" msgstr "" #: data.cpp:249 #, c-format msgid "%d %s, %d-way" msgstr "" #: data.cpp:263 msgid "Count" msgstr "" #: data.cpp:276 cpu-x-gtk-3.12.ui:968 msgid "Clocks" msgstr "Честота" #: data.cpp:379 data.cpp:383 #, fuzzy, c-format #| msgid "L%i Cache" msgid "L%u Cache" msgstr "Кеш Н%i" #: data.cpp:385 #, c-format msgid "%s associative, %d-%s line size" msgstr "" #: data.cpp:398 msgid "Test" msgstr "Проверка" #: data.cpp:409 data.cpp:423 cpu-x-gtk-3.12.ui:2146 cpu-x-gtk-3.12.ui:2517 msgid "Motherboard" msgstr "Дънна платка" #: data.cpp:437 cpu-x-gtk-3.12.ui:2367 msgid "BIOS" msgstr "BIOS" #: data.cpp:452 cpu-x-gtk-3.12.ui:2498 msgid "Chipset" msgstr "Чипсет" #: data.cpp:467 data.cpp:569 cpu-x-gtk-3.12.ui:3156 cpu-x-gtk-3.12.ui:3761 msgid "Memory" msgstr "Оперативна памет" #: data.cpp:483 #, c-format msgid "Stick %u" msgstr "" #: data.cpp:487 cpu-x-gtk-3.12.ui:3134 msgid "Sticks" msgstr "" #: data.cpp:541 cpu-x-gtk-3.12.ui:3780 msgid "System" msgstr "Система" #: data.cpp:554 cpu-x-gtk-3.12.ui:3380 msgid "Operating System" msgstr "Операционна система" #: data.cpp:587 cpu-x-gtk-3.12.ui:4960 msgid "Graphics" msgstr "Видеокарта" #: data.cpp:621 #, fuzzy, c-format #| msgid "Card %i" msgid "Card %u" msgstr "Карта %i" #: data.cpp:625 cpu-x-gtk-3.12.ui:4938 msgid "Cards" msgstr "Карти" #: data.cpp:672 cpu-x-gtk-3.12.ui:5300 msgid "Bench" msgstr "Анализ" #: data.cpp:685 msgid "Not started" msgstr "" #: data.cpp:688 cpu-x-gtk-3.12.ui:5070 msgid "Prime numbers (slow)" msgstr "Прости числа (бавно)" #: data.cpp:692 cpu-x-gtk-3.12.ui:5178 msgid "Prime numbers (fast)" msgstr "Прости числа (бързо)" #: data.cpp:696 cpu-x-gtk-3.12.ui:5281 msgid "Parameters" msgstr "Параметри" #: data.cpp:721 data.cpp:727 #, c-format msgid "%u mins" msgstr "%u минути" #: data.cpp:734 cpu-x-gtk-3.12.ui:5444 cpu-x-gtk-3.12.ui:5552 msgid "About" msgstr "Относно" #: data.cpp:739 #, c-format msgid "" "%s is a Free software that gathers information\n" "on CPU, motherboard and more." msgstr "" "%s е свободен софтуер, който събира информация\n" "за Вашия компютър." #: data.cpp:744 #, fuzzy #| msgid "About" msgid "About CPU-X" msgstr "Относно" #: data.cpp:745 #, c-format msgid "Version %s" msgstr "Версия %s" #: data.cpp:746 #, c-format msgid "Author: %s" msgstr "Автор: %s" #: data.cpp:747 #, c-format msgid "Site: %s" msgstr "Сайт: %s" #: data.cpp:751 cpu-x-gtk-3.12.ui:5533 msgid "License" msgstr "Лиценз" #: data.cpp:753 #, c-format msgid "This software is distributed under the terms of %s" msgstr "" #: data.cpp:754 main.cpp:176 msgid "This program comes with ABSOLUTELY NO WARRANTY" msgstr "" #: gui_gtk.cpp:61 #, c-format msgid "Cannot find path for '%s' file" msgstr "" #: gui_gtk.cpp:400 msgid "Start daemon" msgstr "" #: gui_gtk.cpp:403 msgid "Connected to daemon" msgstr "" #: gui_gtk.cpp:406 msgid "No polkit authentication agent found" msgstr "" #: gui_gtk.cpp:411 msgid "Ask password to start daemon in background" msgstr "" #: gui_gtk.cpp:415 msgid "Settings" msgstr "" #: gui_gtk.cpp:634 msgid "BaseFamily" msgstr "" #: gui_gtk.cpp:635 msgid "CPU display (\"true\") family (computed as BaseFamily+ExtendedFamily)" msgstr "" #: gui_gtk.cpp:636 msgid "BaseModel" msgstr "" #: gui_gtk.cpp:637 msgid "CPU display (\"true\") model (computed as (ExtendedModel<<4)+BaseModel)" msgstr "" #: gui_gtk.cpp:847 msgid "" "Identify the physically-labeled socket or board position where the memory " "device is located" msgstr "" #: gui_gtk.cpp:848 msgid "Identify the physically labeled bank where the memory device is located" msgstr "" #: gui_gtk.cpp:1052 msgid "User Mode Driver Version" msgstr "" #: gui_gtk.cpp:1066 msgid "Vulkan Ray Tracing" msgstr "" #: gui_gtk.cpp:1260 msgid "Starting GTK GUI…" msgstr "" #: gui_gtk.cpp:1272 msgid "failed to import UI in GtkBuilder" msgstr "" #: main.cpp:63 msgid "Start graphical user interface (GUI) (default)" msgstr "" #: main.cpp:64 msgid "Start text-based user interface (TUI)" msgstr "" #: main.cpp:65 msgid "Dump all data on standard output and exit" msgstr "" #: main.cpp:66 msgid "Run embedded command dmidecode and exit" msgstr "" #: main.cpp:67 msgid "Run embedded command bandwidth and exit" msgstr "" #: main.cpp:68 msgid "Set temperature unit (c[elsius]|f[ahrenheit]|k[elvin]|r[ankine])" msgstr "" #: main.cpp:69 msgid "Set custom time between two refreshes (in seconds)" msgstr "" #: main.cpp:70 msgid "Set default tab (integer)" msgstr "" #: main.cpp:71 msgid "Select core type to monitor (integer)" msgstr "" #: main.cpp:72 msgid "Select CPU core to monitor (integer)" msgstr "" #: main.cpp:73 msgid "Set custom bandwidth test for CPU caches speed (integer)" msgstr "" #: main.cpp:74 msgid "Select default memory stick (integer)" msgstr "" #: main.cpp:75 msgid "Select default graphic card (integer)" msgstr "" #: main.cpp:76 cpu-x-gtk-3.12.ui:5910 msgid "Start and connect to daemon" msgstr "" #: main.cpp:77 msgid "Verbose output" msgstr "" #: main.cpp:78 msgid "Print help and exit" msgstr "" #: main.cpp:79 msgid "Print version and exit" msgstr "" #: main.cpp:80 msgid "Print CPUID values in decimal (default is hexadeximal)" msgstr "" #: main.cpp:81 msgid "Disable colored output" msgstr "" #: main.cpp:82 msgid "Print information for debugging" msgstr "" #: main.cpp:83 msgid "Print required information to paste in an issue" msgstr "" #: main.cpp:84 msgid "Set key mapping for NCurses mode (a[rrows]|e[macs]|i[nverted-T]|v[im])" msgstr "" #: main.cpp:95 msgid "Add default command line arguments" msgstr "" #: main.cpp:96 msgid "Enforce the bus clock" msgstr "" #: main.cpp:97 msgid "" "Ignore CPU values reported by libcpuid (comma-separated values among 'temp', " "'volt' and 'freq')" msgstr "" #: main.cpp:98 msgid "Read CPUID raw data from a given file" msgstr "" #: main.cpp:99 msgid "Only print a message if CPU is not present in the database" msgstr "" #: main.cpp:126 #, c-format msgid "Usage: %s DISPLAY [OPTIONS]\n" msgstr "" #: main.cpp:127 msgid "Available DISPLAY:" msgstr "" #: main.cpp:135 msgid "Available OPTIONS:" msgstr "" #: main.cpp:144 msgid "Influenceable environment variables:" msgstr "" #: main.cpp:175 msgid "This is free software: you are free to change and redistribute it." msgstr "" #: main.cpp:177 #, c-format msgid "See the %s license: <%s>\n" msgstr "" #: main.cpp:184 #, c-format msgid "-- %-9s version: %s" msgstr "" #: main.cpp:381 #, c-format msgid "" "\n" "Oops, something was wrong! %s has received signal %d (%s) and has crashed." msgstr "" #: main.cpp:383 #, c-format msgid "" "\n" "Oops, something was wrong! %s has received signal %d (%s) and is trying to " "recover." msgstr "" #: main.cpp:407 msgid "You can open a new issue here, by filling the template as requested:" msgstr "" #: main.cpp:449 msgid "an error occurred while setting locale" msgstr "" #: options.cpp:124 #, c-format msgid "" "Selected CPU type (%u) is not a valid number (%u is the maximum for this CPU)" msgstr "" #: options.cpp:145 #, c-format msgid "" "Selected bandwidth test (%u) is not a valid number (%u is the maximum for " "this system)" msgstr "" #: options.cpp:168 #, c-format msgid "" "Selected RAM stick (%u) is not a valid number (%u is the maximum for this " "system)" msgstr "" #: options.cpp:188 #, c-format msgid "" "Selected graphic card (%u) is not a valid number (%u is the maximum for this " "system)" msgstr "" #: options.cpp:204 #, c-format msgid "failed to change CPU affinitiy to core %u" msgstr "" #: options.cpp:210 #, c-format msgid "" "Selected CPU core (%u) is not a valid number (%u is the maximum for this " "type of core)" msgstr "" #: options.cpp:284 #, c-format msgid "Selected tab (%u) is not a valid number (%u is the maximum)" msgstr "" #: tui_ncurses.cpp:111 msgid "Window is too small!" msgstr "Прозорецът е твърде малък!" #: tui_ncurses.cpp:119 msgid "Press 'h' to see help." msgstr "Натиснете „h“ за помощ." #: tui_ncurses.cpp:232 #, c-format msgid "Welcome in %s NCurses help!\n" msgstr "" #: tui_ncurses.cpp:233 msgid "This help describes how to use this Text-based User Interface." msgstr "" #: tui_ncurses.cpp:235 msgid "Global keys:" msgstr "" #: tui_ncurses.cpp:236 msgid "Press 'left' key or 'tab' key to switch in left tab." msgstr "" #: tui_ncurses.cpp:237 msgid "Press 'right' key or 'shift + tab' keys to switch in right tab." msgstr "" #: tui_ncurses.cpp:238 msgid "Press 'h' key to see this help." msgstr "" #: tui_ncurses.cpp:239 msgid "Press 'q' key to exit." msgstr "Натиснете клавиша „q“ за излизане." #: tui_ncurses.cpp:241 msgid "CPU tab:" msgstr "" #: tui_ncurses.cpp:242 msgid "Press 'next page' key to decrease core type number to monitor." msgstr "" #: tui_ncurses.cpp:243 msgid "Press 'previous page' key to increase core type number to monitor." msgstr "" #: tui_ncurses.cpp:244 msgid "Press 'down' key to decrease CPU core number to monitor." msgstr "" #: tui_ncurses.cpp:245 msgid "Press 'up' key to increase CPU core number to monitor." msgstr "" #: tui_ncurses.cpp:247 msgid "Caches tab:" msgstr "" #: tui_ncurses.cpp:248 msgid "Press 'down' key to switch to previous test." msgstr "" #: tui_ncurses.cpp:249 #, fuzzy #| msgid "Press 'q' key to exit." msgid "Press 'up' key to switch to next test." msgstr "Натиснете клавиша „q“ за излизане." #: tui_ncurses.cpp:251 msgid "Bench tab:" msgstr "" #: tui_ncurses.cpp:252 msgid "Press 'down' key to decrement benchmark duration." msgstr "" #: tui_ncurses.cpp:253 msgid "Press 'up' key to increment benchmark duration." msgstr "" #: tui_ncurses.cpp:254 msgid "Press 'next page' key to decrement number of threads to use." msgstr "" #: tui_ncurses.cpp:255 msgid "Press 'previous page' key to increment number of threads to use." msgstr "" #: tui_ncurses.cpp:256 msgid "Press 's' key to start/stop prime numbers (slow) benchmark." msgstr "" #: tui_ncurses.cpp:257 msgid "Press 'f' key to start/stop prime numbers (fast) benchmark." msgstr "" #: tui_ncurses.cpp:259 msgid "Graphics tab:" msgstr "" #: tui_ncurses.cpp:260 msgid "Press 'down' key to switch to previous graphic card." msgstr "" #: tui_ncurses.cpp:261 msgid "Press 'up' key to switch to next graphic card." msgstr "" #: tui_ncurses.cpp:263 msgid "Press any key to exit this help." msgstr "" #: tui_ncurses.cpp:640 msgid "Starting NCurses TUI…" msgstr "" #: tui_ncurses.cpp:649 msgid "" "FATAL ERROR: terminfo database could not be found (try to set TERMINFO " "environment variable)" msgstr "" #: tui_ncurses.cpp:654 #, c-format msgid "Failed to set up %s terminal (err=%i); falling back to %s" msgstr "" #: util.cpp:189 #, c-format msgid "cannot find unit in '%s' string at position %i" msgstr "" #: util.cpp:252 #, c-format msgid "an error occurred while opening file '%s'" msgstr "" #: util.cpp:297 #, c-format msgid "an error occurred while running command '%s'" msgstr "" #: util.cpp:437 msgid "set_cpu_affinity() not supported on this operating system" msgstr "" #: data.hpp:103 data.hpp:244 data.hpp:332 msgid "Vendor" msgstr "Производител" #: data.hpp:104 msgid "Code Name" msgstr "Кодово име" #: data.hpp:105 msgid "Package" msgstr "Гнездо" #: data.hpp:106 msgid "Technology" msgstr "Технология" #: data.hpp:107 data.hpp:268 msgid "Voltage" msgstr "Волтаж" #: data.hpp:108 msgid "Specification" msgstr "Спецификация" #: data.hpp:109 msgid "Family" msgstr "Семейство" #: data.hpp:110 msgid "Disp. Family" msgstr "Доп. семейство" #: data.hpp:111 data.hpp:224 data.hpp:245 data.hpp:335 msgid "Model" msgstr "Модел" #: data.hpp:112 msgid "Disp. Model" msgstr "Доп. модел" #: data.hpp:113 msgid "Temp." msgstr "Темп." #: data.hpp:114 msgid "Stepping" msgstr "Ревизия" #: data.hpp:115 msgid "Instructions" msgstr "Инструкции" #: data.hpp:125 msgid "L1 Data" msgstr "Н1 — данни" #: data.hpp:126 msgid "L1 Inst." msgstr "Н1 — инстр." #: data.hpp:127 msgid "Level 2" msgstr "Ниво 2" #: data.hpp:128 msgid "Level 3" msgstr "Ниво 3" #: data.hpp:137 cpu-x-gtk-3.12.ui:1232 #, fuzzy #| msgid "Core(s)" msgid "Cores" msgstr "Ядра" #: data.hpp:138 data.hpp:408 cpu-x-gtk-3.12.ui:1252 msgid "Threads" msgstr "Нишки" #: data.hpp:155 msgid "Core Speed" msgstr "Ядро" #: data.hpp:156 msgid "Multiplier" msgstr "Коефициент" #: data.hpp:157 msgid "Bus Speed" msgstr "Шина" #: data.hpp:158 data.hpp:341 msgid "Usage" msgstr "Използване" #: data.hpp:188 data.hpp:265 msgid "Size" msgstr "Размер" #: data.hpp:189 data.hpp:267 msgid "Speed" msgstr "Скорост" #: data.hpp:223 data.hpp:259 msgid "Manufacturer" msgstr "Производител" #: data.hpp:225 msgid "Revision" msgstr "Ревизия" #: data.hpp:233 msgid "Brand" msgstr "Марка" #: data.hpp:234 msgid "Version" msgstr "Версия" #: data.hpp:235 msgid "Date" msgstr "Дата" #: data.hpp:236 msgid "ROM Size" msgstr "Размер на ROM" #: data.hpp:260 msgid "Part Number" msgstr "" #: data.hpp:261 #, fuzzy #| msgid "Core #%i" msgid "Type" msgstr "Ядро №%i" #: data.hpp:262 #, fuzzy #| msgid "Core #%i" msgid "Type Detail" msgstr "Ядро №%i" #: data.hpp:263 msgid "Device Locator" msgstr "" #: data.hpp:264 msgid "Bank Locator" msgstr "" #: data.hpp:266 msgid "Rank" msgstr "" #: data.hpp:292 #, fuzzy #| msgid "Code Name" msgid "Name" msgstr "Кодово име" #: data.hpp:293 msgid "Kernel" msgstr "Ядро" #: data.hpp:294 msgid "Hostname" msgstr "Име на компютъра" #: data.hpp:295 msgid "Uptime" msgstr "Време на работа" #: data.hpp:303 msgid "Used" msgstr "Използвана" #: data.hpp:304 msgid "Buffers" msgstr "Буферирана" #: data.hpp:305 msgid "Cached" msgstr "Кеширана" #: data.hpp:306 msgid "Free" msgstr "Свободна" #: data.hpp:307 msgid "Swap" msgstr "Виртуална" #: data.hpp:333 msgid "Driver" msgstr "Драйвер" #: data.hpp:334 msgid "UMD Version" msgstr "Версия на UMD" #: data.hpp:336 msgid "Compute Unit" msgstr "Изчислителна единица" #: data.hpp:337 #, fuzzy #| msgid "DeviceID" msgid "Device ID" msgstr "Идентификатор" #: data.hpp:338 #, fuzzy #| msgid "Version" msgid "VBIOS Version" msgstr "Версия" #. #-#-#-#-# source_ui.pot (cpu-x ) #-#-#-#-# #. Setting: "Interface" tab #: data.hpp:339 cpu-x-gtk-3.12.ui:5807 msgid "Interface" msgstr "Интерфейс" #: data.hpp:340 msgid "Temperature" msgstr "Температура" #: data.hpp:342 msgid "Core Voltage" msgstr "Волтаж на ядрото" #: data.hpp:343 msgid "Power Avg" msgstr "Средно напрежение" #: data.hpp:344 #, fuzzy #| msgid "Memory clock" msgid "Core Clock" msgstr "Честота на паметта" #: data.hpp:345 #, fuzzy #| msgid "Memory clock" msgid "Memory Clock" msgstr "Честота на паметта" #: data.hpp:346 msgid "Memory Used" msgstr "Използвана памет" #: data.hpp:347 msgid "Resizable BAR" msgstr "Преоразмеряване на BAR" #: data.hpp:348 msgid "Vulkan RT" msgstr "" #: data.hpp:349 #, fuzzy #| msgid "Version" msgid "OpenGL Version" msgstr "Версия" #: data.hpp:350 #, fuzzy #| msgid "Version" msgid "Vulkan Version" msgstr "Версия" #: data.hpp:351 #, fuzzy #| msgid "Version" msgid "OpenCL Version" msgstr "Версия" #: data.hpp:387 msgid "Score" msgstr "Резултат" #: data.hpp:388 msgid "Run" msgstr "Изпълнение" #: data.hpp:407 msgid "Duration" msgstr "Продължителност" #: util.hpp:77 msgid "bytes" msgstr "байта" #. TRANSLATORS: initials for kilobyte (10³): please put initials (keep it short) #: util.hpp:80 msgid "kB" msgstr "КБ" #. TRANSLATORS: initials for megabyte (10⁶): please put initials (keep it short) #: util.hpp:82 msgid "MB" msgstr "МБ" #. TRANSLATORS: initials for gigabyte (10⁹): please put initials (keep it short) #: util.hpp:84 msgid "GB" msgstr "ГБ" #. TRANSLATORS: initials for terabyte (10¹²): please put initials (keep it short) #: util.hpp:86 msgid "TB" msgstr "ТБ" #. TRANSLATORS: initials for kibibyte (2¹⁰): please put initials (keep it short) #: util.hpp:89 msgid "KiB" msgstr "КиБ" #. TRANSLATORS: initials for mebibyte (2²⁰): please put initials (keep it short) #: util.hpp:91 msgid "MiB" msgstr "МиБ" #. TRANSLATORS: initials for gibibyte (2³⁰): please put initials (keep it short) #: util.hpp:93 msgid "GiB" msgstr "ГиБ" #. TRANSLATORS: initials for tebibyte (2⁴⁰): please put initials (keep it short) #: util.hpp:95 msgid "TiB" msgstr "ТиБ" #: cpu-x-gtk-3.12.ui:1184 msgid "Cache" msgstr "Кеш" #. Setting: refresh time for UI #: cpu-x-gtk-3.12.ui:5721 msgid "Refresh time" msgstr "" #. Setting: GUI theme #: cpu-x-gtk-3.12.ui:5745 msgid "Text theme" msgstr "" #. Setting: automatic GUI theme #: cpu-x-gtk-3.12.ui:5760 msgid "Automatic" msgstr "" #. Setting: light GUI theme #: cpu-x-gtk-3.12.ui:5761 msgid "Blue for light theme" msgstr "" #. Setting: dark GUI theme #: cpu-x-gtk-3.12.ui:5762 msgid "Yellow for dark theme" msgstr "" #. Setting: temperature unit #: cpu-x-gtk-3.12.ui:5775 #, fuzzy #| msgid "Temperature" msgid "Temperature unit" msgstr "Температура" #. Setting: default tab at startup #: cpu-x-gtk-3.12.ui:5826 msgid "Default tab" msgstr "" #. Setting: default CPU core at startup #: cpu-x-gtk-3.12.ui:5839 msgid "Default CPU core" msgstr "" #. Setting: default cache test at startup #: cpu-x-gtk-3.12.ui:5852 msgid "Default cache test" msgstr "" #. Setting: print CPUID values in decimal or hexadecimal #: cpu-x-gtk-3.12.ui:5895 msgid "Print CPUID values in decimal" msgstr "" #. Setting: default graphic card at startup #: cpu-x-gtk-3.12.ui:5928 msgid "Default graphic card" msgstr "" #. Setting: default CPU core at startup #: cpu-x-gtk-3.12.ui:5952 msgid "Default core type" msgstr "" #. Setting: default graphic card at startup #: cpu-x-gtk-3.12.ui:5976 msgid "Default memory stick" msgstr "" #. Setting: "Startup" tab #: cpu-x-gtk-3.12.ui:6004 msgid "Startup" msgstr "" #, c-format #~ msgid "Core #%i" #~ msgstr "Ядро №%i" #, c-format #~ msgid "Bank %i" #~ msgstr "Модул %i" #~ msgid "Reference" #~ msgstr "Описание" #~ msgid "Distribution" #~ msgstr "Дистрибуция" #~ msgid "Compiler" #~ msgstr "Компилатор" #~ msgid "GPU clock" #~ msgstr "Честота на ГП" #, c-format #~ msgid "%s" #~ msgstr "%s" #~ msgid "Socket(s)" #~ msgstr "Гнезда" #~ msgid "Thread(s)" #~ msgstr "Нишки" CPU-X-5.0.3/po/ca.po000066400000000000000000000646421454622605200137360ustar00rootroot00000000000000# CPU-X translations template # Copyright © 2014-2024 The Tumultuous Unicorn Of Darkness # This file is distributed under the same license as the cpu-x package. # Sergi Font , 2021. msgid "" msgstr "" "Project-Id-Version: cpu-x\n" "Report-Msgid-Bugs-To: https://github.com/TheTumultuousUnicornOfDarkness/CPU-" "X/issues\n" "POT-Creation-Date: 2023-12-09 13:09+0100\n" "PO-Revision-Date: 2021-08-12 17:34+0000\n" "Last-Translator: Sergi Font \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 4.8-dev\n" #: core.cpp:135 msgid "Finding CPU technology" msgstr "Cercant la tecnologia de la CPU" #: core.cpp:161 #, c-format msgid "" "Your CPU is not present in the database ==> %s, model: %i, ext. model: %i, " "ext. family: %i" msgstr "" "La teva CPU no és present a la base de dades ==> %s, model: %i, ext. model: " "%i, ext. família: %i" #: core.cpp:189 data.cpp:150 data.cpp:342 msgid "unknown" msgstr "" #: core.cpp:230 msgid "Calling libcpuid for retrieving static data" msgstr "Cridant a libcpuid per recuperar les estadístiques" #: core.cpp:245 #, c-format msgid "failed to call libcpuid (%s)" msgstr "No s'ha pogut cridar libcpuid (%s)" #: core.cpp:340 msgid "Calling libcpuid for retrieving dynamic data" msgstr "Cridant a libcpuid per recuperar dades dinàmiques" #: core.cpp:353 msgid "Calling libcpuid for retrieving CPU MSR static values" msgstr "Cridant libcpuid per recuperar estadístiques de CPU MSR" #: core.cpp:380 msgid "Calling libcpuid for retrieving CPU MSR dynamic values" msgstr "Cridant a libcpuid per recuperar valors dinàmics de CPU MSR" #: core.cpp:412 msgid "Calling dmidecode" msgstr "Cridant dmidecode" #: core.cpp:454 core.cpp:473 #, c-format msgid "%s (configured)" msgstr "" #: core.cpp:461 core.cpp:480 #, c-format msgid "%s (max)" msgstr "" #: core.cpp:466 #, c-format msgid "%s (min)" msgstr "" #: core.cpp:496 msgid "Calculating CPU usage" msgstr "Calculant l'ús de la CPU" #: core.cpp:546 msgid "Calling bandwidth" msgstr "Cridant l'ample de banda" #: core.cpp:613 #, c-format msgid "" "pci_access is not properly initialized: it is a common issue when %s was " "built with a lower libpci version.\n" "Check that libpci %s library is present on your system. Otherwise, please " "rebuild %s." msgstr "" #: core.cpp:657 #, c-format msgid "No kernel driver in use for graphic card at path %s" msgstr "No hi ha controlador kernel en ús per la targeta gràfica a la ruta %s" #: core.cpp:693 #, c-format msgid "Your GPU kernel driver is unknown: %s" msgstr "El teu controlador kernel GPU és desconegut: %s" #: core.cpp:777 #, fuzzy, c-format #| msgid "Your GPU user mode driver is unknown: %s" msgid "Your GPU user mode driver is unknown for vendor %s: %s" msgstr "El teu mode d'usuari de controlador de GPU és desconegut: %s" #: core.cpp:781 #, c-format msgid "failed to call GLFW (%i): %s" msgstr "No s'ha pogut cridar GLFW (%i): %s" #: core.cpp:914 msgid "Finding Vulkan API version" msgstr "" #: core.cpp:926 #, fuzzy, c-format #| msgid "failed to call libcpuid (%s)" msgid "failed to call vkCreateInstance (%s)" msgstr "No s'ha pogut cridar libcpuid (%s)" #: core.cpp:929 #, c-format msgid "%s is not supported" msgstr "" #: core.cpp:937 #, fuzzy, c-format #| msgid "failed to call libcpuid (%s)" msgid "failed to call vkEnumeratePhysicalDevices (%s)" msgstr "No s'ha pogut cridar libcpuid (%s)" #: core.cpp:944 msgid "No available Vulkan devices" msgstr "" #: core.cpp:952 #, fuzzy, c-format #| msgid "failed to call libcpuid (%s)" msgid "No available physical devices (%s)" msgstr "No s'ha pogut cridar libcpuid (%s)" #: core.cpp:1015 #, fuzzy, c-format #| msgid "failed to get name for device %u (%s)" msgid "Failed to create Vulkan for device %u (%s)" msgstr "no s'ha obtingut el nom del dispositiu %u (%s)" #: core.cpp:1019 #, c-format msgid "%s is not supported for device %u, use only deviceID for matching" msgstr "" #: core.cpp:1051 core.cpp:1364 msgid "Enabled" msgstr "" #: core.cpp:1051 core.cpp:1364 msgid "Disabled" msgstr "" #: core.cpp:1088 msgid "Finding OpenCL API version" msgstr "" #: core.cpp:1092 #, c-format msgid "There is no platform with OpenCL support (%s)" msgstr "No hi ha una plataforma amb suport OpenCL (%s)" #: core.cpp:1102 #, c-format msgid "failed to get all OpenCL platforms (%s)" msgstr "no s'ha obtingut totes les plataformes OpenCL (%s)" #: core.cpp:1115 #, c-format msgid "failed to get name for platform %u (%s)" msgstr "no s'ha obtingut el nom de la plataforma %u (%s)" #: core.cpp:1123 #, c-format msgid "failed to get version for platform %u (%s)" msgstr "no s'ha obtingut la versió de la plataforma %u (%s)" #: core.cpp:1131 #, c-format msgid "failed to find number of OpenCL devices for platform '%s %s' (%s)" msgstr "" "no s'ha trobat el número de dispositius OpenCL per la plataforma '%s %s' (%s)" #: core.cpp:1131 msgid "0 device" msgstr "" #: core.cpp:1140 #, c-format msgid "failed to get all of OpenCL devices for platform '%s %s' (%s)" msgstr "" "no s'ha obtingut tots els dispositius OpenCL per la plataforma '%s %s' (%s)" #: core.cpp:1160 #, c-format msgid "failed to get name for device %u (%s)" msgstr "no s'ha obtingut el nom del dispositiu %u (%s)" #: core.cpp:1168 #, c-format msgid "failed to get version for device %u (%s)" msgstr "no s'ha obtingut la versió pel dispositiu %u (%s)" #: core.cpp:1190 #, c-format msgid "OpenCL driver for '%s %s' does not support CL_DEVICE_TOPOLOGY_AMD (%s)" msgstr "" #: core.cpp:1201 #, c-format msgid "" "OpenCL driver for '%s %s' does not support CL_DEVICE_GFXIP_MAJOR_AMD (%s)" msgstr "" #: core.cpp:1209 core.cpp:1229 core.cpp:1262 #, c-format msgid "" "OpenCL driver for '%s %s' does not support CL_DEVICE_MAX_COMPUTE_UNITS (%s)" msgstr "" #: core.cpp:1250 #, c-format msgid "" "OpenCL driver for '%s %s' does not support CL_DEVICE_PCI_DOMAIN_ID_NV (%s), " "CL_DEVICE_PCI_BUS_ID_NV (%s) or CL_DEVICE_PCI_SLOT_ID_NV (%s)" msgstr "" #: core.cpp:1273 #, c-format msgid "OpenCL is not supported with your GPU vendor (0x%X)" msgstr "" #: core.cpp:1295 msgid "Finding devices" msgstr "" #: core.cpp:1307 #, c-format msgid "Skip devices search (wrong permissions on %s device)" msgstr "" #: core.cpp:1350 #, c-format msgid "Your GPU vendor is unknown: %s (0x%X)" msgstr "" #: core.cpp:1370 msgid "failed to find chipset vendor and model" msgstr "" #: core.cpp:1385 msgid "failed to find graphic card vendor and model" msgstr "" #: core.cpp:1487 msgid "Retrieving GPU clocks" msgstr "" #: core.cpp:1500 msgid "None" msgstr "" #: core.cpp:1509 #, c-format msgid "DRM path for %s is unknown" msgstr "" #: core.cpp:1516 #, c-format msgid "Card number for %s is unknown" msgstr "" #: core.cpp:1541 #, c-format msgid "PCIe %s (current) / %s (max)" msgstr "" #: core.cpp:1650 #, c-format msgid "Driver for %s doesn't report frequencies" msgstr "" #: core.cpp:1671 #, fuzzy, c-format #| msgid "failed to get all OpenCL platforms (%s)" msgid "failed to retrieve all monitoring data for %s" msgstr "no s'ha obtingut totes les plataformes OpenCL (%s)" #: core.cpp:1694 msgid "Identifying running system" msgstr "" #: core.cpp:1697 msgid "failed to identify running system" msgstr "" #: core.cpp:1749 core.cpp:1778 msgid "Calling libprocps" msgstr "" #: core.cpp:1752 msgid "unable to get system uptime" msgstr "" #: core.cpp:1758 msgid "unable to create meminfo structure" msgstr "" #: core.cpp:1804 msgid "Calling libstatgrab" msgstr "" #: core.cpp:1852 #, c-format msgid "%i days, %i hours, %i minutes, %i seconds" msgstr "" #: core.cpp:1915 msgid "Updating benchmark status" msgstr "" #: core.cpp:1918 msgid "Active" msgstr "" #: core.cpp:1921 #, c-format msgid "(%u hours left)" msgstr "" #: core.cpp:1923 #, c-format msgid "(%u minutes left)" msgstr "" #: core.cpp:1925 #, c-format msgid "(%u seconds left)" msgstr "" #: core.cpp:1929 core.cpp:1984 core.cpp:1985 msgid "Inactive" msgstr "" #: core.cpp:1932 #, c-format msgid "in %u hours" msgstr "" #: core.cpp:1934 #, c-format msgid "in %u minutes" msgstr "" #: core.cpp:1936 #, c-format msgid "in %u seconds" msgstr "" #: core.cpp:1953 #, c-format msgid "Starting benchmark with %u threads" msgstr "" #: core.cpp:1976 msgid "an error occurred while starting benchmark" msgstr "" #: core.cpp:2002 msgid "Finding CPU package in fallback mode" msgstr "" #: core.cpp:2032 #, c-format msgid "Your CPU socket is not present in the database ==> %s, codename: %s" msgstr "" #: core.cpp:2052 msgid "Calculating CPU multipliers in fallback mode" msgstr "" #: core.cpp:2072 msgid "Retrieving motherboard information in fallback mode" msgstr "" #: core.cpp:2085 msgid "failed to retrieve motherboard information (fallback mode)" msgstr "" #: core.cpp:2127 msgid "Retrieving CPU temperature in fallback mode" msgstr "" #: core.cpp:2173 msgid "failed to retrieve CPU temperature (fallback mode)" msgstr "" #: core.cpp:2188 msgid "Retrieving CPU voltage in fallback mode" msgstr "" #: core.cpp:2200 msgid "failed to retrieve CPU voltage (fallback mode)" msgstr "" #: core.cpp:2214 msgid "Retrieving CPU frequency in fallback mode" msgstr "" #: core.cpp:2220 msgid "failed to retrieve CPU frequency (fallback mode)" msgstr "" #: daemon_client.cpp:65 msgid "Starting daemon in background…" msgstr "" #: daemon_client.cpp:172 msgid "pkexec: authorization could not be obtained (dialog dismissed)" msgstr "" #: daemon_client.cpp:175 msgid "pkexec: authorization could not be obtained (not authorized)" msgstr "" #: daemon_client.cpp:178 msgid "pkexec: command not found" msgstr "" #: daemon_client.cpp:181 msgid "pkexec: unexpected error code" msgstr "" #: daemon_client.cpp:211 msgid "Connecting to daemon…" msgstr "" #: daemon_server.cpp:261 #, c-format msgid "request_handler: case %i not handled" msgstr "" #: data.cpp:124 cpu-x-gtk-3.12.ui:1370 msgid "CPU" msgstr "" #: data.cpp:187 msgid "P-core" msgstr "" #: data.cpp:188 msgid "E-core" msgstr "" #: data.cpp:189 data.cpp:192 msgid "Core" msgstr "" #: data.cpp:208 cpu-x-gtk-3.12.ui:746 msgid "Processor" msgstr "" #: data.cpp:240 data.cpp:329 cpu-x-gtk-3.12.ui:1968 msgid "Caches" msgstr "" #: data.cpp:247 #, fuzzy, c-format #| msgid "%d x %d %s, %d-way" msgid "%2d x %4d %s, %2d-way" msgstr "%d x %d %s, %d-way" #: data.cpp:249 #, c-format msgid "%d %s, %d-way" msgstr "%d %s, %d-way" #: data.cpp:263 msgid "Count" msgstr "" #: data.cpp:276 cpu-x-gtk-3.12.ui:968 msgid "Clocks" msgstr "" #: data.cpp:379 data.cpp:383 #, c-format msgid "L%u Cache" msgstr "" #: data.cpp:385 #, c-format msgid "%s associative, %d-%s line size" msgstr "%s associatiu, %d-%s mida de la línia" #: data.cpp:398 msgid "Test" msgstr "" #: data.cpp:409 data.cpp:423 cpu-x-gtk-3.12.ui:2146 cpu-x-gtk-3.12.ui:2517 msgid "Motherboard" msgstr "" #: data.cpp:437 cpu-x-gtk-3.12.ui:2367 msgid "BIOS" msgstr "" #: data.cpp:452 cpu-x-gtk-3.12.ui:2498 msgid "Chipset" msgstr "" #: data.cpp:467 data.cpp:569 cpu-x-gtk-3.12.ui:3156 cpu-x-gtk-3.12.ui:3761 msgid "Memory" msgstr "" #: data.cpp:483 #, c-format msgid "Stick %u" msgstr "" #: data.cpp:487 cpu-x-gtk-3.12.ui:3134 msgid "Sticks" msgstr "" #: data.cpp:541 cpu-x-gtk-3.12.ui:3780 msgid "System" msgstr "" #: data.cpp:554 cpu-x-gtk-3.12.ui:3380 msgid "Operating System" msgstr "" #: data.cpp:587 cpu-x-gtk-3.12.ui:4960 msgid "Graphics" msgstr "" #: data.cpp:621 #, c-format msgid "Card %u" msgstr "" #: data.cpp:625 cpu-x-gtk-3.12.ui:4938 msgid "Cards" msgstr "" #: data.cpp:672 cpu-x-gtk-3.12.ui:5300 msgid "Bench" msgstr "" #: data.cpp:685 msgid "Not started" msgstr "" #: data.cpp:688 cpu-x-gtk-3.12.ui:5070 msgid "Prime numbers (slow)" msgstr "" #: data.cpp:692 cpu-x-gtk-3.12.ui:5178 msgid "Prime numbers (fast)" msgstr "" #: data.cpp:696 cpu-x-gtk-3.12.ui:5281 msgid "Parameters" msgstr "" #: data.cpp:721 data.cpp:727 #, c-format msgid "%u mins" msgstr "" #: data.cpp:734 cpu-x-gtk-3.12.ui:5444 cpu-x-gtk-3.12.ui:5552 msgid "About" msgstr "" #: data.cpp:739 #, c-format msgid "" "%s is a Free software that gathers information\n" "on CPU, motherboard and more." msgstr "" #: data.cpp:744 msgid "About CPU-X" msgstr "" #: data.cpp:745 #, c-format msgid "Version %s" msgstr "" #: data.cpp:746 #, c-format msgid "Author: %s" msgstr "" #: data.cpp:747 #, c-format msgid "Site: %s" msgstr "" #: data.cpp:751 cpu-x-gtk-3.12.ui:5533 msgid "License" msgstr "" #: data.cpp:753 #, c-format msgid "This software is distributed under the terms of %s" msgstr "" #: data.cpp:754 main.cpp:176 msgid "This program comes with ABSOLUTELY NO WARRANTY" msgstr "" #: gui_gtk.cpp:61 #, c-format msgid "Cannot find path for '%s' file" msgstr "" #: gui_gtk.cpp:400 msgid "Start daemon" msgstr "" #: gui_gtk.cpp:403 msgid "Connected to daemon" msgstr "" #: gui_gtk.cpp:406 msgid "No polkit authentication agent found" msgstr "" #: gui_gtk.cpp:411 msgid "Ask password to start daemon in background" msgstr "" #: gui_gtk.cpp:415 msgid "Settings" msgstr "" #: gui_gtk.cpp:634 msgid "BaseFamily" msgstr "" #: gui_gtk.cpp:635 msgid "CPU display (\"true\") family (computed as BaseFamily+ExtendedFamily)" msgstr "" #: gui_gtk.cpp:636 msgid "BaseModel" msgstr "" #: gui_gtk.cpp:637 msgid "CPU display (\"true\") model (computed as (ExtendedModel<<4)+BaseModel)" msgstr "" #: gui_gtk.cpp:847 msgid "" "Identify the physically-labeled socket or board position where the memory " "device is located" msgstr "" #: gui_gtk.cpp:848 msgid "Identify the physically labeled bank where the memory device is located" msgstr "" #: gui_gtk.cpp:1052 msgid "User Mode Driver Version" msgstr "" #: gui_gtk.cpp:1066 msgid "Vulkan Ray Tracing" msgstr "" #: gui_gtk.cpp:1260 msgid "Starting GTK GUI…" msgstr "" #: gui_gtk.cpp:1272 msgid "failed to import UI in GtkBuilder" msgstr "" #: main.cpp:63 msgid "Start graphical user interface (GUI) (default)" msgstr "" #: main.cpp:64 msgid "Start text-based user interface (TUI)" msgstr "" #: main.cpp:65 msgid "Dump all data on standard output and exit" msgstr "" #: main.cpp:66 msgid "Run embedded command dmidecode and exit" msgstr "" #: main.cpp:67 msgid "Run embedded command bandwidth and exit" msgstr "" #: main.cpp:68 msgid "Set temperature unit (c[elsius]|f[ahrenheit]|k[elvin]|r[ankine])" msgstr "" #: main.cpp:69 msgid "Set custom time between two refreshes (in seconds)" msgstr "" #: main.cpp:70 msgid "Set default tab (integer)" msgstr "" #: main.cpp:71 msgid "Select core type to monitor (integer)" msgstr "" #: main.cpp:72 msgid "Select CPU core to monitor (integer)" msgstr "" #: main.cpp:73 msgid "Set custom bandwidth test for CPU caches speed (integer)" msgstr "" #: main.cpp:74 msgid "Select default memory stick (integer)" msgstr "" #: main.cpp:75 msgid "Select default graphic card (integer)" msgstr "" #: main.cpp:76 cpu-x-gtk-3.12.ui:5910 msgid "Start and connect to daemon" msgstr "" #: main.cpp:77 msgid "Verbose output" msgstr "" #: main.cpp:78 msgid "Print help and exit" msgstr "" #: main.cpp:79 msgid "Print version and exit" msgstr "" #: main.cpp:80 msgid "Print CPUID values in decimal (default is hexadeximal)" msgstr "" #: main.cpp:81 msgid "Disable colored output" msgstr "" #: main.cpp:82 msgid "Print information for debugging" msgstr "" #: main.cpp:83 msgid "Print required information to paste in an issue" msgstr "" #: main.cpp:84 msgid "Set key mapping for NCurses mode (a[rrows]|e[macs]|i[nverted-T]|v[im])" msgstr "" #: main.cpp:95 msgid "Add default command line arguments" msgstr "" #: main.cpp:96 msgid "Enforce the bus clock" msgstr "" #: main.cpp:97 msgid "" "Ignore CPU values reported by libcpuid (comma-separated values among 'temp', " "'volt' and 'freq')" msgstr "" #: main.cpp:98 msgid "Read CPUID raw data from a given file" msgstr "" #: main.cpp:99 msgid "Only print a message if CPU is not present in the database" msgstr "" #: main.cpp:126 #, c-format msgid "Usage: %s DISPLAY [OPTIONS]\n" msgstr "" #: main.cpp:127 msgid "Available DISPLAY:" msgstr "" #: main.cpp:135 msgid "Available OPTIONS:" msgstr "" #: main.cpp:144 msgid "Influenceable environment variables:" msgstr "" #: main.cpp:175 msgid "This is free software: you are free to change and redistribute it." msgstr "" #: main.cpp:177 #, c-format msgid "See the %s license: <%s>\n" msgstr "" #: main.cpp:184 #, c-format msgid "-- %-9s version: %s" msgstr "" #: main.cpp:381 #, c-format msgid "" "\n" "Oops, something was wrong! %s has received signal %d (%s) and has crashed." msgstr "" #: main.cpp:383 #, c-format msgid "" "\n" "Oops, something was wrong! %s has received signal %d (%s) and is trying to " "recover." msgstr "" #: main.cpp:407 msgid "You can open a new issue here, by filling the template as requested:" msgstr "" #: main.cpp:449 msgid "an error occurred while setting locale" msgstr "" #: options.cpp:124 #, c-format msgid "" "Selected CPU type (%u) is not a valid number (%u is the maximum for this CPU)" msgstr "" #: options.cpp:145 #, c-format msgid "" "Selected bandwidth test (%u) is not a valid number (%u is the maximum for " "this system)" msgstr "" #: options.cpp:168 #, c-format msgid "" "Selected RAM stick (%u) is not a valid number (%u is the maximum for this " "system)" msgstr "" #: options.cpp:188 #, c-format msgid "" "Selected graphic card (%u) is not a valid number (%u is the maximum for this " "system)" msgstr "" #: options.cpp:204 #, c-format msgid "failed to change CPU affinitiy to core %u" msgstr "" #: options.cpp:210 #, c-format msgid "" "Selected CPU core (%u) is not a valid number (%u is the maximum for this " "type of core)" msgstr "" #: options.cpp:284 #, c-format msgid "Selected tab (%u) is not a valid number (%u is the maximum)" msgstr "" #: tui_ncurses.cpp:111 msgid "Window is too small!" msgstr "" #: tui_ncurses.cpp:119 msgid "Press 'h' to see help." msgstr "" #: tui_ncurses.cpp:232 #, c-format msgid "Welcome in %s NCurses help!\n" msgstr "" #: tui_ncurses.cpp:233 msgid "This help describes how to use this Text-based User Interface." msgstr "" #: tui_ncurses.cpp:235 msgid "Global keys:" msgstr "" #: tui_ncurses.cpp:236 msgid "Press 'left' key or 'tab' key to switch in left tab." msgstr "" #: tui_ncurses.cpp:237 msgid "Press 'right' key or 'shift + tab' keys to switch in right tab." msgstr "" #: tui_ncurses.cpp:238 msgid "Press 'h' key to see this help." msgstr "" #: tui_ncurses.cpp:239 msgid "Press 'q' key to exit." msgstr "" #: tui_ncurses.cpp:241 msgid "CPU tab:" msgstr "" #: tui_ncurses.cpp:242 msgid "Press 'next page' key to decrease core type number to monitor." msgstr "" #: tui_ncurses.cpp:243 msgid "Press 'previous page' key to increase core type number to monitor." msgstr "" #: tui_ncurses.cpp:244 msgid "Press 'down' key to decrease CPU core number to monitor." msgstr "" #: tui_ncurses.cpp:245 msgid "Press 'up' key to increase CPU core number to monitor." msgstr "" #: tui_ncurses.cpp:247 msgid "Caches tab:" msgstr "" #: tui_ncurses.cpp:248 msgid "Press 'down' key to switch to previous test." msgstr "" #: tui_ncurses.cpp:249 msgid "Press 'up' key to switch to next test." msgstr "" #: tui_ncurses.cpp:251 msgid "Bench tab:" msgstr "" #: tui_ncurses.cpp:252 msgid "Press 'down' key to decrement benchmark duration." msgstr "" #: tui_ncurses.cpp:253 msgid "Press 'up' key to increment benchmark duration." msgstr "" #: tui_ncurses.cpp:254 msgid "Press 'next page' key to decrement number of threads to use." msgstr "" #: tui_ncurses.cpp:255 msgid "Press 'previous page' key to increment number of threads to use." msgstr "" #: tui_ncurses.cpp:256 msgid "Press 's' key to start/stop prime numbers (slow) benchmark." msgstr "" #: tui_ncurses.cpp:257 msgid "Press 'f' key to start/stop prime numbers (fast) benchmark." msgstr "" #: tui_ncurses.cpp:259 msgid "Graphics tab:" msgstr "" #: tui_ncurses.cpp:260 msgid "Press 'down' key to switch to previous graphic card." msgstr "" #: tui_ncurses.cpp:261 msgid "Press 'up' key to switch to next graphic card." msgstr "" #: tui_ncurses.cpp:263 msgid "Press any key to exit this help." msgstr "" #: tui_ncurses.cpp:640 msgid "Starting NCurses TUI…" msgstr "" #: tui_ncurses.cpp:649 msgid "" "FATAL ERROR: terminfo database could not be found (try to set TERMINFO " "environment variable)" msgstr "" #: tui_ncurses.cpp:654 #, c-format msgid "Failed to set up %s terminal (err=%i); falling back to %s" msgstr "" #: util.cpp:189 #, c-format msgid "cannot find unit in '%s' string at position %i" msgstr "" #: util.cpp:252 #, c-format msgid "an error occurred while opening file '%s'" msgstr "" #: util.cpp:297 #, c-format msgid "an error occurred while running command '%s'" msgstr "" #: util.cpp:437 msgid "set_cpu_affinity() not supported on this operating system" msgstr "" #: data.hpp:103 data.hpp:244 data.hpp:332 msgid "Vendor" msgstr "" #: data.hpp:104 msgid "Code Name" msgstr "" #: data.hpp:105 msgid "Package" msgstr "" #: data.hpp:106 msgid "Technology" msgstr "" #: data.hpp:107 data.hpp:268 msgid "Voltage" msgstr "" #: data.hpp:108 msgid "Specification" msgstr "" #: data.hpp:109 msgid "Family" msgstr "" #: data.hpp:110 msgid "Disp. Family" msgstr "" #: data.hpp:111 data.hpp:224 data.hpp:245 data.hpp:335 msgid "Model" msgstr "" #: data.hpp:112 msgid "Disp. Model" msgstr "" #: data.hpp:113 msgid "Temp." msgstr "" #: data.hpp:114 msgid "Stepping" msgstr "" #: data.hpp:115 msgid "Instructions" msgstr "" #: data.hpp:125 msgid "L1 Data" msgstr "" #: data.hpp:126 msgid "L1 Inst." msgstr "" #: data.hpp:127 msgid "Level 2" msgstr "" #: data.hpp:128 msgid "Level 3" msgstr "" #: data.hpp:137 cpu-x-gtk-3.12.ui:1232 msgid "Cores" msgstr "" #: data.hpp:138 data.hpp:408 cpu-x-gtk-3.12.ui:1252 msgid "Threads" msgstr "" #: data.hpp:155 msgid "Core Speed" msgstr "" #: data.hpp:156 msgid "Multiplier" msgstr "" #: data.hpp:157 msgid "Bus Speed" msgstr "" #: data.hpp:158 data.hpp:341 msgid "Usage" msgstr "" #: data.hpp:188 data.hpp:265 msgid "Size" msgstr "" #: data.hpp:189 data.hpp:267 msgid "Speed" msgstr "" #: data.hpp:223 data.hpp:259 msgid "Manufacturer" msgstr "" #: data.hpp:225 msgid "Revision" msgstr "" #: data.hpp:233 msgid "Brand" msgstr "" #: data.hpp:234 msgid "Version" msgstr "" #: data.hpp:235 msgid "Date" msgstr "" #: data.hpp:236 msgid "ROM Size" msgstr "" #: data.hpp:260 msgid "Part Number" msgstr "" #: data.hpp:261 msgid "Type" msgstr "" #: data.hpp:262 msgid "Type Detail" msgstr "" #: data.hpp:263 msgid "Device Locator" msgstr "" #: data.hpp:264 msgid "Bank Locator" msgstr "" #: data.hpp:266 msgid "Rank" msgstr "" #: data.hpp:292 msgid "Name" msgstr "" #: data.hpp:293 msgid "Kernel" msgstr "" #: data.hpp:294 msgid "Hostname" msgstr "" #: data.hpp:295 msgid "Uptime" msgstr "" #: data.hpp:303 msgid "Used" msgstr "" #: data.hpp:304 msgid "Buffers" msgstr "" #: data.hpp:305 msgid "Cached" msgstr "" #: data.hpp:306 msgid "Free" msgstr "" #: data.hpp:307 msgid "Swap" msgstr "" #: data.hpp:333 msgid "Driver" msgstr "" #: data.hpp:334 msgid "UMD Version" msgstr "" #: data.hpp:336 msgid "Compute Unit" msgstr "" #: data.hpp:337 msgid "Device ID" msgstr "" #: data.hpp:338 msgid "VBIOS Version" msgstr "" #. #-#-#-#-# source_ui.pot (cpu-x ) #-#-#-#-# #. Setting: "Interface" tab #: data.hpp:339 cpu-x-gtk-3.12.ui:5807 msgid "Interface" msgstr "" #: data.hpp:340 msgid "Temperature" msgstr "" #: data.hpp:342 msgid "Core Voltage" msgstr "" #: data.hpp:343 msgid "Power Avg" msgstr "" #: data.hpp:344 msgid "Core Clock" msgstr "" #: data.hpp:345 msgid "Memory Clock" msgstr "" #: data.hpp:346 msgid "Memory Used" msgstr "" #: data.hpp:347 msgid "Resizable BAR" msgstr "" #: data.hpp:348 msgid "Vulkan RT" msgstr "" #: data.hpp:349 msgid "OpenGL Version" msgstr "" #: data.hpp:350 msgid "Vulkan Version" msgstr "" #: data.hpp:351 msgid "OpenCL Version" msgstr "" #: data.hpp:387 msgid "Score" msgstr "" #: data.hpp:388 msgid "Run" msgstr "" #: data.hpp:407 msgid "Duration" msgstr "" #: util.hpp:77 msgid "bytes" msgstr "" #. TRANSLATORS: initials for kilobyte (10³): please put initials (keep it short) #: util.hpp:80 msgid "kB" msgstr "" #. TRANSLATORS: initials for megabyte (10⁶): please put initials (keep it short) #: util.hpp:82 msgid "MB" msgstr "" #. TRANSLATORS: initials for gigabyte (10⁹): please put initials (keep it short) #: util.hpp:84 msgid "GB" msgstr "" #. TRANSLATORS: initials for terabyte (10¹²): please put initials (keep it short) #: util.hpp:86 msgid "TB" msgstr "" #. TRANSLATORS: initials for kibibyte (2¹⁰): please put initials (keep it short) #: util.hpp:89 msgid "KiB" msgstr "" #. TRANSLATORS: initials for mebibyte (2²⁰): please put initials (keep it short) #: util.hpp:91 msgid "MiB" msgstr "" #. TRANSLATORS: initials for gibibyte (2³⁰): please put initials (keep it short) #: util.hpp:93 msgid "GiB" msgstr "" #. TRANSLATORS: initials for tebibyte (2⁴⁰): please put initials (keep it short) #: util.hpp:95 msgid "TiB" msgstr "" #: cpu-x-gtk-3.12.ui:1184 msgid "Cache" msgstr "" #. Setting: refresh time for UI #: cpu-x-gtk-3.12.ui:5721 msgid "Refresh time" msgstr "" #. Setting: GUI theme #: cpu-x-gtk-3.12.ui:5745 msgid "Text theme" msgstr "" #. Setting: automatic GUI theme #: cpu-x-gtk-3.12.ui:5760 msgid "Automatic" msgstr "" #. Setting: light GUI theme #: cpu-x-gtk-3.12.ui:5761 msgid "Blue for light theme" msgstr "" #. Setting: dark GUI theme #: cpu-x-gtk-3.12.ui:5762 msgid "Yellow for dark theme" msgstr "" #. Setting: temperature unit #: cpu-x-gtk-3.12.ui:5775 msgid "Temperature unit" msgstr "" #. Setting: default tab at startup #: cpu-x-gtk-3.12.ui:5826 msgid "Default tab" msgstr "" #. Setting: default CPU core at startup #: cpu-x-gtk-3.12.ui:5839 msgid "Default CPU core" msgstr "" #. Setting: default cache test at startup #: cpu-x-gtk-3.12.ui:5852 msgid "Default cache test" msgstr "" #. Setting: print CPUID values in decimal or hexadecimal #: cpu-x-gtk-3.12.ui:5895 msgid "Print CPUID values in decimal" msgstr "" #. Setting: default graphic card at startup #: cpu-x-gtk-3.12.ui:5928 msgid "Default graphic card" msgstr "" #. Setting: default CPU core at startup #: cpu-x-gtk-3.12.ui:5952 msgid "Default core type" msgstr "" #. Setting: default graphic card at startup #: cpu-x-gtk-3.12.ui:5976 msgid "Default memory stick" msgstr "" #. Setting: "Startup" tab #: cpu-x-gtk-3.12.ui:6004 msgid "Startup" msgstr "" #~ msgid "Calculating CPU multipliers" #~ msgstr "Calculant multiplicadors CPU" #, fuzzy, c-format #~| msgid "failed to call libcpuid (%s)" #~ msgid "failed to call vkEnumerateInstanceExtensionProperties (%s)" #~ msgstr "No s'ha pogut cridar libcpuid (%s)" #, fuzzy #~| msgid "There is no platform with OpenCL support (%s)" #~ msgid "There is no device with Vulkan support" #~ msgstr "No hi ha una plataforma amb suport OpenCL (%s)" CPU-X-5.0.3/po/cpu-x.pot000066400000000000000000000625471454622605200145750ustar00rootroot00000000000000# CPU-X translations template # Copyright © 2014-2024 TheTumultuousUnicornOfDarkness # This file is distributed under the same license as the cpu-x package. # FIRST AUTHOR , YEAR. # #, fuzzy msgid "" msgstr "Project-Id-Version: cpu-x \n" "Report-Msgid-Bugs-To: https://github.com/" "TheTumultuousUnicornOfDarkness/CPU-X/issues\n" "POT-Creation-Date: 2023-12-09 13:09+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=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: core.cpp:135 msgid "Finding CPU technology" msgstr "" #: core.cpp:161 #, c-format msgid "Your CPU is not present in the database ==> %s, model: %i, ext. " "model: %i, ext. family: %i" msgstr "" #: core.cpp:189 data.cpp:150 data.cpp:342 msgid "unknown" msgstr "" #: core.cpp:230 msgid "Calling libcpuid for retrieving static data" msgstr "" #: core.cpp:245 #, c-format msgid "failed to call libcpuid (%s)" msgstr "" #: core.cpp:340 msgid "Calling libcpuid for retrieving dynamic data" msgstr "" #: core.cpp:353 msgid "Calling libcpuid for retrieving CPU MSR static values" msgstr "" #: core.cpp:380 msgid "Calling libcpuid for retrieving CPU MSR dynamic values" msgstr "" #: core.cpp:412 msgid "Calling dmidecode" msgstr "" #: core.cpp:454 core.cpp:473 #, c-format msgid "%s (configured)" msgstr "" #: core.cpp:461 core.cpp:480 #, c-format msgid "%s (max)" msgstr "" #: core.cpp:466 #, c-format msgid "%s (min)" msgstr "" #: core.cpp:496 msgid "Calculating CPU usage" msgstr "" #: core.cpp:546 msgid "Calling bandwidth" msgstr "" #: core.cpp:613 #, c-format msgid "pci_access is not properly initialized: it is a common issue when %s " "was built with a lower libpci version.\n" "Check that libpci %s library is present on your system. Otherwise, " "please rebuild %s." msgstr "" #: core.cpp:657 #, c-format msgid "No kernel driver in use for graphic card at path %s" msgstr "" #: core.cpp:693 #, c-format msgid "Your GPU kernel driver is unknown: %s" msgstr "" #: core.cpp:777 #, c-format msgid "Your GPU user mode driver is unknown for vendor %s: %s" msgstr "" #: core.cpp:781 #, c-format msgid "failed to call GLFW (%i): %s" msgstr "" #: core.cpp:914 msgid "Finding Vulkan API version" msgstr "" #: core.cpp:926 #, c-format msgid "failed to call vkCreateInstance (%s)" msgstr "" #: core.cpp:929 #, c-format msgid "%s is not supported" msgstr "" #: core.cpp:937 #, c-format msgid "failed to call vkEnumeratePhysicalDevices (%s)" msgstr "" #: core.cpp:944 msgid "No available Vulkan devices" msgstr "" #: core.cpp:952 #, c-format msgid "No available physical devices (%s)" msgstr "" #: core.cpp:1015 #, c-format msgid "Failed to create Vulkan for device %u (%s)" msgstr "" #: core.cpp:1019 #, c-format msgid "%s is not supported for device %u, use only deviceID for matching" msgstr "" #: core.cpp:1051 core.cpp:1364 msgid "Enabled" msgstr "" #: core.cpp:1051 core.cpp:1364 msgid "Disabled" msgstr "" #: core.cpp:1088 msgid "Finding OpenCL API version" msgstr "" #: core.cpp:1092 #, c-format msgid "There is no platform with OpenCL support (%s)" msgstr "" #: core.cpp:1102 #, c-format msgid "failed to get all OpenCL platforms (%s)" msgstr "" #: core.cpp:1115 #, c-format msgid "failed to get name for platform %u (%s)" msgstr "" #: core.cpp:1123 #, c-format msgid "failed to get version for platform %u (%s)" msgstr "" #: core.cpp:1131 #, c-format msgid "failed to find number of OpenCL devices for platform '%s %s' (%s)" msgstr "" #: core.cpp:1131 msgid "0 device" msgstr "" #: core.cpp:1140 #, c-format msgid "failed to get all of OpenCL devices for platform '%s %s' (%s)" msgstr "" #: core.cpp:1160 #, c-format msgid "failed to get name for device %u (%s)" msgstr "" #: core.cpp:1168 #, c-format msgid "failed to get version for device %u (%s)" msgstr "" #: core.cpp:1190 #, c-format msgid "OpenCL driver for '%s %s' does not support CL_DEVICE_TOPOLOGY_AMD " "(%s)" msgstr "" #: core.cpp:1201 #, c-format msgid "OpenCL driver for '%s %s' does not support CL_DEVICE_GFXIP_MAJOR_AMD " "(%s)" msgstr "" #: core.cpp:1209 core.cpp:1229 core.cpp:1262 #, c-format msgid "OpenCL driver for '%s %s' does not support " "CL_DEVICE_MAX_COMPUTE_UNITS (%s)" msgstr "" #: core.cpp:1250 #, c-format msgid "OpenCL driver for '%s %s' does not support " "CL_DEVICE_PCI_DOMAIN_ID_NV (%s), CL_DEVICE_PCI_BUS_ID_NV (%s) or " "CL_DEVICE_PCI_SLOT_ID_NV (%s)" msgstr "" #: core.cpp:1273 #, c-format msgid "OpenCL is not supported with your GPU vendor (0x%X)" msgstr "" #: core.cpp:1295 msgid "Finding devices" msgstr "" #: core.cpp:1307 #, c-format msgid "Skip devices search (wrong permissions on %s device)" msgstr "" #: core.cpp:1350 #, c-format msgid "Your GPU vendor is unknown: %s (0x%X)" msgstr "" #: core.cpp:1370 msgid "failed to find chipset vendor and model" msgstr "" #: core.cpp:1385 msgid "failed to find graphic card vendor and model" msgstr "" #: core.cpp:1487 msgid "Retrieving GPU clocks" msgstr "" #: core.cpp:1500 msgid "None" msgstr "" #: core.cpp:1509 #, c-format msgid "DRM path for %s is unknown" msgstr "" #: core.cpp:1516 #, c-format msgid "Card number for %s is unknown" msgstr "" #: core.cpp:1541 #, c-format msgid "PCIe %s (current) / %s (max)" msgstr "" #: core.cpp:1650 #, c-format msgid "Driver for %s doesn't report frequencies" msgstr "" #: core.cpp:1671 #, c-format msgid "failed to retrieve all monitoring data for %s" msgstr "" #: core.cpp:1694 msgid "Identifying running system" msgstr "" #: core.cpp:1697 msgid "failed to identify running system" msgstr "" #: core.cpp:1749 core.cpp:1778 msgid "Calling libprocps" msgstr "" #: core.cpp:1752 msgid "unable to get system uptime" msgstr "" #: core.cpp:1758 msgid "unable to create meminfo structure" msgstr "" #: core.cpp:1804 msgid "Calling libstatgrab" msgstr "" #: core.cpp:1852 #, c-format msgid "%i days, %i hours, %i minutes, %i seconds" msgstr "" #: core.cpp:1915 msgid "Updating benchmark status" msgstr "" #: core.cpp:1918 msgid "Active" msgstr "" #: core.cpp:1921 #, c-format msgid "(%u hours left)" msgstr "" #: core.cpp:1923 #, c-format msgid "(%u minutes left)" msgstr "" #: core.cpp:1925 #, c-format msgid "(%u seconds left)" msgstr "" #: core.cpp:1929 core.cpp:1984 core.cpp:1985 msgid "Inactive" msgstr "" #: core.cpp:1932 #, c-format msgid "in %u hours" msgstr "" #: core.cpp:1934 #, c-format msgid "in %u minutes" msgstr "" #: core.cpp:1936 #, c-format msgid "in %u seconds" msgstr "" #: core.cpp:1953 #, c-format msgid "Starting benchmark with %u threads" msgstr "" #: core.cpp:1976 msgid "an error occurred while starting benchmark" msgstr "" #: core.cpp:2002 msgid "Finding CPU package in fallback mode" msgstr "" #: core.cpp:2032 #, c-format msgid "Your CPU socket is not present in the database ==> %s, codename: %s" msgstr "" #: core.cpp:2052 msgid "Calculating CPU multipliers in fallback mode" msgstr "" #: core.cpp:2072 msgid "Retrieving motherboard information in fallback mode" msgstr "" #: core.cpp:2085 msgid "failed to retrieve motherboard information (fallback mode)" msgstr "" #: core.cpp:2127 msgid "Retrieving CPU temperature in fallback mode" msgstr "" #: core.cpp:2173 msgid "failed to retrieve CPU temperature (fallback mode)" msgstr "" #: core.cpp:2188 msgid "Retrieving CPU voltage in fallback mode" msgstr "" #: core.cpp:2200 msgid "failed to retrieve CPU voltage (fallback mode)" msgstr "" #: core.cpp:2214 msgid "Retrieving CPU frequency in fallback mode" msgstr "" #: core.cpp:2220 msgid "failed to retrieve CPU frequency (fallback mode)" msgstr "" #: daemon_client.cpp:65 msgid "Starting daemon in background…" msgstr "" #: daemon_client.cpp:172 msgid "pkexec: authorization could not be obtained (dialog dismissed)" msgstr "" #: daemon_client.cpp:175 msgid "pkexec: authorization could not be obtained (not authorized)" msgstr "" #: daemon_client.cpp:178 msgid "pkexec: command not found" msgstr "" #: daemon_client.cpp:181 msgid "pkexec: unexpected error code" msgstr "" #: daemon_client.cpp:211 msgid "Connecting to daemon…" msgstr "" #: daemon_server.cpp:261 #, c-format msgid "request_handler: case %i not handled" msgstr "" #: data.cpp:124 cpu-x-gtk-3.12.ui:1370 msgid "CPU" msgstr "" #: data.cpp:187 msgid "P-core" msgstr "" #: data.cpp:188 msgid "E-core" msgstr "" #: data.cpp:189 data.cpp:192 msgid "Core" msgstr "" #: data.cpp:208 cpu-x-gtk-3.12.ui:746 msgid "Processor" msgstr "" #: data.cpp:240 data.cpp:329 cpu-x-gtk-3.12.ui:1968 msgid "Caches" msgstr "" #: data.cpp:247 #, c-format msgid "%2d x %4d %s, %2d-way" msgstr "" #: data.cpp:249 #, c-format msgid "%d %s, %d-way" msgstr "" #: data.cpp:263 msgid "Count" msgstr "" #: data.cpp:276 cpu-x-gtk-3.12.ui:968 msgid "Clocks" msgstr "" #: data.cpp:379 data.cpp:383 #, c-format msgid "L%u Cache" msgstr "" #: data.cpp:385 #, c-format msgid "%s associative, %d-%s line size" msgstr "" #: data.cpp:398 msgid "Test" msgstr "" #: data.cpp:409 data.cpp:423 cpu-x-gtk-3.12.ui:2146 cpu-x-gtk-3.12.ui:2517 msgid "Motherboard" msgstr "" #: data.cpp:437 cpu-x-gtk-3.12.ui:2367 msgid "BIOS" msgstr "" #: data.cpp:452 cpu-x-gtk-3.12.ui:2498 msgid "Chipset" msgstr "" #: data.cpp:467 data.cpp:569 cpu-x-gtk-3.12.ui:3156 cpu-x-gtk-3.12.ui:3761 msgid "Memory" msgstr "" #: data.cpp:483 #, c-format msgid "Stick %u" msgstr "" #: data.cpp:487 cpu-x-gtk-3.12.ui:3134 msgid "Sticks" msgstr "" #: data.cpp:541 cpu-x-gtk-3.12.ui:3780 msgid "System" msgstr "" #: data.cpp:554 cpu-x-gtk-3.12.ui:3380 msgid "Operating System" msgstr "" #: data.cpp:587 cpu-x-gtk-3.12.ui:4960 msgid "Graphics" msgstr "" #: data.cpp:621 #, c-format msgid "Card %u" msgstr "" #: data.cpp:625 cpu-x-gtk-3.12.ui:4938 msgid "Cards" msgstr "" #: data.cpp:672 cpu-x-gtk-3.12.ui:5300 msgid "Bench" msgstr "" #: data.cpp:685 msgid "Not started" msgstr "" #: data.cpp:688 cpu-x-gtk-3.12.ui:5070 msgid "Prime numbers (slow)" msgstr "" #: data.cpp:692 cpu-x-gtk-3.12.ui:5178 msgid "Prime numbers (fast)" msgstr "" #: data.cpp:696 cpu-x-gtk-3.12.ui:5281 msgid "Parameters" msgstr "" #: data.cpp:721 data.cpp:727 #, c-format msgid "%u mins" msgstr "" #: data.cpp:734 cpu-x-gtk-3.12.ui:5444 cpu-x-gtk-3.12.ui:5552 msgid "About" msgstr "" #: data.cpp:739 #, c-format msgid "%s is a Free software that gathers information\n" "on CPU, motherboard and more." msgstr "" #: data.cpp:744 msgid "About CPU-X" msgstr "" #: data.cpp:745 #, c-format msgid "Version %s" msgstr "" #: data.cpp:746 #, c-format msgid "Author: %s" msgstr "" #: data.cpp:747 #, c-format msgid "Site: %s" msgstr "" #: data.cpp:751 cpu-x-gtk-3.12.ui:5533 msgid "License" msgstr "" #: data.cpp:753 #, c-format msgid "This software is distributed under the terms of %s" msgstr "" #: data.cpp:754 main.cpp:176 msgid "This program comes with ABSOLUTELY NO WARRANTY" msgstr "" #: gui_gtk.cpp:61 #, c-format msgid "Cannot find path for '%s' file" msgstr "" #: gui_gtk.cpp:400 msgid "Start daemon" msgstr "" #: gui_gtk.cpp:403 msgid "Connected to daemon" msgstr "" #: gui_gtk.cpp:406 msgid "No polkit authentication agent found" msgstr "" #: gui_gtk.cpp:411 msgid "Ask password to start daemon in background" msgstr "" #: gui_gtk.cpp:415 msgid "Settings" msgstr "" #: gui_gtk.cpp:634 msgid "BaseFamily" msgstr "" #: gui_gtk.cpp:635 msgid "CPU display (\"true\") family (computed as BaseFamily+ExtendedFamily)" msgstr "" #: gui_gtk.cpp:636 msgid "BaseModel" msgstr "" #: gui_gtk.cpp:637 msgid "CPU display (\"true\") model (computed as " "(ExtendedModel<<4)+BaseModel)" msgstr "" #: gui_gtk.cpp:847 msgid "Identify the physically-labeled socket or board position where the " "memory device is located" msgstr "" #: gui_gtk.cpp:848 msgid "Identify the physically labeled bank where the memory device is " "located" msgstr "" #: gui_gtk.cpp:1052 msgid "User Mode Driver Version" msgstr "" #: gui_gtk.cpp:1066 msgid "Vulkan Ray Tracing" msgstr "" #: gui_gtk.cpp:1260 msgid "Starting GTK GUI…" msgstr "" #: gui_gtk.cpp:1272 msgid "failed to import UI in GtkBuilder" msgstr "" #: main.cpp:63 msgid "Start graphical user interface (GUI) (default)" msgstr "" #: main.cpp:64 msgid "Start text-based user interface (TUI)" msgstr "" #: main.cpp:65 msgid "Dump all data on standard output and exit" msgstr "" #: main.cpp:66 msgid "Run embedded command dmidecode and exit" msgstr "" #: main.cpp:67 msgid "Run embedded command bandwidth and exit" msgstr "" #: main.cpp:68 msgid "Set temperature unit (c[elsius]|f[ahrenheit]|k[elvin]|r[ankine])" msgstr "" #: main.cpp:69 msgid "Set custom time between two refreshes (in seconds)" msgstr "" #: main.cpp:70 msgid "Set default tab (integer)" msgstr "" #: main.cpp:71 msgid "Select core type to monitor (integer)" msgstr "" #: main.cpp:72 msgid "Select CPU core to monitor (integer)" msgstr "" #: main.cpp:73 msgid "Set custom bandwidth test for CPU caches speed (integer)" msgstr "" #: main.cpp:74 msgid "Select default memory stick (integer)" msgstr "" #: main.cpp:75 msgid "Select default graphic card (integer)" msgstr "" #: main.cpp:76 cpu-x-gtk-3.12.ui:5910 msgid "Start and connect to daemon" msgstr "" #: main.cpp:77 msgid "Verbose output" msgstr "" #: main.cpp:78 msgid "Print help and exit" msgstr "" #: main.cpp:79 msgid "Print version and exit" msgstr "" #: main.cpp:80 msgid "Print CPUID values in decimal (default is hexadeximal)" msgstr "" #: main.cpp:81 msgid "Disable colored output" msgstr "" #: main.cpp:82 msgid "Print information for debugging" msgstr "" #: main.cpp:83 msgid "Print required information to paste in an issue" msgstr "" #: main.cpp:84 msgid "Set key mapping for NCurses mode (a[rrows]|e[macs]|i[nverted-T]|" "v[im])" msgstr "" #: main.cpp:95 msgid "Add default command line arguments" msgstr "" #: main.cpp:96 msgid "Enforce the bus clock" msgstr "" #: main.cpp:97 msgid "Ignore CPU values reported by libcpuid (comma-separated values among " "'temp', 'volt' and 'freq')" msgstr "" #: main.cpp:98 msgid "Read CPUID raw data from a given file" msgstr "" #: main.cpp:99 msgid "Only print a message if CPU is not present in the database" msgstr "" #: main.cpp:126 #, c-format msgid "Usage: %s DISPLAY [OPTIONS]\n" msgstr "" #: main.cpp:127 msgid "Available DISPLAY:" msgstr "" #: main.cpp:135 msgid "Available OPTIONS:" msgstr "" #: main.cpp:144 msgid "Influenceable environment variables:" msgstr "" #: main.cpp:175 msgid "This is free software: you are free to change and redistribute it." msgstr "" #: main.cpp:177 #, c-format msgid "See the %s license: <%s>\n" msgstr "" #: main.cpp:184 #, c-format msgid "-- %-9s version: %s" msgstr "" #: main.cpp:381 #, c-format msgid "\n" "Oops, something was wrong! %s has received signal %d (%s) and has " "crashed." msgstr "" #: main.cpp:383 #, c-format msgid "\n" "Oops, something was wrong! %s has received signal %d (%s) and is " "trying to recover." msgstr "" #: main.cpp:407 msgid "You can open a new issue here, by filling the template as requested:" msgstr "" #: main.cpp:449 msgid "an error occurred while setting locale" msgstr "" #: options.cpp:124 #, c-format msgid "Selected CPU type (%u) is not a valid number (%u is the maximum for " "this CPU)" msgstr "" #: options.cpp:145 #, c-format msgid "Selected bandwidth test (%u) is not a valid number (%u is the " "maximum for this system)" msgstr "" #: options.cpp:168 #, c-format msgid "Selected RAM stick (%u) is not a valid number (%u is the maximum for " "this system)" msgstr "" #: options.cpp:188 #, c-format msgid "Selected graphic card (%u) is not a valid number (%u is the maximum " "for this system)" msgstr "" #: options.cpp:204 #, c-format msgid "failed to change CPU affinitiy to core %u" msgstr "" #: options.cpp:210 #, c-format msgid "Selected CPU core (%u) is not a valid number (%u is the maximum for " "this type of core)" msgstr "" #: options.cpp:284 #, c-format msgid "Selected tab (%u) is not a valid number (%u is the maximum)" msgstr "" #: tui_ncurses.cpp:111 msgid "Window is too small!" msgstr "" #: tui_ncurses.cpp:119 msgid "Press 'h' to see help." msgstr "" #: tui_ncurses.cpp:232 #, c-format msgid "Welcome in %s NCurses help!\n" msgstr "" #: tui_ncurses.cpp:233 msgid "This help describes how to use this Text-based User Interface." msgstr "" #: tui_ncurses.cpp:235 msgid "Global keys:" msgstr "" #: tui_ncurses.cpp:236 msgid "Press 'left' key or 'tab' key to switch in left tab." msgstr "" #: tui_ncurses.cpp:237 msgid "Press 'right' key or 'shift + tab' keys to switch in right tab." msgstr "" #: tui_ncurses.cpp:238 msgid "Press 'h' key to see this help." msgstr "" #: tui_ncurses.cpp:239 msgid "Press 'q' key to exit." msgstr "" #: tui_ncurses.cpp:241 msgid "CPU tab:" msgstr "" #: tui_ncurses.cpp:242 msgid "Press 'next page' key to decrease core type number to monitor." msgstr "" #: tui_ncurses.cpp:243 msgid "Press 'previous page' key to increase core type number to monitor." msgstr "" #: tui_ncurses.cpp:244 msgid "Press 'down' key to decrease CPU core number to monitor." msgstr "" #: tui_ncurses.cpp:245 msgid "Press 'up' key to increase CPU core number to monitor." msgstr "" #: tui_ncurses.cpp:247 msgid "Caches tab:" msgstr "" #: tui_ncurses.cpp:248 msgid "Press 'down' key to switch to previous test." msgstr "" #: tui_ncurses.cpp:249 msgid "Press 'up' key to switch to next test." msgstr "" #: tui_ncurses.cpp:251 msgid "Bench tab:" msgstr "" #: tui_ncurses.cpp:252 msgid "Press 'down' key to decrement benchmark duration." msgstr "" #: tui_ncurses.cpp:253 msgid "Press 'up' key to increment benchmark duration." msgstr "" #: tui_ncurses.cpp:254 msgid "Press 'next page' key to decrement number of threads to use." msgstr "" #: tui_ncurses.cpp:255 msgid "Press 'previous page' key to increment number of threads to use." msgstr "" #: tui_ncurses.cpp:256 msgid "Press 's' key to start/stop prime numbers (slow) benchmark." msgstr "" #: tui_ncurses.cpp:257 msgid "Press 'f' key to start/stop prime numbers (fast) benchmark." msgstr "" #: tui_ncurses.cpp:259 msgid "Graphics tab:" msgstr "" #: tui_ncurses.cpp:260 msgid "Press 'down' key to switch to previous graphic card." msgstr "" #: tui_ncurses.cpp:261 msgid "Press 'up' key to switch to next graphic card." msgstr "" #: tui_ncurses.cpp:263 msgid "Press any key to exit this help." msgstr "" #: tui_ncurses.cpp:640 msgid "Starting NCurses TUI…" msgstr "" #: tui_ncurses.cpp:649 msgid "FATAL ERROR: terminfo database could not be found (try to set " "TERMINFO environment variable)" msgstr "" #: tui_ncurses.cpp:654 #, c-format msgid "Failed to set up %s terminal (err=%i); falling back to %s" msgstr "" #: util.cpp:189 #, c-format msgid "cannot find unit in '%s' string at position %i" msgstr "" #: util.cpp:252 #, c-format msgid "an error occurred while opening file '%s'" msgstr "" #: util.cpp:297 #, c-format msgid "an error occurred while running command '%s'" msgstr "" #: util.cpp:437 msgid "set_cpu_affinity() not supported on this operating system" msgstr "" #: data.hpp:103 data.hpp:244 data.hpp:332 msgid "Vendor" msgstr "" #: data.hpp:104 msgid "Code Name" msgstr "" #: data.hpp:105 msgid "Package" msgstr "" #: data.hpp:106 msgid "Technology" msgstr "" #: data.hpp:107 data.hpp:268 msgid "Voltage" msgstr "" #: data.hpp:108 msgid "Specification" msgstr "" #: data.hpp:109 msgid "Family" msgstr "" #: data.hpp:110 msgid "Disp. Family" msgstr "" #: data.hpp:111 data.hpp:224 data.hpp:245 data.hpp:335 msgid "Model" msgstr "" #: data.hpp:112 msgid "Disp. Model" msgstr "" #: data.hpp:113 msgid "Temp." msgstr "" #: data.hpp:114 msgid "Stepping" msgstr "" #: data.hpp:115 msgid "Instructions" msgstr "" #: data.hpp:125 msgid "L1 Data" msgstr "" #: data.hpp:126 msgid "L1 Inst." msgstr "" #: data.hpp:127 msgid "Level 2" msgstr "" #: data.hpp:128 msgid "Level 3" msgstr "" #: data.hpp:137 cpu-x-gtk-3.12.ui:1232 msgid "Cores" msgstr "" #: data.hpp:138 data.hpp:408 cpu-x-gtk-3.12.ui:1252 msgid "Threads" msgstr "" #: data.hpp:155 msgid "Core Speed" msgstr "" #: data.hpp:156 msgid "Multiplier" msgstr "" #: data.hpp:157 msgid "Bus Speed" msgstr "" #: data.hpp:158 data.hpp:341 msgid "Usage" msgstr "" #: data.hpp:188 data.hpp:265 msgid "Size" msgstr "" #: data.hpp:189 data.hpp:267 msgid "Speed" msgstr "" #: data.hpp:223 data.hpp:259 msgid "Manufacturer" msgstr "" #: data.hpp:225 msgid "Revision" msgstr "" #: data.hpp:233 msgid "Brand" msgstr "" #: data.hpp:234 msgid "Version" msgstr "" #: data.hpp:235 msgid "Date" msgstr "" #: data.hpp:236 msgid "ROM Size" msgstr "" #: data.hpp:260 msgid "Part Number" msgstr "" #: data.hpp:261 msgid "Type" msgstr "" #: data.hpp:262 msgid "Type Detail" msgstr "" #: data.hpp:263 msgid "Device Locator" msgstr "" #: data.hpp:264 msgid "Bank Locator" msgstr "" #: data.hpp:266 msgid "Rank" msgstr "" #: data.hpp:292 msgid "Name" msgstr "" #: data.hpp:293 msgid "Kernel" msgstr "" #: data.hpp:294 msgid "Hostname" msgstr "" #: data.hpp:295 msgid "Uptime" msgstr "" #: data.hpp:303 msgid "Used" msgstr "" #: data.hpp:304 msgid "Buffers" msgstr "" #: data.hpp:305 msgid "Cached" msgstr "" #: data.hpp:306 msgid "Free" msgstr "" #: data.hpp:307 msgid "Swap" msgstr "" #: data.hpp:333 msgid "Driver" msgstr "" #: data.hpp:334 msgid "UMD Version" msgstr "" #: data.hpp:336 msgid "Compute Unit" msgstr "" #: data.hpp:337 msgid "Device ID" msgstr "" #: data.hpp:338 msgid "VBIOS Version" msgstr "" #. #-#-#-#-# source_ui.pot (cpu-x ) #-#-#-#-# #. Setting: "Interface" tab #: data.hpp:339 cpu-x-gtk-3.12.ui:5807 msgid "Interface" msgstr "" #: data.hpp:340 msgid "Temperature" msgstr "" #: data.hpp:342 msgid "Core Voltage" msgstr "" #: data.hpp:343 msgid "Power Avg" msgstr "" #: data.hpp:344 msgid "Core Clock" msgstr "" #: data.hpp:345 msgid "Memory Clock" msgstr "" #: data.hpp:346 msgid "Memory Used" msgstr "" #: data.hpp:347 msgid "Resizable BAR" msgstr "" #: data.hpp:348 msgid "Vulkan RT" msgstr "" #: data.hpp:349 msgid "OpenGL Version" msgstr "" #: data.hpp:350 msgid "Vulkan Version" msgstr "" #: data.hpp:351 msgid "OpenCL Version" msgstr "" #: data.hpp:387 msgid "Score" msgstr "" #: data.hpp:388 msgid "Run" msgstr "" #: data.hpp:407 msgid "Duration" msgstr "" #: util.hpp:77 msgid "bytes" msgstr "" #. TRANSLATORS: initials for kilobyte (10³): please put initials (keep it short) #: util.hpp:80 msgid "kB" msgstr "" #. TRANSLATORS: initials for megabyte (10⁶): please put initials (keep it short) #: util.hpp:82 msgid "MB" msgstr "" #. TRANSLATORS: initials for gigabyte (10⁹): please put initials (keep it short) #: util.hpp:84 msgid "GB" msgstr "" #. TRANSLATORS: initials for terabyte (10¹²): please put initials (keep it short) #: util.hpp:86 msgid "TB" msgstr "" #. TRANSLATORS: initials for kibibyte (2¹⁰): please put initials (keep it short) #: util.hpp:89 msgid "KiB" msgstr "" #. TRANSLATORS: initials for mebibyte (2²⁰): please put initials (keep it short) #: util.hpp:91 msgid "MiB" msgstr "" #. TRANSLATORS: initials for gibibyte (2³⁰): please put initials (keep it short) #: util.hpp:93 msgid "GiB" msgstr "" #. TRANSLATORS: initials for tebibyte (2⁴⁰): please put initials (keep it short) #: util.hpp:95 msgid "TiB" msgstr "" #: cpu-x-gtk-3.12.ui:1184 msgid "Cache" msgstr "" #. Setting: refresh time for UI #: cpu-x-gtk-3.12.ui:5721 msgid "Refresh time" msgstr "" #. Setting: GUI theme #: cpu-x-gtk-3.12.ui:5745 msgid "Text theme" msgstr "" #. Setting: automatic GUI theme #: cpu-x-gtk-3.12.ui:5760 msgid "Automatic" msgstr "" #. Setting: light GUI theme #: cpu-x-gtk-3.12.ui:5761 msgid "Blue for light theme" msgstr "" #. Setting: dark GUI theme #: cpu-x-gtk-3.12.ui:5762 msgid "Yellow for dark theme" msgstr "" #. Setting: temperature unit #: cpu-x-gtk-3.12.ui:5775 msgid "Temperature unit" msgstr "" #. Setting: default tab at startup #: cpu-x-gtk-3.12.ui:5826 msgid "Default tab" msgstr "" #. Setting: default CPU core at startup #: cpu-x-gtk-3.12.ui:5839 msgid "Default CPU core" msgstr "" #. Setting: default cache test at startup #: cpu-x-gtk-3.12.ui:5852 msgid "Default cache test" msgstr "" #. Setting: print CPUID values in decimal or hexadecimal #: cpu-x-gtk-3.12.ui:5895 msgid "Print CPUID values in decimal" msgstr "" #. Setting: default graphic card at startup #: cpu-x-gtk-3.12.ui:5928 msgid "Default graphic card" msgstr "" #. Setting: default CPU core at startup #: cpu-x-gtk-3.12.ui:5952 msgid "Default core type" msgstr "" #. Setting: default graphic card at startup #: cpu-x-gtk-3.12.ui:5976 msgid "Default memory stick" msgstr "" #. Setting: "Startup" tab #: cpu-x-gtk-3.12.ui:6004 msgid "Startup" msgstr "" CPU-X-5.0.3/po/cs_CZ.po000066400000000000000000001311601454622605200143420ustar00rootroot00000000000000# Copyright © 2014-2024 The Tumultuous Unicorn Of Darkness # This file is distributed under the same license as the CPU-X package. # Translators: # Pavel Borecki , 2017-2018 # Jiri Tersel , 2019. # Allan Nordhøy , 2020. # cosita official , 2022. msgid "" msgstr "" "Project-Id-Version: CPU-X\n" "Report-Msgid-Bugs-To: https://github.com/TheTumultuousUnicornOfDarkness/CPU-" "X/issues\n" "POT-Creation-Date: 2023-12-09 13:09+0100\n" "PO-Revision-Date: 2022-11-03 07:08+0000\n" "Last-Translator: cosita official \n" "Language-Team: Czech \n" "Language: cs_CZ\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=4; plural=(n == 1 && n % 1 == 0) ? 0 : (n >= 2 && n " "<= 4 && n % 1 == 0) ? 1: (n % 1 != 0 ) ? 2 : 3;\n" "X-Generator: Weblate 4.14.2-dev\n" #: core.cpp:135 msgid "Finding CPU technology" msgstr "Zjišťování technologie procesoru" #: core.cpp:161 #, fuzzy, c-format #| msgid "" #| "Your CPU does not belong in database ==> %s, model: %i, ext. model: %i, " #| "ext. family: %i" msgid "" "Your CPU is not present in the database ==> %s, model: %i, ext. model: %i, " "ext. family: %i" msgstr "" "Váš procesor se nenachází v databázi ==> %s, model: %i, model podrobněji: " "%i, řada podrobněji: %i" #: core.cpp:189 data.cpp:150 data.cpp:342 msgid "unknown" msgstr "neznámé" #: core.cpp:230 msgid "Calling libcpuid for retrieving static data" msgstr "Získávání statických údajů prostřednictvím knihovny libcpuid" #: core.cpp:245 #, c-format msgid "failed to call libcpuid (%s)" msgstr "nepodařilo se zavolat knihovnu libcpuid (%s)" #: core.cpp:340 msgid "Calling libcpuid for retrieving dynamic data" msgstr "Získávání dynamických údajů prostřednictvím knihovny libcpuid" #: core.cpp:353 msgid "Calling libcpuid for retrieving CPU MSR static values" msgstr "" "Získávání statických hodnot MSR registru procesoru prostřednictvím knihovny " "libcpuid" #: core.cpp:380 msgid "Calling libcpuid for retrieving CPU MSR dynamic values" msgstr "" "Získávání dynamických hodnot MSR registru procesoru prostřednictvím knihovny " "libcpuid" #: core.cpp:412 msgid "Calling dmidecode" msgstr "Získávání údajů prostřednictvím nástroje dmidecode" #: core.cpp:454 core.cpp:473 #, c-format msgid "%s (configured)" msgstr "" #: core.cpp:461 core.cpp:480 #, c-format msgid "%s (max)" msgstr "" #: core.cpp:466 #, c-format msgid "%s (min)" msgstr "" #: core.cpp:496 msgid "Calculating CPU usage" msgstr "Výpočet vytížení procesoru" #: core.cpp:546 msgid "Calling bandwidth" msgstr "Zjišťování údajů prostřednictvím nástroje bandwidth" #: core.cpp:613 #, c-format msgid "" "pci_access is not properly initialized: it is a common issue when %s was " "built with a lower libpci version.\n" "Check that libpci %s library is present on your system. Otherwise, please " "rebuild %s." msgstr "" "pci_access není dobře načetlý: je to obyčejná chyba když probíhal build %s s " "nižší libpci verzí.\n" "Zkontroluj že libpci %s je up-to date na vašem systému. Jinak skuste rebuild " "%s." #: core.cpp:657 #, fuzzy, c-format msgid "No kernel driver in use for graphic card at path %s" msgstr "Žádný kernelový ovladač není použit pro grafickou kartu v cestě %s" #: core.cpp:693 #, c-format msgid "Your GPU kernel driver is unknown: %s" msgstr "Neznámý ovladač grafického čipu: %s" #: core.cpp:777 #, fuzzy, c-format #| msgid "Your GPU driver is unknown: %s" msgid "Your GPU user mode driver is unknown for vendor %s: %s" msgstr "Neznámý ovladač usermodu: %s" #: core.cpp:781 #, c-format msgid "failed to call GLFW (%i): %s" msgstr "nepodařilo se zavolat knihovnu libcpuid (%s)" #: core.cpp:914 msgid "Finding Vulkan API version" msgstr "Hledám verzi Vulkan API" #: core.cpp:926 #, c-format msgid "failed to call vkCreateInstance (%s)" msgstr "nepodařilo se zavolat vkCreateInstance (%s)" #: core.cpp:929 #, c-format msgid "%s is not supported" msgstr "%s není podporován" #: core.cpp:937 #, c-format msgid "failed to call vkEnumeratePhysicalDevices (%s)" msgstr "nepodařilo se zavolat vkEnumeratePhysicalDevices (%s)" #: core.cpp:944 msgid "No available Vulkan devices" msgstr "Žádné dostupné Vulkan zařízení" #: core.cpp:952 #, c-format msgid "No available physical devices (%s)" msgstr "Žádné dostupné fyzické zařízení (%s)" #: core.cpp:1015 #, c-format msgid "Failed to create Vulkan for device %u (%s)" msgstr "nepodařil se vytvořit Vulkan pro zařízení %u (%s)" #: core.cpp:1019 #, c-format msgid "%s is not supported for device %u, use only deviceID for matching" msgstr "" "%s není podporované pro zařízení %u, použijte pouze deviceID pro porovnání" #: core.cpp:1051 core.cpp:1364 msgid "Enabled" msgstr "Zapnuto" #: core.cpp:1051 core.cpp:1364 msgid "Disabled" msgstr "Vypnuto" #: core.cpp:1088 #, fuzzy #| msgid "Finding Vulkan API version" msgid "Finding OpenCL API version" msgstr "Hledám verzi Vulkan API" #: core.cpp:1092 #, c-format msgid "There is no platform with OpenCL support (%s)" msgstr "Není žádná platforma s podporou pro OpenCL (%s)" #: core.cpp:1102 #, fuzzy, c-format #| msgid "failed to call dmidecode" msgid "failed to get all OpenCL platforms (%s)" msgstr "nepodařilo se zavolat nástroj dmidecode" #: core.cpp:1115 #, fuzzy, c-format #| msgid "failed to perform the Curl transfer (%s)" msgid "failed to get name for platform %u (%s)" msgstr "Nepodařilo se provést přenos nástrojem Curl (%s)" #: core.cpp:1123 #, fuzzy, c-format #| msgid "failed to perform the Curl transfer (%s)" msgid "failed to get version for platform %u (%s)" msgstr "Nepodařilo se provést přenos nástrojem Curl (%s)" #: core.cpp:1131 #, c-format msgid "failed to find number of OpenCL devices for platform '%s %s' (%s)" msgstr "chyba při hledání počtu OpenCL zařízení pro platformu '%s %s' (%s)" #: core.cpp:1131 #, fuzzy #| msgid "Finding devices" msgid "0 device" msgstr "Hledání zařízení" #: core.cpp:1140 #, fuzzy, c-format msgid "failed to get all of OpenCL devices for platform '%s %s' (%s)" msgstr "" "proběhla chyba při hledání všech OpenCL zařízení pro platformu '%s %s' (%s)" #: core.cpp:1160 #, fuzzy, c-format #| msgid "failed to call libcpuid (%s)" msgid "failed to get name for device %u (%s)" msgstr "nepodařilo se zavolat knihovnu libcpuid (%s)" #: core.cpp:1168 #, fuzzy, c-format #| msgid "failed to find graphic card driver (%s)" msgid "failed to get version for device %u (%s)" msgstr "nepodařilo se zjistit ovladač grafické karty (%s)" #: core.cpp:1190 #, c-format msgid "OpenCL driver for '%s %s' does not support CL_DEVICE_TOPOLOGY_AMD (%s)" msgstr "OpenCL ovladač pro '%s %s' nepodporuje CL_DEVICE_TOPOLOGY_AMD (%s)" #: core.cpp:1201 #, c-format msgid "" "OpenCL driver for '%s %s' does not support CL_DEVICE_GFXIP_MAJOR_AMD (%s)" msgstr "OpenCL ovladač pro '%s %s' nepodporuje CL_DEVICE_GFXIP_MAJOR_AMD (%s)" #: core.cpp:1209 core.cpp:1229 core.cpp:1262 #, c-format msgid "" "OpenCL driver for '%s %s' does not support CL_DEVICE_MAX_COMPUTE_UNITS (%s)" msgstr "OpenCL ovladač '%s %s' nepodporuje CL_DEVICE_MAX_COMPUTE_UNITS (%s)" #: core.cpp:1250 #, c-format msgid "" "OpenCL driver for '%s %s' does not support CL_DEVICE_PCI_DOMAIN_ID_NV (%s), " "CL_DEVICE_PCI_BUS_ID_NV (%s) or CL_DEVICE_PCI_SLOT_ID_NV (%s)" msgstr "" "OpenCL ovladač '%s %s' nepodporuje CL_DEVICE_PCI_DOMAIN_ID_NV (%s), " "CL_DEVICE_PCI_BUS_ID_NV (%s) nebo CL_DEVICE_PCI_SLOT_ID_NV (%s)" #: core.cpp:1273 #, c-format msgid "OpenCL is not supported with your GPU vendor (0x%X)" msgstr "OpenCL není podporován vaším vendorem GPU (0x%X)" #: core.cpp:1295 msgid "Finding devices" msgstr "Hledání zařízení" #: core.cpp:1307 #, fuzzy, c-format #| msgid "Skip devices search (need to be root)" msgid "Skip devices search (wrong permissions on %s device)" msgstr "" "Přeskočit vyhledávání zařízení (je třeba mít práva správce systému – root)" #: core.cpp:1350 #, c-format msgid "Your GPU vendor is unknown: %s (0x%X)" msgstr "Neznámý výrobce grafického čipu: %s (0x%X)" #: core.cpp:1370 msgid "failed to find chipset vendor and model" msgstr "nepodařilo se určit výrobce a model čipové sady" #: core.cpp:1385 msgid "failed to find graphic card vendor and model" msgstr "nepodařilo se určit výrobce a model grafického čipu" #: core.cpp:1487 msgid "Retrieving GPU clocks" msgstr "Zjišťování taktů graf. čipu" #: core.cpp:1500 msgid "None" msgstr "Žádný" #: core.cpp:1509 #, c-format msgid "DRM path for %s is unknown" msgstr "" #: core.cpp:1516 #, c-format msgid "Card number for %s is unknown" msgstr "" #: core.cpp:1541 #, c-format msgid "PCIe %s (current) / %s (max)" msgstr "" #: core.cpp:1650 #, fuzzy, c-format #| msgid "Driver for GPU %i doesn't report frequencies" msgid "Driver for %s doesn't report frequencies" msgstr "Ovladač graf. čipu %i nehlásí takty" #: core.cpp:1671 #, fuzzy, c-format #| msgid "failed to call dmidecode" msgid "failed to retrieve all monitoring data for %s" msgstr "nepodařilo se zavolat nástroj dmidecode" #: core.cpp:1694 msgid "Identifying running system" msgstr "Rozpoznávání operačního systému, ve kterém je spuštěné" #: core.cpp:1697 msgid "failed to identify running system" msgstr "nepodařilo se rozpoznat operační systém, ve kterém je spuštěné" #: core.cpp:1749 core.cpp:1778 msgid "Calling libprocps" msgstr "Zjišťování údajů prostřednictvím knihovny libprocps" #: core.cpp:1752 msgid "unable to get system uptime" msgstr "chyba při hledání system uptime" #: core.cpp:1758 msgid "unable to create meminfo structure" msgstr "" #: core.cpp:1804 msgid "Calling libstatgrab" msgstr "Zjišťování údajů prostřednictvím knihovny libstatgrab" #: core.cpp:1852 #, c-format msgid "%i days, %i hours, %i minutes, %i seconds" msgstr "%i dnů, %i hodin, %i minut, %i sekund" #: core.cpp:1915 msgid "Updating benchmark status" msgstr "Aktualizace stavu výkonostního testu" #: core.cpp:1918 msgid "Active" msgstr "Aktivní" #: core.cpp:1921 #, c-format msgid "(%u hours left)" msgstr "(zbývá %u hodin)" #: core.cpp:1923 #, c-format msgid "(%u minutes left)" msgstr "(zbývá %u minut)" #: core.cpp:1925 #, c-format msgid "(%u seconds left)" msgstr "(zbývá %u sekund)" #: core.cpp:1929 core.cpp:1984 core.cpp:1985 msgid "Inactive" msgstr "Neaktivní" #: core.cpp:1932 #, c-format msgid "in %u hours" msgstr "za %u hodin" #: core.cpp:1934 #, c-format msgid "in %u minutes" msgstr "za %u minut" #: core.cpp:1936 #, c-format msgid "in %u seconds" msgstr "za %u sekund" #: core.cpp:1953 #, fuzzy, c-format #| msgid "Starting benchmark" msgid "Starting benchmark with %u threads" msgstr "Spouštění výkonnostního testu" #: core.cpp:1976 msgid "an error occurred while starting benchmark" msgstr "při spouštění výkonnostního testu se vyskytla chyba" #: core.cpp:2002 msgid "Finding CPU package in fallback mode" msgstr "Typ pouzdra procesoru zjištován v náhradním režimu" #: core.cpp:2032 #, fuzzy, c-format #| msgid "Your CPU socket does not belong in database ==> %s, codename: %s" msgid "Your CPU socket is not present in the database ==> %s, codename: %s" msgstr "" "Patice vašeho procesoru se nenachází v databázi ==> %s, krycí název: %s" #: core.cpp:2052 msgid "Calculating CPU multipliers in fallback mode" msgstr "Násobiče frekvence procesoru zjišťovány v náhradním režimu" #: core.cpp:2072 msgid "Retrieving motherboard information in fallback mode" msgstr "Informace o základní desce zjišťovány v náhradním režimu" #: core.cpp:2085 msgid "failed to retrieve motherboard information (fallback mode)" msgstr "nepodařilo se získat informace o základní desce (náhradní režim)" #: core.cpp:2127 msgid "Retrieving CPU temperature in fallback mode" msgstr "Teplota procesoru zjišťována v náhradním režimu" #: core.cpp:2173 msgid "failed to retrieve CPU temperature (fallback mode)" msgstr "nepodařilo se zjistit teplotu procesoru (náhradní režim)" #: core.cpp:2188 msgid "Retrieving CPU voltage in fallback mode" msgstr "Provozní napětí procesoru zjišťováno v náhradním režimu" #: core.cpp:2200 msgid "failed to retrieve CPU voltage (fallback mode)" msgstr "nepodařilo se zjistit provozní napětí procesoru (náhradní režim)" #: core.cpp:2214 msgid "Retrieving CPU frequency in fallback mode" msgstr "Takty graf. čipu zjišťovány v náhradním režimu" #: core.cpp:2220 msgid "failed to retrieve CPU frequency (fallback mode)" msgstr "nepodařilo se zjistit takt procesoru (náhradní režim)" #: daemon_client.cpp:65 msgid "Starting daemon in background…" msgstr "" #: daemon_client.cpp:172 msgid "pkexec: authorization could not be obtained (dialog dismissed)" msgstr "" #: daemon_client.cpp:175 msgid "pkexec: authorization could not be obtained (not authorized)" msgstr "" #: daemon_client.cpp:178 msgid "pkexec: command not found" msgstr "" #: daemon_client.cpp:181 msgid "pkexec: unexpected error code" msgstr "" #: daemon_client.cpp:211 msgid "Connecting to daemon…" msgstr "" #: daemon_server.cpp:261 #, c-format msgid "request_handler: case %i not handled" msgstr "" #: data.cpp:124 cpu-x-gtk-3.12.ui:1370 msgid "CPU" msgstr "Procesor" #: data.cpp:187 #, fuzzy #| msgid "Score" msgid "P-core" msgstr "Výsledek" #: data.cpp:188 #, fuzzy #| msgid "Score" msgid "E-core" msgstr "Výsledek" #: data.cpp:189 data.cpp:192 #, fuzzy #| msgid "Core(s)" msgid "Core" msgstr "Jádra" #: data.cpp:208 cpu-x-gtk-3.12.ui:746 msgid "Processor" msgstr "Procesor" #: data.cpp:240 data.cpp:329 cpu-x-gtk-3.12.ui:1968 msgid "Caches" msgstr "Mezipaměti" #: data.cpp:247 #, fuzzy, c-format #| msgid "%d x %d %s, %d-way" msgid "%2d x %4d %s, %2d-way" msgstr "%d x %d %s, %d-cestná" #: data.cpp:249 #, c-format msgid "%d %s, %d-way" msgstr "%d %s, %d-cestná" #: data.cpp:263 msgid "Count" msgstr "" #: data.cpp:276 cpu-x-gtk-3.12.ui:968 msgid "Clocks" msgstr "Takty" #: data.cpp:379 data.cpp:383 #, fuzzy, c-format #| msgid "L%i Cache" msgid "L%u Cache" msgstr "mezipaměť %i úrovně" #: data.cpp:385 #, fuzzy, c-format #| msgid "%s associative, %d-byte line size" msgid "%s associative, %d-%s line size" msgstr "%s asociativní, %d-bytová velikost řádku" #: data.cpp:398 msgid "Test" msgstr "Test" #: data.cpp:409 data.cpp:423 cpu-x-gtk-3.12.ui:2146 cpu-x-gtk-3.12.ui:2517 msgid "Motherboard" msgstr "Základní deska" #: data.cpp:437 cpu-x-gtk-3.12.ui:2367 msgid "BIOS" msgstr "BIOS/(U)EFI" #: data.cpp:452 cpu-x-gtk-3.12.ui:2498 msgid "Chipset" msgstr "Čipová sada" #: data.cpp:467 data.cpp:569 cpu-x-gtk-3.12.ui:3156 cpu-x-gtk-3.12.ui:3761 msgid "Memory" msgstr "Operační paměť" #: data.cpp:483 #, c-format msgid "Stick %u" msgstr "" #: data.cpp:487 cpu-x-gtk-3.12.ui:3134 msgid "Sticks" msgstr "" #: data.cpp:541 cpu-x-gtk-3.12.ui:3780 msgid "System" msgstr "Systém" #: data.cpp:554 cpu-x-gtk-3.12.ui:3380 msgid "Operating System" msgstr "Operační systém" #: data.cpp:587 cpu-x-gtk-3.12.ui:4960 msgid "Graphics" msgstr "Grafika" #: data.cpp:621 #, fuzzy, c-format #| msgid "Card %i" msgid "Card %u" msgstr "Adaptér %i" #: data.cpp:625 cpu-x-gtk-3.12.ui:4938 #, fuzzy #| msgid "Card %i" msgid "Cards" msgstr "Adaptér %i" #: data.cpp:672 cpu-x-gtk-3.12.ui:5300 msgid "Bench" msgstr "Výkon. test" #: data.cpp:685 msgid "Not started" msgstr "Není spuštěné" #: data.cpp:688 cpu-x-gtk-3.12.ui:5070 msgid "Prime numbers (slow)" msgstr "Prvočísla (důkladně)" #: data.cpp:692 cpu-x-gtk-3.12.ui:5178 msgid "Prime numbers (fast)" msgstr "Prvočísla (zběžně)" #: data.cpp:696 cpu-x-gtk-3.12.ui:5281 msgid "Parameters" msgstr "Parametry" #: data.cpp:721 data.cpp:727 #, c-format msgid "%u mins" msgstr "%u minut" #: data.cpp:734 cpu-x-gtk-3.12.ui:5444 cpu-x-gtk-3.12.ui:5552 msgid "About" msgstr "O aplikaci" #: data.cpp:739 #, c-format msgid "" "%s is a Free software that gathers information\n" "on CPU, motherboard and more." msgstr "" "%s je svobodný software který pro vás shromažďuje\n" "o procesoru, základní desce a další." #: data.cpp:744 #, fuzzy #| msgid "About" msgid "About CPU-X" msgstr "O aplikaci" #: data.cpp:745 #, c-format msgid "Version %s" msgstr "Verze %s" #: data.cpp:746 #, c-format msgid "Author: %s" msgstr "Autor: %s" #: data.cpp:747 #, c-format msgid "Site: %s" msgstr "Webové stránky: %s" #: data.cpp:751 cpu-x-gtk-3.12.ui:5533 msgid "License" msgstr "Licence" #: data.cpp:753 #, c-format msgid "This software is distributed under the terms of %s" msgstr "Tento software je šířen za podmínek licence %s" #: data.cpp:754 main.cpp:176 msgid "This program comes with ABSOLUTELY NO WARRANTY" msgstr "Na tuto aplikaci nejsou poskytovány VŮBEC ŽÁDNÉ ZÁRUKY" #: gui_gtk.cpp:61 #, c-format msgid "Cannot find path for '%s' file" msgstr "" #: gui_gtk.cpp:400 msgid "Start daemon" msgstr "" #: gui_gtk.cpp:403 msgid "Connected to daemon" msgstr "" #: gui_gtk.cpp:406 msgid "No polkit authentication agent found" msgstr "" #: gui_gtk.cpp:411 msgid "Ask password to start daemon in background" msgstr "" #: gui_gtk.cpp:415 msgid "Settings" msgstr "" #: gui_gtk.cpp:634 #, fuzzy #| msgid "Family" msgid "BaseFamily" msgstr "Řada" #: gui_gtk.cpp:635 msgid "CPU display (\"true\") family (computed as BaseFamily+ExtendedFamily)" msgstr "" #: gui_gtk.cpp:636 #, fuzzy #| msgid "Model" msgid "BaseModel" msgstr "Model" #: gui_gtk.cpp:637 msgid "CPU display (\"true\") model (computed as (ExtendedModel<<4)+BaseModel)" msgstr "" #: gui_gtk.cpp:847 msgid "" "Identify the physically-labeled socket or board position where the memory " "device is located" msgstr "" #: gui_gtk.cpp:848 msgid "Identify the physically labeled bank where the memory device is located" msgstr "" #: gui_gtk.cpp:1052 #, fuzzy #| msgid "Version" msgid "User Mode Driver Version" msgstr "Verze" #: gui_gtk.cpp:1066 msgid "Vulkan Ray Tracing" msgstr "" #: gui_gtk.cpp:1260 #, fuzzy #| msgid "Starting GTK GUI..." msgid "Starting GTK GUI…" msgstr "Spouštění GTK grafického uživatelského rozhraní…" #: gui_gtk.cpp:1272 msgid "failed to import UI in GtkBuilder" msgstr "" "nepodařilo se importovat definici uživatelské rozhraní ve formátu GtkBuilder" #: main.cpp:63 msgid "Start graphical user interface (GUI) (default)" msgstr "Spustit grafické uživatelské rozhraní (GUI) – výchozí" #: main.cpp:64 msgid "Start text-based user interface (TUI)" msgstr "Spustit pseudografické uživatelské rozhraní (TUI)" #: main.cpp:65 msgid "Dump all data on standard output and exit" msgstr "Vypsat veškeré údaje na standardní výstup a skončit" #: main.cpp:66 msgid "Run embedded command dmidecode and exit" msgstr "Spustit vestavěný příkaz dmidecode a skončit" #: main.cpp:67 msgid "Run embedded command bandwidth and exit" msgstr "Spustit vestavěný příkaz bandwidth a skončit" #: main.cpp:68 msgid "Set temperature unit (c[elsius]|f[ahrenheit]|k[elvin]|r[ankine])" msgstr "" #: main.cpp:69 msgid "Set custom time between two refreshes (in seconds)" msgstr "Nastavit vlastní prodlevu mezi dvěma obnoveními (v sekundách)" #: main.cpp:70 msgid "Set default tab (integer)" msgstr "Nastavit výchozí kartu (celočíselná hodnota)" #: main.cpp:71 #, fuzzy #| msgid "Select CPU core to monitor (integer)" msgid "Select core type to monitor (integer)" msgstr "Vybrat jádro procesoru které monitorovat (celočíselná hodnota)" #: main.cpp:72 msgid "Select CPU core to monitor (integer)" msgstr "Vybrat jádro procesoru které monitorovat (celočíselná hodnota)" #: main.cpp:73 msgid "Set custom bandwidth test for CPU caches speed (integer)" msgstr "" "Nastavit vlastní test propustnosti mezipamětí procesoru (celočíselná hodnota)" #: main.cpp:74 #, fuzzy #| msgid "Set default tab (integer)" msgid "Select default memory stick (integer)" msgstr "Nastavit výchozí kartu (celočíselná hodnota)" #: main.cpp:75 #, fuzzy #| msgid "Set default tab (integer)" msgid "Select default graphic card (integer)" msgstr "Nastavit výchozí kartu (celočíselná hodnota)" #: main.cpp:76 cpu-x-gtk-3.12.ui:5910 msgid "Start and connect to daemon" msgstr "" #: main.cpp:77 msgid "Verbose output" msgstr "Podrobnější výstup" #: main.cpp:78 msgid "Print help and exit" msgstr "Vypsat nápovědu a skončit" #: main.cpp:79 msgid "Print version and exit" msgstr "Vypsat verzi a skončit" #: main.cpp:80 msgid "Print CPUID values in decimal (default is hexadeximal)" msgstr "" #: main.cpp:81 msgid "Disable colored output" msgstr "Vypnout obarvování výstupu" #: main.cpp:82 msgid "Print information for debugging" msgstr "" #: main.cpp:83 msgid "Print required information to paste in an issue" msgstr "Vypsat potřebné informace pro přiložení k hlášení problému" #: main.cpp:84 msgid "Set key mapping for NCurses mode (a[rrows]|e[macs]|i[nverted-T]|v[im])" msgstr "" #: main.cpp:95 msgid "Add default command line arguments" msgstr "" #: main.cpp:96 msgid "Enforce the bus clock" msgstr "Vynutit takt sběrnice" #: main.cpp:97 msgid "" "Ignore CPU values reported by libcpuid (comma-separated values among 'temp', " "'volt' and 'freq')" msgstr "" #: main.cpp:98 msgid "Read CPUID raw data from a given file" msgstr "Načíst nezpracovaná CPUID data ze zadaného souboru" #: main.cpp:99 #, fuzzy #| msgid "Only print a message if CPU does not belong in database" msgid "Only print a message if CPU is not present in the database" msgstr "Pokud procesor není v databázi, pouze vypsat hlášení" #: main.cpp:126 #, c-format msgid "Usage: %s DISPLAY [OPTIONS]\n" msgstr "Použití: %s ZOBRAZENÍ [PŘEDVOLBY]\n" #: main.cpp:127 msgid "Available DISPLAY:" msgstr "ZOBRAZENÍ k dispozici:" #: main.cpp:135 #, fuzzy #| msgid "" #| "\n" #| "Available OPTIONS:" msgid "Available OPTIONS:" msgstr "" "\n" "PŘEDVOLBY k dispozici:" #: main.cpp:144 #, fuzzy #| msgid "" #| "\n" #| "Influenceable environment variables:" msgid "Influenceable environment variables:" msgstr "" "\n" "Ovlivnitelné proměnné prostředí:" #: main.cpp:175 msgid "This is free software: you are free to change and redistribute it." msgstr "Toto je svobodný software: můžete ho upravovat a šířit dál." #: main.cpp:177 #, c-format msgid "See the %s license: <%s>\n" msgstr "Viz licence %s: <%s>\n" #: main.cpp:184 #, c-format msgid "-- %-9s version: %s" msgstr "-- %-9s verze: %s" #: main.cpp:381 #, c-format msgid "" "\n" "Oops, something was wrong! %s has received signal %d (%s) and has crashed." msgstr "" "\n" "%sJejda, něco se pokazilo! %s obdrželo signál %d (%s) a crashlo.%s" #: main.cpp:383 #, c-format msgid "" "\n" "Oops, something was wrong! %s has received signal %d (%s) and is trying to " "recover." msgstr "" "\n" "%sJejda, něco se pokazilo! %s obdrželo signál %d (%s) a pokouší se o nápravu." "%s" #: main.cpp:407 msgid "You can open a new issue here, by filling the template as requested:" msgstr "" #: main.cpp:449 msgid "an error occurred while setting locale" msgstr "při nastavování místních a jazykových nastavení došlo k chybě" #: options.cpp:124 #, c-format msgid "" "Selected CPU type (%u) is not a valid number (%u is the maximum for this CPU)" msgstr "" "Vybraný typ procesoru (CPU) (%u) není správné číslo (%u je maximum pro tento " "procesor)" #: options.cpp:145 #, fuzzy, c-format #| msgid "" #| "Selected CPU type (%u) is not a valid number (%u is the maximum for this " #| "CPU)" msgid "" "Selected bandwidth test (%u) is not a valid number (%u is the maximum for " "this system)" msgstr "" "Vybraný typ procesoru (CPU) (%u) není správné číslo (%u je maximum pro tento " "procesor)" #: options.cpp:168 #, fuzzy, c-format #| msgid "" #| "Selected CPU type (%u) is not a valid number (%u is the maximum for this " #| "CPU)" msgid "" "Selected RAM stick (%u) is not a valid number (%u is the maximum for this " "system)" msgstr "" "Vybraný typ procesoru (CPU) (%u) není správné číslo (%u je maximum pro tento " "procesor)" #: options.cpp:188 #, fuzzy, c-format #| msgid "" #| "Selected CPU core (%u) is not a valid number (%u is the maximum for this " #| "type of core)" msgid "" "Selected graphic card (%u) is not a valid number (%u is the maximum for this " "system)" msgstr "" "Vybrané jádro procesoru (%u) není správné číslo (%u je maximum pro tento typ " "jádra)" #: options.cpp:204 #, c-format msgid "failed to change CPU affinitiy to core %u" msgstr "" #: options.cpp:210 #, c-format msgid "" "Selected CPU core (%u) is not a valid number (%u is the maximum for this " "type of core)" msgstr "" "Vybrané jádro procesoru (%u) není správné číslo (%u je maximum pro tento typ " "jádra)" #: options.cpp:284 #, fuzzy, c-format #| msgid "" #| "Selected CPU type (%u) is not a valid number (%u is the maximum for this " #| "CPU)" msgid "Selected tab (%u) is not a valid number (%u is the maximum)" msgstr "" "Vybraný typ procesoru (CPU) (%u) není správné číslo (%u je maximum pro tento " "procesor)" #: tui_ncurses.cpp:111 msgid "Window is too small!" msgstr "" #: tui_ncurses.cpp:119 msgid "Press 'h' to see help." msgstr "Nápovědu zobrazíte stisknutím klávesy „H“." #: tui_ncurses.cpp:232 #, c-format msgid "Welcome in %s NCurses help!\n" msgstr "Vítejte v nápovědě pseudografické (NCurses) varianty %s!\n" #: tui_ncurses.cpp:233 msgid "This help describes how to use this Text-based User Interface." msgstr "" "Tato nápověda popisuje použití tohoto textového uživatelského rozhraní." #: tui_ncurses.cpp:235 msgid "Global keys:" msgstr "Všeobecné klávesy:" #: tui_ncurses.cpp:236 msgid "Press 'left' key or 'tab' key to switch in left tab." msgstr "" "Stiskem klávesy „Šipka vlevo“ nebo \"Tab\" se přepnete do karty nalevo." #: tui_ncurses.cpp:237 msgid "Press 'right' key or 'shift + tab' keys to switch in right tab." msgstr "" "Stiskem klávesy „Šipka vpravo“ nebo \"shift + Tab\" se přepnete do karty " "napravo." #: tui_ncurses.cpp:238 #, fuzzy #| msgid "\tPress 'h' key to see this help.\n" msgid "Press 'h' key to see this help." msgstr "\tStiskem klávesy „H“ zobrazíte tuto nápovědu.\n" #: tui_ncurses.cpp:239 #, fuzzy #| msgid "\tPress 'q' key to exit.\n" msgid "Press 'q' key to exit." msgstr "\tStiskem klávesy „Q“ aplikaci ukončíte.\n" #: tui_ncurses.cpp:241 msgid "CPU tab:" msgstr "Procesor:" #: tui_ncurses.cpp:242 #, fuzzy #| msgid "\tPress 'down' key to decrease core number to monitor.\n" msgid "Press 'next page' key to decrease core type number to monitor." msgstr "" "\tStiskem klávesy „Šipka dolů“ přejdete na monitorování jádra s nižším " "číslem.\n" #: tui_ncurses.cpp:243 #, fuzzy #| msgid "\tPress 'up' key to increase core number to monitor.\n" msgid "Press 'previous page' key to increase core type number to monitor." msgstr "" "\tStiskem klávesy „Šipka dolů“ přejdete na monitorování jádra s vyšším " "číslem.\n" #: tui_ncurses.cpp:244 #, fuzzy #| msgid "\tPress 'down' key to decrease core number to monitor.\n" msgid "Press 'down' key to decrease CPU core number to monitor." msgstr "" "\tStiskem klávesy „Šipka dolů“ přejdete na monitorování jádra s nižším " "číslem.\n" #: tui_ncurses.cpp:245 #, fuzzy #| msgid "\tPress 'up' key to increase core number to monitor.\n" msgid "Press 'up' key to increase CPU core number to monitor." msgstr "" "\tStiskem klávesy „Šipka dolů“ přejdete na monitorování jádra s vyšším " "číslem.\n" #: tui_ncurses.cpp:247 msgid "Caches tab:" msgstr "Na kartě mezipaměť:" #: tui_ncurses.cpp:248 #, fuzzy #| msgid "\tPress 'down' key to switch to previous test.\n" msgid "Press 'down' key to switch to previous test." msgstr "\tStiskem klávesy „Šipka dolů“ přejdete na předchozí test.\n" #: tui_ncurses.cpp:249 #, fuzzy #| msgid "\tPress 'up' key' to switch to next test.\n" msgid "Press 'up' key to switch to next test." msgstr "" "\tStiskem klávesy „Šipka dolů“ přejdete na následující test.\n" "\n" #: tui_ncurses.cpp:251 #, fuzzy #| msgid "" #| "\n" #| "Bench tab:\n" msgid "Bench tab:" msgstr "" "\n" "Na kartě výkonnostní testy:\n" #: tui_ncurses.cpp:252 #, fuzzy #| msgid "\tPress 'down' key to decrement benchmark duration.\n" msgid "Press 'down' key to decrement benchmark duration." msgstr "" "\tStiskem klávesy „Šipka dolů“ snížíte nastavenou dobu trvání výkonnostního " "testu .\n" #: tui_ncurses.cpp:253 #, fuzzy #| msgid "\tPress 'up' key to increment benchmark duration.\n" msgid "Press 'up' key to increment benchmark duration." msgstr "" "\tStiskem klávesy „Šipka dolů“ zvýšíte nastavenou dobu trvání výkonnostního " "testu .\n" #: tui_ncurses.cpp:254 #, fuzzy #| msgid "\tPress 'next page' key to decrement number of threads to use.\n" msgid "Press 'next page' key to decrement number of threads to use." msgstr "" "\tStiskem klávesy „následující stránka“ snížíte počet vláken, které test " "použije..\n" #: tui_ncurses.cpp:255 #, fuzzy #| msgid "\tPress 'previous page' key to increment number of threads to use.\n" msgid "Press 'previous page' key to increment number of threads to use." msgstr "" "\tStiskem klávesy „předchozí stránka“ zvýšíte počet vláken, které test " "použije.\n" #: tui_ncurses.cpp:256 #, fuzzy #| msgid "\tPress 's' key to start/stop prime numbers (slow) benchmark.\n" msgid "Press 's' key to start/stop prime numbers (slow) benchmark." msgstr "" "\tStiskem klávesy „S“ spustíte/zastavíte výkonnostní test počítání prvočísel " "(důkladnou variantu).\n" #: tui_ncurses.cpp:257 #, fuzzy #| msgid "\tPress 'f' key to start/stop prime numbers (fast) benchmark.\n" msgid "Press 'f' key to start/stop prime numbers (fast) benchmark." msgstr "" "\tStiskem klávesy „F“ spustíte/zastavíte výkonnostní test počítání prvočísel " "(zběžnou variantu).\n" #: tui_ncurses.cpp:259 #, fuzzy #| msgid "Graphics" msgid "Graphics tab:" msgstr "Grafika" #: tui_ncurses.cpp:260 #, fuzzy #| msgid "\tPress 'down' key to switch to previous test.\n" msgid "Press 'down' key to switch to previous graphic card." msgstr "\tStiskem klávesy „Šipka dolů“ přejdete na předchozí test.\n" #: tui_ncurses.cpp:261 #, fuzzy #| msgid "\tPress 'up' key' to switch to next test.\n" msgid "Press 'up' key to switch to next graphic card." msgstr "" "\tStiskem klávesy „Šipka dolů“ přejdete na následující test.\n" "\n" #: tui_ncurses.cpp:263 #, fuzzy #| msgid "" #| "\n" #| "Press any key to exit this help.\n" msgid "Press any key to exit this help." msgstr "" "\n" "Tuto nápovědu uzavřete stiskem libovolné klávesy.\n" #: tui_ncurses.cpp:640 #, fuzzy #| msgid "Starting NCurses TUI..." msgid "Starting NCurses TUI…" msgstr "Spouštění pseudografického (TUI) rozhraní…" #: tui_ncurses.cpp:649 msgid "" "FATAL ERROR: terminfo database could not be found (try to set TERMINFO " "environment variable)" msgstr "" #: tui_ncurses.cpp:654 #, c-format msgid "Failed to set up %s terminal (err=%i); falling back to %s" msgstr "" #: util.cpp:189 #, c-format msgid "cannot find unit in '%s' string at position %i" msgstr "" #: util.cpp:252 #, fuzzy, c-format #| msgid "an error occurred while opening file '%s' (%s)" msgid "an error occurred while opening file '%s'" msgstr "došlo k chybě při otevírání souboru „%s“ (%s)" #: util.cpp:297 #, fuzzy, c-format #| msgid "an error occurred while running command '%s' (%s)" msgid "an error occurred while running command '%s'" msgstr "došlo k chybě při vykonávání příkazu „%s“ (%s)" #: util.cpp:437 msgid "set_cpu_affinity() not supported on this operating system" msgstr "" #: data.hpp:103 data.hpp:244 data.hpp:332 msgid "Vendor" msgstr "Výrobce" #: data.hpp:104 msgid "Code Name" msgstr "Krycí název" #: data.hpp:105 msgid "Package" msgstr "Typ pouzdra" #: data.hpp:106 msgid "Technology" msgstr "Technologie" #: data.hpp:107 data.hpp:268 msgid "Voltage" msgstr "Provozní napětí" #: data.hpp:108 msgid "Specification" msgstr "Specifikace" #: data.hpp:109 msgid "Family" msgstr "Řada" #: data.hpp:110 #, fuzzy #| msgid "Ext. Family" msgid "Disp. Family" msgstr "Řada podrobně" #: data.hpp:111 data.hpp:224 data.hpp:245 data.hpp:335 msgid "Model" msgstr "Model" #: data.hpp:112 #, fuzzy #| msgid "Ext. Model" msgid "Disp. Model" msgstr "Model podrobně" #: data.hpp:113 msgid "Temp." msgstr "Tepl." #: data.hpp:114 msgid "Stepping" msgstr "Várka" #: data.hpp:115 msgid "Instructions" msgstr "Výpočetní instrukce" #: data.hpp:125 msgid "L1 Data" msgstr "1. úrovně (L1) – datová" #: data.hpp:126 msgid "L1 Inst." msgstr "1.úroveň instrukční" #: data.hpp:127 msgid "Level 2" msgstr "Druhé úrovně" #: data.hpp:128 msgid "Level 3" msgstr "Třetí úrovně" #: data.hpp:137 cpu-x-gtk-3.12.ui:1232 #, fuzzy #| msgid "Core(s)" msgid "Cores" msgstr "Jádra" #: data.hpp:138 data.hpp:408 cpu-x-gtk-3.12.ui:1252 msgid "Threads" msgstr "Vláken" #: data.hpp:155 msgid "Core Speed" msgstr "Rychlost jádra" #: data.hpp:156 msgid "Multiplier" msgstr "Násobič" #: data.hpp:157 msgid "Bus Speed" msgstr "Rychlost sběrnice" #: data.hpp:158 data.hpp:341 msgid "Usage" msgstr "Využití" #: data.hpp:188 data.hpp:265 msgid "Size" msgstr "Velikost" #: data.hpp:189 data.hpp:267 msgid "Speed" msgstr "Rychlost" #: data.hpp:223 data.hpp:259 msgid "Manufacturer" msgstr "Výrobce" #: data.hpp:225 msgid "Revision" msgstr "Revize" #: data.hpp:233 msgid "Brand" msgstr "Značka" #: data.hpp:234 msgid "Version" msgstr "Verze" #: data.hpp:235 msgid "Date" msgstr "Datum" #: data.hpp:236 msgid "ROM Size" msgstr "Velikost ROM" #: data.hpp:260 msgid "Part Number" msgstr "" #: data.hpp:261 #, fuzzy #| msgid "Core #%i" msgid "Type" msgstr "Jádro č. %i" #: data.hpp:262 #, fuzzy #| msgid "Core #%i" msgid "Type Detail" msgstr "Jádro č. %i" #: data.hpp:263 msgid "Device Locator" msgstr "" #: data.hpp:264 msgid "Bank Locator" msgstr "" #: data.hpp:266 msgid "Rank" msgstr "" #: data.hpp:292 #, fuzzy #| msgid "Code Name" msgid "Name" msgstr "Krycí název" #: data.hpp:293 msgid "Kernel" msgstr "Jádro systému" #: data.hpp:294 msgid "Hostname" msgstr "Název stroje" #: data.hpp:295 msgid "Uptime" msgstr "Doba chodu systému (uptime)" #: data.hpp:303 msgid "Used" msgstr "Využito" #: data.hpp:304 msgid "Buffers" msgstr "Vyrovnávací paměť" #: data.hpp:305 msgid "Cached" msgstr "Mezipaměť" #: data.hpp:306 msgid "Free" msgstr "Volné" #: data.hpp:307 msgid "Swap" msgstr "Odkládací prostor (swap)" #: data.hpp:333 msgid "Driver" msgstr "" #: data.hpp:334 #, fuzzy #| msgid "Version" msgid "UMD Version" msgstr "Verze" #: data.hpp:336 msgid "Compute Unit" msgstr "" #: data.hpp:337 msgid "Device ID" msgstr "" #: data.hpp:338 #, fuzzy #| msgid "Version" msgid "VBIOS Version" msgstr "Verze" #. #-#-#-#-# source_ui.pot (cpu-x ) #-#-#-#-# #. Setting: "Interface" tab #: data.hpp:339 cpu-x-gtk-3.12.ui:5807 msgid "Interface" msgstr "" #: data.hpp:340 msgid "Temperature" msgstr "Teplota" #: data.hpp:342 #, fuzzy #| msgid "Voltage" msgid "Core Voltage" msgstr "Provozní napětí" #: data.hpp:343 msgid "Power Avg" msgstr "" #: data.hpp:344 #, fuzzy #| msgid "Memory clock" msgid "Core Clock" msgstr "Takt paměti" #: data.hpp:345 #, fuzzy #| msgid "Memory clock" msgid "Memory Clock" msgstr "Takt paměti" #: data.hpp:346 #, fuzzy #| msgid "Memory" msgid "Memory Used" msgstr "Operační paměť" #: data.hpp:347 msgid "Resizable BAR" msgstr "" #: data.hpp:348 msgid "Vulkan RT" msgstr "" #: data.hpp:349 #, fuzzy #| msgid "Version" msgid "OpenGL Version" msgstr "Verze" #: data.hpp:350 #, fuzzy #| msgid "Version" msgid "Vulkan Version" msgstr "Verze" #: data.hpp:351 #, fuzzy #| msgid "Version" msgid "OpenCL Version" msgstr "Verze" #: data.hpp:387 msgid "Score" msgstr "Výsledek" #: data.hpp:388 msgid "Run" msgstr "Spustit" #: data.hpp:407 msgid "Duration" msgstr "Doba trvání" #: util.hpp:77 msgid "bytes" msgstr "" #. TRANSLATORS: initials for kilobyte (10³): please put initials (keep it short) #: util.hpp:80 msgid "kB" msgstr "" #. TRANSLATORS: initials for megabyte (10⁶): please put initials (keep it short) #: util.hpp:82 msgid "MB" msgstr "" #. TRANSLATORS: initials for gigabyte (10⁹): please put initials (keep it short) #: util.hpp:84 msgid "GB" msgstr "" #. TRANSLATORS: initials for terabyte (10¹²): please put initials (keep it short) #: util.hpp:86 msgid "TB" msgstr "" #. TRANSLATORS: initials for kibibyte (2¹⁰): please put initials (keep it short) #: util.hpp:89 msgid "KiB" msgstr "" #. TRANSLATORS: initials for mebibyte (2²⁰): please put initials (keep it short) #: util.hpp:91 msgid "MiB" msgstr "" #. TRANSLATORS: initials for gibibyte (2³⁰): please put initials (keep it short) #: util.hpp:93 msgid "GiB" msgstr "" #. TRANSLATORS: initials for tebibyte (2⁴⁰): please put initials (keep it short) #: util.hpp:95 msgid "TiB" msgstr "" #: cpu-x-gtk-3.12.ui:1184 msgid "Cache" msgstr "Mezipaměť" #. Setting: refresh time for UI #: cpu-x-gtk-3.12.ui:5721 msgid "Refresh time" msgstr "" #. Setting: GUI theme #: cpu-x-gtk-3.12.ui:5745 msgid "Text theme" msgstr "" #. Setting: automatic GUI theme #: cpu-x-gtk-3.12.ui:5760 msgid "Automatic" msgstr "" #. Setting: light GUI theme #: cpu-x-gtk-3.12.ui:5761 msgid "Blue for light theme" msgstr "" #. Setting: dark GUI theme #: cpu-x-gtk-3.12.ui:5762 msgid "Yellow for dark theme" msgstr "" #. Setting: temperature unit #: cpu-x-gtk-3.12.ui:5775 #, fuzzy #| msgid "Temperature" msgid "Temperature unit" msgstr "Teplota" #. Setting: default tab at startup #: cpu-x-gtk-3.12.ui:5826 msgid "Default tab" msgstr "" #. Setting: default CPU core at startup #: cpu-x-gtk-3.12.ui:5839 msgid "Default CPU core" msgstr "" #. Setting: default cache test at startup #: cpu-x-gtk-3.12.ui:5852 msgid "Default cache test" msgstr "" #. Setting: print CPUID values in decimal or hexadecimal #: cpu-x-gtk-3.12.ui:5895 msgid "Print CPUID values in decimal" msgstr "" #. Setting: default graphic card at startup #: cpu-x-gtk-3.12.ui:5928 #, fuzzy #| msgid "Set default tab (integer)" msgid "Default graphic card" msgstr "Nastavit výchozí kartu (celočíselná hodnota)" #. Setting: default CPU core at startup #: cpu-x-gtk-3.12.ui:5952 msgid "Default core type" msgstr "" #. Setting: default graphic card at startup #: cpu-x-gtk-3.12.ui:5976 msgid "Default memory stick" msgstr "" #. Setting: "Startup" tab #: cpu-x-gtk-3.12.ui:6004 msgid "Startup" msgstr "" #~ msgid "Calculating CPU multipliers" #~ msgstr "Výpočet násobičů frekvence procesoru" #~ msgid "failed to retrieve GPU clocks" #~ msgstr "nepodařilo se zjistit takty grafického čipu" #, c-format #~ msgid "Core #%i" #~ msgstr "Jádro č. %i" #~ msgid "Setting label names" #~ msgstr "Nastavování názvů popisek" #, c-format #~ msgid "Bank %i" #~ msgstr "Banka %i" #~ msgid "Reference" #~ msgstr "Údaje" #~ msgid "Distribution" #~ msgstr "Distribuce" #~ msgid "Compiler" #~ msgstr "Kompilátor" #~ msgid "GPU clock" #~ msgstr "Takt graf. čipu" #, fuzzy #~| msgid "Dumping data..." #~ msgid "Dumping data…" #~ msgstr "Pořizování výpisu dat…" #~ msgid "Freeing memory" #~ msgstr "Uvolňování paměti" #, fuzzy, c-format #~| msgid "failed to call libcpuid (%s)" #~ msgid "failed to call wordexp (%i)" #~ msgstr "nepodařilo se zavolat knihovnu libcpuid (%s)" #, fuzzy #~| msgid "\tPress 'left' key to switch in left tab.\n" #~ msgid "Press 'home' key to scroll up in a page." #~ msgstr "Stiskněte klávesu \"home\" pro scrollování nahoru." #, fuzzy #~| msgid "\tPress 'left' key to switch in left tab.\n" #~ msgid "Press 'end' key to scroll down in a page." #~ msgstr "" #~ "\tStiskem klávesy „Šipka vlevo“ se přepnete do karty nalevo od " #~ "stávající.\n" #, c-format #~ msgid "failed to open %s directory" #~ msgstr "nepodařilo se otevřít složku %s" #~ msgid "an error occurred while compiling regex" #~ msgstr "došlo k chybě při sestavování regulárního výrazu" #, fuzzy #~| msgid "could not reallocate memory" #~ msgid "FATAL ERROR: could not allocate memory" #~ msgstr "nepodařilo se znovupřidělit paměť" #, fuzzy, c-format #~| msgid "failed to call dmidecode" #~ msgid "failed to call vkEnumerateInstanceExtensionProperties (%s)" #~ msgstr "nepodařilo se zavolat nástroj dmidecode" #~ msgid "Socket(s)" #~ msgstr "Patice" #~ msgid "Thread(s)" #~ msgstr "Vlákna" #~ msgid "You can paste this backtrace by opening a new issue here:" #~ msgstr "" #~ "Tento záznam volání funkcí (backtrace) můžete vložit otevřením nového " #~ "hlášení problému zde:" #, fuzzy #~| msgid "failed to call dmidecode" #~ msgid "faild to call clGetDeviceIDs" #~ msgstr "nepodařilo se zavolat nástroj dmidecode" #~ msgid "Exiting %s" #~ msgstr "Ukončuje se %s" #~ msgid "Skip CPU MSR opening (need to be root)" #~ msgstr "" #~ "Přeskočit otevírání MSR registru procesoru (vyžaduje práva správce " #~ "systému)" #~ msgid "failed to open CPU MSR (%s)" #~ msgstr "nepodařilo se otevřít MSR registr procesoru (%s)" #~ msgid "Skip call to dmidecode (need to be root)" #~ msgstr "" #~ "Přeskočit zavolání nástroje dmidecode (vyžaduje práva správce systému)" #~ msgid "failed to allocate memory for dmidecode" #~ msgstr "nepodařilo se přidělit paměť pro nástroj dmidecode" #~ msgid "Finding graphic card driver" #~ msgstr "Zjišťování ovladače grafického čipu" #~ msgid "(%s driver)" #~ msgstr "(ovladač %s)" #~ msgid "Retrieving GPU temperature" #~ msgstr "Zjišťování teploty grafického čipu" #~ msgid "Off" #~ msgstr "Vypnuto" #~ msgid "failed to retrieve GPU temperature" #~ msgstr "nepodařilo se zjistit teplotu grafického čipu" #~ msgid "Skip some GPU values (need to be root)" #~ msgstr "" #~ "Přeskočit některé hodnoty graf. čipu (vyžaduje práva správce systému)" #~ msgid "failed to allocate memory for benchmark" #~ msgstr "nepodařilo se přidělit paměť pro výkonnostní test" #~ msgid "Root privileges are required to work properly" #~ msgstr "Pro správné fungování je třeba oprávnění správce systému" #~ msgid "Some information will not be retrievable" #~ msgstr "Některé informace nebude možné získat" #~ msgid "Ignore" #~ msgstr "Ignorovat" #~ msgid "Run as root" #~ msgstr "Spustit s právy správce systému (root)" #~ msgid "A new version of %s is available!" #~ msgstr "Je k dispozici nová verze %s!" #~ msgid "" #~ "Do you want to update %s to version %s after exit?\n" #~ "It will erase this binary file (%s) by the new version." #~ msgstr "" #~ "Přejete si (po ukončení) aktualizovat %s na verzi %s?\n" #~ "Tento binární soubor (%s) bude přepsán novou verzí." #~ msgid "Not now" #~ msgstr "Nyní ne" #~ msgid "Update" #~ msgstr "Aktualizovat" #~ msgid "Checking on Internet for a new version..." #~ msgstr "Zjišťování dostupnosti případné nové verze na Internetu…" #~ msgid "failed to open a Curl session" #~ msgstr "Nepodařilo se otevřít relaci nástroje Curl" #~ msgid "wrong write data" #~ msgstr "chybná data pro zápis" #~ msgid "(version %s is available)" #~ msgstr "(je k dispozici verze %s)" #~ msgid "No new version available" #~ msgstr "Není k dispozici žádná novější verze" #~ msgid "(up-to-date)" #~ msgstr "(už používáte nejnovější dostupnou verzi)" #~ msgid "an error occurred while extracting %s archive (%s)" #~ msgstr "při vybalování archivu s %s se vyskytla chyba (%s)" #~ msgid "" #~ "Network access is disabled by environment variable (set CPUX_NETWORK with " #~ "a positive value to enable it)" #~ msgstr "" #~ "Síťový přístup je vypnutý proměnnou prostředí (zapněte nastavením " #~ "CPUX_NETWORK na kladnou hodnotu)" #~ msgid "failed to open %s archive for writing" #~ msgstr "nepodařilo se zapsat do archivu %s" #~ msgid "Downloading new version..." #~ msgstr "Stahování nové verze…" #~ msgid "failed to download %s archive (%s)" #~ msgstr "nepodařilo se stáhnout archiv %s (%s)" #~ msgid "Extracting new version..." #~ msgstr "Rozbalování nové verze…" #~ msgid "Applying new version..." #~ msgstr "Nasazování nové verze…" #~ msgid "an error occurred while removing/renaming files" #~ msgstr "při odebírání/přejmenovávání souborů došlo k chybě" #~ msgid "Update successful!" #~ msgstr "Aktualizace úspěšná!" #~ msgid "Update portable version if a new version is available" #~ msgstr "Aktualizovat přenosnou variantu pokud je k dispozici novější verze" #~ msgid "Temporarily disable network support" #~ msgstr "Dočasně vypnout podporu sítě" #~ msgid "Built on %s, %s (with %s %s on %s)." #~ msgstr "Sestaveno %s, %s (pomocí %s %s na %s)." #~ msgid "" #~ "Sorry, you cannot update %s: 32-bit portable version is no more supported." #~ msgstr "" #~ "Omlouváme se, ale %s nemůžete aktualizovat: 32 bitová přenosná verze už " #~ "není podporována." #~ msgid "If you want to update, press 'u' key, or anything else to skip.\n" #~ msgstr "" #~ "Pokud chcete zaktualizovat, stiskněte klávesu „U“ – v opačném případě " #~ "přeskočte stisknutím libovolné jiné klávesy.\n" #~ msgid "" #~ "\n" #~ "\n" #~ "%s will be updated." #~ msgstr "" #~ "\n" #~ "\n" #~ "%s bude aktualizováno." CPU-X-5.0.3/po/da.po000066400000000000000000001112121454622605200137210ustar00rootroot00000000000000# CPU-X translations template # Copyright © 2014-2024 The Tumultuous Unicorn Of Darkness # This file is distributed under the same license as the cpu-x package. # Lasse Lykke Jensen , 2020. # Magnus Jørgensen , 2022. msgid "" msgstr "" "Project-Id-Version: cpu-x\n" "Report-Msgid-Bugs-To: https://github.com/TheTumultuousUnicornOfDarkness/CPU-" "X/issues\n" "POT-Creation-Date: 2023-12-09 13:09+0100\n" "PO-Revision-Date: 2022-12-17 05:50+0000\n" "Last-Translator: Magnus Jørgensen \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 4.15\n" #: core.cpp:135 msgid "Finding CPU technology" msgstr "Finder CPU-teknologi" #: core.cpp:161 #, c-format msgid "" "Your CPU is not present in the database ==> %s, model: %i, ext. model: %i, " "ext. family: %i" msgstr "" "Din CPU er ikke stil stede i databasen ==> %s, model: %i, ext. model: %i, " "ext. familie: %i" #: core.cpp:189 data.cpp:150 data.cpp:342 msgid "unknown" msgstr "ukendt" #: core.cpp:230 msgid "Calling libcpuid for retrieving static data" msgstr "Kalder libcpuid til hentning af statiske data" #: core.cpp:245 #, c-format msgid "failed to call libcpuid (%s)" msgstr "kunne ikke kalde libcpuid (%s)" #: core.cpp:340 msgid "Calling libcpuid for retrieving dynamic data" msgstr "Kalder libcpuid til hentning af dynamiske data" #: core.cpp:353 msgid "Calling libcpuid for retrieving CPU MSR static values" msgstr "Kalder libcpuid til hentning af statiske CPU-MSR-værdier" #: core.cpp:380 msgid "Calling libcpuid for retrieving CPU MSR dynamic values" msgstr "Kalder libcpuid til hentning af dynamiske CPU-MSR-værdier" #: core.cpp:412 msgid "Calling dmidecode" msgstr "Kalder dmidecode" #: core.cpp:454 core.cpp:473 #, c-format msgid "%s (configured)" msgstr "" #: core.cpp:461 core.cpp:480 #, c-format msgid "%s (max)" msgstr "" #: core.cpp:466 #, c-format msgid "%s (min)" msgstr "" #: core.cpp:496 msgid "Calculating CPU usage" msgstr "Beregner CPU-brug" #: core.cpp:546 msgid "Calling bandwidth" msgstr "Opkaldsbåndbredde" #: core.cpp:613 #, c-format msgid "" "pci_access is not properly initialized: it is a common issue when %s was " "built with a lower libpci version.\n" "Check that libpci %s library is present on your system. Otherwise, please " "rebuild %s." msgstr "" "pci_access er ikke korrekt initialiseret: det er normalt et problem når %s " "er bygget med en lavere libpci version.\n" "Verificer at libpci %s bibliotek er tilstede på dit system. Ellers, venligst " "genopbygge %s." #: core.cpp:657 #, c-format msgid "No kernel driver in use for graphic card at path %s" msgstr "Ingen kernedriver i brug til grafikkort ved stien %s" #: core.cpp:693 #, c-format msgid "Your GPU kernel driver is unknown: %s" msgstr "Din GPU-driver er ukendt: %s" #: core.cpp:777 #, fuzzy, c-format #| msgid "Your GPU user mode driver is unknown: %s" msgid "Your GPU user mode driver is unknown for vendor %s: %s" msgstr "Din GPU-driver er ukendt: %s" #: core.cpp:781 #, c-format msgid "failed to call GLFW (%i): %s" msgstr "kunne ikke kalde GLFW (%i): %s" #: core.cpp:914 msgid "Finding Vulkan API version" msgstr "Finder Vulkan API version" #: core.cpp:926 #, c-format msgid "failed to call vkCreateInstance (%s)" msgstr "kunne ikke kalde vkCreateInstance (%s)" #: core.cpp:929 #, c-format msgid "%s is not supported" msgstr "%s er ikke understøttet" #: core.cpp:937 #, c-format msgid "failed to call vkEnumeratePhysicalDevices (%s)" msgstr "kunne ikke kalde vkEnumeratePhysicalDevices (%s)" #: core.cpp:944 msgid "No available Vulkan devices" msgstr "Ingen tilgængelig Vulkan enhed" #: core.cpp:952 #, c-format msgid "No available physical devices (%s)" msgstr "Ingen fysisk enhed tilgængelig (%s)" #: core.cpp:1015 #, c-format msgid "Failed to create Vulkan for device %u (%s)" msgstr "Kunne ikke oprette Vulkan til enheden %u (%s)" #: core.cpp:1019 #, c-format msgid "%s is not supported for device %u, use only deviceID for matching" msgstr "" "%s er ikke understøttet for enheden %u, brug kun deviceID hvor det stemmer" #: core.cpp:1051 core.cpp:1364 msgid "Enabled" msgstr "Aktiveret" #: core.cpp:1051 core.cpp:1364 msgid "Disabled" msgstr "Deaktiveret" #: core.cpp:1088 #, fuzzy #| msgid "Finding Vulkan API version" msgid "Finding OpenCL API version" msgstr "Finder Vulkan API version" #: core.cpp:1092 #, c-format msgid "There is no platform with OpenCL support (%s)" msgstr "Der er ingen platform med OpenCL understøttelse (%s)" #: core.cpp:1102 #, c-format msgid "failed to get all OpenCL platforms (%s)" msgstr "kunne ikke tilgå alle OpenCL platforme (%s)" #: core.cpp:1115 #, c-format msgid "failed to get name for platform %u (%s)" msgstr "kunne ikke tilgå navnet til platformen %u (%s)" #: core.cpp:1123 #, c-format msgid "failed to get version for platform %u (%s)" msgstr "kunne ikke tilgå versionen af platformen %u (%s)" #: core.cpp:1131 #, c-format msgid "failed to find number of OpenCL devices for platform '%s %s' (%s)" msgstr "kunne ikke finde mængden af OpenCL enheder for platform '%s %s' (%s)" #: core.cpp:1131 msgid "0 device" msgstr "0 enheder" #: core.cpp:1140 #, c-format msgid "failed to get all of OpenCL devices for platform '%s %s' (%s)" msgstr "kunne ikke tilgå hver OpenCL enhed for platform '%s %s' (%s)" #: core.cpp:1160 #, c-format msgid "failed to get name for device %u (%s)" msgstr "kunne ikke tilgå navnet på enheden %u (%s)" #: core.cpp:1168 #, c-format msgid "failed to get version for device %u (%s)" msgstr "kunne ikke tilgå versionen for enheden %u (%s)" #: core.cpp:1190 #, c-format msgid "OpenCL driver for '%s %s' does not support CL_DEVICE_TOPOLOGY_AMD (%s)" msgstr "" "OpenCL driveren for '%s %s' understøtter ikke CL_DEVICE_TOPOLOGY_AMD (%s)" #: core.cpp:1201 #, c-format msgid "" "OpenCL driver for '%s %s' does not support CL_DEVICE_GFXIP_MAJOR_AMD (%s)" msgstr "" "OpenCL driveren for '%s %s' understøtter ikke CL_DEVICE_GFXIP_MAJOR_AMD (%s)" #: core.cpp:1209 core.cpp:1229 core.cpp:1262 #, c-format msgid "" "OpenCL driver for '%s %s' does not support CL_DEVICE_MAX_COMPUTE_UNITS (%s)" msgstr "" "OpenCL driveren for '%s %s' understøtter ikke CL_DEVICE_MAX_COMPUTE_UNITS " "(%s)" #: core.cpp:1250 #, c-format msgid "" "OpenCL driver for '%s %s' does not support CL_DEVICE_PCI_DOMAIN_ID_NV (%s), " "CL_DEVICE_PCI_BUS_ID_NV (%s) or CL_DEVICE_PCI_SLOT_ID_NV (%s)" msgstr "" "OpenCL driveren for '%s %s' understøtter ikke CL_DEVICE_PCI_DOMAIN_ID_NV " "(%s), CL_DEVICE_PCI_BUS_ID_NV (%s) eller CL_DEVICE_PCI_SLOT_ID_NV (%s)" #: core.cpp:1273 #, c-format msgid "OpenCL is not supported with your GPU vendor (0x%X)" msgstr "OpenCL er ikke understøttet med din GPU leverandør (0x%X)" #: core.cpp:1295 msgid "Finding devices" msgstr "Finder enheder" #: core.cpp:1307 #, c-format msgid "Skip devices search (wrong permissions on %s device)" msgstr "Springer over enhedssøgning (forkerte tilladelser til %s enhed)" #: core.cpp:1350 #, c-format msgid "Your GPU vendor is unknown: %s (0x%X)" msgstr "Din GPU leverandør er ukendt: %s (0x%X)" #: core.cpp:1370 msgid "failed to find chipset vendor and model" msgstr "kunne ikke finde chipset leverandør og model" #: core.cpp:1385 msgid "failed to find graphic card vendor and model" msgstr "kunne ikke finde grafik kort leverandør og model" #: core.cpp:1487 msgid "Retrieving GPU clocks" msgstr "Finder GPU frekvenser" #: core.cpp:1500 msgid "None" msgstr "Ingen" #: core.cpp:1509 #, c-format msgid "DRM path for %s is unknown" msgstr "" #: core.cpp:1516 #, c-format msgid "Card number for %s is unknown" msgstr "" #: core.cpp:1541 #, c-format msgid "PCIe %s (current) / %s (max)" msgstr "" #: core.cpp:1650 #, fuzzy, c-format #| msgid "Driver for GPU %u doesn't report frequencies" msgid "Driver for %s doesn't report frequencies" msgstr "Driveren til GPU %u rapporterer ikke frekvenser" #: core.cpp:1671 #, fuzzy, c-format #| msgid "failed to get all OpenCL platforms (%s)" msgid "failed to retrieve all monitoring data for %s" msgstr "kunne ikke tilgå alle OpenCL platforme (%s)" #: core.cpp:1694 msgid "Identifying running system" msgstr "Identificerer kørrende system" #: core.cpp:1697 msgid "failed to identify running system" msgstr "kunne ikke identificere det kørrende system" #: core.cpp:1749 core.cpp:1778 msgid "Calling libprocps" msgstr "Kalder libprocps" #: core.cpp:1752 msgid "unable to get system uptime" msgstr "kunne ikke tilgå systemets oppetid" #: core.cpp:1758 msgid "unable to create meminfo structure" msgstr "kunne ikke danne meminfo struktur" #: core.cpp:1804 msgid "Calling libstatgrab" msgstr "Kalder libstatgrab" #: core.cpp:1852 #, c-format msgid "%i days, %i hours, %i minutes, %i seconds" msgstr "%i dage, %i timer %i minutter %i sekunder" #: core.cpp:1915 msgid "Updating benchmark status" msgstr "Opdaterer status af benchmark" #: core.cpp:1918 msgid "Active" msgstr "Aktiv" #: core.cpp:1921 #, c-format msgid "(%u hours left)" msgstr "(%u timer tilbage)" #: core.cpp:1923 #, c-format msgid "(%u minutes left)" msgstr "(%u minutter tilbage)" #: core.cpp:1925 #, c-format msgid "(%u seconds left)" msgstr "(%u sekunder tilbage)" #: core.cpp:1929 core.cpp:1984 core.cpp:1985 msgid "Inactive" msgstr "Inaktiv" #: core.cpp:1932 #, c-format msgid "in %u hours" msgstr "om %u timer" #: core.cpp:1934 #, c-format msgid "in %u minutes" msgstr "om %u minutter" #: core.cpp:1936 #, c-format msgid "in %u seconds" msgstr "om %u sekunder" #: core.cpp:1953 #, fuzzy, c-format #| msgid "Starting benchmark" msgid "Starting benchmark with %u threads" msgstr "Starter benchmark" #: core.cpp:1976 msgid "an error occurred while starting benchmark" msgstr "en fejl skete ved opstart af benchmark" #: core.cpp:2002 msgid "Finding CPU package in fallback mode" msgstr "Finder CPU-pakken i tilbagefaldstilstand" #: core.cpp:2032 #, c-format msgid "Your CPU socket is not present in the database ==> %s, codename: %s" msgstr "Din CPU-socket findes ikke i databasen ==> %s, kodenavn: %s" #: core.cpp:2052 msgid "Calculating CPU multipliers in fallback mode" msgstr "Beregner CPU-multiplikatorer i tilbagefaldstilstand" #: core.cpp:2072 msgid "Retrieving motherboard information in fallback mode" msgstr "Finder bundkorts informationer i tilbagefaldstilstand" #: core.cpp:2085 msgid "failed to retrieve motherboard information (fallback mode)" msgstr "kunne ikke hente bundkortoplysninger (tilbagefaldstilstand)" #: core.cpp:2127 msgid "Retrieving CPU temperature in fallback mode" msgstr "Henter CPU temperatur i tilbagefaldstilstand" #: core.cpp:2173 msgid "failed to retrieve CPU temperature (fallback mode)" msgstr "kunne ikke hente CPU temperature (tilbagefaldstilstand)" #: core.cpp:2188 msgid "Retrieving CPU voltage in fallback mode" msgstr "Henter CPU spænding i tilbagefaldstilstand" #: core.cpp:2200 msgid "failed to retrieve CPU voltage (fallback mode)" msgstr "kunne ikke hente CPU spænding (tilbagefaldstilstand)" #: core.cpp:2214 msgid "Retrieving CPU frequency in fallback mode" msgstr "Henter CPU frekvens i tilbagefaldstilstand" #: core.cpp:2220 msgid "failed to retrieve CPU frequency (fallback mode)" msgstr "kunne ikke hente CPU frekvens (tilbagefaldstilstand)" #: daemon_client.cpp:65 #, fuzzy #| msgid "Ask password to start daemon in background" msgid "Starting daemon in background…" msgstr "Forespørg adgangskode til at starte baggrundsprogram i bagrunden" #: daemon_client.cpp:172 msgid "pkexec: authorization could not be obtained (dialog dismissed)" msgstr "pkexec: autorisation kunne ikke opnås (dialog afvist)" #: daemon_client.cpp:175 msgid "pkexec: authorization could not be obtained (not authorized)" msgstr "pkexec: autorisation kunne ikke opnås (ikke godkendt)" #: daemon_client.cpp:178 msgid "pkexec: command not found" msgstr "pkexec: kommando ikke fundet" #: daemon_client.cpp:181 msgid "pkexec: unexpected error code" msgstr "pkexec: uventet fejl kode" #: daemon_client.cpp:211 #, fuzzy #| msgid "Connected to daemon" msgid "Connecting to daemon…" msgstr "Forbundet til baggrundsprogram" #: daemon_server.cpp:261 #, c-format msgid "request_handler: case %i not handled" msgstr "request_handler: tilfælde %i er ikke håndteret" #: data.cpp:124 cpu-x-gtk-3.12.ui:1370 msgid "CPU" msgstr "CPU" #: data.cpp:187 msgid "P-core" msgstr "P-kerne" #: data.cpp:188 msgid "E-core" msgstr "E-kerne" #: data.cpp:189 data.cpp:192 msgid "Core" msgstr "Kerne" #: data.cpp:208 cpu-x-gtk-3.12.ui:746 msgid "Processor" msgstr "Processor" #: data.cpp:240 data.cpp:329 cpu-x-gtk-3.12.ui:1968 msgid "Caches" msgstr "Cacher" #: data.cpp:247 #, fuzzy, c-format #| msgid "%d x %d %s, %d-way" msgid "%2d x %4d %s, %2d-way" msgstr "%d x %d %s, %d-vej" #: data.cpp:249 #, c-format msgid "%d %s, %d-way" msgstr "%d %s, %d-vej" #: data.cpp:263 msgid "Count" msgstr "" #: data.cpp:276 cpu-x-gtk-3.12.ui:968 msgid "Clocks" msgstr "Frekvenser" #: data.cpp:379 data.cpp:383 #, fuzzy, c-format #| msgid "L%i Cache" msgid "L%u Cache" msgstr "N%i Cache" #: data.cpp:385 #, c-format msgid "%s associative, %d-%s line size" msgstr "%s associeret, %d-%s linie størrelse" #: data.cpp:398 msgid "Test" msgstr "Test" #: data.cpp:409 data.cpp:423 cpu-x-gtk-3.12.ui:2146 cpu-x-gtk-3.12.ui:2517 msgid "Motherboard" msgstr "Bundkort" #: data.cpp:437 cpu-x-gtk-3.12.ui:2367 msgid "BIOS" msgstr "BIOS" #: data.cpp:452 cpu-x-gtk-3.12.ui:2498 msgid "Chipset" msgstr "Chipset" #: data.cpp:467 data.cpp:569 cpu-x-gtk-3.12.ui:3156 cpu-x-gtk-3.12.ui:3761 msgid "Memory" msgstr "Hukommelse" #: data.cpp:483 #, c-format msgid "Stick %u" msgstr "" #: data.cpp:487 cpu-x-gtk-3.12.ui:3134 msgid "Sticks" msgstr "" #: data.cpp:541 cpu-x-gtk-3.12.ui:3780 msgid "System" msgstr "System" #: data.cpp:554 cpu-x-gtk-3.12.ui:3380 msgid "Operating System" msgstr "Operativ System" #: data.cpp:587 cpu-x-gtk-3.12.ui:4960 msgid "Graphics" msgstr "Grafik" #: data.cpp:621 #, fuzzy, c-format #| msgid "Card %i" msgid "Card %u" msgstr "Kort %i" #: data.cpp:625 cpu-x-gtk-3.12.ui:4938 msgid "Cards" msgstr "Kort" #: data.cpp:672 cpu-x-gtk-3.12.ui:5300 msgid "Bench" msgstr "Benchmark" #: data.cpp:685 msgid "Not started" msgstr "Ikke startet" #: data.cpp:688 cpu-x-gtk-3.12.ui:5070 msgid "Prime numbers (slow)" msgstr "Primtal (langsom)" #: data.cpp:692 cpu-x-gtk-3.12.ui:5178 msgid "Prime numbers (fast)" msgstr "Primtal (hurtig)" #: data.cpp:696 cpu-x-gtk-3.12.ui:5281 msgid "Parameters" msgstr "Parametre" #: data.cpp:721 data.cpp:727 #, c-format msgid "%u mins" msgstr "%u minutter" #: data.cpp:734 cpu-x-gtk-3.12.ui:5444 cpu-x-gtk-3.12.ui:5552 msgid "About" msgstr "Omkring" #: data.cpp:739 #, c-format msgid "" "%s is a Free software that gathers information\n" "on CPU, motherboard and more." msgstr "" "%s er fri software er indsamler information\n" "om CPU, bundkort og andet." #: data.cpp:744 #, fuzzy #| msgid "About" msgid "About CPU-X" msgstr "Omkring" #: data.cpp:745 #, c-format msgid "Version %s" msgstr "Version %s" #: data.cpp:746 #, c-format msgid "Author: %s" msgstr "Forfatter: %s" #: data.cpp:747 #, c-format msgid "Site: %s" msgstr "Side: %s" #: data.cpp:751 cpu-x-gtk-3.12.ui:5533 msgid "License" msgstr "Licens" #: data.cpp:753 #, c-format msgid "This software is distributed under the terms of %s" msgstr "Denne software er udgivet under vilkårene for %s" #: data.cpp:754 main.cpp:176 msgid "This program comes with ABSOLUTELY NO WARRANTY" msgstr "Dette program leveres HELT UDEN GARANTI" #: gui_gtk.cpp:61 #, c-format msgid "Cannot find path for '%s' file" msgstr "" #: gui_gtk.cpp:400 msgid "Start daemon" msgstr "Start baggrundsprogram" #: gui_gtk.cpp:403 msgid "Connected to daemon" msgstr "Forbundet til baggrundsprogram" #: gui_gtk.cpp:406 msgid "No polkit authentication agent found" msgstr "Ingen polkit autentifikationsagent fundet" #: gui_gtk.cpp:411 msgid "Ask password to start daemon in background" msgstr "Forespørg adgangskode til at starte baggrundsprogram i bagrunden" #: gui_gtk.cpp:415 msgid "Settings" msgstr "" #: gui_gtk.cpp:634 msgid "BaseFamily" msgstr "Basisfamillie" #: gui_gtk.cpp:635 msgid "CPU display (\"true\") family (computed as BaseFamily+ExtendedFamily)" msgstr "" "CPU udstilling (\"sand\") familie (beregnet som Basisfamilie+Udvidetfamilie)" #: gui_gtk.cpp:636 msgid "BaseModel" msgstr "Basismodel" #: gui_gtk.cpp:637 msgid "CPU display (\"true\") model (computed as (ExtendedModel<<4)+BaseModel)" msgstr "" "CPU udstilling (\"sand\") model (beregnet som (UdvidetModel<<4)+Basismodel)" #: gui_gtk.cpp:847 msgid "" "Identify the physically-labeled socket or board position where the memory " "device is located" msgstr "" #: gui_gtk.cpp:848 msgid "Identify the physically labeled bank where the memory device is located" msgstr "" #: gui_gtk.cpp:1052 msgid "User Mode Driver Version" msgstr "Bruger tilstands driver version" #: gui_gtk.cpp:1066 msgid "Vulkan Ray Tracing" msgstr "Vulkan Ray Tracing" #: gui_gtk.cpp:1260 msgid "Starting GTK GUI…" msgstr "Starter GTK Brugergrænseflade…" #: gui_gtk.cpp:1272 msgid "failed to import UI in GtkBuilder" msgstr "kunne ikke importerer brugergrænseflade i GtkBuilder" #: main.cpp:63 msgid "Start graphical user interface (GUI) (default)" msgstr "Start grafisk brugergrænseflade (GUI) (standard)" #: main.cpp:64 msgid "Start text-based user interface (TUI)" msgstr "Start tekstbaseret brugergrænseflade (TUI)" #: main.cpp:65 msgid "Dump all data on standard output and exit" msgstr "Dump alle data til standard output og afslut" #: main.cpp:66 msgid "Run embedded command dmidecode and exit" msgstr "Kør indlejrede kommando dmidecode og afslut" #: main.cpp:67 msgid "Run embedded command bandwidth and exit" msgstr "Kør indlejret kommando båndbredde og afslut" #: main.cpp:68 msgid "Set temperature unit (c[elsius]|f[ahrenheit]|k[elvin]|r[ankine])" msgstr "" #: main.cpp:69 msgid "Set custom time between two refreshes (in seconds)" msgstr "Sæt brugerdefineret tid imellem to opdateringer (i sekunder)" #: main.cpp:70 msgid "Set default tab (integer)" msgstr "Sæt standard fane (heltal)" #: main.cpp:71 msgid "Select core type to monitor (integer)" msgstr "Vælg kerne type der skal overvåges (heltal)" #: main.cpp:72 msgid "Select CPU core to monitor (integer)" msgstr "Vælg CPU kerne der skal overvåges (heltal)" #: main.cpp:73 msgid "Set custom bandwidth test for CPU caches speed (integer)" msgstr "Sæt brugerdefineret båndbredetest til CPU-cache hastighed (heltal)" #: main.cpp:74 #, fuzzy #| msgid "Select default graphic card (integer)" msgid "Select default memory stick (integer)" msgstr "Vælg standard grafik kort (heltal)" #: main.cpp:75 msgid "Select default graphic card (integer)" msgstr "Vælg standard grafik kort (heltal)" #: main.cpp:76 cpu-x-gtk-3.12.ui:5910 msgid "Start and connect to daemon" msgstr "Start og forbind til baggrundsprogram" #: main.cpp:77 msgid "Verbose output" msgstr "Udførligt output" #: main.cpp:78 msgid "Print help and exit" msgstr "Udskriv hjælp og afslut" #: main.cpp:79 msgid "Print version and exit" msgstr "Udskriv version og afslut" #: main.cpp:80 msgid "Print CPUID values in decimal (default is hexadeximal)" msgstr "Udskriv CPUID værdier i decimaltal (standard er hexadeximaltal)" #: main.cpp:81 msgid "Disable colored output" msgstr "Deaktiver farvet output" #: main.cpp:82 msgid "Print information for debugging" msgstr "Udskriv information til fejlretning" #: main.cpp:83 msgid "Print required information to paste in an issue" msgstr "Udskriv de nødvændige informationer til at vedhæfte i en fejlrapport" #: main.cpp:84 msgid "Set key mapping for NCurses mode (a[rrows]|e[macs]|i[nverted-T]|v[im])" msgstr "" "Sæt nøglehenføring til NCurses tilstand (a[rrows]|e[macs]|i[nverted-T]|v[im])" #: main.cpp:95 msgid "Add default command line arguments" msgstr "Tilføj standard kommandolinje argumenter" #: main.cpp:96 msgid "Enforce the bus clock" msgstr "Håndhæv bus frekvensen" #: main.cpp:97 msgid "" "Ignore CPU values reported by libcpuid (comma-separated values among 'temp', " "'volt' and 'freq')" msgstr "" #: main.cpp:98 msgid "Read CPUID raw data from a given file" msgstr "Læs CPUID rådata fra en given fil" #: main.cpp:99 msgid "Only print a message if CPU is not present in the database" msgstr "Udskriv kun en besked hvis CPU ikke er til stede i databasen" #: main.cpp:126 #, c-format msgid "Usage: %s DISPLAY [OPTIONS]\n" msgstr "Brug: %s VISNING [VALG]\n" #: main.cpp:127 msgid "Available DISPLAY:" msgstr "Tilgængelige VISNING:" #: main.cpp:135 msgid "Available OPTIONS:" msgstr "Tilgængelige VALG:" #: main.cpp:144 msgid "Influenceable environment variables:" msgstr "Påvirkelige miljøvariabler:" #: main.cpp:175 msgid "This is free software: you are free to change and redistribute it." msgstr "Dette er fri software: du er fri til at ændre og omdistribuere det." #: main.cpp:177 #, c-format msgid "See the %s license: <%s>\n" msgstr "Se %s licensen: <%s>\n" #: main.cpp:184 #, c-format msgid "-- %-9s version: %s" msgstr "-- %-9s version: %s" #: main.cpp:381 #, c-format msgid "" "\n" "Oops, something was wrong! %s has received signal %d (%s) and has crashed." msgstr "" "\n" "Hovsa, noget gik galt! %s har modtaget signalet %d (%s) og er nedbrudt." #: main.cpp:383 #, c-format msgid "" "\n" "Oops, something was wrong! %s has received signal %d (%s) and is trying to " "recover." msgstr "" "\n" "Hovsa, noget gik galt! %s har modtaget signalet %d (%s) og prøver at " "gendanne sig." #: main.cpp:407 msgid "You can open a new issue here, by filling the template as requested:" msgstr "Du kan åbne en ny rapport har, ved at udfylde skabelonen som ønsket:" #: main.cpp:449 msgid "an error occurred while setting locale" msgstr "en fejl skete under indstilling af regional data" #: options.cpp:124 #, c-format msgid "" "Selected CPU type (%u) is not a valid number (%u is the maximum for this CPU)" msgstr "" "Valgte CPU type (%u) er ikke et gyldigt tal (%u er maximum for denne CPU)" #: options.cpp:145 #, fuzzy, c-format #| msgid "" #| "Selected CPU type (%u) is not a valid number (%u is the maximum for this " #| "CPU)" msgid "" "Selected bandwidth test (%u) is not a valid number (%u is the maximum for " "this system)" msgstr "" "Valgte CPU type (%u) er ikke et gyldigt tal (%u er maximum for denne CPU)" #: options.cpp:168 #, fuzzy, c-format #| msgid "" #| "Selected CPU type (%u) is not a valid number (%u is the maximum for this " #| "CPU)" msgid "" "Selected RAM stick (%u) is not a valid number (%u is the maximum for this " "system)" msgstr "" "Valgte CPU type (%u) er ikke et gyldigt tal (%u er maximum for denne CPU)" #: options.cpp:188 #, fuzzy, c-format #| msgid "" #| "Selected CPU core (%u) is not a valid number (%u is the maximum for this " #| "type of core)" msgid "" "Selected graphic card (%u) is not a valid number (%u is the maximum for this " "system)" msgstr "" "Valgte CPU kerne (%u) er ikke et gyldigt tal (%u er maximum for denne type " "af kerne)" #: options.cpp:204 #, c-format msgid "failed to change CPU affinitiy to core %u" msgstr "fejlede under ændring af CPU kærneforetrækkelse til %u" #: options.cpp:210 #, c-format msgid "" "Selected CPU core (%u) is not a valid number (%u is the maximum for this " "type of core)" msgstr "" "Valgte CPU kerne (%u) er ikke et gyldigt tal (%u er maximum for denne type " "af kerne)" #: options.cpp:284 #, fuzzy, c-format #| msgid "" #| "Selected CPU type (%u) is not a valid number (%u is the maximum for this " #| "CPU)" msgid "Selected tab (%u) is not a valid number (%u is the maximum)" msgstr "" "Valgte CPU type (%u) er ikke et gyldigt tal (%u er maximum for denne CPU)" #: tui_ncurses.cpp:111 msgid "Window is too small!" msgstr "Vinduet er for lille!" #: tui_ncurses.cpp:119 msgid "Press 'h' to see help." msgstr "Tryk 'h' for at se hjælp." #: tui_ncurses.cpp:232 #, c-format msgid "Welcome in %s NCurses help!\n" msgstr "Velkommen til %s NCurses hjælp!\n" #: tui_ncurses.cpp:233 msgid "This help describes how to use this Text-based User Interface." msgstr "" "Denne hjælp beskriver hvordan du bruger denne tekstbaserede " "brugergrænseflade." #: tui_ncurses.cpp:235 msgid "Global keys:" msgstr "Globale taster:" #: tui_ncurses.cpp:236 msgid "Press 'left' key or 'tab' key to switch in left tab." msgstr "Tryk 'venstre' tast eller 'tab' tast for at skifte i venstre fane." #: tui_ncurses.cpp:237 msgid "Press 'right' key or 'shift + tab' keys to switch in right tab." msgstr "" "Tryk 'højre' tast eller 'skift + tab' taster for at skifte i højre fane." #: tui_ncurses.cpp:238 msgid "Press 'h' key to see this help." msgstr "Tryk 'h' tast for at se denne hjælp." #: tui_ncurses.cpp:239 msgid "Press 'q' key to exit." msgstr "Tryk 'q' tast for at afslutte." #: tui_ncurses.cpp:241 msgid "CPU tab:" msgstr "CPU fane:" #: tui_ncurses.cpp:242 msgid "Press 'next page' key to decrease core type number to monitor." msgstr "Tryk 'Page Down' tast for at reducere kernetypenummeret der overvåges." #: tui_ncurses.cpp:243 msgid "Press 'previous page' key to increase core type number to monitor." msgstr "Tryk 'Page Up' tast for at øge kernetypenummeret der overvåges." #: tui_ncurses.cpp:244 msgid "Press 'down' key to decrease CPU core number to monitor." msgstr "Tryk 'ned' tast for at reducere CPU kerne antallet der skal overvåges." #: tui_ncurses.cpp:245 msgid "Press 'up' key to increase CPU core number to monitor." msgstr "Tryk 'op' tast for at øge CPU kerne antallet der skal overvåges." #: tui_ncurses.cpp:247 msgid "Caches tab:" msgstr "Cache fane:" #: tui_ncurses.cpp:248 msgid "Press 'down' key to switch to previous test." msgstr "Tryk 'ned' tast for at skifte til forrige test." #: tui_ncurses.cpp:249 msgid "Press 'up' key to switch to next test." msgstr "Tryk 'op' tast for at skifte til næste test." #: tui_ncurses.cpp:251 msgid "Bench tab:" msgstr "Benchmark fane:" #: tui_ncurses.cpp:252 msgid "Press 'down' key to decrement benchmark duration." msgstr "Tryk 'ned' tast for at reducere benchmark varighed." #: tui_ncurses.cpp:253 msgid "Press 'up' key to increment benchmark duration." msgstr "Tryk 'op' tast for at øge benchmark varighed." #: tui_ncurses.cpp:254 msgid "Press 'next page' key to decrement number of threads to use." msgstr "Tryk 'Page Down' tast for at reducere antallet af brugte tråde." #: tui_ncurses.cpp:255 msgid "Press 'previous page' key to increment number of threads to use." msgstr "Tryk 'Page Up' tast for at øge antallet af tråde." #: tui_ncurses.cpp:256 msgid "Press 's' key to start/stop prime numbers (slow) benchmark." msgstr "Tryk 's' tast for at starte/stoppe primtal (langsom) benchmark." #: tui_ncurses.cpp:257 msgid "Press 'f' key to start/stop prime numbers (fast) benchmark." msgstr "Tryk 'f' tast for at starte/stoppe primtal (hurtig) benchmark." #: tui_ncurses.cpp:259 msgid "Graphics tab:" msgstr "Grafik fane:" #: tui_ncurses.cpp:260 msgid "Press 'down' key to switch to previous graphic card." msgstr "Tryk 'ned' tast for at skrifte til forrige grafikkort." #: tui_ncurses.cpp:261 msgid "Press 'up' key to switch to next graphic card." msgstr "Tryk 'op' tast for at skifte til næste grafikkort." #: tui_ncurses.cpp:263 msgid "Press any key to exit this help." msgstr "Tryk en vilkårlig tast for at afslutte denne hjælp." #: tui_ncurses.cpp:640 msgid "Starting NCurses TUI…" msgstr "Starter NCurses TUI…" #: tui_ncurses.cpp:649 msgid "" "FATAL ERROR: terminfo database could not be found (try to set TERMINFO " "environment variable)" msgstr "" "FATAL FEJL: terminfo databasen kunne ikke blive fundet (prøv at sætte " "TERINFO miljøvariablen)" #: tui_ncurses.cpp:654 #, c-format msgid "Failed to set up %s terminal (err=%i); falling back to %s" msgstr "Kunne ikke sætte %s terminal (fejl=%i); falder tilbage til %s" #: util.cpp:189 #, c-format msgid "cannot find unit in '%s' string at position %i" msgstr "kan ikke finde enheden i teksten '%s' på position %i" #: util.cpp:252 #, fuzzy, c-format #| msgid "an error occurred while opening file '%s' (%s)" msgid "an error occurred while opening file '%s'" msgstr "en fejl skete under åbning af filen '%s' (%s)" #: util.cpp:297 #, fuzzy, c-format #| msgid "an error occurred while running command '%s' (%s)" msgid "an error occurred while running command '%s'" msgstr "en fejl skete under kørsel af kommandoen '%s' (%s)" #: util.cpp:437 msgid "set_cpu_affinity() not supported on this operating system" msgstr "set_cpu_affinity() er ikke understøttet på dette operativsystem" #: data.hpp:103 data.hpp:244 data.hpp:332 msgid "Vendor" msgstr "Leverandør" #: data.hpp:104 msgid "Code Name" msgstr "Kode Navn" #: data.hpp:105 msgid "Package" msgstr "Pakke" #: data.hpp:106 msgid "Technology" msgstr "Teknologi" #: data.hpp:107 data.hpp:268 msgid "Voltage" msgstr "Spænding" #: data.hpp:108 msgid "Specification" msgstr "Specifikation" #: data.hpp:109 msgid "Family" msgstr "Familie" #: data.hpp:110 msgid "Disp. Family" msgstr "Udvidet familie" #: data.hpp:111 data.hpp:224 data.hpp:245 data.hpp:335 msgid "Model" msgstr "Model" #: data.hpp:112 msgid "Disp. Model" msgstr "Udvidet Model" #: data.hpp:113 msgid "Temp." msgstr "Temp." #: data.hpp:114 msgid "Stepping" msgstr "Trin" #: data.hpp:115 msgid "Instructions" msgstr "Instruktioner" #: data.hpp:125 msgid "L1 Data" msgstr "N1 Data" #: data.hpp:126 msgid "L1 Inst." msgstr "N1 Inst." #: data.hpp:127 msgid "Level 2" msgstr "Niveau 2" #: data.hpp:128 msgid "Level 3" msgstr "Niveau 3" #: data.hpp:137 cpu-x-gtk-3.12.ui:1232 msgid "Cores" msgstr "Kerner" #: data.hpp:138 data.hpp:408 cpu-x-gtk-3.12.ui:1252 msgid "Threads" msgstr "Tråde" #: data.hpp:155 msgid "Core Speed" msgstr "Kerne hastighed" #: data.hpp:156 msgid "Multiplier" msgstr "Multiplikator" #: data.hpp:157 msgid "Bus Speed" msgstr "Bus Hastighed" #: data.hpp:158 data.hpp:341 msgid "Usage" msgstr "Brug" #: data.hpp:188 data.hpp:265 msgid "Size" msgstr "Størrelse" #: data.hpp:189 data.hpp:267 msgid "Speed" msgstr "Hastighed" #: data.hpp:223 data.hpp:259 msgid "Manufacturer" msgstr "Producenten" #: data.hpp:225 msgid "Revision" msgstr "Revision" #: data.hpp:233 msgid "Brand" msgstr "Varemærke" #: data.hpp:234 msgid "Version" msgstr "Version" #: data.hpp:235 msgid "Date" msgstr "Dato" #: data.hpp:236 msgid "ROM Size" msgstr "ROM Størrelse" #: data.hpp:260 msgid "Part Number" msgstr "" #: data.hpp:261 #, fuzzy #| msgid "Type #%i" msgid "Type" msgstr "Type #%i" #: data.hpp:262 #, fuzzy #| msgid "Type #%i" msgid "Type Detail" msgstr "Type #%i" #: data.hpp:263 msgid "Device Locator" msgstr "" #: data.hpp:264 msgid "Bank Locator" msgstr "" #: data.hpp:266 msgid "Rank" msgstr "" #: data.hpp:292 #, fuzzy #| msgid "Code Name" msgid "Name" msgstr "Kode Navn" #: data.hpp:293 msgid "Kernel" msgstr "Kerne" #: data.hpp:294 msgid "Hostname" msgstr "Værtsnavn" #: data.hpp:295 msgid "Uptime" msgstr "Oppetid" #: data.hpp:303 msgid "Used" msgstr "Brugt" #: data.hpp:304 msgid "Buffers" msgstr "Buffere" #: data.hpp:305 msgid "Cached" msgstr "Cachet" #: data.hpp:306 msgid "Free" msgstr "Fri" #: data.hpp:307 msgid "Swap" msgstr "Swap" #: data.hpp:333 msgid "Driver" msgstr "Driver" #: data.hpp:334 msgid "UMD Version" msgstr "UMD Version" #: data.hpp:336 msgid "Compute Unit" msgstr "Computer Enhed" #: data.hpp:337 #, fuzzy #| msgid "DeviceID" msgid "Device ID" msgstr "EnhedsID" #: data.hpp:338 msgid "VBIOS Version" msgstr "VBIOS Version" #. #-#-#-#-# source_ui.pot (cpu-x ) #-#-#-#-# #. Setting: "Interface" tab #: data.hpp:339 cpu-x-gtk-3.12.ui:5807 msgid "Interface" msgstr "Grænseflade" #: data.hpp:340 msgid "Temperature" msgstr "Temperatur" #: data.hpp:342 msgid "Core Voltage" msgstr "Kerne Spænding" #: data.hpp:343 msgid "Power Avg" msgstr "Effekt Gns" #: data.hpp:344 #, fuzzy #| msgid "Memory clock" msgid "Core Clock" msgstr "Hukommelses frekvens" #: data.hpp:345 #, fuzzy #| msgid "Memory clock" msgid "Memory Clock" msgstr "Hukommelses frekvens" #: data.hpp:346 msgid "Memory Used" msgstr "Hukommelse Brugt" #: data.hpp:347 msgid "Resizable BAR" msgstr "Justerbar BAR" #: data.hpp:348 msgid "Vulkan RT" msgstr "Vulkan RT" #: data.hpp:349 msgid "OpenGL Version" msgstr "OpenGL Version" #: data.hpp:350 msgid "Vulkan Version" msgstr "Vulkan Version" #: data.hpp:351 msgid "OpenCL Version" msgstr "OpenCL Version" #: data.hpp:387 msgid "Score" msgstr "Score" #: data.hpp:388 msgid "Run" msgstr "Kør" #: data.hpp:407 msgid "Duration" msgstr "Varighed" #: util.hpp:77 msgid "bytes" msgstr "bytes" #. TRANSLATORS: initials for kilobyte (10³): please put initials (keep it short) #: util.hpp:80 msgid "kB" msgstr "kB" #. TRANSLATORS: initials for megabyte (10⁶): please put initials (keep it short) #: util.hpp:82 msgid "MB" msgstr "MB" #. TRANSLATORS: initials for gigabyte (10⁹): please put initials (keep it short) #: util.hpp:84 msgid "GB" msgstr "GB" #. TRANSLATORS: initials for terabyte (10¹²): please put initials (keep it short) #: util.hpp:86 msgid "TB" msgstr "TB" #. TRANSLATORS: initials for kibibyte (2¹⁰): please put initials (keep it short) #: util.hpp:89 msgid "KiB" msgstr "KiB" #. TRANSLATORS: initials for mebibyte (2²⁰): please put initials (keep it short) #: util.hpp:91 msgid "MiB" msgstr "MiB" #. TRANSLATORS: initials for gibibyte (2³⁰): please put initials (keep it short) #: util.hpp:93 msgid "GiB" msgstr "GiB" #. TRANSLATORS: initials for tebibyte (2⁴⁰): please put initials (keep it short) #: util.hpp:95 msgid "TiB" msgstr "TiB" #: cpu-x-gtk-3.12.ui:1184 msgid "Cache" msgstr "Cache" #. Setting: refresh time for UI #: cpu-x-gtk-3.12.ui:5721 msgid "Refresh time" msgstr "Opdaterings hastighed" #. Setting: GUI theme #: cpu-x-gtk-3.12.ui:5745 #, fuzzy #| msgid "Theme" msgid "Text theme" msgstr "Tema" #. Setting: automatic GUI theme #: cpu-x-gtk-3.12.ui:5760 msgid "Automatic" msgstr "Automatisk" #. Setting: light GUI theme #: cpu-x-gtk-3.12.ui:5761 msgid "Blue for light theme" msgstr "" #. Setting: dark GUI theme #: cpu-x-gtk-3.12.ui:5762 msgid "Yellow for dark theme" msgstr "" #. Setting: temperature unit #: cpu-x-gtk-3.12.ui:5775 #, fuzzy #| msgid "Temperature" msgid "Temperature unit" msgstr "Temperatur" #. Setting: default tab at startup #: cpu-x-gtk-3.12.ui:5826 msgid "Default tab" msgstr "Standard fane" #. Setting: default CPU core at startup #: cpu-x-gtk-3.12.ui:5839 msgid "Default CPU core" msgstr "Standard CPU kerne" #. Setting: default cache test at startup #: cpu-x-gtk-3.12.ui:5852 msgid "Default cache test" msgstr "Standard cache test" #. Setting: print CPUID values in decimal or hexadecimal #: cpu-x-gtk-3.12.ui:5895 msgid "Print CPUID values in decimal" msgstr "Udskriv CPUID værdier i heltal" #. Setting: default graphic card at startup #: cpu-x-gtk-3.12.ui:5928 msgid "Default graphic card" msgstr "Standard grafikkort" #. Setting: default CPU core at startup #: cpu-x-gtk-3.12.ui:5952 msgid "Default core type" msgstr "Standard kerne type" #. Setting: default graphic card at startup #: cpu-x-gtk-3.12.ui:5976 #, fuzzy #| msgid "Default core type" msgid "Default memory stick" msgstr "Standard kerne type" #. Setting: "Startup" tab #: cpu-x-gtk-3.12.ui:6004 msgid "Startup" msgstr "Opstart" #~ msgid "Light" #~ msgstr "Lyst" #~ msgid "Dark" #~ msgstr "Mørkt" #~ msgid "Calculating CPU multipliers" #~ msgstr "Beregner CPU-multiplikatorer" #, c-format #~ msgid "Current: PCIe Gen%1dx%d / Max: Gen%1dx%d" #~ msgstr "Nuværende: PCIe Gen%1dx%d / Maks: Gen%1dx%d" #~ msgid "failed to retrieve GPU clocks" #~ msgstr "kunne ikke tilgå GPU frekvenser" #, c-format #~ msgid "Core #%i" #~ msgstr "Kerne #%i" #~ msgid "Setting label names" #~ msgstr "Sætter etiketnavne" #, c-format #~ msgid "Bank %i" #~ msgstr "Holder %i" #~ msgid "Reference" #~ msgstr "Reference" #~ msgid "Distribution" #~ msgstr "Udgivelse" #~ msgid "Compiler" #~ msgstr "Kompiler" #~ msgid "GPU clock" #~ msgstr "GPU Frekvens" #~ msgid "Dumping data…" #~ msgstr "Dumper data…" #~ msgid "Freeing memory" #~ msgstr "Frigører hukommelse" #~ msgid "Ignore CPU frequency reported by libcpuid" #~ msgstr "Ignorer CPU frekvens rapporteret fra libcpuid" #, c-format #~ msgid "failed to call wordexp (%i)" #~ msgstr "kunne ikke kalde wordexp (%i)" #~ msgid "Press 'home' key to scroll up in a page." #~ msgstr "Tryk 'home' tast for at rulle op på en side." #~ msgid "Press 'end' key to scroll down in a page." #~ msgstr "Tryk 'end' tast for at rulle ned på en side." #, c-format #~ msgid "String '%s' is too long, truncating…" #~ msgstr "Teksten '%s' er for lang, afkorter…" #, c-format #~ msgid "failed to open %s directory" #~ msgstr "fejlede under åbning af filstien %s" #~ msgid "an error occurred while compiling regex" #~ msgstr "en fejl skete under kompilering af regex" #~ msgid "FATAL ERROR: could not allocate memory" #~ msgstr "FATAL FEJL: kunne ikke allokere hukommelse" #, fuzzy, c-format #~| msgid "failed to call libcpuid (%s)" #~ msgid "failed to call vkEnumerateInstanceExtensionProperties (%s)" #~ msgstr "kunne ikke kalde libcpuid (%s)" #, fuzzy #~| msgid "failed to call libcpuid (%s)" #~ msgid "faild to call clGetDeviceIDs" #~ msgstr "kunne ikke kalde libcpuid (%s)" CPU-X-5.0.3/po/de.po000066400000000000000000001257621454622605200137440ustar00rootroot00000000000000# Copyright © 2014-2024 The Tumultuous Unicorn Of Darkness # This file is distributed under the same license as the CPU-X package. # Translators: # Torge Matthies , 2019, 2020. # Andreas Kleinert , 2019. # CurlingTongs , 2019. # ssantos , 2019. # anonymous , 2020. # Martin Beer , 2020. # nautilusx , 2020. # nautilusx , 2021, 2022, 2023. # sm_moshi , 2021. # Alex , 2022. # sal0max , 2022. # jagfwajgf , 2022. # Ettore Atalan , 2023. msgid "" msgstr "" "Project-Id-Version: cpu-x\n" "Report-Msgid-Bugs-To: https://github.com/TheTumultuousUnicornOfDarkness/CPU-" "X/issues\n" "POT-Creation-Date: 2023-12-09 13:09+0100\n" "PO-Revision-Date: 2023-12-25 16:08+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.4-dev\n" #: core.cpp:135 msgid "Finding CPU technology" msgstr "CPU-Technologie finden" #: core.cpp:161 #, c-format msgid "" "Your CPU is not present in the database ==> %s, model: %i, ext. model: %i, " "ext. family: %i" msgstr "" "Ihre CPU ist nicht in der Datenbank vorhanden ➜ %s, Model: %i, ext. Model: " "%i, ext. Familie: %i" #: core.cpp:189 data.cpp:150 data.cpp:342 msgid "unknown" msgstr "unbekannt" #: core.cpp:230 msgid "Calling libcpuid for retrieving static data" msgstr "Aufruf von libcpuid zum Abrufen statischer Daten" #: core.cpp:245 #, c-format msgid "failed to call libcpuid (%s)" msgstr "Fehler beim Aufruf von libcpuid (%s)" #: core.cpp:340 msgid "Calling libcpuid for retrieving dynamic data" msgstr "Aufruf von libcpuid zum Abruf dynamischer Daten" #: core.cpp:353 msgid "Calling libcpuid for retrieving CPU MSR static values" msgstr "Aufruf von libcpuid zum Abrufen von statischen CPU-MSR-Werten" #: core.cpp:380 msgid "Calling libcpuid for retrieving CPU MSR dynamic values" msgstr "Aufruf von libcpuid zum Abrufen von dynamischer CPU-MSR-Werten" #: core.cpp:412 msgid "Calling dmidecode" msgstr "dmidecode aufrufen" #: core.cpp:454 core.cpp:473 #, c-format msgid "%s (configured)" msgstr "%s (konfiguriert)" #: core.cpp:461 core.cpp:480 #, c-format msgid "%s (max)" msgstr "%s (max)" #: core.cpp:466 #, c-format msgid "%s (min)" msgstr "%s (min)" #: core.cpp:496 msgid "Calculating CPU usage" msgstr "CPU-Auslastung wird berechnet" #: core.cpp:546 msgid "Calling bandwidth" msgstr "Bandbreite aufrufen" #: core.cpp:613 #, c-format msgid "" "pci_access is not properly initialized: it is a common issue when %s was " "built with a lower libpci version.\n" "Check that libpci %s library is present on your system. Otherwise, please " "rebuild %s." msgstr "" "pci_access ist nicht richtig initialisiert: Das ist ein häufiges Problem, " "wenn %s mit einer niedrigeren libpci-Version gebaut wurde.\n" "Prüfen Sie, ob die libpci %s Bibliothek auf Ihrem System vorhanden ist. " "Andernfalls bauen Sie %s bitte neu." #: core.cpp:657 #, c-format msgid "No kernel driver in use for graphic card at path %s" msgstr "" "Im folgenden Pfad wurde kein Kernel Treiber für Grafikkarten gefunden %s" #: core.cpp:693 #, c-format msgid "Your GPU kernel driver is unknown: %s" msgstr "Ihr GPU-Kerneltreiber ist unbekannt: %s" #: core.cpp:777 #, c-format msgid "Your GPU user mode driver is unknown for vendor %s: %s" msgstr "Ihr GPU-Benutzermodustreiber ist für den Lieferant %s unbekannt: %s" #: core.cpp:781 #, c-format msgid "failed to call GLFW (%i): %s" msgstr "GLFW konnte nicht aufgerufen werden (%i): %s" #: core.cpp:914 msgid "Finding Vulkan API version" msgstr "Vulkan API-Version finden" #: core.cpp:926 #, c-format msgid "failed to call vkCreateInstance (%s)" msgstr "Fehler beim Aufrufen von vkCreateInstance (%s)" #: core.cpp:929 #, c-format msgid "%s is not supported" msgstr "%s wird nicht unterstützt" #: core.cpp:937 #, c-format msgid "failed to call vkEnumeratePhysicalDevices (%s)" msgstr "Fehler beim Aufrufen von vkEnumeratePhysicalDevices (%s)" #: core.cpp:944 msgid "No available Vulkan devices" msgstr "Keine Vulkan-Geräte verfügbar" #: core.cpp:952 #, c-format msgid "No available physical devices (%s)" msgstr "Keine verfügbaren physischen Geräte (%s)" #: core.cpp:1015 #, c-format msgid "Failed to create Vulkan for device %u (%s)" msgstr "Fehler beim Erstellen von Vulkan für Gerät %u (%s)" #: core.cpp:1019 #, c-format msgid "%s is not supported for device %u, use only deviceID for matching" msgstr "" "%s wird für das Gerät %u nicht unterstützt, verwenden Sie nur deviceID für " "den Abgleich" #: core.cpp:1051 core.cpp:1364 msgid "Enabled" msgstr "Aktiviert" #: core.cpp:1051 core.cpp:1364 msgid "Disabled" msgstr "Deaktiviert" #: core.cpp:1088 msgid "Finding OpenCL API version" msgstr "OpenCL API-Version finden" #: core.cpp:1092 #, c-format msgid "There is no platform with OpenCL support (%s)" msgstr "Es gibt keine Plattform mit OpenCL Unterstützung (%s)" #: core.cpp:1102 #, c-format msgid "failed to get all OpenCL platforms (%s)" msgstr "Fehler beim Aufrufen aller OpenCL Plattformen (%s)" #: core.cpp:1115 #, c-format msgid "failed to get name for platform %u (%s)" msgstr "Anfordern des Namens der Plattform %u fehlgeschlagen (%s)" #: core.cpp:1123 #, c-format msgid "failed to get version for platform %u (%s)" msgstr "Anfordern der Version der Plattform %u fehlgeschlagen (%s)" #: core.cpp:1131 #, c-format msgid "failed to find number of OpenCL devices for platform '%s %s' (%s)" msgstr "" "Finden der Menge an OpenCL Geräten für die Plattform '%s %s' fehlgeschlagen " "(%s)" #: core.cpp:1131 msgid "0 device" msgstr "0 Geräte" #: core.cpp:1140 #, c-format msgid "failed to get all of OpenCL devices for platform '%s %s' (%s)" msgstr "" "Aufruf aller OpenCL Geräte für die Plattform '%s %s' fehlgeschlagen (%s)" #: core.cpp:1160 #, c-format msgid "failed to get name for device %u (%s)" msgstr "Aufruf des Namens des Gerätes %u fehlgeschlagen (%s)" #: core.cpp:1168 #, c-format msgid "failed to get version for device %u (%s)" msgstr "Version für Gerät %u konnte nicht ermittelt werden (%s)" #: core.cpp:1190 #, c-format msgid "OpenCL driver for '%s %s' does not support CL_DEVICE_TOPOLOGY_AMD (%s)" msgstr "" "Der OpenCL Treiber für '%s %s' unterstützt CL_DEVICE_TOPOLOGY_AMD (%s) nicht" #: core.cpp:1201 #, c-format msgid "" "OpenCL driver for '%s %s' does not support CL_DEVICE_GFXIP_MAJOR_AMD (%s)" msgstr "" "Der OpenCL Treiber für '%s %s' unterstützt CL_DEVICE_GFXIP_MAJOR_AMD (%s) " "nicht" #: core.cpp:1209 core.cpp:1229 core.cpp:1262 #, c-format msgid "" "OpenCL driver for '%s %s' does not support CL_DEVICE_MAX_COMPUTE_UNITS (%s)" msgstr "" "Der OpenCL Treiber für '%s %s' unterstützt CL_DEVICE_MAX_COMPUTE_UNITS (%s) " "nicht" #: core.cpp:1250 #, c-format msgid "" "OpenCL driver for '%s %s' does not support CL_DEVICE_PCI_DOMAIN_ID_NV (%s), " "CL_DEVICE_PCI_BUS_ID_NV (%s) or CL_DEVICE_PCI_SLOT_ID_NV (%s)" msgstr "" "Der OpenCL Treiber für '%s %s' unterstützt CL_DEVICE_PCI_DOMAIN_ID_NV (%s), " "CL_DEVICE_PCI_BUS_ID_NV (%s) oder CL_DEVICE_PCI_SLOT_ID_NV (%s) nicht" #: core.cpp:1273 #, c-format msgid "OpenCL is not supported with your GPU vendor (0x%X)" msgstr "OpenCL wird von deinem GPU Hersteller nicht unterstützt (0x%X)" #: core.cpp:1295 msgid "Finding devices" msgstr "Suche Geräte" #: core.cpp:1307 #, c-format msgid "Skip devices search (wrong permissions on %s device)" msgstr "Suche nach Geräten überspringen (falsche Berechtigungen auf %s Gerät)" #: core.cpp:1350 #, c-format msgid "Your GPU vendor is unknown: %s (0x%X)" msgstr "Unbekannter GPU-Hersteller: %s (0x%X)" #: core.cpp:1370 msgid "failed to find chipset vendor and model" msgstr "Chipsatzhersteller und Modell konnte nicht ermittelt werden" #: core.cpp:1385 msgid "failed to find graphic card vendor and model" msgstr "Grafikkartenhersteller und Modell konnten nicht ermittelt werden" #: core.cpp:1487 msgid "Retrieving GPU clocks" msgstr "GPU-Taktgeber abrufen" #: core.cpp:1500 msgid "None" msgstr "Keine" #: core.cpp:1509 #, c-format msgid "DRM path for %s is unknown" msgstr "DRM-Pfad für %u ist unbekannt" #: core.cpp:1516 #, c-format msgid "Card number for %s is unknown" msgstr "Kartennummer für %u ist unbekannt" #: core.cpp:1541 #, c-format msgid "PCIe %s (current) / %s (max)" msgstr "PCIe %s (aktuell) / %s (max)" #: core.cpp:1650 #, c-format msgid "Driver for %s doesn't report frequencies" msgstr "Treiber für %u meldet keine Taktfrequenzen" #: core.cpp:1671 #, c-format msgid "failed to retrieve all monitoring data for %s" msgstr "Fehler beim Abrufen aller Überwachungsdaten für %s" #: core.cpp:1694 msgid "Identifying running system" msgstr "Laufendes System wird identifiziert" #: core.cpp:1697 msgid "failed to identify running system" msgstr "Fehler beim Identifizieren des laufenden Systems" #: core.cpp:1749 core.cpp:1778 msgid "Calling libprocps" msgstr "libprocps aufrufen" #: core.cpp:1752 msgid "unable to get system uptime" msgstr "Betriebszeit des Systems kann nicht ermittelt werden" #: core.cpp:1758 msgid "unable to create meminfo structure" msgstr "Meminfo-Struktur kann nicht erstellt werden" #: core.cpp:1804 msgid "Calling libstatgrab" msgstr "libstatgrab aufrufen" #: core.cpp:1852 #, c-format msgid "%i days, %i hours, %i minutes, %i seconds" msgstr "%i Tage, %i Stunden, %i Minuten, %i Sekunden" #: core.cpp:1915 msgid "Updating benchmark status" msgstr "Benchmark-Status wird aktualisiert" #: core.cpp:1918 msgid "Active" msgstr "Aktiv" #: core.cpp:1921 #, c-format msgid "(%u hours left)" msgstr "(%u Stunden verbleibend)" #: core.cpp:1923 #, c-format msgid "(%u minutes left)" msgstr "(%u Minuten verbleibend)" #: core.cpp:1925 #, c-format msgid "(%u seconds left)" msgstr "(%u Sekunden verbleibend)" #: core.cpp:1929 core.cpp:1984 core.cpp:1985 msgid "Inactive" msgstr "Inaktiv" #: core.cpp:1932 #, c-format msgid "in %u hours" msgstr "in %u Stunden" #: core.cpp:1934 #, c-format msgid "in %u minutes" msgstr "in %u Minuten" #: core.cpp:1936 #, c-format msgid "in %u seconds" msgstr "in %u Sekunden" #: core.cpp:1953 #, c-format msgid "Starting benchmark with %u threads" msgstr "Benchmark mit %u Threads starten" #: core.cpp:1976 msgid "an error occurred while starting benchmark" msgstr "Beim Starten des Benchmarks ist ein Fehler aufgetreten" #: core.cpp:2002 msgid "Finding CPU package in fallback mode" msgstr "CPU-Paket wird in alternativem Modus ermittelt" #: core.cpp:2032 #, c-format msgid "Your CPU socket is not present in the database ==> %s, codename: %s" msgstr "Ihr CPU-Sockel ist nicht in der Datenbank vorhanden ➜ %s, Codename: %s" #: core.cpp:2052 msgid "Calculating CPU multipliers in fallback mode" msgstr "CPU-Multiplikatoren werden in alternativem Modus ermittelt" #: core.cpp:2072 msgid "Retrieving motherboard information in fallback mode" msgstr "Motherboard-Informationen werden in alternativem Modus abgerufen" #: core.cpp:2085 msgid "failed to retrieve motherboard information (fallback mode)" msgstr "Fehler beim Abrufen der Motherboard-Informationen (alternativer Modus)" #: core.cpp:2127 msgid "Retrieving CPU temperature in fallback mode" msgstr "CPU-Temperatur wird in alternativem Modus abgerufen" #: core.cpp:2173 msgid "failed to retrieve CPU temperature (fallback mode)" msgstr "Fehler beim Abrufen der CPU-Temperatur (alternativer Modus)" #: core.cpp:2188 msgid "Retrieving CPU voltage in fallback mode" msgstr "CPU-Spannung wird in alternativem Modus abgerufen" #: core.cpp:2200 msgid "failed to retrieve CPU voltage (fallback mode)" msgstr "Fehler beim Abrufen der CPU-Spannung (alternativer Modus)" #: core.cpp:2214 msgid "Retrieving CPU frequency in fallback mode" msgstr "CPU-Frequenz wird in alternativem Modus abgerufen" #: core.cpp:2220 msgid "failed to retrieve CPU frequency (fallback mode)" msgstr "Fehler beim Abrufen der CPU-Frequenz (alternativer Modus)" #: daemon_client.cpp:65 msgid "Starting daemon in background…" msgstr "Daemon wird im Hintergrund gestartet…" #: daemon_client.cpp:172 msgid "pkexec: authorization could not be obtained (dialog dismissed)" msgstr "pkexec: Autorisierung konnte nicht erlangt werden (Dialog verworfen)" #: daemon_client.cpp:175 msgid "pkexec: authorization could not be obtained (not authorized)" msgstr "pkexec: Autorisierung konnte nicht erlangt werden (nicht autorisiert)" #: daemon_client.cpp:178 msgid "pkexec: command not found" msgstr "pkexec: Befehl nicht gefunden" #: daemon_client.cpp:181 msgid "pkexec: unexpected error code" msgstr "pkexec: Unerwarteter Fehlercode" #: daemon_client.cpp:211 msgid "Connecting to daemon…" msgstr "Verbindung zum Daemon herstellen…" #: daemon_server.cpp:261 #, c-format msgid "request_handler: case %i not handled" msgstr "request_handler: Fall %i nicht verarbeitet" #: data.cpp:124 cpu-x-gtk-3.12.ui:1370 msgid "CPU" msgstr "CPU" #: data.cpp:187 msgid "P-core" msgstr "P-Kern" #: data.cpp:188 msgid "E-core" msgstr "E-Kern" #: data.cpp:189 data.cpp:192 msgid "Core" msgstr "Kern" #: data.cpp:208 cpu-x-gtk-3.12.ui:746 msgid "Processor" msgstr "Prozessor" #: data.cpp:240 data.cpp:329 cpu-x-gtk-3.12.ui:1968 msgid "Caches" msgstr "Caches" #: data.cpp:247 #, c-format msgid "%2d x %4d %s, %2d-way" msgstr "%2d x %4d %s, %2d-fach" #: data.cpp:249 #, c-format msgid "%d %s, %d-way" msgstr "%d %s, %d-fach" #: data.cpp:263 msgid "Count" msgstr "Anzahl" #: data.cpp:276 cpu-x-gtk-3.12.ui:968 msgid "Clocks" msgstr "Takte" #: data.cpp:379 data.cpp:383 #, c-format msgid "L%u Cache" msgstr "L%u-Cache" #: data.cpp:385 #, c-format msgid "%s associative, %d-%s line size" msgstr "%s assoziativ, %d-%s Zeilengröße" #: data.cpp:398 msgid "Test" msgstr "Test" #: data.cpp:409 data.cpp:423 cpu-x-gtk-3.12.ui:2146 cpu-x-gtk-3.12.ui:2517 msgid "Motherboard" msgstr "Motherboard" #: data.cpp:437 cpu-x-gtk-3.12.ui:2367 msgid "BIOS" msgstr "BIOS" #: data.cpp:452 cpu-x-gtk-3.12.ui:2498 msgid "Chipset" msgstr "Chipsatz" #: data.cpp:467 data.cpp:569 cpu-x-gtk-3.12.ui:3156 cpu-x-gtk-3.12.ui:3761 msgid "Memory" msgstr "Speicher" #: data.cpp:483 #, c-format msgid "Stick %u" msgstr "Stick %u" #: data.cpp:487 cpu-x-gtk-3.12.ui:3134 msgid "Sticks" msgstr "Sticks" #: data.cpp:541 cpu-x-gtk-3.12.ui:3780 msgid "System" msgstr "System" #: data.cpp:554 cpu-x-gtk-3.12.ui:3380 msgid "Operating System" msgstr "Betriebssystem" #: data.cpp:587 cpu-x-gtk-3.12.ui:4960 msgid "Graphics" msgstr "Grafik" #: data.cpp:621 #, c-format msgid "Card %u" msgstr "Karte %u" #: data.cpp:625 cpu-x-gtk-3.12.ui:4938 msgid "Cards" msgstr "Karten" #: data.cpp:672 cpu-x-gtk-3.12.ui:5300 msgid "Bench" msgstr "Bench" #: data.cpp:685 msgid "Not started" msgstr "Nicht gestartet" #: data.cpp:688 cpu-x-gtk-3.12.ui:5070 msgid "Prime numbers (slow)" msgstr "Primzahlen (langsam)" #: data.cpp:692 cpu-x-gtk-3.12.ui:5178 msgid "Prime numbers (fast)" msgstr "Primzahlen (schnell)" #: data.cpp:696 cpu-x-gtk-3.12.ui:5281 msgid "Parameters" msgstr "Parameter" #: data.cpp:721 data.cpp:727 #, c-format msgid "%u mins" msgstr "%u Minuten" #: data.cpp:734 cpu-x-gtk-3.12.ui:5444 cpu-x-gtk-3.12.ui:5552 msgid "About" msgstr "Über" #: data.cpp:739 #, c-format msgid "" "%s is a Free software that gathers information\n" "on CPU, motherboard and more." msgstr "" "%s ist eine Freie Software die Informationen\n" "über CPU, Motherboard und mehr sammelt." #: data.cpp:744 msgid "About CPU-X" msgstr "Über CPU-X" #: data.cpp:745 #, c-format msgid "Version %s" msgstr "Version %s" #: data.cpp:746 #, c-format msgid "Author: %s" msgstr "Autor: %s" #: data.cpp:747 #, c-format msgid "Site: %s" msgstr "Seite: %s" #: data.cpp:751 cpu-x-gtk-3.12.ui:5533 msgid "License" msgstr "Lizenz" #: data.cpp:753 #, c-format msgid "This software is distributed under the terms of %s" msgstr "Diese Software wird unter den Bedingungen der %s verteilt" #: data.cpp:754 main.cpp:176 msgid "This program comes with ABSOLUTELY NO WARRANTY" msgstr "Dieses Programm kommt mit ABSOLUT KEINER GARANTIE" #: gui_gtk.cpp:61 #, c-format msgid "Cannot find path for '%s' file" msgstr "Pfad für Datei ‚%s‘ kann nicht gefunden werden" #: gui_gtk.cpp:400 msgid "Start daemon" msgstr "Daemon starten" #: gui_gtk.cpp:403 msgid "Connected to daemon" msgstr "Mit Daemon verbunden" #: gui_gtk.cpp:406 msgid "No polkit authentication agent found" msgstr "Kein Polkit-Authentifizierungsagent gefunden" #: gui_gtk.cpp:411 msgid "Ask password to start daemon in background" msgstr "Verlange Passwort um den Daemon im Hintergrund zu starten" #: gui_gtk.cpp:415 msgid "Settings" msgstr "Einstellungen" #: gui_gtk.cpp:634 msgid "BaseFamily" msgstr "BaseFamily" #: gui_gtk.cpp:635 msgid "CPU display (\"true\") family (computed as BaseFamily+ExtendedFamily)" msgstr "" "Angezeigte (\"echte\") CPU-Familie (zusammengestellt aus " "BaseFamily+ExtendedFamily)" #: gui_gtk.cpp:636 msgid "BaseModel" msgstr "BaseModel" #: gui_gtk.cpp:637 msgid "CPU display (\"true\") model (computed as (ExtendedModel<<4)+BaseModel)" msgstr "" "Angezeigtes (\"echtes\") CPU-Modell (zusammengestellt aus " "(ExtendedModel<<4)+BaseModel)" #: gui_gtk.cpp:847 msgid "" "Identify the physically-labeled socket or board position where the memory " "device is located" msgstr "" "Identifizieren Sie den physikalisch beschrifteten Sockel oder die Position " "auf der Platine, wo sich das Speichergerät befindet" #: gui_gtk.cpp:848 msgid "Identify the physically labeled bank where the memory device is located" msgstr "" "Identifizieren Sie die physikalisch beschriftete Bank, wo sich das " "Speichergerät befindet" #: gui_gtk.cpp:1052 msgid "User Mode Driver Version" msgstr "User-Mode Driver-Version" #: gui_gtk.cpp:1066 msgid "Vulkan Ray Tracing" msgstr "Vulkan-Raytracing" #: gui_gtk.cpp:1260 msgid "Starting GTK GUI…" msgstr "GTK-GUI wird gestartet…" #: gui_gtk.cpp:1272 msgid "failed to import UI in GtkBuilder" msgstr "Fehler beim Importieren des UIs in GtkBuilder" #: main.cpp:63 msgid "Start graphical user interface (GUI) (default)" msgstr "Grafische Benutzeroberfläche (GUI) starten (Standard)" #: main.cpp:64 msgid "Start text-based user interface (TUI)" msgstr "Text-basierte Benutzeroberfläche (TUI) starten" #: main.cpp:65 msgid "Dump all data on standard output and exit" msgstr "Alle Daten in die Standardausgabe schreiben und Anwendung beenden" #: main.cpp:66 msgid "Run embedded command dmidecode and exit" msgstr "Eingebettetes Kommando dmidecode ausführen und Anwendung beenden" #: main.cpp:67 msgid "Run embedded command bandwidth and exit" msgstr "Eingebettete Kommando bandwidth ausführen und Anwendung beenden" #: main.cpp:68 msgid "Set temperature unit (c[elsius]|f[ahrenheit]|k[elvin]|r[ankine])" msgstr "" "Temperatureinheit festlegen (c[elsius]|f[ahrenheit]|k[elvin]|r[ankine])" #: main.cpp:69 msgid "Set custom time between two refreshes (in seconds)" msgstr "Intervall für die Aktualisierungen festlegen (in Sekunden)" #: main.cpp:70 msgid "Set default tab (integer)" msgstr "Standard-Tab festlegen (Ganzzahl)" #: main.cpp:71 msgid "Select core type to monitor (integer)" msgstr "Zu überwachenden Kerntyp auswählen (Ganzzahl)" #: main.cpp:72 msgid "Select CPU core to monitor (integer)" msgstr "Zu überwachenden CPU-Kern auswählen (Ganzzahl)" #: main.cpp:73 msgid "Set custom bandwidth test for CPU caches speed (integer)" msgstr "" "Bandbreiten-Test für die CPU-Cache-Geschwindigkeit auswählen (Ganzzahl)" #: main.cpp:74 msgid "Select default memory stick (integer)" msgstr "Standard-Speicherstick auswählen (Ganzzahl)" #: main.cpp:75 msgid "Select default graphic card (integer)" msgstr "Standardgrafikkarte auswählen (Ganzzahl)" #: main.cpp:76 cpu-x-gtk-3.12.ui:5910 msgid "Start and connect to daemon" msgstr "Starten und mit Daemon verbinden" #: main.cpp:77 msgid "Verbose output" msgstr "Ausführliche Ausgabe" #: main.cpp:78 msgid "Print help and exit" msgstr "Hilfetext ausgeben und Anwendung beenden" #: main.cpp:79 msgid "Print version and exit" msgstr "Version ausgeben und Anwendung beenden" #: main.cpp:80 msgid "Print CPUID values in decimal (default is hexadeximal)" msgstr "CPUID-Werte in Dezimaldarstellung ausgeben (Standard ist Hexadezimal)" #: main.cpp:81 msgid "Disable colored output" msgstr "Farbige Ausgabe deaktivieren" #: main.cpp:82 msgid "Print information for debugging" msgstr "Informationen zur Fehlersuche ausgeben" #: main.cpp:83 msgid "Print required information to paste in an issue" msgstr "Benötigte Informationen zum Einfügen in einen Problembericht ausgeben" #: main.cpp:84 msgid "Set key mapping for NCurses mode (a[rrows]|e[macs]|i[nverted-T]|v[im])" msgstr "" "Tastenkürzel für den NCurser-Modus festlegen (a[Pfeile]|e[macs]|" "i[nvertiertes-T]|v[im])" #: main.cpp:95 msgid "Add default command line arguments" msgstr "Setze Standard-Kommandozeilenargumente" #: main.cpp:96 msgid "Enforce the bus clock" msgstr "Bustaktung erzwingen" #: main.cpp:97 msgid "" "Ignore CPU values reported by libcpuid (comma-separated values among 'temp', " "'volt' and 'freq')" msgstr "" "Von libcpuid gemeldete CPU-Werte ignorieren (kommagetrennte Werte zwischen " "'temp', 'volt' und 'freq')" #: main.cpp:98 msgid "Read CPUID raw data from a given file" msgstr "CPUID-Rohdaten aus einer gegebenen Datei lesen" #: main.cpp:99 msgid "Only print a message if CPU is not present in the database" msgstr "" "Nur eine Nachricht ausgeben, wenn die CPU nicht in der Datenbank vorhanden " "ist" #: main.cpp:126 #, c-format msgid "Usage: %s DISPLAY [OPTIONS]\n" msgstr "Aufruf: %s ANZEIGE [OPTIONEN]\n" #: main.cpp:127 msgid "Available DISPLAY:" msgstr "Verfügbare ANZEIGE:" #: main.cpp:135 msgid "Available OPTIONS:" msgstr "Verfügbare OPTIONEN:" #: main.cpp:144 msgid "Influenceable environment variables:" msgstr "Umgebungsvariablen:" #: main.cpp:175 msgid "This is free software: you are free to change and redistribute it." msgstr "Dies ist freie Software: Sie dürfen sie frei verändern und verbreiten." #: main.cpp:177 #, c-format msgid "See the %s license: <%s>\n" msgstr "Siehe %s Lizenz: %s\n" #: main.cpp:184 #, c-format msgid "-- %-9s version: %s" msgstr "-- %-9s Version: %s" #: main.cpp:381 #, c-format msgid "" "\n" "Oops, something was wrong! %s has received signal %d (%s) and has crashed." msgstr "" "\n" "Ein Fehler ist aufgetreten! %s hat das Signal %d (%s) empfangen und ist " "abgestürzt." #: main.cpp:383 #, c-format msgid "" "\n" "Oops, something was wrong! %s has received signal %d (%s) and is trying to " "recover." msgstr "" "\n" "Ein Fehler ist aufgetreten! %s hat das Signal %d (%s) empfangen und " "versucht, sich zu erholen." #: main.cpp:407 msgid "You can open a new issue here, by filling the template as requested:" msgstr "" "Sie können hier ein neues Problem eröffnen, indem Sie die Vorlage wie " "vorgegeben ausfüllen:" #: main.cpp:449 msgid "an error occurred while setting locale" msgstr "Setzen des Gebietsschemas ist fehlgeschlagen" #: options.cpp:124 #, c-format msgid "" "Selected CPU type (%u) is not a valid number (%u is the maximum for this CPU)" msgstr "" "Ausgewählter CPU-Typ (%u) ist keine gültige Zahl (%u ist das Maximum für " "diese CPU)" #: options.cpp:145 #, c-format msgid "" "Selected bandwidth test (%u) is not a valid number (%u is the maximum for " "this system)" msgstr "" "Ausgewählter Bandbreitentest (%u) ist keine gültige Zahl (%u ist der " "Höchstwert für dieses System)" #: options.cpp:168 #, c-format msgid "" "Selected RAM stick (%u) is not a valid number (%u is the maximum for this " "system)" msgstr "" "Ausgewählter RAM-Stick (%u) ist keine gültige Zahl (%u ist der Höchstwert " "für dieses System)" #: options.cpp:188 #, c-format msgid "" "Selected graphic card (%u) is not a valid number (%u is the maximum for this " "system)" msgstr "" "Ausgewählte Grafikkarte (%u) ist keine gültige Zahl (%u ist der Höchstwert " "für dieses System)" #: options.cpp:204 #, c-format msgid "failed to change CPU affinitiy to core %u" msgstr "Fehler beim Ändern der CPU-Zugehörigkeit zum Kern %u" #: options.cpp:210 #, c-format msgid "" "Selected CPU core (%u) is not a valid number (%u is the maximum for this " "type of core)" msgstr "" "Ausgewählter CPU-Kern (%u) ist keine gültige Zahl (%u ist das Maximum für " "diesen Kerntyp)" #: options.cpp:284 #, c-format msgid "Selected tab (%u) is not a valid number (%u is the maximum)" msgstr "Ausgewählter Tab (%u) ist keine gültige Zahl (%u ist der Höchstwert)" #: tui_ncurses.cpp:111 msgid "Window is too small!" msgstr "Fenster ist zu klein!" #: tui_ncurses.cpp:119 msgid "Press 'h' to see help." msgstr "Taste »H« drücken, um die Hilfe anzuzeigen." #: tui_ncurses.cpp:232 #, c-format msgid "Welcome in %s NCurses help!\n" msgstr "Willkommen in der %s NCurses-Hilfe!\n" #: tui_ncurses.cpp:233 msgid "This help describes how to use this Text-based User Interface." msgstr "" "Diese Hilfe beschreibt die Verwendung dieser textbasierten " "Benutzeroberfläche." #: tui_ncurses.cpp:235 msgid "Global keys:" msgstr "Globale Tasten:" #: tui_ncurses.cpp:236 msgid "Press 'left' key or 'tab' key to switch in left tab." msgstr "" "Pfeiltaste »Links« oder »Tab-Taste« drücken, um zum linken Tab zu wechseln." #: tui_ncurses.cpp:237 msgid "Press 'right' key or 'shift + tab' keys to switch in right tab." msgstr "" "Pfeiltaste »Rechts« oder »Umschalt + Tab-Taste« drücken, um zum rechten Tab " "zu wechseln." #: tui_ncurses.cpp:238 msgid "Press 'h' key to see this help." msgstr "Taste »H« drücken, um diese Hilfe anzuzeigen." #: tui_ncurses.cpp:239 msgid "Press 'q' key to exit." msgstr "Taste »Q« drücken, um zu beenden." #: tui_ncurses.cpp:241 msgid "CPU tab:" msgstr "CPU-Tab:" #: tui_ncurses.cpp:242 msgid "Press 'next page' key to decrease core type number to monitor." msgstr "" "Taste »Nächste Seite« drücken, um die zu überwachende Kerntypnummer zu " "verringern." #: tui_ncurses.cpp:243 msgid "Press 'previous page' key to increase core type number to monitor." msgstr "" "Taste »Vorherige Seite« drücken, um die zu überwachende Kerntypnummer zu " "erhöhen." #: tui_ncurses.cpp:244 msgid "Press 'down' key to decrease CPU core number to monitor." msgstr "" "Pfeiltaste »Abwärts« drücken, um die zu überwachende CPU-Kernanzahl zu " "verringern." #: tui_ncurses.cpp:245 msgid "Press 'up' key to increase CPU core number to monitor." msgstr "" "Pfeiltaste »Aufwärts« drücken, um die zu überwachende CPU-Kernanzahl zu " "erhöhen." #: tui_ncurses.cpp:247 msgid "Caches tab:" msgstr "Caches-Tab:" #: tui_ncurses.cpp:248 msgid "Press 'down' key to switch to previous test." msgstr "Pfeiltaste »Abwärts« drücken, um zum vorigen Test zu wechseln." #: tui_ncurses.cpp:249 msgid "Press 'up' key to switch to next test." msgstr "Pfeiltaste »Aufwärts« drücken, um zum nächsten Test zu wechseln." #: tui_ncurses.cpp:251 msgid "Bench tab:" msgstr "Bench-Tab:" #: tui_ncurses.cpp:252 msgid "Press 'down' key to decrement benchmark duration." msgstr "" "Pfeiltaste »Abwärts« drücken, um die Dauer des Benchmarks zu verringern." #: tui_ncurses.cpp:253 msgid "Press 'up' key to increment benchmark duration." msgstr "Pfeiltaste »Aufwärts« drücken, um die Dauer des Benchmarks zu erhöhen." #: tui_ncurses.cpp:254 msgid "Press 'next page' key to decrement number of threads to use." msgstr "" "Taste »Bild abwärts« drücken, um die Anzahl der zu verwendeten Threads zu " "verringern." #: tui_ncurses.cpp:255 msgid "Press 'previous page' key to increment number of threads to use." msgstr "" "Taste »Bild aufwärts« drücken, um die Anzahl der zu verwendeten Threads zu " "erhöhen." #: tui_ncurses.cpp:256 msgid "Press 's' key to start/stop prime numbers (slow) benchmark." msgstr "" "Taste »S« drücken, um den »Primzahlen (langsam)«-Benchmark zu starten/" "anzuhalten." #: tui_ncurses.cpp:257 msgid "Press 'f' key to start/stop prime numbers (fast) benchmark." msgstr "" "Taste »F« drücken, um den »Primzahlen (schnell)«-Benchmark zu starten/" "anzuhalten." #: tui_ncurses.cpp:259 msgid "Graphics tab:" msgstr "Grafik-Tab:" #: tui_ncurses.cpp:260 msgid "Press 'down' key to switch to previous graphic card." msgstr "" "Pfeiltaste »Abwärts« drücken, um zur vorherigen Grafikkarte zu wechseln." #: tui_ncurses.cpp:261 msgid "Press 'up' key to switch to next graphic card." msgstr "" "Pfeiltaste »Aufwärts« drücken, um zur nächsten Grafikkarte zu wechseln." #: tui_ncurses.cpp:263 msgid "Press any key to exit this help." msgstr "Eine beliebige Taste drücken, um diese Hilfe zu beenden." #: tui_ncurses.cpp:640 msgid "Starting NCurses TUI…" msgstr "NCurses-TUI wird gestartet…" #: tui_ncurses.cpp:649 msgid "" "FATAL ERROR: terminfo database could not be found (try to set TERMINFO " "environment variable)" msgstr "" "SCHWERWIEGENDER FEHLER: terminfo-Datenbank wurde nicht gefunden (bitte " "TERMINFO-Umgebungsvariable setzen)" #: tui_ncurses.cpp:654 #, c-format msgid "Failed to set up %s terminal (err=%i); falling back to %s" msgstr "Konnte %s Terminal nicht erstellen (Fehler=%i); Falle zurück auf %s" #: util.cpp:189 #, c-format msgid "cannot find unit in '%s' string at position %i" msgstr "Konnte keine Einheit in String '%s' an Position %i finden" #: util.cpp:252 #, c-format msgid "an error occurred while opening file '%s'" msgstr "beim Öffnen der Datei ‚%s‘ ist ein Fehler aufgetreten" #: util.cpp:297 #, c-format msgid "an error occurred while running command '%s'" msgstr "bei der Ausführung des Befehls ‚%s‘ ist ein Fehler aufgetreten" #: util.cpp:437 msgid "set_cpu_affinity() not supported on this operating system" msgstr "set_cpu_affinity() wird auf diesem Betriebssystem nicht unterstützt" #: data.hpp:103 data.hpp:244 data.hpp:332 msgid "Vendor" msgstr "Hersteller" #: data.hpp:104 msgid "Code Name" msgstr "Codename" #: data.hpp:105 msgid "Package" msgstr "Paket" #: data.hpp:106 msgid "Technology" msgstr "Technologie" #: data.hpp:107 data.hpp:268 msgid "Voltage" msgstr "Spannung" #: data.hpp:108 msgid "Specification" msgstr "Spezifikation" #: data.hpp:109 msgid "Family" msgstr "Familie" #: data.hpp:110 msgid "Disp. Family" msgstr "Angez. Familie" #: data.hpp:111 data.hpp:224 data.hpp:245 data.hpp:335 msgid "Model" msgstr "Modell" #: data.hpp:112 msgid "Disp. Model" msgstr "Angez. Modell" #: data.hpp:113 msgid "Temp." msgstr "Temp." #: data.hpp:114 msgid "Stepping" msgstr "Stepping" #: data.hpp:115 msgid "Instructions" msgstr "Instruktionen" #: data.hpp:125 msgid "L1 Data" msgstr "L1 Daten" #: data.hpp:126 msgid "L1 Inst." msgstr "L1 Inst." #: data.hpp:127 msgid "Level 2" msgstr "Level 2" #: data.hpp:128 msgid "Level 3" msgstr "Level 3" #: data.hpp:137 cpu-x-gtk-3.12.ui:1232 msgid "Cores" msgstr "Kerne" #: data.hpp:138 data.hpp:408 cpu-x-gtk-3.12.ui:1252 msgid "Threads" msgstr "Threads" #: data.hpp:155 msgid "Core Speed" msgstr "Kerngeschwindigkeit" #: data.hpp:156 msgid "Multiplier" msgstr "Multiplikator" #: data.hpp:157 msgid "Bus Speed" msgstr "Bustakt" #: data.hpp:158 data.hpp:341 msgid "Usage" msgstr "Auslastung" #: data.hpp:188 data.hpp:265 msgid "Size" msgstr "Größe" #: data.hpp:189 data.hpp:267 msgid "Speed" msgstr "Geschwindigkeit" #: data.hpp:223 data.hpp:259 msgid "Manufacturer" msgstr "Hersteller" #: data.hpp:225 msgid "Revision" msgstr "Revision" #: data.hpp:233 msgid "Brand" msgstr "Marke" #: data.hpp:234 msgid "Version" msgstr "Version" #: data.hpp:235 msgid "Date" msgstr "Datum" #: data.hpp:236 msgid "ROM Size" msgstr "ROM-Größe" #: data.hpp:260 msgid "Part Number" msgstr "Teilenummer" #: data.hpp:261 msgid "Type" msgstr "Typ" #: data.hpp:262 msgid "Type Detail" msgstr "Typdetail" #: data.hpp:263 msgid "Device Locator" msgstr "Gerätepositionsanzeiger" #: data.hpp:264 msgid "Bank Locator" msgstr "Bankpositionsanzeiger" #: data.hpp:266 msgid "Rank" msgstr "Reihe" #: data.hpp:292 msgid "Name" msgstr "Name" #: data.hpp:293 msgid "Kernel" msgstr "Kernel" #: data.hpp:294 msgid "Hostname" msgstr "Hostname" #: data.hpp:295 msgid "Uptime" msgstr "Betriebszeit" #: data.hpp:303 msgid "Used" msgstr "Verwendet" #: data.hpp:304 msgid "Buffers" msgstr "Puffer" #: data.hpp:305 msgid "Cached" msgstr "Zwischengespeichert" #: data.hpp:306 msgid "Free" msgstr "Frei" #: data.hpp:307 msgid "Swap" msgstr "Swap" #: data.hpp:333 msgid "Driver" msgstr "Treiber" #: data.hpp:334 msgid "UMD Version" msgstr "UMD-Version" #: data.hpp:336 msgid "Compute Unit" msgstr "Recheneinheit" #: data.hpp:337 msgid "Device ID" msgstr "Gerätekennung" #: data.hpp:338 msgid "VBIOS Version" msgstr "VBIOS-Version" #. #-#-#-#-# source_ui.pot (cpu-x ) #-#-#-#-# #. Setting: "Interface" tab #: data.hpp:339 cpu-x-gtk-3.12.ui:5807 msgid "Interface" msgstr "Schnittstelle" #: data.hpp:340 msgid "Temperature" msgstr "Temperatur" #: data.hpp:342 msgid "Core Voltage" msgstr "Kernspannung" #: data.hpp:343 msgid "Power Avg" msgstr "Durchschn. Energie" #: data.hpp:344 msgid "Core Clock" msgstr "Kerntakt" #: data.hpp:345 msgid "Memory Clock" msgstr "Speichertakt" #: data.hpp:346 msgid "Memory Used" msgstr "Verwendeter Speicher" #: data.hpp:347 msgid "Resizable BAR" msgstr "Änderbare BAR-Größe" #: data.hpp:348 msgid "Vulkan RT" msgstr "Vulkan RT" #: data.hpp:349 msgid "OpenGL Version" msgstr "OpenGL-Version" #: data.hpp:350 msgid "Vulkan Version" msgstr "Vulkan-Version" #: data.hpp:351 msgid "OpenCL Version" msgstr "OpenCL-Version" #: data.hpp:387 msgid "Score" msgstr "Ergebnis" #: data.hpp:388 msgid "Run" msgstr "Start" #: data.hpp:407 msgid "Duration" msgstr "Dauer" #: util.hpp:77 msgid "bytes" msgstr "Bytes" #. TRANSLATORS: initials for kilobyte (10³): please put initials (keep it short) #: util.hpp:80 msgid "kB" msgstr "kB" #. TRANSLATORS: initials for megabyte (10⁶): please put initials (keep it short) #: util.hpp:82 msgid "MB" msgstr "MB" #. TRANSLATORS: initials for gigabyte (10⁹): please put initials (keep it short) #: util.hpp:84 msgid "GB" msgstr "GB" #. TRANSLATORS: initials for terabyte (10¹²): please put initials (keep it short) #: util.hpp:86 msgid "TB" msgstr "TB" #. TRANSLATORS: initials for kibibyte (2¹⁰): please put initials (keep it short) #: util.hpp:89 msgid "KiB" msgstr "KiB" #. TRANSLATORS: initials for mebibyte (2²⁰): please put initials (keep it short) #: util.hpp:91 msgid "MiB" msgstr "MiB" #. TRANSLATORS: initials for gibibyte (2³⁰): please put initials (keep it short) #: util.hpp:93 msgid "GiB" msgstr "GiB" #. TRANSLATORS: initials for tebibyte (2⁴⁰): please put initials (keep it short) #: util.hpp:95 msgid "TiB" msgstr "TiB" #: cpu-x-gtk-3.12.ui:1184 msgid "Cache" msgstr "Cache" #. Setting: refresh time for UI #: cpu-x-gtk-3.12.ui:5721 msgid "Refresh time" msgstr "Aktualisierungsintervall" #. Setting: GUI theme #: cpu-x-gtk-3.12.ui:5745 msgid "Text theme" msgstr "Textdesign" #. Setting: automatic GUI theme #: cpu-x-gtk-3.12.ui:5760 msgid "Automatic" msgstr "Automatisch" #. Setting: light GUI theme #: cpu-x-gtk-3.12.ui:5761 msgid "Blue for light theme" msgstr "Blau für helles Design" #. Setting: dark GUI theme #: cpu-x-gtk-3.12.ui:5762 msgid "Yellow for dark theme" msgstr "Gelb für dunkles Design" #. Setting: temperature unit #: cpu-x-gtk-3.12.ui:5775 msgid "Temperature unit" msgstr "Temperatureinheit" #. Setting: default tab at startup #: cpu-x-gtk-3.12.ui:5826 msgid "Default tab" msgstr "Standard-Tab" #. Setting: default CPU core at startup #: cpu-x-gtk-3.12.ui:5839 msgid "Default CPU core" msgstr "Standard-Prozessorkern" #. Setting: default cache test at startup #: cpu-x-gtk-3.12.ui:5852 msgid "Default cache test" msgstr "Standard-Cache-Test" #. Setting: print CPUID values in decimal or hexadecimal #: cpu-x-gtk-3.12.ui:5895 msgid "Print CPUID values in decimal" msgstr "CPUID-Werte dezimal ausgeben" #. Setting: default graphic card at startup #: cpu-x-gtk-3.12.ui:5928 msgid "Default graphic card" msgstr "Standard-Grafikkarte" #. Setting: default CPU core at startup #: cpu-x-gtk-3.12.ui:5952 msgid "Default core type" msgstr "Standard-Kerntyp" #. Setting: default graphic card at startup #: cpu-x-gtk-3.12.ui:5976 msgid "Default memory stick" msgstr "Standard-Speicherstick" #. Setting: "Startup" tab #: cpu-x-gtk-3.12.ui:6004 msgid "Startup" msgstr "Startup" #~ msgid "Light" #~ msgstr "Hell" #~ msgid "Dark" #~ msgstr "Dunkel" #~ msgid "Calculating CPU multipliers" #~ msgstr "CPU-Multiplikatoren berechnen" #, c-format #~ msgid "Current: PCIe Gen%1dx%d / Max: Gen%1dx%d" #~ msgstr "Aktuell: PCIe Gen%1dx%d / Max: Gen%1dx%d" #~ msgid "failed to retrieve GPU clocks" #~ msgstr "Fehler beim Abrufen von GPU-Takten" #, c-format #~ msgid "Core #%i" #~ msgstr "Kern %i" #~ msgid "Setting label names" #~ msgstr "Setze Beschriftungsnamen" #, c-format #~ msgid "Bank %i" #~ msgstr "Bank %i" #~ msgid "Reference" #~ msgstr "Referenz" #~ msgid "Distribution" #~ msgstr "Distribution" #~ msgid "Compiler" #~ msgstr "Compiler" #~ msgid "GPU clock" #~ msgstr "GPU-Takt" #~ msgid "Dumping data…" #~ msgstr "Daten werden ausgegeben…" #~ msgid "Freeing memory" #~ msgstr "Speicher wird freigegeben" #~ msgid "Ignore CPU frequency reported by libcpuid" #~ msgstr "Ignorieren der von libcpuid gemeldeten CPU-Frequenz" #, c-format #~ msgid "failed to call wordexp (%i)" #~ msgstr "Aufruf von wordexp fehlgeschlagen (%i)" #~ msgid "Press 'home' key to scroll up in a page." #~ msgstr "»Home-Taste« drücken, um auf einer Seite nach oben zu blättern." #~ msgid "Press 'end' key to scroll down in a page." #~ msgstr "»Ende-Taste« drücken, um auf einer Seite nach unten zu blättern." #, c-format #~ msgid "String '%s' is too long, truncating…" #~ msgstr "String '%s' ist zu lang, schneide ab…" #, c-format #~ msgid "failed to open %s directory" #~ msgstr "Ordner »%s« konnte nicht geöffnet werden" #~ msgid "an error occurred while compiling regex" #~ msgstr "Beim Kompilieren eines Regulären Ausdrucks trat ein Fehler auf" #~ msgid "FATAL ERROR: could not allocate memory" #~ msgstr "SCHWERER FEHLER: konnte keinen Speicher zuweisen" #, fuzzy, c-format #~| msgid "failed to call dmidecode" #~ msgid "failed to call vkEnumerateInstanceExtensionProperties (%s)" #~ msgstr "Fehler beim Aufruf von dmidecode" #, c-format #~ msgid "%s" #~ msgstr "%s" #, c-format #~ msgid "" #~ "CPU hybrid architecture is not supported. For more details, please refer " #~ "to following issue: %s" #~ msgstr "" #~ "Hybride Prozessorarchitektur wird nicht unterstützt. Mehr Details findest " #~ "du im folgenden Issue: %s" #~ msgid "NOT SUPPORTED" #~ msgstr "NICHT UNTERSTÜTZT" #, fuzzy #~| msgid "There is no platform with OpenCL support (%s)" #~ msgid "There is no device with Vulkan support" #~ msgstr "Es gibt keine Plattform mit OpenCL Unterstützung (%s)" #~ msgid "Socket(s)" #~ msgstr "Sockel" #~ msgid "Thread(s)" #~ msgstr "Thread(s)" #~ msgid "You can paste this backtrace by opening a new issue here:" #~ msgstr "" #~ "Sie können diese Backtrace einfügen, indem Sie hier einen neuen " #~ "Problembericht öffnen:" #, fuzzy #~| msgid "failed to call dmidecode" #~ msgid "faild to call clGetDeviceIDs" #~ msgstr "Fehler beim Aufruf von dmidecode" #~ msgid "Exiting %s" #~ msgstr "%s beenden" #~ msgid "Skip CPU MSR opening (need to be root)" #~ msgstr "Öffnen eines CPU-MSRs überspringen (Benötigt root-Rechte)" #~ msgid "failed to open CPU MSR (%s)" #~ msgstr "CPU-MSR konnte nicht geöffnet werden (%s)" #~ msgid "Skip call to dmidecode (need to be root)" #~ msgstr "Aufruf von dmidecode überspringen (Benötigt root-Rechte)" #~ msgid "failed to allocate memory for dmidecode" #~ msgstr "Fehler beim Anfordern von Speicher für dmidecode" #~ msgid "Finding graphic card driver" #~ msgstr "Grafikkartentreiber wird ermittelt" #~ msgid "(%s driver)" #~ msgstr "(%s Treiber)" #~ msgid "Retrieving GPU temperature" #~ msgstr "GPU-Temperatur wird abgerufen" #~ msgid "Off" #~ msgstr "Aus" #~ msgid "failed to retrieve GPU temperature" #~ msgstr "Fehler beim Abrufen der GPU-Temperatur" #~ msgid "Skip some GPU values (need to be root)" #~ msgstr "Einige GPU-Werte überspringen (Benötigt root-Rechte)" #~ msgid "failed to allocate memory for benchmark" #~ msgstr "Speicherzuweisung für Benchmark fehlgeschlagen" #~ msgid "Root privileges are required to work properly" #~ msgstr "Root-Rechte werden benötigt, um richtig zu funktionieren" #~ msgid "Some information will not be retrievable" #~ msgstr "Einige Informationen werden nicht abrufbar sein" #~ msgid "Ignore" #~ msgstr "Ignorieren" #~ msgid "Run as root" #~ msgstr "Als root ausführen" #~ msgid "A new version of %s is available!" #~ msgstr "Eine neue Version von %s ist verfügbar!" #~ msgid "" #~ "Do you want to update %s to version %s after exit?\n" #~ "It will erase this binary file (%s) by the new version." #~ msgstr "" #~ "Möchten Sie %s auf Version %s aktualisieren?\n" #~ "Dies wird die Binärdatei (%s) mit der neuen Version überschreiben." #~ msgid "Not now" #~ msgstr "Nicht jetzt" #~ msgid "Update" #~ msgstr "Aktualisieren" #~ msgid "Checking on Internet for a new version..." #~ msgstr "Im Internet nach einer neuen Version suchen …" #~ msgid "failed to open a Curl session" #~ msgstr "Öffnen einer Curl-Sitzung fehlgeschlagen" #~ msgid "wrong write data" #~ msgstr "Falsche Schreibdaten" #~ msgid "(version %s is available)" #~ msgstr "(Version %s ist verfügbar)" #~ msgid "No new version available" #~ msgstr "Keine neue Version verfügbar" #~ msgid "(up-to-date)" #~ msgstr "(neueste Version)" #~ msgid "an error occurred while extracting %s archive (%s)" #~ msgstr "Beim Entpacken des Archivs %s trat ein Fehler auf (%s)" #~ msgid "" #~ "Network access is disabled by environment variable (set CPUX_NETWORK with " #~ "a positive value to enable it)" #~ msgstr "" #~ "Netzwerkzugriff ist durch eine Umgebungsvariable deaktiviert " #~ "(CPUX_NETWORK auf einen positiven Wert setzen, um den Netzwerkzugriff zu " #~ "aktivieren)" #~ msgid "failed to open %s archive for writing" #~ msgstr "Archiv %s konnte nicht zum Schreiben geöffnet werden" #~ msgid "Downloading new version..." #~ msgstr "Neue Version wird heruntergeladen …" #~ msgid "failed to download %s archive (%s)" #~ msgstr "Fehler beim Herunterladen des Archivs %s (%s)" #~ msgid "Extracting new version..." #~ msgstr "Neue Version wird entpackt …" #~ msgid "Applying new version..." #~ msgstr "Neue Version anwenden …" #~ msgid "an error occurred while removing/renaming files" #~ msgstr "Beim Entfernen/Umbenennen von Dateien trat ein Fehler auf" #~ msgid "Update successful!" #~ msgstr "Erfolgreich aktualisiert!" #~ msgid "Update portable version if a new version is available" #~ msgstr "" #~ "Portable Version aktualisieren, falls eine neue Version verfügbar ist" #~ msgid "Temporarily disable network support" #~ msgstr "Temporär Netzwerkunterstützung deaktivieren" #~ msgid "Built on %s, %s (with %s %s on %s)." #~ msgstr "Kompiliert am %s, %s (mit %s %s auf %s)." #~ msgid "" #~ "Sorry, you cannot update %s: 32-bit portable version is no more supported." #~ msgstr "" #~ "Leider können Sie %s nicht aktualisieren: Die 32-Bit-Portable-Version " #~ "wird nicht mehr unterstützt." #~ msgid "If you want to update, press 'u' key, or anything else to skip.\n" #~ msgstr "" #~ "Taste »U« drücken, um zu aktualisieren, oder eine beliebige andere Taste " #~ "zum Überspringen.\n" #~ msgid "" #~ "\n" #~ "\n" #~ "%s will be updated." #~ msgstr "" #~ "\n" #~ "\n" #~ "%s wird aktualisiert." CPU-X-5.0.3/po/el.po000066400000000000000000000620301454622605200137400ustar00rootroot00000000000000# Copyright © 2014-2024 The Tumultuous Unicorn Of Darkness # This file is distributed under the same license as the CPU-X package. # THANOS SIOURDAKIS , 2019. # Efthymis , 2022. msgid "" msgstr "" "Project-Id-Version: CPU-X\n" "Report-Msgid-Bugs-To: https://github.com/TheTumultuousUnicornOfDarkness/CPU-" "X/issues\n" "POT-Creation-Date: 2023-12-09 13:09+0100\n" "PO-Revision-Date: 2022-08-28 22:21+0000\n" "Last-Translator: Efthymis \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 4.14.1-dev\n" #: core.cpp:135 msgid "Finding CPU technology" msgstr "Εύρεση τεχνολογίας Επεξεργαστή" #: core.cpp:161 #, c-format msgid "" "Your CPU is not present in the database ==> %s, model: %i, ext. model: %i, " "ext. family: %i" msgstr "" "Ο Επεξεργαστής σας δεν βρίσκεται στη βάση δεδομένων ==> 1%s, model: 2%i, " "ext. model: 3%i, ext. family: 4%i" #: core.cpp:189 data.cpp:150 data.cpp:342 msgid "unknown" msgstr "" #: core.cpp:230 msgid "Calling libcpuid for retrieving static data" msgstr "Κλήση libcpuid για ανάκτηση στατιστικών" #: core.cpp:245 #, c-format msgid "failed to call libcpuid (%s)" msgstr "Αποτυχία κλήσης libcpuid (%s)" #: core.cpp:340 msgid "Calling libcpuid for retrieving dynamic data" msgstr "" #: core.cpp:353 msgid "Calling libcpuid for retrieving CPU MSR static values" msgstr "" #: core.cpp:380 msgid "Calling libcpuid for retrieving CPU MSR dynamic values" msgstr "" #: core.cpp:412 msgid "Calling dmidecode" msgstr "" #: core.cpp:454 core.cpp:473 #, c-format msgid "%s (configured)" msgstr "" #: core.cpp:461 core.cpp:480 #, c-format msgid "%s (max)" msgstr "" #: core.cpp:466 #, c-format msgid "%s (min)" msgstr "" #: core.cpp:496 msgid "Calculating CPU usage" msgstr "" #: core.cpp:546 msgid "Calling bandwidth" msgstr "" #: core.cpp:613 #, c-format msgid "" "pci_access is not properly initialized: it is a common issue when %s was " "built with a lower libpci version.\n" "Check that libpci %s library is present on your system. Otherwise, please " "rebuild %s." msgstr "" #: core.cpp:657 #, c-format msgid "No kernel driver in use for graphic card at path %s" msgstr "" #: core.cpp:693 #, c-format msgid "Your GPU kernel driver is unknown: %s" msgstr "" #: core.cpp:777 #, c-format msgid "Your GPU user mode driver is unknown for vendor %s: %s" msgstr "" #: core.cpp:781 #, c-format msgid "failed to call GLFW (%i): %s" msgstr "" #: core.cpp:914 msgid "Finding Vulkan API version" msgstr "" #: core.cpp:926 #, c-format msgid "failed to call vkCreateInstance (%s)" msgstr "" #: core.cpp:929 #, c-format msgid "%s is not supported" msgstr "" #: core.cpp:937 #, c-format msgid "failed to call vkEnumeratePhysicalDevices (%s)" msgstr "" #: core.cpp:944 msgid "No available Vulkan devices" msgstr "" #: core.cpp:952 #, c-format msgid "No available physical devices (%s)" msgstr "" #: core.cpp:1015 #, fuzzy, c-format #| msgid "failed to call libcpuid (%s)" msgid "Failed to create Vulkan for device %u (%s)" msgstr "Αποτυχία κλήσης libcpuid (%s)" #: core.cpp:1019 #, c-format msgid "%s is not supported for device %u, use only deviceID for matching" msgstr "" #: core.cpp:1051 core.cpp:1364 msgid "Enabled" msgstr "" #: core.cpp:1051 core.cpp:1364 msgid "Disabled" msgstr "" #: core.cpp:1088 msgid "Finding OpenCL API version" msgstr "" #: core.cpp:1092 #, c-format msgid "There is no platform with OpenCL support (%s)" msgstr "" #: core.cpp:1102 #, c-format msgid "failed to get all OpenCL platforms (%s)" msgstr "" #: core.cpp:1115 #, c-format msgid "failed to get name for platform %u (%s)" msgstr "" #: core.cpp:1123 #, c-format msgid "failed to get version for platform %u (%s)" msgstr "" #: core.cpp:1131 #, c-format msgid "failed to find number of OpenCL devices for platform '%s %s' (%s)" msgstr "" #: core.cpp:1131 msgid "0 device" msgstr "" #: core.cpp:1140 #, c-format msgid "failed to get all of OpenCL devices for platform '%s %s' (%s)" msgstr "" #: core.cpp:1160 #, c-format msgid "failed to get name for device %u (%s)" msgstr "" #: core.cpp:1168 #, c-format msgid "failed to get version for device %u (%s)" msgstr "" #: core.cpp:1190 #, c-format msgid "OpenCL driver for '%s %s' does not support CL_DEVICE_TOPOLOGY_AMD (%s)" msgstr "" #: core.cpp:1201 #, c-format msgid "" "OpenCL driver for '%s %s' does not support CL_DEVICE_GFXIP_MAJOR_AMD (%s)" msgstr "" #: core.cpp:1209 core.cpp:1229 core.cpp:1262 #, c-format msgid "" "OpenCL driver for '%s %s' does not support CL_DEVICE_MAX_COMPUTE_UNITS (%s)" msgstr "" #: core.cpp:1250 #, c-format msgid "" "OpenCL driver for '%s %s' does not support CL_DEVICE_PCI_DOMAIN_ID_NV (%s), " "CL_DEVICE_PCI_BUS_ID_NV (%s) or CL_DEVICE_PCI_SLOT_ID_NV (%s)" msgstr "" #: core.cpp:1273 #, c-format msgid "OpenCL is not supported with your GPU vendor (0x%X)" msgstr "" #: core.cpp:1295 msgid "Finding devices" msgstr "" #: core.cpp:1307 #, c-format msgid "Skip devices search (wrong permissions on %s device)" msgstr "" #: core.cpp:1350 #, c-format msgid "Your GPU vendor is unknown: %s (0x%X)" msgstr "" #: core.cpp:1370 msgid "failed to find chipset vendor and model" msgstr "" #: core.cpp:1385 msgid "failed to find graphic card vendor and model" msgstr "" #: core.cpp:1487 msgid "Retrieving GPU clocks" msgstr "" #: core.cpp:1500 msgid "None" msgstr "" #: core.cpp:1509 #, c-format msgid "DRM path for %s is unknown" msgstr "" #: core.cpp:1516 #, c-format msgid "Card number for %s is unknown" msgstr "" #: core.cpp:1541 #, c-format msgid "PCIe %s (current) / %s (max)" msgstr "" #: core.cpp:1650 #, c-format msgid "Driver for %s doesn't report frequencies" msgstr "" #: core.cpp:1671 #, c-format msgid "failed to retrieve all monitoring data for %s" msgstr "" #: core.cpp:1694 msgid "Identifying running system" msgstr "" #: core.cpp:1697 msgid "failed to identify running system" msgstr "" #: core.cpp:1749 core.cpp:1778 msgid "Calling libprocps" msgstr "" #: core.cpp:1752 msgid "unable to get system uptime" msgstr "" #: core.cpp:1758 msgid "unable to create meminfo structure" msgstr "" #: core.cpp:1804 msgid "Calling libstatgrab" msgstr "" #: core.cpp:1852 #, c-format msgid "%i days, %i hours, %i minutes, %i seconds" msgstr "" #: core.cpp:1915 msgid "Updating benchmark status" msgstr "" #: core.cpp:1918 msgid "Active" msgstr "" #: core.cpp:1921 #, c-format msgid "(%u hours left)" msgstr "" #: core.cpp:1923 #, c-format msgid "(%u minutes left)" msgstr "" #: core.cpp:1925 #, c-format msgid "(%u seconds left)" msgstr "" #: core.cpp:1929 core.cpp:1984 core.cpp:1985 msgid "Inactive" msgstr "" #: core.cpp:1932 #, c-format msgid "in %u hours" msgstr "" #: core.cpp:1934 #, c-format msgid "in %u minutes" msgstr "" #: core.cpp:1936 #, c-format msgid "in %u seconds" msgstr "" #: core.cpp:1953 #, c-format msgid "Starting benchmark with %u threads" msgstr "" #: core.cpp:1976 msgid "an error occurred while starting benchmark" msgstr "" #: core.cpp:2002 msgid "Finding CPU package in fallback mode" msgstr "" #: core.cpp:2032 #, c-format msgid "Your CPU socket is not present in the database ==> %s, codename: %s" msgstr "" #: core.cpp:2052 msgid "Calculating CPU multipliers in fallback mode" msgstr "" #: core.cpp:2072 msgid "Retrieving motherboard information in fallback mode" msgstr "" #: core.cpp:2085 msgid "failed to retrieve motherboard information (fallback mode)" msgstr "" #: core.cpp:2127 msgid "Retrieving CPU temperature in fallback mode" msgstr "" #: core.cpp:2173 msgid "failed to retrieve CPU temperature (fallback mode)" msgstr "" #: core.cpp:2188 msgid "Retrieving CPU voltage in fallback mode" msgstr "" #: core.cpp:2200 msgid "failed to retrieve CPU voltage (fallback mode)" msgstr "" #: core.cpp:2214 msgid "Retrieving CPU frequency in fallback mode" msgstr "" #: core.cpp:2220 msgid "failed to retrieve CPU frequency (fallback mode)" msgstr "" #: daemon_client.cpp:65 msgid "Starting daemon in background…" msgstr "" #: daemon_client.cpp:172 msgid "pkexec: authorization could not be obtained (dialog dismissed)" msgstr "" #: daemon_client.cpp:175 msgid "pkexec: authorization could not be obtained (not authorized)" msgstr "" #: daemon_client.cpp:178 msgid "pkexec: command not found" msgstr "" #: daemon_client.cpp:181 msgid "pkexec: unexpected error code" msgstr "" #: daemon_client.cpp:211 msgid "Connecting to daemon…" msgstr "" #: daemon_server.cpp:261 #, c-format msgid "request_handler: case %i not handled" msgstr "" #: data.cpp:124 cpu-x-gtk-3.12.ui:1370 msgid "CPU" msgstr "" #: data.cpp:187 msgid "P-core" msgstr "" #: data.cpp:188 msgid "E-core" msgstr "" #: data.cpp:189 data.cpp:192 msgid "Core" msgstr "" #: data.cpp:208 cpu-x-gtk-3.12.ui:746 msgid "Processor" msgstr "" #: data.cpp:240 data.cpp:329 cpu-x-gtk-3.12.ui:1968 msgid "Caches" msgstr "" #: data.cpp:247 #, fuzzy, c-format #| msgid "%d x %d %s, %d-way" msgid "%2d x %4d %s, %2d-way" msgstr "%d x 2%d 3%s, 4%d-way" #: data.cpp:249 #, c-format msgid "%d %s, %d-way" msgstr "%d 2%s, 3%d-way" #: data.cpp:263 msgid "Count" msgstr "" #: data.cpp:276 cpu-x-gtk-3.12.ui:968 msgid "Clocks" msgstr "" #: data.cpp:379 data.cpp:383 #, c-format msgid "L%u Cache" msgstr "" #: data.cpp:385 #, c-format msgid "%s associative, %d-%s line size" msgstr "" #: data.cpp:398 msgid "Test" msgstr "" #: data.cpp:409 data.cpp:423 cpu-x-gtk-3.12.ui:2146 cpu-x-gtk-3.12.ui:2517 msgid "Motherboard" msgstr "" #: data.cpp:437 cpu-x-gtk-3.12.ui:2367 msgid "BIOS" msgstr "" #: data.cpp:452 cpu-x-gtk-3.12.ui:2498 msgid "Chipset" msgstr "" #: data.cpp:467 data.cpp:569 cpu-x-gtk-3.12.ui:3156 cpu-x-gtk-3.12.ui:3761 msgid "Memory" msgstr "" #: data.cpp:483 #, c-format msgid "Stick %u" msgstr "" #: data.cpp:487 cpu-x-gtk-3.12.ui:3134 msgid "Sticks" msgstr "" #: data.cpp:541 cpu-x-gtk-3.12.ui:3780 msgid "System" msgstr "" #: data.cpp:554 cpu-x-gtk-3.12.ui:3380 msgid "Operating System" msgstr "" #: data.cpp:587 cpu-x-gtk-3.12.ui:4960 msgid "Graphics" msgstr "" #: data.cpp:621 #, c-format msgid "Card %u" msgstr "" #: data.cpp:625 cpu-x-gtk-3.12.ui:4938 msgid "Cards" msgstr "" #: data.cpp:672 cpu-x-gtk-3.12.ui:5300 msgid "Bench" msgstr "" #: data.cpp:685 msgid "Not started" msgstr "" #: data.cpp:688 cpu-x-gtk-3.12.ui:5070 msgid "Prime numbers (slow)" msgstr "" #: data.cpp:692 cpu-x-gtk-3.12.ui:5178 msgid "Prime numbers (fast)" msgstr "" #: data.cpp:696 cpu-x-gtk-3.12.ui:5281 msgid "Parameters" msgstr "" #: data.cpp:721 data.cpp:727 #, c-format msgid "%u mins" msgstr "" #: data.cpp:734 cpu-x-gtk-3.12.ui:5444 cpu-x-gtk-3.12.ui:5552 msgid "About" msgstr "" #: data.cpp:739 #, c-format msgid "" "%s is a Free software that gathers information\n" "on CPU, motherboard and more." msgstr "" #: data.cpp:744 msgid "About CPU-X" msgstr "" #: data.cpp:745 #, c-format msgid "Version %s" msgstr "" #: data.cpp:746 #, c-format msgid "Author: %s" msgstr "" #: data.cpp:747 #, c-format msgid "Site: %s" msgstr "" #: data.cpp:751 cpu-x-gtk-3.12.ui:5533 msgid "License" msgstr "" #: data.cpp:753 #, c-format msgid "This software is distributed under the terms of %s" msgstr "" #: data.cpp:754 main.cpp:176 msgid "This program comes with ABSOLUTELY NO WARRANTY" msgstr "" #: gui_gtk.cpp:61 #, c-format msgid "Cannot find path for '%s' file" msgstr "" #: gui_gtk.cpp:400 msgid "Start daemon" msgstr "" #: gui_gtk.cpp:403 msgid "Connected to daemon" msgstr "" #: gui_gtk.cpp:406 msgid "No polkit authentication agent found" msgstr "" #: gui_gtk.cpp:411 msgid "Ask password to start daemon in background" msgstr "" #: gui_gtk.cpp:415 msgid "Settings" msgstr "" #: gui_gtk.cpp:634 msgid "BaseFamily" msgstr "" #: gui_gtk.cpp:635 msgid "CPU display (\"true\") family (computed as BaseFamily+ExtendedFamily)" msgstr "" #: gui_gtk.cpp:636 msgid "BaseModel" msgstr "" #: gui_gtk.cpp:637 msgid "CPU display (\"true\") model (computed as (ExtendedModel<<4)+BaseModel)" msgstr "" #: gui_gtk.cpp:847 msgid "" "Identify the physically-labeled socket or board position where the memory " "device is located" msgstr "" #: gui_gtk.cpp:848 msgid "Identify the physically labeled bank where the memory device is located" msgstr "" #: gui_gtk.cpp:1052 msgid "User Mode Driver Version" msgstr "" #: gui_gtk.cpp:1066 msgid "Vulkan Ray Tracing" msgstr "" #: gui_gtk.cpp:1260 msgid "Starting GTK GUI…" msgstr "" #: gui_gtk.cpp:1272 msgid "failed to import UI in GtkBuilder" msgstr "" #: main.cpp:63 msgid "Start graphical user interface (GUI) (default)" msgstr "" #: main.cpp:64 msgid "Start text-based user interface (TUI)" msgstr "" #: main.cpp:65 msgid "Dump all data on standard output and exit" msgstr "" #: main.cpp:66 msgid "Run embedded command dmidecode and exit" msgstr "" #: main.cpp:67 msgid "Run embedded command bandwidth and exit" msgstr "" #: main.cpp:68 msgid "Set temperature unit (c[elsius]|f[ahrenheit]|k[elvin]|r[ankine])" msgstr "" #: main.cpp:69 msgid "Set custom time between two refreshes (in seconds)" msgstr "" #: main.cpp:70 msgid "Set default tab (integer)" msgstr "" #: main.cpp:71 msgid "Select core type to monitor (integer)" msgstr "" #: main.cpp:72 msgid "Select CPU core to monitor (integer)" msgstr "" #: main.cpp:73 msgid "Set custom bandwidth test for CPU caches speed (integer)" msgstr "" #: main.cpp:74 msgid "Select default memory stick (integer)" msgstr "" #: main.cpp:75 msgid "Select default graphic card (integer)" msgstr "" #: main.cpp:76 cpu-x-gtk-3.12.ui:5910 msgid "Start and connect to daemon" msgstr "" #: main.cpp:77 msgid "Verbose output" msgstr "" #: main.cpp:78 msgid "Print help and exit" msgstr "" #: main.cpp:79 msgid "Print version and exit" msgstr "" #: main.cpp:80 msgid "Print CPUID values in decimal (default is hexadeximal)" msgstr "" #: main.cpp:81 msgid "Disable colored output" msgstr "" #: main.cpp:82 msgid "Print information for debugging" msgstr "" #: main.cpp:83 msgid "Print required information to paste in an issue" msgstr "" #: main.cpp:84 msgid "Set key mapping for NCurses mode (a[rrows]|e[macs]|i[nverted-T]|v[im])" msgstr "" #: main.cpp:95 msgid "Add default command line arguments" msgstr "" #: main.cpp:96 msgid "Enforce the bus clock" msgstr "" #: main.cpp:97 msgid "" "Ignore CPU values reported by libcpuid (comma-separated values among 'temp', " "'volt' and 'freq')" msgstr "" #: main.cpp:98 msgid "Read CPUID raw data from a given file" msgstr "" #: main.cpp:99 msgid "Only print a message if CPU is not present in the database" msgstr "" #: main.cpp:126 #, c-format msgid "Usage: %s DISPLAY [OPTIONS]\n" msgstr "" #: main.cpp:127 msgid "Available DISPLAY:" msgstr "" #: main.cpp:135 msgid "Available OPTIONS:" msgstr "" #: main.cpp:144 msgid "Influenceable environment variables:" msgstr "" #: main.cpp:175 msgid "This is free software: you are free to change and redistribute it." msgstr "" #: main.cpp:177 #, c-format msgid "See the %s license: <%s>\n" msgstr "" #: main.cpp:184 #, c-format msgid "-- %-9s version: %s" msgstr "" #: main.cpp:381 #, c-format msgid "" "\n" "Oops, something was wrong! %s has received signal %d (%s) and has crashed." msgstr "" #: main.cpp:383 #, c-format msgid "" "\n" "Oops, something was wrong! %s has received signal %d (%s) and is trying to " "recover." msgstr "" #: main.cpp:407 msgid "You can open a new issue here, by filling the template as requested:" msgstr "" #: main.cpp:449 msgid "an error occurred while setting locale" msgstr "" #: options.cpp:124 #, c-format msgid "" "Selected CPU type (%u) is not a valid number (%u is the maximum for this CPU)" msgstr "" #: options.cpp:145 #, c-format msgid "" "Selected bandwidth test (%u) is not a valid number (%u is the maximum for " "this system)" msgstr "" #: options.cpp:168 #, c-format msgid "" "Selected RAM stick (%u) is not a valid number (%u is the maximum for this " "system)" msgstr "" #: options.cpp:188 #, c-format msgid "" "Selected graphic card (%u) is not a valid number (%u is the maximum for this " "system)" msgstr "" #: options.cpp:204 #, c-format msgid "failed to change CPU affinitiy to core %u" msgstr "" #: options.cpp:210 #, c-format msgid "" "Selected CPU core (%u) is not a valid number (%u is the maximum for this " "type of core)" msgstr "" #: options.cpp:284 #, c-format msgid "Selected tab (%u) is not a valid number (%u is the maximum)" msgstr "" #: tui_ncurses.cpp:111 msgid "Window is too small!" msgstr "" #: tui_ncurses.cpp:119 msgid "Press 'h' to see help." msgstr "" #: tui_ncurses.cpp:232 #, c-format msgid "Welcome in %s NCurses help!\n" msgstr "" #: tui_ncurses.cpp:233 msgid "This help describes how to use this Text-based User Interface." msgstr "" #: tui_ncurses.cpp:235 msgid "Global keys:" msgstr "" #: tui_ncurses.cpp:236 msgid "Press 'left' key or 'tab' key to switch in left tab." msgstr "" #: tui_ncurses.cpp:237 msgid "Press 'right' key or 'shift + tab' keys to switch in right tab." msgstr "" #: tui_ncurses.cpp:238 msgid "Press 'h' key to see this help." msgstr "" #: tui_ncurses.cpp:239 msgid "Press 'q' key to exit." msgstr "" #: tui_ncurses.cpp:241 msgid "CPU tab:" msgstr "" #: tui_ncurses.cpp:242 msgid "Press 'next page' key to decrease core type number to monitor." msgstr "" #: tui_ncurses.cpp:243 msgid "Press 'previous page' key to increase core type number to monitor." msgstr "" #: tui_ncurses.cpp:244 msgid "Press 'down' key to decrease CPU core number to monitor." msgstr "" #: tui_ncurses.cpp:245 msgid "Press 'up' key to increase CPU core number to monitor." msgstr "" #: tui_ncurses.cpp:247 msgid "Caches tab:" msgstr "" #: tui_ncurses.cpp:248 msgid "Press 'down' key to switch to previous test." msgstr "" #: tui_ncurses.cpp:249 msgid "Press 'up' key to switch to next test." msgstr "" #: tui_ncurses.cpp:251 msgid "Bench tab:" msgstr "" #: tui_ncurses.cpp:252 msgid "Press 'down' key to decrement benchmark duration." msgstr "" #: tui_ncurses.cpp:253 msgid "Press 'up' key to increment benchmark duration." msgstr "" #: tui_ncurses.cpp:254 msgid "Press 'next page' key to decrement number of threads to use." msgstr "" #: tui_ncurses.cpp:255 msgid "Press 'previous page' key to increment number of threads to use." msgstr "" #: tui_ncurses.cpp:256 msgid "Press 's' key to start/stop prime numbers (slow) benchmark." msgstr "" #: tui_ncurses.cpp:257 msgid "Press 'f' key to start/stop prime numbers (fast) benchmark." msgstr "" #: tui_ncurses.cpp:259 msgid "Graphics tab:" msgstr "" #: tui_ncurses.cpp:260 msgid "Press 'down' key to switch to previous graphic card." msgstr "" #: tui_ncurses.cpp:261 msgid "Press 'up' key to switch to next graphic card." msgstr "" #: tui_ncurses.cpp:263 msgid "Press any key to exit this help." msgstr "" #: tui_ncurses.cpp:640 msgid "Starting NCurses TUI…" msgstr "" #: tui_ncurses.cpp:649 msgid "" "FATAL ERROR: terminfo database could not be found (try to set TERMINFO " "environment variable)" msgstr "" #: tui_ncurses.cpp:654 #, c-format msgid "Failed to set up %s terminal (err=%i); falling back to %s" msgstr "" #: util.cpp:189 #, c-format msgid "cannot find unit in '%s' string at position %i" msgstr "" #: util.cpp:252 #, c-format msgid "an error occurred while opening file '%s'" msgstr "" #: util.cpp:297 #, c-format msgid "an error occurred while running command '%s'" msgstr "" #: util.cpp:437 msgid "set_cpu_affinity() not supported on this operating system" msgstr "" #: data.hpp:103 data.hpp:244 data.hpp:332 msgid "Vendor" msgstr "" #: data.hpp:104 msgid "Code Name" msgstr "" #: data.hpp:105 msgid "Package" msgstr "" #: data.hpp:106 msgid "Technology" msgstr "" #: data.hpp:107 data.hpp:268 msgid "Voltage" msgstr "" #: data.hpp:108 msgid "Specification" msgstr "" #: data.hpp:109 msgid "Family" msgstr "" #: data.hpp:110 msgid "Disp. Family" msgstr "" #: data.hpp:111 data.hpp:224 data.hpp:245 data.hpp:335 msgid "Model" msgstr "" #: data.hpp:112 msgid "Disp. Model" msgstr "" #: data.hpp:113 msgid "Temp." msgstr "" #: data.hpp:114 msgid "Stepping" msgstr "" #: data.hpp:115 msgid "Instructions" msgstr "" #: data.hpp:125 msgid "L1 Data" msgstr "" #: data.hpp:126 msgid "L1 Inst." msgstr "" #: data.hpp:127 msgid "Level 2" msgstr "" #: data.hpp:128 msgid "Level 3" msgstr "" #: data.hpp:137 cpu-x-gtk-3.12.ui:1232 msgid "Cores" msgstr "" #: data.hpp:138 data.hpp:408 cpu-x-gtk-3.12.ui:1252 msgid "Threads" msgstr "" #: data.hpp:155 msgid "Core Speed" msgstr "" #: data.hpp:156 msgid "Multiplier" msgstr "" #: data.hpp:157 msgid "Bus Speed" msgstr "" #: data.hpp:158 data.hpp:341 msgid "Usage" msgstr "" #: data.hpp:188 data.hpp:265 msgid "Size" msgstr "" #: data.hpp:189 data.hpp:267 msgid "Speed" msgstr "" #: data.hpp:223 data.hpp:259 msgid "Manufacturer" msgstr "" #: data.hpp:225 msgid "Revision" msgstr "" #: data.hpp:233 msgid "Brand" msgstr "" #: data.hpp:234 msgid "Version" msgstr "" #: data.hpp:235 msgid "Date" msgstr "" #: data.hpp:236 msgid "ROM Size" msgstr "" #: data.hpp:260 msgid "Part Number" msgstr "" #: data.hpp:261 msgid "Type" msgstr "" #: data.hpp:262 msgid "Type Detail" msgstr "" #: data.hpp:263 msgid "Device Locator" msgstr "" #: data.hpp:264 msgid "Bank Locator" msgstr "" #: data.hpp:266 msgid "Rank" msgstr "" #: data.hpp:292 msgid "Name" msgstr "" #: data.hpp:293 msgid "Kernel" msgstr "" #: data.hpp:294 msgid "Hostname" msgstr "" #: data.hpp:295 msgid "Uptime" msgstr "" #: data.hpp:303 msgid "Used" msgstr "" #: data.hpp:304 msgid "Buffers" msgstr "" #: data.hpp:305 msgid "Cached" msgstr "" #: data.hpp:306 msgid "Free" msgstr "" #: data.hpp:307 msgid "Swap" msgstr "" #: data.hpp:333 msgid "Driver" msgstr "" #: data.hpp:334 msgid "UMD Version" msgstr "" #: data.hpp:336 msgid "Compute Unit" msgstr "" #: data.hpp:337 msgid "Device ID" msgstr "" #: data.hpp:338 msgid "VBIOS Version" msgstr "" #. #-#-#-#-# source_ui.pot (cpu-x ) #-#-#-#-# #. Setting: "Interface" tab #: data.hpp:339 cpu-x-gtk-3.12.ui:5807 msgid "Interface" msgstr "" #: data.hpp:340 msgid "Temperature" msgstr "" #: data.hpp:342 msgid "Core Voltage" msgstr "" #: data.hpp:343 msgid "Power Avg" msgstr "" #: data.hpp:344 msgid "Core Clock" msgstr "" #: data.hpp:345 msgid "Memory Clock" msgstr "" #: data.hpp:346 msgid "Memory Used" msgstr "" #: data.hpp:347 msgid "Resizable BAR" msgstr "" #: data.hpp:348 msgid "Vulkan RT" msgstr "" #: data.hpp:349 msgid "OpenGL Version" msgstr "" #: data.hpp:350 msgid "Vulkan Version" msgstr "" #: data.hpp:351 msgid "OpenCL Version" msgstr "" #: data.hpp:387 msgid "Score" msgstr "" #: data.hpp:388 msgid "Run" msgstr "" #: data.hpp:407 msgid "Duration" msgstr "" #: util.hpp:77 msgid "bytes" msgstr "" #. TRANSLATORS: initials for kilobyte (10³): please put initials (keep it short) #: util.hpp:80 msgid "kB" msgstr "" #. TRANSLATORS: initials for megabyte (10⁶): please put initials (keep it short) #: util.hpp:82 msgid "MB" msgstr "" #. TRANSLATORS: initials for gigabyte (10⁹): please put initials (keep it short) #: util.hpp:84 msgid "GB" msgstr "" #. TRANSLATORS: initials for terabyte (10¹²): please put initials (keep it short) #: util.hpp:86 msgid "TB" msgstr "" #. TRANSLATORS: initials for kibibyte (2¹⁰): please put initials (keep it short) #: util.hpp:89 msgid "KiB" msgstr "" #. TRANSLATORS: initials for mebibyte (2²⁰): please put initials (keep it short) #: util.hpp:91 msgid "MiB" msgstr "" #. TRANSLATORS: initials for gibibyte (2³⁰): please put initials (keep it short) #: util.hpp:93 msgid "GiB" msgstr "" #. TRANSLATORS: initials for tebibyte (2⁴⁰): please put initials (keep it short) #: util.hpp:95 msgid "TiB" msgstr "" #: cpu-x-gtk-3.12.ui:1184 msgid "Cache" msgstr "" #. Setting: refresh time for UI #: cpu-x-gtk-3.12.ui:5721 msgid "Refresh time" msgstr "" #. Setting: GUI theme #: cpu-x-gtk-3.12.ui:5745 msgid "Text theme" msgstr "" #. Setting: automatic GUI theme #: cpu-x-gtk-3.12.ui:5760 msgid "Automatic" msgstr "" #. Setting: light GUI theme #: cpu-x-gtk-3.12.ui:5761 msgid "Blue for light theme" msgstr "" #. Setting: dark GUI theme #: cpu-x-gtk-3.12.ui:5762 msgid "Yellow for dark theme" msgstr "" #. Setting: temperature unit #: cpu-x-gtk-3.12.ui:5775 msgid "Temperature unit" msgstr "" #. Setting: default tab at startup #: cpu-x-gtk-3.12.ui:5826 msgid "Default tab" msgstr "" #. Setting: default CPU core at startup #: cpu-x-gtk-3.12.ui:5839 msgid "Default CPU core" msgstr "" #. Setting: default cache test at startup #: cpu-x-gtk-3.12.ui:5852 msgid "Default cache test" msgstr "" #. Setting: print CPUID values in decimal or hexadecimal #: cpu-x-gtk-3.12.ui:5895 msgid "Print CPUID values in decimal" msgstr "" #. Setting: default graphic card at startup #: cpu-x-gtk-3.12.ui:5928 msgid "Default graphic card" msgstr "" #. Setting: default CPU core at startup #: cpu-x-gtk-3.12.ui:5952 msgid "Default core type" msgstr "" #. Setting: default graphic card at startup #: cpu-x-gtk-3.12.ui:5976 msgid "Default memory stick" msgstr "" #. Setting: "Startup" tab #: cpu-x-gtk-3.12.ui:6004 msgid "Startup" msgstr "" #, fuzzy #~| msgid "could not reallocate memory" #~ msgid "FATAL ERROR: could not allocate memory" #~ msgstr "Δεν ήταν δυνατή η ανακατανομή μνήμης" #~ msgid "Exiting %s" #~ msgstr "Έξοδος από %s" CPU-X-5.0.3/po/es.po000066400000000000000000001257431454622605200137620ustar00rootroot00000000000000# Copyright © 2014-2024 The Tumultuous Unicorn Of Darkness # This file is distributed under the same license as the CPU-X package. # Adolfo Jayme Barrientos , 2019, 2020. # J , 2019, 2020. # Juan Manuel Cantero Diego , 2020. # LocoUnPocoNadaMas , 2020, 2022. # Allan Nordhøy , 2020. # H , 2020. # Bruno , 2020. # Francisco Serrador , 2022. # Yoandry González Castro , 2022. # Luiz Carlos Lucasv , 2022. # Ciro Haskour , 2022. # GitThisBugOff , 2022. # gallegonovato , 2022, 2023. msgid "" msgstr "" "Project-Id-Version: CPU-X\n" "Report-Msgid-Bugs-To: https://github.com/TheTumultuousUnicornOfDarkness/CPU-" "X/issues\n" "POT-Creation-Date: 2023-12-09 13:09+0100\n" "PO-Revision-Date: 2023-12-10 08:16+0000\n" "Last-Translator: gallegonovato \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.3-dev\n" #: core.cpp:135 msgid "Finding CPU technology" msgstr "Encontrando tecnología de la CPU" #: core.cpp:161 #, c-format msgid "" "Your CPU is not present in the database ==> %s, model: %i, ext. model: %i, " "ext. family: %i" msgstr "" "Su CPU no se encuentra en la base de datos ==> %s, modelo: %i, modelo ext.: " "%i, familia ext.: %i" #: core.cpp:189 data.cpp:150 data.cpp:342 msgid "unknown" msgstr "desconocido" #: core.cpp:230 msgid "Calling libcpuid for retrieving static data" msgstr "Llamado a libcpuid para recuperar datos estáticos" #: core.cpp:245 #, c-format msgid "failed to call libcpuid (%s)" msgstr "No se pudo llamar a libcpuid (%s)" #: core.cpp:340 msgid "Calling libcpuid for retrieving dynamic data" msgstr "Invocando a libcpuid para recuperar datos dinámicos" #: core.cpp:353 msgid "Calling libcpuid for retrieving CPU MSR static values" msgstr "Invocando a libcpuid para recuperar valores estáticos de CPU MSR" #: core.cpp:380 msgid "Calling libcpuid for retrieving CPU MSR dynamic values" msgstr "Invocando a libcpuid para recuperar valores dinámicos de CPU MSR" #: core.cpp:412 msgid "Calling dmidecode" msgstr "Invocando a ‘dmidecode’" #: core.cpp:454 core.cpp:473 #, c-format msgid "%s (configured)" msgstr "%s (configurado)" #: core.cpp:461 core.cpp:480 #, c-format msgid "%s (max)" msgstr "%s (máx)" #: core.cpp:466 #, c-format msgid "%s (min)" msgstr "%s (mín)" #: core.cpp:496 msgid "Calculating CPU usage" msgstr "Calculando el uso de la CPU" #: core.cpp:546 msgid "Calling bandwidth" msgstr "Invocando al ancho de banda" #: core.cpp:613 #, c-format msgid "" "pci_access is not properly initialized: it is a common issue when %s was " "built with a lower libpci version.\n" "Check that libpci %s library is present on your system. Otherwise, please " "rebuild %s." msgstr "" "pci_access no se inicializó correctamente: es un problema común cuando %s se " "creó con una versión inferior de libpci\n" "Verifique que la biblioteca libpci %s esté presente en su sistema. De lo " "contrario, reconstruya %s." #: core.cpp:657 #, c-format msgid "No kernel driver in use for graphic card at path %s" msgstr "" "No hay controlador kernel en uso para la tarjeta gráfica en la ubicación %s" #: core.cpp:693 #, c-format msgid "Your GPU kernel driver is unknown: %s" msgstr "Su controlador de GPU es desconocido: %s" #: core.cpp:777 #, c-format msgid "Your GPU user mode driver is unknown for vendor %s: %s" msgstr "" "El controlador del modo de usuario de su GPU es desconocido para el " "proveedor %s: %s" #: core.cpp:781 #, c-format msgid "failed to call GLFW (%i): %s" msgstr "erróneo al invocar GLFW (%i): %s" #: core.cpp:914 msgid "Finding Vulkan API version" msgstr "Buscando la versión de la API de Vulkan" #: core.cpp:926 #, c-format msgid "failed to call vkCreateInstance (%s)" msgstr "error al llamar a vkCreateInstance (%s)" #: core.cpp:929 #, c-format msgid "%s is not supported" msgstr "%s no está soportado" #: core.cpp:937 #, c-format msgid "failed to call vkEnumeratePhysicalDevices (%s)" msgstr "error al llamar a vkEnumeratePhysicalDevices (%s)" #: core.cpp:944 msgid "No available Vulkan devices" msgstr "No hay dispositivos Vulkan disponibles" #: core.cpp:952 #, c-format msgid "No available physical devices (%s)" msgstr "No hay dispositivos físicos disponibles (%s)" #: core.cpp:1015 #, c-format msgid "Failed to create Vulkan for device %u (%s)" msgstr "Error al crear Vulkan para el dispositivo %u (%s)" #: core.cpp:1019 #, c-format msgid "%s is not supported for device %u, use only deviceID for matching" msgstr "" "%s no está soportado para el dispositivo %u, use solo deviceID para emparejar" #: core.cpp:1051 core.cpp:1364 msgid "Enabled" msgstr "Habilitado" #: core.cpp:1051 core.cpp:1364 msgid "Disabled" msgstr "Deshabilitado" #: core.cpp:1088 msgid "Finding OpenCL API version" msgstr "Encontrar la versión de la API OpenCL" #: core.cpp:1092 #, c-format msgid "There is no platform with OpenCL support (%s)" msgstr "No hay ninguna plataforma con capacidad OpenCL (%s)" #: core.cpp:1102 #, c-format msgid "failed to get all OpenCL platforms (%s)" msgstr "error al obtener todas las plataformas OpenCL (%s)" #: core.cpp:1115 #, c-format msgid "failed to get name for platform %u (%s)" msgstr "No se pudo obtener el nombre de la plataforma%u%s" #: core.cpp:1123 #, c-format msgid "failed to get version for platform %u (%s)" msgstr "error al obtener la versión para la plataforma %u (%s)" #: core.cpp:1131 #, c-format msgid "failed to find number of OpenCL devices for platform '%s %s' (%s)" msgstr "" "error al encontrar el número de dispositivos OpenCL para la plataforma «%s " "%s» (%s)" #: core.cpp:1131 msgid "0 device" msgstr "0 dispositivos" #: core.cpp:1140 #, c-format msgid "failed to get all of OpenCL devices for platform '%s %s' (%s)" msgstr "" "erróneo al obtener todos los dispositivos OpenCL para la plataforma «%s " "%s» (%s)" #: core.cpp:1160 #, c-format msgid "failed to get name for device %u (%s)" msgstr "erróneo al obtener nombre para el dispositivo %u (%s)" #: core.cpp:1168 #, c-format msgid "failed to get version for device %u (%s)" msgstr "erróneo al obtener la versión del dispositivo %u (%s)" #: core.cpp:1190 #, c-format msgid "OpenCL driver for '%s %s' does not support CL_DEVICE_TOPOLOGY_AMD (%s)" msgstr "Controlador OpenCL para «%s %s» no admite CL_DEVICE_TOPOLOGY_AMD (%s)" #: core.cpp:1201 #, c-format msgid "" "OpenCL driver for '%s %s' does not support CL_DEVICE_GFXIP_MAJOR_AMD (%s)" msgstr "" "Controlador OpenCL para «%s %s» no admite CL_DEVICE_GFXIP_MAJOR_AMD (%s)" #: core.cpp:1209 core.cpp:1229 core.cpp:1262 #, c-format msgid "" "OpenCL driver for '%s %s' does not support CL_DEVICE_MAX_COMPUTE_UNITS (%s)" msgstr "" "Controlador OpenCL para «%s %s» no admite CL_DEVICE_MAX_COMPUTE_UNITS (%s)" #: core.cpp:1250 #, c-format msgid "" "OpenCL driver for '%s %s' does not support CL_DEVICE_PCI_DOMAIN_ID_NV (%s), " "CL_DEVICE_PCI_BUS_ID_NV (%s) or CL_DEVICE_PCI_SLOT_ID_NV (%s)" msgstr "" "Controlador OpenCL para «%s %s» no admite CL_DEVICE_PCI_DOMAIN_ID_NV (%s), " "CL_DEVICE_PCI_BUS_ID_NV (%s) o CL_DEVICE_PCI_SLOT_ID_NV (%s)" #: core.cpp:1273 #, c-format msgid "OpenCL is not supported with your GPU vendor (0x%X)" msgstr "Su proveedor de GPU no soporta OpenCL (0x%X)" #: core.cpp:1295 msgid "Finding devices" msgstr "Buscando dispositivos" #: core.cpp:1307 #, c-format msgid "Skip devices search (wrong permissions on %s device)" msgstr "" "Omitir búsqueda de dispositivos (permisos equivocados en dispositivo %s)" #: core.cpp:1350 #, c-format msgid "Your GPU vendor is unknown: %s (0x%X)" msgstr "Su proveedor de GPU es desconocido: %s (0x%X)" #: core.cpp:1370 msgid "failed to find chipset vendor and model" msgstr "No se encontró el proveedor y el modelo del chipset" #: core.cpp:1385 msgid "failed to find graphic card vendor and model" msgstr "no se pudo encontrar el proveedor de la tarjeta gráfica y el modelo" #: core.cpp:1487 msgid "Retrieving GPU clocks" msgstr "Recuperando reloj de GPU" #: core.cpp:1500 msgid "None" msgstr "Ninguno" #: core.cpp:1509 #, c-format msgid "DRM path for %s is unknown" msgstr "La ruta DRM para %s es desconocida" #: core.cpp:1516 #, c-format msgid "Card number for %s is unknown" msgstr "El número de la tarjeta para %s es desconocido" #: core.cpp:1541 #, c-format msgid "PCIe %s (current) / %s (max)" msgstr "PCIe %s (actual) / %s (máx)" #: core.cpp:1650 #, c-format msgid "Driver for %s doesn't report frequencies" msgstr "El controlador para %s no informa de las frecuencias" #: core.cpp:1671 #, c-format msgid "failed to retrieve all monitoring data for %s" msgstr "no se han podido recuperar todos los datos de seguimiento de %s" #: core.cpp:1694 msgid "Identifying running system" msgstr "Identificando el sistema en ejecución" #: core.cpp:1697 msgid "failed to identify running system" msgstr "fallo al identificar el sistema en ejecución" #: core.cpp:1749 core.cpp:1778 msgid "Calling libprocps" msgstr "Llamar libprocps" #: core.cpp:1752 msgid "unable to get system uptime" msgstr "no se pudo obtener el tiempo de actividad del sistema (uptime)" #: core.cpp:1758 msgid "unable to create meminfo structure" msgstr "no se pudo crear la estructúra de meminfo" #: core.cpp:1804 msgid "Calling libstatgrab" msgstr "Llamando a libstatgrab" #: core.cpp:1852 #, c-format msgid "%i days, %i hours, %i minutes, %i seconds" msgstr "%i días, %i horas, %i minutos, %i segundos" #: core.cpp:1915 msgid "Updating benchmark status" msgstr "Actualizar el estado del índice de referencia" #: core.cpp:1918 msgid "Active" msgstr "Activo" #: core.cpp:1921 #, c-format msgid "(%u hours left)" msgstr "(%u horas restantes)" #: core.cpp:1923 #, c-format msgid "(%u minutes left)" msgstr "(%u minutos restantes)" #: core.cpp:1925 #, c-format msgid "(%u seconds left)" msgstr "(%u segundos restantes)" #: core.cpp:1929 core.cpp:1984 core.cpp:1985 msgid "Inactive" msgstr "Inactivo" #: core.cpp:1932 #, c-format msgid "in %u hours" msgstr "en %u horas" #: core.cpp:1934 #, c-format msgid "in %u minutes" msgstr "en %u minutos" #: core.cpp:1936 #, c-format msgid "in %u seconds" msgstr "en %u segundos" #: core.cpp:1953 #, c-format msgid "Starting benchmark with %u threads" msgstr "Iniciando el benchmark con %u hilos" #: core.cpp:1976 msgid "an error occurred while starting benchmark" msgstr "un error ocurrió mientras se iniciaba el benchmark" #: core.cpp:2002 msgid "Finding CPU package in fallback mode" msgstr "Encontrando paquete de CPU en modo de reserva" #: core.cpp:2032 #, c-format msgid "Your CPU socket is not present in the database ==> %s, codename: %s" msgstr "" "Su zócalo de CPU no se encuentra dentro de la base de datos ==> %s, nombre " "clave: %s" #: core.cpp:2052 msgid "Calculating CPU multipliers in fallback mode" msgstr "Calculando multiplicadores de CPU en modo de reserva" #: core.cpp:2072 msgid "Retrieving motherboard information in fallback mode" msgstr "Recuperando información de la placa madre en modo de reserva" #: core.cpp:2085 msgid "failed to retrieve motherboard information (fallback mode)" msgstr "fallo al recuperar la información de la placa madre (modo de reserva)" #: core.cpp:2127 msgid "Retrieving CPU temperature in fallback mode" msgstr "Recuperando la temperatura de la CPU en modo de reserva" #: core.cpp:2173 msgid "failed to retrieve CPU temperature (fallback mode)" msgstr "error al obtener temperatura de CPU (modo alternativo)" #: core.cpp:2188 msgid "Retrieving CPU voltage in fallback mode" msgstr "Obteniendo voltaje de CPU en el modo respaldo" #: core.cpp:2200 msgid "failed to retrieve CPU voltage (fallback mode)" msgstr "fallo al recuperar voltaje de CPU (modo respaldo)" #: core.cpp:2214 msgid "Retrieving CPU frequency in fallback mode" msgstr "Obteniendo frecuencia de CPU en modo reserva" #: core.cpp:2220 msgid "failed to retrieve CPU frequency (fallback mode)" msgstr "fallo al recuperar la frecuencia de la CPU (modo de reserva)" #: daemon_client.cpp:65 msgid "Starting daemon in background…" msgstr "Iniciando el demonio en segundo plano…" #: daemon_client.cpp:172 msgid "pkexec: authorization could not be obtained (dialog dismissed)" msgstr "pkexec: autorización no pudo ser obtenida (diálogo rechazado)" #: daemon_client.cpp:175 msgid "pkexec: authorization could not be obtained (not authorized)" msgstr "pkexec: autorización no pudo ser obtenida (no autorizado)" #: daemon_client.cpp:178 msgid "pkexec: command not found" msgstr "plexec: instrucción no encontrada" #: daemon_client.cpp:181 msgid "pkexec: unexpected error code" msgstr "pkexec: código de error inesperado" #: daemon_client.cpp:211 msgid "Connecting to daemon…" msgstr "Conectando a daemon…" #: daemon_server.cpp:261 #, c-format msgid "request_handler: case %i not handled" msgstr "request_handler: caso %i no gestionado" #: data.cpp:124 cpu-x-gtk-3.12.ui:1370 msgid "CPU" msgstr "CPU" #: data.cpp:187 msgid "P-core" msgstr "P-core" #: data.cpp:188 msgid "E-core" msgstr "E-core" #: data.cpp:189 data.cpp:192 msgid "Core" msgstr "Núcleo" #: data.cpp:208 cpu-x-gtk-3.12.ui:746 msgid "Processor" msgstr "Procesador" #: data.cpp:240 data.cpp:329 cpu-x-gtk-3.12.ui:1968 msgid "Caches" msgstr "Cachés" #: data.cpp:247 #, c-format msgid "%2d x %4d %s, %2d-way" msgstr "%2d x %4d %s, %2d-forma" #: data.cpp:249 #, c-format msgid "%d %s, %d-way" msgstr "%d %s, %d-vias" #: data.cpp:263 msgid "Count" msgstr "Contar" #: data.cpp:276 cpu-x-gtk-3.12.ui:968 msgid "Clocks" msgstr "Relojes" #: data.cpp:379 data.cpp:383 #, c-format msgid "L%u Cache" msgstr "Memoria Caché L%u" #: data.cpp:385 #, c-format msgid "%s associative, %d-%s line size" msgstr "%s asociativo, %d-%s tamaño de línea" #: data.cpp:398 msgid "Test" msgstr "Prueba" #: data.cpp:409 data.cpp:423 cpu-x-gtk-3.12.ui:2146 cpu-x-gtk-3.12.ui:2517 msgid "Motherboard" msgstr "Placa madre" #: data.cpp:437 cpu-x-gtk-3.12.ui:2367 msgid "BIOS" msgstr "BIOS" #: data.cpp:452 cpu-x-gtk-3.12.ui:2498 msgid "Chipset" msgstr "Chipset" #: data.cpp:467 data.cpp:569 cpu-x-gtk-3.12.ui:3156 cpu-x-gtk-3.12.ui:3761 msgid "Memory" msgstr "Memoria" #: data.cpp:483 #, c-format msgid "Stick %u" msgstr "Stick %u" #: data.cpp:487 cpu-x-gtk-3.12.ui:3134 msgid "Sticks" msgstr "Sticks" #: data.cpp:541 cpu-x-gtk-3.12.ui:3780 msgid "System" msgstr "Sistema" #: data.cpp:554 cpu-x-gtk-3.12.ui:3380 msgid "Operating System" msgstr "Sistema Operativo" #: data.cpp:587 cpu-x-gtk-3.12.ui:4960 msgid "Graphics" msgstr "Gráfica" #: data.cpp:621 #, c-format msgid "Card %u" msgstr "Tarjeta %u" #: data.cpp:625 cpu-x-gtk-3.12.ui:4938 msgid "Cards" msgstr "Tarjetas" #: data.cpp:672 cpu-x-gtk-3.12.ui:5300 msgid "Bench" msgstr "Tests" #: data.cpp:685 msgid "Not started" msgstr "Sin iniciar" #: data.cpp:688 cpu-x-gtk-3.12.ui:5070 msgid "Prime numbers (slow)" msgstr "Números primos (lento)" #: data.cpp:692 cpu-x-gtk-3.12.ui:5178 msgid "Prime numbers (fast)" msgstr "Números primos (rápido)" #: data.cpp:696 cpu-x-gtk-3.12.ui:5281 msgid "Parameters" msgstr "Parámetros" #: data.cpp:721 data.cpp:727 #, c-format msgid "%u mins" msgstr "%u mins" #: data.cpp:734 cpu-x-gtk-3.12.ui:5444 cpu-x-gtk-3.12.ui:5552 msgid "About" msgstr "Acerca de" #: data.cpp:739 #, c-format msgid "" "%s is a Free software that gathers information\n" "on CPU, motherboard and more." msgstr "" "%s es un software gratuito que recopila información\n" "sobre CPU, placa madre y más." #: data.cpp:744 msgid "About CPU-X" msgstr "Acerca de CPU-X" #: data.cpp:745 #, c-format msgid "Version %s" msgstr "Versión %s" #: data.cpp:746 #, c-format msgid "Author: %s" msgstr "Autor: %s" #: data.cpp:747 #, c-format msgid "Site: %s" msgstr "Sitio: %s" #: data.cpp:751 cpu-x-gtk-3.12.ui:5533 msgid "License" msgstr "Licencia" #: data.cpp:753 #, c-format msgid "This software is distributed under the terms of %s" msgstr "Este software se distribuye bajo los términos de %s" #: data.cpp:754 main.cpp:176 msgid "This program comes with ABSOLUTELY NO WARRANTY" msgstr "Este programa viene ABSOLUTAMENTE SIN GARANTÍA" #: gui_gtk.cpp:61 #, c-format msgid "Cannot find path for '%s' file" msgstr "No se puede encontrar la ruta del archivo '%s'" #: gui_gtk.cpp:400 msgid "Start daemon" msgstr "Iniciar demonio" #: gui_gtk.cpp:403 msgid "Connected to daemon" msgstr "Conectado a demonio (daemon)" #: gui_gtk.cpp:406 msgid "No polkit authentication agent found" msgstr "Ningún agente de autenticación polkit encontrado" #: gui_gtk.cpp:411 msgid "Ask password to start daemon in background" msgstr "Solicite contraseña para inicializar demonio en segundo plano" #: gui_gtk.cpp:415 msgid "Settings" msgstr "Ajustes" #: gui_gtk.cpp:634 msgid "BaseFamily" msgstr "FamiliaBase" #: gui_gtk.cpp:635 msgid "CPU display (\"true\") family (computed as BaseFamily+ExtendedFamily)" msgstr "" "CPU representa familia (\"true\") (calculado como BaseFamily+ExtendedFamily)" #: gui_gtk.cpp:636 msgid "BaseModel" msgstr "ModeloBase" #: gui_gtk.cpp:637 msgid "CPU display (\"true\") model (computed as (ExtendedModel<<4)+BaseModel)" msgstr "" "Mostrar CPU (\"verdadero\") modelo (computado como " "(ModeloExtendido<<4)+ModeloBase)" #: gui_gtk.cpp:847 msgid "" "Identify the physically-labeled socket or board position where the memory " "device is located" msgstr "" "Identifica el zócalo o la posición de la placa etiquetada físicamente donde " "se encuentra el dispositivo de almacenamiento" #: gui_gtk.cpp:848 msgid "Identify the physically labeled bank where the memory device is located" msgstr "" "Identifica el banco etiquetado físicamente donde se encuentra el dispositivo " "de almacenamiento" #: gui_gtk.cpp:1052 msgid "User Mode Driver Version" msgstr "Versión del Driver en modo Usuario" #: gui_gtk.cpp:1066 msgid "Vulkan Ray Tracing" msgstr "Ray Tracing (Vulkan)" #: gui_gtk.cpp:1260 msgid "Starting GTK GUI…" msgstr "Inicializando la GUI GTK…" #: gui_gtk.cpp:1272 msgid "failed to import UI in GtkBuilder" msgstr "fallo al importar la IU en GtkBuilder" #: main.cpp:63 msgid "Start graphical user interface (GUI) (default)" msgstr "Iniciar la interfaz gráfica de usuario (GUI) (predeterminada)" #: main.cpp:64 msgid "Start text-based user interface (TUI)" msgstr "Iniciar interfaz de usuario basada en texto (TUI)" #: main.cpp:65 msgid "Dump all data on standard output and exit" msgstr "Volcar todos los datos en la salida estándar y salir" #: main.cpp:66 msgid "Run embedded command dmidecode and exit" msgstr "Ejecutar instrucción embebida dmidecode y salir" #: main.cpp:67 msgid "Run embedded command bandwidth and exit" msgstr "Ejecuta instrucción embebida de anchura de banda y sale" #: main.cpp:68 msgid "Set temperature unit (c[elsius]|f[ahrenheit]|k[elvin]|r[ankine])" msgstr "" "Ajustar la unidad para la temperatura (c[elsius]|f[ahrenheit]|k[elvin]|" "r[ankine])" #: main.cpp:69 msgid "Set custom time between two refreshes (in seconds)" msgstr "" "Establezca un tiempo personalizado entre dos actualizaciones (en segundos)" #: main.cpp:70 msgid "Set default tab (integer)" msgstr "Establecer pestaña predeterminada (entero)" #: main.cpp:71 msgid "Select core type to monitor (integer)" msgstr "Seleccione el tipo de núcleo para monitorear (entero)" #: main.cpp:72 msgid "Select CPU core to monitor (integer)" msgstr "Seleccione el núcleo de CPU a monitorear (entero)" #: main.cpp:73 msgid "Set custom bandwidth test for CPU caches speed (integer)" msgstr "" "Establecer una prueba de ancho de banda personalizada para la velocidad de " "caché de CPU (entero)" #: main.cpp:74 msgid "Select default memory stick (integer)" msgstr "Selecciona la tarjeta de memoria predeterminada (entero)" #: main.cpp:75 msgid "Select default graphic card (integer)" msgstr "Selecciona tarjeta gráfica predeterminada (entero)" #: main.cpp:76 cpu-x-gtk-3.12.ui:5910 msgid "Start and connect to daemon" msgstr "Iniciar y conectar al demonio (daemon)" #: main.cpp:77 msgid "Verbose output" msgstr "Salida detallada" #: main.cpp:78 msgid "Print help and exit" msgstr "Mostrar ayuda y salir" #: main.cpp:79 msgid "Print version and exit" msgstr "Mostrar versión y salir" #: main.cpp:80 msgid "Print CPUID values in decimal (default is hexadeximal)" msgstr "Escribe valores de CPU en decimal (predet. es hexadecimal)" #: main.cpp:81 msgid "Disable colored output" msgstr "Deshabilitar salida de color" #: main.cpp:82 msgid "Print information for debugging" msgstr "Escribe información para depuración" #: main.cpp:83 msgid "Print required information to paste in an issue" msgstr "Imprima la información requerida para pegar en un problema" #: main.cpp:84 msgid "Set key mapping for NCurses mode (a[rrows]|e[macs]|i[nverted-T]|v[im])" msgstr "" "Setea tecla asociada para modo NCurses (a[rrows]|e[macs]|i[nverted-T]|v[im])" #: main.cpp:95 msgid "Add default command line arguments" msgstr "Añade argumentos predeterminados de línea de comandos" #: main.cpp:96 msgid "Enforce the bus clock" msgstr "Imponer (forzar) el reloj del Bus" #: main.cpp:97 msgid "" "Ignore CPU values reported by libcpuid (comma-separated values among 'temp', " "'volt' and 'freq')" msgstr "" "Ignorar los valores de la CPU reportados por libcpuid (valores separados por " "comas entre 'temp', 'volt' y 'freq')" #: main.cpp:98 msgid "Read CPUID raw data from a given file" msgstr "Leer datos puros de CPUID de un archivo determinado" #: main.cpp:99 msgid "Only print a message if CPU is not present in the database" msgstr "" "Solo imprima un mensaje si la CPU no está presente dentro de la base de datos" #: main.cpp:126 #, c-format msgid "Usage: %s DISPLAY [OPTIONS]\n" msgstr "Uso: %s PANTALLA [OPCIONES]\n" #: main.cpp:127 msgid "Available DISPLAY:" msgstr "PANTALLA disponible:" #: main.cpp:135 msgid "Available OPTIONS:" msgstr "OPCIONES disponibles:" #: main.cpp:144 msgid "Influenceable environment variables:" msgstr "Variables de entorno influenciables:" #: main.cpp:175 msgid "This is free software: you are free to change and redistribute it." msgstr "Esto es software libre: usted es libre de cambiarlo y redistribuirlo." #: main.cpp:177 #, c-format msgid "See the %s license: <%s>\n" msgstr "Ver la %s licencia: <%s>\n" #: main.cpp:184 #, c-format msgid "-- %-9s version: %s" msgstr "-- %-9s version: %s" #: main.cpp:381 #, c-format msgid "" "\n" "Oops, something was wrong! %s has received signal %d (%s) and has crashed." msgstr "" "\n" "Ups, ¡algo iba mal! %s ha recibido la señal %d (%s) y se ha bloqueado." #: main.cpp:383 #, c-format msgid "" "\n" "Oops, something was wrong! %s has received signal %d (%s) and is trying to " "recover." msgstr "" "\n" "Ups, ¡algo iba mal! %s ha recibido la señal %d (%s) y está intentando " "recuperarse." #: main.cpp:407 msgid "You can open a new issue here, by filling the template as requested:" msgstr "" "Puede abrir una nueva cuestión aquí, rellenando la plantilla como se " "solicita:" #: main.cpp:449 msgid "an error occurred while setting locale" msgstr "se produjo un error al ajustar la configuración regional" #: options.cpp:124 #, c-format msgid "" "Selected CPU type (%u) is not a valid number (%u is the maximum for this CPU)" msgstr "" "El tipo de CPU seleccionada (%u) no es un número válido (%u es el máximo " "para esta CPU)" #: options.cpp:145 #, c-format msgid "" "Selected bandwidth test (%u) is not a valid number (%u is the maximum for " "this system)" msgstr "" "La prueba del ancho de banda seleccionado (%u) no es un número válido (%u es " "el máximo para este sistema)" #: options.cpp:168 #, c-format msgid "" "Selected RAM stick (%u) is not a valid number (%u is the maximum for this " "system)" msgstr "" "La memoria RAM seleccionada (%u) no es un número válido (%u es el máximo " "para este sistema)" #: options.cpp:188 #, c-format msgid "" "Selected graphic card (%u) is not a valid number (%u is the maximum for this " "system)" msgstr "" "La tarjeta gráfica seleccionada (%u) no es un número válido (%u es el máximo " "para este sistema)" #: options.cpp:204 #, c-format msgid "failed to change CPU affinitiy to core %u" msgstr "Error al cambiar la afinidad de la CPU al núcleo %u" #: options.cpp:210 #, c-format msgid "" "Selected CPU core (%u) is not a valid number (%u is the maximum for this " "type of core)" msgstr "" "El núcleo de CPU seleccionado (%u) no es un número válido (%u es el máximo " "para este tipo de núcleo)" #: options.cpp:284 #, c-format msgid "Selected tab (%u) is not a valid number (%u is the maximum)" msgstr "La pestaña seleccionada (%u) no es un número válido (%u es el máximo)" #: tui_ncurses.cpp:111 msgid "Window is too small!" msgstr "¡La ventana es muy pequeña!" #: tui_ncurses.cpp:119 msgid "Press 'h' to see help." msgstr "Presione 'h' para ver ayuda." #: tui_ncurses.cpp:232 #, c-format msgid "Welcome in %s NCurses help!\n" msgstr "¡Bienvenido a la ayuda de NCurses %s!\n" #: tui_ncurses.cpp:233 msgid "This help describes how to use this Text-based User Interface." msgstr "" "Esta ayuda describe cómo utilizar este Interfaz de Usuario basada en Texto." #: tui_ncurses.cpp:235 msgid "Global keys:" msgstr "Teclas globales:" #: tui_ncurses.cpp:236 msgid "Press 'left' key or 'tab' key to switch in left tab." msgstr "" "Pulsa la tecla 'izquierda' o 'tabulador' para cambiar a la pestaña izquierda." #: tui_ncurses.cpp:237 msgid "Press 'right' key or 'shift + tab' keys to switch in right tab." msgstr "" "Presione la tecla 'derecha' o las teclas 'shift + tab' para cambiar a la " "pestaña derecha." #: tui_ncurses.cpp:238 msgid "Press 'h' key to see this help." msgstr "Presione la tecla 'h' para ver esta ayuda." #: tui_ncurses.cpp:239 msgid "Press 'q' key to exit." msgstr "Presione la tecla 'q' para salir." #: tui_ncurses.cpp:241 msgid "CPU tab:" msgstr "Pestaña CPU:" #: tui_ncurses.cpp:242 msgid "Press 'next page' key to decrease core type number to monitor." msgstr "" "Presione la tecla 'siguiente página' para disminuir el número de tipo de " "núcleo para monitorear." #: tui_ncurses.cpp:243 msgid "Press 'previous page' key to increase core type number to monitor." msgstr "" "Presione la tecla 'página anterior' para aumentar el número de tipo de " "núcleo para monitorear." #: tui_ncurses.cpp:244 msgid "Press 'down' key to decrease CPU core number to monitor." msgstr "" "Presione la tecla 'abajo' para disminuir el número de núcleos de la CPU para " "monitorear." #: tui_ncurses.cpp:245 msgid "Press 'up' key to increase CPU core number to monitor." msgstr "" "Presione la tecla 'arriba' para aumentar el número de núcleos de la CPU para " "monitorear." #: tui_ncurses.cpp:247 msgid "Caches tab:" msgstr "Pestaña cachés:" #: tui_ncurses.cpp:248 msgid "Press 'down' key to switch to previous test." msgstr "Pulse la tecla \"abajo\" para pasar a la prueba anterior." #: tui_ncurses.cpp:249 msgid "Press 'up' key to switch to next test." msgstr "Pulse la tecla 'arriba' para pasar a la siguiente prueba." #: tui_ncurses.cpp:251 msgid "Bench tab:" msgstr "Pestaña Cachés:" #: tui_ncurses.cpp:252 msgid "Press 'down' key to decrement benchmark duration." msgstr "" "Presione la tecla 'abajo' para disminuir la duración del punto de referencia." #: tui_ncurses.cpp:253 msgid "Press 'up' key to increment benchmark duration." msgstr "" "Presione la tecla 'arriba' para aumentar la duración del punto de referencia." #: tui_ncurses.cpp:254 msgid "Press 'next page' key to decrement number of threads to use." msgstr "" "Presione la tecla 'página siguiente' para disminuir el número de hilos a " "usar." #: tui_ncurses.cpp:255 msgid "Press 'previous page' key to increment number of threads to use." msgstr "" "Presione la tecla 'página anterior' para incrementar el número de hilos a " "usar." #: tui_ncurses.cpp:256 msgid "Press 's' key to start/stop prime numbers (slow) benchmark." msgstr "" "Oprima la tecla «s» para iniciar/parar el banco de pruebas de números primos " "(lento)." #: tui_ncurses.cpp:257 msgid "Press 'f' key to start/stop prime numbers (fast) benchmark." msgstr "" "Oprima la tecla «f» para iniciar/parar el banco de pruebas de números primos " "(rápido)." #: tui_ncurses.cpp:259 msgid "Graphics tab:" msgstr "Pestaña gráfica:" #: tui_ncurses.cpp:260 msgid "Press 'down' key to switch to previous graphic card." msgstr "Pulsa la tecla \"abajo\" para cambiar a la tarjeta gráfica anterior." #: tui_ncurses.cpp:261 msgid "Press 'up' key to switch to next graphic card." msgstr "Presione la tecla 'arriba' para pasar a la siguiente prueba." #: tui_ncurses.cpp:263 msgid "Press any key to exit this help." msgstr "Oprima cualquier tecla para salir de esta ayuda." #: tui_ncurses.cpp:640 msgid "Starting NCurses TUI…" msgstr "Iniciando TUI NCurses…" #: tui_ncurses.cpp:649 msgid "" "FATAL ERROR: terminfo database could not be found (try to set TERMINFO " "environment variable)" msgstr "" "ERROR FATAL: base de datos terminfo no pudo ser encontrada (intente fijar la " "variable TERMINFO del entorno)" #: tui_ncurses.cpp:654 #, c-format msgid "Failed to set up %s terminal (err=%i); falling back to %s" msgstr "Error al fijar terminal %s (err=%i); devuelto a %s" #: util.cpp:189 #, c-format msgid "cannot find unit in '%s' string at position %i" msgstr "no se pudo buscar unidad en '%s' cadena en la posición %i" #: util.cpp:252 #, c-format msgid "an error occurred while opening file '%s'" msgstr "se ha producido un error al abrir el archivo \"%s" #: util.cpp:297 #, c-format msgid "an error occurred while running command '%s'" msgstr "se ha producido un error al ejecutar el comando '%s'" #: util.cpp:437 msgid "set_cpu_affinity() not supported on this operating system" msgstr "set_cpu_affinity() no es compatible con este sistema operativo" #: data.hpp:103 data.hpp:244 data.hpp:332 msgid "Vendor" msgstr "Proveedor" #: data.hpp:104 msgid "Code Name" msgstr "Nombre clave" #: data.hpp:105 msgid "Package" msgstr "Paquete" #: data.hpp:106 msgid "Technology" msgstr "Tecnología" #: data.hpp:107 data.hpp:268 msgid "Voltage" msgstr "Voltaje" #: data.hpp:108 msgid "Specification" msgstr "Especificación" #: data.hpp:109 msgid "Family" msgstr "Familia" #: data.hpp:110 msgid "Disp. Family" msgstr "Dispt. Familia" #: data.hpp:111 data.hpp:224 data.hpp:245 data.hpp:335 msgid "Model" msgstr "Modelo" #: data.hpp:112 msgid "Disp. Model" msgstr "Disp. Modelo" #: data.hpp:113 msgid "Temp." msgstr "Temp." #: data.hpp:114 msgid "Stepping" msgstr "Escalonado" #: data.hpp:115 msgid "Instructions" msgstr "Instrucciones" #: data.hpp:125 msgid "L1 Data" msgstr "L1 Datos" #: data.hpp:126 msgid "L1 Inst." msgstr "Inst. L1" #: data.hpp:127 msgid "Level 2" msgstr "Nivel 2" #: data.hpp:128 msgid "Level 3" msgstr "Nivel 3" #: data.hpp:137 cpu-x-gtk-3.12.ui:1232 msgid "Cores" msgstr "Núcleos" #: data.hpp:138 data.hpp:408 cpu-x-gtk-3.12.ui:1252 msgid "Threads" msgstr "Hilos" #: data.hpp:155 msgid "Core Speed" msgstr "Velocidad del núcleo" #: data.hpp:156 msgid "Multiplier" msgstr "Multiplicador" #: data.hpp:157 msgid "Bus Speed" msgstr "Velocidad Bus" #: data.hpp:158 data.hpp:341 msgid "Usage" msgstr "Uso" #: data.hpp:188 data.hpp:265 msgid "Size" msgstr "Tamaño" #: data.hpp:189 data.hpp:267 msgid "Speed" msgstr "Velocidad" #: data.hpp:223 data.hpp:259 msgid "Manufacturer" msgstr "Fabricante" #: data.hpp:225 msgid "Revision" msgstr "Revisión" #: data.hpp:233 msgid "Brand" msgstr "Marca" #: data.hpp:234 msgid "Version" msgstr "Versión" #: data.hpp:235 msgid "Date" msgstr "Fecha" #: data.hpp:236 msgid "ROM Size" msgstr "Tamaño de la ROM" #: data.hpp:260 msgid "Part Number" msgstr "Número de la pieza" #: data.hpp:261 msgid "Type" msgstr "Tipo" #: data.hpp:262 msgid "Type Detail" msgstr "Tipo de los detalles" #: data.hpp:263 msgid "Device Locator" msgstr "Localizador de los dispositivos" #: data.hpp:264 msgid "Bank Locator" msgstr "Localizador de los bancos" #: data.hpp:266 msgid "Rank" msgstr "Rango" #: data.hpp:292 msgid "Name" msgstr "Nombre" #: data.hpp:293 msgid "Kernel" msgstr "Kernel" #: data.hpp:294 msgid "Hostname" msgstr "Nombre del host" #: data.hpp:295 msgid "Uptime" msgstr "Tiempo activo" #: data.hpp:303 msgid "Used" msgstr "Usado" #: data.hpp:304 msgid "Buffers" msgstr "Buffers" #: data.hpp:305 msgid "Cached" msgstr "En caché" #: data.hpp:306 msgid "Free" msgstr "Libre" #: data.hpp:307 msgid "Swap" msgstr "Intercambio" #: data.hpp:333 msgid "Driver" msgstr "Controlador" #: data.hpp:334 msgid "UMD Version" msgstr "Versión UMD" #: data.hpp:336 msgid "Compute Unit" msgstr "Unidad de Cómputo" #: data.hpp:337 msgid "Device ID" msgstr "Identificación del dispositivo" #: data.hpp:338 msgid "VBIOS Version" msgstr "Versión de VBIOS" #. #-#-#-#-# source_ui.pot (cpu-x ) #-#-#-#-# #. Setting: "Interface" tab #: data.hpp:339 cpu-x-gtk-3.12.ui:5807 msgid "Interface" msgstr "Interfaz" #: data.hpp:340 msgid "Temperature" msgstr "Temperatura" #: data.hpp:342 msgid "Core Voltage" msgstr "Voltaje de Núcleo" #: data.hpp:343 msgid "Power Avg" msgstr "Potencia Media" #: data.hpp:344 msgid "Core Clock" msgstr "Reloj del núcleo" #: data.hpp:345 msgid "Memory Clock" msgstr "Reloj de la Memoria" #: data.hpp:346 msgid "Memory Used" msgstr "Memoria Utilizada" #: data.hpp:347 msgid "Resizable BAR" msgstr "RDB Redimensionable" #: data.hpp:348 msgid "Vulkan RT" msgstr "Vulkan RT" #: data.hpp:349 msgid "OpenGL Version" msgstr "Versión de OpenGL" #: data.hpp:350 msgid "Vulkan Version" msgstr "Versión de Vulkan" #: data.hpp:351 msgid "OpenCL Version" msgstr "Versión de OpenCL" #: data.hpp:387 msgid "Score" msgstr "Puntuación" #: data.hpp:388 msgid "Run" msgstr "Ejecutar" #: data.hpp:407 msgid "Duration" msgstr "Duración" #: util.hpp:77 msgid "bytes" msgstr "bytes" #. TRANSLATORS: initials for kilobyte (10³): please put initials (keep it short) #: util.hpp:80 msgid "kB" msgstr "kB" #. TRANSLATORS: initials for megabyte (10⁶): please put initials (keep it short) #: util.hpp:82 msgid "MB" msgstr "MB" #. TRANSLATORS: initials for gigabyte (10⁹): please put initials (keep it short) #: util.hpp:84 msgid "GB" msgstr "GB" #. TRANSLATORS: initials for terabyte (10¹²): please put initials (keep it short) #: util.hpp:86 msgid "TB" msgstr "TB" #. TRANSLATORS: initials for kibibyte (2¹⁰): please put initials (keep it short) #: util.hpp:89 msgid "KiB" msgstr "KiB" #. TRANSLATORS: initials for mebibyte (2²⁰): please put initials (keep it short) #: util.hpp:91 msgid "MiB" msgstr "MiB" #. TRANSLATORS: initials for gibibyte (2³⁰): please put initials (keep it short) #: util.hpp:93 msgid "GiB" msgstr "GiB" #. TRANSLATORS: initials for tebibyte (2⁴⁰): please put initials (keep it short) #: util.hpp:95 msgid "TiB" msgstr "TiB" #: cpu-x-gtk-3.12.ui:1184 msgid "Cache" msgstr "Cache" #. Setting: refresh time for UI #: cpu-x-gtk-3.12.ui:5721 msgid "Refresh time" msgstr "Tiempo de refresco" #. Setting: GUI theme #: cpu-x-gtk-3.12.ui:5745 msgid "Text theme" msgstr "Tema del texto" #. Setting: automatic GUI theme #: cpu-x-gtk-3.12.ui:5760 msgid "Automatic" msgstr "Automático" #. Setting: light GUI theme #: cpu-x-gtk-3.12.ui:5761 msgid "Blue for light theme" msgstr "Azul para el tema claro" #. Setting: dark GUI theme #: cpu-x-gtk-3.12.ui:5762 msgid "Yellow for dark theme" msgstr "Amarillo para el tema oscuro" #. Setting: temperature unit #: cpu-x-gtk-3.12.ui:5775 msgid "Temperature unit" msgstr "Unidades de temperatura" #. Setting: default tab at startup #: cpu-x-gtk-3.12.ui:5826 msgid "Default tab" msgstr "Pestaña predeterminada" #. Setting: default CPU core at startup #: cpu-x-gtk-3.12.ui:5839 msgid "Default CPU core" msgstr "Núcleo CPU predeterminado" #. Setting: default cache test at startup #: cpu-x-gtk-3.12.ui:5852 msgid "Default cache test" msgstr "Prueba caché predeterminada" #. Setting: print CPUID values in decimal or hexadecimal #: cpu-x-gtk-3.12.ui:5895 msgid "Print CPUID values in decimal" msgstr "Escribe valores de CPUID en decimal" #. Setting: default graphic card at startup #: cpu-x-gtk-3.12.ui:5928 msgid "Default graphic card" msgstr "Tarjeta gráfica predeterminada" #. Setting: default CPU core at startup #: cpu-x-gtk-3.12.ui:5952 msgid "Default core type" msgstr "Tipo de núcleo por defecto" #. Setting: default graphic card at startup #: cpu-x-gtk-3.12.ui:5976 msgid "Default memory stick" msgstr "Memoria extraíble predeterminada" #. Setting: "Startup" tab #: cpu-x-gtk-3.12.ui:6004 msgid "Startup" msgstr "Arranque" #~ msgid "Light" #~ msgstr "Claro" #~ msgid "Dark" #~ msgstr "Oscuro" #~ msgid "Calculating CPU multipliers" #~ msgstr "Calculando multiplicadores de CPU" #, c-format #~ msgid "Current: PCIe Gen%1dx%d / Max: Gen%1dx%d" #~ msgstr "Actual: PCIe Gen%1dx%d / Max: Gen%1dx%d" #~ msgid "failed to retrieve GPU clocks" #~ msgstr "fallo al recuperar reloj de GPU" #, c-format #~ msgid "Core #%i" #~ msgstr "Núcleo #%i" #~ msgid "Setting label names" #~ msgstr "Estableciendo nombres de etiquetas" #, c-format #~ msgid "Bank %i" #~ msgstr "Banco %i" #~ msgid "Reference" #~ msgstr "Referencia" #~ msgid "Distribution" #~ msgstr "Distribución" #~ msgid "Compiler" #~ msgstr "Compilador" #~ msgid "GPU clock" #~ msgstr "Reloj de GPU" #~ msgid "Dumping data…" #~ msgstr "Volcando datos…" #~ msgid "Freeing memory" #~ msgstr "Liberando memoria" #~ msgid "Ignore CPU frequency reported by libcpuid" #~ msgstr "Descarta frecuencia de CPU comunicada por libcpuid" #, c-format #~ msgid "failed to call wordexp (%i)" #~ msgstr "fallo al invocar wordexp (%i)" #~ msgid "Press 'home' key to scroll up in a page." #~ msgstr "" #~ "Presione la tecla 'inicio' para desplazarse hacia arriba en una página." #~ msgid "Press 'end' key to scroll down in a page." #~ msgstr "Presione la tecla 'fín' para desplazarse hacia abajo en una página." #, c-format #~ msgid "String '%s' is too long, truncating…" #~ msgstr "Cadena «%s» es demasiado larga, se trunca…" #, c-format #~ msgid "failed to open %s directory" #~ msgstr "fallo al abrir el directorio %s" #~ msgid "an error occurred while compiling regex" #~ msgstr "se produjo un error al compilar regex" #~ msgid "FATAL ERROR: could not allocate memory" #~ msgstr "ERROR FATAL: no pudo asignar memoria" #, fuzzy, c-format #~| msgid "failed to call dmidecode" #~ msgid "failed to call vkEnumerateInstanceExtensionProperties (%s)" #~ msgstr "no se pudo llamar a dmidecode" #~ msgid "Vulkan API is not available" #~ msgstr "La API de Vulkan no está disponible" #, c-format #~ msgid "%s" #~ msgstr "%s" #, c-format #~ msgid "" #~ "CPU hybrid architecture is not supported. For more details, please refer " #~ "to following issue: %s" #~ msgstr "" #~ "Arquitectura híbrida de CPU no está admitida. Para más detalles, " #~ "refiérase al siguiente tema: %s" #~ msgid "NOT SUPPORTED" #~ msgstr "NO PROPORCIONADO" #, fuzzy #~| msgid "There is no platform with OpenCL support (%s)" #~ msgid "There is no device with Vulkan support" #~ msgstr "No hay ninguna plataforma con capacidad OpenCL (%s)" #~ msgid "Socket(s)" #~ msgstr "Zócalo(s)" #~ msgid "Thread(s)" #~ msgstr "Hilos(s)" #~ msgid "You can paste this backtrace by opening a new issue here:" #~ msgstr "Puede pegar esta retrotraza abriendo aquí una asunto nuevo:" #, fuzzy #~| msgid "failed to call dmidecode" #~ msgid "faild to call clGetDeviceIDs" #~ msgstr "no se pudo llamar a dmidecode" #~ msgid "Exiting %s" #~ msgstr "Saliendo de %s" #~ msgid "Skip CPU MSR opening (need to be root)" #~ msgstr "Omitir apertura de CPU MSR (necesita ser root)" #~ msgid "failed to open CPU MSR (%s)" #~ msgstr "no se pudo abrir CPU MSR (%s)" #~ msgid "Skip call to dmidecode (need to be root)" #~ msgstr "Omitir llamada a dmidecode (necesita ser root)" #~ msgid "failed to allocate memory for dmidecode" #~ msgstr "No se pudo asignar memoria para el dmidecode" #~ msgid "Finding graphic card driver" #~ msgstr "Encontrando el controlador de la tarjeta gráfica" #~ msgid "(%s driver)" #~ msgstr "(controlador %s)" #~ msgid "Retrieving GPU temperature" #~ msgstr "Recuperando temperatura de la GPU" #~ msgid "Off" #~ msgstr "Apagado" #~ msgid "failed to retrieve GPU temperature" #~ msgstr "no se pudo recuperar la temperatura de la GPU" #~ msgid "Skip some GPU values (need to be root)" #~ msgstr "Omitir algunos valores de la GPU (debe ser root)" #~ msgid "Root privileges are required to work properly" #~ msgstr "" #~ "Se requieren privilegios de superusuario para funcionar correctamente" #~ msgid "Some information will not be retrievable" #~ msgstr "Alguna información no será recuperable" #~ msgid "Ignore" #~ msgstr "Ignorar" #~ msgid "Run as root" #~ msgstr "Ejecutar como superusuario" #~ msgid "A new version of %s is available!" #~ msgstr "¡Una nueva versión de %s está disponible!" #~ msgid "" #~ "Do you want to update %s to version %s after exit?\n" #~ "It will erase this binary file (%s) by the new version." #~ msgstr "" #~ "¿Desea actualizar %s a la versión %s después de salir?\n" #~ "Esto borrará el archivo binario (%s) por la nueva versión." #~ msgid "Not now" #~ msgstr "Ahora No" #~ msgid "Update" #~ msgstr "Actualización" #~ msgid "Checking on Internet for a new version..." #~ msgstr "Buscando en Internet una nueva versión..." #~ msgid "wrong write data" #~ msgstr "escritura de datos incorrecta" #~ msgid "(version %s is available)" #~ msgstr "(la versión %s está disponible)" #~ msgid "No new version available" #~ msgstr "Sin nueva versión disponible" #~ msgid "(up-to-date)" #~ msgstr "(a la fecha)" #~ msgid "an error occurred while extracting %s archive (%s)" #~ msgstr "se produjo un error al extraer %s archivo (%s)" #~ msgid "" #~ "Network access is disabled by environment variable (set CPUX_NETWORK with " #~ "a positive value to enable it)" #~ msgstr "" #~ "El acceso a la red está deshabilitado por la variable de entorno " #~ "(configure CPUX_NETWORK con un valor positivo para habilitarlo)" #~ msgid "failed to open %s archive for writing" #~ msgstr "no se pudo abrir el archivo %s para escribir" #~ msgid "Downloading new version..." #~ msgstr "Descargando nueva versión..." #~ msgid "failed to download %s archive (%s)" #~ msgstr "fallo al descargar el archivo %s (%s)" #~ msgid "Extracting new version..." #~ msgstr "Extrayendo nueva versión..." #~ msgid "Applying new version..." #~ msgstr "Aplicando nueva versión..." #~ msgid "an error occurred while removing/renaming files" #~ msgstr "se produjo un error al eliminar/renombrar archivos" #~ msgid "Update successful!" #~ msgstr "¡Actualización exitosa!" #~ msgid "Update portable version if a new version is available" #~ msgstr "Actualice la versión portátil si hay una nueva versión disponible" #~ msgid "Temporarily disable network support" #~ msgstr "Deshabilitar temporalmente el soporte de red" #~ msgid "Built on %s, %s (with %s %s on %s)." #~ msgstr "Construido en %s, %s (con %s %s en %s)." #~ msgid "" #~ "Sorry, you cannot update %s: 32-bit portable version is no more supported." #~ msgstr "" #~ "Lo sentimos, no puede actualizar %s: la versión portátil de 32-bits ya no " #~ "es compatible." #~ msgid "If you want to update, press 'u' key, or anything else to skip.\n" #~ msgstr "" #~ "Si desea actualizar, presione la tecla 'u' o cualquier otra para omitir.\n" #~ msgid "" #~ "\n" #~ "\n" #~ "%s will be updated." #~ msgstr "" #~ "\n" #~ "\n" #~ "%s se actualizará." CPU-X-5.0.3/po/fa.po000066400000000000000000001266401454622605200137360ustar00rootroot00000000000000# CPU-X translations template # Copyright © 2014-2024 The Tumultuous Unicorn Of Darkness # This file is distributed under the same license as the cpu-x package. # Ali Akrami , 2021. # Abou , 2022. # M , 2023. msgid "" msgstr "" "Project-Id-Version: cpu-x\n" "Report-Msgid-Bugs-To: https://github.com/TheTumultuousUnicornOfDarkness/CPU-" "X/issues\n" "POT-Creation-Date: 2023-12-09 13:09+0100\n" "PO-Revision-Date: 2023-05-10 10:49+0000\n" "Last-Translator: M \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.18-dev\n" #: core.cpp:135 msgid "Finding CPU technology" msgstr "در حال بررسی فناوری پردازنده" #: core.cpp:161 #, c-format msgid "" "Your CPU is not present in the database ==> %s, model: %i, ext. model: %i, " "ext. family: %i" msgstr "" "پردازنده شما در پایگاه داده یافت نشد ==> %s، مدل: %i، مدل اضافی: %i، خانواده " "اضافی: %i" #: core.cpp:189 data.cpp:150 data.cpp:342 msgid "unknown" msgstr "ناشناخته" #: core.cpp:230 msgid "Calling libcpuid for retrieving static data" msgstr "در حال فراخوانی libcpuid برای دریافت اطلاعات ایستا" #: core.cpp:245 #, c-format msgid "failed to call libcpuid (%s)" msgstr "فراخوانی ناموفق libcpuid (%s)" #: core.cpp:340 msgid "Calling libcpuid for retrieving dynamic data" msgstr "در حال فراخوانی کتابخانه شناسه پردازنده برای دریافت اطلاعات پویا" #: core.cpp:353 msgid "Calling libcpuid for retrieving CPU MSR static values" msgstr "" "فراخوانی کتابخانه شناسه پردازنده برای دریافت مقادیر ایستای MSR پردازنده" #: core.cpp:380 msgid "Calling libcpuid for retrieving CPU MSR dynamic values" msgstr "فراخوانی کتابخانه شناسه پردازنده برای دریافت مقادیر پویای MSR پردازنده" #: core.cpp:412 msgid "Calling dmidecode" msgstr "در حال فراخوانی dmidecode" #: core.cpp:454 core.cpp:473 #, c-format msgid "%s (configured)" msgstr "" #: core.cpp:461 core.cpp:480 #, c-format msgid "%s (max)" msgstr "" #: core.cpp:466 #, c-format msgid "%s (min)" msgstr "" #: core.cpp:496 msgid "Calculating CPU usage" msgstr "در حال محاسبه میزان استفاده از پردازنده" #: core.cpp:546 msgid "Calling bandwidth" msgstr "در حال فراخوانی پهنای باند" #: core.cpp:613 #, c-format msgid "" "pci_access is not properly initialized: it is a common issue when %s was " "built with a lower libpci version.\n" "Check that libpci %s library is present on your system. Otherwise, please " "rebuild %s." msgstr "" "pci_access به درستی مقداردهی نشده است: این یک مشکل رایج است،‌ زمانیکه %s با " "یک نسخه libpci پایین‌تر ساخته شده باشد.\n" "بررسی کنید که کتابخانه libpci %s در سیستم شما وجود دارد. در غیر اینصورت،‌ " "لطفا %s را بازسازی کنید." #: core.cpp:657 #, c-format msgid "No kernel driver in use for graphic card at path %s" msgstr "هیچ درایور کرنلی برای کارت گرافیک در مسیر %s استفاده نمی شود" #: core.cpp:693 #, c-format msgid "Your GPU kernel driver is unknown: %s" msgstr "راه انداز هسته پردازنده گرافیکی شما نامشخص است: %s" #: core.cpp:777 #, fuzzy, c-format #| msgid "Your GPU user mode driver is unknown: %s" msgid "Your GPU user mode driver is unknown for vendor %s: %s" msgstr "راه انداز حالت کاربری پردازنده گرافیکی شما نامشخص است: %s" #: core.cpp:781 #, c-format msgid "failed to call GLFW (%i): %s" msgstr "فراخوانی ناموفق GLFW (%i): %s" #: core.cpp:914 msgid "Finding Vulkan API version" msgstr "پیدا کردن نسخه Vulkan API" #: core.cpp:926 #, c-format msgid "failed to call vkCreateInstance (%s)" msgstr "" #: core.cpp:929 #, c-format msgid "%s is not supported" msgstr "%s پشتیبانی نمی‌شود" #: core.cpp:937 #, fuzzy, c-format #| msgid "failed to call libcpuid (%s)" msgid "failed to call vkEnumeratePhysicalDevices (%s)" msgstr "فراخوانی ناموفق libcpuid (%s)" #: core.cpp:944 msgid "No available Vulkan devices" msgstr "هیچ دستگاه Vulkan موجود نیست" #: core.cpp:952 #, fuzzy, c-format #| msgid "failed to call libcpuid (%s)" msgid "No available physical devices (%s)" msgstr "فراخوانی ناموفق libcpuid (%s)" #: core.cpp:1015 #, fuzzy, c-format #| msgid "failed to get name for device %u (%s)" msgid "Failed to create Vulkan for device %u (%s)" msgstr "دریافت ناموفق نام دستگاه %u (%s)" #: core.cpp:1019 #, c-format msgid "%s is not supported for device %u, use only deviceID for matching" msgstr "" "%s برای دستگاه %u پشتیبانی نمی‌شود، فقط از deviceID برای تطابق استفاده کنید" #: core.cpp:1051 core.cpp:1364 msgid "Enabled" msgstr "فعال شده" #: core.cpp:1051 core.cpp:1364 msgid "Disabled" msgstr "غیرفعال شده" #: core.cpp:1088 #, fuzzy #| msgid "Finding Vulkan API version" msgid "Finding OpenCL API version" msgstr "پیدا کردن نسخه Vulkan API" #: core.cpp:1092 #, c-format msgid "There is no platform with OpenCL support (%s)" msgstr "پلتفرمی با پشتیبانی از OpenCL وجود ندارد (%s)" #: core.cpp:1102 #, c-format msgid "failed to get all OpenCL platforms (%s)" msgstr "دریافت ناموفق تمام پلتفرم های OpenCL (%s)" #: core.cpp:1115 #, c-format msgid "failed to get name for platform %u (%s)" msgstr "دریافت ناموفق نام پلتفرم %u (%s)" #: core.cpp:1123 #, c-format msgid "failed to get version for platform %u (%s)" msgstr "دریافت ناموفق نسخه پلتفرم %u (%s)" #: core.cpp:1131 #, c-format msgid "failed to find number of OpenCL devices for platform '%s %s' (%s)" msgstr "یافتن ناموفق دستگاه های OpenCL برای پلتفرم '%s %s' (%s)" #: core.cpp:1131 msgid "0 device" msgstr "صفر دستگاه" #: core.cpp:1140 #, c-format msgid "failed to get all of OpenCL devices for platform '%s %s' (%s)" msgstr "دریافت ناموفق تمام دستگاه های OpenCL برای پلتفرم '%s %s' (%s)" #: core.cpp:1160 #, c-format msgid "failed to get name for device %u (%s)" msgstr "دریافت ناموفق نام دستگاه %u (%s)" #: core.cpp:1168 #, c-format msgid "failed to get version for device %u (%s)" msgstr "دریافت ناموفق نسخه دستگاه %u (%s)" #: core.cpp:1190 #, c-format msgid "OpenCL driver for '%s %s' does not support CL_DEVICE_TOPOLOGY_AMD (%s)" msgstr "" "راه انداز OpenCL برای '%s %s' از CL_DEVICE_TOPOLOGY_AMD پشتیبانی نمی کند (%s)" #: core.cpp:1201 #, c-format msgid "" "OpenCL driver for '%s %s' does not support CL_DEVICE_GFXIP_MAJOR_AMD (%s)" msgstr "" "راه انداز OpenCL برای '%s %s' از CL_DEVICE_GFXIP_MAJOR_AMD (%s) پشتیبانی نمی " "کند" #: core.cpp:1209 core.cpp:1229 core.cpp:1262 #, c-format msgid "" "OpenCL driver for '%s %s' does not support CL_DEVICE_MAX_COMPUTE_UNITS (%s)" msgstr "" "راه انداز OpenCL برای '%s %s' از CL_DEVICE_MAX_COMPUTE_UNITS (%s) پشتیبانی " "نمی کند" #: core.cpp:1250 #, c-format msgid "" "OpenCL driver for '%s %s' does not support CL_DEVICE_PCI_DOMAIN_ID_NV (%s), " "CL_DEVICE_PCI_BUS_ID_NV (%s) or CL_DEVICE_PCI_SLOT_ID_NV (%s)" msgstr "" "راه انداز OpenCL برای '%s %s' از CL_DEVICE_PCI_DOMAIN_ID_NV (%s)، " "CL_DEVICE_PCI_BUS_ID_NV (%s) یا CL_DEVICE_PCI_SLOT_ID_NV (%s) پشتیبانی نمی " "کند" #: core.cpp:1273 #, c-format msgid "OpenCL is not supported with your GPU vendor (0x%X)" msgstr "OpenCL توسط سازنده پردازنده گرافیکی شما پشتیبانی نمی شود (0x%X)" #: core.cpp:1295 msgid "Finding devices" msgstr "در حال بررسی دستگاه ها" #: core.cpp:1307 #, c-format msgid "Skip devices search (wrong permissions on %s device)" msgstr "لغو جستجوی دستگاه ها (دسترسی نادرست به دستگاه %s)" #: core.cpp:1350 #, c-format msgid "Your GPU vendor is unknown: %s (0x%X)" msgstr "سازنده پردازنده گرافیکی شما نامشخص است: %s (0x%X)" #: core.cpp:1370 msgid "failed to find chipset vendor and model" msgstr "جستجوی سازنده و مدل chipset ناموفق بود" #: core.cpp:1385 msgid "failed to find graphic card vendor and model" msgstr "سازنده و مدل کارت گرافیک پیدا نشد" #: core.cpp:1487 msgid "Retrieving GPU clocks" msgstr "در حال دریافت زمان سنج های پردازنده گرافیکی" #: core.cpp:1500 msgid "None" msgstr "هیچ کدام" #: core.cpp:1509 #, fuzzy, c-format #| msgid "Card number for GPU %u is unknown" msgid "DRM path for %s is unknown" msgstr "شماره کارت برای پردازنده گرافیکی %u ناشناخته است" #: core.cpp:1516 #, fuzzy, c-format #| msgid "Card number for GPU %u is unknown" msgid "Card number for %s is unknown" msgstr "شماره کارت برای پردازنده گرافیکی %u ناشناخته است" #: core.cpp:1541 #, c-format msgid "PCIe %s (current) / %s (max)" msgstr "" #: core.cpp:1650 #, fuzzy, c-format #| msgid "Driver for GPU %u doesn't report frequencies" msgid "Driver for %s doesn't report frequencies" msgstr "راه انداز پردازنده گرافیکی %u فرکانس ها را گزارش نمی دهد" #: core.cpp:1671 #, fuzzy, c-format #| msgid "failed to get all OpenCL platforms (%s)" msgid "failed to retrieve all monitoring data for %s" msgstr "دریافت ناموفق تمام پلتفرم های OpenCL (%s)" #: core.cpp:1694 msgid "Identifying running system" msgstr "در حال شناسایی سیستم در حال اجرا" #: core.cpp:1697 msgid "failed to identify running system" msgstr "شناسایی سیستم در حال اجرا ناموفق بود" #: core.cpp:1749 core.cpp:1778 msgid "Calling libprocps" msgstr "در حال فراخوانی libprocps" #: core.cpp:1752 msgid "unable to get system uptime" msgstr "دریافت زمان فعال بودن سیستم ممکن نیست" #: core.cpp:1758 msgid "unable to create meminfo structure" msgstr "" #: core.cpp:1804 msgid "Calling libstatgrab" msgstr "در حال فراخوانی libstatgrab" #: core.cpp:1852 #, c-format msgid "%i days, %i hours, %i minutes, %i seconds" msgstr "%i روز و %i ساعت و %i دقیقه و %i ثانیه" #: core.cpp:1915 msgid "Updating benchmark status" msgstr "در حال به روز رسانی وضعیت بررسی معیارها" #: core.cpp:1918 msgid "Active" msgstr "فعال" #: core.cpp:1921 #, c-format msgid "(%u hours left)" msgstr "(%u ساعت مانده)" #: core.cpp:1923 #, c-format msgid "(%u minutes left)" msgstr "(%u دقیقه مانده)" #: core.cpp:1925 #, c-format msgid "(%u seconds left)" msgstr "(%u ثانیه مانده)" #: core.cpp:1929 core.cpp:1984 core.cpp:1985 msgid "Inactive" msgstr "غیرفعال" #: core.cpp:1932 #, c-format msgid "in %u hours" msgstr "در %u ساعت" #: core.cpp:1934 #, c-format msgid "in %u minutes" msgstr "در %u دقیقه" #: core.cpp:1936 #, c-format msgid "in %u seconds" msgstr "در %u ثانیه" #: core.cpp:1953 #, fuzzy, c-format #| msgid "Starting benchmark" msgid "Starting benchmark with %u threads" msgstr "در حال آغاز بررسی معیارها" #: core.cpp:1976 msgid "an error occurred while starting benchmark" msgstr "خطایی در آغاز بررسی معیارها رخ داده است" #: core.cpp:2002 msgid "Finding CPU package in fallback mode" msgstr "در حال یافتن بسته پردازنده در حالت جایگزینی" #: core.cpp:2032 #, c-format msgid "Your CPU socket is not present in the database ==> %s, codename: %s" msgstr "سوکت پردازنده شما در پایگاه داده یافت نشد ==> %s, نام کد: %s" #: core.cpp:2052 msgid "Calculating CPU multipliers in fallback mode" msgstr "در حال محاسبه افزاینده های پردازنده در حالت جایگزینی" #: core.cpp:2072 msgid "Retrieving motherboard information in fallback mode" msgstr "در حال دریافت اطلاعات مادربرد در حالت جایگزینی" #: core.cpp:2085 msgid "failed to retrieve motherboard information (fallback mode)" msgstr "دریافت ناموفق اطلاعات مادربرد (حالت جایگزینی)" #: core.cpp:2127 msgid "Retrieving CPU temperature in fallback mode" msgstr "در حال دریافت دمای پردازنده در حالت جایگزینی" #: core.cpp:2173 msgid "failed to retrieve CPU temperature (fallback mode)" msgstr "دریافت ناموفق دمای پردازنده (حالت جایگزینی)" #: core.cpp:2188 msgid "Retrieving CPU voltage in fallback mode" msgstr "در حال دریافت ولتاژ پردازنده در حالت جایگزینی" #: core.cpp:2200 msgid "failed to retrieve CPU voltage (fallback mode)" msgstr "دریافت ناموفق ولتاژ پردازنده (حالت جایگزینی)" #: core.cpp:2214 msgid "Retrieving CPU frequency in fallback mode" msgstr "در حال دریافت فرکانس پردازنده در حالت جایگزینی" #: core.cpp:2220 msgid "failed to retrieve CPU frequency (fallback mode)" msgstr "دریافت ناموفق فرکانس پردازنده (حالت جایگزینی)" #: daemon_client.cpp:65 #, fuzzy #| msgid "Ask password to start daemon in background" msgid "Starting daemon in background…" msgstr "برای اجرای برنامه در پس زمینه رمز ورود دریافت شود" #: daemon_client.cpp:172 msgid "pkexec: authorization could not be obtained (dialog dismissed)" msgstr "pkexec: مجوزهای دسترسی دریافت نشد (جلوی باز شدن پنجره گرفته شد)" #: daemon_client.cpp:175 msgid "pkexec: authorization could not be obtained (not authorized)" msgstr "pkexec: مجوزهای دسترسی دریافت نشد (دسترسی مجاز نیست)" #: daemon_client.cpp:178 msgid "pkexec: command not found" msgstr "pkexec: دستور یافت نشد" #: daemon_client.cpp:181 msgid "pkexec: unexpected error code" msgstr "pkexec: کد خطای غیرمنتظره" #: daemon_client.cpp:211 #, fuzzy #| msgid "Connected to daemon" msgid "Connecting to daemon…" msgstr "ارتباط با برنامه پس زمینه برقرار شد" #: daemon_server.cpp:261 #, c-format msgid "request_handler: case %i not handled" msgstr "request_handler: مورد %i رسیدگی نشده است" #: data.cpp:124 cpu-x-gtk-3.12.ui:1370 msgid "CPU" msgstr "پردازنده" #: data.cpp:187 #, fuzzy #| msgid "Score" msgid "P-core" msgstr "امتیاز" #: data.cpp:188 msgid "E-core" msgstr "" #: data.cpp:189 data.cpp:192 #, fuzzy #| msgid "Core(s)" msgid "Core" msgstr "هسته (ها)" #: data.cpp:208 cpu-x-gtk-3.12.ui:746 msgid "Processor" msgstr "پردازنده" #: data.cpp:240 data.cpp:329 cpu-x-gtk-3.12.ui:1968 msgid "Caches" msgstr "کش" #: data.cpp:247 #, fuzzy, c-format #| msgid "%d x %d %s, %d-way" msgid "%2d x %4d %s, %2d-way" msgstr "%d x %d %s، %d-راه" #: data.cpp:249 #, c-format msgid "%d %s, %d-way" msgstr "%d %s، %d-راه" #: data.cpp:263 msgid "Count" msgstr "" #: data.cpp:276 cpu-x-gtk-3.12.ui:968 msgid "Clocks" msgstr "زمان سنج ها" #: data.cpp:379 data.cpp:383 #, fuzzy, c-format #| msgid "L%i Cache" msgid "L%u Cache" msgstr "کش L%i" #: data.cpp:385 #, c-format msgid "%s associative, %d-%s line size" msgstr "%s وابسته, %d-%s اندازه خط" #: data.cpp:398 msgid "Test" msgstr "آزمون" #: data.cpp:409 data.cpp:423 cpu-x-gtk-3.12.ui:2146 cpu-x-gtk-3.12.ui:2517 msgid "Motherboard" msgstr "مادربرد" #: data.cpp:437 cpu-x-gtk-3.12.ui:2367 msgid "BIOS" msgstr "بایوس" #: data.cpp:452 cpu-x-gtk-3.12.ui:2498 msgid "Chipset" msgstr "چیپست" #: data.cpp:467 data.cpp:569 cpu-x-gtk-3.12.ui:3156 cpu-x-gtk-3.12.ui:3761 msgid "Memory" msgstr "حافظه" #: data.cpp:483 #, c-format msgid "Stick %u" msgstr "" #: data.cpp:487 cpu-x-gtk-3.12.ui:3134 msgid "Sticks" msgstr "" #: data.cpp:541 cpu-x-gtk-3.12.ui:3780 msgid "System" msgstr "سیستم" #: data.cpp:554 cpu-x-gtk-3.12.ui:3380 msgid "Operating System" msgstr "سیستم عامل" #: data.cpp:587 cpu-x-gtk-3.12.ui:4960 msgid "Graphics" msgstr "گرافیک ها" #: data.cpp:621 #, fuzzy, c-format #| msgid "Card %i" msgid "Card %u" msgstr "کارت %i" #: data.cpp:625 cpu-x-gtk-3.12.ui:4938 msgid "Cards" msgstr "کارت ها" #: data.cpp:672 cpu-x-gtk-3.12.ui:5300 msgid "Bench" msgstr "نیمکت" #: data.cpp:685 msgid "Not started" msgstr "آغاز نشده" #: data.cpp:688 cpu-x-gtk-3.12.ui:5070 msgid "Prime numbers (slow)" msgstr "شماره های اولیه (آهسته)" #: data.cpp:692 cpu-x-gtk-3.12.ui:5178 msgid "Prime numbers (fast)" msgstr "شماره های اولیه (سریع)" #: data.cpp:696 cpu-x-gtk-3.12.ui:5281 msgid "Parameters" msgstr "پارامترها" #: data.cpp:721 data.cpp:727 #, c-format msgid "%u mins" msgstr "%u دقیقه" #: data.cpp:734 cpu-x-gtk-3.12.ui:5444 cpu-x-gtk-3.12.ui:5552 msgid "About" msgstr "درباره" #: data.cpp:739 #, c-format msgid "" "%s is a Free software that gathers information\n" "on CPU, motherboard and more." msgstr "" "%s یک نرم افزار مجانی است که اطلاعاتی\n" "در مورد پردازنده، مادربرد و غیره جمع آوری می کند." #: data.cpp:744 #, fuzzy #| msgid "About" msgid "About CPU-X" msgstr "درباره" #: data.cpp:745 #, c-format msgid "Version %s" msgstr "نسخه %s" #: data.cpp:746 #, c-format msgid "Author: %s" msgstr "نویسنده: %s" #: data.cpp:747 #, c-format msgid "Site: %s" msgstr "سایت: %s" #: data.cpp:751 cpu-x-gtk-3.12.ui:5533 msgid "License" msgstr "مجوز" #: data.cpp:753 #, c-format msgid "This software is distributed under the terms of %s" msgstr "این نرم افزار تحت ضوابط %s توزیع شده است" #: data.cpp:754 main.cpp:176 msgid "This program comes with ABSOLUTELY NO WARRANTY" msgstr "این برنامه به طور مطلق بدون ضمانت ارائه می شود" #: gui_gtk.cpp:61 #, c-format msgid "Cannot find path for '%s' file" msgstr "" #: gui_gtk.cpp:400 msgid "Start daemon" msgstr "اجرای برنامه در پس زمینه" #: gui_gtk.cpp:403 msgid "Connected to daemon" msgstr "ارتباط با برنامه پس زمینه برقرار شد" #: gui_gtk.cpp:406 msgid "No polkit authentication agent found" msgstr "عامل احراز هویت polkit پیدا نشد" #: gui_gtk.cpp:411 msgid "Ask password to start daemon in background" msgstr "برای اجرای برنامه در پس زمینه رمز ورود دریافت شود" #: gui_gtk.cpp:415 msgid "Settings" msgstr "" #: gui_gtk.cpp:634 msgid "BaseFamily" msgstr "خانواده پایه" #: gui_gtk.cpp:635 msgid "CPU display (\"true\") family (computed as BaseFamily+ExtendedFamily)" msgstr "" "نمایش خانواده پردازنده(\"true\") (محاسبه شده بر اساس " "BaseFamily+ExtendedFamily)" #: gui_gtk.cpp:636 msgid "BaseModel" msgstr "مدل پایه" #: gui_gtk.cpp:637 msgid "CPU display (\"true\") model (computed as (ExtendedModel<<4)+BaseModel)" msgstr "" "نمایش مدل پردازنده (\"true\") (محاسبه شده به صورت " "(ExtendedModel<<4)+BaseModel)" #: gui_gtk.cpp:847 msgid "" "Identify the physically-labeled socket or board position where the memory " "device is located" msgstr "" #: gui_gtk.cpp:848 msgid "Identify the physically labeled bank where the memory device is located" msgstr "" #: gui_gtk.cpp:1052 msgid "User Mode Driver Version" msgstr "نسخه راه انداز حالت کاربر" #: gui_gtk.cpp:1066 msgid "Vulkan Ray Tracing" msgstr "" #: gui_gtk.cpp:1260 msgid "Starting GTK GUI…" msgstr "در حال آغاز رابط کاربری گرافیکی GTK…" #: gui_gtk.cpp:1272 msgid "failed to import UI in GtkBuilder" msgstr "وارد کردن ناموفق رابط کاربری GtkBuilder" #: main.cpp:63 msgid "Start graphical user interface (GUI) (default)" msgstr "آغاز به صورت رابط کاربری گرافیکی (GUI) (پیش فرض)" #: main.cpp:64 msgid "Start text-based user interface (TUI)" msgstr "آغاز به صورت رابط کاربری متنی (TUI)" #: main.cpp:65 msgid "Dump all data on standard output and exit" msgstr "روبرداری از تمام اطلاعات در خروجی استاندارد و خروج" #: main.cpp:66 msgid "Run embedded command dmidecode and exit" msgstr "اجرای دستور تعبیه شده dmidecode و خروج" #: main.cpp:67 msgid "Run embedded command bandwidth and exit" msgstr "اجرای دستور تعبیه شده bandwidth و خروج" #: main.cpp:68 msgid "Set temperature unit (c[elsius]|f[ahrenheit]|k[elvin]|r[ankine])" msgstr "" #: main.cpp:69 msgid "Set custom time between two refreshes (in seconds)" msgstr "تنظیم زمان دلخواه بین دو بازآوری (به ثانیه)" #: main.cpp:70 msgid "Set default tab (integer)" msgstr "تنظیم تب پیش فرض (عددی)" #: main.cpp:71 msgid "Select core type to monitor (integer)" msgstr "انتخاب هسته پردازنده برای پایش (عدد)" #: main.cpp:72 msgid "Select CPU core to monitor (integer)" msgstr "انتخاب هسته پردازنده برای پایش (عددی)" #: main.cpp:73 msgid "Set custom bandwidth test for CPU caches speed (integer)" msgstr "تنظیم پهنای باند آزمون دلخواه برای سرعت کش پردازنده (عددی)" #: main.cpp:74 #, fuzzy #| msgid "Select default graphic card (integer)" msgid "Select default memory stick (integer)" msgstr "انتخاب کارت گرافیک پیش فرض (عددی)" #: main.cpp:75 msgid "Select default graphic card (integer)" msgstr "انتخاب کارت گرافیک پیش فرض (عددی)" #: main.cpp:76 cpu-x-gtk-3.12.ui:5910 msgid "Start and connect to daemon" msgstr "اجرا و اتصال به برنامه پس زمینه" #: main.cpp:77 msgid "Verbose output" msgstr "خروجی مفصل" #: main.cpp:78 msgid "Print help and exit" msgstr "چاپ راهنما و خروج" #: main.cpp:79 msgid "Print version and exit" msgstr "چاپ نسخه و خروج" #: main.cpp:80 msgid "Print CPUID values in decimal (default is hexadeximal)" msgstr "چاپ مقادیر CPUID به صورت decimal (پیش فرض hexadeximal است)" #: main.cpp:81 msgid "Disable colored output" msgstr "غیر فعال کردن خروجی رنگی" #: main.cpp:82 msgid "Print information for debugging" msgstr "چاپ اطلاعات برای اشکال زدایی" #: main.cpp:83 msgid "Print required information to paste in an issue" msgstr "چاپ اطلاعات مورد نیاز برای جایگزاری در یک موضوع" #: main.cpp:84 msgid "Set key mapping for NCurses mode (a[rrows]|e[macs]|i[nverted-T]|v[im])" msgstr "" "برای حالت NCurses نگاشت کلیدها را تنظیم کنید (a[rrows]|e[macs]|i[nverted-T]|" "v[im])" #: main.cpp:95 msgid "Add default command line arguments" msgstr "اضافه کردن آرگومان های پیش فرض خط فرمان" #: main.cpp:96 msgid "Enforce the bus clock" msgstr "از پیش تعیین کردن مقدار زمان سنج گذرگاه" #: main.cpp:97 msgid "" "Ignore CPU values reported by libcpuid (comma-separated values among 'temp', " "'volt' and 'freq')" msgstr "" #: main.cpp:98 msgid "Read CPUID raw data from a given file" msgstr "خواندن اطلاعات خام CPUID از فایل دریافتی" #: main.cpp:99 msgid "Only print a message if CPU is not present in the database" msgstr "در صورت نبودن پردازنده در پایگاه داده فقط یک پیغام نمایش داده شود" #: main.cpp:126 #, c-format msgid "Usage: %s DISPLAY [OPTIONS]\n" msgstr "مورد استفاده: %s [تنظیمات] نمایش\n" #: main.cpp:127 msgid "Available DISPLAY:" msgstr "نمایش در دسترس:" #: main.cpp:135 msgid "Available OPTIONS:" msgstr "تنظیمات در دسترس:" #: main.cpp:144 msgid "Influenceable environment variables:" msgstr "متغیر های محیطی تاثیرگذار:" #: main.cpp:175 msgid "This is free software: you are free to change and redistribute it." msgstr "" "این نرم افزار مجانی است: شما مجاز به اعمال تغییرات و توزیع دوباره آن هستید." #: main.cpp:177 #, c-format msgid "See the %s license: <%s>\n" msgstr "مشاهده مجوز %s: <%s>\n" #: main.cpp:184 #, c-format msgid "-- %-9s version: %s" msgstr "-- %-9s نسخه: %s" #: main.cpp:381 #, c-format msgid "" "\n" "Oops, something was wrong! %s has received signal %d (%s) and has crashed." msgstr "" "\n" "مشکلی پیش اومده. %s سیگنال ‮%d (%s) رو دریافت کرد و متوقف شده است." #: main.cpp:383 #, c-format msgid "" "\n" "Oops, something was wrong! %s has received signal %d (%s) and is trying to " "recover." msgstr "" "\n" "مشکلی پیش اومده. %s سیگنال ‮%d (%s)‌رو دریافت کرده و در حال تلاش برای بازیابی " "است." #: main.cpp:407 msgid "You can open a new issue here, by filling the template as requested:" msgstr "" #: main.cpp:449 msgid "an error occurred while setting locale" msgstr "خطایی در هنگام تنظیم زبان رخ داده است" #: options.cpp:124 #, c-format msgid "" "Selected CPU type (%u) is not a valid number (%u is the maximum for this CPU)" msgstr "نوع CPU انتخاب شده (%u)یک عدد معتبر نیست (%u حداکثر برای این CPU)" #: options.cpp:145 #, fuzzy, c-format #| msgid "" #| "Selected CPU type (%u) is not a valid number (%u is the maximum for this " #| "CPU)" msgid "" "Selected bandwidth test (%u) is not a valid number (%u is the maximum for " "this system)" msgstr "نوع CPU انتخاب شده (%u)یک عدد معتبر نیست (%u حداکثر برای این CPU)" #: options.cpp:168 #, fuzzy, c-format #| msgid "" #| "Selected CPU type (%u) is not a valid number (%u is the maximum for this " #| "CPU)" msgid "" "Selected RAM stick (%u) is not a valid number (%u is the maximum for this " "system)" msgstr "نوع CPU انتخاب شده (%u)یک عدد معتبر نیست (%u حداکثر برای این CPU)" #: options.cpp:188 #, fuzzy, c-format #| msgid "" #| "Selected CPU core (%u) is not a valid number (%u is the maximum for this " #| "type of core)" msgid "" "Selected graphic card (%u) is not a valid number (%u is the maximum for this " "system)" msgstr "" "هسته پردازنده انتخابی (%u) عدد معتبری نیست (%u حداکثر برای این نوع هسته است)" #: options.cpp:204 #, c-format msgid "failed to change CPU affinitiy to core %u" msgstr "" #: options.cpp:210 #, c-format msgid "" "Selected CPU core (%u) is not a valid number (%u is the maximum for this " "type of core)" msgstr "" "هسته پردازنده انتخابی (%u) عدد معتبری نیست (%u حداکثر برای این نوع هسته است)" #: options.cpp:284 #, fuzzy, c-format #| msgid "" #| "Selected CPU type (%u) is not a valid number (%u is the maximum for this " #| "CPU)" msgid "Selected tab (%u) is not a valid number (%u is the maximum)" msgstr "نوع CPU انتخاب شده (%u)یک عدد معتبر نیست (%u حداکثر برای این CPU)" #: tui_ncurses.cpp:111 msgid "Window is too small!" msgstr "پنجره خیلی کوجک است!" #: tui_ncurses.cpp:119 msgid "Press 'h' to see help." msgstr "برای مشاهده راهنما کلید 'h' را بفشارید." #: tui_ncurses.cpp:232 #, c-format msgid "Welcome in %s NCurses help!\n" msgstr "به راهنمای %s NCurses خوش آمدید!\n" #: tui_ncurses.cpp:233 msgid "This help describes how to use this Text-based User Interface." msgstr "این راهنما نحوه استفاده از این رابط کاربری متنی را توضیح می دهد." #: tui_ncurses.cpp:235 msgid "Global keys:" msgstr "کلیدهای عمومی:" #: tui_ncurses.cpp:236 msgid "Press 'left' key or 'tab' key to switch in left tab." msgstr "برای رفتن به سربرگ سمت چپ دکمه 'left' یا 'tab' را فشار دهید." #: tui_ncurses.cpp:237 msgid "Press 'right' key or 'shift + tab' keys to switch in right tab." msgstr "" "برای رفتن به سربرگ سمت راست دکمه 'right' یا 'shift + tab' را فشار دهید." #: tui_ncurses.cpp:238 msgid "Press 'h' key to see this help." msgstr "برای مشاهده این راهنما کلید 'h' را بفشارید." #: tui_ncurses.cpp:239 msgid "Press 'q' key to exit." msgstr "برای خروج کلید 'q' را بفشارید." #: tui_ncurses.cpp:241 msgid "CPU tab:" msgstr "تب پردازنده:" #: tui_ncurses.cpp:242 #, fuzzy #| msgid "Press 'down' key to decrease core number to monitor." msgid "Press 'next page' key to decrease core type number to monitor." msgstr "برای کاهش تعداد هسته جهت پایش کلید 'down' را بفشارید." #: tui_ncurses.cpp:243 #, fuzzy #| msgid "Press 'up' key to increase core number to monitor." msgid "Press 'previous page' key to increase core type number to monitor." msgstr "برای افزایش تعداد هسته جهت پایش کلید 'up' را بفشارید." #: tui_ncurses.cpp:244 #, fuzzy #| msgid "Press 'down' key to decrease core number to monitor." msgid "Press 'down' key to decrease CPU core number to monitor." msgstr "برای کاهش تعداد هسته جهت پایش کلید 'down' را بفشارید." #: tui_ncurses.cpp:245 #, fuzzy #| msgid "Press 'up' key to increase core number to monitor." msgid "Press 'up' key to increase CPU core number to monitor." msgstr "برای افزایش تعداد هسته جهت پایش کلید 'up' را بفشارید." #: tui_ncurses.cpp:247 msgid "Caches tab:" msgstr "تب کش:" #: tui_ncurses.cpp:248 msgid "Press 'down' key to switch to previous test." msgstr "برای رفتن به آزمون قبلی کلید 'down' را بفشارید." #: tui_ncurses.cpp:249 #, fuzzy #| msgid "Press 'up' key' to switch to next test." msgid "Press 'up' key to switch to next test." msgstr "برای رفتن به آزمون بعدی کلید 'up' را بفشارید." #: tui_ncurses.cpp:251 msgid "Bench tab:" msgstr "تب معیارسنجی:" #: tui_ncurses.cpp:252 msgid "Press 'down' key to decrement benchmark duration." msgstr "برای کاهش مدت زمان معیارسنجی کلید 'down' را بفشارید." #: tui_ncurses.cpp:253 msgid "Press 'up' key to increment benchmark duration." msgstr "برای افزایش مدت زمان معیارسنجی کلید 'up' را بفشارید." #: tui_ncurses.cpp:254 msgid "Press 'next page' key to decrement number of threads to use." msgstr "برای کاهش تعداد رشته هابرای استفاده کلید 'next page' را بفشارید." #: tui_ncurses.cpp:255 msgid "Press 'previous page' key to increment number of threads to use." msgstr "برای افزایش تعداد رشته هابرای استفاده کلید 'previous page' را بفشارید." #: tui_ncurses.cpp:256 msgid "Press 's' key to start/stop prime numbers (slow) benchmark." msgstr "برای اجرا/توقف تعداد پایه معیارسنجی (آهسته) کلید 's' را بفشارید." #: tui_ncurses.cpp:257 msgid "Press 'f' key to start/stop prime numbers (fast) benchmark." msgstr "برای اجرا/توقف تعداد پایه معیارسنجی (سریع) کلید 'f' را بفشارید." #: tui_ncurses.cpp:259 msgid "Graphics tab:" msgstr "تب گرافیک:" #: tui_ncurses.cpp:260 msgid "Press 'down' key to switch to previous graphic card." msgstr "برای رفتن به کارت گرافیک قبلی کلید 'down' را بفشارید." #: tui_ncurses.cpp:261 msgid "Press 'up' key to switch to next graphic card." msgstr "برای رفتن به کارت گرافیک بعدی کلید 'up' را بفشارید." #: tui_ncurses.cpp:263 msgid "Press any key to exit this help." msgstr "برای خروج از این راهنما یک کلید را بفشارید." #: tui_ncurses.cpp:640 msgid "Starting NCurses TUI…" msgstr "در حال اجرای رابط کاربری متنی NCurses…" #: tui_ncurses.cpp:649 msgid "" "FATAL ERROR: terminfo database could not be found (try to set TERMINFO " "environment variable)" msgstr "" "خطای بحرانی: پایگاه داده terminfo یافت نشد (متغیر محیطی TERMINFO را تنظیم " "کنید)" #: tui_ncurses.cpp:654 #, c-format msgid "Failed to set up %s terminal (err=%i); falling back to %s" msgstr "راه اندازی ناموفق ترمینال %s (err=%i); برگشتن به %s" #: util.cpp:189 #, c-format msgid "cannot find unit in '%s' string at position %i" msgstr "واحدی در متن '%s' در موقعیت %i یافت نشد" #: util.cpp:252 #, fuzzy, c-format #| msgid "an error occurred while opening file '%s' (%s)" msgid "an error occurred while opening file '%s'" msgstr "خطایی در هنگام باز کردن فایل '%s' رخ داده است (%s)" #: util.cpp:297 #, fuzzy, c-format #| msgid "an error occurred while running command '%s' (%s)" msgid "an error occurred while running command '%s'" msgstr "خطایی در هنگام اجرای دستور '%s' رخ داده است (%s)" #: util.cpp:437 msgid "set_cpu_affinity() not supported on this operating system" msgstr "" #: data.hpp:103 data.hpp:244 data.hpp:332 msgid "Vendor" msgstr "سازنده" #: data.hpp:104 msgid "Code Name" msgstr "نام کد" #: data.hpp:105 msgid "Package" msgstr "بسته" #: data.hpp:106 msgid "Technology" msgstr "فناوری" #: data.hpp:107 data.hpp:268 msgid "Voltage" msgstr "ولتاژ" #: data.hpp:108 msgid "Specification" msgstr "مشخصه" #: data.hpp:109 msgid "Family" msgstr "خانواده" #: data.hpp:110 msgid "Disp. Family" msgstr "خانواده نمایشی" #: data.hpp:111 data.hpp:224 data.hpp:245 data.hpp:335 msgid "Model" msgstr "مدل" #: data.hpp:112 msgid "Disp. Model" msgstr "مدل نمایشی" #: data.hpp:113 msgid "Temp." msgstr "دما" #: data.hpp:114 msgid "Stepping" msgstr "مرحله به مرحله کردن" #: data.hpp:115 msgid "Instructions" msgstr "دستورالعمل ها" #: data.hpp:125 msgid "L1 Data" msgstr "داده L1" #: data.hpp:126 msgid "L1 Inst." msgstr "کش دستورالعمل L1" #: data.hpp:127 msgid "Level 2" msgstr "سطح 2" #: data.hpp:128 msgid "Level 3" msgstr "سطح 3" #: data.hpp:137 cpu-x-gtk-3.12.ui:1232 msgid "Cores" msgstr "هسته‌ها" #: data.hpp:138 data.hpp:408 cpu-x-gtk-3.12.ui:1252 msgid "Threads" msgstr "رشته ها" #: data.hpp:155 msgid "Core Speed" msgstr "سرعت هسته" #: data.hpp:156 msgid "Multiplier" msgstr "افزاینده" #: data.hpp:157 msgid "Bus Speed" msgstr "سرعت گذرگاه" #: data.hpp:158 data.hpp:341 msgid "Usage" msgstr "میزان استفاده" #: data.hpp:188 data.hpp:265 msgid "Size" msgstr "اندازه" #: data.hpp:189 data.hpp:267 msgid "Speed" msgstr "سرعت" #: data.hpp:223 data.hpp:259 msgid "Manufacturer" msgstr "سازنده" #: data.hpp:225 msgid "Revision" msgstr "اصلاحیه" #: data.hpp:233 msgid "Brand" msgstr "نام تجاری" #: data.hpp:234 msgid "Version" msgstr "نسخه" #: data.hpp:235 msgid "Date" msgstr "تاریخ" #: data.hpp:236 msgid "ROM Size" msgstr "اندازه ROM" #: data.hpp:260 msgid "Part Number" msgstr "" #: data.hpp:261 #, fuzzy #| msgid "Core #%i" msgid "Type" msgstr "هسته #%i" #: data.hpp:262 #, fuzzy #| msgid "Core #%i" msgid "Type Detail" msgstr "هسته #%i" #: data.hpp:263 msgid "Device Locator" msgstr "" #: data.hpp:264 msgid "Bank Locator" msgstr "" #: data.hpp:266 msgid "Rank" msgstr "" #: data.hpp:292 #, fuzzy #| msgid "Code Name" msgid "Name" msgstr "نام کد" #: data.hpp:293 msgid "Kernel" msgstr "هسته اصلی" #: data.hpp:294 msgid "Hostname" msgstr "نام هاست" #: data.hpp:295 msgid "Uptime" msgstr "مدت زمان اجرا" #: data.hpp:303 msgid "Used" msgstr "استفاده شده" #: data.hpp:304 msgid "Buffers" msgstr "بافرها" #: data.hpp:305 msgid "Cached" msgstr "کش شده" #: data.hpp:306 msgid "Free" msgstr "آزاد" #: data.hpp:307 msgid "Swap" msgstr "جایگزین" #: data.hpp:333 msgid "Driver" msgstr "راه انداز" #: data.hpp:334 msgid "UMD Version" msgstr "نسخه UMD" #: data.hpp:336 msgid "Compute Unit" msgstr "واحد محاسبه" #: data.hpp:337 #, fuzzy #| msgid "DeviceID" msgid "Device ID" msgstr "شناسه دستگاه" #: data.hpp:338 msgid "VBIOS Version" msgstr "نسخه VBIOS" #. #-#-#-#-# source_ui.pot (cpu-x ) #-#-#-#-# #. Setting: "Interface" tab #: data.hpp:339 cpu-x-gtk-3.12.ui:5807 msgid "Interface" msgstr "رابط" #: data.hpp:340 msgid "Temperature" msgstr "دما" #: data.hpp:342 msgid "Core Voltage" msgstr "ولتاژ هسته" #: data.hpp:343 msgid "Power Avg" msgstr "قدرت میانگین" #: data.hpp:344 #, fuzzy #| msgid "Memory clock" msgid "Core Clock" msgstr "زمان سنج حافظه" #: data.hpp:345 #, fuzzy #| msgid "Memory clock" msgid "Memory Clock" msgstr "زمان سنج حافظه" #: data.hpp:346 msgid "Memory Used" msgstr "حافظه استفاده شده" #: data.hpp:347 msgid "Resizable BAR" msgstr "BAR قابل تغییر اندازه" #: data.hpp:348 msgid "Vulkan RT" msgstr "" #: data.hpp:349 msgid "OpenGL Version" msgstr "نسخه OpenGL" #: data.hpp:350 msgid "Vulkan Version" msgstr "نسخه Vulkan" #: data.hpp:351 msgid "OpenCL Version" msgstr "نسخه OpenCL" #: data.hpp:387 msgid "Score" msgstr "امتیاز" #: data.hpp:388 msgid "Run" msgstr "اجرا" #: data.hpp:407 msgid "Duration" msgstr "مدت زمان" #: util.hpp:77 msgid "bytes" msgstr "بایت" #. TRANSLATORS: initials for kilobyte (10³): please put initials (keep it short) #: util.hpp:80 msgid "kB" msgstr "کیلوبایت" #. TRANSLATORS: initials for megabyte (10⁶): please put initials (keep it short) #: util.hpp:82 msgid "MB" msgstr "مگابایت" #. TRANSLATORS: initials for gigabyte (10⁹): please put initials (keep it short) #: util.hpp:84 msgid "GB" msgstr "گیگابایت" #. TRANSLATORS: initials for terabyte (10¹²): please put initials (keep it short) #: util.hpp:86 msgid "TB" msgstr "ترابایت" #. TRANSLATORS: initials for kibibyte (2¹⁰): please put initials (keep it short) #: util.hpp:89 msgid "KiB" msgstr "کیلوبایت" #. TRANSLATORS: initials for mebibyte (2²⁰): please put initials (keep it short) #: util.hpp:91 msgid "MiB" msgstr "مگابایت" #. TRANSLATORS: initials for gibibyte (2³⁰): please put initials (keep it short) #: util.hpp:93 msgid "GiB" msgstr "گیگابایت" #. TRANSLATORS: initials for tebibyte (2⁴⁰): please put initials (keep it short) #: util.hpp:95 msgid "TiB" msgstr "ترابایت" #: cpu-x-gtk-3.12.ui:1184 msgid "Cache" msgstr "کش" #. Setting: refresh time for UI #: cpu-x-gtk-3.12.ui:5721 msgid "Refresh time" msgstr "زمان تازه‌سازی" #. Setting: GUI theme #: cpu-x-gtk-3.12.ui:5745 #, fuzzy #| msgid "Theme" msgid "Text theme" msgstr "تم" #. Setting: automatic GUI theme #: cpu-x-gtk-3.12.ui:5760 msgid "Automatic" msgstr "خودکار" #. Setting: light GUI theme #: cpu-x-gtk-3.12.ui:5761 msgid "Blue for light theme" msgstr "" #. Setting: dark GUI theme #: cpu-x-gtk-3.12.ui:5762 msgid "Yellow for dark theme" msgstr "" #. Setting: temperature unit #: cpu-x-gtk-3.12.ui:5775 #, fuzzy #| msgid "Temperature" msgid "Temperature unit" msgstr "دما" #. Setting: default tab at startup #: cpu-x-gtk-3.12.ui:5826 msgid "Default tab" msgstr "سربرگ پیش‌فرض" #. Setting: default CPU core at startup #: cpu-x-gtk-3.12.ui:5839 msgid "Default CPU core" msgstr "هسته CPU پیش‌فرض" #. Setting: default cache test at startup #: cpu-x-gtk-3.12.ui:5852 msgid "Default cache test" msgstr "تست کش پیش‌فرض" #. Setting: print CPUID values in decimal or hexadecimal #: cpu-x-gtk-3.12.ui:5895 msgid "Print CPUID values in decimal" msgstr "چاپ مقادیر CPUID به صورت اعشاری" #. Setting: default graphic card at startup #: cpu-x-gtk-3.12.ui:5928 msgid "Default graphic card" msgstr "کارت گرافیک پیش فرض" #. Setting: default CPU core at startup #: cpu-x-gtk-3.12.ui:5952 msgid "Default core type" msgstr "" #. Setting: default graphic card at startup #: cpu-x-gtk-3.12.ui:5976 #, fuzzy #| msgid "Default cache test" msgid "Default memory stick" msgstr "تست کش پیش‌فرض" #. Setting: "Startup" tab #: cpu-x-gtk-3.12.ui:6004 msgid "Startup" msgstr "راه‌اندازی" #~ msgid "Light" #~ msgstr "روشن" #~ msgid "Dark" #~ msgstr "تیره" #~ msgid "Calculating CPU multipliers" #~ msgstr "در حال محاسبه ضریب‌های پردازنده" #, c-format #~ msgid "Current: PCIe Gen%1dx%d / Max: Gen%1dx%d" #~ msgstr "جاری: PCIe Gen%1dx%d / بیشینه: Gen%1dx%d" #~ msgid "failed to retrieve GPU clocks" #~ msgstr "دریافت ناموفق زمان سنج های پردازنده گرافیکی" #, c-format #~ msgid "Core #%i" #~ msgstr "هسته #%i" #~ msgid "Setting label names" #~ msgstr "تنظیم نام برچسب ها" #, c-format #~ msgid "Bank %i" #~ msgstr "بانک %i" #~ msgid "Reference" #~ msgstr "ارجاع" #~ msgid "Distribution" #~ msgstr "توزیع" #~ msgid "Compiler" #~ msgstr "کامپایلر" #~ msgid "GPU clock" #~ msgstr "زمان سنج پردازنده" #~ msgid "Dumping data…" #~ msgstr "در حال روبرداری اطلاعات…" #~ msgid "Freeing memory" #~ msgstr "آزادسازی حافظه" #~ msgid "Ignore CPU frequency reported by libcpuid" #~ msgstr "چشم پوشی از فرکانس پردازنده گزارش شده توسط libcpuid" #, c-format #~ msgid "failed to call wordexp (%i)" #~ msgstr "خطا در فراخوانی wordexp (%i)" #~ msgid "Press 'home' key to scroll up in a page." #~ msgstr "برای اسکرول به سمت بالا دکمه 'home' را فشار دهید." #~ msgid "Press 'end' key to scroll down in a page." #~ msgstr "برای اسکرول به سمت پایین دکمه 'end' را فشار دهید." #, c-format #~ msgid "String '%s' is too long, truncating…" #~ msgstr "متن '%s' خیلی طولانی است، در حال کوتاه کردن…" #, c-format #~ msgid "failed to open %s directory" #~ msgstr "خطا در باز کردن مسیر %s" #~ msgid "an error occurred while compiling regex" #~ msgstr "خطایی در هنگام کامپایل regex رخ داده است" #~ msgid "FATAL ERROR: could not allocate memory" #~ msgstr "خطای بحرانی: امکان تخصیص حافظه وجود ندارد" #, fuzzy, c-format #~| msgid "failed to call wordexp (%i)" #~ msgid "failed to call vkEnumerateInstanceExtensionProperties (%s)" #~ msgstr "خطا در فراخوانی wordexp (%i)" #, c-format #~ msgid "%s" #~ msgstr "%s" #, fuzzy #~| msgid "There is no platform with OpenCL support (%s)" #~ msgid "There is no device with Vulkan support" #~ msgstr "پلتفرمی با پشتیبانی از OpenCL وجود ندارد (%s)" #~ msgid "Socket(s)" #~ msgstr "سوکت (ها)" #~ msgid "Thread(s)" #~ msgstr "رشته (ها)" #~ msgid "You can paste this backtrace by opening a new issue here:" #~ msgstr "" #~ "شما می توانید این روند را با ایجاد یک موضوع جدید در اینجا جایگزاری کنید:" CPU-X-5.0.3/po/fi.po000066400000000000000000000772261454622605200137530ustar00rootroot00000000000000# CPU-X translations template # Copyright © 2014-2024 The Tumultuous Unicorn Of Darkness # This file is distributed under the same license as the cpu-x package. # Riku Viitanen , 2020. # Jiri Grönroos , 2021, 2022, 2023. # LINUX-SAUNA , 2022. msgid "" msgstr "" "Project-Id-Version: cpu-x\n" "Report-Msgid-Bugs-To: https://github.com/TheTumultuousUnicornOfDarkness/CPU-" "X/issues\n" "POT-Creation-Date: 2023-12-09 13:09+0100\n" "PO-Revision-Date: 2023-11-18 18:03+0000\n" "Last-Translator: Jiri Grönroos \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.2\n" #: core.cpp:135 msgid "Finding CPU technology" msgstr "Etsitään suoritinteknologia" #: core.cpp:161 #, c-format msgid "" "Your CPU is not present in the database ==> %s, model: %i, ext. model: %i, " "ext. family: %i" msgstr "" "Suorittimesi tietoja ei ole tietokannassa ==> %s, model: %i, ext. model: %i, " "ext. family: %i" #: core.cpp:189 data.cpp:150 data.cpp:342 msgid "unknown" msgstr "tuntematon" #: core.cpp:230 msgid "Calling libcpuid for retrieving static data" msgstr "" #: core.cpp:245 #, c-format msgid "failed to call libcpuid (%s)" msgstr "libcpuid:n kutsuminen epäonnistui (%s)" #: core.cpp:340 msgid "Calling libcpuid for retrieving dynamic data" msgstr "Kutsutaan libcpuid jotta saadaan noudettua dynaaminen data" #: core.cpp:353 msgid "Calling libcpuid for retrieving CPU MSR static values" msgstr "" #: core.cpp:380 msgid "Calling libcpuid for retrieving CPU MSR dynamic values" msgstr "" #: core.cpp:412 msgid "Calling dmidecode" msgstr "Kutsutaan dmidecodea" #: core.cpp:454 core.cpp:473 #, c-format msgid "%s (configured)" msgstr "" #: core.cpp:461 core.cpp:480 #, c-format msgid "%s (max)" msgstr "" #: core.cpp:466 #, c-format msgid "%s (min)" msgstr "" #: core.cpp:496 msgid "Calculating CPU usage" msgstr "Lasketaan prosessorinkäyttö" #: core.cpp:546 msgid "Calling bandwidth" msgstr "Kutsutaan kaistanleveyttä" #: core.cpp:613 #, c-format msgid "" "pci_access is not properly initialized: it is a common issue when %s was " "built with a lower libpci version.\n" "Check that libpci %s library is present on your system. Otherwise, please " "rebuild %s." msgstr "" #: core.cpp:657 #, c-format msgid "No kernel driver in use for graphic card at path %s" msgstr "" #: core.cpp:693 #, c-format msgid "Your GPU kernel driver is unknown: %s" msgstr "Näytönohjaimen kernel-ajuri on tuntematon: %s" #: core.cpp:777 #, fuzzy, c-format #| msgid "Your GPU driver is unknown: %s" msgid "Your GPU user mode driver is unknown for vendor %s: %s" msgstr "Tuntematon näytönohjaimen ajuri: %s" #: core.cpp:781 #, c-format msgid "failed to call GLFW (%i): %s" msgstr "GLFW:n (%i) kutsuminen epäonnistui: %s" #: core.cpp:914 msgid "Finding Vulkan API version" msgstr "Etsitään Vulkanin API-versiota" #: core.cpp:926 #, fuzzy, c-format #| msgid "failed to call libcpuid (%s)" msgid "failed to call vkCreateInstance (%s)" msgstr "libcpuid:n kutsuminen epäonnistui (%s)" #: core.cpp:929 #, c-format msgid "%s is not supported" msgstr "%s ei ole tuettu" #: core.cpp:937 #, fuzzy, c-format #| msgid "failed to call libcpuid (%s)" msgid "failed to call vkEnumeratePhysicalDevices (%s)" msgstr "libcpuid:n kutsuminen epäonnistui (%s)" #: core.cpp:944 msgid "No available Vulkan devices" msgstr "Vulkan-laitteita ei ole käytettävissä" #: core.cpp:952 #, c-format msgid "No available physical devices (%s)" msgstr "Ei käytettävissä olevia fyysisiä laitteita (%s)" #: core.cpp:1015 #, fuzzy, c-format #| msgid "failed to call libcpuid (%s)" msgid "Failed to create Vulkan for device %u (%s)" msgstr "libcpuid:n kutsuminen epäonnistui (%s)" #: core.cpp:1019 #, c-format msgid "%s is not supported for device %u, use only deviceID for matching" msgstr "" #: core.cpp:1051 core.cpp:1364 msgid "Enabled" msgstr "Käytössä" #: core.cpp:1051 core.cpp:1364 msgid "Disabled" msgstr "Ei käytössä" #: core.cpp:1088 msgid "Finding OpenCL API version" msgstr "Etsitään OpenCL:n API-versiota" #: core.cpp:1092 #, c-format msgid "There is no platform with OpenCL support (%s)" msgstr "Ei alustaa OpenCL-tuella (%s)" #: core.cpp:1102 #, fuzzy, c-format #| msgid "failed to call libcpuid (%s)" msgid "failed to get all OpenCL platforms (%s)" msgstr "libcpuid:n kutsuminen epäonnistui (%s)" #: core.cpp:1115 #, c-format msgid "failed to get name for platform %u (%s)" msgstr "" #: core.cpp:1123 #, c-format msgid "failed to get version for platform %u (%s)" msgstr "" #: core.cpp:1131 #, c-format msgid "failed to find number of OpenCL devices for platform '%s %s' (%s)" msgstr "" #: core.cpp:1131 #, fuzzy #| msgid "DeviceID" msgid "0 device" msgstr "Laite-ID" #: core.cpp:1140 #, c-format msgid "failed to get all of OpenCL devices for platform '%s %s' (%s)" msgstr "" #: core.cpp:1160 #, fuzzy, c-format #| msgid "failed to call libcpuid (%s)" msgid "failed to get name for device %u (%s)" msgstr "libcpuid:n kutsuminen epäonnistui (%s)" #: core.cpp:1168 #, c-format msgid "failed to get version for device %u (%s)" msgstr "" #: core.cpp:1190 #, c-format msgid "OpenCL driver for '%s %s' does not support CL_DEVICE_TOPOLOGY_AMD (%s)" msgstr "" #: core.cpp:1201 #, c-format msgid "" "OpenCL driver for '%s %s' does not support CL_DEVICE_GFXIP_MAJOR_AMD (%s)" msgstr "" #: core.cpp:1209 core.cpp:1229 core.cpp:1262 #, c-format msgid "" "OpenCL driver for '%s %s' does not support CL_DEVICE_MAX_COMPUTE_UNITS (%s)" msgstr "" #: core.cpp:1250 #, c-format msgid "" "OpenCL driver for '%s %s' does not support CL_DEVICE_PCI_DOMAIN_ID_NV (%s), " "CL_DEVICE_PCI_BUS_ID_NV (%s) or CL_DEVICE_PCI_SLOT_ID_NV (%s)" msgstr "" #: core.cpp:1273 #, c-format msgid "OpenCL is not supported with your GPU vendor (0x%X)" msgstr "" #: core.cpp:1295 msgid "Finding devices" msgstr "Etsitään laitteita" #: core.cpp:1307 #, c-format msgid "Skip devices search (wrong permissions on %s device)" msgstr "" #: core.cpp:1350 #, fuzzy, c-format #| msgid "Your GPU driver is unknown: %s" msgid "Your GPU vendor is unknown: %s (0x%X)" msgstr "Tuntematon näytönohjaimen ajuri: %s" #: core.cpp:1370 msgid "failed to find chipset vendor and model" msgstr "" #: core.cpp:1385 msgid "failed to find graphic card vendor and model" msgstr "" #: core.cpp:1487 msgid "Retrieving GPU clocks" msgstr "Haetaan GPU-kellotaajuuksia" #: core.cpp:1500 msgid "None" msgstr "Ei mitään" #: core.cpp:1509 #, c-format msgid "DRM path for %s is unknown" msgstr "" #: core.cpp:1516 #, c-format msgid "Card number for %s is unknown" msgstr "" #: core.cpp:1541 #, c-format msgid "PCIe %s (current) / %s (max)" msgstr "" #: core.cpp:1650 #, fuzzy, c-format #| msgid "Driver for GPU %u doesn't report frequencies" msgid "Driver for %s doesn't report frequencies" msgstr "GPU %u:n ajuri ei raportoi taajuuksia" #: core.cpp:1671 #, fuzzy, c-format #| msgid "failed to call libcpuid (%s)" msgid "failed to retrieve all monitoring data for %s" msgstr "libcpuid:n kutsuminen epäonnistui (%s)" #: core.cpp:1694 msgid "Identifying running system" msgstr "Tunnistetaan käynnissä olevaa järjestelmää" #: core.cpp:1697 msgid "failed to identify running system" msgstr "" #: core.cpp:1749 core.cpp:1778 msgid "Calling libprocps" msgstr "Kutsutaan libprocps:ää" #: core.cpp:1752 msgid "unable to get system uptime" msgstr "" #: core.cpp:1758 msgid "unable to create meminfo structure" msgstr "" #: core.cpp:1804 msgid "Calling libstatgrab" msgstr "Kutsutaan libstatgrabia" #: core.cpp:1852 #, c-format msgid "%i days, %i hours, %i minutes, %i seconds" msgstr "%i päivää, %i tuntia, %i minuuttia, %i sekuntia" #: core.cpp:1915 msgid "Updating benchmark status" msgstr "" #: core.cpp:1918 msgid "Active" msgstr "Aktiivinen" #: core.cpp:1921 #, c-format msgid "(%u hours left)" msgstr "(%u tuntia jäljellä)" #: core.cpp:1923 #, c-format msgid "(%u minutes left)" msgstr "(%u minuuttia jäljellä)" #: core.cpp:1925 #, c-format msgid "(%u seconds left)" msgstr "(%u sekuntia jäljellä)" #: core.cpp:1929 core.cpp:1984 core.cpp:1985 msgid "Inactive" msgstr "Ei aktiivinen" #: core.cpp:1932 #, c-format msgid "in %u hours" msgstr "%u tunnissa" #: core.cpp:1934 #, c-format msgid "in %u minutes" msgstr "%u minuutissa" #: core.cpp:1936 #, c-format msgid "in %u seconds" msgstr "%u sekunnissa" #: core.cpp:1953 #, fuzzy, c-format #| msgid "Starting benchmark" msgid "Starting benchmark with %u threads" msgstr "Aloitetaan suorituskykymittausta" #: core.cpp:1976 msgid "an error occurred while starting benchmark" msgstr "suorituskykymittausta aloittaessa tapahtui virhe" #: core.cpp:2002 msgid "Finding CPU package in fallback mode" msgstr "" #: core.cpp:2032 #, c-format msgid "Your CPU socket is not present in the database ==> %s, codename: %s" msgstr "" #: core.cpp:2052 msgid "Calculating CPU multipliers in fallback mode" msgstr "" #: core.cpp:2072 msgid "Retrieving motherboard information in fallback mode" msgstr "" #: core.cpp:2085 msgid "failed to retrieve motherboard information (fallback mode)" msgstr "" #: core.cpp:2127 msgid "Retrieving CPU temperature in fallback mode" msgstr "" #: core.cpp:2173 msgid "failed to retrieve CPU temperature (fallback mode)" msgstr "" #: core.cpp:2188 msgid "Retrieving CPU voltage in fallback mode" msgstr "" #: core.cpp:2200 msgid "failed to retrieve CPU voltage (fallback mode)" msgstr "" #: core.cpp:2214 msgid "Retrieving CPU frequency in fallback mode" msgstr "" #: core.cpp:2220 msgid "failed to retrieve CPU frequency (fallback mode)" msgstr "" #: daemon_client.cpp:65 #, fuzzy #| msgid "Ask password to start daemon in background" msgid "Starting daemon in background…" msgstr "Kysy salasana taustapalvelun käynnistämiseksi" #: daemon_client.cpp:172 msgid "pkexec: authorization could not be obtained (dialog dismissed)" msgstr "" #: daemon_client.cpp:175 msgid "pkexec: authorization could not be obtained (not authorized)" msgstr "" #: daemon_client.cpp:178 msgid "pkexec: command not found" msgstr "pkexec: komentoa ei löytynyt" #: daemon_client.cpp:181 msgid "pkexec: unexpected error code" msgstr "pkexec: odottamaton virhekoodi" #: daemon_client.cpp:211 #, fuzzy #| msgid "Connected to daemon" msgid "Connecting to daemon…" msgstr "Yhdistetty daemoniin" #: daemon_server.cpp:261 #, c-format msgid "request_handler: case %i not handled" msgstr "" #: data.cpp:124 cpu-x-gtk-3.12.ui:1370 msgid "CPU" msgstr "Suoritin" #: data.cpp:187 msgid "P-core" msgstr "P-ydin" #: data.cpp:188 msgid "E-core" msgstr "E-ydin" #: data.cpp:189 data.cpp:192 msgid "Core" msgstr "Ydin" #: data.cpp:208 cpu-x-gtk-3.12.ui:746 msgid "Processor" msgstr "Prosessori" #: data.cpp:240 data.cpp:329 cpu-x-gtk-3.12.ui:1968 msgid "Caches" msgstr "Välimuistit" #: data.cpp:247 #, c-format msgid "%2d x %4d %s, %2d-way" msgstr "" #: data.cpp:249 #, c-format msgid "%d %s, %d-way" msgstr "" #: data.cpp:263 msgid "Count" msgstr "" #: data.cpp:276 cpu-x-gtk-3.12.ui:968 msgid "Clocks" msgstr "Kellotaajuudet" #: data.cpp:379 data.cpp:383 #, c-format msgid "L%u Cache" msgstr "L%u-välimuisti" #: data.cpp:385 #, c-format msgid "%s associative, %d-%s line size" msgstr "" #: data.cpp:398 msgid "Test" msgstr "Testaa" #: data.cpp:409 data.cpp:423 cpu-x-gtk-3.12.ui:2146 cpu-x-gtk-3.12.ui:2517 msgid "Motherboard" msgstr "Emolevy" #: data.cpp:437 cpu-x-gtk-3.12.ui:2367 msgid "BIOS" msgstr "BIOS" #: data.cpp:452 cpu-x-gtk-3.12.ui:2498 msgid "Chipset" msgstr "Piirisarja" #: data.cpp:467 data.cpp:569 cpu-x-gtk-3.12.ui:3156 cpu-x-gtk-3.12.ui:3761 msgid "Memory" msgstr "Muisti" #: data.cpp:483 #, c-format msgid "Stick %u" msgstr "" #: data.cpp:487 cpu-x-gtk-3.12.ui:3134 msgid "Sticks" msgstr "" #: data.cpp:541 cpu-x-gtk-3.12.ui:3780 msgid "System" msgstr "Järjestelmä" #: data.cpp:554 cpu-x-gtk-3.12.ui:3380 msgid "Operating System" msgstr "Käyttöjärjestelmä" #: data.cpp:587 cpu-x-gtk-3.12.ui:4960 msgid "Graphics" msgstr "Grafiikka" #: data.cpp:621 #, c-format msgid "Card %u" msgstr "Kortti %u" #: data.cpp:625 cpu-x-gtk-3.12.ui:4938 msgid "Cards" msgstr "Kortit" #: data.cpp:672 cpu-x-gtk-3.12.ui:5300 msgid "Bench" msgstr "Mittaus" #: data.cpp:685 msgid "Not started" msgstr "Ei aloitettu" #: data.cpp:688 cpu-x-gtk-3.12.ui:5070 msgid "Prime numbers (slow)" msgstr "Alkuluvut (hidas)" #: data.cpp:692 cpu-x-gtk-3.12.ui:5178 msgid "Prime numbers (fast)" msgstr "Alkuluvut (nopea)" #: data.cpp:696 cpu-x-gtk-3.12.ui:5281 msgid "Parameters" msgstr "Parametrit" #: data.cpp:721 data.cpp:727 #, c-format msgid "%u mins" msgstr "%u minuuttia" #: data.cpp:734 cpu-x-gtk-3.12.ui:5444 cpu-x-gtk-3.12.ui:5552 msgid "About" msgstr "Tietoa" #: data.cpp:739 #, c-format msgid "" "%s is a Free software that gathers information\n" "on CPU, motherboard and more." msgstr "" "%s on vapaa ohjelmisto joka kerää tietoa\n" "suorittimesta, emolevystä ja muusta." #: data.cpp:744 msgid "About CPU-X" msgstr "Tietoa - CPU-X" #: data.cpp:745 #, c-format msgid "Version %s" msgstr "Versio %s" #: data.cpp:746 #, c-format msgid "Author: %s" msgstr "Kehittäjä: %s" #: data.cpp:747 #, c-format msgid "Site: %s" msgstr "Sivusto: %s" #: data.cpp:751 cpu-x-gtk-3.12.ui:5533 msgid "License" msgstr "Lisenssi" #: data.cpp:753 #, c-format msgid "This software is distributed under the terms of %s" msgstr "Tätä ohjelmistoa jaetaan %s -lisenssin mukaisesti" #: data.cpp:754 main.cpp:176 msgid "This program comes with ABSOLUTELY NO WARRANTY" msgstr "Tämä ohjelma EI SISÄLLÄ MINKÄÄNLAISTA TAKUUTA" #: gui_gtk.cpp:61 #, c-format msgid "Cannot find path for '%s' file" msgstr "" #: gui_gtk.cpp:400 msgid "Start daemon" msgstr "Käynnistä daemon" #: gui_gtk.cpp:403 msgid "Connected to daemon" msgstr "Yhdistetty daemoniin" #: gui_gtk.cpp:406 msgid "No polkit authentication agent found" msgstr "Polkit-todennusagenttia ei löydy" #: gui_gtk.cpp:411 msgid "Ask password to start daemon in background" msgstr "Kysy salasana taustapalvelun käynnistämiseksi" #: gui_gtk.cpp:415 msgid "Settings" msgstr "Asetukset" #: gui_gtk.cpp:634 #, fuzzy #| msgid "Family" msgid "BaseFamily" msgstr "Perhe" #: gui_gtk.cpp:635 msgid "CPU display (\"true\") family (computed as BaseFamily+ExtendedFamily)" msgstr "" #: gui_gtk.cpp:636 #, fuzzy #| msgid "Model" msgid "BaseModel" msgstr "Malli" #: gui_gtk.cpp:637 msgid "CPU display (\"true\") model (computed as (ExtendedModel<<4)+BaseModel)" msgstr "" #: gui_gtk.cpp:847 msgid "" "Identify the physically-labeled socket or board position where the memory " "device is located" msgstr "" #: gui_gtk.cpp:848 msgid "Identify the physically labeled bank where the memory device is located" msgstr "" #: gui_gtk.cpp:1052 #, fuzzy #| msgid "UMD Version" msgid "User Mode Driver Version" msgstr "UMD-versio" #: gui_gtk.cpp:1066 msgid "Vulkan Ray Tracing" msgstr "" #: gui_gtk.cpp:1260 msgid "Starting GTK GUI…" msgstr "Käynnistetään GTK-käyttöliittymä…" #: gui_gtk.cpp:1272 msgid "failed to import UI in GtkBuilder" msgstr "" #: main.cpp:63 msgid "Start graphical user interface (GUI) (default)" msgstr "Käynnistä graafinen käyttöliittymä (GUI) (oletus)" #: main.cpp:64 msgid "Start text-based user interface (TUI)" msgstr "Käynnistä tekstipohjainen käyttöliittymä (TUI)" #: main.cpp:65 msgid "Dump all data on standard output and exit" msgstr "" #: main.cpp:66 msgid "Run embedded command dmidecode and exit" msgstr "" #: main.cpp:67 msgid "Run embedded command bandwidth and exit" msgstr "" #: main.cpp:68 msgid "Set temperature unit (c[elsius]|f[ahrenheit]|k[elvin]|r[ankine])" msgstr "" #: main.cpp:69 msgid "Set custom time between two refreshes (in seconds)" msgstr "" #: main.cpp:70 msgid "Set default tab (integer)" msgstr "" #: main.cpp:71 #, fuzzy #| msgid "Select CPU core to monitor (integer)" msgid "Select core type to monitor (integer)" msgstr "Valitse tarkkailtava suoritinydin (numero)" #: main.cpp:72 msgid "Select CPU core to monitor (integer)" msgstr "Valitse tarkkailtava suoritinydin (numero)" #: main.cpp:73 msgid "Set custom bandwidth test for CPU caches speed (integer)" msgstr "" #: main.cpp:74 #, fuzzy #| msgid "Select CPU core to monitor (integer)" msgid "Select default memory stick (integer)" msgstr "Valitse tarkkailtava suoritinydin (numero)" #: main.cpp:75 #, fuzzy #| msgid "Select CPU core to monitor (integer)" msgid "Select default graphic card (integer)" msgstr "Valitse tarkkailtava suoritinydin (numero)" #: main.cpp:76 cpu-x-gtk-3.12.ui:5910 msgid "Start and connect to daemon" msgstr "Käynnistä ja yhdistä taustapalveluun" #: main.cpp:77 msgid "Verbose output" msgstr "" #: main.cpp:78 msgid "Print help and exit" msgstr "Tulosta ohje ja lopeta" #: main.cpp:79 msgid "Print version and exit" msgstr "Tulosta versio ja lopeta" #: main.cpp:80 msgid "Print CPUID values in decimal (default is hexadeximal)" msgstr "" #: main.cpp:81 msgid "Disable colored output" msgstr "" #: main.cpp:82 msgid "Print information for debugging" msgstr "Tulosta tiedot vianselvitystä varten" #: main.cpp:83 msgid "Print required information to paste in an issue" msgstr "" #: main.cpp:84 msgid "Set key mapping for NCurses mode (a[rrows]|e[macs]|i[nverted-T]|v[im])" msgstr "" #: main.cpp:95 msgid "Add default command line arguments" msgstr "" #: main.cpp:96 msgid "Enforce the bus clock" msgstr "" #: main.cpp:97 msgid "" "Ignore CPU values reported by libcpuid (comma-separated values among 'temp', " "'volt' and 'freq')" msgstr "" #: main.cpp:98 msgid "Read CPUID raw data from a given file" msgstr "" #: main.cpp:99 msgid "Only print a message if CPU is not present in the database" msgstr "" #: main.cpp:126 #, c-format msgid "Usage: %s DISPLAY [OPTIONS]\n" msgstr "Käyttö: %s DISPLAY [OPTIONS]\n" #: main.cpp:127 msgid "Available DISPLAY:" msgstr "" #: main.cpp:135 msgid "Available OPTIONS:" msgstr "" #: main.cpp:144 msgid "Influenceable environment variables:" msgstr "" #: main.cpp:175 msgid "This is free software: you are free to change and redistribute it." msgstr "Tämä on vapaa ohjelma: voit muokata ja jakaa sitä vapaasti." #: main.cpp:177 #, c-format msgid "See the %s license: <%s>\n" msgstr "Lue lisenssi (%s): <%s>\n" #: main.cpp:184 #, c-format msgid "-- %-9s version: %s" msgstr "" #: main.cpp:381 #, c-format msgid "" "\n" "Oops, something was wrong! %s has received signal %d (%s) and has crashed." msgstr "" #: main.cpp:383 #, c-format msgid "" "\n" "Oops, something was wrong! %s has received signal %d (%s) and is trying to " "recover." msgstr "" #: main.cpp:407 msgid "You can open a new issue here, by filling the template as requested:" msgstr "" #: main.cpp:449 msgid "an error occurred while setting locale" msgstr "" #: options.cpp:124 #, c-format msgid "" "Selected CPU type (%u) is not a valid number (%u is the maximum for this CPU)" msgstr "" #: options.cpp:145 #, c-format msgid "" "Selected bandwidth test (%u) is not a valid number (%u is the maximum for " "this system)" msgstr "" #: options.cpp:168 #, c-format msgid "" "Selected RAM stick (%u) is not a valid number (%u is the maximum for this " "system)" msgstr "" #: options.cpp:188 #, c-format msgid "" "Selected graphic card (%u) is not a valid number (%u is the maximum for this " "system)" msgstr "" #: options.cpp:204 #, c-format msgid "failed to change CPU affinitiy to core %u" msgstr "" #: options.cpp:210 #, c-format msgid "" "Selected CPU core (%u) is not a valid number (%u is the maximum for this " "type of core)" msgstr "" #: options.cpp:284 #, c-format msgid "Selected tab (%u) is not a valid number (%u is the maximum)" msgstr "" #: tui_ncurses.cpp:111 msgid "Window is too small!" msgstr "Ikkuna on liian pieni!" #: tui_ncurses.cpp:119 msgid "Press 'h' to see help." msgstr "Paina 'h' nähdäksesi ohjeen." #: tui_ncurses.cpp:232 #, c-format msgid "Welcome in %s NCurses help!\n" msgstr "" #: tui_ncurses.cpp:233 msgid "This help describes how to use this Text-based User Interface." msgstr "" #: tui_ncurses.cpp:235 msgid "Global keys:" msgstr "" #: tui_ncurses.cpp:236 #, fuzzy #| msgid "\tPress 'q' key to exit.\n" msgid "Press 'left' key or 'tab' key to switch in left tab." msgstr "\tPaina 'q' poistuaksesi.\n" #: tui_ncurses.cpp:237 #, fuzzy #| msgid "\tPress 'q' key to exit.\n" msgid "Press 'right' key or 'shift + tab' keys to switch in right tab." msgstr "\tPaina 'q' poistuaksesi.\n" #: tui_ncurses.cpp:238 msgid "Press 'h' key to see this help." msgstr "Paina 'h' nähdäksesi tämän ohjeen." #: tui_ncurses.cpp:239 msgid "Press 'q' key to exit." msgstr "Paina 'q' poistuaksesi." #: tui_ncurses.cpp:241 msgid "CPU tab:" msgstr "Suorittimen välilehti:" #: tui_ncurses.cpp:242 msgid "Press 'next page' key to decrease core type number to monitor." msgstr "" #: tui_ncurses.cpp:243 msgid "Press 'previous page' key to increase core type number to monitor." msgstr "" #: tui_ncurses.cpp:244 msgid "Press 'down' key to decrease CPU core number to monitor." msgstr "" #: tui_ncurses.cpp:245 #, fuzzy #| msgid "\tPress 'q' key to exit.\n" msgid "Press 'up' key to increase CPU core number to monitor." msgstr "\tPaina 'q' poistuaksesi.\n" #: tui_ncurses.cpp:247 msgid "Caches tab:" msgstr "Välimuistien välilehti:" #: tui_ncurses.cpp:248 msgid "Press 'down' key to switch to previous test." msgstr "" #: tui_ncurses.cpp:249 #, fuzzy #| msgid "\tPress 'q' key to exit.\n" msgid "Press 'up' key to switch to next test." msgstr "\tPaina 'q' poistuaksesi.\n" #: tui_ncurses.cpp:251 msgid "Bench tab:" msgstr "" #: tui_ncurses.cpp:252 msgid "Press 'down' key to decrement benchmark duration." msgstr "" #: tui_ncurses.cpp:253 msgid "Press 'up' key to increment benchmark duration." msgstr "" #: tui_ncurses.cpp:254 msgid "Press 'next page' key to decrement number of threads to use." msgstr "" #: tui_ncurses.cpp:255 msgid "Press 'previous page' key to increment number of threads to use." msgstr "" #: tui_ncurses.cpp:256 msgid "Press 's' key to start/stop prime numbers (slow) benchmark." msgstr "" #: tui_ncurses.cpp:257 msgid "Press 'f' key to start/stop prime numbers (fast) benchmark." msgstr "" #: tui_ncurses.cpp:259 msgid "Graphics tab:" msgstr "Grafiikan välilehti:" #: tui_ncurses.cpp:260 msgid "Press 'down' key to switch to previous graphic card." msgstr "" #: tui_ncurses.cpp:261 msgid "Press 'up' key to switch to next graphic card." msgstr "" #: tui_ncurses.cpp:263 #, fuzzy #| msgid "\tPress 'q' key to exit.\n" msgid "Press any key to exit this help." msgstr "\tPaina 'q' poistuaksesi.\n" #: tui_ncurses.cpp:640 msgid "Starting NCurses TUI…" msgstr "Käynnistetään NCurses-tekstikäyttöliittymää…" #: tui_ncurses.cpp:649 msgid "" "FATAL ERROR: terminfo database could not be found (try to set TERMINFO " "environment variable)" msgstr "" #: tui_ncurses.cpp:654 #, c-format msgid "Failed to set up %s terminal (err=%i); falling back to %s" msgstr "" #: util.cpp:189 #, c-format msgid "cannot find unit in '%s' string at position %i" msgstr "" #: util.cpp:252 #, fuzzy, c-format #| msgid "an error occurred while opening file '%s' (%s)" msgid "an error occurred while opening file '%s'" msgstr "tiedoston '%s' avaaminen epäonnistui (%s)" #: util.cpp:297 #, fuzzy, c-format #| msgid "an error occurred while running command '%s' (%s)" msgid "an error occurred while running command '%s'" msgstr "komennon '%s' suoritaminen epäonnistui (%s)" #: util.cpp:437 msgid "set_cpu_affinity() not supported on this operating system" msgstr "set_cpu_affinity() ei ole tuettu tässä käyttöjärjestelmässä" #: data.hpp:103 data.hpp:244 data.hpp:332 msgid "Vendor" msgstr "Tekijä" #: data.hpp:104 msgid "Code Name" msgstr "Koodinimi" #: data.hpp:105 msgid "Package" msgstr "Pakkaus" #: data.hpp:106 msgid "Technology" msgstr "Tekniikka" #: data.hpp:107 data.hpp:268 msgid "Voltage" msgstr "Jännite" #: data.hpp:108 msgid "Specification" msgstr "Määritys" #: data.hpp:109 msgid "Family" msgstr "Perhe" #: data.hpp:110 #, fuzzy #| msgid "Family" msgid "Disp. Family" msgstr "Perhe" #: data.hpp:111 data.hpp:224 data.hpp:245 data.hpp:335 msgid "Model" msgstr "Malli" #: data.hpp:112 #, fuzzy #| msgid "Model" msgid "Disp. Model" msgstr "Malli" #: data.hpp:113 msgid "Temp." msgstr "Lämpötila" #: data.hpp:114 msgid "Stepping" msgstr "" #: data.hpp:115 msgid "Instructions" msgstr "Käskylaajennukset" #: data.hpp:125 msgid "L1 Data" msgstr "" #: data.hpp:126 msgid "L1 Inst." msgstr "" #: data.hpp:127 msgid "Level 2" msgstr "Taso 2" #: data.hpp:128 msgid "Level 3" msgstr "Taso 3" #: data.hpp:137 cpu-x-gtk-3.12.ui:1232 msgid "Cores" msgstr "Ytimet" #: data.hpp:138 data.hpp:408 cpu-x-gtk-3.12.ui:1252 msgid "Threads" msgstr "Säikeet" #: data.hpp:155 msgid "Core Speed" msgstr "Ytimen nopeus" #: data.hpp:156 msgid "Multiplier" msgstr "Kerroin" #: data.hpp:157 msgid "Bus Speed" msgstr "Väylänopeus" #: data.hpp:158 data.hpp:341 msgid "Usage" msgstr "Käyttö" #: data.hpp:188 data.hpp:265 msgid "Size" msgstr "Koko" #: data.hpp:189 data.hpp:267 msgid "Speed" msgstr "Nopeus" #: data.hpp:223 data.hpp:259 msgid "Manufacturer" msgstr "Valmistaja" #: data.hpp:225 msgid "Revision" msgstr "Revisio" #: data.hpp:233 msgid "Brand" msgstr "Brändi" #: data.hpp:234 msgid "Version" msgstr "Versio" #: data.hpp:235 msgid "Date" msgstr "Päivämäärä" #: data.hpp:236 msgid "ROM Size" msgstr "ROM:in koko" #: data.hpp:260 msgid "Part Number" msgstr "" #: data.hpp:261 msgid "Type" msgstr "Tyyppi" #: data.hpp:262 #, fuzzy #| msgid "Core #%i" msgid "Type Detail" msgstr "Ydin #%i" #: data.hpp:263 msgid "Device Locator" msgstr "" #: data.hpp:264 msgid "Bank Locator" msgstr "" #: data.hpp:266 msgid "Rank" msgstr "" #: data.hpp:292 msgid "Name" msgstr "Nimi" #: data.hpp:293 msgid "Kernel" msgstr "Ydin" #: data.hpp:294 msgid "Hostname" msgstr "Isäntänimi" #: data.hpp:295 msgid "Uptime" msgstr "Käynnissä" #: data.hpp:303 msgid "Used" msgstr "Käytetty" #: data.hpp:304 msgid "Buffers" msgstr "Puskurit" #: data.hpp:305 msgid "Cached" msgstr "Välimuistissa" #: data.hpp:306 msgid "Free" msgstr "Vapaana" #: data.hpp:307 msgid "Swap" msgstr "Sivutus" #: data.hpp:333 msgid "Driver" msgstr "Ajuri" #: data.hpp:334 msgid "UMD Version" msgstr "UMD-versio" #: data.hpp:336 msgid "Compute Unit" msgstr "Laskentayksikkö" #: data.hpp:337 msgid "Device ID" msgstr "Laite-ID" #: data.hpp:338 msgid "VBIOS Version" msgstr "VBIOS-versio" #. #-#-#-#-# source_ui.pot (cpu-x ) #-#-#-#-# #. Setting: "Interface" tab #: data.hpp:339 cpu-x-gtk-3.12.ui:5807 msgid "Interface" msgstr "Liitäntä" #: data.hpp:340 msgid "Temperature" msgstr "Lämpötila" #: data.hpp:342 msgid "Core Voltage" msgstr "Ytimen jännite" #: data.hpp:343 msgid "Power Avg" msgstr "Kulutus keskim." #: data.hpp:344 msgid "Core Clock" msgstr "Ytimen kellotaajuus" #: data.hpp:345 msgid "Memory Clock" msgstr "Muistin kellotaajuus" #: data.hpp:346 msgid "Memory Used" msgstr "Käytetty muisti" #: data.hpp:347 msgid "Resizable BAR" msgstr "" #: data.hpp:348 msgid "Vulkan RT" msgstr "" #: data.hpp:349 msgid "OpenGL Version" msgstr "OpenGL-versio" #: data.hpp:350 msgid "Vulkan Version" msgstr "Vulkan-versio" #: data.hpp:351 msgid "OpenCL Version" msgstr "OpenCL-versio" #: data.hpp:387 msgid "Score" msgstr "Tulos" #: data.hpp:388 msgid "Run" msgstr "Aja" #: data.hpp:407 msgid "Duration" msgstr "Kesto" #: util.hpp:77 msgid "bytes" msgstr "tavua" #. TRANSLATORS: initials for kilobyte (10³): please put initials (keep it short) #: util.hpp:80 msgid "kB" msgstr "kt" #. TRANSLATORS: initials for megabyte (10⁶): please put initials (keep it short) #: util.hpp:82 msgid "MB" msgstr "Mt" #. TRANSLATORS: initials for gigabyte (10⁹): please put initials (keep it short) #: util.hpp:84 msgid "GB" msgstr "Gt" #. TRANSLATORS: initials for terabyte (10¹²): please put initials (keep it short) #: util.hpp:86 msgid "TB" msgstr "Tt" #. TRANSLATORS: initials for kibibyte (2¹⁰): please put initials (keep it short) #: util.hpp:89 msgid "KiB" msgstr "KiB" #. TRANSLATORS: initials for mebibyte (2²⁰): please put initials (keep it short) #: util.hpp:91 msgid "MiB" msgstr "MiB" #. TRANSLATORS: initials for gibibyte (2³⁰): please put initials (keep it short) #: util.hpp:93 msgid "GiB" msgstr "GiB" #. TRANSLATORS: initials for tebibyte (2⁴⁰): please put initials (keep it short) #: util.hpp:95 msgid "TiB" msgstr "TiB" #: cpu-x-gtk-3.12.ui:1184 msgid "Cache" msgstr "Välimuisti" #. Setting: refresh time for UI #: cpu-x-gtk-3.12.ui:5721 msgid "Refresh time" msgstr "Päivitysaika" #. Setting: GUI theme #: cpu-x-gtk-3.12.ui:5745 #, fuzzy #| msgid "Theme" msgid "Text theme" msgstr "Teema" #. Setting: automatic GUI theme #: cpu-x-gtk-3.12.ui:5760 msgid "Automatic" msgstr "Automaattinen" #. Setting: light GUI theme #: cpu-x-gtk-3.12.ui:5761 msgid "Blue for light theme" msgstr "" #. Setting: dark GUI theme #: cpu-x-gtk-3.12.ui:5762 msgid "Yellow for dark theme" msgstr "" #. Setting: temperature unit #: cpu-x-gtk-3.12.ui:5775 msgid "Temperature unit" msgstr "Lämpötilan yksikkö" #. Setting: default tab at startup #: cpu-x-gtk-3.12.ui:5826 msgid "Default tab" msgstr "Oletusarvoinen välilehti" #. Setting: default CPU core at startup #: cpu-x-gtk-3.12.ui:5839 msgid "Default CPU core" msgstr "Oletusarvoinen suoritinydin" #. Setting: default cache test at startup #: cpu-x-gtk-3.12.ui:5852 msgid "Default cache test" msgstr "Oletusarvoinen välimuistitesti" #. Setting: print CPUID values in decimal or hexadecimal #: cpu-x-gtk-3.12.ui:5895 msgid "Print CPUID values in decimal" msgstr "Tulosta CPUID-arvot desimaaleissa" #. Setting: default graphic card at startup #: cpu-x-gtk-3.12.ui:5928 msgid "Default graphic card" msgstr "Oletusarvoinen grafiikkatyyppi" #. Setting: default CPU core at startup #: cpu-x-gtk-3.12.ui:5952 msgid "Default core type" msgstr "Oletusarvoinen ydintyyppi" #. Setting: default graphic card at startup #: cpu-x-gtk-3.12.ui:5976 msgid "Default memory stick" msgstr "Oletusarvoinen muistikampa" #. Setting: "Startup" tab #: cpu-x-gtk-3.12.ui:6004 msgid "Startup" msgstr "Käynnistys" #~ msgid "Light" #~ msgstr "Vaalea" #~ msgid "Dark" #~ msgstr "Tumma" #~ msgid "Calculating CPU multipliers" #~ msgstr "Lasketaan CPU-kertoimia" #~ msgid "failed to retrieve GPU clocks" #~ msgstr "GPU-kellotaajuuksien haku epäonnistui" #, c-format #~ msgid "Core #%i" #~ msgstr "Ydin #%i" #~ msgid "Distribution" #~ msgstr "Jakelu" #~ msgid "Compiler" #~ msgstr "Kääntäjä" #~ msgid "GPU clock" #~ msgstr "GPU-kellotaajuus" #~ msgid "Dumping data…" #~ msgstr "Dumpataan tiedot…" #~ msgid "Freeing memory" #~ msgstr "Vapautetaan muistia" #, fuzzy, c-format #~| msgid "failed to call libcpuid (%s)" #~ msgid "failed to call wordexp (%i)" #~ msgstr "libcpuid:n kutsuminen epäonnistui (%s)" #, fuzzy #~| msgid "\tPress 'q' key to exit.\n" #~ msgid "Press 'home' key to scroll up in a page." #~ msgstr "\tPaina 'q' poistuaksesi.\n" #, fuzzy #~| msgid "\tPress 'q' key to exit.\n" #~ msgid "Press 'end' key to scroll down in a page." #~ msgstr "\tPaina 'q' poistuaksesi.\n" #, c-format #~ msgid "failed to open %s directory" #~ msgstr "hakemiston %s avaaminen epäonnistui" #, fuzzy, c-format #~| msgid "failed to call libcpuid (%s)" #~ msgid "failed to call vkEnumerateInstanceExtensionProperties (%s)" #~ msgstr "libcpuid:n kutsuminen epäonnistui (%s)" #, c-format #~ msgid "%s" #~ msgstr "%s" #, c-format #~ msgid "" #~ "CPU hybrid architecture is not supported. For more details, please refer " #~ "to following issue: %s" #~ msgstr "" #~ "Hybridi-suoritinrakenne ei ole tuettu. Lisätietoja saadaksesi katso " #~ "seuraava ongelmayhteys: %s" #~ msgid "NOT SUPPORTED" #~ msgstr "EI TUETTU" #, fuzzy #~| msgid "There is no platform with OpenCL support (%s)" #~ msgid "There is no device with Vulkan support" #~ msgstr "Ei alustaa OpenCL-tuella (%s)" #~ msgid "Socket(s)" #~ msgstr "Kanta" #~ msgid "Thread(s)" #~ msgstr "Säikeet" #, fuzzy #~| msgid "failed to call libcpuid (%s)" #~ msgid "faild to call clGetDeviceIDs" #~ msgstr "libcpuid:n kutsuminen epäonnistui (%s)" CPU-X-5.0.3/po/fr.po000066400000000000000000001324551454622605200137600ustar00rootroot00000000000000# Copyright © 2014-2024 The Tumultuous Unicorn Of Darkness # This file is distributed under the same license as the CPU-X package. # Translators: # Mattéo Rossillol , 2019. # Mattéo Rossillol‑‑Laruelle , 2020. # Julien Humbert , 2020. # J. Lavoie , 2021. # Emmanuel Gil Peyrot , 2021, 2023. # Axel Blanchardon , 2022. # The Tumultuous Unicorn Of Darkness , 2023. msgid "" msgstr "" "Project-Id-Version: CPU-X\n" "Report-Msgid-Bugs-To: https://github.com/TheTumultuousUnicornOfDarkness/CPU-" "X/issues\n" "POT-Creation-Date: 2023-12-09 13:09+0100\n" "PO-Revision-Date: 2023-12-10 08:16+0000\n" "Last-Translator: The Tumultuous Unicorn Of Darkness \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.3-dev\n" #: core.cpp:135 msgid "Finding CPU technology" msgstr "Recherche la finesse de gravure du processeur" #: core.cpp:161 #, c-format msgid "" "Your CPU is not present in the database ==> %s, model: %i, ext. model: %i, " "ext. family: %i" msgstr "" "Votre processeur n'est pas présent dans la base de données ==> %s, modèle : " "%i, modèle ét. : %i, famille ét. : %i" #: core.cpp:189 data.cpp:150 data.cpp:342 msgid "unknown" msgstr "inconnu" #: core.cpp:230 msgid "Calling libcpuid for retrieving static data" msgstr "Appel libcpuid pour récupérer les données statiques" #: core.cpp:245 #, c-format msgid "failed to call libcpuid (%s)" msgstr "échec lors de l'appel de libcpuid (%s)" #: core.cpp:340 msgid "Calling libcpuid for retrieving dynamic data" msgstr "Appel libcpuid pour récupérer les données dynamiques" #: core.cpp:353 msgid "Calling libcpuid for retrieving CPU MSR static values" msgstr "" "Appel de libcpuid pour récupérer les valeurs statiques des MSR du processeur" #: core.cpp:380 msgid "Calling libcpuid for retrieving CPU MSR dynamic values" msgstr "" "Appel de libcpuid pour récupérer les valeurs dynamiques des MSR du processeur" #: core.cpp:412 msgid "Calling dmidecode" msgstr "Appel dmidecode" #: core.cpp:454 core.cpp:473 #, c-format msgid "%s (configured)" msgstr "%s (configurée)" #: core.cpp:461 core.cpp:480 #, c-format msgid "%s (max)" msgstr "%s (max)" #: core.cpp:466 #, c-format msgid "%s (min)" msgstr "%s (min)" #: core.cpp:496 msgid "Calculating CPU usage" msgstr "Calcule l'utilisation du processeur" #: core.cpp:546 msgid "Calling bandwidth" msgstr "Appel bandwidth" #: core.cpp:613 #, c-format msgid "" "pci_access is not properly initialized: it is a common issue when %s was " "built with a lower libpci version.\n" "Check that libpci %s library is present on your system. Otherwise, please " "rebuild %s." msgstr "" "pci_access n'est pas initialisé correctement : il s'agit d'un problème " "commun lorsque %s a été compilé avec une version plus ancienne de libpci.\n" "Vérifiez que la bibliothèque libcpi %s est présente sur votre système. " "Autrement, merci de recompiler %s." #: core.cpp:657 #, c-format msgid "No kernel driver in use for graphic card at path %s" msgstr "Aucun pilote noyau n'est utilisé par la carte graphique de chemin %s" #: core.cpp:693 #, c-format msgid "Your GPU kernel driver is unknown: %s" msgstr "Le pilote noyau de votre carte-graphique est inconnu : %s" #: core.cpp:777 #, c-format msgid "Your GPU user mode driver is unknown for vendor %s: %s" msgstr "" "Le pilote utilisateur de votre carte-graphique est inconnu pour le vendeur " "%s : %s" #: core.cpp:781 #, c-format msgid "failed to call GLFW (%i): %s" msgstr "échec lors de l'appel de GLFW (%i) : %s" #: core.cpp:914 msgid "Finding Vulkan API version" msgstr "Recherche de la version de l'API Vulkan" #: core.cpp:926 #, c-format msgid "failed to call vkCreateInstance (%s)" msgstr "échec lors de l'appel de vkCreateInstance (%s)" #: core.cpp:929 #, c-format msgid "%s is not supported" msgstr "%s n'est pas supporté" #: core.cpp:937 #, c-format msgid "failed to call vkEnumeratePhysicalDevices (%s)" msgstr "échec lors de l'appel de vkEnumeratePhysicalDevices (%s)" #: core.cpp:944 msgid "No available Vulkan devices" msgstr "Aucun périphérique compatible Vulkan disponible" #: core.cpp:952 #, c-format msgid "No available physical devices (%s)" msgstr "Aucun périphérique physique disponible (%s)" #: core.cpp:1015 #, c-format msgid "Failed to create Vulkan for device %u (%s)" msgstr "échec lors de création du périphérique Vulkan %u (%s)" #: core.cpp:1019 #, c-format msgid "%s is not supported for device %u, use only deviceID for matching" msgstr "" "%s n'est pas supporté pour le périphérique %u, utilise uniquement " "l'identifiant de périphérique pour la correspondance" #: core.cpp:1051 core.cpp:1364 msgid "Enabled" msgstr "Activé" #: core.cpp:1051 core.cpp:1364 msgid "Disabled" msgstr "Désactivé" #: core.cpp:1088 msgid "Finding OpenCL API version" msgstr "Recherche de la version de l'API OpenCL" #: core.cpp:1092 #, c-format msgid "There is no platform with OpenCL support (%s)" msgstr "Il n'y a pas de plateforme prenant en charge OpenCL (%s)" #: core.cpp:1102 #, c-format msgid "failed to get all OpenCL platforms (%s)" msgstr "impossible d'obtenir toutes les plateformes OpenCL (%s)" #: core.cpp:1115 #, c-format msgid "failed to get name for platform %u (%s)" msgstr "impossible d'obtenir le nom de la plateforme %u (%s)" #: core.cpp:1123 #, c-format msgid "failed to get version for platform %u (%s)" msgstr "impossible d'obtenir la version pour la plate-forme %u (%s)" #: core.cpp:1131 #, c-format msgid "failed to find number of OpenCL devices for platform '%s %s' (%s)" msgstr "" "impossible de déterminer le nombre de périphériques OpenCL pour la " "plateforme « %s %s » (%s)" #: core.cpp:1131 msgid "0 device" msgstr "0 périphérique" #: core.cpp:1140 #, c-format msgid "failed to get all of OpenCL devices for platform '%s %s' (%s)" msgstr "" "impossible d’obtenir tous les périphériques OpenCL pour la plateforme « %s " "%s » (%s)" #: core.cpp:1160 #, c-format msgid "failed to get name for device %u (%s)" msgstr "impossible d’obtenir le nom pour le périphérique %u (%s)" #: core.cpp:1168 #, c-format msgid "failed to get version for device %u (%s)" msgstr "impossible d’obtenir la version pour le périphérique %u (%s)" #: core.cpp:1190 #, c-format msgid "OpenCL driver for '%s %s' does not support CL_DEVICE_TOPOLOGY_AMD (%s)" msgstr "" "Le pilote OpenCL pour « %s %s » n’implémente pas CL_DEVICE_TOPOLOGY_AMD (%s)" #: core.cpp:1201 #, c-format msgid "" "OpenCL driver for '%s %s' does not support CL_DEVICE_GFXIP_MAJOR_AMD (%s)" msgstr "" "Le pilote OpenCL pour « %s %s » n’implémente pas CL_DEVICE_GFXIP_MAJOR_AMD " "(%s)" #: core.cpp:1209 core.cpp:1229 core.cpp:1262 #, c-format msgid "" "OpenCL driver for '%s %s' does not support CL_DEVICE_MAX_COMPUTE_UNITS (%s)" msgstr "" "Le pilote OpenCL pour « %s %s » n’implémente pas CL_DEVICE_MAX_COMPUTE_UNITS " "(%s)" #: core.cpp:1250 #, c-format msgid "" "OpenCL driver for '%s %s' does not support CL_DEVICE_PCI_DOMAIN_ID_NV (%s), " "CL_DEVICE_PCI_BUS_ID_NV (%s) or CL_DEVICE_PCI_SLOT_ID_NV (%s)" msgstr "" "Le pilote OpenCL pour « %s %s » n’implémente pas CL_DEVICE_PCI_DOMAIN_ID_NV " "(%s), CL_DEVICE_PCI_BUS_ID_NV (%s) ou CL_DEVICE_PCI_SLOT_ID_NV (%s)" #: core.cpp:1273 #, c-format msgid "OpenCL is not supported with your GPU vendor (0x%X)" msgstr "" "OpenCL n’est pas pris en charge par votre vendeur de carte-graphique (0x%X)" #: core.cpp:1295 msgid "Finding devices" msgstr "Recherche des périphériques" #: core.cpp:1307 #, c-format msgid "Skip devices search (wrong permissions on %s device)" msgstr "" "Saute la recherche des périphériques (mauvaises permissions pour le " "périphérique %s)" #: core.cpp:1350 #, c-format msgid "Your GPU vendor is unknown: %s (0x%X)" msgstr "Le fabricant de votre carte-graphique est inconnu : %s (0x%X)" #: core.cpp:1370 msgid "failed to find chipset vendor and model" msgstr "échec lors de la recherche du vendeur et du modèle du chipset" #: core.cpp:1385 msgid "failed to find graphic card vendor and model" msgstr "" "échec lors de la recherche du vendeur et du modèle de la carte-graphique" #: core.cpp:1487 msgid "Retrieving GPU clocks" msgstr "Récupère les fréquences de la carte-graphique" #: core.cpp:1500 msgid "None" msgstr "Aucun" #: core.cpp:1509 #, c-format msgid "DRM path for %s is unknown" msgstr "Le chemin DRM pour la %s est inconnu" #: core.cpp:1516 #, c-format msgid "Card number for %s is unknown" msgstr "Le numéro de la %s est inconnu" #: core.cpp:1541 #, c-format msgid "PCIe %s (current) / %s (max)" msgstr "PCIe %s (actuel) / %s (max)" #: core.cpp:1650 #, c-format msgid "Driver for %s doesn't report frequencies" msgstr "Le pilote de la %s ne rapporte pas les fréquences" #: core.cpp:1671 #, c-format msgid "failed to retrieve all monitoring data for %s" msgstr "impossible d'obtenir toutes les données de surveillance de %s" #: core.cpp:1694 msgid "Identifying running system" msgstr "Identifie le système en cours de fonctionnement" #: core.cpp:1697 msgid "failed to identify running system" msgstr "échec lors de l'identification du système en cours de fonctionnement" #: core.cpp:1749 core.cpp:1778 msgid "Calling libprocps" msgstr "Appel libprocps" #: core.cpp:1752 msgid "unable to get system uptime" msgstr "impossible d'obtenir la durée de disponibilité du système" #: core.cpp:1758 msgid "unable to create meminfo structure" msgstr "impossible de créer la structure pour meminfo" #: core.cpp:1804 msgid "Calling libstatgrab" msgstr "Appel libstatgrab" #: core.cpp:1852 #, c-format msgid "%i days, %i hours, %i minutes, %i seconds" msgstr "%i jours, %i heures, %i minutes, %i secondes" #: core.cpp:1915 msgid "Updating benchmark status" msgstr "Mise à jour du statut du test de performance" #: core.cpp:1918 msgid "Active" msgstr "Actif" #: core.cpp:1921 #, c-format msgid "(%u hours left)" msgstr "(%u heures restantes)" #: core.cpp:1923 #, c-format msgid "(%u minutes left)" msgstr "(%u minutes restantes)" #: core.cpp:1925 #, c-format msgid "(%u seconds left)" msgstr "(%u secondes restantes)" #: core.cpp:1929 core.cpp:1984 core.cpp:1985 msgid "Inactive" msgstr "Inactif" #: core.cpp:1932 #, c-format msgid "in %u hours" msgstr "en %u heures" #: core.cpp:1934 #, c-format msgid "in %u minutes" msgstr "en %u minutes" #: core.cpp:1936 #, c-format msgid "in %u seconds" msgstr "en %u secondes" #: core.cpp:1953 #, c-format msgid "Starting benchmark with %u threads" msgstr "Démarrage du test de performance avec %u fils" #: core.cpp:1976 msgid "an error occurred while starting benchmark" msgstr "une erreur est survenue lors du démarrage du test de performance" #: core.cpp:2002 msgid "Finding CPU package in fallback mode" msgstr "Recherche du support du processeur en mode de secours" #: core.cpp:2032 #, c-format msgid "Your CPU socket is not present in the database ==> %s, codename: %s" msgstr "" "Votre support de processeur n'est pas présent dans la base de données ==> " "%s, nom de code : %s" #: core.cpp:2052 msgid "Calculating CPU multipliers in fallback mode" msgstr "Calcule les multiplicateurs du processeur en mode de secours" #: core.cpp:2072 msgid "Retrieving motherboard information in fallback mode" msgstr "Récupère les informations de la carte-mère en mode de secours" #: core.cpp:2085 msgid "failed to retrieve motherboard information (fallback mode)" msgstr "" "échec lors de la récupération des informations de la carte-mère (mode de " "secours)" #: core.cpp:2127 msgid "Retrieving CPU temperature in fallback mode" msgstr "Récupère la température du processeur en mode de secours" #: core.cpp:2173 msgid "failed to retrieve CPU temperature (fallback mode)" msgstr "" "échec lors de la récupération de la température du processeur (mode de " "secours)" #: core.cpp:2188 msgid "Retrieving CPU voltage in fallback mode" msgstr "Récupère la tension du processeur en mode de secours" #: core.cpp:2200 msgid "failed to retrieve CPU voltage (fallback mode)" msgstr "" "échec lors de la récupération de la tension du processeur (mode de secours)" #: core.cpp:2214 msgid "Retrieving CPU frequency in fallback mode" msgstr "Récupère la fréquence du processeur en mode de secours" #: core.cpp:2220 msgid "failed to retrieve CPU frequency (fallback mode)" msgstr "" "échec lors de la récupération de la fréquence du processeur (mode de secours)" #: daemon_client.cpp:65 msgid "Starting daemon in background…" msgstr "Démarrage du démon en arrière-plan…" #: daemon_client.cpp:172 msgid "pkexec: authorization could not be obtained (dialog dismissed)" msgstr "" "pkexec : l’autorisation ne peut pas être obtenue (la boîte de dialogue a été " "rejetée)" #: daemon_client.cpp:175 msgid "pkexec: authorization could not be obtained (not authorized)" msgstr "pkexec : l’autorisation ne peut pas être obtenue (non-autorisé)" #: daemon_client.cpp:178 msgid "pkexec: command not found" msgstr "pkexec : commande introuvable" #: daemon_client.cpp:181 msgid "pkexec: unexpected error code" msgstr "pkexec : code d'erreur inattendu" #: daemon_client.cpp:211 msgid "Connecting to daemon…" msgstr "Connexion au démon…" #: daemon_server.cpp:261 #, c-format msgid "request_handler: case %i not handled" msgstr "request_handler : le cas %i n'est pas géré" #: data.cpp:124 cpu-x-gtk-3.12.ui:1370 msgid "CPU" msgstr "CPU" #: data.cpp:187 msgid "P-core" msgstr "Cœur-P" #: data.cpp:188 msgid "E-core" msgstr "Cœur-E" #: data.cpp:189 data.cpp:192 msgid "Core" msgstr "Cœur" #: data.cpp:208 cpu-x-gtk-3.12.ui:746 msgid "Processor" msgstr "Processeur" #: data.cpp:240 data.cpp:329 cpu-x-gtk-3.12.ui:1968 msgid "Caches" msgstr "Caches" #: data.cpp:247 #, c-format msgid "%2d x %4d %s, %2d-way" msgstr "%2d x %4d %s, %2d voies" #: data.cpp:249 #, c-format msgid "%d %s, %d-way" msgstr "%d %s, %d voies" #: data.cpp:263 msgid "Count" msgstr "Compte" #: data.cpp:276 cpu-x-gtk-3.12.ui:968 msgid "Clocks" msgstr "Fréquences" #: data.cpp:379 data.cpp:383 #, c-format msgid "L%u Cache" msgstr "Cache L%u" #: data.cpp:385 #, c-format msgid "%s associative, %d-%s line size" msgstr "%s associatives, %d %s par ligne" #: data.cpp:398 msgid "Test" msgstr "Test" #: data.cpp:409 data.cpp:423 cpu-x-gtk-3.12.ui:2146 cpu-x-gtk-3.12.ui:2517 msgid "Motherboard" msgstr "Carte-mère" #: data.cpp:437 cpu-x-gtk-3.12.ui:2367 msgid "BIOS" msgstr "BIOS" #: data.cpp:452 cpu-x-gtk-3.12.ui:2498 msgid "Chipset" msgstr "Jeu de puces" #: data.cpp:467 data.cpp:569 cpu-x-gtk-3.12.ui:3156 cpu-x-gtk-3.12.ui:3761 msgid "Memory" msgstr "Mémoire" #: data.cpp:483 #, c-format msgid "Stick %u" msgstr "Barrette %u" #: data.cpp:487 cpu-x-gtk-3.12.ui:3134 msgid "Sticks" msgstr "Barrettes" #: data.cpp:541 cpu-x-gtk-3.12.ui:3780 msgid "System" msgstr "Système" #: data.cpp:554 cpu-x-gtk-3.12.ui:3380 msgid "Operating System" msgstr "Système d'exploitation" #: data.cpp:587 cpu-x-gtk-3.12.ui:4960 msgid "Graphics" msgstr "Graphiques" #: data.cpp:621 #, c-format msgid "Card %u" msgstr "Carte %u" #: data.cpp:625 cpu-x-gtk-3.12.ui:4938 msgid "Cards" msgstr "Cartes" #: data.cpp:672 cpu-x-gtk-3.12.ui:5300 msgid "Bench" msgstr "Bench" #: data.cpp:685 msgid "Not started" msgstr "Non démarré" #: data.cpp:688 cpu-x-gtk-3.12.ui:5070 msgid "Prime numbers (slow)" msgstr "Nombres premier (lent)" #: data.cpp:692 cpu-x-gtk-3.12.ui:5178 msgid "Prime numbers (fast)" msgstr "Nombres premier (rapide)" #: data.cpp:696 cpu-x-gtk-3.12.ui:5281 msgid "Parameters" msgstr "Paramètres" #: data.cpp:721 data.cpp:727 #, c-format msgid "%u mins" msgstr "%u min" #: data.cpp:734 cpu-x-gtk-3.12.ui:5444 cpu-x-gtk-3.12.ui:5552 msgid "About" msgstr "À propos" #: data.cpp:739 #, c-format msgid "" "%s is a Free software that gathers information\n" "on CPU, motherboard and more." msgstr "" "%s est un logiciel Libre qui récolte des informations\n" "sur le CPU, la carte-mère et plus." #: data.cpp:744 msgid "About CPU-X" msgstr "À propos de CPU-X" #: data.cpp:745 #, c-format msgid "Version %s" msgstr "Version %s" #: data.cpp:746 #, c-format msgid "Author: %s" msgstr "Auteur : %s" #: data.cpp:747 #, c-format msgid "Site: %s" msgstr "Site : %s" #: data.cpp:751 cpu-x-gtk-3.12.ui:5533 msgid "License" msgstr "Licence" #: data.cpp:753 #, c-format msgid "This software is distributed under the terms of %s" msgstr "Ce logiciel est distribué sous les termes de la %s" #: data.cpp:754 main.cpp:176 msgid "This program comes with ABSOLUTELY NO WARRANTY" msgstr "Ce programme est distribué SANS AUCUNE GARANTIE" #: gui_gtk.cpp:61 #, c-format msgid "Cannot find path for '%s' file" msgstr "Impossible de trouver le chemin du fichier '%s'" #: gui_gtk.cpp:400 msgid "Start daemon" msgstr "Démarrer le démon" #: gui_gtk.cpp:403 msgid "Connected to daemon" msgstr "Connecté au démon" #: gui_gtk.cpp:406 msgid "No polkit authentication agent found" msgstr "Aucun agent d'authentification Polkit trouvé" #: gui_gtk.cpp:411 msgid "Ask password to start daemon in background" msgstr "Demander le mot de passe pour démarrer le démon en arrière-plan" #: gui_gtk.cpp:415 msgid "Settings" msgstr "Réglages" #: gui_gtk.cpp:634 msgid "BaseFamily" msgstr "Famille de base" #: gui_gtk.cpp:635 msgid "CPU display (\"true\") family (computed as BaseFamily+ExtendedFamily)" msgstr "" "La famille CPU (« réelle ») affichée (calculée à partir de la famille de " "base et de la famille étendue)" #: gui_gtk.cpp:636 msgid "BaseModel" msgstr "Modèle de base" #: gui_gtk.cpp:637 msgid "CPU display (\"true\") model (computed as (ExtendedModel<<4)+BaseModel)" msgstr "" "Le modèle CPU (« réel ») affiché (calculé par (ExtendedModel<<4)+BaseModel)" #: gui_gtk.cpp:847 msgid "" "Identify the physically-labeled socket or board position where the memory " "device is located" msgstr "" "Identifie la position de la carte ou du port physiquement étiqueté où se " "trouve le périphérique mémoire" #: gui_gtk.cpp:848 msgid "Identify the physically labeled bank where the memory device is located" msgstr "" "Identifie le banc physiquement étiqueté où se trouve le périphérique mémoire" #: gui_gtk.cpp:1052 msgid "User Mode Driver Version" msgstr "Version du pilote mode utilisateur (UMD)" #: gui_gtk.cpp:1066 msgid "Vulkan Ray Tracing" msgstr "Vulkan Ray Tracing" #: gui_gtk.cpp:1260 msgid "Starting GTK GUI…" msgstr "Démarrage de l'interface graphique GTK…" #: gui_gtk.cpp:1272 msgid "failed to import UI in GtkBuilder" msgstr "échec lors de l'import de l'interface dans GtkBuilder" #: main.cpp:63 msgid "Start graphical user interface (GUI) (default)" msgstr "Démarre l’interface graphique utilisateur (GUI) (défaut)" #: main.cpp:64 msgid "Start text-based user interface (TUI)" msgstr "Démarre l'interface en mode texte (TUI)" #: main.cpp:65 msgid "Dump all data on standard output and exit" msgstr "Vide toutes les données sur la sortie standard et quitte" #: main.cpp:66 msgid "Run embedded command dmidecode and exit" msgstr "Lance la commande intégrée dmidecode et quitte" #: main.cpp:67 msgid "Run embedded command bandwidth and exit" msgstr "Lance la commande intégrée bandwidth et quitte" #: main.cpp:68 msgid "Set temperature unit (c[elsius]|f[ahrenheit]|k[elvin]|r[ankine])" msgstr "" "Définit l'unité des températures (c[elsius]|f[ahrenheit]|k[elvin]|r[ankine])" #: main.cpp:69 msgid "Set custom time between two refreshes (in seconds)" msgstr "" "Définit un temps personnalisé entre deux mises à jour de l'interface (en " "secondes)" #: main.cpp:70 msgid "Set default tab (integer)" msgstr "Définit l'onglet par défaut (entier)" #: main.cpp:71 msgid "Select core type to monitor (integer)" msgstr "Sélectionne le type de processeur à surveiller (entier)" #: main.cpp:72 msgid "Select CPU core to monitor (integer)" msgstr "Sélectionne le cœur du processeur à surveiller (entier)" #: main.cpp:73 msgid "Set custom bandwidth test for CPU caches speed (integer)" msgstr "" "Définit un test personnalisé de bande passante pour la vitesse des caches du " "processeur (entier)" #: main.cpp:74 msgid "Select default memory stick (integer)" msgstr "Définit la barrette mémoire par défaut (entier)" #: main.cpp:75 msgid "Select default graphic card (integer)" msgstr "Définit la carte graphique par défaut (entier)" #: main.cpp:76 cpu-x-gtk-3.12.ui:5910 msgid "Start and connect to daemon" msgstr "Démarrer le démon et s'y connecter" #: main.cpp:77 msgid "Verbose output" msgstr "Sortie bavarde" #: main.cpp:78 msgid "Print help and exit" msgstr "Affiche l'aide et quitte" #: main.cpp:79 msgid "Print version and exit" msgstr "Affiche la version et quitte" #: main.cpp:80 msgid "Print CPUID values in decimal (default is hexadeximal)" msgstr "Affiche les valeurs CPUID en décimal (en hexadécimal par défaut)" #: main.cpp:81 msgid "Disable colored output" msgstr "Désactive la sortie colorée" #: main.cpp:82 msgid "Print information for debugging" msgstr "Affiche les informations pour le débogage" #: main.cpp:83 msgid "Print required information to paste in an issue" msgstr "" "Affiche les informations nécessaires à coller dans un rapport de problèmes" #: main.cpp:84 msgid "Set key mapping for NCurses mode (a[rrows]|e[macs]|i[nverted-T]|v[im])" msgstr "" "Définit l'affectation des touches pour le mode NCurses ('a' pour les flèches " "directionnelles, 'e' pour Emacs, 'i' pour le mode inversé et 'v' pour Vim)" #: main.cpp:95 msgid "Add default command line arguments" msgstr "Ajoute les arguments de la ligne de commande par défaut" #: main.cpp:96 msgid "Enforce the bus clock" msgstr "Impose la fréquence du bus" #: main.cpp:97 msgid "" "Ignore CPU values reported by libcpuid (comma-separated values among 'temp', " "'volt' and 'freq')" msgstr "" "Ignore les valeurs processeur rapporté par libcpuid (liste de valeurs " "séparées par des virgules parmi 'temp', 'volt' et 'freq')" #: main.cpp:98 msgid "Read CPUID raw data from a given file" msgstr "Lis les données CPUID brutes depuis un fichier donné" #: main.cpp:99 msgid "Only print a message if CPU is not present in the database" msgstr "" "Affiche uniquement un message si le processeur n'est pas présent dans la " "base de données" #: main.cpp:126 #, c-format msgid "Usage: %s DISPLAY [OPTIONS]\n" msgstr "Utilisation : %s AFFICHAGE [OPTIONS]\n" #: main.cpp:127 msgid "Available DISPLAY:" msgstr "AFFICHAGE disponible :" #: main.cpp:135 msgid "Available OPTIONS:" msgstr "OPTIONS disponibles :" #: main.cpp:144 msgid "Influenceable environment variables:" msgstr "Variables d'environnements influençables :" #: main.cpp:175 msgid "This is free software: you are free to change and redistribute it." msgstr "" "Ceci est un logiciel libre : vous êtes libres de le modifier et de le " "redistribuer." #: main.cpp:177 #, c-format msgid "See the %s license: <%s>\n" msgstr "Voir la licence %s : <%s>\n" #: main.cpp:184 #, c-format msgid "-- %-9s version: %s" msgstr "-- Version de %-9s : %s" #: main.cpp:381 #, c-format msgid "" "\n" "Oops, something was wrong! %s has received signal %d (%s) and has crashed." msgstr "" "\n" "Oups, quelque chose s'est mal passé ! %s a reçu le signal %d (%s) et a " "planté." #: main.cpp:383 #, c-format msgid "" "\n" "Oops, something was wrong! %s has received signal %d (%s) and is trying to " "recover." msgstr "" "\n" "Oups, quelque chose s'est mal passé ! %s a reçu le signal %d (%s) et essaie " "de se remettre." #: main.cpp:407 msgid "You can open a new issue here, by filling the template as requested:" msgstr "" "Vous pouvez ouvrir un nouveau rapport de problèmes ici, en remplissant le " "modèle comme demandé :" #: main.cpp:449 msgid "an error occurred while setting locale" msgstr "une erreur est survenue lors de la définition des locales" #: options.cpp:124 #, c-format msgid "" "Selected CPU type (%u) is not a valid number (%u is the maximum for this CPU)" msgstr "" "Le type de processeur sélectionné (%u) n'est pas un nombre valide (%u est le " "maximum pour ce processeur)" #: options.cpp:145 #, c-format msgid "" "Selected bandwidth test (%u) is not a valid number (%u is the maximum for " "this system)" msgstr "" "Le type de test de bandwidth (%u) n'est pas un nombre valide (%u est le " "maximum pour ce système)" #: options.cpp:168 #, c-format msgid "" "Selected RAM stick (%u) is not a valid number (%u is the maximum for this " "system)" msgstr "" "La barrette de mémoire sélectionnée (%u) n'est pas un nombre valide (%u est " "le maximum pour ce système)" #: options.cpp:188 #, c-format msgid "" "Selected graphic card (%u) is not a valid number (%u is the maximum for this " "system)" msgstr "" "La carte-graphique sélectionnée (%u) n'est pas un nombre valide (%u est le " "maximum pour ce système)" #: options.cpp:204 #, c-format msgid "failed to change CPU affinitiy to core %u" msgstr "échec lors du changement de l'affinité processeur sur le cœur %u" #: options.cpp:210 #, c-format msgid "" "Selected CPU core (%u) is not a valid number (%u is the maximum for this " "type of core)" msgstr "" "Le cœur de processeur sélectionné (%u) n'est pas un nombre valide (%u est le " "maximum pour ce type de cœur)" #: options.cpp:284 #, c-format msgid "Selected tab (%u) is not a valid number (%u is the maximum)" msgstr "" "L'onglet sélectionné (%u) n'est pas un nombre valide (%u est le maximum)" #: tui_ncurses.cpp:111 msgid "Window is too small!" msgstr "La fenêtre est trop petite !" #: tui_ncurses.cpp:119 msgid "Press 'h' to see help." msgstr "Appuyer sur 'h' pour voir l'aide." #: tui_ncurses.cpp:232 #, c-format msgid "Welcome in %s NCurses help!\n" msgstr "Bienvenue dans l'aide pour NCurses de %s !\n" #: tui_ncurses.cpp:233 msgid "This help describes how to use this Text-based User Interface." msgstr "Cette aide décrit comment utiliser cette interface en mode texte." #: tui_ncurses.cpp:235 msgid "Global keys:" msgstr "Touches globales :" #: tui_ncurses.cpp:236 msgid "Press 'left' key or 'tab' key to switch in left tab." msgstr "" "Appuyer sur la touche 'flèche gauche' ou la touche 'tabulation' pour passer " "dans l'onglet de gauche." #: tui_ncurses.cpp:237 msgid "Press 'right' key or 'shift + tab' keys to switch in right tab." msgstr "" "Appuyer sur la touche 'flèche droite' ou les touches 'majuscule + " "tabulation' pour passer dans l'onglet de droite." #: tui_ncurses.cpp:238 msgid "Press 'h' key to see this help." msgstr "Appuyer sur la touche 'h' pour voir cette aide." #: tui_ncurses.cpp:239 msgid "Press 'q' key to exit." msgstr "Appuyer sur la touche 'q' pour quitter." #: tui_ncurses.cpp:241 msgid "CPU tab:" msgstr "Onglet processeur :" #: tui_ncurses.cpp:242 msgid "Press 'next page' key to decrease core type number to monitor." msgstr "" "Appuyer sur la touche 'page suivante' pour diminuer la valeur du type de " "processeur à surveiller." #: tui_ncurses.cpp:243 msgid "Press 'previous page' key to increase core type number to monitor." msgstr "" "Appuyer sur la touche 'page précédente' pour augmenter la valeur du type de " "processeur à surveiller." #: tui_ncurses.cpp:244 msgid "Press 'down' key to decrease CPU core number to monitor." msgstr "" "Appuyer sur la touche 'flèche bas' pour diminuer la valeur du cœur " "processeur à surveiller." #: tui_ncurses.cpp:245 msgid "Press 'up' key to increase CPU core number to monitor." msgstr "" "Appuyer sur la touche 'flèche haut' pour augmenter la valeur du cœur du " "processeur à surveiller." #: tui_ncurses.cpp:247 msgid "Caches tab:" msgstr "Onglet caches :" #: tui_ncurses.cpp:248 msgid "Press 'down' key to switch to previous test." msgstr "Appuyer sur la touche 'flèche bas' pour passer au test précédent." #: tui_ncurses.cpp:249 msgid "Press 'up' key to switch to next test." msgstr "Appuyer sur la touche 'flèche haut' pour passer au test suivant." #: tui_ncurses.cpp:251 msgid "Bench tab:" msgstr "Onglet Bench :" #: tui_ncurses.cpp:252 msgid "Press 'down' key to decrement benchmark duration." msgstr "" "Appuyer sur la touche 'flèche bas' pour décrémenter la durée du test de " "performance." #: tui_ncurses.cpp:253 msgid "Press 'up' key to increment benchmark duration." msgstr "" "Appuyer sur la touche 'flèche haut' pour incrémenter la durée du test de " "performance." #: tui_ncurses.cpp:254 msgid "Press 'next page' key to decrement number of threads to use." msgstr "" "Appuyer sur la touche 'page suivante' pour décrémenter le nombre de threads " "à utiliser." #: tui_ncurses.cpp:255 msgid "Press 'previous page' key to increment number of threads to use." msgstr "" "Appuyer sur la touche 'page précédente' pour incrémenter le nombre de " "threads à utiliser." #: tui_ncurses.cpp:256 msgid "Press 's' key to start/stop prime numbers (slow) benchmark." msgstr "" "Appuyer sur la touche 's' pour démarrer/arrêter le test de performance des " "nombres premier (lent)." #: tui_ncurses.cpp:257 msgid "Press 'f' key to start/stop prime numbers (fast) benchmark." msgstr "" "Appuyer sur la touche 'f' pour démarrer/arrêter le test de performance des " "nombres premier (rapide)." #: tui_ncurses.cpp:259 msgid "Graphics tab:" msgstr "Onglet graphiques :" #: tui_ncurses.cpp:260 msgid "Press 'down' key to switch to previous graphic card." msgstr "" "Appuyer sur la touche 'flèche bas' pour afficher la carte-graphique " "précédente." #: tui_ncurses.cpp:261 msgid "Press 'up' key to switch to next graphic card." msgstr "" "Appuyer sur la touche 'flèche haut' pour afficher la carte-graphique " "suivante." #: tui_ncurses.cpp:263 msgid "Press any key to exit this help." msgstr "Appuyer sur n'importe quelle touche pour quitter cette aide." #: tui_ncurses.cpp:640 msgid "Starting NCurses TUI…" msgstr "Démarrage de l'interface texte NCurses…" #: tui_ncurses.cpp:649 msgid "" "FATAL ERROR: terminfo database could not be found (try to set TERMINFO " "environment variable)" msgstr "" "ERREUR FATALE : la base de données terminfo ne peut pas être trouvée " "(essayez de spécifier la variable d'environnement TERMINFO)" #: tui_ncurses.cpp:654 #, c-format msgid "Failed to set up %s terminal (err=%i); falling back to %s" msgstr "La mise en place du terminal %s a échoué (err=%i) ; retour à %s" #: util.cpp:189 #, c-format msgid "cannot find unit in '%s' string at position %i" msgstr "impossible de trouver l'unité dans la chaîne « %s » à la position %i" #: util.cpp:252 #, c-format msgid "an error occurred while opening file '%s'" msgstr "une erreur est survenue lors de l'ouverture du fichier '%s'" #: util.cpp:297 #, c-format msgid "an error occurred while running command '%s'" msgstr "une erreur est survenue lors de l'exécution de la commande '%s'" #: util.cpp:437 msgid "set_cpu_affinity() not supported on this operating system" msgstr "set_cpu_affinity() n'est pas supportée sur ce système d'exploitation" #: data.hpp:103 data.hpp:244 data.hpp:332 msgid "Vendor" msgstr "Vendeur" #: data.hpp:104 msgid "Code Name" msgstr "Nom de code" #: data.hpp:105 msgid "Package" msgstr "Socket" #: data.hpp:106 msgid "Technology" msgstr "Technologie" #: data.hpp:107 data.hpp:268 msgid "Voltage" msgstr "Tension" #: data.hpp:108 msgid "Specification" msgstr "Spécification" #: data.hpp:109 msgid "Family" msgstr "Famille" #: data.hpp:110 msgid "Disp. Family" msgstr "Famille affichée" #: data.hpp:111 data.hpp:224 data.hpp:245 data.hpp:335 msgid "Model" msgstr "Modèle" #: data.hpp:112 msgid "Disp. Model" msgstr "Modèle affiché" #: data.hpp:113 msgid "Temp." msgstr "Temp." #: data.hpp:114 msgid "Stepping" msgstr "Révision" #: data.hpp:115 msgid "Instructions" msgstr "Instructions" #: data.hpp:125 msgid "L1 Data" msgstr "Données L1" #: data.hpp:126 msgid "L1 Inst." msgstr "Instr. L1" #: data.hpp:127 msgid "Level 2" msgstr "Niveau L2" #: data.hpp:128 msgid "Level 3" msgstr "Niveau L3" #: data.hpp:137 cpu-x-gtk-3.12.ui:1232 msgid "Cores" msgstr "Cœurs" #: data.hpp:138 data.hpp:408 cpu-x-gtk-3.12.ui:1252 msgid "Threads" msgstr "Fils" #: data.hpp:155 msgid "Core Speed" msgstr "Vitesse du cœur" #: data.hpp:156 msgid "Multiplier" msgstr "Multiplicateur" #: data.hpp:157 msgid "Bus Speed" msgstr "Vitesse du bus" #: data.hpp:158 data.hpp:341 msgid "Usage" msgstr "Utilisation" #: data.hpp:188 data.hpp:265 msgid "Size" msgstr "Taille" #: data.hpp:189 data.hpp:267 msgid "Speed" msgstr "Vitesse" #: data.hpp:223 data.hpp:259 msgid "Manufacturer" msgstr "Fabricant" #: data.hpp:225 msgid "Revision" msgstr "Révision" #: data.hpp:233 msgid "Brand" msgstr "Marque" #: data.hpp:234 msgid "Version" msgstr "Version" #: data.hpp:235 msgid "Date" msgstr "Date" #: data.hpp:236 msgid "ROM Size" msgstr "Taille de la ROM" #: data.hpp:260 msgid "Part Number" msgstr "Numéro de référence" #: data.hpp:261 msgid "Type" msgstr "Type" #: data.hpp:262 msgid "Type Detail" msgstr "Détails du type" #: data.hpp:263 msgid "Device Locator" msgstr "Emplacement barrette" #: data.hpp:264 msgid "Bank Locator" msgstr "Emplacement banc" #: data.hpp:266 msgid "Rank" msgstr "Rang" #: data.hpp:292 msgid "Name" msgstr "Nom" #: data.hpp:293 msgid "Kernel" msgstr "Noyau" #: data.hpp:294 msgid "Hostname" msgstr "Nom d'hôte" #: data.hpp:295 msgid "Uptime" msgstr "Disponibilité" #: data.hpp:303 msgid "Used" msgstr "Utilisée" #: data.hpp:304 msgid "Buffers" msgstr "Tampons" #: data.hpp:305 msgid "Cached" msgstr "Cachée" #: data.hpp:306 msgid "Free" msgstr "Libre" #: data.hpp:307 msgid "Swap" msgstr "Échange" #: data.hpp:333 msgid "Driver" msgstr "Pilote" #: data.hpp:334 msgid "UMD Version" msgstr "Version UMD" #: data.hpp:336 msgid "Compute Unit" msgstr "Unité de calcul" #: data.hpp:337 msgid "Device ID" msgstr "Identifiant" #: data.hpp:338 msgid "VBIOS Version" msgstr "Version VBIOS" #. #-#-#-#-# source_ui.pot (cpu-x ) #-#-#-#-# #. Setting: "Interface" tab #: data.hpp:339 cpu-x-gtk-3.12.ui:5807 msgid "Interface" msgstr "Interface" #: data.hpp:340 msgid "Temperature" msgstr "Température" #: data.hpp:342 msgid "Core Voltage" msgstr "Tension GPU" #: data.hpp:343 msgid "Power Avg" msgstr "Puissance" #: data.hpp:344 msgid "Core Clock" msgstr "Fréq. cœur" #: data.hpp:345 msgid "Memory Clock" msgstr "Fréq. mémoire" #: data.hpp:346 msgid "Memory Used" msgstr "Mémoire utilisée" #: data.hpp:347 msgid "Resizable BAR" msgstr "BAR redimensionnable" #: data.hpp:348 msgid "Vulkan RT" msgstr "Vulkan RT" #: data.hpp:349 msgid "OpenGL Version" msgstr "Version OpenGL" #: data.hpp:350 msgid "Vulkan Version" msgstr "Version Vulkan" #: data.hpp:351 msgid "OpenCL Version" msgstr "Version OpenCL" #: data.hpp:387 msgid "Score" msgstr "Score" #: data.hpp:388 msgid "Run" msgstr "État" #: data.hpp:407 msgid "Duration" msgstr "Durée" #: util.hpp:77 msgid "bytes" msgstr "octets" #. TRANSLATORS: initials for kilobyte (10³): please put initials (keep it short) #: util.hpp:80 msgid "kB" msgstr "ko" #. TRANSLATORS: initials for megabyte (10⁶): please put initials (keep it short) #: util.hpp:82 msgid "MB" msgstr "Mo" #. TRANSLATORS: initials for gigabyte (10⁹): please put initials (keep it short) #: util.hpp:84 msgid "GB" msgstr "Go" #. TRANSLATORS: initials for terabyte (10¹²): please put initials (keep it short) #: util.hpp:86 msgid "TB" msgstr "To" #. TRANSLATORS: initials for kibibyte (2¹⁰): please put initials (keep it short) #: util.hpp:89 msgid "KiB" msgstr "Kio" #. TRANSLATORS: initials for mebibyte (2²⁰): please put initials (keep it short) #: util.hpp:91 msgid "MiB" msgstr "Mio" #. TRANSLATORS: initials for gibibyte (2³⁰): please put initials (keep it short) #: util.hpp:93 msgid "GiB" msgstr "Gio" #. TRANSLATORS: initials for tebibyte (2⁴⁰): please put initials (keep it short) #: util.hpp:95 msgid "TiB" msgstr "Tio" #: cpu-x-gtk-3.12.ui:1184 msgid "Cache" msgstr "Cache" #. Setting: refresh time for UI #: cpu-x-gtk-3.12.ui:5721 msgid "Refresh time" msgstr "Temps de rafraîchissement" #. Setting: GUI theme #: cpu-x-gtk-3.12.ui:5745 msgid "Text theme" msgstr "Thème du texte" #. Setting: automatic GUI theme #: cpu-x-gtk-3.12.ui:5760 msgid "Automatic" msgstr "Automatique" #. Setting: light GUI theme #: cpu-x-gtk-3.12.ui:5761 msgid "Blue for light theme" msgstr "Bleu pour les thèmes clairs" #. Setting: dark GUI theme #: cpu-x-gtk-3.12.ui:5762 msgid "Yellow for dark theme" msgstr "Jaune pour les thèmes sombres" #. Setting: temperature unit #: cpu-x-gtk-3.12.ui:5775 msgid "Temperature unit" msgstr "Unité de température" #. Setting: default tab at startup #: cpu-x-gtk-3.12.ui:5826 msgid "Default tab" msgstr "Onglet par défaut" #. Setting: default CPU core at startup #: cpu-x-gtk-3.12.ui:5839 msgid "Default CPU core" msgstr "Cœur du processeur par défaut" #. Setting: default cache test at startup #: cpu-x-gtk-3.12.ui:5852 msgid "Default cache test" msgstr "Test de cache par défaut" #. Setting: print CPUID values in decimal or hexadecimal #: cpu-x-gtk-3.12.ui:5895 msgid "Print CPUID values in decimal" msgstr "Affiche les valeurs CPUID en décimal" #. Setting: default graphic card at startup #: cpu-x-gtk-3.12.ui:5928 msgid "Default graphic card" msgstr "Carte graphique par défaut" #. Setting: default CPU core at startup #: cpu-x-gtk-3.12.ui:5952 msgid "Default core type" msgstr "Type de cœur par défaut" #. Setting: default graphic card at startup #: cpu-x-gtk-3.12.ui:5976 msgid "Default memory stick" msgstr "Barrette de mémoire par défaut" #. Setting: "Startup" tab #: cpu-x-gtk-3.12.ui:6004 msgid "Startup" msgstr "Démarrage" #~ msgid "Light" #~ msgstr "Clair" #~ msgid "Dark" #~ msgstr "Foncé" #~ msgid "Calculating CPU multipliers" #~ msgstr "Calcule les multiplicateurs du processeur" #, c-format #~ msgid "Current: PCIe Gen%1dx%d / Max: Gen%1dx%d" #~ msgstr "Actuel : PCIe Gen%1dx%d / Max : Gen%1dx%d" #~ msgid "failed to retrieve GPU clocks" #~ msgstr "échec lors de la récupération des fréquences de la carte graphique" #, c-format #~ msgid "Core #%i" #~ msgstr "Cœur #%i" #~ msgid "Setting label names" #~ msgstr "Configuration du nom des étiquettes" #, c-format #~ msgid "Bank %i" #~ msgstr "Banc %i" #~ msgid "Reference" #~ msgstr "Référence" #~ msgid "Distribution" #~ msgstr "Distribution" #~ msgid "Compiler" #~ msgstr "Compilateur" #~ msgid "GPU clock" #~ msgstr "Fréq. GPU" #~ msgid "Dumping data…" #~ msgstr "Vidage des données…" #~ msgid "Freeing memory" #~ msgstr "Libère de la mémoire" #~ msgid "Ignore CPU frequency reported by libcpuid" #~ msgstr "Ignore la fréquence du processeur rapportée par libcpuid" #, c-format #~ msgid "failed to call wordexp (%i)" #~ msgstr "échec lors de l'appel de wordexp (%i)" #~ msgid "Press 'home' key to scroll up in a page." #~ msgstr "" #~ "Appuyer sur la touche 'début' pour défiler vers le haut dans une page." #~ msgid "Press 'end' key to scroll down in a page." #~ msgstr "Appuyer sur la touche 'fin' pour défiler vers le bas dans une page." #, c-format #~ msgid "String '%s' is too long, truncating…" #~ msgstr "La chaîne '%s' est trop longue, troncature…" #, c-format #~ msgid "failed to open %s directory" #~ msgstr "échec lors de l'ouverture du répertoire %s" #~ msgid "an error occurred while compiling regex" #~ msgstr "" #~ "une erreur est survenue lors de la compilation des expressions régulières" #~ msgid "FATAL ERROR: could not allocate memory" #~ msgstr "ERREUR FATALE : n'a pas pu réallouer la mémoire" #~ msgid "Enumerating Vulkan instance extension properties" #~ msgstr "Énumération des propriétés d'extension d'instance Vulkan" #, c-format #~ msgid "failed to call vkEnumerateInstanceExtensionProperties (%s)" #~ msgstr "" #~ "échec lors de l'appel de vkEnumerateInstanceExtensionProperties (%s)" #, c-format #~ msgid "" #~ "failed to call vkEnumerateInstanceExtensionProperties to fill " #~ "VkExtensionProperties (%s)" #~ msgstr "" #~ "échec lors de l'appel de vkEnumerateInstanceExtensionProperties pour " #~ "remplir VkExtensionProperties (%s)" #~ msgid "Vulkan API is not available" #~ msgstr "L'API Vulkan n'est pas disponible" #, c-format #~ msgid "%s" #~ msgstr "%s" #, c-format #~ msgid "" #~ "CPU hybrid architecture is not supported. For more details, please refer " #~ "to following issue: %s" #~ msgstr "" #~ "Ce processeur à architecture hybride n'est pas supporté. Pour plus " #~ "d'informations, veuillez vous référer au ticket suivant : %s" #~ msgid "NOT SUPPORTED" #~ msgstr "NON SUPPORTÉ" #, fuzzy #~| msgid "There is no platform with OpenCL support (%s)" #~ msgid "There is no device with Vulkan support" #~ msgstr "Il n'y a pas de plateforme prenant en charge OpenCL (%s)" #~ msgid "Socket(s)" #~ msgstr "Socket(s)" #~ msgid "Thread(s)" #~ msgstr "Thread(s)" #~ msgid "You can paste this backtrace by opening a new issue here:" #~ msgstr "" #~ "Vous pouvez coller la trace d'appels en ouvrant un nouveau rapport de " #~ "problèmes ici :" #, fuzzy #~| msgid "failed to call dmidecode" #~ msgid "faild to call clGetDeviceIDs" #~ msgstr "échec lors de l'appel de dmidecode" #~ msgid "Exiting %s" #~ msgstr "Quitte %s" #~ msgid "Skip CPU MSR opening (need to be root)" #~ msgstr "" #~ "Saute l'ouverture des MSR du processeur (besoin d'être super-utilisateur)" #~ msgid "failed to open CPU MSR (%s)" #~ msgstr "échec lors de l'ouverture des MSR du processeur (%s)" #~ msgid "Skip call to dmidecode (need to be root)" #~ msgstr "Saute l'appel de dmidecode (besoin d'être super-utilisateur)" #~ msgid "failed to allocate memory for dmidecode" #~ msgstr "échec lors de l'allocation de la mémoire pour dmidecode" #~ msgid "Finding graphic card driver" #~ msgstr "Recherche le pilote de la carte graphique" #~ msgid "(%s driver)" #~ msgstr "(pilote %s)" #~ msgid "Retrieving GPU temperature" #~ msgstr "Récupère la température du processeur graphique" #~ msgid "Off" #~ msgstr "Off" #~ msgid "failed to retrieve GPU temperature" #~ msgstr "" #~ "échec lors de la récupération de la température du processeur graphique" #~ msgid "Skip some GPU values (need to be root)" #~ msgstr "" #~ "Saute quelques valeurs pour la carte-graphique (besoin d'être super-" #~ "utilisateur)" #~ msgid "failed to allocate memory for benchmark" #~ msgstr "" #~ "échec lors de l'allocation de la mémoire pour le test de performance" #~ msgid "Root privileges are required to work properly" #~ msgstr "" #~ "Les privilèges du super-utilisateur sont requis pour fonctionner " #~ "correctement" #~ msgid "Some information will not be retrievable" #~ msgstr "Quelques données ne seront pas récupérables" #~ msgid "Ignore" #~ msgstr "Ignorer" #~ msgid "Run as root" #~ msgstr "Exécuter en tant que super-utilisateur" #~ msgid "A new version of %s is available!" #~ msgstr "Une nouvelle version de %s est disponible !" #~ msgid "" #~ "Do you want to update %s to version %s after exit?\n" #~ "It will erase this binary file (%s) by the new version." #~ msgstr "" #~ "Voulez-vous mettre à jour %s à la version %s après la fermeture du " #~ "programme ?\n" #~ "Cela va écraser le fichier binaire (%s) par la nouvelle version." #~ msgid "Not now" #~ msgstr "Pas maintenant" #~ msgid "Update" #~ msgstr "Mettre à jour" #~ msgid "Checking on Internet for a new version..." #~ msgstr "Vérifie l’existence d'une nouvelle version sur Internet..." #~ msgid "failed to open a Curl session" #~ msgstr "échec lors de l'ouverture d'une session Curl" #~ msgid "wrong write data" #~ msgstr "donnée en écriture incorrecte" #~ msgid "(version %s is available)" #~ msgstr "(la version %s est disponible)" #~ msgid "No new version available" #~ msgstr "Pas de nouvelle version de disponible" #~ msgid "(up-to-date)" #~ msgstr "(à jour)" #~ msgid "an error occurred while extracting %s archive (%s)" #~ msgstr "une erreur est survenue lors de l'extraction de l'archive %s (%s)" #~ msgid "" #~ "Network access is disabled by environment variable (set CPUX_NETWORK with " #~ "a positive value to enable it)" #~ msgstr "" #~ "L'accès au réseau est désactivé par une variable d'environnement " #~ "(définissez CPUX_NETWORK avec une valeur positive pour l'activer)" #~ msgid "failed to open %s archive for writing" #~ msgstr "échec lors de l'ouverture en écriture de l'archive %s" #~ msgid "Downloading new version..." #~ msgstr "Téléchargement de la nouvelle version..." #~ msgid "failed to download %s archive (%s)" #~ msgstr "échec lors du téléchargement de l'archive %s (%s)" #~ msgid "Extracting new version..." #~ msgstr "Extraction de la nouvelle version..." #~ msgid "Applying new version..." #~ msgstr "Application de la nouvelle version..." #~ msgid "an error occurred while removing/renaming files" #~ msgstr "" #~ "une erreur est survenue pendant la suppression/le renommage des fichiers" #~ msgid "Update successful!" #~ msgstr "Mise à jour réussie !" #~ msgid "Update portable version if a new version is available" #~ msgstr "" #~ "Mettre à jour la version portable si une nouvelle version est disponible" #~ msgid "Temporarily disable network support" #~ msgstr "Désactive le support du réseau temporairement" #~ msgid "Built on %s, %s (with %s %s on %s)." #~ msgstr "Compilé le %s à %s (avec %s %s sur %s)." #~ msgid "" #~ "Sorry, you cannot update %s: 32-bit portable version is no more supported." #~ msgstr "" #~ "Désolé, vous ne pouvez pas mettre à jour %s : la version portable 32 bits " #~ "n'est plus supportée." #~ msgid "If you want to update, press 'u' key, or anything else to skip.\n" #~ msgstr "" #~ "Si vous voulez mettre à jour, appuyez sur la touche 'u', ou bien " #~ "n'importe quoi d'autre pour passer.\n" #~ msgid "" #~ "\n" #~ "\n" #~ "%s will be updated." #~ msgstr "" #~ "\n" #~ "\n" #~ "%s va être mis à jour." CPU-X-5.0.3/po/hu.po000066400000000000000000000677621454622605200137750ustar00rootroot00000000000000# CPU-X translations template # Copyright © 2014-2024 The Tumultuous Unicorn Of Darkness # This file is distributed under the same license as the cpu-x package. # PB , 2020. msgid "" msgstr "" "Project-Id-Version: cpu-x\n" "Report-Msgid-Bugs-To: https://github.com/TheTumultuousUnicornOfDarkness/CPU-" "X/issues\n" "POT-Creation-Date: 2023-12-09 13:09+0100\n" "PO-Revision-Date: 2020-09-20 04:39+0000\n" "Last-Translator: PB \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 4.3-dev\n" #: core.cpp:135 msgid "Finding CPU technology" msgstr "CPU technológia meghatározása" #: core.cpp:161 #, c-format msgid "" "Your CPU is not present in the database ==> %s, model: %i, ext. model: %i, " "ext. family: %i" msgstr "" #: core.cpp:189 data.cpp:150 data.cpp:342 msgid "unknown" msgstr "" #: core.cpp:230 msgid "Calling libcpuid for retrieving static data" msgstr "" #: core.cpp:245 #, c-format msgid "failed to call libcpuid (%s)" msgstr "libcpuid hívása sikertelen (%s)" #: core.cpp:340 msgid "Calling libcpuid for retrieving dynamic data" msgstr "" #: core.cpp:353 msgid "Calling libcpuid for retrieving CPU MSR static values" msgstr "" #: core.cpp:380 msgid "Calling libcpuid for retrieving CPU MSR dynamic values" msgstr "" #: core.cpp:412 msgid "Calling dmidecode" msgstr "dmidecode hívása" #: core.cpp:454 core.cpp:473 #, c-format msgid "%s (configured)" msgstr "" #: core.cpp:461 core.cpp:480 #, c-format msgid "%s (max)" msgstr "" #: core.cpp:466 #, c-format msgid "%s (min)" msgstr "" #: core.cpp:496 msgid "Calculating CPU usage" msgstr "CPU használat kiszámítása" #: core.cpp:546 msgid "Calling bandwidth" msgstr "" #: core.cpp:613 #, c-format msgid "" "pci_access is not properly initialized: it is a common issue when %s was " "built with a lower libpci version.\n" "Check that libpci %s library is present on your system. Otherwise, please " "rebuild %s." msgstr "" #: core.cpp:657 #, c-format msgid "No kernel driver in use for graphic card at path %s" msgstr "A %s helyen lévő grafikus kártyához nincs kernel driver betöltve" #: core.cpp:693 #, fuzzy, c-format #| msgid "Your GPU driver is unknown: %s" msgid "Your GPU kernel driver is unknown: %s" msgstr "Ismeretlen GPU driver: %s" #: core.cpp:777 #, fuzzy, c-format #| msgid "Your GPU driver is unknown: %s" msgid "Your GPU user mode driver is unknown for vendor %s: %s" msgstr "Ismeretlen GPU driver: %s" #: core.cpp:781 #, fuzzy, c-format #| msgid "failed to call libcpuid (%s)" msgid "failed to call GLFW (%i): %s" msgstr "libcpuid hívása sikertelen (%s)" #: core.cpp:914 #, fuzzy #| msgid "Version" msgid "Finding Vulkan API version" msgstr "Verzió" #: core.cpp:926 #, fuzzy, c-format #| msgid "failed to call libcpuid (%s)" msgid "failed to call vkCreateInstance (%s)" msgstr "libcpuid hívása sikertelen (%s)" #: core.cpp:929 #, c-format msgid "%s is not supported" msgstr "" #: core.cpp:937 #, fuzzy, c-format #| msgid "failed to call libcpuid (%s)" msgid "failed to call vkEnumeratePhysicalDevices (%s)" msgstr "libcpuid hívása sikertelen (%s)" #: core.cpp:944 msgid "No available Vulkan devices" msgstr "" #: core.cpp:952 #, fuzzy, c-format #| msgid "failed to call libcpuid (%s)" msgid "No available physical devices (%s)" msgstr "libcpuid hívása sikertelen (%s)" #: core.cpp:1015 #, fuzzy, c-format #| msgid "failed to call libcpuid (%s)" msgid "Failed to create Vulkan for device %u (%s)" msgstr "libcpuid hívása sikertelen (%s)" #: core.cpp:1019 #, c-format msgid "%s is not supported for device %u, use only deviceID for matching" msgstr "" #: core.cpp:1051 core.cpp:1364 msgid "Enabled" msgstr "" #: core.cpp:1051 core.cpp:1364 msgid "Disabled" msgstr "" #: core.cpp:1088 #, fuzzy #| msgid "Version" msgid "Finding OpenCL API version" msgstr "Verzió" #: core.cpp:1092 #, c-format msgid "There is no platform with OpenCL support (%s)" msgstr "" #: core.cpp:1102 #, fuzzy, c-format #| msgid "failed to call libcpuid (%s)" msgid "failed to get all OpenCL platforms (%s)" msgstr "libcpuid hívása sikertelen (%s)" #: core.cpp:1115 #, c-format msgid "failed to get name for platform %u (%s)" msgstr "" #: core.cpp:1123 #, c-format msgid "failed to get version for platform %u (%s)" msgstr "" #: core.cpp:1131 #, c-format msgid "failed to find number of OpenCL devices for platform '%s %s' (%s)" msgstr "" #: core.cpp:1131 #, fuzzy #| msgid "Finding devices" msgid "0 device" msgstr "Eszközök keresése" #: core.cpp:1140 #, c-format msgid "failed to get all of OpenCL devices for platform '%s %s' (%s)" msgstr "" #: core.cpp:1160 #, fuzzy, c-format #| msgid "failed to call libcpuid (%s)" msgid "failed to get name for device %u (%s)" msgstr "libcpuid hívása sikertelen (%s)" #: core.cpp:1168 #, c-format msgid "failed to get version for device %u (%s)" msgstr "" #: core.cpp:1190 #, c-format msgid "OpenCL driver for '%s %s' does not support CL_DEVICE_TOPOLOGY_AMD (%s)" msgstr "" #: core.cpp:1201 #, c-format msgid "" "OpenCL driver for '%s %s' does not support CL_DEVICE_GFXIP_MAJOR_AMD (%s)" msgstr "" #: core.cpp:1209 core.cpp:1229 core.cpp:1262 #, c-format msgid "" "OpenCL driver for '%s %s' does not support CL_DEVICE_MAX_COMPUTE_UNITS (%s)" msgstr "" #: core.cpp:1250 #, c-format msgid "" "OpenCL driver for '%s %s' does not support CL_DEVICE_PCI_DOMAIN_ID_NV (%s), " "CL_DEVICE_PCI_BUS_ID_NV (%s) or CL_DEVICE_PCI_SLOT_ID_NV (%s)" msgstr "" #: core.cpp:1273 #, c-format msgid "OpenCL is not supported with your GPU vendor (0x%X)" msgstr "" #: core.cpp:1295 msgid "Finding devices" msgstr "Eszközök keresése" #: core.cpp:1307 #, c-format msgid "Skip devices search (wrong permissions on %s device)" msgstr "" #: core.cpp:1350 #, c-format msgid "Your GPU vendor is unknown: %s (0x%X)" msgstr "Ismeretlen GPU gyártó: %s (0x%X)" #: core.cpp:1370 msgid "failed to find chipset vendor and model" msgstr "nem sikerült a lapkakészlet gyártójának és modelljének meghatározása" #: core.cpp:1385 msgid "failed to find graphic card vendor and model" msgstr "" "nem sikerült a grafikus kártya gyártójának és modelljének meghatározása" #: core.cpp:1487 msgid "Retrieving GPU clocks" msgstr "" #: core.cpp:1500 msgid "None" msgstr "Nincs" #: core.cpp:1509 #, c-format msgid "DRM path for %s is unknown" msgstr "" #: core.cpp:1516 #, c-format msgid "Card number for %s is unknown" msgstr "" #: core.cpp:1541 #, c-format msgid "PCIe %s (current) / %s (max)" msgstr "" #: core.cpp:1650 #, c-format msgid "Driver for %s doesn't report frequencies" msgstr "" #: core.cpp:1671 #, fuzzy, c-format #| msgid "failed to call libcpuid (%s)" msgid "failed to retrieve all monitoring data for %s" msgstr "libcpuid hívása sikertelen (%s)" #: core.cpp:1694 msgid "Identifying running system" msgstr "" #: core.cpp:1697 msgid "failed to identify running system" msgstr "" #: core.cpp:1749 core.cpp:1778 msgid "Calling libprocps" msgstr "" #: core.cpp:1752 msgid "unable to get system uptime" msgstr "" #: core.cpp:1758 msgid "unable to create meminfo structure" msgstr "" #: core.cpp:1804 msgid "Calling libstatgrab" msgstr "" #: core.cpp:1852 #, c-format msgid "%i days, %i hours, %i minutes, %i seconds" msgstr "%i nap, %i óra, %i perc, %i másodperc" #: core.cpp:1915 msgid "Updating benchmark status" msgstr "" #: core.cpp:1918 msgid "Active" msgstr "Aktív" #: core.cpp:1921 #, c-format msgid "(%u hours left)" msgstr "(%u óra van hátra)" #: core.cpp:1923 #, c-format msgid "(%u minutes left)" msgstr "(%u perc van hátra)" #: core.cpp:1925 #, c-format msgid "(%u seconds left)" msgstr "(%u másodperc van hátra)" #: core.cpp:1929 core.cpp:1984 core.cpp:1985 msgid "Inactive" msgstr "Inaktív" #: core.cpp:1932 #, c-format msgid "in %u hours" msgstr "%u óra múlva" #: core.cpp:1934 #, c-format msgid "in %u minutes" msgstr "%u perc múlva" #: core.cpp:1936 #, c-format msgid "in %u seconds" msgstr "%u másodperc múlva" #: core.cpp:1953 #, c-format msgid "Starting benchmark with %u threads" msgstr "" #: core.cpp:1976 msgid "an error occurred while starting benchmark" msgstr "" #: core.cpp:2002 msgid "Finding CPU package in fallback mode" msgstr "" #: core.cpp:2032 #, c-format msgid "Your CPU socket is not present in the database ==> %s, codename: %s" msgstr "" #: core.cpp:2052 msgid "Calculating CPU multipliers in fallback mode" msgstr "" #: core.cpp:2072 msgid "Retrieving motherboard information in fallback mode" msgstr "" #: core.cpp:2085 msgid "failed to retrieve motherboard information (fallback mode)" msgstr "" #: core.cpp:2127 msgid "Retrieving CPU temperature in fallback mode" msgstr "" #: core.cpp:2173 msgid "failed to retrieve CPU temperature (fallback mode)" msgstr "" #: core.cpp:2188 msgid "Retrieving CPU voltage in fallback mode" msgstr "" #: core.cpp:2200 msgid "failed to retrieve CPU voltage (fallback mode)" msgstr "" #: core.cpp:2214 msgid "Retrieving CPU frequency in fallback mode" msgstr "" #: core.cpp:2220 msgid "failed to retrieve CPU frequency (fallback mode)" msgstr "" #: daemon_client.cpp:65 msgid "Starting daemon in background…" msgstr "" #: daemon_client.cpp:172 msgid "pkexec: authorization could not be obtained (dialog dismissed)" msgstr "" #: daemon_client.cpp:175 msgid "pkexec: authorization could not be obtained (not authorized)" msgstr "" #: daemon_client.cpp:178 msgid "pkexec: command not found" msgstr "" #: daemon_client.cpp:181 msgid "pkexec: unexpected error code" msgstr "" #: daemon_client.cpp:211 msgid "Connecting to daemon…" msgstr "" #: daemon_server.cpp:261 #, c-format msgid "request_handler: case %i not handled" msgstr "" #: data.cpp:124 cpu-x-gtk-3.12.ui:1370 msgid "CPU" msgstr "CPU" #: data.cpp:187 #, fuzzy #| msgid "Score" msgid "P-core" msgstr "Pontszám" #: data.cpp:188 #, fuzzy #| msgid "Score" msgid "E-core" msgstr "Pontszám" #: data.cpp:189 data.cpp:192 #, fuzzy #| msgid "Core(s)" msgid "Core" msgstr "Mag(ok)" #: data.cpp:208 cpu-x-gtk-3.12.ui:746 msgid "Processor" msgstr "Processzor" #: data.cpp:240 data.cpp:329 cpu-x-gtk-3.12.ui:1968 msgid "Caches" msgstr "Gyorsítótár" #: data.cpp:247 #, c-format msgid "%2d x %4d %s, %2d-way" msgstr "" #: data.cpp:249 #, c-format msgid "%d %s, %d-way" msgstr "" #: data.cpp:263 msgid "Count" msgstr "" #: data.cpp:276 cpu-x-gtk-3.12.ui:968 msgid "Clocks" msgstr "" #: data.cpp:379 data.cpp:383 #, fuzzy, c-format #| msgid "Caches" msgid "L%u Cache" msgstr "Gyorsítótár" #: data.cpp:385 #, c-format msgid "%s associative, %d-%s line size" msgstr "%s asszociatív, %d-%s vonalméret" #: data.cpp:398 msgid "Test" msgstr "" #: data.cpp:409 data.cpp:423 cpu-x-gtk-3.12.ui:2146 cpu-x-gtk-3.12.ui:2517 msgid "Motherboard" msgstr "Alaplap" #: data.cpp:437 cpu-x-gtk-3.12.ui:2367 msgid "BIOS" msgstr "BIOS" #: data.cpp:452 cpu-x-gtk-3.12.ui:2498 msgid "Chipset" msgstr "Lapkakészlet" #: data.cpp:467 data.cpp:569 cpu-x-gtk-3.12.ui:3156 cpu-x-gtk-3.12.ui:3761 msgid "Memory" msgstr "Memória" #: data.cpp:483 #, c-format msgid "Stick %u" msgstr "" #: data.cpp:487 cpu-x-gtk-3.12.ui:3134 msgid "Sticks" msgstr "" #: data.cpp:541 cpu-x-gtk-3.12.ui:3780 msgid "System" msgstr "" #: data.cpp:554 cpu-x-gtk-3.12.ui:3380 msgid "Operating System" msgstr "" #: data.cpp:587 cpu-x-gtk-3.12.ui:4960 msgid "Graphics" msgstr "" #: data.cpp:621 #, c-format msgid "Card %u" msgstr "" #: data.cpp:625 cpu-x-gtk-3.12.ui:4938 msgid "Cards" msgstr "" #: data.cpp:672 cpu-x-gtk-3.12.ui:5300 msgid "Bench" msgstr "" #: data.cpp:685 msgid "Not started" msgstr "Nincs elindítva" #: data.cpp:688 cpu-x-gtk-3.12.ui:5070 msgid "Prime numbers (slow)" msgstr "" #: data.cpp:692 cpu-x-gtk-3.12.ui:5178 msgid "Prime numbers (fast)" msgstr "" #: data.cpp:696 cpu-x-gtk-3.12.ui:5281 msgid "Parameters" msgstr "" #: data.cpp:721 data.cpp:727 #, c-format msgid "%u mins" msgstr "%u perc" #: data.cpp:734 cpu-x-gtk-3.12.ui:5444 cpu-x-gtk-3.12.ui:5552 msgid "About" msgstr "" #: data.cpp:739 #, c-format msgid "" "%s is a Free software that gathers information\n" "on CPU, motherboard and more." msgstr "" "%s egy szabad szoftver, amely a processzorról, alaplapról\n" "és egyéb hardverekről jelenít meg információt." #: data.cpp:744 msgid "About CPU-X" msgstr "" #: data.cpp:745 #, c-format msgid "Version %s" msgstr "Verzió: %s" #: data.cpp:746 #, c-format msgid "Author: %s" msgstr "" #: data.cpp:747 #, c-format msgid "Site: %s" msgstr "" #: data.cpp:751 cpu-x-gtk-3.12.ui:5533 msgid "License" msgstr "" #: data.cpp:753 #, c-format msgid "This software is distributed under the terms of %s" msgstr "" #: data.cpp:754 main.cpp:176 msgid "This program comes with ABSOLUTELY NO WARRANTY" msgstr "" #: gui_gtk.cpp:61 #, c-format msgid "Cannot find path for '%s' file" msgstr "" #: gui_gtk.cpp:400 msgid "Start daemon" msgstr "" #: gui_gtk.cpp:403 msgid "Connected to daemon" msgstr "" #: gui_gtk.cpp:406 msgid "No polkit authentication agent found" msgstr "" #: gui_gtk.cpp:411 msgid "Ask password to start daemon in background" msgstr "" #: gui_gtk.cpp:415 msgid "Settings" msgstr "" #: gui_gtk.cpp:634 #, fuzzy #| msgid "Family" msgid "BaseFamily" msgstr "Család" #: gui_gtk.cpp:635 msgid "CPU display (\"true\") family (computed as BaseFamily+ExtendedFamily)" msgstr "" #: gui_gtk.cpp:636 #, fuzzy #| msgid "Model" msgid "BaseModel" msgstr "Modell" #: gui_gtk.cpp:637 msgid "CPU display (\"true\") model (computed as (ExtendedModel<<4)+BaseModel)" msgstr "" #: gui_gtk.cpp:847 msgid "" "Identify the physically-labeled socket or board position where the memory " "device is located" msgstr "" #: gui_gtk.cpp:848 msgid "Identify the physically labeled bank where the memory device is located" msgstr "" #: gui_gtk.cpp:1052 #, fuzzy #| msgid "Version" msgid "User Mode Driver Version" msgstr "Verzió" #: gui_gtk.cpp:1066 msgid "Vulkan Ray Tracing" msgstr "" #: gui_gtk.cpp:1260 msgid "Starting GTK GUI…" msgstr "GTK GUI indítása…" #: gui_gtk.cpp:1272 msgid "failed to import UI in GtkBuilder" msgstr "" #: main.cpp:63 msgid "Start graphical user interface (GUI) (default)" msgstr "" #: main.cpp:64 msgid "Start text-based user interface (TUI)" msgstr "" #: main.cpp:65 msgid "Dump all data on standard output and exit" msgstr "" #: main.cpp:66 msgid "Run embedded command dmidecode and exit" msgstr "" #: main.cpp:67 msgid "Run embedded command bandwidth and exit" msgstr "" #: main.cpp:68 msgid "Set temperature unit (c[elsius]|f[ahrenheit]|k[elvin]|r[ankine])" msgstr "" #: main.cpp:69 msgid "Set custom time between two refreshes (in seconds)" msgstr "" #: main.cpp:70 msgid "Set default tab (integer)" msgstr "" #: main.cpp:71 msgid "Select core type to monitor (integer)" msgstr "" #: main.cpp:72 msgid "Select CPU core to monitor (integer)" msgstr "" #: main.cpp:73 msgid "Set custom bandwidth test for CPU caches speed (integer)" msgstr "" #: main.cpp:74 msgid "Select default memory stick (integer)" msgstr "" #: main.cpp:75 msgid "Select default graphic card (integer)" msgstr "" #: main.cpp:76 cpu-x-gtk-3.12.ui:5910 msgid "Start and connect to daemon" msgstr "" #: main.cpp:77 msgid "Verbose output" msgstr "" #: main.cpp:78 msgid "Print help and exit" msgstr "" #: main.cpp:79 msgid "Print version and exit" msgstr "Verziószám kiírása és kilépés" #: main.cpp:80 msgid "Print CPUID values in decimal (default is hexadeximal)" msgstr "" #: main.cpp:81 msgid "Disable colored output" msgstr "" #: main.cpp:82 msgid "Print information for debugging" msgstr "" #: main.cpp:83 msgid "Print required information to paste in an issue" msgstr "" #: main.cpp:84 msgid "Set key mapping for NCurses mode (a[rrows]|e[macs]|i[nverted-T]|v[im])" msgstr "" #: main.cpp:95 msgid "Add default command line arguments" msgstr "" #: main.cpp:96 msgid "Enforce the bus clock" msgstr "" #: main.cpp:97 msgid "" "Ignore CPU values reported by libcpuid (comma-separated values among 'temp', " "'volt' and 'freq')" msgstr "" #: main.cpp:98 msgid "Read CPUID raw data from a given file" msgstr "" #: main.cpp:99 msgid "Only print a message if CPU is not present in the database" msgstr "" #: main.cpp:126 #, c-format msgid "Usage: %s DISPLAY [OPTIONS]\n" msgstr "" #: main.cpp:127 msgid "Available DISPLAY:" msgstr "" #: main.cpp:135 msgid "Available OPTIONS:" msgstr "" #: main.cpp:144 msgid "Influenceable environment variables:" msgstr "" #: main.cpp:175 msgid "This is free software: you are free to change and redistribute it." msgstr "" #: main.cpp:177 #, c-format msgid "See the %s license: <%s>\n" msgstr "" #: main.cpp:184 #, c-format msgid "-- %-9s version: %s" msgstr "-- %-9s verzió: %s" #: main.cpp:381 #, c-format msgid "" "\n" "Oops, something was wrong! %s has received signal %d (%s) and has crashed." msgstr "" #: main.cpp:383 #, c-format msgid "" "\n" "Oops, something was wrong! %s has received signal %d (%s) and is trying to " "recover." msgstr "" #: main.cpp:407 msgid "You can open a new issue here, by filling the template as requested:" msgstr "" #: main.cpp:449 msgid "an error occurred while setting locale" msgstr "" #: options.cpp:124 #, c-format msgid "" "Selected CPU type (%u) is not a valid number (%u is the maximum for this CPU)" msgstr "" #: options.cpp:145 #, c-format msgid "" "Selected bandwidth test (%u) is not a valid number (%u is the maximum for " "this system)" msgstr "" #: options.cpp:168 #, c-format msgid "" "Selected RAM stick (%u) is not a valid number (%u is the maximum for this " "system)" msgstr "" #: options.cpp:188 #, c-format msgid "" "Selected graphic card (%u) is not a valid number (%u is the maximum for this " "system)" msgstr "" #: options.cpp:204 #, c-format msgid "failed to change CPU affinitiy to core %u" msgstr "" #: options.cpp:210 #, c-format msgid "" "Selected CPU core (%u) is not a valid number (%u is the maximum for this " "type of core)" msgstr "" #: options.cpp:284 #, c-format msgid "Selected tab (%u) is not a valid number (%u is the maximum)" msgstr "" #: tui_ncurses.cpp:111 msgid "Window is too small!" msgstr "" #: tui_ncurses.cpp:119 msgid "Press 'h' to see help." msgstr "" #: tui_ncurses.cpp:232 #, c-format msgid "Welcome in %s NCurses help!\n" msgstr "" #: tui_ncurses.cpp:233 msgid "This help describes how to use this Text-based User Interface." msgstr "" #: tui_ncurses.cpp:235 msgid "Global keys:" msgstr "" #: tui_ncurses.cpp:236 msgid "Press 'left' key or 'tab' key to switch in left tab." msgstr "" #: tui_ncurses.cpp:237 msgid "Press 'right' key or 'shift + tab' keys to switch in right tab." msgstr "" #: tui_ncurses.cpp:238 msgid "Press 'h' key to see this help." msgstr "" #: tui_ncurses.cpp:239 msgid "Press 'q' key to exit." msgstr "" #: tui_ncurses.cpp:241 msgid "CPU tab:" msgstr "" #: tui_ncurses.cpp:242 msgid "Press 'next page' key to decrease core type number to monitor." msgstr "" #: tui_ncurses.cpp:243 msgid "Press 'previous page' key to increase core type number to monitor." msgstr "" #: tui_ncurses.cpp:244 msgid "Press 'down' key to decrease CPU core number to monitor." msgstr "" #: tui_ncurses.cpp:245 msgid "Press 'up' key to increase CPU core number to monitor." msgstr "" #: tui_ncurses.cpp:247 #, fuzzy #| msgid "Caches" msgid "Caches tab:" msgstr "Gyorsítótár" #: tui_ncurses.cpp:248 msgid "Press 'down' key to switch to previous test." msgstr "" #: tui_ncurses.cpp:249 msgid "Press 'up' key to switch to next test." msgstr "" #: tui_ncurses.cpp:251 msgid "Bench tab:" msgstr "" #: tui_ncurses.cpp:252 msgid "Press 'down' key to decrement benchmark duration." msgstr "" #: tui_ncurses.cpp:253 msgid "Press 'up' key to increment benchmark duration." msgstr "" #: tui_ncurses.cpp:254 msgid "Press 'next page' key to decrement number of threads to use." msgstr "" #: tui_ncurses.cpp:255 msgid "Press 'previous page' key to increment number of threads to use." msgstr "" #: tui_ncurses.cpp:256 msgid "Press 's' key to start/stop prime numbers (slow) benchmark." msgstr "" #: tui_ncurses.cpp:257 msgid "Press 'f' key to start/stop prime numbers (fast) benchmark." msgstr "" #: tui_ncurses.cpp:259 msgid "Graphics tab:" msgstr "" #: tui_ncurses.cpp:260 msgid "Press 'down' key to switch to previous graphic card." msgstr "" #: tui_ncurses.cpp:261 msgid "Press 'up' key to switch to next graphic card." msgstr "" #: tui_ncurses.cpp:263 msgid "Press any key to exit this help." msgstr "" #: tui_ncurses.cpp:640 msgid "Starting NCurses TUI…" msgstr "" #: tui_ncurses.cpp:649 msgid "" "FATAL ERROR: terminfo database could not be found (try to set TERMINFO " "environment variable)" msgstr "" #: tui_ncurses.cpp:654 #, c-format msgid "Failed to set up %s terminal (err=%i); falling back to %s" msgstr "" #: util.cpp:189 #, c-format msgid "cannot find unit in '%s' string at position %i" msgstr "" #: util.cpp:252 #, c-format msgid "an error occurred while opening file '%s'" msgstr "" #: util.cpp:297 #, c-format msgid "an error occurred while running command '%s'" msgstr "" #: util.cpp:437 msgid "set_cpu_affinity() not supported on this operating system" msgstr "" #: data.hpp:103 data.hpp:244 data.hpp:332 msgid "Vendor" msgstr "Gyártó" #: data.hpp:104 msgid "Code Name" msgstr "Kódnév" #: data.hpp:105 msgid "Package" msgstr "" #: data.hpp:106 msgid "Technology" msgstr "Technológia" #: data.hpp:107 data.hpp:268 msgid "Voltage" msgstr "Feszültség" #: data.hpp:108 msgid "Specification" msgstr "" #: data.hpp:109 msgid "Family" msgstr "Család" #: data.hpp:110 #, fuzzy #| msgid "Ext. Family" msgid "Disp. Family" msgstr "Kit. Család" #: data.hpp:111 data.hpp:224 data.hpp:245 data.hpp:335 msgid "Model" msgstr "Modell" #: data.hpp:112 #, fuzzy #| msgid "Ext. Model" msgid "Disp. Model" msgstr "Kit. Modell" #: data.hpp:113 msgid "Temp." msgstr "Hőm." #: data.hpp:114 msgid "Stepping" msgstr "" #: data.hpp:115 msgid "Instructions" msgstr "Utasítások" #: data.hpp:125 msgid "L1 Data" msgstr "L1 adat" #: data.hpp:126 msgid "L1 Inst." msgstr "L1 utas." #: data.hpp:127 msgid "Level 2" msgstr "Level 2" #: data.hpp:128 msgid "Level 3" msgstr "Level 3" #: data.hpp:137 cpu-x-gtk-3.12.ui:1232 #, fuzzy #| msgid "Core(s)" msgid "Cores" msgstr "Mag(ok)" #: data.hpp:138 data.hpp:408 cpu-x-gtk-3.12.ui:1252 msgid "Threads" msgstr "Szál" #: data.hpp:155 msgid "Core Speed" msgstr "Mag sebessége" #: data.hpp:156 msgid "Multiplier" msgstr "Szorzó" #: data.hpp:157 msgid "Bus Speed" msgstr "Buszsebesség" #: data.hpp:158 data.hpp:341 msgid "Usage" msgstr "Kihasználtság" #: data.hpp:188 data.hpp:265 msgid "Size" msgstr "" #: data.hpp:189 data.hpp:267 msgid "Speed" msgstr "" #: data.hpp:223 data.hpp:259 msgid "Manufacturer" msgstr "Gyártó" #: data.hpp:225 msgid "Revision" msgstr "Revízió" #: data.hpp:233 msgid "Brand" msgstr "Márka" #: data.hpp:234 msgid "Version" msgstr "Verzió" #: data.hpp:235 msgid "Date" msgstr "Dátum" #: data.hpp:236 msgid "ROM Size" msgstr "" #: data.hpp:260 msgid "Part Number" msgstr "" #: data.hpp:261 #, fuzzy #| msgid "Core #%i" msgid "Type" msgstr "%i. mag" #: data.hpp:262 #, fuzzy #| msgid "Core #%i" msgid "Type Detail" msgstr "%i. mag" #: data.hpp:263 msgid "Device Locator" msgstr "" #: data.hpp:264 msgid "Bank Locator" msgstr "" #: data.hpp:266 msgid "Rank" msgstr "" #: data.hpp:292 #, fuzzy #| msgid "Code Name" msgid "Name" msgstr "Kódnév" #: data.hpp:293 msgid "Kernel" msgstr "" #: data.hpp:294 msgid "Hostname" msgstr "" #: data.hpp:295 msgid "Uptime" msgstr "" #: data.hpp:303 msgid "Used" msgstr "Használt" #: data.hpp:304 msgid "Buffers" msgstr "Puffer" #: data.hpp:305 msgid "Cached" msgstr "Gyorsítótárazott" #: data.hpp:306 msgid "Free" msgstr "Szabad" #: data.hpp:307 msgid "Swap" msgstr "Cserehely" #: data.hpp:333 msgid "Driver" msgstr "" #: data.hpp:334 #, fuzzy #| msgid "Version" msgid "UMD Version" msgstr "Verzió" #: data.hpp:336 msgid "Compute Unit" msgstr "" #: data.hpp:337 msgid "Device ID" msgstr "" #: data.hpp:338 #, fuzzy #| msgid "Version" msgid "VBIOS Version" msgstr "Verzió" #. #-#-#-#-# source_ui.pot (cpu-x ) #-#-#-#-# #. Setting: "Interface" tab #: data.hpp:339 cpu-x-gtk-3.12.ui:5807 msgid "Interface" msgstr "" #: data.hpp:340 msgid "Temperature" msgstr "" #: data.hpp:342 #, fuzzy #| msgid "Voltage" msgid "Core Voltage" msgstr "Feszültség" #: data.hpp:343 msgid "Power Avg" msgstr "" #: data.hpp:344 msgid "Core Clock" msgstr "" #: data.hpp:345 #, fuzzy #| msgid "Memory" msgid "Memory Clock" msgstr "Memória" #: data.hpp:346 #, fuzzy #| msgid "Memory" msgid "Memory Used" msgstr "Memória" #: data.hpp:347 msgid "Resizable BAR" msgstr "" #: data.hpp:348 msgid "Vulkan RT" msgstr "" #: data.hpp:349 #, fuzzy #| msgid "Version" msgid "OpenGL Version" msgstr "Verzió" #: data.hpp:350 #, fuzzy #| msgid "Version" msgid "Vulkan Version" msgstr "Verzió" #: data.hpp:351 #, fuzzy #| msgid "Version" msgid "OpenCL Version" msgstr "Verzió" #: data.hpp:387 msgid "Score" msgstr "Pontszám" #: data.hpp:388 msgid "Run" msgstr "" #: data.hpp:407 msgid "Duration" msgstr "" #: util.hpp:77 msgid "bytes" msgstr "bájt" #. TRANSLATORS: initials for kilobyte (10³): please put initials (keep it short) #: util.hpp:80 msgid "kB" msgstr "kB" #. TRANSLATORS: initials for megabyte (10⁶): please put initials (keep it short) #: util.hpp:82 msgid "MB" msgstr "MB" #. TRANSLATORS: initials for gigabyte (10⁹): please put initials (keep it short) #: util.hpp:84 msgid "GB" msgstr "GB" #. TRANSLATORS: initials for terabyte (10¹²): please put initials (keep it short) #: util.hpp:86 msgid "TB" msgstr "TB" #. TRANSLATORS: initials for kibibyte (2¹⁰): please put initials (keep it short) #: util.hpp:89 msgid "KiB" msgstr "" #. TRANSLATORS: initials for mebibyte (2²⁰): please put initials (keep it short) #: util.hpp:91 #, fuzzy #| msgid "MB" msgid "MiB" msgstr "MB" #. TRANSLATORS: initials for gibibyte (2³⁰): please put initials (keep it short) #: util.hpp:93 #, fuzzy #| msgid "GB" msgid "GiB" msgstr "GB" #. TRANSLATORS: initials for tebibyte (2⁴⁰): please put initials (keep it short) #: util.hpp:95 #, fuzzy #| msgid "TB" msgid "TiB" msgstr "TB" #: cpu-x-gtk-3.12.ui:1184 msgid "Cache" msgstr "" #. Setting: refresh time for UI #: cpu-x-gtk-3.12.ui:5721 msgid "Refresh time" msgstr "" #. Setting: GUI theme #: cpu-x-gtk-3.12.ui:5745 msgid "Text theme" msgstr "" #. Setting: automatic GUI theme #: cpu-x-gtk-3.12.ui:5760 msgid "Automatic" msgstr "" #. Setting: light GUI theme #: cpu-x-gtk-3.12.ui:5761 msgid "Blue for light theme" msgstr "" #. Setting: dark GUI theme #: cpu-x-gtk-3.12.ui:5762 msgid "Yellow for dark theme" msgstr "" #. Setting: temperature unit #: cpu-x-gtk-3.12.ui:5775 msgid "Temperature unit" msgstr "" #. Setting: default tab at startup #: cpu-x-gtk-3.12.ui:5826 msgid "Default tab" msgstr "" #. Setting: default CPU core at startup #: cpu-x-gtk-3.12.ui:5839 msgid "Default CPU core" msgstr "" #. Setting: default cache test at startup #: cpu-x-gtk-3.12.ui:5852 msgid "Default cache test" msgstr "" #. Setting: print CPUID values in decimal or hexadecimal #: cpu-x-gtk-3.12.ui:5895 msgid "Print CPUID values in decimal" msgstr "" #. Setting: default graphic card at startup #: cpu-x-gtk-3.12.ui:5928 msgid "Default graphic card" msgstr "" #. Setting: default CPU core at startup #: cpu-x-gtk-3.12.ui:5952 msgid "Default core type" msgstr "" #. Setting: default graphic card at startup #: cpu-x-gtk-3.12.ui:5976 msgid "Default memory stick" msgstr "" #. Setting: "Startup" tab #: cpu-x-gtk-3.12.ui:6004 msgid "Startup" msgstr "" #~ msgid "Calculating CPU multipliers" #~ msgstr "CPU szorzók kiszámítása" #, c-format #~ msgid "Core #%i" #~ msgstr "%i. mag" #, fuzzy, c-format #~| msgid "failed to call libcpuid (%s)" #~ msgid "failed to call wordexp (%i)" #~ msgstr "libcpuid hívása sikertelen (%s)" #~ msgid "FATAL ERROR: could not allocate memory" #~ msgstr "VÉGZETES HIBA: nem sikerült memóriát foglalni" #, fuzzy, c-format #~| msgid "failed to call libcpuid (%s)" #~ msgid "failed to call vkEnumerateInstanceExtensionProperties (%s)" #~ msgstr "libcpuid hívása sikertelen (%s)" #, c-format #~ msgid "%s" #~ msgstr "%s" #~ msgid "Socket(s)" #~ msgstr "Foglalat(ok)" #~ msgid "Thread(s)" #~ msgstr "Szál(ak)" #, fuzzy #~| msgid "failed to call libcpuid (%s)" #~ msgid "faild to call clGetDeviceIDs" #~ msgstr "libcpuid hívása sikertelen (%s)" CPU-X-5.0.3/po/id.po000066400000000000000000001125751454622605200137460ustar00rootroot00000000000000# Copyright © 2014-2024 The Tumultuous Unicorn Of Darkness # This file is distributed under the same license as the CPU-X package. # Translators: # Aunur Rofik , 2018 # Syahmin Sukhairi , 2019, 2021. # Allan Nordhøy , 2020. # Fredianto , 2020. # william mahagintha , 2020. # Reza Almanda , 2021. # whenwesober , 2021. # Jacque Fresco , 2021. # Reno Sifana Paksi , 2022. # Taufik Adi Wicaksono , 2023. # MagicalAlchemist , 2023. msgid "" msgstr "" "Project-Id-Version: CPU-X\n" "Report-Msgid-Bugs-To: https://github.com/TheTumultuousUnicornOfDarkness/CPU-" "X/issues\n" "POT-Creation-Date: 2023-12-09 13:09+0100\n" "PO-Revision-Date: 2023-10-23 05:02+0000\n" "Last-Translator: MagicalAlchemist \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.1\n" #: core.cpp:135 msgid "Finding CPU technology" msgstr "Mencari teknologi CPU" #: core.cpp:161 #, c-format msgid "" "Your CPU is not present in the database ==> %s, model: %i, ext. model: %i, " "ext. family: %i" msgstr "" "CPU Anda tidak ada dalam basis data ==> %s, model: %i, model luar: %i, " "keluarga luar: %i" #: core.cpp:189 data.cpp:150 data.cpp:342 msgid "unknown" msgstr "tidak dikenal" #: core.cpp:230 msgid "Calling libcpuid for retrieving static data" msgstr "Memanggil libcpuid untuk mengambil data statis" #: core.cpp:245 #, c-format msgid "failed to call libcpuid (%s)" msgstr "gagal memanggil libcpuid (%s)" #: core.cpp:340 msgid "Calling libcpuid for retrieving dynamic data" msgstr "Memanggil libcpuid untuk mengambil data dinamis" #: core.cpp:353 msgid "Calling libcpuid for retrieving CPU MSR static values" msgstr "Memanggil libcpuid untuk mengambil nilai statik CPU MSR" #: core.cpp:380 msgid "Calling libcpuid for retrieving CPU MSR dynamic values" msgstr "Memanggil libcpuid untuk mengambil nilai dinamis MSR CPU" #: core.cpp:412 msgid "Calling dmidecode" msgstr "Memanggil dmidecode" #: core.cpp:454 core.cpp:473 #, c-format msgid "%s (configured)" msgstr "%s (dikonfigurasi)" #: core.cpp:461 core.cpp:480 #, c-format msgid "%s (max)" msgstr "%s (maks)" #: core.cpp:466 #, c-format msgid "%s (min)" msgstr "%s (minimal)" #: core.cpp:496 msgid "Calculating CPU usage" msgstr "Menghitung penggunaan CPU" #: core.cpp:546 msgid "Calling bandwidth" msgstr "Memanggil lebar pita" #: core.cpp:613 #, c-format msgid "" "pci_access is not properly initialized: it is a common issue when %s was " "built with a lower libpci version.\n" "Check that libpci %s library is present on your system. Otherwise, please " "rebuild %s." msgstr "" "pci_access tidak diinisialisasi dengan benar: ini adalah masalah umum ketika " "%s dibangun dengan versi libpci yang lebih rendah.\n" "Periksa apakah pustaka libpci %s ada pada sistem Anda. Jika tidak, silakan " "bangun ulang %s." #: core.cpp:657 #, c-format msgid "No kernel driver in use for graphic card at path %s" msgstr "" "Tidak ada pengandar kernel yang digunakan oleh kartu grafis pada lokasi %s" #: core.cpp:693 #, c-format msgid "Your GPU kernel driver is unknown: %s" msgstr "Pengandar kernel GPU Anda tidak diketahui: %s" #: core.cpp:777 #, fuzzy, c-format #| msgid "Your GPU user mode driver is unknown: %s" msgid "Your GPU user mode driver is unknown for vendor %s: %s" msgstr "Pengandar mode pengguna GPU Anda tidak diketahui: %s" #: core.cpp:781 #, c-format msgid "failed to call GLFW (%i): %s" msgstr "gagal memanggil GLFW (%i): %s" #: core.cpp:914 msgid "Finding Vulkan API version" msgstr "Menemukan versi API Vulkan" #: core.cpp:926 #, c-format msgid "failed to call vkCreateInstance (%s)" msgstr "gagal memanggil vkCreateInstance (%s)" #: core.cpp:929 #, c-format msgid "%s is not supported" msgstr "%s tidak didukung" #: core.cpp:937 #, c-format msgid "failed to call vkEnumeratePhysicalDevices (%s)" msgstr "gagal memanggil vkEnumeratePhysicalDevices (%s)" #: core.cpp:944 msgid "No available Vulkan devices" msgstr "Tidak ada perangkat Vulkan yang tersedia" #: core.cpp:952 #, c-format msgid "No available physical devices (%s)" msgstr "Tidak ada perangkat fisik yang tersedia (%s)" #: core.cpp:1015 #, c-format msgid "Failed to create Vulkan for device %u (%s)" msgstr "Gagal membuat Vulkan untuk perangkat %u (%s)" #: core.cpp:1019 #, c-format msgid "%s is not supported for device %u, use only deviceID for matching" msgstr "" "%s tidak didukung untuk perangkat %u, gunakan hanya deviceID untuk pencocokan" #: core.cpp:1051 core.cpp:1364 msgid "Enabled" msgstr "Diaktifkan" #: core.cpp:1051 core.cpp:1364 msgid "Disabled" msgstr "Dinonaktifkan" #: core.cpp:1088 msgid "Finding OpenCL API version" msgstr "Temukan versi API OpenCL" #: core.cpp:1092 #, c-format msgid "There is no platform with OpenCL support (%s)" msgstr "Tidak terdapat platform dengan dukungan OpenCL (%s)" #: core.cpp:1102 #, c-format msgid "failed to get all OpenCL platforms (%s)" msgstr "gagal mendapatkan platform OpenCL (%s)" #: core.cpp:1115 #, c-format msgid "failed to get name for platform %u (%s)" msgstr "gagal untuk mendapatkan nama untuk platform %u (%s)" #: core.cpp:1123 #, c-format msgid "failed to get version for platform %u (%s)" msgstr "gagal untuk mendapatkan versi untuk platform %u (%s)" #: core.cpp:1131 #, c-format msgid "failed to find number of OpenCL devices for platform '%s %s' (%s)" msgstr "" "gagal untuk mendapatkan jumlah dari perangkat OpenCL untuk platform '%s " "%s' (%s)" #: core.cpp:1131 msgid "0 device" msgstr "0 perangkat" #: core.cpp:1140 #, c-format msgid "failed to get all of OpenCL devices for platform '%s %s' (%s)" msgstr "" "gagal untuk mendapatkan semua perangkat OpenCL dari platform '%s %s' (%s)" #: core.cpp:1160 #, c-format msgid "failed to get name for device %u (%s)" msgstr "gagal untuk mendapatkan nama untuk perangkat %u (%s)" #: core.cpp:1168 #, c-format msgid "failed to get version for device %u (%s)" msgstr "gagal untuk mendapatkan versi untuk perangkat %u (%s)" #: core.cpp:1190 #, c-format msgid "OpenCL driver for '%s %s' does not support CL_DEVICE_TOPOLOGY_AMD (%s)" msgstr "" "Pengandar OpenCL untuk '%s %s' tidak mendukung CL_DEVICE_TOPOLOGY_AMD (%s)" #: core.cpp:1201 #, c-format msgid "" "OpenCL driver for '%s %s' does not support CL_DEVICE_GFXIP_MAJOR_AMD (%s)" msgstr "" "Pengandar OpenCL untuk '%s %s' tidak mendukung CL_DEVICE_GFXIP_MAJOR_AMD (%s)" #: core.cpp:1209 core.cpp:1229 core.cpp:1262 #, c-format msgid "" "OpenCL driver for '%s %s' does not support CL_DEVICE_MAX_COMPUTE_UNITS (%s)" msgstr "" "Pengandar OpenCL untuk '%s %s' tidak mendukung CL_DEVICE_MAX_COMPUTE_UNITS " "(%s)" #: core.cpp:1250 #, c-format msgid "" "OpenCL driver for '%s %s' does not support CL_DEVICE_PCI_DOMAIN_ID_NV (%s), " "CL_DEVICE_PCI_BUS_ID_NV (%s) or CL_DEVICE_PCI_SLOT_ID_NV (%s)" msgstr "" "Pengandar OpenCL untuk '%s %s' tidak mendukung CL_DEVICE_PCI_DOMAIN_ID_NV " "(%s), CL_DEVICE_PCI_BUS_ID_NV (%s), atau CL_DEVICE_PCI_SLOT_ID_NV (%s)" #: core.cpp:1273 #, c-format msgid "OpenCL is not supported with your GPU vendor (0x%X)" msgstr "OpenCL tidak didukung oleh vendor GPU Anda (0x%X)" #: core.cpp:1295 msgid "Finding devices" msgstr "Menemukan perangkat" #: core.cpp:1307 #, c-format msgid "Skip devices search (wrong permissions on %s device)" msgstr "Lewati pencarian perangkat (kesalahan izin pada perangkat %s)" #: core.cpp:1350 #, c-format msgid "Your GPU vendor is unknown: %s (0x%X)" msgstr "Vendor GPU Anda tidak diketahui: %s (0x%X)" #: core.cpp:1370 msgid "failed to find chipset vendor and model" msgstr "gagal menemukan vendor dan model chipset" #: core.cpp:1385 msgid "failed to find graphic card vendor and model" msgstr "gagal menemukan vendor dan model kartu grafis" #: core.cpp:1487 msgid "Retrieving GPU clocks" msgstr "Mengambil GPU clock" #: core.cpp:1500 msgid "None" msgstr "Tidak ada" #: core.cpp:1509 #, c-format msgid "DRM path for %s is unknown" msgstr "Lokasi DRM untuk %s tidak diketahui" #: core.cpp:1516 #, c-format msgid "Card number for %s is unknown" msgstr "Nomor kartu %s tidak diketahui" #: core.cpp:1541 #, c-format msgid "PCIe %s (current) / %s (max)" msgstr "PCIe %s (saat ini) %s (maks)" #: core.cpp:1650 #, c-format msgid "Driver for %s doesn't report frequencies" msgstr "Driver untuk %s tidak dapat melaporkan frekuensi" #: core.cpp:1671 #, c-format msgid "failed to retrieve all monitoring data for %s" msgstr "Tidak dapat mengambil semua data pemantauan untuk %s" #: core.cpp:1694 msgid "Identifying running system" msgstr "Mengidentifikasi sistem yang berjalan" #: core.cpp:1697 msgid "failed to identify running system" msgstr "gagal mengidentifikasi sistem yang sedang berjalan" #: core.cpp:1749 core.cpp:1778 msgid "Calling libprocps" msgstr "Memanggil libprocps" #: core.cpp:1752 msgid "unable to get system uptime" msgstr "tidak bisa mendapatkan waktu aktif sistem" #: core.cpp:1758 msgid "unable to create meminfo structure" msgstr "tidak dapat membuat struktur meminfo" #: core.cpp:1804 msgid "Calling libstatgrab" msgstr "Memanggil libstatgrab" #: core.cpp:1852 #, c-format msgid "%i days, %i hours, %i minutes, %i seconds" msgstr "%i hari, %i jam, %i menit, %i detik" #: core.cpp:1915 msgid "Updating benchmark status" msgstr "Memperbarui status pengukuran" #: core.cpp:1918 msgid "Active" msgstr "Aktif" #: core.cpp:1921 #, c-format msgid "(%u hours left)" msgstr "(%u jam lagi)" #: core.cpp:1923 #, c-format msgid "(%u minutes left)" msgstr "(%u menit lagi)" #: core.cpp:1925 #, c-format msgid "(%u seconds left)" msgstr "(%u detik lagi)" #: core.cpp:1929 core.cpp:1984 core.cpp:1985 msgid "Inactive" msgstr "Tidak aktif" #: core.cpp:1932 #, c-format msgid "in %u hours" msgstr "dalam %u jam" #: core.cpp:1934 #, c-format msgid "in %u minutes" msgstr "dalam %u menit" #: core.cpp:1936 #, c-format msgid "in %u seconds" msgstr "dalam %u detik" #: core.cpp:1953 #, c-format msgid "Starting benchmark with %u threads" msgstr "Mulai benchmark dengan %u thread" #: core.cpp:1976 msgid "an error occurred while starting benchmark" msgstr "Terjadi kesalahan saat memulai pengukuran" #: core.cpp:2002 msgid "Finding CPU package in fallback mode" msgstr "Menemukan paket CPU dalam mode fallback" #: core.cpp:2032 #, c-format msgid "Your CPU socket is not present in the database ==> %s, codename: %s" msgstr "Soket CPU Anda tidak ada dalam basis data ==> %s, nama kode: %s" #: core.cpp:2052 msgid "Calculating CPU multipliers in fallback mode" msgstr "Menghitung pengali CPU dalam mode fallback" #: core.cpp:2072 msgid "Retrieving motherboard information in fallback mode" msgstr "Mengambil informasi papan induk di mode fallback" #: core.cpp:2085 msgid "failed to retrieve motherboard information (fallback mode)" msgstr "gagal mengambil informasi papan induk (mode fallback)" #: core.cpp:2127 msgid "Retrieving CPU temperature in fallback mode" msgstr "Mengambil suhu CPU di mode fallback" #: core.cpp:2173 msgid "failed to retrieve CPU temperature (fallback mode)" msgstr "gagal mengambil suhu CPU (mode fallback)" #: core.cpp:2188 msgid "Retrieving CPU voltage in fallback mode" msgstr "Mengambil tegangan CPU di mode fallback" #: core.cpp:2200 msgid "failed to retrieve CPU voltage (fallback mode)" msgstr "gagal mengambil tegangan CPU (mode fallback)" #: core.cpp:2214 msgid "Retrieving CPU frequency in fallback mode" msgstr "Mengambil frekuensi CPU di mode fallback" #: core.cpp:2220 msgid "failed to retrieve CPU frequency (fallback mode)" msgstr "gagal mengambil frekuensi CPU (mode fallback)" #: daemon_client.cpp:65 msgid "Starting daemon in background…" msgstr "Memulai daemon di latar belakang…" #: daemon_client.cpp:172 msgid "pkexec: authorization could not be obtained (dialog dismissed)" msgstr "pkexec: otorisasi tidak dapat diperoleh (dialog dihentikan)" #: daemon_client.cpp:175 msgid "pkexec: authorization could not be obtained (not authorized)" msgstr "pkexec: otorisasi tidak dapat diperoleh (tidak diizinkan)" #: daemon_client.cpp:178 msgid "pkexec: command not found" msgstr "pkexec: perintah tidak ditemukan" #: daemon_client.cpp:181 msgid "pkexec: unexpected error code" msgstr "pkexec: kode kesalahan tak terduga" #: daemon_client.cpp:211 msgid "Connecting to daemon…" msgstr "Menghubungkan ke daemon…" #: daemon_server.cpp:261 #, c-format msgid "request_handler: case %i not handled" msgstr "request_handler: kasus %i tidak ditangani" #: data.cpp:124 cpu-x-gtk-3.12.ui:1370 msgid "CPU" msgstr "CPU" #: data.cpp:187 msgid "P-core" msgstr "Inti-P" #: data.cpp:188 msgid "E-core" msgstr "Inti-E" #: data.cpp:189 data.cpp:192 msgid "Core" msgstr "Inti" #: data.cpp:208 cpu-x-gtk-3.12.ui:746 msgid "Processor" msgstr "Prosesor" #: data.cpp:240 data.cpp:329 cpu-x-gtk-3.12.ui:1968 msgid "Caches" msgstr "Tembolok" #: data.cpp:247 #, c-format msgid "%2d x %4d %s, %2d-way" msgstr "%2d x %4d %s, %2d-arah" #: data.cpp:249 #, c-format msgid "%d %s, %d-way" msgstr "%d %s, %d -arah" #: data.cpp:263 msgid "Count" msgstr "Hitungan" #: data.cpp:276 cpu-x-gtk-3.12.ui:968 msgid "Clocks" msgstr "Clock" #: data.cpp:379 data.cpp:383 #, c-format msgid "L%u Cache" msgstr "Tembolok L%u" #: data.cpp:385 #, c-format msgid "%s associative, %d-%s line size" msgstr "%s asosiatif, ukuran baris %d-%s" #: data.cpp:398 msgid "Test" msgstr "Tes" #: data.cpp:409 data.cpp:423 cpu-x-gtk-3.12.ui:2146 cpu-x-gtk-3.12.ui:2517 msgid "Motherboard" msgstr "Papan Induk" #: data.cpp:437 cpu-x-gtk-3.12.ui:2367 msgid "BIOS" msgstr "BIOS" #: data.cpp:452 cpu-x-gtk-3.12.ui:2498 msgid "Chipset" msgstr "Chipset" #: data.cpp:467 data.cpp:569 cpu-x-gtk-3.12.ui:3156 cpu-x-gtk-3.12.ui:3761 msgid "Memory" msgstr "Memori" #: data.cpp:483 #, c-format msgid "Stick %u" msgstr "Batang %u" #: data.cpp:487 cpu-x-gtk-3.12.ui:3134 msgid "Sticks" msgstr "Batang" #: data.cpp:541 cpu-x-gtk-3.12.ui:3780 msgid "System" msgstr "Sistem" #: data.cpp:554 cpu-x-gtk-3.12.ui:3380 msgid "Operating System" msgstr "Sistem Operasi" #: data.cpp:587 cpu-x-gtk-3.12.ui:4960 msgid "Graphics" msgstr "Grafis" #: data.cpp:621 #, c-format msgid "Card %u" msgstr "Kartu %u" #: data.cpp:625 cpu-x-gtk-3.12.ui:4938 msgid "Cards" msgstr "Kartu" #: data.cpp:672 cpu-x-gtk-3.12.ui:5300 msgid "Bench" msgstr "Pengukuran" #: data.cpp:685 msgid "Not started" msgstr "Belum dimulai" #: data.cpp:688 cpu-x-gtk-3.12.ui:5070 msgid "Prime numbers (slow)" msgstr "Bilangan prima (lambat)" #: data.cpp:692 cpu-x-gtk-3.12.ui:5178 msgid "Prime numbers (fast)" msgstr "Bilangan prima (cepat)" #: data.cpp:696 cpu-x-gtk-3.12.ui:5281 msgid "Parameters" msgstr "Parameter" #: data.cpp:721 data.cpp:727 #, c-format msgid "%u mins" msgstr "%u menit" #: data.cpp:734 cpu-x-gtk-3.12.ui:5444 cpu-x-gtk-3.12.ui:5552 msgid "About" msgstr "Tentang" #: data.cpp:739 #, c-format msgid "" "%s is a Free software that gathers information\n" "on CPU, motherboard and more." msgstr "" "%s adalah perangkat lunak gratis yang mengumpulkan informasi\n" "CPU, papan induk, dan lainnya." #: data.cpp:744 msgid "About CPU-X" msgstr "Tentang CPU-X" #: data.cpp:745 #, c-format msgid "Version %s" msgstr "Versi %s" #: data.cpp:746 #, c-format msgid "Author: %s" msgstr "Pembuat: %s" #: data.cpp:747 #, c-format msgid "Site: %s" msgstr "Situs: %s" #: data.cpp:751 cpu-x-gtk-3.12.ui:5533 msgid "License" msgstr "Lisensi" #: data.cpp:753 #, c-format msgid "This software is distributed under the terms of %s" msgstr "Perangkat lunak ini didistribusikan di bawah aturan %s" #: data.cpp:754 main.cpp:176 msgid "This program comes with ABSOLUTELY NO WARRANTY" msgstr "Program ini hadir dengan TANPA JAMINAN APA PUN" #: gui_gtk.cpp:61 #, c-format msgid "Cannot find path for '%s' file" msgstr "Jalur untuk berkas '%s' tidak dapat ditemukan" #: gui_gtk.cpp:400 msgid "Start daemon" msgstr "Memulai daemon" #: gui_gtk.cpp:403 msgid "Connected to daemon" msgstr "Terhubung ke daemon" #: gui_gtk.cpp:406 msgid "No polkit authentication agent found" msgstr "Agen autentikasi polkit tidak ditemukan" #: gui_gtk.cpp:411 msgid "Ask password to start daemon in background" msgstr "Meminta kata sandi untuk memulai daemon di latar belakang" #: gui_gtk.cpp:415 msgid "Settings" msgstr "Pengaturan" #: gui_gtk.cpp:634 msgid "BaseFamily" msgstr "KeluargaDasar" #: gui_gtk.cpp:635 msgid "CPU display (\"true\") family (computed as BaseFamily+ExtendedFamily)" msgstr "" "Tampilan CPU (\"benar\") keluarga (dihitung sebagai " "KeluargaDasar+KeluargaBesar)" #: gui_gtk.cpp:636 msgid "BaseModel" msgstr "ModelDasar" #: gui_gtk.cpp:637 msgid "CPU display (\"true\") model (computed as (ExtendedModel<<4)+BaseModel)" msgstr "" "Model tampilan CPU (\"benar\") (dihitung sebagai " "(ExtendedModel<<4)+ModelDasar)" #: gui_gtk.cpp:847 msgid "" "Identify the physically-labeled socket or board position where the memory " "device is located" msgstr "" "Tentukan lokasi soket atau papan yang ditandai secara fisik dimana perangkat " "memori berada" #: gui_gtk.cpp:848 msgid "Identify the physically labeled bank where the memory device is located" msgstr "" "Tentukan bank yang diberi tag secara fisik tempat perangkat memori berada" #: gui_gtk.cpp:1052 msgid "User Mode Driver Version" msgstr "Versi Pengandar Mode Pengguna" #: gui_gtk.cpp:1066 msgid "Vulkan Ray Tracing" msgstr "Pelacakan Sinar Vulkan" #: gui_gtk.cpp:1260 msgid "Starting GTK GUI…" msgstr "Memulai GUI GTK…" #: gui_gtk.cpp:1272 msgid "failed to import UI in GtkBuilder" msgstr "gagal mengimpor UI dalam GtkBuilder" #: main.cpp:63 msgid "Start graphical user interface (GUI) (default)" msgstr "Mulai antarmuka pengguna grafis (GUI) (bawaan)" #: main.cpp:64 msgid "Start text-based user interface (TUI)" msgstr "Mulai antarmuka pengguna berbasis teks (TUI)" #: main.cpp:65 msgid "Dump all data on standard output and exit" msgstr "Buang semua data pada keluaran standar dan keluar" #: main.cpp:66 msgid "Run embedded command dmidecode and exit" msgstr "Jalankan perintah dmidecode tertanam dan keluar" #: main.cpp:67 msgid "Run embedded command bandwidth and exit" msgstr "Jalankan perintah lebar pita tertanam dan keluar" #: main.cpp:68 msgid "Set temperature unit (c[elsius]|f[ahrenheit]|k[elvin]|r[ankine])" msgstr "Atur unit temperatur (c[elsius]|f[ahrenheit]|k[elvin]|r[ankine])" #: main.cpp:69 msgid "Set custom time between two refreshes (in seconds)" msgstr "Atur waktu khusus di antara dua penyegaran (dalam detik)" #: main.cpp:70 msgid "Set default tab (integer)" msgstr "Setel tab bawaan (integer)" #: main.cpp:71 msgid "Select core type to monitor (integer)" msgstr "Pilih jenis inti yang akan dipantau (integer)" #: main.cpp:72 msgid "Select CPU core to monitor (integer)" msgstr "Pilih inti CPU untuk dipantau (integer)" #: main.cpp:73 msgid "Set custom bandwidth test for CPU caches speed (integer)" msgstr "" "Setel pengujian lebar pita khusus untuk kecepatan tembolok CPU (integer)" #: main.cpp:74 msgid "Select default memory stick (integer)" msgstr "Pilih modul memori bawaan (tipe integer)" #: main.cpp:75 msgid "Select default graphic card (integer)" msgstr "Pilih kartu grafis bawaan (integer)" #: main.cpp:76 cpu-x-gtk-3.12.ui:5910 msgid "Start and connect to daemon" msgstr "Mulai dan sambungkan daemon" #: main.cpp:77 msgid "Verbose output" msgstr "Keluaran verbose" #: main.cpp:78 msgid "Print help and exit" msgstr "Cetak bantuan dan keluar" #: main.cpp:79 msgid "Print version and exit" msgstr "Cetak versi dan keluar" #: main.cpp:80 msgid "Print CPUID values in decimal (default is hexadeximal)" msgstr "Cetak nilai desimal CPUID (nilai bawaannya adalah heksadesimal)" #: main.cpp:81 msgid "Disable colored output" msgstr "Nonaktifkan keluaran berwarna" #: main.cpp:82 msgid "Print information for debugging" msgstr "Cetak informasi untuk awakutu" #: main.cpp:83 msgid "Print required information to paste in an issue" msgstr "Cetak informasi yang diperlukan untuk ditempelkan dalam sebuah isu" #: main.cpp:84 msgid "Set key mapping for NCurses mode (a[rrows]|e[macs]|i[nverted-T]|v[im])" msgstr "" "Atur pemetaan kunci untuk mode NCurses (a[rrows]|e[macs]|i[nverted-T]|v[im])" #: main.cpp:95 msgid "Add default command line arguments" msgstr "Tambah argumen baris perintah bawaan" #: main.cpp:96 msgid "Enforce the bus clock" msgstr "Terapkan bus clock" #: main.cpp:97 msgid "" "Ignore CPU values reported by libcpuid (comma-separated values among 'temp', " "'volt' and 'freq')" msgstr "" "Abaikan Nilai CPU yang dilaporkan oleh libcpuid (nilai koma-terpisah antara " "'temp', 'volt' and 'freq')" #: main.cpp:98 msgid "Read CPUID raw data from a given file" msgstr "Baca data mentah CPUID dari berkas tertentu" #: main.cpp:99 msgid "Only print a message if CPU is not present in the database" msgstr "Hanya mencetak pesan jika CPU tidak ada dalam basis data" #: main.cpp:126 #, c-format msgid "Usage: %s DISPLAY [OPTIONS]\n" msgstr "Penggunaan: %s MENAMPILKAN [OPSI]\n" #: main.cpp:127 msgid "Available DISPLAY:" msgstr "TAMPILAN yang tersedia:" #: main.cpp:135 msgid "Available OPTIONS:" msgstr "OPSI yang Tersedia:" #: main.cpp:144 msgid "Influenceable environment variables:" msgstr "Variabel lingkungan yang dapat dipengaruhi:" #: main.cpp:175 msgid "This is free software: you are free to change and redistribute it." msgstr "" "Ini adalah perangkat lunak gratis: Anda bebas untuk mengubah dan " "mendistribusikannya kembali." #: main.cpp:177 #, c-format msgid "See the %s license: <%s>\n" msgstr "Lihat %s lisensi: <%s>\n" #: main.cpp:184 #, c-format msgid "-- %-9s version: %s" msgstr "-- %-9s versi: %s" #: main.cpp:381 #, c-format msgid "" "\n" "Oops, something was wrong! %s has received signal %d (%s) and has crashed." msgstr "" "\n" "Ups, ada yang salah! %s telah menerima sinyal %d (%s) dan mengalami gangguan." #: main.cpp:383 #, c-format msgid "" "\n" "Oops, something was wrong! %s has received signal %d (%s) and is trying to " "recover." msgstr "" "\n" "Ups, ada yang salah! %s telah menerima sinyal %d (%s) dan sedang mencoba " "untuk pulih." #: main.cpp:407 msgid "You can open a new issue here, by filling the template as requested:" msgstr "" "Anda dapat membuka isu baru di sini, dengan mengisi templat seperti yang " "diminta:" #: main.cpp:449 msgid "an error occurred while setting locale" msgstr "terjadi kesalahan saat mengatur lokasi" #: options.cpp:124 #, c-format msgid "" "Selected CPU type (%u) is not a valid number (%u is the maximum for this CPU)" msgstr "" "Jenis CPU yang dipilih (%u) bukan merupakan angka yang valid (%u adalah " "angka maksimum untuk CPU ini)" #: options.cpp:145 #, c-format msgid "" "Selected bandwidth test (%u) is not a valid number (%u is the maximum for " "this system)" msgstr "" "Tes bandwidth yang dipilih (%u) bukan merupakan angka yang valid (%u adalah " "angka maksimum untuk sistem ini)" #: options.cpp:168 #, c-format msgid "" "Selected RAM stick (%u) is not a valid number (%u is the maximum for this " "system)" msgstr "" "Modul RAM yang dipilih (%u) bukan angka yang valid (%u adalah jumlah " "maksimum untuk sistem ini)" #: options.cpp:188 #, c-format msgid "" "Selected graphic card (%u) is not a valid number (%u is the maximum for this " "system)" msgstr "" "Kartu grafis yang dipilih (%u) bukan angka yang valid (%u adalah jumlah " "maksimum untuk sistem ini)" #: options.cpp:204 #, c-format msgid "failed to change CPU affinitiy to core %u" msgstr "gagal mengubah afinitas CPU ke inti %u" #: options.cpp:210 #, c-format msgid "" "Selected CPU core (%u) is not a valid number (%u is the maximum for this " "type of core)" msgstr "" "Inti CPU yang dipilih (%u) bukan merupakan angka yang valid (%u adalah angka " "maksimum untuk jenis inti ini)" #: options.cpp:284 #, c-format msgid "Selected tab (%u) is not a valid number (%u is the maximum)" msgstr "Tab yang dipilih (%u) bukan angka yang valid (%u adalah maksimum)" #: tui_ncurses.cpp:111 msgid "Window is too small!" msgstr "Jendela terlalu kecil!" #: tui_ncurses.cpp:119 msgid "Press 'h' to see help." msgstr "Tekan 'h' untuk melihat bantuan." #: tui_ncurses.cpp:232 #, c-format msgid "Welcome in %s NCurses help!\n" msgstr "Selamat datang di %s bantuan NCurses!\n" #: tui_ncurses.cpp:233 msgid "This help describes how to use this Text-based User Interface." msgstr "" "Bantuan ini menjelaskan cara menggunakan Antarmuka Pengguna Berbasis Teks." #: tui_ncurses.cpp:235 msgid "Global keys:" msgstr "Kunci global:" #: tui_ncurses.cpp:236 msgid "Press 'left' key or 'tab' key to switch in left tab." msgstr "Tekan tombol 'kiri' atau tombol 'tab' untuk beralih ke tab kiri." #: tui_ncurses.cpp:237 msgid "Press 'right' key or 'shift + tab' keys to switch in right tab." msgstr "" "Tekan tombol 'kanan' atau tombol 'shift + tab' untuk beralih ke tab kanan." #: tui_ncurses.cpp:238 msgid "Press 'h' key to see this help." msgstr "Tekan tombol 'h' untuk melihat bantuan ini." #: tui_ncurses.cpp:239 msgid "Press 'q' key to exit." msgstr "Tekan 'q' untuk keluar." #: tui_ncurses.cpp:241 msgid "CPU tab:" msgstr "Tab CPU:" #: tui_ncurses.cpp:242 msgid "Press 'next page' key to decrease core type number to monitor." msgstr "" "Tekan tombol 'halaman berikutnya' untuk mengurangi nomor jenis inti yang " "akan dipantau." #: tui_ncurses.cpp:243 msgid "Press 'previous page' key to increase core type number to monitor." msgstr "" "Tekan tombol 'halaman sebelumnya' untuk menambah nomor tipe inti yang akan " "dipantau." #: tui_ncurses.cpp:244 msgid "Press 'down' key to decrease CPU core number to monitor." msgstr "" "Tekan tombol 'bawah' untuk mengurangi jumlah inti CPU yang akan dipantau." #: tui_ncurses.cpp:245 msgid "Press 'up' key to increase CPU core number to monitor." msgstr "Tekan tombol 'atas' untuk menambah jumlah inti CPU yang akan dipantau." #: tui_ncurses.cpp:247 msgid "Caches tab:" msgstr "Tab tembolok:" #: tui_ncurses.cpp:248 msgid "Press 'down' key to switch to previous test." msgstr "Tekan tombol 'bawah' untuk beralih ke tes sebelumnya." #: tui_ncurses.cpp:249 msgid "Press 'up' key to switch to next test." msgstr "Tekan tombol 'atas' untuk beralih ke tes berikutnya." #: tui_ncurses.cpp:251 msgid "Bench tab:" msgstr "Tab pengukuran:" #: tui_ncurses.cpp:252 msgid "Press 'down' key to decrement benchmark duration." msgstr "Tekan tombol 'bawah' untuk mengurangi durasi pengukuran." #: tui_ncurses.cpp:253 msgid "Press 'up' key to increment benchmark duration." msgstr "Tekan tombol 'atas' untuk menambah durasi pengukuran." #: tui_ncurses.cpp:254 msgid "Press 'next page' key to decrement number of threads to use." msgstr "" "Tekan tombol 'next page' untuk mengurangi jumlah thread yang akan digunakan." #: tui_ncurses.cpp:255 msgid "Press 'previous page' key to increment number of threads to use." msgstr "" "Tekan tombol 'halaman sebelumnya' untuk menambah jumlah thread yang akan " "digunakan." #: tui_ncurses.cpp:256 msgid "Press 's' key to start/stop prime numbers (slow) benchmark." msgstr "" "Tekan 's' untuk memulai/menghentikan pengukuran bilangan prima (lambat)." #: tui_ncurses.cpp:257 msgid "Press 'f' key to start/stop prime numbers (fast) benchmark." msgstr "" "Tekan tombol 'f' untuk memulai/menghentikan pengukuran bilangan prima " "(cepat)." #: tui_ncurses.cpp:259 msgid "Graphics tab:" msgstr "Tab grafis:" #: tui_ncurses.cpp:260 msgid "Press 'down' key to switch to previous graphic card." msgstr "Tekan tombol 'bawah' untuk beralih ke kartu grafis sebelumnya." #: tui_ncurses.cpp:261 msgid "Press 'up' key to switch to next graphic card." msgstr "Tekan tombol 'atas' untuk beralih ke kartu grafis berikutnya." #: tui_ncurses.cpp:263 msgid "Press any key to exit this help." msgstr "Tekan sembarang tombol untuk keluar dari bantuan ini." #: tui_ncurses.cpp:640 msgid "Starting NCurses TUI…" msgstr "Memulai NCurses TUI…" #: tui_ncurses.cpp:649 msgid "" "FATAL ERROR: terminfo database could not be found (try to set TERMINFO " "environment variable)" msgstr "" "KESALAHAN FATAL: basis data terminfo tidak dapat ditemukan (coba atur " "variabel lingkungan TERMINFO)" #: tui_ncurses.cpp:654 #, c-format msgid "Failed to set up %s terminal (err=%i); falling back to %s" msgstr "Gagal menyiapkan terminal %s (err=%i); kembali ke %s" #: util.cpp:189 #, c-format msgid "cannot find unit in '%s' string at position %i" msgstr "tidak dapat menemukan unit dalam string '%s' pada posisi %i" #: util.cpp:252 #, c-format msgid "an error occurred while opening file '%s'" msgstr "kesalahan terjadi saat membuka berkas '%s'" #: util.cpp:297 #, c-format msgid "an error occurred while running command '%s'" msgstr "terjadi kesalahan saat menjalankan perintah '%s'" #: util.cpp:437 msgid "set_cpu_affinity() not supported on this operating system" msgstr "set_cpu_affinity() tidak didukung pada sistem operasi ini" #: data.hpp:103 data.hpp:244 data.hpp:332 msgid "Vendor" msgstr "Vendor" #: data.hpp:104 msgid "Code Name" msgstr "Nama Kode" #: data.hpp:105 msgid "Package" msgstr "Paket" #: data.hpp:106 msgid "Technology" msgstr "Teknologi" #: data.hpp:107 data.hpp:268 msgid "Voltage" msgstr "Tegangan" #: data.hpp:108 msgid "Specification" msgstr "Spesifikasi" #: data.hpp:109 msgid "Family" msgstr "Keluarga" #: data.hpp:110 msgid "Disp. Family" msgstr "Tampilkan Keluarga" #: data.hpp:111 data.hpp:224 data.hpp:245 data.hpp:335 msgid "Model" msgstr "Model" #: data.hpp:112 msgid "Disp. Model" msgstr "Tampilkan Model" #: data.hpp:113 msgid "Temp." msgstr "Suhu" #: data.hpp:114 msgid "Stepping" msgstr "Melangkah" #: data.hpp:115 msgid "Instructions" msgstr "Instruksi" #: data.hpp:125 msgid "L1 Data" msgstr "Data L1" #: data.hpp:126 msgid "L1 Inst." msgstr "Instruksi L1" #: data.hpp:127 msgid "Level 2" msgstr "Level 2" #: data.hpp:128 msgid "Level 3" msgstr "Level 3" #: data.hpp:137 cpu-x-gtk-3.12.ui:1232 msgid "Cores" msgstr "Inti" #: data.hpp:138 data.hpp:408 cpu-x-gtk-3.12.ui:1252 msgid "Threads" msgstr "Thread" #: data.hpp:155 msgid "Core Speed" msgstr "Kecepatan Inti" #: data.hpp:156 msgid "Multiplier" msgstr "Pengali" #: data.hpp:157 msgid "Bus Speed" msgstr "Kecepatan Bus" #: data.hpp:158 data.hpp:341 msgid "Usage" msgstr "Pengunaan" #: data.hpp:188 data.hpp:265 msgid "Size" msgstr "Ukuran" #: data.hpp:189 data.hpp:267 msgid "Speed" msgstr "Kecepatan" #: data.hpp:223 data.hpp:259 msgid "Manufacturer" msgstr "Manufaktur" #: data.hpp:225 msgid "Revision" msgstr "Revisi" #: data.hpp:233 msgid "Brand" msgstr "Merek" #: data.hpp:234 msgid "Version" msgstr "Versi" #: data.hpp:235 msgid "Date" msgstr "Tanggal" #: data.hpp:236 msgid "ROM Size" msgstr "Ukuran ROM" #: data.hpp:260 msgid "Part Number" msgstr "Nomor Bagian" #: data.hpp:261 msgid "Type" msgstr "Tipe" #: data.hpp:262 msgid "Type Detail" msgstr "Tipe Detail" #: data.hpp:263 msgid "Device Locator" msgstr "Pencari Perangkat" #: data.hpp:264 msgid "Bank Locator" msgstr "Pencari Lokasi Bank" #: data.hpp:266 msgid "Rank" msgstr "Pangkat" #: data.hpp:292 msgid "Name" msgstr "Nama" #: data.hpp:293 msgid "Kernel" msgstr "Kernel" #: data.hpp:294 msgid "Hostname" msgstr "Nama host" #: data.hpp:295 msgid "Uptime" msgstr "Waktu aktif" #: data.hpp:303 msgid "Used" msgstr "Digunakan" #: data.hpp:304 msgid "Buffers" msgstr "Bufer" #: data.hpp:305 msgid "Cached" msgstr "Dalam tembolok" #: data.hpp:306 msgid "Free" msgstr "Gratis" #: data.hpp:307 msgid "Swap" msgstr "Tukar" #: data.hpp:333 msgid "Driver" msgstr "Pengandar" #: data.hpp:334 msgid "UMD Version" msgstr "Versi UMD" #: data.hpp:336 msgid "Compute Unit" msgstr "Unit Komputasi" #: data.hpp:337 msgid "Device ID" msgstr "ID Perangkat" #: data.hpp:338 msgid "VBIOS Version" msgstr "Versi VBIOS" #. #-#-#-#-# source_ui.pot (cpu-x ) #-#-#-#-# #. Setting: "Interface" tab #: data.hpp:339 cpu-x-gtk-3.12.ui:5807 msgid "Interface" msgstr "Antarmuka" #: data.hpp:340 msgid "Temperature" msgstr "Suhu" #: data.hpp:342 msgid "Core Voltage" msgstr "Tegangan Inti" #: data.hpp:343 msgid "Power Avg" msgstr "Daya Rata-rata" #: data.hpp:344 msgid "Core Clock" msgstr "Clock Inti" #: data.hpp:345 msgid "Memory Clock" msgstr "Clock Memori" #: data.hpp:346 msgid "Memory Used" msgstr "Memori yang Digunakan" #: data.hpp:347 msgid "Resizable BAR" msgstr "ReBAR" #: data.hpp:348 msgid "Vulkan RT" msgstr "Vulkan RT" #: data.hpp:349 msgid "OpenGL Version" msgstr "Versi OpenGL" #: data.hpp:350 msgid "Vulkan Version" msgstr "Versi Vulkan" #: data.hpp:351 msgid "OpenCL Version" msgstr "Versi OpenCL" #: data.hpp:387 msgid "Score" msgstr "Skor" #: data.hpp:388 msgid "Run" msgstr "Jalankan" #: data.hpp:407 msgid "Duration" msgstr "Durasi" #: util.hpp:77 msgid "bytes" msgstr "bita" #. TRANSLATORS: initials for kilobyte (10³): please put initials (keep it short) #: util.hpp:80 msgid "kB" msgstr "kB" #. TRANSLATORS: initials for megabyte (10⁶): please put initials (keep it short) #: util.hpp:82 msgid "MB" msgstr "MB" #. TRANSLATORS: initials for gigabyte (10⁹): please put initials (keep it short) #: util.hpp:84 msgid "GB" msgstr "GB" #. TRANSLATORS: initials for terabyte (10¹²): please put initials (keep it short) #: util.hpp:86 msgid "TB" msgstr "TB" #. TRANSLATORS: initials for kibibyte (2¹⁰): please put initials (keep it short) #: util.hpp:89 msgid "KiB" msgstr "KiB" #. TRANSLATORS: initials for mebibyte (2²⁰): please put initials (keep it short) #: util.hpp:91 msgid "MiB" msgstr "MiB" #. TRANSLATORS: initials for gibibyte (2³⁰): please put initials (keep it short) #: util.hpp:93 msgid "GiB" msgstr "GiB" #. TRANSLATORS: initials for tebibyte (2⁴⁰): please put initials (keep it short) #: util.hpp:95 msgid "TiB" msgstr "TiB" #: cpu-x-gtk-3.12.ui:1184 msgid "Cache" msgstr "Tembolok" #. Setting: refresh time for UI #: cpu-x-gtk-3.12.ui:5721 msgid "Refresh time" msgstr "Waktu penyegaran" #. Setting: GUI theme #: cpu-x-gtk-3.12.ui:5745 #, fuzzy #| msgid "Theme" msgid "Text theme" msgstr "Tema" #. Setting: automatic GUI theme #: cpu-x-gtk-3.12.ui:5760 msgid "Automatic" msgstr "Otomatis" #. Setting: light GUI theme #: cpu-x-gtk-3.12.ui:5761 msgid "Blue for light theme" msgstr "" #. Setting: dark GUI theme #: cpu-x-gtk-3.12.ui:5762 msgid "Yellow for dark theme" msgstr "" #. Setting: temperature unit #: cpu-x-gtk-3.12.ui:5775 msgid "Temperature unit" msgstr "Unit Temperatur" #. Setting: default tab at startup #: cpu-x-gtk-3.12.ui:5826 msgid "Default tab" msgstr "Tab bawaan" #. Setting: default CPU core at startup #: cpu-x-gtk-3.12.ui:5839 msgid "Default CPU core" msgstr "Inti CPU bawaan" #. Setting: default cache test at startup #: cpu-x-gtk-3.12.ui:5852 msgid "Default cache test" msgstr "Uji tembolok bawaan" #. Setting: print CPUID values in decimal or hexadecimal #: cpu-x-gtk-3.12.ui:5895 msgid "Print CPUID values in decimal" msgstr "Mencetak nilai CPUID dalam bentuk desimal" #. Setting: default graphic card at startup #: cpu-x-gtk-3.12.ui:5928 msgid "Default graphic card" msgstr "Kartu grafis bawaan" #. Setting: default CPU core at startup #: cpu-x-gtk-3.12.ui:5952 msgid "Default core type" msgstr "Tipe inti bawaan" #. Setting: default graphic card at startup #: cpu-x-gtk-3.12.ui:5976 msgid "Default memory stick" msgstr "Modul memori bawaan" #. Setting: "Startup" tab #: cpu-x-gtk-3.12.ui:6004 msgid "Startup" msgstr "Memulai" #~ msgid "Light" #~ msgstr "Terang" #~ msgid "Dark" #~ msgstr "Gelap" #~ msgid "Calculating CPU multipliers" #~ msgstr "Menghitung pengali CPU" #, c-format #~ msgid "Current: PCIe Gen%1dx%d / Max: Gen%1dx%d" #~ msgstr "Saat Ini: PCIe Gen%1dx%d / Maks: Gen%1dx%d" #~ msgid "failed to retrieve GPU clocks" #~ msgstr "gagal mengambil GPU clock" #, c-format #~ msgid "Core #%i" #~ msgstr "Inti #%i" #~ msgid "Setting label names" #~ msgstr "Atur nama label" #, c-format #~ msgid "Bank %i" #~ msgstr "Bank %i" #~ msgid "Reference" #~ msgstr "Referensi" #~ msgid "Distribution" #~ msgstr "Distribusi" #~ msgid "Compiler" #~ msgstr "Penyusun" #~ msgid "GPU clock" #~ msgstr "GPU clock" #~ msgid "Dumping data…" #~ msgstr "Membuang data…" #~ msgid "Freeing memory" #~ msgstr "Mengosongkan memori" #~ msgid "Ignore CPU frequency reported by libcpuid" #~ msgstr "Abaikan frekuensi CPU yang dilaporkan oleh libcpuid" #, c-format #~ msgid "failed to call wordexp (%i)" #~ msgstr "gagal memanggil wordexp (%i)" #~ msgid "Press 'home' key to scroll up in a page." #~ msgstr "Tekan tombol 'home' untuk menggulir ke atas dalam halaman." #~ msgid "Press 'end' key to scroll down in a page." #~ msgstr "Tekan tombol 'end' untuk menggulir ke bawah dalam halaman." #, c-format #~ msgid "String '%s' is too long, truncating…" #~ msgstr "String '%s' terlalu panjang, mengecilkan…" #, c-format #~ msgid "failed to open %s directory" #~ msgstr "gagal membuka direktori %s" #~ msgid "an error occurred while compiling regex" #~ msgstr "terjadi kesalahan saat menyusun regex" #~ msgid "FATAL ERROR: could not allocate memory" #~ msgstr "KESALAHAN FATAL: tidak bisa mengalokasikan memori" #, fuzzy, c-format #~| msgid "failed to call libcpuid (%s)" #~ msgid "failed to call vkEnumerateInstanceExtensionProperties (%s)" #~ msgstr "gagal memanggil libcpuid (%s)" #, c-format #~ msgid "%s" #~ msgstr "%s" #, fuzzy #~| msgid "There is no platform with OpenCL support (%s)" #~ msgid "There is no device with Vulkan support" #~ msgstr "Tidak terdapat platform dengan dukungan OpenCL (%s)" #~ msgid "Socket(s)" #~ msgstr "Soket" #~ msgid "Thread(s)" #~ msgstr "Thread(s)" #~ msgid "You can paste this backtrace by opening a new issue here:" #~ msgstr "" #~ "Anda dapat menempelkan backtrace ini dengan membuka issue baru di sini:" #, fuzzy #~| msgid "failed to call libcpuid (%s)" #~ msgid "faild to call clGetDeviceIDs" #~ msgstr "gagal memanggil libcpuid (%s)" #~ msgid "Exiting %s" #~ msgstr "Keluar %s" #~ msgid "Skip CPU MSR opening (need to be root)" #~ msgstr "Lewati pembukaan MSR CPU (harus di-root)" CPU-X-5.0.3/po/it.po000066400000000000000000001252741454622605200137660ustar00rootroot00000000000000# Copyright © 2014-2024 The Tumultuous Unicorn Of Darkness # This file is distributed under the same license as the CPU-X package. # Davide Neri , 2019. # Allan Nordhøy , 2020. # Pierfrancesco Passerini , 2020, 2021, 2022, 2023. # J. Lavoie , 2021. # Frankie McEyes , 2022, 2023. msgid "" msgstr "" "Project-Id-Version: CPU-X\n" "Report-Msgid-Bugs-To: https://github.com/TheTumultuousUnicornOfDarkness/CPU-" "X/issues\n" "POT-Creation-Date: 2023-12-09 13:09+0100\n" "PO-Revision-Date: 2023-12-12 20:05+0000\n" "Last-Translator: Pierfrancesco Passerini \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.3-dev\n" #: core.cpp:135 msgid "Finding CPU technology" msgstr "Ricerca del tipo di CPU" #: core.cpp:161 #, c-format msgid "" "Your CPU is not present in the database ==> %s, model: %i, ext. model: %i, " "ext. family: %i" msgstr "" "La tua CPU non è nel database ==> %s, modello: %i, modello esteso: %i, " "famiglia estesa: %i" #: core.cpp:189 data.cpp:150 data.cpp:342 msgid "unknown" msgstr "sconosciuto" #: core.cpp:230 msgid "Calling libcpuid for retrieving static data" msgstr "Chiamata a libcpuid per recuperare i dati statici" #: core.cpp:245 #, c-format msgid "failed to call libcpuid (%s)" msgstr "errore nella chiamata a libcpuid (%s)" #: core.cpp:340 msgid "Calling libcpuid for retrieving dynamic data" msgstr "Chiamata a libcpuid per recuperare i dati dinamici" #: core.cpp:353 msgid "Calling libcpuid for retrieving CPU MSR static values" msgstr "Chiamata a libcpuid per recuperare i valori statici dal MSR della CPU" #: core.cpp:380 msgid "Calling libcpuid for retrieving CPU MSR dynamic values" msgstr "Chiamata a libcpuid per recuperare i dati dinamici dal MSR della CPU" #: core.cpp:412 msgid "Calling dmidecode" msgstr "Chiamata a dmidecode" #: core.cpp:454 core.cpp:473 #, c-format msgid "%s (configured)" msgstr "%s (configurato)" #: core.cpp:461 core.cpp:480 #, c-format msgid "%s (max)" msgstr "%s (max)" #: core.cpp:466 #, c-format msgid "%s (min)" msgstr "%s (min)" #: core.cpp:496 msgid "Calculating CPU usage" msgstr "Calcolo l'utilizzo della CPU" #: core.cpp:546 msgid "Calling bandwidth" msgstr "Chiamata a bandwidth" #: core.cpp:613 #, c-format msgid "" "pci_access is not properly initialized: it is a common issue when %s was " "built with a lower libpci version.\n" "Check that libpci %s library is present on your system. Otherwise, please " "rebuild %s." msgstr "" "pci_access non inizializzato correttamente: è un problema comune quando %s " "viene compilato con una versione precedente di libpci.\n" "Controlla che la libreria libpci %s sia presente nel tuo sistema. " "Altrimenti, ricompila %s." #: core.cpp:657 #, c-format msgid "No kernel driver in use for graphic card at path %s" msgstr "Nessun driver kernel in uso per la scheda grafica in %s" #: core.cpp:693 #, c-format msgid "Your GPU kernel driver is unknown: %s" msgstr "Il driver (kernel) della GPU è sconosciuto: %s" #: core.cpp:777 #, c-format msgid "Your GPU user mode driver is unknown for vendor %s: %s" msgstr "Il driver della GPU (user mode) non è noto per il venditore %s: %s" #: core.cpp:781 #, c-format msgid "failed to call GLFW (%i): %s" msgstr "impossibile eseguire GLFW (%i): %s" #: core.cpp:914 msgid "Finding Vulkan API version" msgstr "Verifica versione API Vulkan" #: core.cpp:926 #, c-format msgid "failed to call vkCreateInstance (%s)" msgstr "chiamata a vkCreateInstance (%s) fallita" #: core.cpp:929 #, c-format msgid "%s is not supported" msgstr "%s non è supportato" #: core.cpp:937 #, c-format msgid "failed to call vkEnumeratePhysicalDevices (%s)" msgstr "chiamata a vkEnumeratePhysicalDevices (%s) fallita" #: core.cpp:944 msgid "No available Vulkan devices" msgstr "Nessun dispositivo Vulkan disponibile" #: core.cpp:952 #, c-format msgid "No available physical devices (%s)" msgstr "Nessun dispositivo fisico disponibile (%s)" #: core.cpp:1015 #, c-format msgid "Failed to create Vulkan for device %u (%s)" msgstr "Impossibile usare Vulkan col dispositivo %u (%s)" #: core.cpp:1019 #, c-format msgid "%s is not supported for device %u, use only deviceID for matching" msgstr "" "%s non è supportato per il dispositivo %u, usare solo il deviceID per " "l'abbinamento" #: core.cpp:1051 core.cpp:1364 msgid "Enabled" msgstr "Abilitato" #: core.cpp:1051 core.cpp:1364 msgid "Disabled" msgstr "Disabilitato" #: core.cpp:1088 msgid "Finding OpenCL API version" msgstr "Verifica versione API OpenCL" #: core.cpp:1092 #, c-format msgid "There is no platform with OpenCL support (%s)" msgstr "Non c'è una piattaforma con supporto OpenCL (%s)" #: core.cpp:1102 #, c-format msgid "failed to get all OpenCL platforms (%s)" msgstr "impossibile ottenere le piattaforme OpenCL (%s)" #: core.cpp:1115 #, c-format msgid "failed to get name for platform %u (%s)" msgstr "Impossibile ottenere il nome della piattaforma %u (%s)" #: core.cpp:1123 #, c-format msgid "failed to get version for platform %u (%s)" msgstr "Impossibile ottenere la versione della piattaforma %u (%s)" #: core.cpp:1131 #, c-format msgid "failed to find number of OpenCL devices for platform '%s %s' (%s)" msgstr "" "Impossibile trovare il numero delle periferiche OpenCL per '%s %s' (%s)" #: core.cpp:1131 msgid "0 device" msgstr "0 dispositivi" #: core.cpp:1140 #, c-format msgid "failed to get all of OpenCL devices for platform '%s %s' (%s)" msgstr "" "Impossibile ottenere le periferiche OpenCL per la piattaforma '%s %s' (%s)" #: core.cpp:1160 #, c-format msgid "failed to get name for device %u (%s)" msgstr "impossibile ottenere il nome per il dispositivo %u (%s)" #: core.cpp:1168 #, c-format msgid "failed to get version for device %u (%s)" msgstr "Impossibile ottenere la versione della periferica %u (%s)" #: core.cpp:1190 #, c-format msgid "OpenCL driver for '%s %s' does not support CL_DEVICE_TOPOLOGY_AMD (%s)" msgstr "" "Il driver OpenCL per \"%s %s\" non supporta CL_DEVICE_TOPOLOGY_AMD (%s)" #: core.cpp:1201 #, c-format msgid "" "OpenCL driver for '%s %s' does not support CL_DEVICE_GFXIP_MAJOR_AMD (%s)" msgstr "" "Il driver OpenCL per '%s %s' non supporta CL_DEVICE_GFXIP_MAJOR_AMD (%s)" #: core.cpp:1209 core.cpp:1229 core.cpp:1262 #, c-format msgid "" "OpenCL driver for '%s %s' does not support CL_DEVICE_MAX_COMPUTE_UNITS (%s)" msgstr "" "Il driver OpenCL per '%s %s' non supporta CL_DEVICE_MAX_COMPUTE_UNITS (%s)" #: core.cpp:1250 #, c-format msgid "" "OpenCL driver for '%s %s' does not support CL_DEVICE_PCI_DOMAIN_ID_NV (%s), " "CL_DEVICE_PCI_BUS_ID_NV (%s) or CL_DEVICE_PCI_SLOT_ID_NV (%s)" msgstr "" "Il driver OpenCL per \"%s %s\" non supporta CL_DEVICE_PCI_DOMAIN_ID_NV (%s), " "CL_DEVICE_PCI_BUS_ID_NV (%s) o CL_DEVICE_PCI_SLOT_ID_NV (%s)" #: core.cpp:1273 #, c-format msgid "OpenCL is not supported with your GPU vendor (0x%X)" msgstr "OpenCL non è supportato con dalla tua GPU (0x %X)" #: core.cpp:1295 msgid "Finding devices" msgstr "Ricerca delle periferiche" #: core.cpp:1307 #, c-format msgid "Skip devices search (wrong permissions on %s device)" msgstr "" "Ignora la ricerca delle periferiche (autorizzazioni errate sul dispositivo " "%s )" #: core.cpp:1350 #, c-format msgid "Your GPU vendor is unknown: %s (0x%X)" msgstr "Il produttore della tua GPU è sconosciuto: %s (0x%X)" #: core.cpp:1370 msgid "failed to find chipset vendor and model" msgstr "errore nella ricerca del produttore e del modello del chipset" #: core.cpp:1385 msgid "failed to find graphic card vendor and model" msgstr "errore nella ricerca del produttore e del modello della scheda grafica" #: core.cpp:1487 msgid "Retrieving GPU clocks" msgstr "Recupero frequenza CPU" #: core.cpp:1500 msgid "None" msgstr "Nessuna" #: core.cpp:1509 #, c-format msgid "DRM path for %s is unknown" msgstr "Percorso DRM per %s sconosciuto" #: core.cpp:1516 #, c-format msgid "Card number for %s is unknown" msgstr "Numero scheda di %s sconosciuto" #: core.cpp:1541 #, c-format msgid "PCIe %s (current) / %s (max)" msgstr "PCIe %s (attuale) / %s (max)" #: core.cpp:1650 #, c-format msgid "Driver for %s doesn't report frequencies" msgstr "Il driver di %s non restituisce le frequenze" #: core.cpp:1671 #, c-format msgid "failed to retrieve all monitoring data for %s" msgstr "impossibile ottenere tutti i dati di monitoraggio di %s" #: core.cpp:1694 msgid "Identifying running system" msgstr "Identificazione del sistema in uso" #: core.cpp:1697 msgid "failed to identify running system" msgstr "identificazione del sistema in uso non riuscita" #: core.cpp:1749 core.cpp:1778 msgid "Calling libprocps" msgstr "Chiamata a libprocps" #: core.cpp:1752 msgid "unable to get system uptime" msgstr "Impossibile ottenere il tempo di attività del sistema" #: core.cpp:1758 msgid "unable to create meminfo structure" msgstr "Impossibile creare la struttura MemInfo" #: core.cpp:1804 msgid "Calling libstatgrab" msgstr "Chiamata a libstatgrab" #: core.cpp:1852 #, c-format msgid "%i days, %i hours, %i minutes, %i seconds" msgstr "%i giorni, %i ore, %i minuti, %i secondi" #: core.cpp:1915 msgid "Updating benchmark status" msgstr "Aggiornano lo stato dei benchmark" #: core.cpp:1918 msgid "Active" msgstr "Attivo" #: core.cpp:1921 #, c-format msgid "(%u hours left)" msgstr "(%u ore rimaste)" #: core.cpp:1923 #, c-format msgid "(%u minutes left)" msgstr "(%u minuti rimasti)" #: core.cpp:1925 #, c-format msgid "(%u seconds left)" msgstr "(%u secondi rimasti)" #: core.cpp:1929 core.cpp:1984 core.cpp:1985 msgid "Inactive" msgstr "Inattivo" #: core.cpp:1932 #, c-format msgid "in %u hours" msgstr "in %u ore" #: core.cpp:1934 #, c-format msgid "in %u minutes" msgstr "in %u minuti" #: core.cpp:1936 #, c-format msgid "in %u seconds" msgstr "in %u secondi" #: core.cpp:1953 #, c-format msgid "Starting benchmark with %u threads" msgstr "Inizio benchmark con %u thread" #: core.cpp:1976 msgid "an error occurred while starting benchmark" msgstr "è intervenuto un errore all'avvio del benchmark" #: core.cpp:2002 msgid "Finding CPU package in fallback mode" msgstr "Ricerca del socket della CPU in modalità alternativa" #: core.cpp:2032 #, c-format msgid "Your CPU socket is not present in the database ==> %s, codename: %s" msgstr "Il socket della tua CPU non è nel database ==> %s, nome in codice: %s" #: core.cpp:2052 msgid "Calculating CPU multipliers in fallback mode" msgstr "Calcolo dei moltiplicatori della CPU in modalità alternativa" #: core.cpp:2072 msgid "Retrieving motherboard information in fallback mode" msgstr "Recupero delle informazioni della scheda madre in modalità alternativa" #: core.cpp:2085 msgid "failed to retrieve motherboard information (fallback mode)" msgstr "" "impossibile recuperare le informazione della scheda madre (modalità " "alternativa)" #: core.cpp:2127 msgid "Retrieving CPU temperature in fallback mode" msgstr "Recupero della temperatura della CPU in modalità alternativa" #: core.cpp:2173 msgid "failed to retrieve CPU temperature (fallback mode)" msgstr "impossibile recuperare la temperatura della CPU (modalità alternativa)" #: core.cpp:2188 msgid "Retrieving CPU voltage in fallback mode" msgstr "Recupero del voltaggio della CPU in modalità alternativa" #: core.cpp:2200 msgid "failed to retrieve CPU voltage (fallback mode)" msgstr "impossibile recuperare il voltaggio della CPU (modalità alternativa)" #: core.cpp:2214 msgid "Retrieving CPU frequency in fallback mode" msgstr "Recupero della frequenza della CPU in modalità alternativa" #: core.cpp:2220 msgid "failed to retrieve CPU frequency (fallback mode)" msgstr "impossibile recuperare la frequenza della CPU (modalità alternativa)" #: daemon_client.cpp:65 msgid "Starting daemon in background…" msgstr "Avvia il demone in background…" #: daemon_client.cpp:172 msgid "pkexec: authorization could not be obtained (dialog dismissed)" msgstr "" "pkexec: non è stato possibile ottenere l'autorizzazione (dialogo respinto)" #: daemon_client.cpp:175 msgid "pkexec: authorization could not be obtained (not authorized)" msgstr "" "pkexec: non è stato possibile ottenere l'autorizzazione (non autorizzata)" #: daemon_client.cpp:178 msgid "pkexec: command not found" msgstr "pkexec: comando non trovato" #: daemon_client.cpp:181 msgid "pkexec: unexpected error code" msgstr "pkexec: errore non previsto" #: daemon_client.cpp:211 msgid "Connecting to daemon…" msgstr "Connessione al demone…" #: daemon_server.cpp:261 #, c-format msgid "request_handler: case %i not handled" msgstr "request_handler: evento %i non gestito" #: data.cpp:124 cpu-x-gtk-3.12.ui:1370 msgid "CPU" msgstr "CPU" #: data.cpp:187 msgid "P-core" msgstr "P-core" #: data.cpp:188 msgid "E-core" msgstr "E-core" #: data.cpp:189 data.cpp:192 msgid "Core" msgstr "Core" #: data.cpp:208 cpu-x-gtk-3.12.ui:746 msgid "Processor" msgstr "Processore" #: data.cpp:240 data.cpp:329 cpu-x-gtk-3.12.ui:1968 msgid "Caches" msgstr "Cache" #: data.cpp:247 #, c-format msgid "%2d x %4d %s, %2d-way" msgstr "%2d x %4d %s, %2d-vie" #: data.cpp:249 #, c-format msgid "%d %s, %d-way" msgstr "%d %s, %d vie" #: data.cpp:263 msgid "Count" msgstr "Conta" #: data.cpp:276 cpu-x-gtk-3.12.ui:968 msgid "Clocks" msgstr "Frequenze" #: data.cpp:379 data.cpp:383 #, c-format msgid "L%u Cache" msgstr "Cache L%u" #: data.cpp:385 #, c-format msgid "%s associative, %d-%s line size" msgstr "%s associative, linee da %d-%s" #: data.cpp:398 msgid "Test" msgstr "Test" #: data.cpp:409 data.cpp:423 cpu-x-gtk-3.12.ui:2146 cpu-x-gtk-3.12.ui:2517 msgid "Motherboard" msgstr "Scheda madre" #: data.cpp:437 cpu-x-gtk-3.12.ui:2367 msgid "BIOS" msgstr "BIOS" #: data.cpp:452 cpu-x-gtk-3.12.ui:2498 msgid "Chipset" msgstr "Chipset" #: data.cpp:467 data.cpp:569 cpu-x-gtk-3.12.ui:3156 cpu-x-gtk-3.12.ui:3761 msgid "Memory" msgstr "Memoria" #: data.cpp:483 #, c-format msgid "Stick %u" msgstr "Modulo %u" #: data.cpp:487 cpu-x-gtk-3.12.ui:3134 msgid "Sticks" msgstr "Moduli" #: data.cpp:541 cpu-x-gtk-3.12.ui:3780 msgid "System" msgstr "Sistema" #: data.cpp:554 cpu-x-gtk-3.12.ui:3380 msgid "Operating System" msgstr "Sistema operativo" #: data.cpp:587 cpu-x-gtk-3.12.ui:4960 msgid "Graphics" msgstr "Grafica" #: data.cpp:621 #, c-format msgid "Card %u" msgstr "Scheda %u" #: data.cpp:625 cpu-x-gtk-3.12.ui:4938 msgid "Cards" msgstr "Schede %i" #: data.cpp:672 cpu-x-gtk-3.12.ui:5300 msgid "Bench" msgstr "Bench" #: data.cpp:685 msgid "Not started" msgstr "Non iniziato" #: data.cpp:688 cpu-x-gtk-3.12.ui:5070 msgid "Prime numbers (slow)" msgstr "Numeri primi (lento)" #: data.cpp:692 cpu-x-gtk-3.12.ui:5178 msgid "Prime numbers (fast)" msgstr "Numeri primi (veloce)" #: data.cpp:696 cpu-x-gtk-3.12.ui:5281 msgid "Parameters" msgstr "Parametri" #: data.cpp:721 data.cpp:727 #, c-format msgid "%u mins" msgstr "%u min" #: data.cpp:734 cpu-x-gtk-3.12.ui:5444 cpu-x-gtk-3.12.ui:5552 msgid "About" msgstr "Informazioni" #: data.cpp:739 #, c-format msgid "" "%s is a Free software that gathers information\n" "on CPU, motherboard and more." msgstr "" "%s è un software libero che raccoglie informazioni\n" "su CPU, scheda grafica ed altro." #: data.cpp:744 msgid "About CPU-X" msgstr "Informazioni su CPU-X" #: data.cpp:745 #, c-format msgid "Version %s" msgstr "Versione %s" #: data.cpp:746 #, c-format msgid "Author: %s" msgstr "Autore: %s" #: data.cpp:747 #, c-format msgid "Site: %s" msgstr "Sito: %s" #: data.cpp:751 cpu-x-gtk-3.12.ui:5533 msgid "License" msgstr "Licenza" #: data.cpp:753 #, c-format msgid "This software is distributed under the terms of %s" msgstr "Questo software è distribuito sotto i termini della %s" #: data.cpp:754 main.cpp:176 msgid "This program comes with ABSOLUTELY NO WARRANTY" msgstr "Questo programma è distribuito SENZA ALCUNA GARANZIA" #: gui_gtk.cpp:61 #, c-format msgid "Cannot find path for '%s' file" msgstr "Non trovo il percorso del file '%s'" #: gui_gtk.cpp:400 msgid "Start daemon" msgstr "Avvia demone" #: gui_gtk.cpp:403 msgid "Connected to daemon" msgstr "Connesso al demone" #: gui_gtk.cpp:406 msgid "No polkit authentication agent found" msgstr "Non ho trovato nessun agente polkit per l'autenticazione" #: gui_gtk.cpp:411 msgid "Ask password to start daemon in background" msgstr "Richiedi la password per avviare il demone in background" #: gui_gtk.cpp:415 msgid "Settings" msgstr "Impostazioni" #: gui_gtk.cpp:634 msgid "BaseFamily" msgstr "Famiglia CPU" #: gui_gtk.cpp:635 msgid "CPU display (\"true\") family (computed as BaseFamily+ExtendedFamily)" msgstr "" "Famiglia CPU (\"reale\") visualizzata (calcolata come " "BaseFamily+ExtendedFamily)" #: gui_gtk.cpp:636 msgid "BaseModel" msgstr "Versione base" #: gui_gtk.cpp:637 msgid "CPU display (\"true\") model (computed as (ExtendedModel<<4)+BaseModel)" msgstr "" "Modello CPU (\"reale\") visualizzato (calcolato come " "(ExtendedModel<<4)+BaseModel)" #: gui_gtk.cpp:847 msgid "" "Identify the physically-labeled socket or board position where the memory " "device is located" msgstr "" "Identifica il socket fisico o la posizione sulla scheda dove si trova il " "dispositivo di memoria" #: gui_gtk.cpp:848 msgid "Identify the physically labeled bank where the memory device is located" msgstr "Identifica il banco fisico dove si trova il dispositivo di memoria" #: gui_gtk.cpp:1052 msgid "User Mode Driver Version" msgstr "Versione driver modalità utente (UMD)" #: gui_gtk.cpp:1066 msgid "Vulkan Ray Tracing" msgstr "Vulkan Ray Tracing" #: gui_gtk.cpp:1260 msgid "Starting GTK GUI…" msgstr "Avvio interfaccia GTK…" #: gui_gtk.cpp:1272 msgid "failed to import UI in GtkBuilder" msgstr "importazione dell'interfaccia in GtkBuilder non riuscita" #: main.cpp:63 msgid "Start graphical user interface (GUI) (default)" msgstr "Avvio dell'interfaccia utente grafica (GUI) (default)" #: main.cpp:64 msgid "Start text-based user interface (TUI)" msgstr "Avvio dell'interfaccia utente testuale (TUI)" #: main.cpp:65 msgid "Dump all data on standard output and exit" msgstr "Scarica tutti i dati sull'output standard ed esci" #: main.cpp:66 msgid "Run embedded command dmidecode and exit" msgstr "Esegui il comando incorporato dmidecode ed esci" #: main.cpp:67 msgid "Run embedded command bandwidth and exit" msgstr "Esegui il comando incorporato bandwidth ed esci" #: main.cpp:68 msgid "Set temperature unit (c[elsius]|f[ahrenheit]|k[elvin]|r[ankine])" msgstr "" "Impostare l'unità di temperatura (c[elsius]|f[ahrenheit]|k[elvin]|r[ankine])" #: main.cpp:69 msgid "Set custom time between two refreshes (in seconds)" msgstr "Imposta intervallo personalizzato tra due aggiornamenti (in secondi)" #: main.cpp:70 msgid "Set default tab (integer)" msgstr "Imposta scheda di default (intero)" #: main.cpp:71 msgid "Select core type to monitor (integer)" msgstr "Scegli quale core monitorare (intero)" #: main.cpp:72 msgid "Select CPU core to monitor (integer)" msgstr "Scegli core CPU da monitorare (intero)" #: main.cpp:73 msgid "Set custom bandwidth test for CPU caches speed (integer)" msgstr "" "Imposta test della larghezza di banda personalizzato per la velocità della " "cache della CPU (intero)" #: main.cpp:74 msgid "Select default memory stick (integer)" msgstr "Imposta il modulo di memoria predefinito (intero)" #: main.cpp:75 msgid "Select default graphic card (integer)" msgstr "Imposta la scheda grafica predefinita (intero)" #: main.cpp:76 cpu-x-gtk-3.12.ui:5910 msgid "Start and connect to daemon" msgstr "Avvia e connettiti al demone" #: main.cpp:77 msgid "Verbose output" msgstr "Output esteso" #: main.cpp:78 msgid "Print help and exit" msgstr "Stampa la guida ed esci" #: main.cpp:79 msgid "Print version and exit" msgstr "Stampa il numero di versione ed esci" #: main.cpp:80 msgid "Print CPUID values in decimal (default is hexadeximal)" msgstr "Stampa i valori CPUID in decimale (predefinito in esadecimale)" #: main.cpp:81 msgid "Disable colored output" msgstr "Disattiva l'output colorato" #: main.cpp:82 msgid "Print information for debugging" msgstr "Stampa le informazioni per il debug" #: main.cpp:83 msgid "Print required information to paste in an issue" msgstr "Stampa le informazioni necessarie da includere in una segnalazione" #: main.cpp:84 msgid "Set key mapping for NCurses mode (a[rrows]|e[macs]|i[nverted-T]|v[im])" msgstr "" "Imposta la mappatura dei tasti per la modalità NCurses (a[rrows]|e[macs]|" "i[nverted-T]|v[im])" #: main.cpp:95 msgid "Add default command line arguments" msgstr "Aggiungi opzioni predefinite per la riga di comando" #: main.cpp:96 msgid "Enforce the bus clock" msgstr "Forza la frequenza del bus" #: main.cpp:97 msgid "" "Ignore CPU values reported by libcpuid (comma-separated values among 'temp', " "'volt' and 'freq')" msgstr "" "Ignora i valori della CPU riportati da libcpuid (valori separati da virgola " "di 'temp', 'volt' e 'freq')" #: main.cpp:98 msgid "Read CPUID raw data from a given file" msgstr "Leggi i dati grezzi di CPUID da un determinato file" #: main.cpp:99 msgid "Only print a message if CPU is not present in the database" msgstr "Stampa un messaggio solo se la CPU non è nel database" #: main.cpp:126 #, c-format msgid "Usage: %s DISPLAY [OPTIONS]\n" msgstr "Utilizzo: %s DISPLAY [OPZIONI]\n" #: main.cpp:127 msgid "Available DISPLAY:" msgstr "DISPLAY disponibile:" #: main.cpp:135 msgid "Available OPTIONS:" msgstr "OPZIONI disponibili:" #: main.cpp:144 msgid "Influenceable environment variables:" msgstr "Variabili di ambiente influenzabili:" #: main.cpp:175 msgid "This is free software: you are free to change and redistribute it." msgstr "" "Questo è un software libero: sei libero di modificarlo e ridistribuirlo." #: main.cpp:177 #, c-format msgid "See the %s license: <%s>\n" msgstr "Visualizza la licenza %s: <%s>\n" #: main.cpp:184 #, c-format msgid "-- %-9s version: %s" msgstr "-- versione %-9s: %s" #: main.cpp:381 #, c-format msgid "" "\n" "Oops, something was wrong! %s has received signal %d (%s) and has crashed." msgstr "" "\n" "Oops, qualcosa è andato storto! %s ha ricevuto il segnale %d (%s) e si è " "bloccato." #: main.cpp:383 #, c-format msgid "" "\n" "Oops, something was wrong! %s has received signal %d (%s) and is trying to " "recover." msgstr "" "\n" "Oops, qualcosa è andato storto! %s ha ricevuto il segnale %d (%s) e sta " "cercando una soluzione." #: main.cpp:407 msgid "You can open a new issue here, by filling the template as requested:" msgstr "" "È possibile aprire una nuova segnalazione qui, compilando il modello " "richiesto:" #: main.cpp:449 msgid "an error occurred while setting locale" msgstr "è intervenuto un errore mentre si impostava la localizzazione" #: options.cpp:124 #, c-format msgid "" "Selected CPU type (%u) is not a valid number (%u is the maximum for this CPU)" msgstr "" "Il tipo di CPU selezionato (%u) non è valido (%u è il valore massimo per " "questa CPU)" #: options.cpp:145 #, c-format msgid "" "Selected bandwidth test (%u) is not a valid number (%u is the maximum for " "this system)" msgstr "" "Il test della larghezza di banda selezionato (%u) non è valido (%u è il " "massimo per questo sistema)" #: options.cpp:168 #, c-format msgid "" "Selected RAM stick (%u) is not a valid number (%u is the maximum for this " "system)" msgstr "" "Il banco di RAM selezionato (%u) non è valido (%u è il massimo per questo " "sistema)" #: options.cpp:188 #, c-format msgid "" "Selected graphic card (%u) is not a valid number (%u is the maximum for this " "system)" msgstr "" "La scheda grafica selezionata (%u) non è valida (%u è il massimo per questo " "sistema)" #: options.cpp:204 #, c-format msgid "failed to change CPU affinitiy to core %u" msgstr "Impossibile modificare l'affinità della CPU per il core %u" #: options.cpp:210 #, c-format msgid "" "Selected CPU core (%u) is not a valid number (%u is the maximum for this " "type of core)" msgstr "" "Il core della CPU selezionato (%u) non è valido (%u è il valore massimo per " "questo tipo di core)" #: options.cpp:284 #, c-format msgid "Selected tab (%u) is not a valid number (%u is the maximum)" msgstr "La scheda selezionata (%u) non valida (%u è il massimo)" #: tui_ncurses.cpp:111 msgid "Window is too small!" msgstr "La finestra è troppo piccola!" #: tui_ncurses.cpp:119 msgid "Press 'h' to see help." msgstr "Premi 'h' per visualizzare la guida." #: tui_ncurses.cpp:232 #, c-format msgid "Welcome in %s NCurses help!\n" msgstr "Benvenuto/a nella guida Ncurses di %s!\n" #: tui_ncurses.cpp:233 msgid "This help describes how to use this Text-based User Interface." msgstr "Questa guida descrive come usare questa interfaccia testuale." #: tui_ncurses.cpp:235 msgid "Global keys:" msgstr "Tasti globali:" #: tui_ncurses.cpp:236 msgid "Press 'left' key or 'tab' key to switch in left tab." msgstr "Premi il tasto 'sinistra' o 'tab' per passare alla scheda a sinistra." #: tui_ncurses.cpp:237 msgid "Press 'right' key or 'shift + tab' keys to switch in right tab." msgstr "" "Premi il tasto 'destra' o i tasti 'shift + tab' per passare alla scheda a " "destra." #: tui_ncurses.cpp:238 msgid "Press 'h' key to see this help." msgstr "Premi il tasto 'h' per visualizzare questa guida." #: tui_ncurses.cpp:239 msgid "Press 'q' key to exit." msgstr "Premi il tasto 'q' per uscire." #: tui_ncurses.cpp:241 msgid "CPU tab:" msgstr "Scheda CPU:" #: tui_ncurses.cpp:242 msgid "Press 'next page' key to decrease core type number to monitor." msgstr "" "Premere il tasto 'pag. giù' per ridurre il numero di core da monitorare." #: tui_ncurses.cpp:243 msgid "Press 'previous page' key to increase core type number to monitor." msgstr "" "Premere il tasto ''pag. su' per aumentare il numero di core da monitorare." #: tui_ncurses.cpp:244 msgid "Press 'down' key to decrease CPU core number to monitor." msgstr "Premi 'giù' per diminuire il numero di CPU core da monitorare." #: tui_ncurses.cpp:245 msgid "Press 'up' key to increase CPU core number to monitor." msgstr "Premi 'su' per aumentare il numero di CPU core da monitorare." #: tui_ncurses.cpp:247 msgid "Caches tab:" msgstr "Scheda cache:" #: tui_ncurses.cpp:248 msgid "Press 'down' key to switch to previous test." msgstr "Premi il tasto 'giù' per tornare al test precedente." #: tui_ncurses.cpp:249 msgid "Press 'up' key to switch to next test." msgstr "Premi il tasto 'su' per passare al prossimo test." #: tui_ncurses.cpp:251 msgid "Bench tab:" msgstr "Scheda bench:" #: tui_ncurses.cpp:252 msgid "Press 'down' key to decrement benchmark duration." msgstr "Premi il tasto 'giù' per diminuire la durata del benchmark." #: tui_ncurses.cpp:253 msgid "Press 'up' key to increment benchmark duration." msgstr "Premi il tasto 'su' per aumentare la durata del benchmark." #: tui_ncurses.cpp:254 msgid "Press 'next page' key to decrement number of threads to use." msgstr "" "Premi il tasto 'pagina giù' per diminuire il numero di thread da usare." #: tui_ncurses.cpp:255 msgid "Press 'previous page' key to increment number of threads to use." msgstr "Premi il tasto 'pagina su' per aumentare il numero di thread da usare." #: tui_ncurses.cpp:256 msgid "Press 's' key to start/stop prime numbers (slow) benchmark." msgstr "" "Premi il tasto 's' per avviare/fermare il benchmark dei numeri primi (lento)." #: tui_ncurses.cpp:257 msgid "Press 'f' key to start/stop prime numbers (fast) benchmark." msgstr "" "Premi il tasto 'f' per avviare/fermare il benchmark dei numeri primi " "(veloce)." #: tui_ncurses.cpp:259 msgid "Graphics tab:" msgstr "Scheda Grafica:" #: tui_ncurses.cpp:260 msgid "Press 'down' key to switch to previous graphic card." msgstr "Premi il tasto 'giù' per tornare alla precedente scheda grafica." #: tui_ncurses.cpp:261 msgid "Press 'up' key to switch to next graphic card." msgstr "Premi il tasto 'su' per passare alla prossima scheda grafica." #: tui_ncurses.cpp:263 msgid "Press any key to exit this help." msgstr "Premi qualsiasi tasto per uscire da questa guida." #: tui_ncurses.cpp:640 msgid "Starting NCurses TUI…" msgstr "Avvia interfaccia testuale NCurses…" #: tui_ncurses.cpp:649 msgid "" "FATAL ERROR: terminfo database could not be found (try to set TERMINFO " "environment variable)" msgstr "" "ERRORE FATALE: impossibile trovare il database terminfo (provare ad " "impostare la variabile di ambiente TERMINFO)" #: tui_ncurses.cpp:654 #, c-format msgid "Failed to set up %s terminal (err=%i); falling back to %s" msgstr "Impossibile impostare il terminale %s (err=%i); verrà utilizzato %s" #: util.cpp:189 #, c-format msgid "cannot find unit in '%s' string at position %i" msgstr "impossibile trovare '%s' nella stringa alla posizione %i" #: util.cpp:252 #, c-format msgid "an error occurred while opening file '%s'" msgstr "si è verificato un errore nell'apertura del file '%s'" #: util.cpp:297 #, c-format msgid "an error occurred while running command '%s'" msgstr "si è verificato un errore nell'esecuzione del comando '%s'" #: util.cpp:437 msgid "set_cpu_affinity() not supported on this operating system" msgstr "set_cpu_affinity() non supportato da questo sistema operativo" #: data.hpp:103 data.hpp:244 data.hpp:332 msgid "Vendor" msgstr "Produttore" #: data.hpp:104 msgid "Code Name" msgstr "Nome in codice" #: data.hpp:105 msgid "Package" msgstr "Socket" #: data.hpp:106 msgid "Technology" msgstr "Tecnologia" #: data.hpp:107 data.hpp:268 msgid "Voltage" msgstr "Voltaggio" #: data.hpp:108 msgid "Specification" msgstr "Specifica" #: data.hpp:109 msgid "Family" msgstr "Famiglia" #: data.hpp:110 msgid "Disp. Family" msgstr "Mostra Famiglia" #: data.hpp:111 data.hpp:224 data.hpp:245 data.hpp:335 msgid "Model" msgstr "Modello" #: data.hpp:112 msgid "Disp. Model" msgstr "Mostra Modello" #: data.hpp:113 msgid "Temp." msgstr "Temp." #: data.hpp:114 msgid "Stepping" msgstr "Revisione" #: data.hpp:115 msgid "Instructions" msgstr "Istruzioni" #: data.hpp:125 msgid "L1 Data" msgstr "L1 Dati" #: data.hpp:126 msgid "L1 Inst." msgstr "L1 Istr." #: data.hpp:127 msgid "Level 2" msgstr "Livello 2" #: data.hpp:128 msgid "Level 3" msgstr "Livello 3" #: data.hpp:137 cpu-x-gtk-3.12.ui:1232 msgid "Cores" msgstr "Core" #: data.hpp:138 data.hpp:408 cpu-x-gtk-3.12.ui:1252 msgid "Threads" msgstr "Thread" #: data.hpp:155 msgid "Core Speed" msgstr "Velocità del core" #: data.hpp:156 msgid "Multiplier" msgstr "Moltiplicatore" #: data.hpp:157 msgid "Bus Speed" msgstr "Velocità del bus" #: data.hpp:158 data.hpp:341 msgid "Usage" msgstr "Utilizzo" #: data.hpp:188 data.hpp:265 msgid "Size" msgstr "Dimensione" #: data.hpp:189 data.hpp:267 msgid "Speed" msgstr "Velocità" #: data.hpp:223 data.hpp:259 msgid "Manufacturer" msgstr "Produttore" #: data.hpp:225 msgid "Revision" msgstr "Revisione" #: data.hpp:233 msgid "Brand" msgstr "Marca" #: data.hpp:234 msgid "Version" msgstr "Versione" #: data.hpp:235 msgid "Date" msgstr "Data" #: data.hpp:236 msgid "ROM Size" msgstr "Dimensione ROM" #: data.hpp:260 msgid "Part Number" msgstr "Part Number" #: data.hpp:261 msgid "Type" msgstr "Tipo" #: data.hpp:262 msgid "Type Detail" msgstr "Inserisci dettagli" #: data.hpp:263 msgid "Device Locator" msgstr "Localizzazione dispositivo" #: data.hpp:264 msgid "Bank Locator" msgstr "Localizza banco" #: data.hpp:266 msgid "Rank" msgstr "Livello" #: data.hpp:292 msgid "Name" msgstr "Nome" #: data.hpp:293 msgid "Kernel" msgstr "Kernel" #: data.hpp:294 msgid "Hostname" msgstr "Hostname" #: data.hpp:295 msgid "Uptime" msgstr "Tempo in attività" #: data.hpp:303 msgid "Used" msgstr "In uso" #: data.hpp:304 msgid "Buffers" msgstr "Buffer" #: data.hpp:305 msgid "Cached" msgstr "In cache" #: data.hpp:306 msgid "Free" msgstr "Libera" #: data.hpp:307 msgid "Swap" msgstr "Swap" #: data.hpp:333 msgid "Driver" msgstr "Driver" #: data.hpp:334 msgid "UMD Version" msgstr "Versione UMD" #: data.hpp:336 msgid "Compute Unit" msgstr "Unità di calcolo" #: data.hpp:337 msgid "Device ID" msgstr "ID dispositivo" #: data.hpp:338 msgid "VBIOS Version" msgstr "Versione VBIOS" #. #-#-#-#-# source_ui.pot (cpu-x ) #-#-#-#-# #. Setting: "Interface" tab #: data.hpp:339 cpu-x-gtk-3.12.ui:5807 msgid "Interface" msgstr "Interfaccia" #: data.hpp:340 msgid "Temperature" msgstr "Temperatura" #: data.hpp:342 msgid "Core Voltage" msgstr "Voltaggio Core" #: data.hpp:343 msgid "Power Avg" msgstr "Potenza media" #: data.hpp:344 msgid "Core Clock" msgstr "Frequenza core" #: data.hpp:345 msgid "Memory Clock" msgstr "Frequenza memoria" #: data.hpp:346 msgid "Memory Used" msgstr "Memoria in uso" #: data.hpp:347 msgid "Resizable BAR" msgstr "BAR ridimensionabile" #: data.hpp:348 msgid "Vulkan RT" msgstr "Vulkan RT" #: data.hpp:349 msgid "OpenGL Version" msgstr "Versione OpenGL" #: data.hpp:350 msgid "Vulkan Version" msgstr "Versione Vulkan" #: data.hpp:351 msgid "OpenCL Version" msgstr "Versione OpenCL" #: data.hpp:387 msgid "Score" msgstr "Punteggio" #: data.hpp:388 msgid "Run" msgstr "Esegui" #: data.hpp:407 msgid "Duration" msgstr "Durata" #: util.hpp:77 msgid "bytes" msgstr "bytes" #. TRANSLATORS: initials for kilobyte (10³): please put initials (keep it short) #: util.hpp:80 msgid "kB" msgstr "kB" #. TRANSLATORS: initials for megabyte (10⁶): please put initials (keep it short) #: util.hpp:82 msgid "MB" msgstr "MB" #. TRANSLATORS: initials for gigabyte (10⁹): please put initials (keep it short) #: util.hpp:84 msgid "GB" msgstr "GB" #. TRANSLATORS: initials for terabyte (10¹²): please put initials (keep it short) #: util.hpp:86 msgid "TB" msgstr "TB" #. TRANSLATORS: initials for kibibyte (2¹⁰): please put initials (keep it short) #: util.hpp:89 msgid "KiB" msgstr "KiB" #. TRANSLATORS: initials for mebibyte (2²⁰): please put initials (keep it short) #: util.hpp:91 msgid "MiB" msgstr "MiB" #. TRANSLATORS: initials for gibibyte (2³⁰): please put initials (keep it short) #: util.hpp:93 msgid "GiB" msgstr "GiB" #. TRANSLATORS: initials for tebibyte (2⁴⁰): please put initials (keep it short) #: util.hpp:95 msgid "TiB" msgstr "TiB" #: cpu-x-gtk-3.12.ui:1184 msgid "Cache" msgstr "Cache" #. Setting: refresh time for UI #: cpu-x-gtk-3.12.ui:5721 msgid "Refresh time" msgstr "Intervallo di aggiornamento" #. Setting: GUI theme #: cpu-x-gtk-3.12.ui:5745 #, fuzzy #| msgid "Theme" msgid "Text theme" msgstr "Tema" #. Setting: automatic GUI theme #: cpu-x-gtk-3.12.ui:5760 msgid "Automatic" msgstr "Automatico" #. Setting: light GUI theme #: cpu-x-gtk-3.12.ui:5761 msgid "Blue for light theme" msgstr "Tema chiaro blu" #. Setting: dark GUI theme #: cpu-x-gtk-3.12.ui:5762 msgid "Yellow for dark theme" msgstr "Tema scuro giallo" #. Setting: temperature unit #: cpu-x-gtk-3.12.ui:5775 msgid "Temperature unit" msgstr "Temperatura" #. Setting: default tab at startup #: cpu-x-gtk-3.12.ui:5826 msgid "Default tab" msgstr "Scheda predefinita" #. Setting: default CPU core at startup #: cpu-x-gtk-3.12.ui:5839 msgid "Default CPU core" msgstr "Core CPU predefinito" #. Setting: default cache test at startup #: cpu-x-gtk-3.12.ui:5852 msgid "Default cache test" msgstr "Test cache predefinito" #. Setting: print CPUID values in decimal or hexadecimal #: cpu-x-gtk-3.12.ui:5895 msgid "Print CPUID values in decimal" msgstr "Stampa i valori CPUID in decimale" #. Setting: default graphic card at startup #: cpu-x-gtk-3.12.ui:5928 msgid "Default graphic card" msgstr "Scheda grafica predefinita" #. Setting: default CPU core at startup #: cpu-x-gtk-3.12.ui:5952 msgid "Default core type" msgstr "Tipo di core predefinito" #. Setting: default graphic card at startup #: cpu-x-gtk-3.12.ui:5976 msgid "Default memory stick" msgstr "Banco di memoria predefinito" #. Setting: "Startup" tab #: cpu-x-gtk-3.12.ui:6004 msgid "Startup" msgstr "Avvio" #~ msgid "Light" #~ msgstr "Chiaro" #~ msgid "Dark" #~ msgstr "Scuro" #~ msgid "Calculating CPU multipliers" #~ msgstr "Calcolo dei moltiplicatori della CPU" #, c-format #~ msgid "Current: PCIe Gen%1dx%d / Max: Gen%1dx%d" #~ msgstr "Attuale: PCIe Gen %1d x %d / Max: Gen %1d x %d" #~ msgid "failed to retrieve GPU clocks" #~ msgstr "impossibile recuperare le frequenze della GPU" #, c-format #~ msgid "Core #%i" #~ msgstr "Core #%i" #~ msgid "Setting label names" #~ msgstr "Impostazione dei nomi delle etichette" #, c-format #~ msgid "Bank %i" #~ msgstr "Banco %i" #~ msgid "Reference" #~ msgstr "Fonte" #~ msgid "Distribution" #~ msgstr "Distribuzione" #~ msgid "Compiler" #~ msgstr "Compilatore" #~ msgid "GPU clock" #~ msgstr "Frequenza GPU" #~ msgid "Dumping data…" #~ msgstr "Salvataggio dei dati…" #~ msgid "Freeing memory" #~ msgstr "Libero la memoria" #~ msgid "Ignore CPU frequency reported by libcpuid" #~ msgstr "Ignora la frequenza della CPU riportata da libcpuid" #, c-format #~ msgid "failed to call wordexp (%i)" #~ msgstr "impossibile eseguire wordexp (%i)" #~ msgid "Press 'home' key to scroll up in a page." #~ msgstr "Premere il tasto 'home' per scorrere verso l'alto in una pagina." #~ msgid "Press 'end' key to scroll down in a page." #~ msgstr "Premere il tasto 'fine' per scorrere la pagina verso il basso." #, c-format #~ msgid "String '%s' is too long, truncating…" #~ msgstr "La stringa \"%s\" è troppo lunga, riduzione…" #, c-format #~ msgid "failed to open %s directory" #~ msgstr "apertura della directory %s fallita" #~ msgid "an error occurred while compiling regex" #~ msgstr "" #~ "è intervenuto un errore alla compilazione delle espressioni regolari" #~ msgid "FATAL ERROR: could not allocate memory" #~ msgstr "ERRORE FATALE: impossibile allocare memoria" #~ msgid "Enumerating Vulkan instance extension properties" #~ msgstr "Verifica delle proprietà dell'estensione Vulkan" #, c-format #~ msgid "failed to call vkEnumerateInstanceExtensionProperties (%s)" #~ msgstr "chiamata a vkEnumerateInstanceExtensionProperties (%s) fallita" #, c-format #~ msgid "" #~ "failed to call vkEnumerateInstanceExtensionProperties to fill " #~ "VkExtensionProperties (%s)" #~ msgstr "" #~ "Impossibile chiamare vkEnumerateInstanceExtensionProperties per riempire " #~ "VkExtensionProperties (%s)" #~ msgid "Vulkan API is not available" #~ msgstr "API Vulkan non disponibile" #, c-format #~ msgid "%s" #~ msgstr "%s" #, c-format #~ msgid "" #~ "CPU hybrid architecture is not supported. For more details, please refer " #~ "to following issue: %s" #~ msgstr "" #~ "Le CPU con architettura ibrida non sono supportate. Per maggiori " #~ "dettagli, fare riferimento a questa segnalazione: %s" #~ msgid "NOT SUPPORTED" #~ msgstr "NON SUPPORTATO" #~ msgid "There is no device with Vulkan support" #~ msgstr "Non ci sono dispositivi con supporto Vulkan" #~ msgid "Socket(s)" #~ msgstr "Socket" #~ msgid "Thread(s)" #~ msgstr "Thread" #~ msgid "You can paste this backtrace by opening a new issue here:" #~ msgstr "Puoi incollare quest'analisi aprendo una nuova segnalazione qui:" #, fuzzy #~| msgid "failed to call dmidecode" #~ msgid "faild to call clGetDeviceIDs" #~ msgstr "fallimento a chiamare dmidecode" #~ msgid "Exiting %s" #~ msgstr "Uscita %s" #~ msgid "Skip CPU MSR opening (need to be root)" #~ msgstr "Ignorando l'apertura del MSR della CPU (richiede accesso root)" #~ msgid "failed to open CPU MSR (%s)" #~ msgstr "Fallimento dell'apertura del MSR della CPU (%s)" #~ msgid "Skip call to dmidecode (need to be root)" #~ msgstr "Ignorando la chiamata a dmidecode (richiede accesso root)" #~ msgid "failed to allocate memory for dmidecode" #~ msgstr "fallimento ad allocare la memoria per dmidecode" #~ msgid "Finding graphic card driver" #~ msgstr "Ricerca del driver della scheda grafica" #~ msgid "(%s driver)" #~ msgstr "(driver %s)" #~ msgid "Retrieving GPU temperature" #~ msgstr "Recupero della temperatura della GPU" #~ msgid "Off" #~ msgstr "Disattivato" #~ msgid "failed to retrieve GPU temperature" #~ msgstr "fallimento del recupero della temperatura della GPU" #~ msgid "Skip some GPU values (need to be root)" #~ msgstr "Ignorando alcuni valori della GPU (richiede l'accesso root)" #~ msgid "failed to allocate memory for benchmark" #~ msgstr "fallimento ad allocare la memoria per il benchmark" #~ msgid "Root privileges are required to work properly" #~ msgstr "Sono necessari i privilegi di root per funzionare correttamente" #~ msgid "Some information will not be retrievable" #~ msgstr "Alcune informazioni non saranno recuperabili" #~ msgid "Ignore" #~ msgstr "Ignora" #~ msgid "Run as root" #~ msgstr "Esegui come root" #~ msgid "A new version of %s is available!" #~ msgstr "È disponibile una nuova versione di %s!" #~ msgid "" #~ "Do you want to update %s to version %s after exit?\n" #~ "It will erase this binary file (%s) by the new version." #~ msgstr "" #~ "Vuoi aggiornare %s alla versione %s dopo l'uscita?\n" #~ "Questo file binario (%s) sarà cancellato dalla nuova versione." #~ msgid "Not now" #~ msgstr "Non adesso" #~ msgid "Update" #~ msgstr "Aggiornamento" #~ msgid "Checking on Internet for a new version..." #~ msgstr "Cerco su Internet una nuova versione..." #~ msgid "failed to open a Curl session" #~ msgstr "fallimento ad aprire una sessione Curl" #~ msgid "wrong write data" #~ msgstr "dati di scrittura sbagliati" #~ msgid "(version %s is available)" #~ msgstr "(la versione %s è disponibile)" #~ msgid "No new version available" #~ msgstr "Nessuna nuova versione disponibile" #~ msgid "(up-to-date)" #~ msgstr "(aggiornato)" #~ msgid "an error occurred while extracting %s archive (%s)" #~ msgstr "è intervenuto un errore durante l'estrazione dell'archivio %s (%s)" #~ msgid "" #~ "Network access is disabled by environment variable (set CPUX_NETWORK with " #~ "a positive value to enable it)" #~ msgstr "" #~ "L'accesso alla rete è disabilitato da una variabile di ambiente (imposta " #~ "un valore positivo per CPUX_NETWORK per abilitarlo)" #~ msgid "failed to open %s archive for writing" #~ msgstr "fallimento all'apertura dell'archivio %s in scrittura" #~ msgid "Downloading new version..." #~ msgstr "Scaricando la nuova versione..." #~ msgid "failed to download %s archive (%s)" #~ msgstr "fallimento dello scaricamento dell'archivio %s (%s)" #~ msgid "Extracting new version..." #~ msgstr "Estraendo la nuova versione..." #~ msgid "Applying new version..." #~ msgstr "Applicando la nuova versione..." #~ msgid "an error occurred while removing/renaming files" #~ msgstr "è intervenuto un errore durane la rimozione/rinomina dei file" #~ msgid "Update successful!" #~ msgstr "Aggiornamento riuscito!" #~ msgid "Update portable version if a new version is available" #~ msgstr "Aggiorna la versione portatile se è disponibile una nuova versione" #~ msgid "Temporarily disable network support" #~ msgstr "Disattiva temporaneamente l'accesso alla rete" #~ msgid "Built on %s, %s (with %s %s on %s)." #~ msgstr "Compilato su %s,%s (con %s %s su %s)." #~ msgid "" #~ "Sorry, you cannot update %s: 32-bit portable version is no more supported." #~ msgstr "" #~ "Spiacenti, non puoi aggiornare %s: la versione portatile a 32 bit non è " #~ "più supportata." #~ msgid "If you want to update, press 'u' key, or anything else to skip.\n" #~ msgstr "" #~ "Per effettuare l'aggiornamento premi il tasto \"u\", altrimenti qualsiasi " #~ "altro tasto per ignorare.\n" #~ msgid "" #~ "\n" #~ "\n" #~ "%s will be updated." #~ msgstr "" #~ "\n" #~ "\n" #~ "%s sarà aggiornato." CPU-X-5.0.3/po/ja.po000066400000000000000000001213641454622605200137400ustar00rootroot00000000000000# CPU-X translations template # Copyright © 2014-2024 The Tumultuous Unicorn Of Darkness # This file is distributed under the same license as the cpu-x package. # Hayao0819 , 2020, 2021. # Huang Zhiyi , 2020. # Takuro Onoue , 2020, 2023. # Umio Yasuno , 2021, 2023. # Kyotaro Iijima , 2022. # UTUMI Hirosi , 2022, 2023. # Kenryu Shibata , 2022. msgid "" msgstr "" "Project-Id-Version: cpu-x\n" "Report-Msgid-Bugs-To: https://github.com/TheTumultuousUnicornOfDarkness/CPU-" "X/issues\n" "POT-Creation-Date: 2023-12-09 13:09+0100\n" "PO-Revision-Date: 2023-12-10 08:16+0000\n" "Last-Translator: UTUMI Hirosi \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.3-dev\n" #: core.cpp:135 msgid "Finding CPU technology" msgstr "CPUテクノロジーの識別中" #: core.cpp:161 #, c-format msgid "" "Your CPU is not present in the database ==> %s, model: %i, ext. model: %i, " "ext. family: %i" msgstr "" "この CPU はデータベースに登録がありません ==> %s、モデル: %i、拡張モデル:" "%i、拡張ファミリー:%i" #: core.cpp:189 data.cpp:150 data.cpp:342 msgid "unknown" msgstr "不明" #: core.cpp:230 msgid "Calling libcpuid for retrieving static data" msgstr "静的データを取得するため libcpuid を呼び出し中" #: core.cpp:245 #, c-format msgid "failed to call libcpuid (%s)" msgstr "libcpuid の取得に失敗(%s)" #: core.cpp:340 msgid "Calling libcpuid for retrieving dynamic data" msgstr "動的データを取得するため libcpuid を呼び出し中" #: core.cpp:353 msgid "Calling libcpuid for retrieving CPU MSR static values" msgstr "CPUMSR静的値を取得するために libcpuid を呼び出しています" #: core.cpp:380 msgid "Calling libcpuid for retrieving CPU MSR dynamic values" msgstr "CPU の MSR ダイナミックの値を取得するため libcpuid を呼び出し中" #: core.cpp:412 msgid "Calling dmidecode" msgstr "dmidecode を呼び出し中" #: core.cpp:454 core.cpp:473 #, c-format msgid "%s (configured)" msgstr "%s (設定値)" #: core.cpp:461 core.cpp:480 #, c-format msgid "%s (max)" msgstr "%s (最大)" #: core.cpp:466 #, c-format msgid "%s (min)" msgstr "%s (最小)" #: core.cpp:496 msgid "Calculating CPU usage" msgstr "CPU 使用率の計算中" #: core.cpp:546 msgid "Calling bandwidth" msgstr "帯域幅を呼び出し中" #: core.cpp:613 #, c-format msgid "" "pci_access is not properly initialized: it is a common issue when %s was " "built with a lower libpci version.\n" "Check that libpci %s library is present on your system. Otherwise, please " "rebuild %s." msgstr "" "pciアクセスが正常に初期化されませんでした: これはlibpicの%sのバージョンが低い" "時に起こる一般的な問題です。\n" "あなたのシステムにlibpci %s ライブラリが存在することを確かめてください。そう" "でなければ%sを再ビルドして下さい。" #: core.cpp:657 #, c-format msgid "No kernel driver in use for graphic card at path %s" msgstr "パス %s にグラフィック カードに使用するカーネル ドライバがありません" #: core.cpp:693 #, c-format msgid "Your GPU kernel driver is unknown: %s" msgstr "不明な GPU カーネル ドライバー: %s" #: core.cpp:777 #, c-format msgid "Your GPU user mode driver is unknown for vendor %s: %s" msgstr "お使いの GPU ユーザーモードドライバーはベンダー %s で不明です: %s" #: core.cpp:781 #, c-format msgid "failed to call GLFW (%i): %s" msgstr "GLFW の取得に失敗(%i): %s" #: core.cpp:914 msgid "Finding Vulkan API version" msgstr "Vulkan API バージョンの検索" #: core.cpp:926 #, c-format msgid "failed to call vkCreateInstance (%s)" msgstr "vkCreateInstance の呼び出しに失敗しました(%s)" #: core.cpp:929 #, c-format msgid "%s is not supported" msgstr "%s はサポートされていません" #: core.cpp:937 #, c-format msgid "failed to call vkEnumeratePhysicalDevices (%s)" msgstr "vkEnumeratePhysicalDevices の呼び出しに失敗しました(%s)" #: core.cpp:944 msgid "No available Vulkan devices" msgstr "利用可能な Vulkan デバイスがありません" #: core.cpp:952 #, c-format msgid "No available physical devices (%s)" msgstr "利用可能な物理デバイスがありません(%s)" #: core.cpp:1015 #, c-format msgid "Failed to create Vulkan for device %u (%s)" msgstr "デバイス %u の Vulkan を作成できませんでした(%s)" #: core.cpp:1019 #, c-format msgid "%s is not supported for device %u, use only deviceID for matching" msgstr "" "%s はデバイス %u ではサポートされていません。マッチさせるにはデバイス ID のみ" "を使用してください" #: core.cpp:1051 core.cpp:1364 msgid "Enabled" msgstr "有効" #: core.cpp:1051 core.cpp:1364 msgid "Disabled" msgstr "無効" #: core.cpp:1088 msgid "Finding OpenCL API version" msgstr "VulkanOpenCL API バージョンの確認" #: core.cpp:1092 #, c-format msgid "There is no platform with OpenCL support (%s)" msgstr "OpenCL に対応するプラットフォームはありません(%s)" #: core.cpp:1102 #, c-format msgid "failed to get all OpenCL platforms (%s)" msgstr "すべての OpenCL プラットフォームの取得に失敗しました(%s)" #: core.cpp:1115 #, c-format msgid "failed to get name for platform %u (%s)" msgstr "プラットフォーム %u の名前の取得に失敗しました(%s)" #: core.cpp:1123 #, c-format msgid "failed to get version for platform %u (%s)" msgstr "プラットフォーム %u のバージョンの取得に失敗しました(%s)" #: core.cpp:1131 #, c-format msgid "failed to find number of OpenCL devices for platform '%s %s' (%s)" msgstr "" "プラットフォーム '%s %s’ の OpenCL デバイス数の取得に失敗しました(%s)" #: core.cpp:1131 msgid "0 device" msgstr "0 デバイス" #: core.cpp:1140 #, c-format msgid "failed to get all of OpenCL devices for platform '%s %s' (%s)" msgstr "" "プラットフォーム '%s %s' のすべての OpenCL デバイスの取得に失敗しました(%s)" #: core.cpp:1160 #, c-format msgid "failed to get name for device %u (%s)" msgstr "デバイス %u の名前の取得に失敗しました(%s)" #: core.cpp:1168 #, c-format msgid "failed to get version for device %u (%s)" msgstr "デバイス %u (%s) のバージョンの取得に失敗しました" #: core.cpp:1190 #, c-format msgid "OpenCL driver for '%s %s' does not support CL_DEVICE_TOPOLOGY_AMD (%s)" msgstr "'%s %s' の OpenCLドライバは CL_DEVICE_TOPOLOGY_AMD (%s) に未対応です" #: core.cpp:1201 #, c-format msgid "" "OpenCL driver for '%s %s' does not support CL_DEVICE_GFXIP_MAJOR_AMD (%s)" msgstr "" "'%s %s' の OpenCLドライバは CL_DEVICE_GFXIP_MAJOR_AMD (%s) に未対応です" #: core.cpp:1209 core.cpp:1229 core.cpp:1262 #, c-format msgid "" "OpenCL driver for '%s %s' does not support CL_DEVICE_MAX_COMPUTE_UNITS (%s)" msgstr "" "'%s %s' の OpenCLドライバは CL_DEVICE_MAX_COMPUTE_UNITS (%s) に未対応です" #: core.cpp:1250 #, c-format msgid "" "OpenCL driver for '%s %s' does not support CL_DEVICE_PCI_DOMAIN_ID_NV (%s), " "CL_DEVICE_PCI_BUS_ID_NV (%s) or CL_DEVICE_PCI_SLOT_ID_NV (%s)" msgstr "" "'%s %s´の OpenCL ドライバは、CL_DEVICE_PCI_DOMAIN_ID_NV (%s)、" "CL_DEVICE_PCI_BUS_ID_NV (%s) または CL_DEVICE_PCI_SLOT_ID_NV (%s) に未対応で" "す" #: core.cpp:1273 #, c-format msgid "OpenCL is not supported with your GPU vendor (0x%X)" msgstr "OPENCL は GPU ベンダー (0x%X) に未対応です" #: core.cpp:1295 msgid "Finding devices" msgstr "デバイスを識別中" #: core.cpp:1307 #, c-format msgid "Skip devices search (wrong permissions on %s device)" msgstr "デバイス判定の除外( %s デバイス上の不正な権限)" #: core.cpp:1350 #, c-format msgid "Your GPU vendor is unknown: %s (0x%X)" msgstr "不明な GPU ベンダー : %s(0x %X)" #: core.cpp:1370 msgid "failed to find chipset vendor and model" msgstr "チップセットのベンダーとモデルの判別に失敗しました" #: core.cpp:1385 msgid "failed to find graphic card vendor and model" msgstr "グラフィック カードのベンダーとモデルの取得に失敗しました" #: core.cpp:1487 msgid "Retrieving GPU clocks" msgstr "GPU クロックを取得中" #: core.cpp:1500 msgid "None" msgstr "None" #: core.cpp:1509 #, c-format msgid "DRM path for %s is unknown" msgstr "%s の DRM パスが不明です" #: core.cpp:1516 #, c-format msgid "Card number for %s is unknown" msgstr "%s のカード番号が不明です" #: core.cpp:1541 #, c-format msgid "PCIe %s (current) / %s (max)" msgstr "PCIe %s (現在) / %s (最大)" #: core.cpp:1650 #, c-format msgid "Driver for %s doesn't report frequencies" msgstr "%s のドライバーは周波数を報告しません" #: core.cpp:1671 #, c-format msgid "failed to retrieve all monitoring data for %s" msgstr "" "すべての OpenCL プラットフォームの取得に失敗しました(%s のすべての監視データ" "の取得)" #: core.cpp:1694 msgid "Identifying running system" msgstr "実行中のシステムの識別中" #: core.cpp:1697 msgid "failed to identify running system" msgstr "実行中のシステムの識別に失敗しました" #: core.cpp:1749 core.cpp:1778 msgid "Calling libprocps" msgstr "libprocps の呼び出し中" #: core.cpp:1752 msgid "unable to get system uptime" msgstr "システム稼働時間を取得できません" #: core.cpp:1758 msgid "unable to create meminfo structure" msgstr "meminfo ストラクチャを作成できません" #: core.cpp:1804 msgid "Calling libstatgrab" msgstr "libstatgrab を呼び出し中" #: core.cpp:1852 #, c-format msgid "%i days, %i hours, %i minutes, %i seconds" msgstr "%i 日 %i 時間 %i 分 %i 秒" #: core.cpp:1915 msgid "Updating benchmark status" msgstr "ベンチマーク状態を更新中" #: core.cpp:1918 msgid "Active" msgstr "動作中" #: core.cpp:1921 #, c-format msgid "(%u hours left)" msgstr "(残り %u 時間)" #: core.cpp:1923 #, c-format msgid "(%u minutes left)" msgstr "(残り %u 分)" #: core.cpp:1925 #, c-format msgid "(%u seconds left)" msgstr "(残り %u 秒)" #: core.cpp:1929 core.cpp:1984 core.cpp:1985 msgid "Inactive" msgstr "休止中" #: core.cpp:1932 #, c-format msgid "in %u hours" msgstr "/ %u 時間" #: core.cpp:1934 #, c-format msgid "in %u minutes" msgstr "/ %u 分" #: core.cpp:1936 #, c-format msgid "in %u seconds" msgstr "/ %u 秒" #: core.cpp:1953 #, c-format msgid "Starting benchmark with %u threads" msgstr "%u スレッドでベンチマークを開始します" #: core.cpp:1976 msgid "an error occurred while starting benchmark" msgstr "ベンチマーク開始時にエラーが発生しました" #: core.cpp:2002 msgid "Finding CPU package in fallback mode" msgstr "fallback モードで CPU パッケージを識別中" #: core.cpp:2032 #, c-format msgid "Your CPU socket is not present in the database ==> %s, codename: %s" msgstr "" "この CPU ソケットはデータベースに登録がありません ==> %s、コードネーム: %s" #: core.cpp:2052 msgid "Calculating CPU multipliers in fallback mode" msgstr "fallback モードで CPU 倍率を計算中" #: core.cpp:2072 msgid "Retrieving motherboard information in fallback mode" msgstr "fallback モードでマザーボード情報を取得中" #: core.cpp:2085 msgid "failed to retrieve motherboard information (fallback mode)" msgstr "マザーボード情報の取得に失敗(fallback モード)" #: core.cpp:2127 msgid "Retrieving CPU temperature in fallback mode" msgstr "fallback モードで CPU 温度の取得" #: core.cpp:2173 msgid "failed to retrieve CPU temperature (fallback mode)" msgstr "CPU 温度の取得に失敗(fallback モード)" #: core.cpp:2188 msgid "Retrieving CPU voltage in fallback mode" msgstr "fallback モードで CPU 電圧の取得" #: core.cpp:2200 msgid "failed to retrieve CPU voltage (fallback mode)" msgstr "CPU 電圧の取得に失敗(fallback モード)" #: core.cpp:2214 msgid "Retrieving CPU frequency in fallback mode" msgstr "fallback モードでCPU クロック周波数の取得" #: core.cpp:2220 msgid "failed to retrieve CPU frequency (fallback mode)" msgstr "CPU クロック周波数の取得に失敗(fallback モード)" #: daemon_client.cpp:65 msgid "Starting daemon in background…" msgstr "バックグラウンドでデーモンを起動…" #: daemon_client.cpp:172 msgid "pkexec: authorization could not be obtained (dialog dismissed)" msgstr "pkexec: 認証を取得できません(ダイアログが閉じられました)" #: daemon_client.cpp:175 msgid "pkexec: authorization could not be obtained (not authorized)" msgstr "pkexec: 認証を取得できません(認証されていません)" #: daemon_client.cpp:178 msgid "pkexec: command not found" msgstr "pkexec: コマンドが見つかりません" #: daemon_client.cpp:181 msgid "pkexec: unexpected error code" msgstr "pkexec: 予期しないエラーコード" #: daemon_client.cpp:211 msgid "Connecting to daemon…" msgstr "デーモンに接続…" #: daemon_server.cpp:261 #, c-format msgid "request_handler: case %i not handled" msgstr "request_handler: %i は未搭載" #: data.cpp:124 cpu-x-gtk-3.12.ui:1370 msgid "CPU" msgstr "CPU" #: data.cpp:187 msgid "P-core" msgstr "P-コア" #: data.cpp:188 msgid "E-core" msgstr "E-コア" #: data.cpp:189 data.cpp:192 msgid "Core" msgstr "コア" #: data.cpp:208 cpu-x-gtk-3.12.ui:746 msgid "Processor" msgstr "プロセッサー" #: data.cpp:240 data.cpp:329 cpu-x-gtk-3.12.ui:1968 msgid "Caches" msgstr "キャッシュ" #: data.cpp:247 #, c-format msgid "%2d x %4d %s, %2d-way" msgstr "%2d x %4d %s, %2d-way" #: data.cpp:249 #, c-format msgid "%d %s, %d-way" msgstr "%d %s, %d-way" #: data.cpp:263 msgid "Count" msgstr "カウント" #: data.cpp:276 cpu-x-gtk-3.12.ui:968 msgid "Clocks" msgstr "クロック" #: data.cpp:379 data.cpp:383 #, c-format msgid "L%u Cache" msgstr "L%u キャッシュ" #: data.cpp:385 #, c-format msgid "%s associative, %d-%s line size" msgstr "%s 連想, %d-%s 行サイズ" #: data.cpp:398 msgid "Test" msgstr "テスト" #: data.cpp:409 data.cpp:423 cpu-x-gtk-3.12.ui:2146 cpu-x-gtk-3.12.ui:2517 msgid "Motherboard" msgstr "マザーボード" #: data.cpp:437 cpu-x-gtk-3.12.ui:2367 msgid "BIOS" msgstr "BIOS" #: data.cpp:452 cpu-x-gtk-3.12.ui:2498 msgid "Chipset" msgstr "チップセット" #: data.cpp:467 data.cpp:569 cpu-x-gtk-3.12.ui:3156 cpu-x-gtk-3.12.ui:3761 msgid "Memory" msgstr "メモリー" #: data.cpp:483 #, c-format msgid "Stick %u" msgstr "スティック %u" #: data.cpp:487 cpu-x-gtk-3.12.ui:3134 msgid "Sticks" msgstr "スティック" #: data.cpp:541 cpu-x-gtk-3.12.ui:3780 msgid "System" msgstr "システム" #: data.cpp:554 cpu-x-gtk-3.12.ui:3380 msgid "Operating System" msgstr "オペレーティングシステム" #: data.cpp:587 cpu-x-gtk-3.12.ui:4960 msgid "Graphics" msgstr "グラフィック" #: data.cpp:621 #, c-format msgid "Card %u" msgstr "カード %u" #: data.cpp:625 cpu-x-gtk-3.12.ui:4938 msgid "Cards" msgstr "カード" #: data.cpp:672 cpu-x-gtk-3.12.ui:5300 msgid "Bench" msgstr "ベンチマーク" #: data.cpp:685 msgid "Not started" msgstr "停止中" #: data.cpp:688 cpu-x-gtk-3.12.ui:5070 msgid "Prime numbers (slow)" msgstr "素数(低速)" #: data.cpp:692 cpu-x-gtk-3.12.ui:5178 msgid "Prime numbers (fast)" msgstr "素数(高速)" #: data.cpp:696 cpu-x-gtk-3.12.ui:5281 msgid "Parameters" msgstr "パラメータ" #: data.cpp:721 data.cpp:727 #, c-format msgid "%u mins" msgstr "%u 分" #: data.cpp:734 cpu-x-gtk-3.12.ui:5444 cpu-x-gtk-3.12.ui:5552 msgid "About" msgstr "CPU-Xについて" #: data.cpp:739 #, c-format msgid "" "%s is a Free software that gathers information\n" "on CPU, motherboard and more." msgstr "" "%s はCPUやマザーボードなどの情報を\n" "収集する無料のソフトウェアです。" #: data.cpp:744 msgid "About CPU-X" msgstr "CPU-X について" #: data.cpp:745 #, c-format msgid "Version %s" msgstr "バージョン %s" #: data.cpp:746 #, c-format msgid "Author: %s" msgstr "作者: %s" #: data.cpp:747 #, c-format msgid "Site: %s" msgstr "サイト: %s" #: data.cpp:751 cpu-x-gtk-3.12.ui:5533 msgid "License" msgstr "ライセンス" #: data.cpp:753 #, c-format msgid "This software is distributed under the terms of %s" msgstr "このソフトウェアは%sのもとで配布されています" #: data.cpp:754 main.cpp:176 msgid "This program comes with ABSOLUTELY NO WARRANTY" msgstr "このプログラムは全て自己責任で使用してください" #: gui_gtk.cpp:61 #, c-format msgid "Cannot find path for '%s' file" msgstr "'%s' ファイルのパスが見つかりません" #: gui_gtk.cpp:400 msgid "Start daemon" msgstr "デーモンの起動" #: gui_gtk.cpp:403 msgid "Connected to daemon" msgstr "デーモンに接続" #: gui_gtk.cpp:406 msgid "No polkit authentication agent found" msgstr "Polkit 認証エージェントが見つかりません" #: gui_gtk.cpp:411 msgid "Ask password to start daemon in background" msgstr "バックグラウンドでデーモンを起動するためにパスワードが必要" #: gui_gtk.cpp:415 msgid "Settings" msgstr "設定" #: gui_gtk.cpp:634 msgid "BaseFamily" msgstr "ベース ファミリー" #: gui_gtk.cpp:635 msgid "CPU display (\"true\") family (computed as BaseFamily+ExtendedFamily)" msgstr "CPU display (\"true\") family (computed as BaseFamily+ExtendedFamily)" #: gui_gtk.cpp:636 msgid "BaseModel" msgstr "ベース モデル" #: gui_gtk.cpp:637 msgid "CPU display (\"true\") model (computed as (ExtendedModel<<4)+BaseModel)" msgstr "" "CPU display (\"true\") model (computed as (ExtendedModel<<4)+BaseModel)" #: gui_gtk.cpp:847 msgid "" "Identify the physically-labeled socket or board position where the memory " "device is located" msgstr "" "メモリデバイスが配置されている、物理的にラベル付けされたソケットまたはボード" "の位置を特定する" #: gui_gtk.cpp:848 msgid "Identify the physically labeled bank where the memory device is located" msgstr "" "メモリデバイスが配置されている、物理的にラベル付けされたバンクを特定する" #: gui_gtk.cpp:1052 msgid "User Mode Driver Version" msgstr "ユーザー モードのドライバーのバージョン" #: gui_gtk.cpp:1066 msgid "Vulkan Ray Tracing" msgstr "Vulkan レイトレーシング" #: gui_gtk.cpp:1260 msgid "Starting GTK GUI…" msgstr "GTK GUI の起動…" #: gui_gtk.cpp:1272 msgid "failed to import UI in GtkBuilder" msgstr "GtkBuilder での UI のインポートに失敗" #: main.cpp:63 msgid "Start graphical user interface (GUI) (default)" msgstr "グラフィカルユーザインタフェース(GUI)を開始する(デフォルト)" #: main.cpp:64 msgid "Start text-based user interface (TUI)" msgstr "テキストユーザインタフェース(TUI)を開始する" #: main.cpp:65 msgid "Dump all data on standard output and exit" msgstr "全てのデータを取得し、標準出力して終了します" #: main.cpp:66 msgid "Run embedded command dmidecode and exit" msgstr "埋め込みコマンド dmidecode を実行して終了します" #: main.cpp:67 msgid "Run embedded command bandwidth and exit" msgstr "埋め込みコマンド bandwidth を実行して終了します" #: main.cpp:68 msgid "Set temperature unit (c[elsius]|f[ahrenheit]|k[elvin]|r[ankine])" msgstr "温度の単位を設定する (c[elsius]|f[ahrenheit]|k[elvin]|r[ankine])" #: main.cpp:69 msgid "Set custom time between two refreshes (in seconds)" msgstr "更新の間隔を設定します(秒)" #: main.cpp:70 msgid "Set default tab (integer)" msgstr "デフォルトのタブを設定します(整数)" #: main.cpp:71 msgid "Select core type to monitor (integer)" msgstr "モニターするコアタイプを選択します(整数)" #: main.cpp:72 msgid "Select CPU core to monitor (integer)" msgstr "モニターするCPUコアを選択します(整数)" #: main.cpp:73 msgid "Set custom bandwidth test for CPU caches speed (integer)" msgstr "CPUキャッシュ速度の帯域幅テストを設定します(整数)" #: main.cpp:74 msgid "Select default memory stick (integer)" msgstr "デフォルトのメモリースティックを選択(整数)" #: main.cpp:75 msgid "Select default graphic card (integer)" msgstr "デフォルトのグラフィックカードの選択(整数)" #: main.cpp:76 cpu-x-gtk-3.12.ui:5910 msgid "Start and connect to daemon" msgstr "起動時にデーモンを開始する" #: main.cpp:77 msgid "Verbose output" msgstr "詳細な出力を有効化します" #: main.cpp:78 msgid "Print help and exit" msgstr "ヘルプメッセージを表示して終了します" #: main.cpp:79 msgid "Print version and exit" msgstr "バージョンを表示して終了します" #: main.cpp:80 msgid "Print CPUID values in decimal (default is hexadeximal)" msgstr "CPUIDの値を10進数で表示します (デフォルトでは16進数です)" #: main.cpp:81 msgid "Disable colored output" msgstr "色のついた出力を無効化します" #: main.cpp:82 msgid "Print information for debugging" msgstr "デバッグのための情報を表示します" #: main.cpp:83 msgid "Print required information to paste in an issue" msgstr "Issueに貼り付けるために必要な情報を表示します" #: main.cpp:84 msgid "Set key mapping for NCurses mode (a[rrows]|e[macs]|i[nverted-T]|v[im])" msgstr "" "NCursesモードのキーマッピングを設定します(a[rrows]|e[macs]|i[nverted-T]|" "v[im])" #: main.cpp:95 msgid "Add default command line arguments" msgstr "デフォルトのコマンドライン引数を追加します" #: main.cpp:96 msgid "Enforce the bus clock" msgstr "バスクロックを適用する" #: main.cpp:97 msgid "" "Ignore CPU values reported by libcpuid (comma-separated values among 'temp', " "'volt' and 'freq')" msgstr "" "libcpuid が報告する CPU の値('temp', 'volt', 'freq' をカンマ区切りにした値)" "を無視する" #: main.cpp:98 msgid "Read CPUID raw data from a given file" msgstr "生のCPUIDデータを与えられたファイルから読み込みます" #: main.cpp:99 msgid "Only print a message if CPU is not present in the database" msgstr "CPUがデータベースに存在しない場合のみメッセージを出力します" #: main.cpp:126 #, c-format msgid "Usage: %s DISPLAY [OPTIONS]\n" msgstr "使い方: %s 表示(オプション)\n" #: main.cpp:127 msgid "Available DISPLAY:" msgstr "利用可能な表示方法:" #: main.cpp:135 msgid "Available OPTIONS:" msgstr "利用可能なオプション:" #: main.cpp:144 msgid "Influenceable environment variables:" msgstr "影響力のある環境変数:" #: main.cpp:175 msgid "This is free software: you are free to change and redistribute it." msgstr "これはフリーソフトウェアです: 自由に変更して再配布することができます。" #: main.cpp:177 #, c-format msgid "See the %s license: <%s>\n" msgstr "%s ライセンスを見てください: <%s>\n" #: main.cpp:184 #, c-format msgid "-- %-9s version: %s" msgstr "-- %-9s バージョン: %s" #: main.cpp:381 #, c-format msgid "" "\n" "Oops, something was wrong! %s has received signal %d (%s) and has crashed." msgstr "" "\n" "何かが間違っています!%s はシグナル %d (%s)を受け取ってクラッシュしました。" #: main.cpp:383 #, c-format msgid "" "\n" "Oops, something was wrong! %s has received signal %d (%s) and is trying to " "recover." msgstr "" "\n" "何かが間違っています!%s はシグナル %d (%s) を受け取り、回復を試みています。" #: main.cpp:407 msgid "You can open a new issue here, by filling the template as requested:" msgstr "ここで新しい問題をテンプレートを使って報告することが出来ます。" #: main.cpp:449 msgid "an error occurred while setting locale" msgstr "ロケールの設定中にエラーが発生しました" #: options.cpp:124 #, c-format msgid "" "Selected CPU type (%u) is not a valid number (%u is the maximum for this CPU)" msgstr "" "選択した CPU タイプ(%u)は有効な数値ではありません(%u がこの CPU の最大値で" "す)" #: options.cpp:145 #, c-format msgid "" "Selected bandwidth test (%u) is not a valid number (%u is the maximum for " "this system)" msgstr "" "選択した帯域幅テスト(%u)は有効な数値ではありません(%u がこのシステムの最大" "値です)" #: options.cpp:168 #, c-format msgid "" "Selected RAM stick (%u) is not a valid number (%u is the maximum for this " "system)" msgstr "" "選択した RAM スティック(%u)は有効な数値ではありません(%u がこのシステムの" "最大値です)" #: options.cpp:188 #, c-format msgid "" "Selected graphic card (%u) is not a valid number (%u is the maximum for this " "system)" msgstr "" "選択したグラフィックカード(%u)は有効な番号ではありません(%u がこのシステム" "の最大値です)" #: options.cpp:204 #, c-format msgid "failed to change CPU affinitiy to core %u" msgstr "CPU アフィニティをコア %u に変更できませんでした" #: options.cpp:210 #, c-format msgid "" "Selected CPU core (%u) is not a valid number (%u is the maximum for this " "type of core)" msgstr "" "選択した CPU コア(%u)は有効な数値ではありません(%u がこのタイプのコアの最" "大値です)" #: options.cpp:284 #, c-format msgid "Selected tab (%u) is not a valid number (%u is the maximum)" msgstr "選択したタブ(%u)は有効な数値ではありません(%u は最大値です)" #: tui_ncurses.cpp:111 msgid "Window is too small!" msgstr "ウィンドウが小さすぎます!" #: tui_ncurses.cpp:119 msgid "Press 'h' to see help." msgstr "ヘルプの表示は「h」キーを押す。" #: tui_ncurses.cpp:232 #, c-format msgid "Welcome in %s NCurses help!\n" msgstr "%sのNCursesヘルプへようこそ\n" #: tui_ncurses.cpp:233 msgid "This help describes how to use this Text-based User Interface." msgstr "" "このヘルプでは、テキスト ベースのユーザー インターフェイスの使用方法について" "説明します。" #: tui_ncurses.cpp:235 msgid "Global keys:" msgstr "グローバル キー:" #: tui_ncurses.cpp:236 msgid "Press 'left' key or 'tab' key to switch in left tab." msgstr "「左」キーまたは「Tab」キーで左タブに切り替えます。" #: tui_ncurses.cpp:237 msgid "Press 'right' key or 'shift + tab' keys to switch in right tab." msgstr "「右」キーまたは「Shift + Tab」キーで右タブに切り替えます。" #: tui_ncurses.cpp:238 msgid "Press 'h' key to see this help." msgstr "「h」キーで、ヘルプの表示。" #: tui_ncurses.cpp:239 msgid "Press 'q' key to exit." msgstr "「q」キーで、で終了。" #: tui_ncurses.cpp:241 msgid "CPU tab:" msgstr "CPU タブ:" #: tui_ncurses.cpp:242 msgid "Press 'next page' key to decrease core type number to monitor." msgstr "「PageDown」キーで、モニターするコア タイプの数字を減らします。" #: tui_ncurses.cpp:243 msgid "Press 'previous page' key to increase core type number to monitor." msgstr "「PageUp」キーで、モニターするコア タイプの数字を増やします。" #: tui_ncurses.cpp:244 msgid "Press 'down' key to decrease CPU core number to monitor." msgstr "「下」キーで、モニターするCPUコアの数字を減らします。" #: tui_ncurses.cpp:245 msgid "Press 'up' key to increase CPU core number to monitor." msgstr "「上」キーで、モニターするCPUコアの数字を増やします。" #: tui_ncurses.cpp:247 msgid "Caches tab:" msgstr "キャッシュ タブ:" #: tui_ncurses.cpp:248 msgid "Press 'down' key to switch to previous test." msgstr "下矢印キーで、前のテストに切り替わります。" #: tui_ncurses.cpp:249 msgid "Press 'up' key to switch to next test." msgstr "「上」キーで、次のテストに切り替えます。" #: tui_ncurses.cpp:251 msgid "Bench tab:" msgstr "ベンチ タブ:" #: tui_ncurses.cpp:252 msgid "Press 'down' key to decrement benchmark duration." msgstr "下矢印キーで、ベンチマーク期間 の減少。" #: tui_ncurses.cpp:253 msgid "Press 'up' key to increment benchmark duration." msgstr "上矢印キーで、ベンチマーク期間 の増加。" #: tui_ncurses.cpp:254 msgid "Press 'next page' key to decrement number of threads to use." msgstr "「次のページ」キーで、使用するスレッド数の減少。" #: tui_ncurses.cpp:255 msgid "Press 'previous page' key to increment number of threads to use." msgstr "「前のページ」キーで、使用するスレッド数の増加。" #: tui_ncurses.cpp:256 msgid "Press 's' key to start/stop prime numbers (slow) benchmark." msgstr "「s」キーで、素数ベンチマーク(遅く)の始動/停止。" #: tui_ncurses.cpp:257 msgid "Press 'f' key to start/stop prime numbers (fast) benchmark." msgstr "「f」キーで、素数ベンチマーク(早く)の始動/停止。" #: tui_ncurses.cpp:259 msgid "Graphics tab:" msgstr "グラフィック タブ:" #: tui_ncurses.cpp:260 msgid "Press 'down' key to switch to previous graphic card." msgstr "下矢印キーで、前のグラフィックカードに切り替える。" #: tui_ncurses.cpp:261 msgid "Press 'up' key to switch to next graphic card." msgstr "上矢印キーで、次のグラフィックカードに切り替える。" #: tui_ncurses.cpp:263 msgid "Press any key to exit this help." msgstr "ヘルプの終了は、任意のキーを押します。" #: tui_ncurses.cpp:640 msgid "Starting NCurses TUI…" msgstr "NCurses TUI を開始しています…" #: tui_ncurses.cpp:649 msgid "" "FATAL ERROR: terminfo database could not be found (try to set TERMINFO " "environment variable)" msgstr "" "致命的なエラー: terminfoデータベースが見つかりませんでした(TERMINFO環境変数" "を設定してください)" #: tui_ncurses.cpp:654 #, c-format msgid "Failed to set up %s terminal (err=%i); falling back to %s" msgstr "" "ターミナル %s のセットアップに失敗しました(エラー%i); %sにFalbackします" #: util.cpp:189 #, c-format msgid "cannot find unit in '%s' string at position %i" msgstr "「%s」の %i 番目の文字列にはユニットがない" #: util.cpp:252 #, c-format msgid "an error occurred while opening file '%s'" msgstr "ファイル '%s' を開くときにエラーが発生しました" #: util.cpp:297 #, c-format msgid "an error occurred while running command '%s'" msgstr "コマンド '%s' の実行中にエラーが発生しました" #: util.cpp:437 msgid "set_cpu_affinity() not supported on this operating system" msgstr "" "set_cpu_affinity() はこのオペレーティング システムではサポートされていません" #: data.hpp:103 data.hpp:244 data.hpp:332 msgid "Vendor" msgstr "ベンダー" #: data.hpp:104 msgid "Code Name" msgstr "コードネーム" #: data.hpp:105 msgid "Package" msgstr "パッケージ" #: data.hpp:106 msgid "Technology" msgstr "テクノロジー" #: data.hpp:107 data.hpp:268 msgid "Voltage" msgstr "電圧" #: data.hpp:108 msgid "Specification" msgstr "仕様" #: data.hpp:109 msgid "Family" msgstr "ファミリー" #: data.hpp:110 msgid "Disp. Family" msgstr "表示: ファミリー" #: data.hpp:111 data.hpp:224 data.hpp:245 data.hpp:335 msgid "Model" msgstr "モデル" #: data.hpp:112 msgid "Disp. Model" msgstr "表示: モデル" #: data.hpp:113 msgid "Temp." msgstr "温度" #: data.hpp:114 msgid "Stepping" msgstr "ステッピング" #: data.hpp:115 msgid "Instructions" msgstr "命令" #: data.hpp:125 msgid "L1 Data" msgstr "L1 データ" #: data.hpp:126 msgid "L1 Inst." msgstr "L1 命令" #: data.hpp:127 msgid "Level 2" msgstr "レベル2" #: data.hpp:128 msgid "Level 3" msgstr "レベル3" #: data.hpp:137 cpu-x-gtk-3.12.ui:1232 msgid "Cores" msgstr "コア" #: data.hpp:138 data.hpp:408 cpu-x-gtk-3.12.ui:1252 msgid "Threads" msgstr "スレッド" #: data.hpp:155 msgid "Core Speed" msgstr "コア速度" #: data.hpp:156 msgid "Multiplier" msgstr "倍率" #: data.hpp:157 msgid "Bus Speed" msgstr "バス速度" #: data.hpp:158 data.hpp:341 msgid "Usage" msgstr "使用率" #: data.hpp:188 data.hpp:265 msgid "Size" msgstr "サイズ" #: data.hpp:189 data.hpp:267 msgid "Speed" msgstr "速度" #: data.hpp:223 data.hpp:259 msgid "Manufacturer" msgstr "メーカー" #: data.hpp:225 msgid "Revision" msgstr "リビジョン" #: data.hpp:233 msgid "Brand" msgstr "ブランド" #: data.hpp:234 msgid "Version" msgstr "バージョン" #: data.hpp:235 msgid "Date" msgstr "日付" #: data.hpp:236 msgid "ROM Size" msgstr "ROMサイズ" #: data.hpp:260 msgid "Part Number" msgstr "パーツ番号" #: data.hpp:261 msgid "Type" msgstr "タイプ" #: data.hpp:262 msgid "Type Detail" msgstr "タイプ詳細" #: data.hpp:263 msgid "Device Locator" msgstr "デバイス位置" #: data.hpp:264 msgid "Bank Locator" msgstr "バンク位置" #: data.hpp:266 msgid "Rank" msgstr "ランク" #: data.hpp:292 msgid "Name" msgstr "名前" #: data.hpp:293 msgid "Kernel" msgstr "カーネル" #: data.hpp:294 msgid "Hostname" msgstr "ホスト名" #: data.hpp:295 msgid "Uptime" msgstr "連続稼働時間" #: data.hpp:303 msgid "Used" msgstr "使用済み" #: data.hpp:304 msgid "Buffers" msgstr "バッファ" #: data.hpp:305 msgid "Cached" msgstr "キャッシュ" #: data.hpp:306 msgid "Free" msgstr "フリー" #: data.hpp:307 msgid "Swap" msgstr "スワップ" #: data.hpp:333 msgid "Driver" msgstr "ドライバー" #: data.hpp:334 msgid "UMD Version" msgstr "UMDバージョン" #: data.hpp:336 msgid "Compute Unit" msgstr "演算ユニット" #: data.hpp:337 msgid "Device ID" msgstr "デバイス ID" #: data.hpp:338 msgid "VBIOS Version" msgstr "VBIOS バージョン" #. #-#-#-#-# source_ui.pot (cpu-x ) #-#-#-#-# #. Setting: "Interface" tab #: data.hpp:339 cpu-x-gtk-3.12.ui:5807 msgid "Interface" msgstr "インターフェイス" #: data.hpp:340 msgid "Temperature" msgstr "温度" #: data.hpp:342 msgid "Core Voltage" msgstr "コア電圧" #: data.hpp:343 msgid "Power Avg" msgstr "平均電力" #: data.hpp:344 msgid "Core Clock" msgstr "コアクロック" #: data.hpp:345 msgid "Memory Clock" msgstr "メモリークロック" #: data.hpp:346 msgid "Memory Used" msgstr "メモリー使用量" #: data.hpp:347 msgid "Resizable BAR" msgstr "Resizable BAR" #: data.hpp:348 msgid "Vulkan RT" msgstr "Vulkan RT" #: data.hpp:349 msgid "OpenGL Version" msgstr "OpenGL バージョン" #: data.hpp:350 msgid "Vulkan Version" msgstr "Vulkan バージョン" #: data.hpp:351 msgid "OpenCL Version" msgstr "OpenCL バージョン" #: data.hpp:387 msgid "Score" msgstr "スコア" #: data.hpp:388 msgid "Run" msgstr "実行" #: data.hpp:407 msgid "Duration" msgstr "デュレーション" #: util.hpp:77 msgid "bytes" msgstr "bytes" #. TRANSLATORS: initials for kilobyte (10³): please put initials (keep it short) #: util.hpp:80 msgid "kB" msgstr "kB" #. TRANSLATORS: initials for megabyte (10⁶): please put initials (keep it short) #: util.hpp:82 msgid "MB" msgstr "MB" #. TRANSLATORS: initials for gigabyte (10⁹): please put initials (keep it short) #: util.hpp:84 msgid "GB" msgstr "GB" #. TRANSLATORS: initials for terabyte (10¹²): please put initials (keep it short) #: util.hpp:86 msgid "TB" msgstr "TB" #. TRANSLATORS: initials for kibibyte (2¹⁰): please put initials (keep it short) #: util.hpp:89 msgid "KiB" msgstr "KiB" #. TRANSLATORS: initials for mebibyte (2²⁰): please put initials (keep it short) #: util.hpp:91 msgid "MiB" msgstr "MiB" #. TRANSLATORS: initials for gibibyte (2³⁰): please put initials (keep it short) #: util.hpp:93 msgid "GiB" msgstr "GiB" #. TRANSLATORS: initials for tebibyte (2⁴⁰): please put initials (keep it short) #: util.hpp:95 msgid "TiB" msgstr "TiB" #: cpu-x-gtk-3.12.ui:1184 msgid "Cache" msgstr "キャッシュ" #. Setting: refresh time for UI #: cpu-x-gtk-3.12.ui:5721 msgid "Refresh time" msgstr "更新間隔" #. Setting: GUI theme #: cpu-x-gtk-3.12.ui:5745 msgid "Text theme" msgstr "テキストテーマ" #. Setting: automatic GUI theme #: cpu-x-gtk-3.12.ui:5760 msgid "Automatic" msgstr "自動" #. Setting: light GUI theme #: cpu-x-gtk-3.12.ui:5761 msgid "Blue for light theme" msgstr "ライトテーマの青色" #. Setting: dark GUI theme #: cpu-x-gtk-3.12.ui:5762 msgid "Yellow for dark theme" msgstr "ダークテーマの黄色" #. Setting: temperature unit #: cpu-x-gtk-3.12.ui:5775 msgid "Temperature unit" msgstr "温度の単位" #. Setting: default tab at startup #: cpu-x-gtk-3.12.ui:5826 msgid "Default tab" msgstr "デフォルトのタブ" #. Setting: default CPU core at startup #: cpu-x-gtk-3.12.ui:5839 msgid "Default CPU core" msgstr "デフォルトのCPUコア" #. Setting: default cache test at startup #: cpu-x-gtk-3.12.ui:5852 msgid "Default cache test" msgstr "デフォルトのキャッシュテスト" #. Setting: print CPUID values in decimal or hexadecimal #: cpu-x-gtk-3.12.ui:5895 msgid "Print CPUID values in decimal" msgstr "CPUIDの値を10進数で表示する" #. Setting: default graphic card at startup #: cpu-x-gtk-3.12.ui:5928 msgid "Default graphic card" msgstr "デフォルトのグラフィックカード" #. Setting: default CPU core at startup #: cpu-x-gtk-3.12.ui:5952 msgid "Default core type" msgstr "デフォルトのコアタイプ" #. Setting: default graphic card at startup #: cpu-x-gtk-3.12.ui:5976 msgid "Default memory stick" msgstr "デフォルトのメモリースティック" #. Setting: "Startup" tab #: cpu-x-gtk-3.12.ui:6004 msgid "Startup" msgstr "起動時" #~ msgid "Light" #~ msgstr "Light" #~ msgid "Dark" #~ msgstr "Dark" #~ msgid "Calculating CPU multipliers" #~ msgstr "クロック倍率の計算中" #, c-format #~ msgid "Current: PCIe Gen%1dx%d / Max: Gen%1dx%d" #~ msgstr "現在: PCIe Gen%1dx%d / 最大: Gen%1dx%d" #~ msgid "failed to retrieve GPU clocks" #~ msgstr "GPU クロックの取得に失敗しました" #, c-format #~ msgid "Core #%i" #~ msgstr "コア #%i" #~ msgid "Setting label names" #~ msgstr "ラベル名の設定" #, c-format #~ msgid "Bank %i" #~ msgstr "バンク %i" #~ msgid "Reference" #~ msgstr "リファレンス" #~ msgid "Distribution" #~ msgstr "ディストリビューション" #~ msgid "Compiler" #~ msgstr "コンパイラー" #~ msgid "GPU clock" #~ msgstr "GPU クロック" #~ msgid "Dumping data…" #~ msgstr "\"データをダンプしています…" #~ msgid "Freeing memory" #~ msgstr "フリーなメモリ" #~ msgid "Ignore CPU frequency reported by libcpuid" #~ msgstr "libcpuidから取得したCPUクロックを無視します" #, c-format #~ msgid "failed to call wordexp (%i)" #~ msgstr "wordexp の取得に失敗 (%i)" #~ msgid "Press 'home' key to scroll up in a page." #~ msgstr "「Home」キーでページを上にスクロールします。" #~ msgid "Press 'end' key to scroll down in a page." #~ msgstr "「End」キーでページを下にスクロールします。" #, c-format #~ msgid "String '%s' is too long, truncating…" #~ msgstr "文字列「%s 」が長すぎて、切り捨てられました" #, c-format #~ msgid "failed to open %s directory" #~ msgstr "%s ディレクトリを開くことができません" #~ msgid "an error occurred while compiling regex" #~ msgstr "正規表現のコンパイル中にエラー発生" #~ msgid "FATAL ERROR: could not allocate memory" #~ msgstr "FATAL ERROR: メモリを割り当てられません" #, fuzzy, c-format #~| msgid "failed to call libcpuid (%s)" #~ msgid "failed to call vkEnumerateInstanceExtensionProperties (%s)" #~ msgstr "libcpuidの呼び出しに失敗しました(%s)" #, c-format #~ msgid "%s" #~ msgstr "%s" #, c-format #~ msgid "" #~ "CPU hybrid architecture is not supported. For more details, please refer " #~ "to following issue: %s" #~ msgstr "" #~ "CPUハイブリッドアーキテクチャには対応していません。詳細については Issue: " #~ "%s を参照してください" #~ msgid "NOT SUPPORTED" #~ msgstr "非対応" #, fuzzy #~| msgid "There is no platform with OpenCL support (%s)" #~ msgid "There is no device with Vulkan support" #~ msgstr "OpenCL に対応するプラットフォームはありません(%s)" #~ msgid "Socket(s)" #~ msgstr "ソケット" #~ msgid "Thread(s)" #~ msgstr "スレッド" #~ msgid "You can paste this backtrace by opening a new issue here:" #~ msgstr "ここで新しいIssueを開いてバックトレースを貼り付けることができます。" #, fuzzy #~| msgid "failed to call libcpuid (%s)" #~ msgid "faild to call clGetDeviceIDs" #~ msgstr "libcpuidの呼び出しに失敗しました(%s)" CPU-X-5.0.3/po/ka.po000066400000000000000000000673001454622605200137400ustar00rootroot00000000000000# CPU-X translations template # Copyright © 2014-2024 TheTumultuousUnicornOfDarkness # This file is distributed under the same license as the cpu-x package. # Temuri Doghonadze , 2023. msgid "" msgstr "" "Project-Id-Version: cpu-x\n" "Report-Msgid-Bugs-To: https://github.com/TheTumultuousUnicornOfDarkness/CPU-" "X/issues\n" "POT-Creation-Date: 2023-12-09 13:09+0100\n" "PO-Revision-Date: 2023-02-22 18:37+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=2; plural=n != 1;\n" "X-Generator: Weblate 4.16-dev\n" #: core.cpp:135 msgid "Finding CPU technology" msgstr "" #: core.cpp:161 #, c-format msgid "" "Your CPU is not present in the database ==> %s, model: %i, ext. model: %i, " "ext. family: %i" msgstr "" #: core.cpp:189 data.cpp:150 data.cpp:342 msgid "unknown" msgstr "უცნობი" #: core.cpp:230 msgid "Calling libcpuid for retrieving static data" msgstr "" #: core.cpp:245 #, c-format msgid "failed to call libcpuid (%s)" msgstr "" #: core.cpp:340 msgid "Calling libcpuid for retrieving dynamic data" msgstr "" #: core.cpp:353 msgid "Calling libcpuid for retrieving CPU MSR static values" msgstr "" #: core.cpp:380 msgid "Calling libcpuid for retrieving CPU MSR dynamic values" msgstr "" #: core.cpp:412 msgid "Calling dmidecode" msgstr "" #: core.cpp:454 core.cpp:473 #, c-format msgid "%s (configured)" msgstr "" #: core.cpp:461 core.cpp:480 #, c-format msgid "%s (max)" msgstr "" #: core.cpp:466 #, c-format msgid "%s (min)" msgstr "" #: core.cpp:496 msgid "Calculating CPU usage" msgstr "" #: core.cpp:546 msgid "Calling bandwidth" msgstr "" #: core.cpp:613 #, c-format msgid "" "pci_access is not properly initialized: it is a common issue when %s was " "built with a lower libpci version.\n" "Check that libpci %s library is present on your system. Otherwise, please " "rebuild %s." msgstr "" #: core.cpp:657 #, c-format msgid "No kernel driver in use for graphic card at path %s" msgstr "" #: core.cpp:693 #, c-format msgid "Your GPU kernel driver is unknown: %s" msgstr "" #: core.cpp:777 #, c-format msgid "Your GPU user mode driver is unknown for vendor %s: %s" msgstr "" #: core.cpp:781 #, c-format msgid "failed to call GLFW (%i): %s" msgstr "" #: core.cpp:914 msgid "Finding Vulkan API version" msgstr "" #: core.cpp:926 #, c-format msgid "failed to call vkCreateInstance (%s)" msgstr "" #: core.cpp:929 #, c-format msgid "%s is not supported" msgstr "" #: core.cpp:937 #, c-format msgid "failed to call vkEnumeratePhysicalDevices (%s)" msgstr "" #: core.cpp:944 msgid "No available Vulkan devices" msgstr "" #: core.cpp:952 #, c-format msgid "No available physical devices (%s)" msgstr "" #: core.cpp:1015 #, c-format msgid "Failed to create Vulkan for device %u (%s)" msgstr "" #: core.cpp:1019 #, c-format msgid "%s is not supported for device %u, use only deviceID for matching" msgstr "" #: core.cpp:1051 core.cpp:1364 msgid "Enabled" msgstr "ჩაირთო" #: core.cpp:1051 core.cpp:1364 msgid "Disabled" msgstr "გამორთულია" #: core.cpp:1088 #, fuzzy #| msgid "OpenCL Version" msgid "Finding OpenCL API version" msgstr "OpenCL-ის ვერსია" #: core.cpp:1092 #, c-format msgid "There is no platform with OpenCL support (%s)" msgstr "" #: core.cpp:1102 #, c-format msgid "failed to get all OpenCL platforms (%s)" msgstr "" #: core.cpp:1115 #, c-format msgid "failed to get name for platform %u (%s)" msgstr "" #: core.cpp:1123 #, c-format msgid "failed to get version for platform %u (%s)" msgstr "" #: core.cpp:1131 #, c-format msgid "failed to find number of OpenCL devices for platform '%s %s' (%s)" msgstr "" #: core.cpp:1131 msgid "0 device" msgstr "0 მოწყობილობა" #: core.cpp:1140 #, c-format msgid "failed to get all of OpenCL devices for platform '%s %s' (%s)" msgstr "" #: core.cpp:1160 #, c-format msgid "failed to get name for device %u (%s)" msgstr "" #: core.cpp:1168 #, c-format msgid "failed to get version for device %u (%s)" msgstr "" #: core.cpp:1190 #, c-format msgid "OpenCL driver for '%s %s' does not support CL_DEVICE_TOPOLOGY_AMD (%s)" msgstr "" #: core.cpp:1201 #, c-format msgid "" "OpenCL driver for '%s %s' does not support CL_DEVICE_GFXIP_MAJOR_AMD (%s)" msgstr "" #: core.cpp:1209 core.cpp:1229 core.cpp:1262 #, c-format msgid "" "OpenCL driver for '%s %s' does not support CL_DEVICE_MAX_COMPUTE_UNITS (%s)" msgstr "" #: core.cpp:1250 #, c-format msgid "" "OpenCL driver for '%s %s' does not support CL_DEVICE_PCI_DOMAIN_ID_NV (%s), " "CL_DEVICE_PCI_BUS_ID_NV (%s) or CL_DEVICE_PCI_SLOT_ID_NV (%s)" msgstr "" #: core.cpp:1273 #, c-format msgid "OpenCL is not supported with your GPU vendor (0x%X)" msgstr "" #: core.cpp:1295 msgid "Finding devices" msgstr "მოწყობილობების მოძიება" #: core.cpp:1307 #, c-format msgid "Skip devices search (wrong permissions on %s device)" msgstr "" #: core.cpp:1350 #, c-format msgid "Your GPU vendor is unknown: %s (0x%X)" msgstr "" #: core.cpp:1370 msgid "failed to find chipset vendor and model" msgstr "" #: core.cpp:1385 msgid "failed to find graphic card vendor and model" msgstr "" #: core.cpp:1487 msgid "Retrieving GPU clocks" msgstr "" #: core.cpp:1500 msgid "None" msgstr "არაფერი" #: core.cpp:1509 #, c-format msgid "DRM path for %s is unknown" msgstr "" #: core.cpp:1516 #, c-format msgid "Card number for %s is unknown" msgstr "" #: core.cpp:1541 #, c-format msgid "PCIe %s (current) / %s (max)" msgstr "" #: core.cpp:1650 #, c-format msgid "Driver for %s doesn't report frequencies" msgstr "" #: core.cpp:1671 #, c-format msgid "failed to retrieve all monitoring data for %s" msgstr "" #: core.cpp:1694 msgid "Identifying running system" msgstr "" #: core.cpp:1697 msgid "failed to identify running system" msgstr "" #: core.cpp:1749 core.cpp:1778 msgid "Calling libprocps" msgstr "" #: core.cpp:1752 msgid "unable to get system uptime" msgstr "" #: core.cpp:1758 msgid "unable to create meminfo structure" msgstr "" #: core.cpp:1804 msgid "Calling libstatgrab" msgstr "" #: core.cpp:1852 #, c-format msgid "%i days, %i hours, %i minutes, %i seconds" msgstr "" #: core.cpp:1915 msgid "Updating benchmark status" msgstr "" #: core.cpp:1918 msgid "Active" msgstr "აქტიური" #: core.cpp:1921 #, c-format msgid "(%u hours left)" msgstr "" #: core.cpp:1923 #, c-format msgid "(%u minutes left)" msgstr "" #: core.cpp:1925 #, c-format msgid "(%u seconds left)" msgstr "" #: core.cpp:1929 core.cpp:1984 core.cpp:1985 msgid "Inactive" msgstr "არააქტიური" #: core.cpp:1932 #, c-format msgid "in %u hours" msgstr "" #: core.cpp:1934 #, c-format msgid "in %u minutes" msgstr "" #: core.cpp:1936 #, c-format msgid "in %u seconds" msgstr "" #: core.cpp:1953 #, c-format msgid "Starting benchmark with %u threads" msgstr "" #: core.cpp:1976 msgid "an error occurred while starting benchmark" msgstr "" #: core.cpp:2002 msgid "Finding CPU package in fallback mode" msgstr "" #: core.cpp:2032 #, c-format msgid "Your CPU socket is not present in the database ==> %s, codename: %s" msgstr "" #: core.cpp:2052 msgid "Calculating CPU multipliers in fallback mode" msgstr "" #: core.cpp:2072 msgid "Retrieving motherboard information in fallback mode" msgstr "" #: core.cpp:2085 msgid "failed to retrieve motherboard information (fallback mode)" msgstr "" #: core.cpp:2127 msgid "Retrieving CPU temperature in fallback mode" msgstr "" #: core.cpp:2173 msgid "failed to retrieve CPU temperature (fallback mode)" msgstr "" #: core.cpp:2188 msgid "Retrieving CPU voltage in fallback mode" msgstr "" #: core.cpp:2200 msgid "failed to retrieve CPU voltage (fallback mode)" msgstr "" #: core.cpp:2214 msgid "Retrieving CPU frequency in fallback mode" msgstr "" #: core.cpp:2220 msgid "failed to retrieve CPU frequency (fallback mode)" msgstr "" #: daemon_client.cpp:65 msgid "Starting daemon in background…" msgstr "" #: daemon_client.cpp:172 msgid "pkexec: authorization could not be obtained (dialog dismissed)" msgstr "" #: daemon_client.cpp:175 msgid "pkexec: authorization could not be obtained (not authorized)" msgstr "" #: daemon_client.cpp:178 msgid "pkexec: command not found" msgstr "" #: daemon_client.cpp:181 msgid "pkexec: unexpected error code" msgstr "" #: daemon_client.cpp:211 msgid "Connecting to daemon…" msgstr "" #: daemon_server.cpp:261 #, c-format msgid "request_handler: case %i not handled" msgstr "" #: data.cpp:124 cpu-x-gtk-3.12.ui:1370 msgid "CPU" msgstr "CPU" #: data.cpp:187 msgid "P-core" msgstr "" #: data.cpp:188 msgid "E-core" msgstr "" #: data.cpp:189 data.cpp:192 msgid "Core" msgstr "ძირითადი ბირთვული მოდულები" #: data.cpp:208 cpu-x-gtk-3.12.ui:746 msgid "Processor" msgstr "პროცესორი" #: data.cpp:240 data.cpp:329 cpu-x-gtk-3.12.ui:1968 msgid "Caches" msgstr "კეშები" #: data.cpp:247 #, c-format msgid "%2d x %4d %s, %2d-way" msgstr "" #: data.cpp:249 #, c-format msgid "%d %s, %d-way" msgstr "" #: data.cpp:263 msgid "Count" msgstr "" #: data.cpp:276 cpu-x-gtk-3.12.ui:968 msgid "Clocks" msgstr "საათები" #: data.cpp:379 data.cpp:383 #, fuzzy, c-format #| msgid "L%i Cache" msgid "L%u Cache" msgstr "ლ%i ქეში" #: data.cpp:385 #, c-format msgid "%s associative, %d-%s line size" msgstr "" #: data.cpp:398 msgid "Test" msgstr "შემოწმება" #: data.cpp:409 data.cpp:423 cpu-x-gtk-3.12.ui:2146 cpu-x-gtk-3.12.ui:2517 msgid "Motherboard" msgstr "მთავარი დაფა" #: data.cpp:437 cpu-x-gtk-3.12.ui:2367 msgid "BIOS" msgstr "BIOS" #: data.cpp:452 cpu-x-gtk-3.12.ui:2498 msgid "Chipset" msgstr "ჩიპსეტი" #: data.cpp:467 data.cpp:569 cpu-x-gtk-3.12.ui:3156 cpu-x-gtk-3.12.ui:3761 msgid "Memory" msgstr "მეხსიერება" #: data.cpp:483 #, c-format msgid "Stick %u" msgstr "" #: data.cpp:487 cpu-x-gtk-3.12.ui:3134 msgid "Sticks" msgstr "" #: data.cpp:541 cpu-x-gtk-3.12.ui:3780 msgid "System" msgstr "სისტემა" #: data.cpp:554 cpu-x-gtk-3.12.ui:3380 msgid "Operating System" msgstr "ოპერაციული სისტემა" #: data.cpp:587 cpu-x-gtk-3.12.ui:4960 msgid "Graphics" msgstr "გრაფიკა" #: data.cpp:621 #, fuzzy, c-format #| msgid "Card %i" msgid "Card %u" msgstr "ბარათი %i" #: data.cpp:625 cpu-x-gtk-3.12.ui:4938 msgid "Cards" msgstr "კარტი" #: data.cpp:672 cpu-x-gtk-3.12.ui:5300 msgid "Bench" msgstr "მერხი" #: data.cpp:685 msgid "Not started" msgstr "არ არის გაშვებული" #: data.cpp:688 cpu-x-gtk-3.12.ui:5070 msgid "Prime numbers (slow)" msgstr "" #: data.cpp:692 cpu-x-gtk-3.12.ui:5178 msgid "Prime numbers (fast)" msgstr "" #: data.cpp:696 cpu-x-gtk-3.12.ui:5281 msgid "Parameters" msgstr "პარამეტრები" #: data.cpp:721 data.cpp:727 #, c-format msgid "%u mins" msgstr "%u წთ" #: data.cpp:734 cpu-x-gtk-3.12.ui:5444 cpu-x-gtk-3.12.ui:5552 msgid "About" msgstr "პროგრამის შესახებ" #: data.cpp:739 #, c-format msgid "" "%s is a Free software that gathers information\n" "on CPU, motherboard and more." msgstr "" #: data.cpp:744 #, fuzzy #| msgid "About" msgid "About CPU-X" msgstr "პროგრამის შესახებ" #: data.cpp:745 #, c-format msgid "Version %s" msgstr "ვერისა %s" #: data.cpp:746 #, c-format msgid "Author: %s" msgstr "ავტორი: %s" #: data.cpp:747 #, c-format msgid "Site: %s" msgstr "საიტი: %s" #: data.cpp:751 cpu-x-gtk-3.12.ui:5533 msgid "License" msgstr "ლიცენზია" #: data.cpp:753 #, c-format msgid "This software is distributed under the terms of %s" msgstr "" #: data.cpp:754 main.cpp:176 msgid "This program comes with ABSOLUTELY NO WARRANTY" msgstr "" #: gui_gtk.cpp:61 #, c-format msgid "Cannot find path for '%s' file" msgstr "" #: gui_gtk.cpp:400 msgid "Start daemon" msgstr "დემონის გაშვება" #: gui_gtk.cpp:403 msgid "Connected to daemon" msgstr "" #: gui_gtk.cpp:406 msgid "No polkit authentication agent found" msgstr "" #: gui_gtk.cpp:411 msgid "Ask password to start daemon in background" msgstr "" #: gui_gtk.cpp:415 msgid "Settings" msgstr "" #: gui_gtk.cpp:634 msgid "BaseFamily" msgstr "" #: gui_gtk.cpp:635 msgid "CPU display (\"true\") family (computed as BaseFamily+ExtendedFamily)" msgstr "" #: gui_gtk.cpp:636 msgid "BaseModel" msgstr "" #: gui_gtk.cpp:637 msgid "CPU display (\"true\") model (computed as (ExtendedModel<<4)+BaseModel)" msgstr "" #: gui_gtk.cpp:847 msgid "" "Identify the physically-labeled socket or board position where the memory " "device is located" msgstr "" #: gui_gtk.cpp:848 msgid "Identify the physically labeled bank where the memory device is located" msgstr "" #: gui_gtk.cpp:1052 msgid "User Mode Driver Version" msgstr "" #: gui_gtk.cpp:1066 msgid "Vulkan Ray Tracing" msgstr "" #: gui_gtk.cpp:1260 msgid "Starting GTK GUI…" msgstr "" #: gui_gtk.cpp:1272 msgid "failed to import UI in GtkBuilder" msgstr "" #: main.cpp:63 msgid "Start graphical user interface (GUI) (default)" msgstr "" #: main.cpp:64 msgid "Start text-based user interface (TUI)" msgstr "" #: main.cpp:65 msgid "Dump all data on standard output and exit" msgstr "" #: main.cpp:66 msgid "Run embedded command dmidecode and exit" msgstr "" #: main.cpp:67 msgid "Run embedded command bandwidth and exit" msgstr "" #: main.cpp:68 msgid "Set temperature unit (c[elsius]|f[ahrenheit]|k[elvin]|r[ankine])" msgstr "" #: main.cpp:69 msgid "Set custom time between two refreshes (in seconds)" msgstr "" #: main.cpp:70 msgid "Set default tab (integer)" msgstr "" #: main.cpp:71 msgid "Select core type to monitor (integer)" msgstr "" #: main.cpp:72 msgid "Select CPU core to monitor (integer)" msgstr "" #: main.cpp:73 msgid "Set custom bandwidth test for CPU caches speed (integer)" msgstr "" #: main.cpp:74 msgid "Select default memory stick (integer)" msgstr "" #: main.cpp:75 msgid "Select default graphic card (integer)" msgstr "" #: main.cpp:76 cpu-x-gtk-3.12.ui:5910 msgid "Start and connect to daemon" msgstr "" #: main.cpp:77 msgid "Verbose output" msgstr "უფრო მეტის ჩვენება" #: main.cpp:78 msgid "Print help and exit" msgstr "" #: main.cpp:79 msgid "Print version and exit" msgstr "ვერსიის გამოტანა და გასვლა" #: main.cpp:80 msgid "Print CPUID values in decimal (default is hexadeximal)" msgstr "" #: main.cpp:81 msgid "Disable colored output" msgstr "" #: main.cpp:82 msgid "Print information for debugging" msgstr "" #: main.cpp:83 msgid "Print required information to paste in an issue" msgstr "" #: main.cpp:84 msgid "Set key mapping for NCurses mode (a[rrows]|e[macs]|i[nverted-T]|v[im])" msgstr "" #: main.cpp:95 msgid "Add default command line arguments" msgstr "" #: main.cpp:96 msgid "Enforce the bus clock" msgstr "" #: main.cpp:97 msgid "" "Ignore CPU values reported by libcpuid (comma-separated values among 'temp', " "'volt' and 'freq')" msgstr "" #: main.cpp:98 msgid "Read CPUID raw data from a given file" msgstr "" #: main.cpp:99 msgid "Only print a message if CPU is not present in the database" msgstr "" #: main.cpp:126 #, c-format msgid "Usage: %s DISPLAY [OPTIONS]\n" msgstr "" #: main.cpp:127 msgid "Available DISPLAY:" msgstr "" #: main.cpp:135 msgid "Available OPTIONS:" msgstr "" #: main.cpp:144 msgid "Influenceable environment variables:" msgstr "" #: main.cpp:175 msgid "This is free software: you are free to change and redistribute it." msgstr "" #: main.cpp:177 #, c-format msgid "See the %s license: <%s>\n" msgstr "" #: main.cpp:184 #, c-format msgid "-- %-9s version: %s" msgstr "" #: main.cpp:381 #, c-format msgid "" "\n" "Oops, something was wrong! %s has received signal %d (%s) and has crashed." msgstr "" #: main.cpp:383 #, c-format msgid "" "\n" "Oops, something was wrong! %s has received signal %d (%s) and is trying to " "recover." msgstr "" #: main.cpp:407 msgid "You can open a new issue here, by filling the template as requested:" msgstr "" #: main.cpp:449 msgid "an error occurred while setting locale" msgstr "" #: options.cpp:124 #, c-format msgid "" "Selected CPU type (%u) is not a valid number (%u is the maximum for this CPU)" msgstr "" #: options.cpp:145 #, c-format msgid "" "Selected bandwidth test (%u) is not a valid number (%u is the maximum for " "this system)" msgstr "" #: options.cpp:168 #, c-format msgid "" "Selected RAM stick (%u) is not a valid number (%u is the maximum for this " "system)" msgstr "" #: options.cpp:188 #, c-format msgid "" "Selected graphic card (%u) is not a valid number (%u is the maximum for this " "system)" msgstr "" #: options.cpp:204 #, c-format msgid "failed to change CPU affinitiy to core %u" msgstr "" #: options.cpp:210 #, c-format msgid "" "Selected CPU core (%u) is not a valid number (%u is the maximum for this " "type of core)" msgstr "" #: options.cpp:284 #, c-format msgid "Selected tab (%u) is not a valid number (%u is the maximum)" msgstr "" #: tui_ncurses.cpp:111 msgid "Window is too small!" msgstr "" #: tui_ncurses.cpp:119 msgid "Press 'h' to see help." msgstr "" #: tui_ncurses.cpp:232 #, c-format msgid "Welcome in %s NCurses help!\n" msgstr "" #: tui_ncurses.cpp:233 msgid "This help describes how to use this Text-based User Interface." msgstr "" #: tui_ncurses.cpp:235 msgid "Global keys:" msgstr "" #: tui_ncurses.cpp:236 msgid "Press 'left' key or 'tab' key to switch in left tab." msgstr "" #: tui_ncurses.cpp:237 msgid "Press 'right' key or 'shift + tab' keys to switch in right tab." msgstr "" #: tui_ncurses.cpp:238 msgid "Press 'h' key to see this help." msgstr "" #: tui_ncurses.cpp:239 msgid "Press 'q' key to exit." msgstr "" #: tui_ncurses.cpp:241 msgid "CPU tab:" msgstr "" #: tui_ncurses.cpp:242 msgid "Press 'next page' key to decrease core type number to monitor." msgstr "" #: tui_ncurses.cpp:243 msgid "Press 'previous page' key to increase core type number to monitor." msgstr "" #: tui_ncurses.cpp:244 msgid "Press 'down' key to decrease CPU core number to monitor." msgstr "" #: tui_ncurses.cpp:245 msgid "Press 'up' key to increase CPU core number to monitor." msgstr "" #: tui_ncurses.cpp:247 msgid "Caches tab:" msgstr "" #: tui_ncurses.cpp:248 msgid "Press 'down' key to switch to previous test." msgstr "" #: tui_ncurses.cpp:249 msgid "Press 'up' key to switch to next test." msgstr "" #: tui_ncurses.cpp:251 msgid "Bench tab:" msgstr "" #: tui_ncurses.cpp:252 msgid "Press 'down' key to decrement benchmark duration." msgstr "" #: tui_ncurses.cpp:253 msgid "Press 'up' key to increment benchmark duration." msgstr "" #: tui_ncurses.cpp:254 msgid "Press 'next page' key to decrement number of threads to use." msgstr "" #: tui_ncurses.cpp:255 msgid "Press 'previous page' key to increment number of threads to use." msgstr "" #: tui_ncurses.cpp:256 msgid "Press 's' key to start/stop prime numbers (slow) benchmark." msgstr "" #: tui_ncurses.cpp:257 msgid "Press 'f' key to start/stop prime numbers (fast) benchmark." msgstr "" #: tui_ncurses.cpp:259 msgid "Graphics tab:" msgstr "" #: tui_ncurses.cpp:260 msgid "Press 'down' key to switch to previous graphic card." msgstr "" #: tui_ncurses.cpp:261 msgid "Press 'up' key to switch to next graphic card." msgstr "" #: tui_ncurses.cpp:263 msgid "Press any key to exit this help." msgstr "" #: tui_ncurses.cpp:640 msgid "Starting NCurses TUI…" msgstr "" #: tui_ncurses.cpp:649 msgid "" "FATAL ERROR: terminfo database could not be found (try to set TERMINFO " "environment variable)" msgstr "" #: tui_ncurses.cpp:654 #, c-format msgid "Failed to set up %s terminal (err=%i); falling back to %s" msgstr "" #: util.cpp:189 #, c-format msgid "cannot find unit in '%s' string at position %i" msgstr "" #: util.cpp:252 #, c-format msgid "an error occurred while opening file '%s'" msgstr "" #: util.cpp:297 #, c-format msgid "an error occurred while running command '%s'" msgstr "" #: util.cpp:437 msgid "set_cpu_affinity() not supported on this operating system" msgstr "" #: data.hpp:103 data.hpp:244 data.hpp:332 msgid "Vendor" msgstr "მომწოდებელი" #: data.hpp:104 msgid "Code Name" msgstr "" #: data.hpp:105 msgid "Package" msgstr "პაკეტი" #: data.hpp:106 msgid "Technology" msgstr "ტექნოლოგია" #: data.hpp:107 data.hpp:268 msgid "Voltage" msgstr "Ვოლტაჟი" #: data.hpp:108 msgid "Specification" msgstr "" #: data.hpp:109 msgid "Family" msgstr "ოჯახი" #: data.hpp:110 msgid "Disp. Family" msgstr "" #: data.hpp:111 data.hpp:224 data.hpp:245 data.hpp:335 msgid "Model" msgstr "მოდელი" #: data.hpp:112 msgid "Disp. Model" msgstr "" #: data.hpp:113 msgid "Temp." msgstr "ტემპ." #: data.hpp:114 msgid "Stepping" msgstr "" #: data.hpp:115 msgid "Instructions" msgstr "ინსტრუქციები" #: data.hpp:125 msgid "L1 Data" msgstr "" #: data.hpp:126 msgid "L1 Inst." msgstr "" #: data.hpp:127 msgid "Level 2" msgstr "დონე 2" #: data.hpp:128 msgid "Level 3" msgstr "დონე 3" #: data.hpp:137 cpu-x-gtk-3.12.ui:1232 msgid "Cores" msgstr "ბირთვები" #: data.hpp:138 data.hpp:408 cpu-x-gtk-3.12.ui:1252 msgid "Threads" msgstr "Threads" #: data.hpp:155 msgid "Core Speed" msgstr "" #: data.hpp:156 msgid "Multiplier" msgstr "მამრავლი" #: data.hpp:157 msgid "Bus Speed" msgstr "" #: data.hpp:158 data.hpp:341 msgid "Usage" msgstr "გამოყენება" #: data.hpp:188 data.hpp:265 msgid "Size" msgstr "ზომა" #: data.hpp:189 data.hpp:267 msgid "Speed" msgstr "სიჩქარე" #: data.hpp:223 data.hpp:259 msgid "Manufacturer" msgstr "მწარმოებელი" #: data.hpp:225 msgid "Revision" msgstr "რევიზია" #: data.hpp:233 msgid "Brand" msgstr "სავაჭრო მარკა" #: data.hpp:234 msgid "Version" msgstr "ვერსია" #: data.hpp:235 msgid "Date" msgstr "თარიღი" #: data.hpp:236 msgid "ROM Size" msgstr "ROM-ის ზომა" #: data.hpp:260 msgid "Part Number" msgstr "" #: data.hpp:261 msgid "Type" msgstr "" #: data.hpp:262 msgid "Type Detail" msgstr "" #: data.hpp:263 msgid "Device Locator" msgstr "" #: data.hpp:264 msgid "Bank Locator" msgstr "" #: data.hpp:266 msgid "Rank" msgstr "" #: data.hpp:292 msgid "Name" msgstr "" #: data.hpp:293 msgid "Kernel" msgstr "ბირთვი" #: data.hpp:294 msgid "Hostname" msgstr "ჰოსტის სახელი" #: data.hpp:295 msgid "Uptime" msgstr "ჩართულია" #: data.hpp:303 msgid "Used" msgstr "გამოყენებული" #: data.hpp:304 msgid "Buffers" msgstr "ბაფერები" #: data.hpp:305 msgid "Cached" msgstr "დაქეშილი" #: data.hpp:306 msgid "Free" msgstr "თავისუფალი" #: data.hpp:307 msgid "Swap" msgstr "სვაპი" #: data.hpp:333 msgid "Driver" msgstr "დრაივერი" #: data.hpp:334 msgid "UMD Version" msgstr "UMD ვერსია" #: data.hpp:336 msgid "Compute Unit" msgstr "" #: data.hpp:337 #, fuzzy #| msgid "DeviceID" msgid "Device ID" msgstr "მოწყობილობისID" #: data.hpp:338 msgid "VBIOS Version" msgstr "VBIOS ვერსია" #. #-#-#-#-# source_ui.pot (cpu-x ) #-#-#-#-# #. Setting: "Interface" tab #: data.hpp:339 cpu-x-gtk-3.12.ui:5807 msgid "Interface" msgstr "ინტერფეისი" #: data.hpp:340 msgid "Temperature" msgstr "ტემპერატურა" #: data.hpp:342 msgid "Core Voltage" msgstr "ბირთვის ძაბვა" #: data.hpp:343 msgid "Power Avg" msgstr "საშუალო სიმძლავრე" #: data.hpp:344 #, fuzzy #| msgid "Memory clock" msgid "Core Clock" msgstr "მეხსიერების სიხშირე" #: data.hpp:345 #, fuzzy #| msgid "Memory clock" msgid "Memory Clock" msgstr "მეხსიერების სიხშირე" #: data.hpp:346 msgid "Memory Used" msgstr "გამოყენებული მეხსიერება" #: data.hpp:347 msgid "Resizable BAR" msgstr "" #: data.hpp:348 msgid "Vulkan RT" msgstr "Vulkan RT" #: data.hpp:349 msgid "OpenGL Version" msgstr "OpenGL-ის ვერსია" #: data.hpp:350 msgid "Vulkan Version" msgstr "Vulkan-ის ვერსია" #: data.hpp:351 msgid "OpenCL Version" msgstr "OpenCL-ის ვერსია" #: data.hpp:387 msgid "Score" msgstr "ქულები" #: data.hpp:388 msgid "Run" msgstr "გაშვება" #: data.hpp:407 msgid "Duration" msgstr "ხანგრძლოვობა" #: util.hpp:77 msgid "bytes" msgstr "ბაიტი" #. TRANSLATORS: initials for kilobyte (10³): please put initials (keep it short) #: util.hpp:80 msgid "kB" msgstr "კბ" #. TRANSLATORS: initials for megabyte (10⁶): please put initials (keep it short) #: util.hpp:82 msgid "MB" msgstr "მბ" #. TRANSLATORS: initials for gigabyte (10⁹): please put initials (keep it short) #: util.hpp:84 msgid "GB" msgstr "გბ" #. TRANSLATORS: initials for terabyte (10¹²): please put initials (keep it short) #: util.hpp:86 msgid "TB" msgstr "ტბ" #. TRANSLATORS: initials for kibibyte (2¹⁰): please put initials (keep it short) #: util.hpp:89 msgid "KiB" msgstr "კიბ" #. TRANSLATORS: initials for mebibyte (2²⁰): please put initials (keep it short) #: util.hpp:91 msgid "MiB" msgstr "მიბ" #. TRANSLATORS: initials for gibibyte (2³⁰): please put initials (keep it short) #: util.hpp:93 msgid "GiB" msgstr "გიბ" #. TRANSLATORS: initials for tebibyte (2⁴⁰): please put initials (keep it short) #: util.hpp:95 msgid "TiB" msgstr "ტიბ" #: cpu-x-gtk-3.12.ui:1184 msgid "Cache" msgstr "კეში" #. Setting: refresh time for UI #: cpu-x-gtk-3.12.ui:5721 msgid "Refresh time" msgstr "" #. Setting: GUI theme #: cpu-x-gtk-3.12.ui:5745 #, fuzzy #| msgid "Theme" msgid "Text theme" msgstr "გაფორმების თემა" #. Setting: automatic GUI theme #: cpu-x-gtk-3.12.ui:5760 msgid "Automatic" msgstr "ავტომატურად" #. Setting: light GUI theme #: cpu-x-gtk-3.12.ui:5761 msgid "Blue for light theme" msgstr "" #. Setting: dark GUI theme #: cpu-x-gtk-3.12.ui:5762 msgid "Yellow for dark theme" msgstr "" #. Setting: temperature unit #: cpu-x-gtk-3.12.ui:5775 #, fuzzy #| msgid "Temperature" msgid "Temperature unit" msgstr "ტემპერატურა" #. Setting: default tab at startup #: cpu-x-gtk-3.12.ui:5826 msgid "Default tab" msgstr "" #. Setting: default CPU core at startup #: cpu-x-gtk-3.12.ui:5839 msgid "Default CPU core" msgstr "" #. Setting: default cache test at startup #: cpu-x-gtk-3.12.ui:5852 msgid "Default cache test" msgstr "" #. Setting: print CPUID values in decimal or hexadecimal #: cpu-x-gtk-3.12.ui:5895 msgid "Print CPUID values in decimal" msgstr "" #. Setting: default graphic card at startup #: cpu-x-gtk-3.12.ui:5928 msgid "Default graphic card" msgstr "" #. Setting: default CPU core at startup #: cpu-x-gtk-3.12.ui:5952 msgid "Default core type" msgstr "" #. Setting: default graphic card at startup #: cpu-x-gtk-3.12.ui:5976 msgid "Default memory stick" msgstr "" #. Setting: "Startup" tab #: cpu-x-gtk-3.12.ui:6004 msgid "Startup" msgstr "გაშვება" #~ msgid "Light" #~ msgstr "ღია" #~ msgid "Dark" #~ msgstr "ბნელი" #, c-format #~ msgid "Bank %i" #~ msgstr "სლოტი %i" #~ msgid "Reference" #~ msgstr "მითითება" #~ msgid "Distribution" #~ msgstr "გავრცელება" #~ msgid "Compiler" #~ msgstr "კომპილატორი" #~ msgid "GPU clock" #~ msgstr "GPU-ის სიხშირე" #~ msgid "Freeing memory" #~ msgstr "მეხსიერების განთავისუფლება" CPU-X-5.0.3/po/kmr.po000066400000000000000000000611031454622605200141310ustar00rootroot00000000000000# CPU-X translations template # Copyright © 2014-2024 The Tumultuous Unicorn Of Darkness # This file is distributed under the same license as the cpu-x package. # Pêşeroja paşerojê , 2021. msgid "" msgstr "" "Project-Id-Version: cpu-x\n" "Report-Msgid-Bugs-To: https://github.com/TheTumultuousUnicornOfDarkness/CPU-" "X/issues\n" "POT-Creation-Date: 2023-12-09 13:09+0100\n" "PO-Revision-Date: 2021-10-05 18:02+0000\n" "Last-Translator: Pêşeroja paşerojê \n" "Language-Team: Kurdish (Northern) \n" "Language: kmr\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-dev\n" #: core.cpp:135 msgid "Finding CPU technology" msgstr "Dîtina teknolojiya YKN" #: core.cpp:161 #, c-format msgid "" "Your CPU is not present in the database ==> %s, model: %i, ext. model: %i, " "ext. family: %i" msgstr "" "YKN ya te di danegehê de tune ye %s, model: %i, modela. berderhkirî: %i, " "malbata. berferhkirî: %i" #: core.cpp:189 data.cpp:150 data.cpp:342 msgid "unknown" msgstr "" #: core.cpp:230 msgid "Calling libcpuid for retrieving static data" msgstr "" #: core.cpp:245 #, c-format msgid "failed to call libcpuid (%s)" msgstr "" #: core.cpp:340 msgid "Calling libcpuid for retrieving dynamic data" msgstr "" #: core.cpp:353 msgid "Calling libcpuid for retrieving CPU MSR static values" msgstr "" #: core.cpp:380 msgid "Calling libcpuid for retrieving CPU MSR dynamic values" msgstr "" #: core.cpp:412 msgid "Calling dmidecode" msgstr "" #: core.cpp:454 core.cpp:473 #, c-format msgid "%s (configured)" msgstr "" #: core.cpp:461 core.cpp:480 #, c-format msgid "%s (max)" msgstr "" #: core.cpp:466 #, c-format msgid "%s (min)" msgstr "" #: core.cpp:496 msgid "Calculating CPU usage" msgstr "" #: core.cpp:546 msgid "Calling bandwidth" msgstr "" #: core.cpp:613 #, c-format msgid "" "pci_access is not properly initialized: it is a common issue when %s was " "built with a lower libpci version.\n" "Check that libpci %s library is present on your system. Otherwise, please " "rebuild %s." msgstr "" #: core.cpp:657 #, c-format msgid "No kernel driver in use for graphic card at path %s" msgstr "" #: core.cpp:693 #, c-format msgid "Your GPU kernel driver is unknown: %s" msgstr "" #: core.cpp:777 #, c-format msgid "Your GPU user mode driver is unknown for vendor %s: %s" msgstr "" #: core.cpp:781 #, c-format msgid "failed to call GLFW (%i): %s" msgstr "" #: core.cpp:914 msgid "Finding Vulkan API version" msgstr "" #: core.cpp:926 #, c-format msgid "failed to call vkCreateInstance (%s)" msgstr "" #: core.cpp:929 #, c-format msgid "%s is not supported" msgstr "" #: core.cpp:937 #, c-format msgid "failed to call vkEnumeratePhysicalDevices (%s)" msgstr "" #: core.cpp:944 msgid "No available Vulkan devices" msgstr "" #: core.cpp:952 #, c-format msgid "No available physical devices (%s)" msgstr "" #: core.cpp:1015 #, c-format msgid "Failed to create Vulkan for device %u (%s)" msgstr "" #: core.cpp:1019 #, c-format msgid "%s is not supported for device %u, use only deviceID for matching" msgstr "" #: core.cpp:1051 core.cpp:1364 msgid "Enabled" msgstr "" #: core.cpp:1051 core.cpp:1364 msgid "Disabled" msgstr "" #: core.cpp:1088 msgid "Finding OpenCL API version" msgstr "" #: core.cpp:1092 #, c-format msgid "There is no platform with OpenCL support (%s)" msgstr "" #: core.cpp:1102 #, c-format msgid "failed to get all OpenCL platforms (%s)" msgstr "" #: core.cpp:1115 #, c-format msgid "failed to get name for platform %u (%s)" msgstr "" #: core.cpp:1123 #, c-format msgid "failed to get version for platform %u (%s)" msgstr "" #: core.cpp:1131 #, c-format msgid "failed to find number of OpenCL devices for platform '%s %s' (%s)" msgstr "" #: core.cpp:1131 msgid "0 device" msgstr "" #: core.cpp:1140 #, c-format msgid "failed to get all of OpenCL devices for platform '%s %s' (%s)" msgstr "" #: core.cpp:1160 #, c-format msgid "failed to get name for device %u (%s)" msgstr "" #: core.cpp:1168 #, c-format msgid "failed to get version for device %u (%s)" msgstr "" #: core.cpp:1190 #, c-format msgid "OpenCL driver for '%s %s' does not support CL_DEVICE_TOPOLOGY_AMD (%s)" msgstr "" #: core.cpp:1201 #, c-format msgid "" "OpenCL driver for '%s %s' does not support CL_DEVICE_GFXIP_MAJOR_AMD (%s)" msgstr "" #: core.cpp:1209 core.cpp:1229 core.cpp:1262 #, c-format msgid "" "OpenCL driver for '%s %s' does not support CL_DEVICE_MAX_COMPUTE_UNITS (%s)" msgstr "" #: core.cpp:1250 #, c-format msgid "" "OpenCL driver for '%s %s' does not support CL_DEVICE_PCI_DOMAIN_ID_NV (%s), " "CL_DEVICE_PCI_BUS_ID_NV (%s) or CL_DEVICE_PCI_SLOT_ID_NV (%s)" msgstr "" #: core.cpp:1273 #, c-format msgid "OpenCL is not supported with your GPU vendor (0x%X)" msgstr "" #: core.cpp:1295 msgid "Finding devices" msgstr "" #: core.cpp:1307 #, c-format msgid "Skip devices search (wrong permissions on %s device)" msgstr "" #: core.cpp:1350 #, c-format msgid "Your GPU vendor is unknown: %s (0x%X)" msgstr "" #: core.cpp:1370 msgid "failed to find chipset vendor and model" msgstr "" #: core.cpp:1385 msgid "failed to find graphic card vendor and model" msgstr "" #: core.cpp:1487 msgid "Retrieving GPU clocks" msgstr "" #: core.cpp:1500 msgid "None" msgstr "" #: core.cpp:1509 #, c-format msgid "DRM path for %s is unknown" msgstr "" #: core.cpp:1516 #, c-format msgid "Card number for %s is unknown" msgstr "" #: core.cpp:1541 #, c-format msgid "PCIe %s (current) / %s (max)" msgstr "" #: core.cpp:1650 #, c-format msgid "Driver for %s doesn't report frequencies" msgstr "" #: core.cpp:1671 #, c-format msgid "failed to retrieve all monitoring data for %s" msgstr "" #: core.cpp:1694 msgid "Identifying running system" msgstr "" #: core.cpp:1697 msgid "failed to identify running system" msgstr "" #: core.cpp:1749 core.cpp:1778 msgid "Calling libprocps" msgstr "" #: core.cpp:1752 msgid "unable to get system uptime" msgstr "" #: core.cpp:1758 msgid "unable to create meminfo structure" msgstr "" #: core.cpp:1804 msgid "Calling libstatgrab" msgstr "" #: core.cpp:1852 #, c-format msgid "%i days, %i hours, %i minutes, %i seconds" msgstr "" #: core.cpp:1915 msgid "Updating benchmark status" msgstr "" #: core.cpp:1918 msgid "Active" msgstr "" #: core.cpp:1921 #, c-format msgid "(%u hours left)" msgstr "" #: core.cpp:1923 #, c-format msgid "(%u minutes left)" msgstr "" #: core.cpp:1925 #, c-format msgid "(%u seconds left)" msgstr "" #: core.cpp:1929 core.cpp:1984 core.cpp:1985 msgid "Inactive" msgstr "" #: core.cpp:1932 #, c-format msgid "in %u hours" msgstr "" #: core.cpp:1934 #, c-format msgid "in %u minutes" msgstr "" #: core.cpp:1936 #, c-format msgid "in %u seconds" msgstr "" #: core.cpp:1953 #, c-format msgid "Starting benchmark with %u threads" msgstr "" #: core.cpp:1976 msgid "an error occurred while starting benchmark" msgstr "" #: core.cpp:2002 msgid "Finding CPU package in fallback mode" msgstr "" #: core.cpp:2032 #, c-format msgid "Your CPU socket is not present in the database ==> %s, codename: %s" msgstr "" #: core.cpp:2052 msgid "Calculating CPU multipliers in fallback mode" msgstr "" #: core.cpp:2072 msgid "Retrieving motherboard information in fallback mode" msgstr "" #: core.cpp:2085 msgid "failed to retrieve motherboard information (fallback mode)" msgstr "" #: core.cpp:2127 msgid "Retrieving CPU temperature in fallback mode" msgstr "" #: core.cpp:2173 msgid "failed to retrieve CPU temperature (fallback mode)" msgstr "" #: core.cpp:2188 msgid "Retrieving CPU voltage in fallback mode" msgstr "" #: core.cpp:2200 msgid "failed to retrieve CPU voltage (fallback mode)" msgstr "" #: core.cpp:2214 msgid "Retrieving CPU frequency in fallback mode" msgstr "" #: core.cpp:2220 msgid "failed to retrieve CPU frequency (fallback mode)" msgstr "" #: daemon_client.cpp:65 msgid "Starting daemon in background…" msgstr "" #: daemon_client.cpp:172 msgid "pkexec: authorization could not be obtained (dialog dismissed)" msgstr "" #: daemon_client.cpp:175 msgid "pkexec: authorization could not be obtained (not authorized)" msgstr "" #: daemon_client.cpp:178 msgid "pkexec: command not found" msgstr "" #: daemon_client.cpp:181 msgid "pkexec: unexpected error code" msgstr "" #: daemon_client.cpp:211 msgid "Connecting to daemon…" msgstr "" #: daemon_server.cpp:261 #, c-format msgid "request_handler: case %i not handled" msgstr "" #: data.cpp:124 cpu-x-gtk-3.12.ui:1370 msgid "CPU" msgstr "" #: data.cpp:187 msgid "P-core" msgstr "" #: data.cpp:188 msgid "E-core" msgstr "" #: data.cpp:189 data.cpp:192 msgid "Core" msgstr "" #: data.cpp:208 cpu-x-gtk-3.12.ui:746 msgid "Processor" msgstr "" #: data.cpp:240 data.cpp:329 cpu-x-gtk-3.12.ui:1968 msgid "Caches" msgstr "" #: data.cpp:247 #, fuzzy, c-format #| msgid "%d x %d %s, %d-way" msgid "%2d x %4d %s, %2d-way" msgstr "%d x %d %s, %d-rê" #: data.cpp:249 #, c-format msgid "%d %s, %d-way" msgstr "%d %s, %d-rê" #: data.cpp:263 msgid "Count" msgstr "" #: data.cpp:276 cpu-x-gtk-3.12.ui:968 msgid "Clocks" msgstr "" #: data.cpp:379 data.cpp:383 #, c-format msgid "L%u Cache" msgstr "" #: data.cpp:385 #, c-format msgid "%s associative, %d-%s line size" msgstr "%s hevgirtî, %d- %s mezinahiya rêzê" #: data.cpp:398 msgid "Test" msgstr "" #: data.cpp:409 data.cpp:423 cpu-x-gtk-3.12.ui:2146 cpu-x-gtk-3.12.ui:2517 msgid "Motherboard" msgstr "" #: data.cpp:437 cpu-x-gtk-3.12.ui:2367 msgid "BIOS" msgstr "" #: data.cpp:452 cpu-x-gtk-3.12.ui:2498 msgid "Chipset" msgstr "" #: data.cpp:467 data.cpp:569 cpu-x-gtk-3.12.ui:3156 cpu-x-gtk-3.12.ui:3761 msgid "Memory" msgstr "" #: data.cpp:483 #, c-format msgid "Stick %u" msgstr "" #: data.cpp:487 cpu-x-gtk-3.12.ui:3134 msgid "Sticks" msgstr "" #: data.cpp:541 cpu-x-gtk-3.12.ui:3780 msgid "System" msgstr "" #: data.cpp:554 cpu-x-gtk-3.12.ui:3380 msgid "Operating System" msgstr "" #: data.cpp:587 cpu-x-gtk-3.12.ui:4960 msgid "Graphics" msgstr "" #: data.cpp:621 #, c-format msgid "Card %u" msgstr "" #: data.cpp:625 cpu-x-gtk-3.12.ui:4938 msgid "Cards" msgstr "" #: data.cpp:672 cpu-x-gtk-3.12.ui:5300 msgid "Bench" msgstr "" #: data.cpp:685 msgid "Not started" msgstr "" #: data.cpp:688 cpu-x-gtk-3.12.ui:5070 msgid "Prime numbers (slow)" msgstr "" #: data.cpp:692 cpu-x-gtk-3.12.ui:5178 msgid "Prime numbers (fast)" msgstr "" #: data.cpp:696 cpu-x-gtk-3.12.ui:5281 msgid "Parameters" msgstr "" #: data.cpp:721 data.cpp:727 #, c-format msgid "%u mins" msgstr "" #: data.cpp:734 cpu-x-gtk-3.12.ui:5444 cpu-x-gtk-3.12.ui:5552 msgid "About" msgstr "" #: data.cpp:739 #, c-format msgid "" "%s is a Free software that gathers information\n" "on CPU, motherboard and more." msgstr "" #: data.cpp:744 msgid "About CPU-X" msgstr "" #: data.cpp:745 #, c-format msgid "Version %s" msgstr "" #: data.cpp:746 #, c-format msgid "Author: %s" msgstr "" #: data.cpp:747 #, c-format msgid "Site: %s" msgstr "" #: data.cpp:751 cpu-x-gtk-3.12.ui:5533 msgid "License" msgstr "" #: data.cpp:753 #, c-format msgid "This software is distributed under the terms of %s" msgstr "" #: data.cpp:754 main.cpp:176 msgid "This program comes with ABSOLUTELY NO WARRANTY" msgstr "" #: gui_gtk.cpp:61 #, c-format msgid "Cannot find path for '%s' file" msgstr "" #: gui_gtk.cpp:400 msgid "Start daemon" msgstr "" #: gui_gtk.cpp:403 msgid "Connected to daemon" msgstr "" #: gui_gtk.cpp:406 msgid "No polkit authentication agent found" msgstr "" #: gui_gtk.cpp:411 msgid "Ask password to start daemon in background" msgstr "" #: gui_gtk.cpp:415 msgid "Settings" msgstr "" #: gui_gtk.cpp:634 msgid "BaseFamily" msgstr "" #: gui_gtk.cpp:635 msgid "CPU display (\"true\") family (computed as BaseFamily+ExtendedFamily)" msgstr "" #: gui_gtk.cpp:636 msgid "BaseModel" msgstr "" #: gui_gtk.cpp:637 msgid "CPU display (\"true\") model (computed as (ExtendedModel<<4)+BaseModel)" msgstr "" #: gui_gtk.cpp:847 msgid "" "Identify the physically-labeled socket or board position where the memory " "device is located" msgstr "" #: gui_gtk.cpp:848 msgid "Identify the physically labeled bank where the memory device is located" msgstr "" #: gui_gtk.cpp:1052 msgid "User Mode Driver Version" msgstr "" #: gui_gtk.cpp:1066 msgid "Vulkan Ray Tracing" msgstr "" #: gui_gtk.cpp:1260 msgid "Starting GTK GUI…" msgstr "" #: gui_gtk.cpp:1272 msgid "failed to import UI in GtkBuilder" msgstr "" #: main.cpp:63 msgid "Start graphical user interface (GUI) (default)" msgstr "" #: main.cpp:64 msgid "Start text-based user interface (TUI)" msgstr "" #: main.cpp:65 msgid "Dump all data on standard output and exit" msgstr "" #: main.cpp:66 msgid "Run embedded command dmidecode and exit" msgstr "" #: main.cpp:67 msgid "Run embedded command bandwidth and exit" msgstr "" #: main.cpp:68 msgid "Set temperature unit (c[elsius]|f[ahrenheit]|k[elvin]|r[ankine])" msgstr "" #: main.cpp:69 msgid "Set custom time between two refreshes (in seconds)" msgstr "" #: main.cpp:70 msgid "Set default tab (integer)" msgstr "" #: main.cpp:71 msgid "Select core type to monitor (integer)" msgstr "" #: main.cpp:72 msgid "Select CPU core to monitor (integer)" msgstr "" #: main.cpp:73 msgid "Set custom bandwidth test for CPU caches speed (integer)" msgstr "" #: main.cpp:74 msgid "Select default memory stick (integer)" msgstr "" #: main.cpp:75 msgid "Select default graphic card (integer)" msgstr "" #: main.cpp:76 cpu-x-gtk-3.12.ui:5910 msgid "Start and connect to daemon" msgstr "" #: main.cpp:77 msgid "Verbose output" msgstr "" #: main.cpp:78 msgid "Print help and exit" msgstr "" #: main.cpp:79 msgid "Print version and exit" msgstr "" #: main.cpp:80 msgid "Print CPUID values in decimal (default is hexadeximal)" msgstr "" #: main.cpp:81 msgid "Disable colored output" msgstr "" #: main.cpp:82 msgid "Print information for debugging" msgstr "" #: main.cpp:83 msgid "Print required information to paste in an issue" msgstr "" #: main.cpp:84 msgid "Set key mapping for NCurses mode (a[rrows]|e[macs]|i[nverted-T]|v[im])" msgstr "" #: main.cpp:95 msgid "Add default command line arguments" msgstr "" #: main.cpp:96 msgid "Enforce the bus clock" msgstr "" #: main.cpp:97 msgid "" "Ignore CPU values reported by libcpuid (comma-separated values among 'temp', " "'volt' and 'freq')" msgstr "" #: main.cpp:98 msgid "Read CPUID raw data from a given file" msgstr "" #: main.cpp:99 msgid "Only print a message if CPU is not present in the database" msgstr "" #: main.cpp:126 #, c-format msgid "Usage: %s DISPLAY [OPTIONS]\n" msgstr "" #: main.cpp:127 msgid "Available DISPLAY:" msgstr "" #: main.cpp:135 msgid "Available OPTIONS:" msgstr "" #: main.cpp:144 msgid "Influenceable environment variables:" msgstr "" #: main.cpp:175 msgid "This is free software: you are free to change and redistribute it." msgstr "" #: main.cpp:177 #, c-format msgid "See the %s license: <%s>\n" msgstr "" #: main.cpp:184 #, c-format msgid "-- %-9s version: %s" msgstr "" #: main.cpp:381 #, c-format msgid "" "\n" "Oops, something was wrong! %s has received signal %d (%s) and has crashed." msgstr "" #: main.cpp:383 #, c-format msgid "" "\n" "Oops, something was wrong! %s has received signal %d (%s) and is trying to " "recover." msgstr "" #: main.cpp:407 msgid "You can open a new issue here, by filling the template as requested:" msgstr "" #: main.cpp:449 msgid "an error occurred while setting locale" msgstr "" #: options.cpp:124 #, c-format msgid "" "Selected CPU type (%u) is not a valid number (%u is the maximum for this CPU)" msgstr "" #: options.cpp:145 #, c-format msgid "" "Selected bandwidth test (%u) is not a valid number (%u is the maximum for " "this system)" msgstr "" #: options.cpp:168 #, c-format msgid "" "Selected RAM stick (%u) is not a valid number (%u is the maximum for this " "system)" msgstr "" #: options.cpp:188 #, c-format msgid "" "Selected graphic card (%u) is not a valid number (%u is the maximum for this " "system)" msgstr "" #: options.cpp:204 #, c-format msgid "failed to change CPU affinitiy to core %u" msgstr "" #: options.cpp:210 #, c-format msgid "" "Selected CPU core (%u) is not a valid number (%u is the maximum for this " "type of core)" msgstr "" #: options.cpp:284 #, c-format msgid "Selected tab (%u) is not a valid number (%u is the maximum)" msgstr "" #: tui_ncurses.cpp:111 msgid "Window is too small!" msgstr "" #: tui_ncurses.cpp:119 msgid "Press 'h' to see help." msgstr "" #: tui_ncurses.cpp:232 #, c-format msgid "Welcome in %s NCurses help!\n" msgstr "" #: tui_ncurses.cpp:233 msgid "This help describes how to use this Text-based User Interface." msgstr "" #: tui_ncurses.cpp:235 msgid "Global keys:" msgstr "" #: tui_ncurses.cpp:236 msgid "Press 'left' key or 'tab' key to switch in left tab." msgstr "" #: tui_ncurses.cpp:237 msgid "Press 'right' key or 'shift + tab' keys to switch in right tab." msgstr "" #: tui_ncurses.cpp:238 msgid "Press 'h' key to see this help." msgstr "" #: tui_ncurses.cpp:239 msgid "Press 'q' key to exit." msgstr "" #: tui_ncurses.cpp:241 msgid "CPU tab:" msgstr "" #: tui_ncurses.cpp:242 msgid "Press 'next page' key to decrease core type number to monitor." msgstr "" #: tui_ncurses.cpp:243 msgid "Press 'previous page' key to increase core type number to monitor." msgstr "" #: tui_ncurses.cpp:244 msgid "Press 'down' key to decrease CPU core number to monitor." msgstr "" #: tui_ncurses.cpp:245 msgid "Press 'up' key to increase CPU core number to monitor." msgstr "" #: tui_ncurses.cpp:247 msgid "Caches tab:" msgstr "" #: tui_ncurses.cpp:248 msgid "Press 'down' key to switch to previous test." msgstr "" #: tui_ncurses.cpp:249 msgid "Press 'up' key to switch to next test." msgstr "" #: tui_ncurses.cpp:251 msgid "Bench tab:" msgstr "" #: tui_ncurses.cpp:252 msgid "Press 'down' key to decrement benchmark duration." msgstr "" #: tui_ncurses.cpp:253 msgid "Press 'up' key to increment benchmark duration." msgstr "" #: tui_ncurses.cpp:254 msgid "Press 'next page' key to decrement number of threads to use." msgstr "" #: tui_ncurses.cpp:255 msgid "Press 'previous page' key to increment number of threads to use." msgstr "" #: tui_ncurses.cpp:256 msgid "Press 's' key to start/stop prime numbers (slow) benchmark." msgstr "" #: tui_ncurses.cpp:257 msgid "Press 'f' key to start/stop prime numbers (fast) benchmark." msgstr "" #: tui_ncurses.cpp:259 msgid "Graphics tab:" msgstr "" #: tui_ncurses.cpp:260 msgid "Press 'down' key to switch to previous graphic card." msgstr "" #: tui_ncurses.cpp:261 msgid "Press 'up' key to switch to next graphic card." msgstr "" #: tui_ncurses.cpp:263 msgid "Press any key to exit this help." msgstr "" #: tui_ncurses.cpp:640 msgid "Starting NCurses TUI…" msgstr "" #: tui_ncurses.cpp:649 msgid "" "FATAL ERROR: terminfo database could not be found (try to set TERMINFO " "environment variable)" msgstr "" #: tui_ncurses.cpp:654 #, c-format msgid "Failed to set up %s terminal (err=%i); falling back to %s" msgstr "" #: util.cpp:189 #, c-format msgid "cannot find unit in '%s' string at position %i" msgstr "" #: util.cpp:252 #, c-format msgid "an error occurred while opening file '%s'" msgstr "" #: util.cpp:297 #, c-format msgid "an error occurred while running command '%s'" msgstr "" #: util.cpp:437 msgid "set_cpu_affinity() not supported on this operating system" msgstr "" #: data.hpp:103 data.hpp:244 data.hpp:332 msgid "Vendor" msgstr "" #: data.hpp:104 msgid "Code Name" msgstr "" #: data.hpp:105 msgid "Package" msgstr "" #: data.hpp:106 msgid "Technology" msgstr "" #: data.hpp:107 data.hpp:268 msgid "Voltage" msgstr "" #: data.hpp:108 msgid "Specification" msgstr "" #: data.hpp:109 msgid "Family" msgstr "" #: data.hpp:110 msgid "Disp. Family" msgstr "" #: data.hpp:111 data.hpp:224 data.hpp:245 data.hpp:335 msgid "Model" msgstr "" #: data.hpp:112 msgid "Disp. Model" msgstr "" #: data.hpp:113 msgid "Temp." msgstr "" #: data.hpp:114 msgid "Stepping" msgstr "" #: data.hpp:115 msgid "Instructions" msgstr "" #: data.hpp:125 msgid "L1 Data" msgstr "" #: data.hpp:126 msgid "L1 Inst." msgstr "" #: data.hpp:127 msgid "Level 2" msgstr "" #: data.hpp:128 msgid "Level 3" msgstr "" #: data.hpp:137 cpu-x-gtk-3.12.ui:1232 msgid "Cores" msgstr "" #: data.hpp:138 data.hpp:408 cpu-x-gtk-3.12.ui:1252 msgid "Threads" msgstr "" #: data.hpp:155 msgid "Core Speed" msgstr "" #: data.hpp:156 msgid "Multiplier" msgstr "" #: data.hpp:157 msgid "Bus Speed" msgstr "" #: data.hpp:158 data.hpp:341 msgid "Usage" msgstr "" #: data.hpp:188 data.hpp:265 msgid "Size" msgstr "" #: data.hpp:189 data.hpp:267 msgid "Speed" msgstr "" #: data.hpp:223 data.hpp:259 msgid "Manufacturer" msgstr "" #: data.hpp:225 msgid "Revision" msgstr "" #: data.hpp:233 msgid "Brand" msgstr "" #: data.hpp:234 msgid "Version" msgstr "" #: data.hpp:235 msgid "Date" msgstr "" #: data.hpp:236 msgid "ROM Size" msgstr "" #: data.hpp:260 msgid "Part Number" msgstr "" #: data.hpp:261 msgid "Type" msgstr "" #: data.hpp:262 msgid "Type Detail" msgstr "" #: data.hpp:263 msgid "Device Locator" msgstr "" #: data.hpp:264 msgid "Bank Locator" msgstr "" #: data.hpp:266 msgid "Rank" msgstr "" #: data.hpp:292 msgid "Name" msgstr "" #: data.hpp:293 msgid "Kernel" msgstr "" #: data.hpp:294 msgid "Hostname" msgstr "" #: data.hpp:295 msgid "Uptime" msgstr "" #: data.hpp:303 msgid "Used" msgstr "" #: data.hpp:304 msgid "Buffers" msgstr "" #: data.hpp:305 msgid "Cached" msgstr "" #: data.hpp:306 msgid "Free" msgstr "" #: data.hpp:307 msgid "Swap" msgstr "" #: data.hpp:333 msgid "Driver" msgstr "" #: data.hpp:334 msgid "UMD Version" msgstr "" #: data.hpp:336 msgid "Compute Unit" msgstr "" #: data.hpp:337 msgid "Device ID" msgstr "" #: data.hpp:338 msgid "VBIOS Version" msgstr "" #. #-#-#-#-# source_ui.pot (cpu-x ) #-#-#-#-# #. Setting: "Interface" tab #: data.hpp:339 cpu-x-gtk-3.12.ui:5807 msgid "Interface" msgstr "" #: data.hpp:340 msgid "Temperature" msgstr "" #: data.hpp:342 msgid "Core Voltage" msgstr "" #: data.hpp:343 msgid "Power Avg" msgstr "" #: data.hpp:344 msgid "Core Clock" msgstr "" #: data.hpp:345 msgid "Memory Clock" msgstr "" #: data.hpp:346 msgid "Memory Used" msgstr "" #: data.hpp:347 msgid "Resizable BAR" msgstr "" #: data.hpp:348 msgid "Vulkan RT" msgstr "" #: data.hpp:349 msgid "OpenGL Version" msgstr "" #: data.hpp:350 msgid "Vulkan Version" msgstr "" #: data.hpp:351 msgid "OpenCL Version" msgstr "" #: data.hpp:387 msgid "Score" msgstr "" #: data.hpp:388 msgid "Run" msgstr "" #: data.hpp:407 msgid "Duration" msgstr "" #: util.hpp:77 msgid "bytes" msgstr "" #. TRANSLATORS: initials for kilobyte (10³): please put initials (keep it short) #: util.hpp:80 msgid "kB" msgstr "" #. TRANSLATORS: initials for megabyte (10⁶): please put initials (keep it short) #: util.hpp:82 msgid "MB" msgstr "" #. TRANSLATORS: initials for gigabyte (10⁹): please put initials (keep it short) #: util.hpp:84 msgid "GB" msgstr "" #. TRANSLATORS: initials for terabyte (10¹²): please put initials (keep it short) #: util.hpp:86 msgid "TB" msgstr "" #. TRANSLATORS: initials for kibibyte (2¹⁰): please put initials (keep it short) #: util.hpp:89 msgid "KiB" msgstr "" #. TRANSLATORS: initials for mebibyte (2²⁰): please put initials (keep it short) #: util.hpp:91 msgid "MiB" msgstr "" #. TRANSLATORS: initials for gibibyte (2³⁰): please put initials (keep it short) #: util.hpp:93 msgid "GiB" msgstr "" #. TRANSLATORS: initials for tebibyte (2⁴⁰): please put initials (keep it short) #: util.hpp:95 msgid "TiB" msgstr "" #: cpu-x-gtk-3.12.ui:1184 msgid "Cache" msgstr "" #. Setting: refresh time for UI #: cpu-x-gtk-3.12.ui:5721 msgid "Refresh time" msgstr "" #. Setting: GUI theme #: cpu-x-gtk-3.12.ui:5745 msgid "Text theme" msgstr "" #. Setting: automatic GUI theme #: cpu-x-gtk-3.12.ui:5760 msgid "Automatic" msgstr "" #. Setting: light GUI theme #: cpu-x-gtk-3.12.ui:5761 msgid "Blue for light theme" msgstr "" #. Setting: dark GUI theme #: cpu-x-gtk-3.12.ui:5762 msgid "Yellow for dark theme" msgstr "" #. Setting: temperature unit #: cpu-x-gtk-3.12.ui:5775 msgid "Temperature unit" msgstr "" #. Setting: default tab at startup #: cpu-x-gtk-3.12.ui:5826 msgid "Default tab" msgstr "" #. Setting: default CPU core at startup #: cpu-x-gtk-3.12.ui:5839 msgid "Default CPU core" msgstr "" #. Setting: default cache test at startup #: cpu-x-gtk-3.12.ui:5852 msgid "Default cache test" msgstr "" #. Setting: print CPUID values in decimal or hexadecimal #: cpu-x-gtk-3.12.ui:5895 msgid "Print CPUID values in decimal" msgstr "" #. Setting: default graphic card at startup #: cpu-x-gtk-3.12.ui:5928 msgid "Default graphic card" msgstr "" #. Setting: default CPU core at startup #: cpu-x-gtk-3.12.ui:5952 msgid "Default core type" msgstr "" #. Setting: default graphic card at startup #: cpu-x-gtk-3.12.ui:5976 msgid "Default memory stick" msgstr "" #. Setting: "Startup" tab #: cpu-x-gtk-3.12.ui:6004 msgid "Startup" msgstr "" CPU-X-5.0.3/po/ko.po000066400000000000000000001100771454622605200137560ustar00rootroot00000000000000# Copyright © 2014-2024 The Tumultuous Unicorn Of Darkness # This file is distributed under the same license as the CPU-X package. # bluepencil , 2019. # simmon , 2021. # Kim YuKyeom , 2023. msgid "" msgstr "" "Project-Id-Version: CPU-X\n" "Report-Msgid-Bugs-To: https://github.com/TheTumultuousUnicornOfDarkness/CPU-" "X/issues\n" "POT-Creation-Date: 2023-12-09 13:09+0100\n" "PO-Revision-Date: 2023-12-14 10:43+0000\n" "Last-Translator: Kim YuKyeom \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.3-rc\n" #: core.cpp:135 msgid "Finding CPU technology" msgstr "CPU 기술 검색 중" #: core.cpp:161 #, c-format msgid "" "Your CPU is not present in the database ==> %s, model: %i, ext. model: %i, " "ext. family: %i" msgstr "" "이 CPU는 데이터베이스에 정보가 없습니다 ==> %s, model: %i, ext. model: %i, " "ext. family: %i" #: core.cpp:189 data.cpp:150 data.cpp:342 msgid "unknown" msgstr "알 수 없음" #: core.cpp:230 msgid "Calling libcpuid for retrieving static data" msgstr "정적 데이터를 얻기 위해 libcpuid 호출 중" #: core.cpp:245 #, c-format msgid "failed to call libcpuid (%s)" msgstr "libcpuid 호출 실패 (%s)" #: core.cpp:340 msgid "Calling libcpuid for retrieving dynamic data" msgstr "동적 데이터를 얻기 위해 libcpuid 호출 중" #: core.cpp:353 msgid "Calling libcpuid for retrieving CPU MSR static values" msgstr "CPU MSR의 정적 값을 얻기 위해 libcpuid 호출 중" #: core.cpp:380 msgid "Calling libcpuid for retrieving CPU MSR dynamic values" msgstr "CPU MSR의 동적 값을 얻기 위해 libcpuid 호출 중" #: core.cpp:412 msgid "Calling dmidecode" msgstr "dmidecode 호출 중" #: core.cpp:454 core.cpp:473 #, c-format msgid "%s (configured)" msgstr "%s (설정값)" #: core.cpp:461 core.cpp:480 #, c-format msgid "%s (max)" msgstr "%s (최댓값)" #: core.cpp:466 #, c-format msgid "%s (min)" msgstr "%s (최솟값)" #: core.cpp:496 msgid "Calculating CPU usage" msgstr "CPU 사용량 계산 중" #: core.cpp:546 msgid "Calling bandwidth" msgstr "대역폭을 불러오는 중" #: core.cpp:613 #, c-format msgid "" "pci_access is not properly initialized: it is a common issue when %s was " "built with a lower libpci version.\n" "Check that libpci %s library is present on your system. Otherwise, please " "rebuild %s." msgstr "" "pci_access가 정상적으로 초기화되지 않았습니다: 이것은 %s의 libpci버전이 낮을 " "때 발생하는 일반적인 오류입니다.\n" "libpci %s library가 이 시스템에 존재하는지 확인하거나, %s를 다시 빌드해 주세" "요." #: core.cpp:657 #, c-format msgid "No kernel driver in use for graphic card at path %s" msgstr "경로 %s에 그래픽카드를 사용하기 위한 커널 드라이버가 없습니다" #: core.cpp:693 #, c-format msgid "Your GPU kernel driver is unknown: %s" msgstr "이 GPU의 커널 드라이버를 알 수 없음: %s" #: core.cpp:777 #, c-format msgid "Your GPU user mode driver is unknown for vendor %s: %s" msgstr "사용하는 GPU의 유저 모드 드라이버가 벤더 %s에서 알 수 없습니다 : %s" #: core.cpp:781 #, c-format msgid "failed to call GLFW (%i): %s" msgstr "GLFW 호출 실패 (%i): %s" #: core.cpp:914 msgid "Finding Vulkan API version" msgstr "Vulkan API 버전 검색 중" #: core.cpp:926 #, c-format msgid "failed to call vkCreateInstance (%s)" msgstr "vkCreateInstance 호출 실패(%s)" #: core.cpp:929 #, c-format msgid "%s is not supported" msgstr "%s 는 지원되지 않습니다" #: core.cpp:937 #, c-format msgid "failed to call vkEnumeratePhysicalDevices (%s)" msgstr "vkEnumeratePhysicalDevices 호출 실패 (%s)" #: core.cpp:944 msgid "No available Vulkan devices" msgstr "사용 가능한 Vulkan 디바이스가 없습니다" #: core.cpp:952 #, c-format msgid "No available physical devices (%s)" msgstr "사용 가능한 물리 디바이스가 없습니다 (%s)" #: core.cpp:1015 #, c-format msgid "Failed to create Vulkan for device %u (%s)" msgstr "디바이스 %u의 Vulkan 생성에 실패했습니다 (%s)" #: core.cpp:1019 #, c-format msgid "%s is not supported for device %u, use only deviceID for matching" msgstr "" "%s는 디바이스 %u에서 지원되지 않습니다. 디바이스ID만을 사용해서 매칭해주세요" #: core.cpp:1051 core.cpp:1364 msgid "Enabled" msgstr "활성화됨" #: core.cpp:1051 core.cpp:1364 msgid "Disabled" msgstr "비활성화됨" #: core.cpp:1088 msgid "Finding OpenCL API version" msgstr "OpenCL API 버전 검색 중" #: core.cpp:1092 #, c-format msgid "There is no platform with OpenCL support (%s)" msgstr "OpenCL을 지원하는 플랫폼이 없습니다 (%s)" #: core.cpp:1102 #, c-format msgid "failed to get all OpenCL platforms (%s)" msgstr "모든 OpenCL 플랫폼을 가져오는 데 실패했습니다 (%s)" #: core.cpp:1115 #, c-format msgid "failed to get name for platform %u (%s)" msgstr "플랫폼 %u의 이름을 가져오는 데 실패했습니다 (%s)" #: core.cpp:1123 #, c-format msgid "failed to get version for platform %u (%s)" msgstr "플랫폿 %u의 버전을 가져오는 데 실패했습니다 (%s)" #: core.cpp:1131 #, c-format msgid "failed to find number of OpenCL devices for platform '%s %s' (%s)" msgstr "플랫폼 '%s %s'의 OpenCL 디바이스 수를 찾는 데 실패했습니다 (%s)" #: core.cpp:1131 msgid "0 device" msgstr "0 디바이스" #: core.cpp:1140 #, c-format msgid "failed to get all of OpenCL devices for platform '%s %s' (%s)" msgstr "플랫폼 '%s %s'의 모든 OpenCL 디바이스를 가져오는 데 실패했습니다 (%s)" #: core.cpp:1160 #, c-format msgid "failed to get name for device %u (%s)" msgstr "디바이스 %u의 이름을 가져오는 데 실패했습니다 (%s)" #: core.cpp:1168 #, c-format msgid "failed to get version for device %u (%s)" msgstr "디바이스 %u의 버전을 가져오는 데 실패했습니다 (%s)" #: core.cpp:1190 #, c-format msgid "OpenCL driver for '%s %s' does not support CL_DEVICE_TOPOLOGY_AMD (%s)" msgstr "" "'%s %s'의 OpenCL 드라이버는 CL_DEVICE_TOPOLOGY_AMD를 지원하지 않습니다 (%s)" #: core.cpp:1201 #, c-format msgid "" "OpenCL driver for '%s %s' does not support CL_DEVICE_GFXIP_MAJOR_AMD (%s)" msgstr "" "'%s %s'의 OpenCL 드라이버는 CL_DEVICE_GFXIP_MAJOR_AMD를 지원하지 않습니다 " "(%s)" #: core.cpp:1209 core.cpp:1229 core.cpp:1262 #, c-format msgid "" "OpenCL driver for '%s %s' does not support CL_DEVICE_MAX_COMPUTE_UNITS (%s)" msgstr "" "'%s %s'의 OpenCL 드라이버는 CL_DEVICE_MAX_COMPUTE_UNITS를 지원하지 않습니다 " "(%s)" #: core.cpp:1250 #, c-format msgid "" "OpenCL driver for '%s %s' does not support CL_DEVICE_PCI_DOMAIN_ID_NV (%s), " "CL_DEVICE_PCI_BUS_ID_NV (%s) or CL_DEVICE_PCI_SLOT_ID_NV (%s)" msgstr "" "'%s %s'의 OpenCL 드라이버는 CL_DEVICE_PCI_DOMAIN_ID_NV (%s), " "CL_DEVICE_PCI_BUS_ID_NV (%s), CL_DEVICE_PCI_SLOT_ID_NV (%s)를 지원하지 않습니" "다" #: core.cpp:1273 #, c-format msgid "OpenCL is not supported with your GPU vendor (0x%X)" msgstr "OpenCL이 GPU 벤더 (0x%X)를 지원하지 않습니다" #: core.cpp:1295 msgid "Finding devices" msgstr "디바이스 검색 중" #: core.cpp:1307 #, c-format msgid "Skip devices search (wrong permissions on %s device)" msgstr "디바이스 검색 제외 (%s 디바이스의 잘못된 권한)" #: core.cpp:1350 #, c-format msgid "Your GPU vendor is unknown: %s (0x%X)" msgstr "GPU 벤더를 알 수 없음: %s (0x%X)" #: core.cpp:1370 msgid "failed to find chipset vendor and model" msgstr "칩셋의 벤더와 모델을 찾는 데 실패했습니다" #: core.cpp:1385 msgid "failed to find graphic card vendor and model" msgstr "그래픽카드의 벤더와 모델을 찾는 데 실패했습니다" #: core.cpp:1487 msgid "Retrieving GPU clocks" msgstr "GPU 클럭을 얻어오는 중" #: core.cpp:1500 msgid "None" msgstr "None" #: core.cpp:1509 #, c-format msgid "DRM path for %s is unknown" msgstr "%s의 DRM 경로를 알 수 없습니다" #: core.cpp:1516 #, c-format msgid "Card number for %s is unknown" msgstr "%s의 카드 번호를 알 수 없습니다" #: core.cpp:1541 #, c-format msgid "PCIe %s (current) / %s (max)" msgstr "PCIe %s (현재) / %s (최대)" #: core.cpp:1650 #, c-format msgid "Driver for %s doesn't report frequencies" msgstr "%s의 드라이버가 주파수를 응답하지 않습니다" #: core.cpp:1671 #, c-format msgid "failed to retrieve all monitoring data for %s" msgstr "%s의 모든 모니터링 데이터를 얻어오는 데 실패했습니다" #: core.cpp:1694 msgid "Identifying running system" msgstr "실행중인 시스템 식별 중" #: core.cpp:1697 msgid "failed to identify running system" msgstr "실행중인 시스템의 식별을 실패했습니다" #: core.cpp:1749 core.cpp:1778 msgid "Calling libprocps" msgstr "libprocps 호출 중" #: core.cpp:1752 msgid "unable to get system uptime" msgstr "시스템의 가동 시간을 가져올 수 없습니다" #: core.cpp:1758 msgid "unable to create meminfo structure" msgstr "meminfo 구조를 생성할 수 없습니다" #: core.cpp:1804 msgid "Calling libstatgrab" msgstr "libstatgrab 호출 중" #: core.cpp:1852 #, c-format msgid "%i days, %i hours, %i minutes, %i seconds" msgstr "%i 일 %i 시간 %i 분 %i 초" #: core.cpp:1915 msgid "Updating benchmark status" msgstr "벤치마크 상태 갱신 중" #: core.cpp:1918 msgid "Active" msgstr "작동중" #: core.cpp:1921 #, c-format msgid "(%u hours left)" msgstr "(%u 시간 남음)" #: core.cpp:1923 #, c-format msgid "(%u minutes left)" msgstr "(%u 분 남음)" #: core.cpp:1925 #, c-format msgid "(%u seconds left)" msgstr "(%u 초 남음)" #: core.cpp:1929 core.cpp:1984 core.cpp:1985 msgid "Inactive" msgstr "정지중" #: core.cpp:1932 #, c-format msgid "in %u hours" msgstr "%u 시간 내" #: core.cpp:1934 #, c-format msgid "in %u minutes" msgstr "%u 분 내" #: core.cpp:1936 #, c-format msgid "in %u seconds" msgstr "%u 초 내" #: core.cpp:1953 #, c-format msgid "Starting benchmark with %u threads" msgstr "%u 스레드로 벤치마크를 시작 중" #: core.cpp:1976 msgid "an error occurred while starting benchmark" msgstr "벤치마크를 시작하는 중에 에러가 발생했습니다" #: core.cpp:2002 msgid "Finding CPU package in fallback mode" msgstr "fallback 모드에서 CPU 패키지 검색 중" #: core.cpp:2032 #, c-format msgid "Your CPU socket is not present in the database ==> %s, codename: %s" msgstr "이 CPU 소켓은 데이터베이스에 존재하지 않습니다 ==> %s, 코드네임: %s" #: core.cpp:2052 msgid "Calculating CPU multipliers in fallback mode" msgstr "fallback 모드에서 CPU 배수 계산 중" #: core.cpp:2072 msgid "Retrieving motherboard information in fallback mode" msgstr "fallback 모드에서 마더보드의 정보를 얻어오는 중" #: core.cpp:2085 msgid "failed to retrieve motherboard information (fallback mode)" msgstr "마더보드의 정보를 얻어오는 데 실패했습니다 (fallback 모드)" #: core.cpp:2127 msgid "Retrieving CPU temperature in fallback mode" msgstr "fallback 모드에서 CPU 온도 얻어오는 중" #: core.cpp:2173 msgid "failed to retrieve CPU temperature (fallback mode)" msgstr "CPU 온도를 얻어오는 데 실패했습니다 (fallback 모드)" #: core.cpp:2188 msgid "Retrieving CPU voltage in fallback mode" msgstr "fallback 모드에서 CPU 전압 얻어오는 중" #: core.cpp:2200 msgid "failed to retrieve CPU voltage (fallback mode)" msgstr "CPU 전압을 얻어오는 데 실패했습니다 (fallback 모드)" #: core.cpp:2214 msgid "Retrieving CPU frequency in fallback mode" msgstr "fallback 모드에서 CPU 클럭 얻어오는 중" #: core.cpp:2220 msgid "failed to retrieve CPU frequency (fallback mode)" msgstr "CPU 클럭을 얻어오는 데 실패했습니다 (fallback 모드)" #: daemon_client.cpp:65 msgid "Starting daemon in background…" msgstr "백그라운드에서 데몬을 시작하는 중…" #: daemon_client.cpp:172 msgid "pkexec: authorization could not be obtained (dialog dismissed)" msgstr "pkexec: 인증 정보를 받아올 수 없습니다 (다이얼로그가 종료되었습니다)" #: daemon_client.cpp:175 msgid "pkexec: authorization could not be obtained (not authorized)" msgstr "pkexec: 인증 정보를 받아올 수 없습니다 (인증되어있지 않습니다)" #: daemon_client.cpp:178 msgid "pkexec: command not found" msgstr "pkexec: 명령어를 찾을 수 없습니다" #: daemon_client.cpp:181 msgid "pkexec: unexpected error code" msgstr "pkexec: 예기치 않은 에러 코드" #: daemon_client.cpp:211 msgid "Connecting to daemon…" msgstr "데몬에 연결 중…" #: daemon_server.cpp:261 #, c-format msgid "request_handler: case %i not handled" msgstr "request_handler: case %i 가 처리되지 않음" #: data.cpp:124 cpu-x-gtk-3.12.ui:1370 msgid "CPU" msgstr "CPU" #: data.cpp:187 msgid "P-core" msgstr "P-코어" #: data.cpp:188 msgid "E-core" msgstr "E-코어" #: data.cpp:189 data.cpp:192 msgid "Core" msgstr "코어" #: data.cpp:208 cpu-x-gtk-3.12.ui:746 msgid "Processor" msgstr "프로세서" #: data.cpp:240 data.cpp:329 cpu-x-gtk-3.12.ui:1968 msgid "Caches" msgstr "캐시" #: data.cpp:247 #, c-format msgid "%2d x %4d %s, %2d-way" msgstr "%2d x %4d %s, %2d-way" #: data.cpp:249 #, c-format msgid "%d %s, %d-way" msgstr "%d %s, %d-way" #: data.cpp:263 msgid "Count" msgstr "카운트" #: data.cpp:276 cpu-x-gtk-3.12.ui:968 msgid "Clocks" msgstr "클럭" #: data.cpp:379 data.cpp:383 #, c-format msgid "L%u Cache" msgstr "L%u 캐시" #: data.cpp:385 #, c-format msgid "%s associative, %d-%s line size" msgstr "%s associative, %d-%s 행 사이즈" #: data.cpp:398 msgid "Test" msgstr "테스트" #: data.cpp:409 data.cpp:423 cpu-x-gtk-3.12.ui:2146 cpu-x-gtk-3.12.ui:2517 msgid "Motherboard" msgstr "마더보드" #: data.cpp:437 cpu-x-gtk-3.12.ui:2367 msgid "BIOS" msgstr "BIOS" #: data.cpp:452 cpu-x-gtk-3.12.ui:2498 msgid "Chipset" msgstr "칩셋" #: data.cpp:467 data.cpp:569 cpu-x-gtk-3.12.ui:3156 cpu-x-gtk-3.12.ui:3761 msgid "Memory" msgstr "메모리" #: data.cpp:483 #, c-format msgid "Stick %u" msgstr "스틱 %u" #: data.cpp:487 cpu-x-gtk-3.12.ui:3134 msgid "Sticks" msgstr "스틱" #: data.cpp:541 cpu-x-gtk-3.12.ui:3780 msgid "System" msgstr "시스템" #: data.cpp:554 cpu-x-gtk-3.12.ui:3380 msgid "Operating System" msgstr "운영체제" #: data.cpp:587 cpu-x-gtk-3.12.ui:4960 msgid "Graphics" msgstr "그래픽" #: data.cpp:621 #, c-format msgid "Card %u" msgstr "카드 %u" #: data.cpp:625 cpu-x-gtk-3.12.ui:4938 msgid "Cards" msgstr "카드" #: data.cpp:672 cpu-x-gtk-3.12.ui:5300 msgid "Bench" msgstr "벤치" #: data.cpp:685 msgid "Not started" msgstr "정지중" #: data.cpp:688 cpu-x-gtk-3.12.ui:5070 msgid "Prime numbers (slow)" msgstr "소수 (저속)" #: data.cpp:692 cpu-x-gtk-3.12.ui:5178 msgid "Prime numbers (fast)" msgstr "소수 (고속)" #: data.cpp:696 cpu-x-gtk-3.12.ui:5281 msgid "Parameters" msgstr "파라미터" #: data.cpp:721 data.cpp:727 #, c-format msgid "%u mins" msgstr "%u 분" #: data.cpp:734 cpu-x-gtk-3.12.ui:5444 cpu-x-gtk-3.12.ui:5552 msgid "About" msgstr "CPU-X에 대해서" #: data.cpp:739 #, c-format msgid "" "%s is a Free software that gathers information\n" "on CPU, motherboard and more." msgstr "" "%s는 CPU나 마더보드 등의 정보를\n" "수집하는 무료 소프트웨어입니다." #: data.cpp:744 msgid "About CPU-X" msgstr "CPU-X에 대해서" #: data.cpp:745 #, c-format msgid "Version %s" msgstr "버전 %s" #: data.cpp:746 #, c-format msgid "Author: %s" msgstr "저자: %s" #: data.cpp:747 #, c-format msgid "Site: %s" msgstr "사이트: %s" #: data.cpp:751 cpu-x-gtk-3.12.ui:5533 msgid "License" msgstr "라이센스" #: data.cpp:753 #, c-format msgid "This software is distributed under the terms of %s" msgstr "이 소프트웨어는 %s에 의거해 배포되고 있습니다" #: data.cpp:754 main.cpp:176 msgid "This program comes with ABSOLUTELY NO WARRANTY" msgstr "이 프로그램은 자기 책임 하에 사용해주세요" #: gui_gtk.cpp:61 #, c-format msgid "Cannot find path for '%s' file" msgstr "'%s' 파일의 경로를 찾을 수 없습니다" #: gui_gtk.cpp:400 msgid "Start daemon" msgstr "데몬 시작" #: gui_gtk.cpp:403 msgid "Connected to daemon" msgstr "데몬에 연결" #: gui_gtk.cpp:406 msgid "No polkit authentication agent found" msgstr "polkit 인증 에이전트를 찾을 수 없습니다" #: gui_gtk.cpp:411 msgid "Ask password to start daemon in background" msgstr "백그라운드에서 데몬을 시작하기 위해 패스워드가 필요" #: gui_gtk.cpp:415 msgid "Settings" msgstr "설정" #: gui_gtk.cpp:634 msgid "BaseFamily" msgstr "베이스패밀리" #: gui_gtk.cpp:635 msgid "CPU display (\"true\") family (computed as BaseFamily+ExtendedFamily)" msgstr "CPU 디스플레이 (\"true\") 패밀리 (BaseFamily+ExtendedFamily로 계산됨)" #: gui_gtk.cpp:636 msgid "BaseModel" msgstr "베이스모델" #: gui_gtk.cpp:637 msgid "CPU display (\"true\") model (computed as (ExtendedModel<<4)+BaseModel)" msgstr "CPU 디스플레이 (\"true\") 모델 ((ExtendedModel<<4)+BaseMode로 계산됨)" #: gui_gtk.cpp:847 msgid "" "Identify the physically-labeled socket or board position where the memory " "device is located" msgstr "" "메모리 디바이스가 위치한, 물리적 라벨이 붙은 소켓이나 보드 위치를 특정함" #: gui_gtk.cpp:848 msgid "Identify the physically labeled bank where the memory device is located" msgstr "메모리 디바이스가 위치한, 물리적 라벨이 붙은 뱅크를 특정함" #: gui_gtk.cpp:1052 msgid "User Mode Driver Version" msgstr "유저 모드 드라이버 버전" #: gui_gtk.cpp:1066 msgid "Vulkan Ray Tracing" msgstr "Vulkan 레이 트레이싱" #: gui_gtk.cpp:1260 msgid "Starting GTK GUI…" msgstr "GTK GUI 시작 중…" #: gui_gtk.cpp:1272 msgid "failed to import UI in GtkBuilder" msgstr "GtkBuilder의 UI를 import하는 데 실패했습니다" #: main.cpp:63 msgid "Start graphical user interface (GUI) (default)" msgstr "그래픽 유저 인터페이스 (GUI) 를 시작 (디폴트)" #: main.cpp:64 msgid "Start text-based user interface (TUI)" msgstr "텍스트 유저 인터페이스 (TUI) 시작" #: main.cpp:65 msgid "Dump all data on standard output and exit" msgstr "모든 데이터를 표준 츨력으로 출력하고 종료" #: main.cpp:66 msgid "Run embedded command dmidecode and exit" msgstr "임베디드 커맨드 dmidecode를 실행하고 종료" #: main.cpp:67 msgid "Run embedded command bandwidth and exit" msgstr "임베디드 커맨드 bandwidth를 실행하고 종료" #: main.cpp:68 msgid "Set temperature unit (c[elsius]|f[ahrenheit]|k[elvin]|r[ankine])" msgstr "온도의 단위를 설정 (c[elsius]|f[ahrenheit]|k[elvin]|r[ankine])" #: main.cpp:69 msgid "Set custom time between two refreshes (in seconds)" msgstr "새로고침의 간격을 설정합니다 (초)" #: main.cpp:70 msgid "Set default tab (integer)" msgstr "디폴트 탭을 설정합니다 (정수)" #: main.cpp:71 msgid "Select core type to monitor (integer)" msgstr "모니터할 코어의 타입을 선택합니다 (정수)" #: main.cpp:72 msgid "Select CPU core to monitor (integer)" msgstr "모니터할 CPU 코어를 선택합니다 (정수)" #: main.cpp:73 msgid "Set custom bandwidth test for CPU caches speed (integer)" msgstr "CPU 캐시 속도의 대역폭 테스트를 설정합니다 (정수)" #: main.cpp:74 msgid "Select default memory stick (integer)" msgstr "디폴트 메모리 스틱을 설정합니다 (정수)" #: main.cpp:75 msgid "Select default graphic card (integer)" msgstr "디폴트 그래픽 카드를 설정합니다 (정수)" #: main.cpp:76 cpu-x-gtk-3.12.ui:5910 msgid "Start and connect to daemon" msgstr "데몬을 시작하고 연결합니다" #: main.cpp:77 msgid "Verbose output" msgstr "상세하게 출력" #: main.cpp:78 msgid "Print help and exit" msgstr "도움말을 출력하고 종료" #: main.cpp:79 msgid "Print version and exit" msgstr "버전을 출력하고 종료" #: main.cpp:80 msgid "Print CPUID values in decimal (default is hexadeximal)" msgstr "CPUID의 값을 10진수로 출력 (디폴트는 16진수)" #: main.cpp:81 msgid "Disable colored output" msgstr "출력의 색상을 없앱니다" #: main.cpp:82 msgid "Print information for debugging" msgstr "디버깅을 위한 정보를 출력합니다" #: main.cpp:83 msgid "Print required information to paste in an issue" msgstr "issue에 붙여넣기 위한 정보를 출력합니다" #: main.cpp:84 msgid "Set key mapping for NCurses mode (a[rrows]|e[macs]|i[nverted-T]|v[im])" msgstr "" "NCurses 모드의 키맵핑을 설정합니다 (a[rrows]|e[macs]|i[nverted-T]|v[im])" #: main.cpp:95 msgid "Add default command line arguments" msgstr "디폴트 커맨드 라인 인자를 추가합니다" #: main.cpp:96 msgid "Enforce the bus clock" msgstr "버스 클럭 적용" #: main.cpp:97 msgid "" "Ignore CPU values reported by libcpuid (comma-separated values among 'temp', " "'volt' and 'freq')" msgstr "" "libcpuid가 보고하는 CPU 수치 ('temp', 'volt', 'freq'를 ,로 구분한 수치)를 무" "시합니다" #: main.cpp:98 msgid "Read CPUID raw data from a given file" msgstr "주어진 파일에서 CPUID의 raw data를 읽어옵니다" #: main.cpp:99 msgid "Only print a message if CPU is not present in the database" msgstr "CPU가 데이터베이스에 존재하지 않을 경우에만 메시지를 출력합니다" #: main.cpp:126 #, c-format msgid "Usage: %s DISPLAY [OPTIONS]\n" msgstr "사용법: %s 디스플레이 [옵션]\n" #: main.cpp:127 msgid "Available DISPLAY:" msgstr "사용 가능한 디스플레이:" #: main.cpp:135 msgid "Available OPTIONS:" msgstr "사용 가능한 옵션:" #: main.cpp:144 msgid "Influenceable environment variables:" msgstr "영향을 줄 수 있는 환경 변수:" #: main.cpp:175 msgid "This is free software: you are free to change and redistribute it." msgstr "이것은 무료 소프트웨어입니다: 자유롭게 변경 및 재배포가 가능합니다." #: main.cpp:177 #, c-format msgid "See the %s license: <%s>\n" msgstr "%s 라이센스를 보세요: <%s>\n" #: main.cpp:184 #, c-format msgid "-- %-9s version: %s" msgstr "-- %-9s 버전: %s" #: main.cpp:381 #, c-format msgid "" "\n" "Oops, something was wrong! %s has received signal %d (%s) and has crashed." msgstr "" "\n" "이런, 무언가가 잘못되었습니다! %s 가 시그널 %d (%s)를 받아 충돌이 발생했습니" "다." #: main.cpp:383 #, c-format msgid "" "\n" "Oops, something was wrong! %s has received signal %d (%s) and is trying to " "recover." msgstr "" "\n" "이런, 무언가가 잘못되었습니다! %s 가 시그널 %d (%s)를 받아 복구를 시도하고 있" "습니다." #: main.cpp:407 msgid "You can open a new issue here, by filling the template as requested:" msgstr "여기서 주어진 템플릿을 채워 새 issue를 열 수 있습니다:" #: main.cpp:449 msgid "an error occurred while setting locale" msgstr "로케일 설정 중 에러가 발생했습니다" #: options.cpp:124 #, c-format msgid "" "Selected CPU type (%u) is not a valid number (%u is the maximum for this CPU)" msgstr "" "선택한 CPU 타입 (%u)은 유효한 수치가 아닙니다 (%u가 이 CPU의 최대치입니다)" #: options.cpp:145 #, c-format msgid "" "Selected bandwidth test (%u) is not a valid number (%u is the maximum for " "this system)" msgstr "" "선택한 대역폭 테스트 (%u)는 유효한 수치가 아닙니다 (%u가 이 시스템의 최대치입" "니다)" #: options.cpp:168 #, c-format msgid "" "Selected RAM stick (%u) is not a valid number (%u is the maximum for this " "system)" msgstr "" "선택한 RAM 스틱 (%u)은 유효한 수치가 아닙니다 (%u가 이 시스템의 최대치입니다)" #: options.cpp:188 #, c-format msgid "" "Selected graphic card (%u) is not a valid number (%u is the maximum for this " "system)" msgstr "" "선택한 그래픽 카드 (%u)는 유효한 수치가 아닙니다 (%u가 이 시스템의 최대치입니" "다)" #: options.cpp:204 #, c-format msgid "failed to change CPU affinitiy to core %u" msgstr "CPU affinity를 코어 %u로 변경하는 데 실패했습니다" #: options.cpp:210 #, c-format msgid "" "Selected CPU core (%u) is not a valid number (%u is the maximum for this " "type of core)" msgstr "" "선택한 CPU 코어 (%u)는 유효한 수치가 아닙니다 (%u가 이 타입의 코어에서 최대치" "입니다)" #: options.cpp:284 #, c-format msgid "Selected tab (%u) is not a valid number (%u is the maximum)" msgstr "선택한 탭 (%u)은 유효한 수치가 아닙니다 (%u가 최대치입니다)" #: tui_ncurses.cpp:111 msgid "Window is too small!" msgstr "윈도우가 너무 작습니다!" #: tui_ncurses.cpp:119 msgid "Press 'h' to see help." msgstr "'h'키를 눌러 도움말을 봅니다." #: tui_ncurses.cpp:232 #, c-format msgid "Welcome in %s NCurses help!\n" msgstr "%s NCurses 도움말에 어서오세요!\n" #: tui_ncurses.cpp:233 msgid "This help describes how to use this Text-based User Interface." msgstr "이 도움말에서는 텍스트 기반 유저 인터페이스의 사용법을 설명합니다." #: tui_ncurses.cpp:235 msgid "Global keys:" msgstr "글로벌 키:" #: tui_ncurses.cpp:236 msgid "Press 'left' key or 'tab' key to switch in left tab." msgstr "'왼쪽' 키 또는 '탭' 키를 눌러 좌측 탭으로 변환합니다." #: tui_ncurses.cpp:237 msgid "Press 'right' key or 'shift + tab' keys to switch in right tab." msgstr "'오른쪽' 키 또는 '쉬프트 + 탭' 키를 눌러 우측 탭으로 변환합니다." #: tui_ncurses.cpp:238 msgid "Press 'h' key to see this help." msgstr "'h' 키를 눌러 도움말을 봅니다." #: tui_ncurses.cpp:239 msgid "Press 'q' key to exit." msgstr "'q' 키를 눌러 종료합니다." #: tui_ncurses.cpp:241 msgid "CPU tab:" msgstr "CPU 탭:" #: tui_ncurses.cpp:242 msgid "Press 'next page' key to decrease core type number to monitor." msgstr "'next page' 키를 눌러 모니터하는 코어 타입의 숫자를 줄입니다." #: tui_ncurses.cpp:243 msgid "Press 'previous page' key to increase core type number to monitor." msgstr "'previous page' 키를 눌러 모니터하는 코어 타입의 숫자를 늘립니다." #: tui_ncurses.cpp:244 msgid "Press 'down' key to decrease CPU core number to monitor." msgstr "'아래' 키를 눌러 모니터하는 CPU 코어의 숫자를 줄입니다." #: tui_ncurses.cpp:245 msgid "Press 'up' key to increase CPU core number to monitor." msgstr "'위' 키를 눌러 모니터하는 CPU 코어의 숫자를 늘립니다." #: tui_ncurses.cpp:247 msgid "Caches tab:" msgstr "캐시 탭:" #: tui_ncurses.cpp:248 msgid "Press 'down' key to switch to previous test." msgstr "'아래' 키를 눌러 이전 테스트로 변환합니다." #: tui_ncurses.cpp:249 msgid "Press 'up' key to switch to next test." msgstr "'위' 키를 눌러 다음 테스트로 변환합니다." #: tui_ncurses.cpp:251 msgid "Bench tab:" msgstr "벤치 탭:" #: tui_ncurses.cpp:252 msgid "Press 'down' key to decrement benchmark duration." msgstr "'아래' 키를 눌러 벤치마크 기간을 줄입니다." #: tui_ncurses.cpp:253 msgid "Press 'up' key to increment benchmark duration." msgstr "'위' 키를 눌러 벤치마크 기간을 늘립니다." #: tui_ncurses.cpp:254 msgid "Press 'next page' key to decrement number of threads to use." msgstr "'next page' 키를 눌러 사용할 스레드의 수를 줄입니다." #: tui_ncurses.cpp:255 msgid "Press 'previous page' key to increment number of threads to use." msgstr "'previous page' 키를 눌러 사용할 스레드의 수를 늘립니다." #: tui_ncurses.cpp:256 msgid "Press 's' key to start/stop prime numbers (slow) benchmark." msgstr "'s' 키를 눌러 소수 벤치마크 (느림)의 시작/정지." #: tui_ncurses.cpp:257 msgid "Press 'f' key to start/stop prime numbers (fast) benchmark." msgstr "'f' 키를 눌러 소수 벤치마크 (빠름)의 시작/정지." #: tui_ncurses.cpp:259 msgid "Graphics tab:" msgstr "그래픽 탭:" #: tui_ncurses.cpp:260 msgid "Press 'down' key to switch to previous graphic card." msgstr "'아래' 키를 눌러 이전 그래픽카드로 변환합니다." #: tui_ncurses.cpp:261 msgid "Press 'up' key to switch to next graphic card." msgstr "'위' 키를 눌러 다음 그래픽카드로 변환합니다." #: tui_ncurses.cpp:263 msgid "Press any key to exit this help." msgstr "아무 키나 눌러서 도움말을 종료합니다." #: tui_ncurses.cpp:640 msgid "Starting NCurses TUI…" msgstr "NCurses TUI를 시작하는 중…" #: tui_ncurses.cpp:649 msgid "" "FATAL ERROR: terminfo database could not be found (try to set TERMINFO " "environment variable)" msgstr "" "치명적 에러: terminfo 데이터베이스를 찾을 수 없습니다 (TERMINFO 환경변수를 설" "정해주세요)" #: tui_ncurses.cpp:654 #, c-format msgid "Failed to set up %s terminal (err=%i); falling back to %s" msgstr "터미널 %s의 셋업에 실패했습니다 (에러 %i); %s로 돌아갑니다" #: util.cpp:189 #, c-format msgid "cannot find unit in '%s' string at position %i" msgstr "'%s'의 위치 %i에서 유닛을 찾을 수 없습니다" #: util.cpp:252 #, c-format msgid "an error occurred while opening file '%s'" msgstr "파일 '%s'를 여는 도중 에러가 발생했습니다" #: util.cpp:297 #, c-format msgid "an error occurred while running command '%s'" msgstr "커맨드 '%s'의 실행 중 에러가 발생했습니다" #: util.cpp:437 msgid "set_cpu_affinity() not supported on this operating system" msgstr "set_cpu_affinity()는 이 운영체제에서 지원되지 않습니다" #: data.hpp:103 data.hpp:244 data.hpp:332 msgid "Vendor" msgstr "벤더" #: data.hpp:104 msgid "Code Name" msgstr "코드네임" #: data.hpp:105 msgid "Package" msgstr "패키지" #: data.hpp:106 msgid "Technology" msgstr "테크놀로지" #: data.hpp:107 data.hpp:268 msgid "Voltage" msgstr "전압" #: data.hpp:108 msgid "Specification" msgstr "사양" #: data.hpp:109 msgid "Family" msgstr "패밀리" #: data.hpp:110 msgid "Disp. Family" msgstr "Disp. 패밀리" #: data.hpp:111 data.hpp:224 data.hpp:245 data.hpp:335 msgid "Model" msgstr "모델" #: data.hpp:112 msgid "Disp. Model" msgstr "Disp. 모델" #: data.hpp:113 msgid "Temp." msgstr "온도." #: data.hpp:114 msgid "Stepping" msgstr "스텝핑" #: data.hpp:115 msgid "Instructions" msgstr "명령" #: data.hpp:125 msgid "L1 Data" msgstr "L1 데이터" #: data.hpp:126 msgid "L1 Inst." msgstr "L1 명령." #: data.hpp:127 msgid "Level 2" msgstr "레벨 2" #: data.hpp:128 msgid "Level 3" msgstr "레벨 3" #: data.hpp:137 cpu-x-gtk-3.12.ui:1232 msgid "Cores" msgstr "코어" #: data.hpp:138 data.hpp:408 cpu-x-gtk-3.12.ui:1252 msgid "Threads" msgstr "스레드" #: data.hpp:155 msgid "Core Speed" msgstr "코어 스피드" #: data.hpp:156 msgid "Multiplier" msgstr "배수" #: data.hpp:157 msgid "Bus Speed" msgstr "버스 스피드" #: data.hpp:158 data.hpp:341 msgid "Usage" msgstr "사용량" #: data.hpp:188 data.hpp:265 msgid "Size" msgstr "사이즈" #: data.hpp:189 data.hpp:267 msgid "Speed" msgstr "스피드" #: data.hpp:223 data.hpp:259 msgid "Manufacturer" msgstr "제조사" #: data.hpp:225 msgid "Revision" msgstr "리비전" #: data.hpp:233 msgid "Brand" msgstr "브랜드" #: data.hpp:234 msgid "Version" msgstr "버전" #: data.hpp:235 msgid "Date" msgstr "날짜" #: data.hpp:236 msgid "ROM Size" msgstr "ROM 사이즈" #: data.hpp:260 msgid "Part Number" msgstr "파츠 번호" #: data.hpp:261 msgid "Type" msgstr "타입" #: data.hpp:262 msgid "Type Detail" msgstr "타입 상세" #: data.hpp:263 msgid "Device Locator" msgstr "디바이스 위치" #: data.hpp:264 msgid "Bank Locator" msgstr "뱅크 위치" #: data.hpp:266 msgid "Rank" msgstr "랭크" #: data.hpp:292 msgid "Name" msgstr "이름" #: data.hpp:293 msgid "Kernel" msgstr "커널" #: data.hpp:294 msgid "Hostname" msgstr "호스트명" #: data.hpp:295 msgid "Uptime" msgstr "가동시간" #: data.hpp:303 msgid "Used" msgstr "사용됨" #: data.hpp:304 msgid "Buffers" msgstr "버퍼" #: data.hpp:305 msgid "Cached" msgstr "캐시됨" #: data.hpp:306 msgid "Free" msgstr "프리" #: data.hpp:307 msgid "Swap" msgstr "스왑" #: data.hpp:333 msgid "Driver" msgstr "드라이버" #: data.hpp:334 msgid "UMD Version" msgstr "UMD 버전" #: data.hpp:336 msgid "Compute Unit" msgstr "계산 유닛" #: data.hpp:337 msgid "Device ID" msgstr "디바이스 ID" #: data.hpp:338 msgid "VBIOS Version" msgstr "VBIOS 버전" #. #-#-#-#-# source_ui.pot (cpu-x ) #-#-#-#-# #. Setting: "Interface" tab #: data.hpp:339 cpu-x-gtk-3.12.ui:5807 msgid "Interface" msgstr "인터페이스" #: data.hpp:340 msgid "Temperature" msgstr "온도" #: data.hpp:342 msgid "Core Voltage" msgstr "코어 전압" #: data.hpp:343 msgid "Power Avg" msgstr "평균 전력" #: data.hpp:344 msgid "Core Clock" msgstr "코어 클럭" #: data.hpp:345 msgid "Memory Clock" msgstr "메모리 클럭" #: data.hpp:346 msgid "Memory Used" msgstr "메모리 사용량" #: data.hpp:347 msgid "Resizable BAR" msgstr "Resizable BAR" #: data.hpp:348 msgid "Vulkan RT" msgstr "Vulkan RT" #: data.hpp:349 msgid "OpenGL Version" msgstr "OpenGL 버전" #: data.hpp:350 msgid "Vulkan Version" msgstr "Vulkan 버전" #: data.hpp:351 msgid "OpenCL Version" msgstr "OpenCL 버전" #: data.hpp:387 msgid "Score" msgstr "스코어" #: data.hpp:388 msgid "Run" msgstr "실행" #: data.hpp:407 msgid "Duration" msgstr "지속시간" #: util.hpp:77 msgid "bytes" msgstr "bytes" #. TRANSLATORS: initials for kilobyte (10³): please put initials (keep it short) #: util.hpp:80 msgid "kB" msgstr "kB" #. TRANSLATORS: initials for megabyte (10⁶): please put initials (keep it short) #: util.hpp:82 msgid "MB" msgstr "MB" #. TRANSLATORS: initials for gigabyte (10⁹): please put initials (keep it short) #: util.hpp:84 msgid "GB" msgstr "GB" #. TRANSLATORS: initials for terabyte (10¹²): please put initials (keep it short) #: util.hpp:86 msgid "TB" msgstr "TB" #. TRANSLATORS: initials for kibibyte (2¹⁰): please put initials (keep it short) #: util.hpp:89 msgid "KiB" msgstr "KiB" #. TRANSLATORS: initials for mebibyte (2²⁰): please put initials (keep it short) #: util.hpp:91 msgid "MiB" msgstr "MiB" #. TRANSLATORS: initials for gibibyte (2³⁰): please put initials (keep it short) #: util.hpp:93 msgid "GiB" msgstr "GiB" #. TRANSLATORS: initials for tebibyte (2⁴⁰): please put initials (keep it short) #: util.hpp:95 msgid "TiB" msgstr "TiB" #: cpu-x-gtk-3.12.ui:1184 msgid "Cache" msgstr "캐시" #. Setting: refresh time for UI #: cpu-x-gtk-3.12.ui:5721 msgid "Refresh time" msgstr "새로고침 간격" #. Setting: GUI theme #: cpu-x-gtk-3.12.ui:5745 msgid "Text theme" msgstr "텍스트 테마" #. Setting: automatic GUI theme #: cpu-x-gtk-3.12.ui:5760 msgid "Automatic" msgstr "자동" #. Setting: light GUI theme #: cpu-x-gtk-3.12.ui:5761 msgid "Blue for light theme" msgstr "라이트 테마의 파랑" #. Setting: dark GUI theme #: cpu-x-gtk-3.12.ui:5762 msgid "Yellow for dark theme" msgstr "다크 테마의 노랑" #. Setting: temperature unit #: cpu-x-gtk-3.12.ui:5775 msgid "Temperature unit" msgstr "온도 단위" #. Setting: default tab at startup #: cpu-x-gtk-3.12.ui:5826 msgid "Default tab" msgstr "디폴트 탭" #. Setting: default CPU core at startup #: cpu-x-gtk-3.12.ui:5839 msgid "Default CPU core" msgstr "디폴트 CPU 코어" #. Setting: default cache test at startup #: cpu-x-gtk-3.12.ui:5852 msgid "Default cache test" msgstr "디폴트 캐시 테스트" #. Setting: print CPUID values in decimal or hexadecimal #: cpu-x-gtk-3.12.ui:5895 msgid "Print CPUID values in decimal" msgstr "CPUID값을 10진수로 출력" #. Setting: default graphic card at startup #: cpu-x-gtk-3.12.ui:5928 msgid "Default graphic card" msgstr "디폴트 그래픽 카드" #. Setting: default CPU core at startup #: cpu-x-gtk-3.12.ui:5952 msgid "Default core type" msgstr "디폴트 코어 타입" #. Setting: default graphic card at startup #: cpu-x-gtk-3.12.ui:5976 msgid "Default memory stick" msgstr "디폴트 메모리 스틱" #. Setting: "Startup" tab #: cpu-x-gtk-3.12.ui:6004 msgid "Startup" msgstr "시작" #~ msgid "Light" #~ msgstr "라이트" #~ msgid "Dark" #~ msgstr "다크" #, fuzzy #~| msgid "could not reallocate memory" #~ msgid "FATAL ERROR: could not allocate memory" #~ msgstr "메모리를 재할당할 수 없습니다" CPU-X-5.0.3/po/lv.po000066400000000000000000000720571454622605200137730ustar00rootroot00000000000000# Copyright © 2014-2024 The Tumultuous Unicorn Of Darkness # This file is distributed under the same license as the CPU-X package. # Anton Kochubey , 2020. # Allan Nordhøy , 2020. msgid "" msgstr "" "Project-Id-Version: CPU-X\n" "Report-Msgid-Bugs-To: https://github.com/TheTumultuousUnicornOfDarkness/CPU-" "X/issues\n" "POT-Creation-Date: 2023-12-09 13:09+0100\n" "PO-Revision-Date: 2020-07-11 09:41+0000\n" "Last-Translator: Allan Nordhøy \n" "Language-Team: Latvian \n" "Language: lv\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 == 0 || n % 100 >= 11 && n % 100 <= " "19) ? 0 : ((n % 10 == 1 && n % 100 != 11) ? 1 : 2);\n" "X-Generator: Weblate 4.2-dev\n" #: core.cpp:135 msgid "Finding CPU technology" msgstr "Procesora tehnoloģijas noteikšana" #: core.cpp:161 #, fuzzy, c-format #| msgid "" #| "Your CPU does not belong in database ==> %s, model: %i, ext. model: %i, " #| "ext. family: %i" msgid "" "Your CPU is not present in the database ==> %s, model: %i, ext. model: %i, " "ext. family: %i" msgstr "" "Jūsu procesors nav atrasts datubāzē ==> %s, modelis: %i, papl. modelis: %i, " "papl. ģimene: %i" #: core.cpp:189 data.cpp:150 data.cpp:342 msgid "unknown" msgstr "" #: core.cpp:230 msgid "Calling libcpuid for retrieving static data" msgstr "Izsaucu libcpuid statisko datu saņemšanai" #: core.cpp:245 #, c-format msgid "failed to call libcpuid (%s)" msgstr "libcpuid izsaukšana neveiksmīga (%s)" #: core.cpp:340 msgid "Calling libcpuid for retrieving dynamic data" msgstr "Izsaucu libcpuid dinamisko datu saņemšanai" #: core.cpp:353 msgid "Calling libcpuid for retrieving CPU MSR static values" msgstr "Izsaucu libcpuid procesora MSR statisko vērtību nolasīšanai" #: core.cpp:380 msgid "Calling libcpuid for retrieving CPU MSR dynamic values" msgstr "Izsaucu libcpuid procesora MSR dinamisko vērtību nolasīšanai" #: core.cpp:412 msgid "Calling dmidecode" msgstr "Izsaucu dmidecode" #: core.cpp:454 core.cpp:473 #, c-format msgid "%s (configured)" msgstr "" #: core.cpp:461 core.cpp:480 #, c-format msgid "%s (max)" msgstr "" #: core.cpp:466 #, c-format msgid "%s (min)" msgstr "" #: core.cpp:496 msgid "Calculating CPU usage" msgstr "Izrēķinu procesora pielietojumu" #: core.cpp:546 msgid "Calling bandwidth" msgstr "" #: core.cpp:613 #, c-format msgid "" "pci_access is not properly initialized: it is a common issue when %s was " "built with a lower libpci version.\n" "Check that libpci %s library is present on your system. Otherwise, please " "rebuild %s." msgstr "" #: core.cpp:657 #, c-format msgid "No kernel driver in use for graphic card at path %s" msgstr "" #: core.cpp:693 #, fuzzy, c-format #| msgid "Your GPU driver is unknown: %s" msgid "Your GPU kernel driver is unknown: %s" msgstr "Jūsu GPU draiveris nav zināms: %s" #: core.cpp:777 #, fuzzy, c-format #| msgid "Your GPU driver is unknown: %s" msgid "Your GPU user mode driver is unknown for vendor %s: %s" msgstr "Jūsu GPU draiveris nav zināms: %s" #: core.cpp:781 #, fuzzy, c-format #| msgid "failed to call libcpuid (%s)" msgid "failed to call GLFW (%i): %s" msgstr "libcpuid izsaukšana neveiksmīga (%s)" #: core.cpp:914 msgid "Finding Vulkan API version" msgstr "" #: core.cpp:926 #, fuzzy, c-format #| msgid "failed to call dmidecode" msgid "failed to call vkCreateInstance (%s)" msgstr "Nav iespējams izsaukt dmidecode" #: core.cpp:929 #, c-format msgid "%s is not supported" msgstr "" #: core.cpp:937 #, fuzzy, c-format #| msgid "failed to call dmidecode" msgid "failed to call vkEnumeratePhysicalDevices (%s)" msgstr "Nav iespējams izsaukt dmidecode" #: core.cpp:944 msgid "No available Vulkan devices" msgstr "" #: core.cpp:952 #, fuzzy, c-format #| msgid "failed to call dmidecode" msgid "No available physical devices (%s)" msgstr "Nav iespējams izsaukt dmidecode" #: core.cpp:1015 #, fuzzy, c-format #| msgid "failed to call libcpuid (%s)" msgid "Failed to create Vulkan for device %u (%s)" msgstr "libcpuid izsaukšana neveiksmīga (%s)" #: core.cpp:1019 #, c-format msgid "%s is not supported for device %u, use only deviceID for matching" msgstr "" #: core.cpp:1051 core.cpp:1364 msgid "Enabled" msgstr "" #: core.cpp:1051 core.cpp:1364 msgid "Disabled" msgstr "" #: core.cpp:1088 msgid "Finding OpenCL API version" msgstr "" #: core.cpp:1092 #, c-format msgid "There is no platform with OpenCL support (%s)" msgstr "" #: core.cpp:1102 #, fuzzy, c-format #| msgid "failed to call dmidecode" msgid "failed to get all OpenCL platforms (%s)" msgstr "Nav iespējams izsaukt dmidecode" #: core.cpp:1115 #, c-format msgid "failed to get name for platform %u (%s)" msgstr "" #: core.cpp:1123 #, c-format msgid "failed to get version for platform %u (%s)" msgstr "" #: core.cpp:1131 #, c-format msgid "failed to find number of OpenCL devices for platform '%s %s' (%s)" msgstr "" #: core.cpp:1131 #, fuzzy #| msgid "Finding devices" msgid "0 device" msgstr "Ierīču meklēšana" #: core.cpp:1140 #, c-format msgid "failed to get all of OpenCL devices for platform '%s %s' (%s)" msgstr "" #: core.cpp:1160 #, fuzzy, c-format #| msgid "failed to call libcpuid (%s)" msgid "failed to get name for device %u (%s)" msgstr "libcpuid izsaukšana neveiksmīga (%s)" #: core.cpp:1168 #, c-format msgid "failed to get version for device %u (%s)" msgstr "" #: core.cpp:1190 #, c-format msgid "OpenCL driver for '%s %s' does not support CL_DEVICE_TOPOLOGY_AMD (%s)" msgstr "" #: core.cpp:1201 #, c-format msgid "" "OpenCL driver for '%s %s' does not support CL_DEVICE_GFXIP_MAJOR_AMD (%s)" msgstr "" #: core.cpp:1209 core.cpp:1229 core.cpp:1262 #, c-format msgid "" "OpenCL driver for '%s %s' does not support CL_DEVICE_MAX_COMPUTE_UNITS (%s)" msgstr "" #: core.cpp:1250 #, c-format msgid "" "OpenCL driver for '%s %s' does not support CL_DEVICE_PCI_DOMAIN_ID_NV (%s), " "CL_DEVICE_PCI_BUS_ID_NV (%s) or CL_DEVICE_PCI_SLOT_ID_NV (%s)" msgstr "" #: core.cpp:1273 #, c-format msgid "OpenCL is not supported with your GPU vendor (0x%X)" msgstr "" #: core.cpp:1295 msgid "Finding devices" msgstr "Ierīču meklēšana" #: core.cpp:1307 #, fuzzy, c-format #| msgid "Skip devices search (need to be root)" msgid "Skip devices search (wrong permissions on %s device)" msgstr "Ierīču meklēšana tiek izlaista (nepieciešamas root tiesības)" #: core.cpp:1350 #, c-format msgid "Your GPU vendor is unknown: %s (0x%X)" msgstr "Jūsu GPU ražōtājs ir nezināms: %s (0x%X)" #: core.cpp:1370 msgid "failed to find chipset vendor and model" msgstr "nav iespējams noteikt mikroshēmojuma ražotāju un modeli" #: core.cpp:1385 msgid "failed to find graphic card vendor and model" msgstr "nav iespējams noteikt grafiskā akseleratora ražotāju un modeli" #: core.cpp:1487 msgid "Retrieving GPU clocks" msgstr "GPU frekvences nolasīšana" #: core.cpp:1500 msgid "None" msgstr "" #: core.cpp:1509 #, c-format msgid "DRM path for %s is unknown" msgstr "" #: core.cpp:1516 #, c-format msgid "Card number for %s is unknown" msgstr "" #: core.cpp:1541 #, c-format msgid "PCIe %s (current) / %s (max)" msgstr "" #: core.cpp:1650 #, fuzzy, c-format #| msgid "Driver for GPU %u doesn't report frequencies" msgid "Driver for %s doesn't report frequencies" msgstr "GPU %u draiveris neatbalsta frekvenču nolasīšanu" #: core.cpp:1671 #, fuzzy, c-format #| msgid "failed to call dmidecode" msgid "failed to retrieve all monitoring data for %s" msgstr "Nav iespējams izsaukt dmidecode" #: core.cpp:1694 msgid "Identifying running system" msgstr "Darbojošās sistēmas noteikšana" #: core.cpp:1697 msgid "failed to identify running system" msgstr "Nav iespējams noteikt darbojošo sistēmu" #: core.cpp:1749 core.cpp:1778 msgid "Calling libprocps" msgstr "Izsauc libprocps" #: core.cpp:1752 msgid "unable to get system uptime" msgstr "" #: core.cpp:1758 msgid "unable to create meminfo structure" msgstr "" #: core.cpp:1804 msgid "Calling libstatgrab" msgstr "Izsauc libstatgrab" #: core.cpp:1852 #, c-format msgid "%i days, %i hours, %i minutes, %i seconds" msgstr "%i dienas, %i stundas, %i minūtes, %i sekundes" #: core.cpp:1915 msgid "Updating benchmark status" msgstr "Atjauno darbspējas mērījuma statusu" #: core.cpp:1918 msgid "Active" msgstr "Aktīvs" #: core.cpp:1921 #, c-format msgid "(%u hours left)" msgstr "(palika %u stundas)" #: core.cpp:1923 #, c-format msgid "(%u minutes left)" msgstr "(palika %u minūtes)" #: core.cpp:1925 #, c-format msgid "(%u seconds left)" msgstr "(palika %u sekundes)" #: core.cpp:1929 core.cpp:1984 core.cpp:1985 msgid "Inactive" msgstr "Nav aktīvs" #: core.cpp:1932 #, c-format msgid "in %u hours" msgstr "pēc %u stundām" #: core.cpp:1934 #, c-format msgid "in %u minutes" msgstr "pēc %u minūtēm" #: core.cpp:1936 #, c-format msgid "in %u seconds" msgstr "pēc %u sekundēm" #: core.cpp:1953 #, fuzzy, c-format #| msgid "Updating benchmark status" msgid "Starting benchmark with %u threads" msgstr "Atjauno darbspējas mērījuma statusu" #: core.cpp:1976 msgid "an error occurred while starting benchmark" msgstr "" #: core.cpp:2002 msgid "Finding CPU package in fallback mode" msgstr "" #: core.cpp:2032 #, fuzzy, c-format #| msgid "" #| "Your CPU does not belong in database ==> %s, model: %i, ext. model: %i, " #| "ext. family: %i" msgid "Your CPU socket is not present in the database ==> %s, codename: %s" msgstr "" "Jūsu procesors nav atrasts datubāzē ==> %s, modelis: %i, papl. modelis: %i, " "papl. ģimene: %i" #: core.cpp:2052 msgid "Calculating CPU multipliers in fallback mode" msgstr "" #: core.cpp:2072 msgid "Retrieving motherboard information in fallback mode" msgstr "" #: core.cpp:2085 msgid "failed to retrieve motherboard information (fallback mode)" msgstr "" #: core.cpp:2127 msgid "Retrieving CPU temperature in fallback mode" msgstr "" #: core.cpp:2173 msgid "failed to retrieve CPU temperature (fallback mode)" msgstr "" #: core.cpp:2188 msgid "Retrieving CPU voltage in fallback mode" msgstr "" #: core.cpp:2200 msgid "failed to retrieve CPU voltage (fallback mode)" msgstr "" #: core.cpp:2214 msgid "Retrieving CPU frequency in fallback mode" msgstr "" #: core.cpp:2220 msgid "failed to retrieve CPU frequency (fallback mode)" msgstr "" #: daemon_client.cpp:65 msgid "Starting daemon in background…" msgstr "" #: daemon_client.cpp:172 msgid "pkexec: authorization could not be obtained (dialog dismissed)" msgstr "" #: daemon_client.cpp:175 msgid "pkexec: authorization could not be obtained (not authorized)" msgstr "" #: daemon_client.cpp:178 msgid "pkexec: command not found" msgstr "" #: daemon_client.cpp:181 msgid "pkexec: unexpected error code" msgstr "" #: daemon_client.cpp:211 msgid "Connecting to daemon…" msgstr "" #: daemon_server.cpp:261 #, c-format msgid "request_handler: case %i not handled" msgstr "" #: data.cpp:124 cpu-x-gtk-3.12.ui:1370 msgid "CPU" msgstr "" #: data.cpp:187 msgid "P-core" msgstr "" #: data.cpp:188 msgid "E-core" msgstr "" #: data.cpp:189 data.cpp:192 msgid "Core" msgstr "" #: data.cpp:208 cpu-x-gtk-3.12.ui:746 msgid "Processor" msgstr "" #: data.cpp:240 data.cpp:329 cpu-x-gtk-3.12.ui:1968 msgid "Caches" msgstr "" #: data.cpp:247 #, fuzzy, c-format #| msgid "%d x %d %s, %d-way" msgid "%2d x %4d %s, %2d-way" msgstr "%d x %d %s, %d-direkcionāls" #: data.cpp:249 #, c-format msgid "%d %s, %d-way" msgstr "%d %s, %d-direkcionāls" #: data.cpp:263 msgid "Count" msgstr "" #: data.cpp:276 cpu-x-gtk-3.12.ui:968 msgid "Clocks" msgstr "" #: data.cpp:379 data.cpp:383 #, c-format msgid "L%u Cache" msgstr "" #: data.cpp:385 #, c-format msgid "%s associative, %d-%s line size" msgstr "" #: data.cpp:398 msgid "Test" msgstr "" #: data.cpp:409 data.cpp:423 cpu-x-gtk-3.12.ui:2146 cpu-x-gtk-3.12.ui:2517 msgid "Motherboard" msgstr "" #: data.cpp:437 cpu-x-gtk-3.12.ui:2367 msgid "BIOS" msgstr "" #: data.cpp:452 cpu-x-gtk-3.12.ui:2498 msgid "Chipset" msgstr "" #: data.cpp:467 data.cpp:569 cpu-x-gtk-3.12.ui:3156 cpu-x-gtk-3.12.ui:3761 msgid "Memory" msgstr "" #: data.cpp:483 #, c-format msgid "Stick %u" msgstr "" #: data.cpp:487 cpu-x-gtk-3.12.ui:3134 msgid "Sticks" msgstr "" #: data.cpp:541 cpu-x-gtk-3.12.ui:3780 msgid "System" msgstr "" #: data.cpp:554 cpu-x-gtk-3.12.ui:3380 msgid "Operating System" msgstr "" #: data.cpp:587 cpu-x-gtk-3.12.ui:4960 msgid "Graphics" msgstr "" #: data.cpp:621 #, c-format msgid "Card %u" msgstr "" #: data.cpp:625 cpu-x-gtk-3.12.ui:4938 msgid "Cards" msgstr "" #: data.cpp:672 cpu-x-gtk-3.12.ui:5300 msgid "Bench" msgstr "" #: data.cpp:685 msgid "Not started" msgstr "Nav palaists" #: data.cpp:688 cpu-x-gtk-3.12.ui:5070 msgid "Prime numbers (slow)" msgstr "" #: data.cpp:692 cpu-x-gtk-3.12.ui:5178 msgid "Prime numbers (fast)" msgstr "" #: data.cpp:696 cpu-x-gtk-3.12.ui:5281 msgid "Parameters" msgstr "" #: data.cpp:721 data.cpp:727 #, c-format msgid "%u mins" msgstr "%u minūtes" #: data.cpp:734 cpu-x-gtk-3.12.ui:5444 cpu-x-gtk-3.12.ui:5552 msgid "About" msgstr "" #: data.cpp:739 #, c-format msgid "" "%s is a Free software that gathers information\n" "on CPU, motherboard and more." msgstr "" #: data.cpp:744 msgid "About CPU-X" msgstr "" #: data.cpp:745 #, c-format msgid "Version %s" msgstr "" #: data.cpp:746 #, c-format msgid "Author: %s" msgstr "" #: data.cpp:747 #, c-format msgid "Site: %s" msgstr "" #: data.cpp:751 cpu-x-gtk-3.12.ui:5533 msgid "License" msgstr "" #: data.cpp:753 #, c-format msgid "This software is distributed under the terms of %s" msgstr "" #: data.cpp:754 main.cpp:176 msgid "This program comes with ABSOLUTELY NO WARRANTY" msgstr "" #: gui_gtk.cpp:61 #, c-format msgid "Cannot find path for '%s' file" msgstr "" #: gui_gtk.cpp:400 msgid "Start daemon" msgstr "" #: gui_gtk.cpp:403 msgid "Connected to daemon" msgstr "" #: gui_gtk.cpp:406 msgid "No polkit authentication agent found" msgstr "" #: gui_gtk.cpp:411 msgid "Ask password to start daemon in background" msgstr "" #: gui_gtk.cpp:415 msgid "Settings" msgstr "" #: gui_gtk.cpp:634 msgid "BaseFamily" msgstr "" #: gui_gtk.cpp:635 msgid "CPU display (\"true\") family (computed as BaseFamily+ExtendedFamily)" msgstr "" #: gui_gtk.cpp:636 msgid "BaseModel" msgstr "" #: gui_gtk.cpp:637 msgid "CPU display (\"true\") model (computed as (ExtendedModel<<4)+BaseModel)" msgstr "" #: gui_gtk.cpp:847 msgid "" "Identify the physically-labeled socket or board position where the memory " "device is located" msgstr "" #: gui_gtk.cpp:848 msgid "Identify the physically labeled bank where the memory device is located" msgstr "" #: gui_gtk.cpp:1052 msgid "User Mode Driver Version" msgstr "" #: gui_gtk.cpp:1066 msgid "Vulkan Ray Tracing" msgstr "" #: gui_gtk.cpp:1260 msgid "Starting GTK GUI…" msgstr "" #: gui_gtk.cpp:1272 msgid "failed to import UI in GtkBuilder" msgstr "" #: main.cpp:63 msgid "Start graphical user interface (GUI) (default)" msgstr "" #: main.cpp:64 msgid "Start text-based user interface (TUI)" msgstr "" #: main.cpp:65 msgid "Dump all data on standard output and exit" msgstr "" #: main.cpp:66 msgid "Run embedded command dmidecode and exit" msgstr "" #: main.cpp:67 msgid "Run embedded command bandwidth and exit" msgstr "" #: main.cpp:68 msgid "Set temperature unit (c[elsius]|f[ahrenheit]|k[elvin]|r[ankine])" msgstr "" #: main.cpp:69 msgid "Set custom time between two refreshes (in seconds)" msgstr "" #: main.cpp:70 msgid "Set default tab (integer)" msgstr "" #: main.cpp:71 msgid "Select core type to monitor (integer)" msgstr "" #: main.cpp:72 msgid "Select CPU core to monitor (integer)" msgstr "" #: main.cpp:73 msgid "Set custom bandwidth test for CPU caches speed (integer)" msgstr "" #: main.cpp:74 #, fuzzy #| msgid "failed to find graphic card driver (%s)" msgid "Select default memory stick (integer)" msgstr "nav atrasts grafiskā akseleratora draiveris (%s)" #: main.cpp:75 #, fuzzy #| msgid "failed to find graphic card driver (%s)" msgid "Select default graphic card (integer)" msgstr "nav atrasts grafiskā akseleratora draiveris (%s)" #: main.cpp:76 cpu-x-gtk-3.12.ui:5910 msgid "Start and connect to daemon" msgstr "" #: main.cpp:77 msgid "Verbose output" msgstr "" #: main.cpp:78 msgid "Print help and exit" msgstr "" #: main.cpp:79 msgid "Print version and exit" msgstr "" #: main.cpp:80 msgid "Print CPUID values in decimal (default is hexadeximal)" msgstr "" #: main.cpp:81 msgid "Disable colored output" msgstr "" #: main.cpp:82 msgid "Print information for debugging" msgstr "" #: main.cpp:83 msgid "Print required information to paste in an issue" msgstr "" #: main.cpp:84 msgid "Set key mapping for NCurses mode (a[rrows]|e[macs]|i[nverted-T]|v[im])" msgstr "" #: main.cpp:95 msgid "Add default command line arguments" msgstr "" #: main.cpp:96 msgid "Enforce the bus clock" msgstr "" #: main.cpp:97 msgid "" "Ignore CPU values reported by libcpuid (comma-separated values among 'temp', " "'volt' and 'freq')" msgstr "" #: main.cpp:98 msgid "Read CPUID raw data from a given file" msgstr "" #: main.cpp:99 msgid "Only print a message if CPU is not present in the database" msgstr "" #: main.cpp:126 #, c-format msgid "Usage: %s DISPLAY [OPTIONS]\n" msgstr "" #: main.cpp:127 msgid "Available DISPLAY:" msgstr "" #: main.cpp:135 msgid "Available OPTIONS:" msgstr "" #: main.cpp:144 msgid "Influenceable environment variables:" msgstr "" #: main.cpp:175 msgid "This is free software: you are free to change and redistribute it." msgstr "" #: main.cpp:177 #, c-format msgid "See the %s license: <%s>\n" msgstr "" #: main.cpp:184 #, c-format msgid "-- %-9s version: %s" msgstr "" #: main.cpp:381 #, c-format msgid "" "\n" "Oops, something was wrong! %s has received signal %d (%s) and has crashed." msgstr "" #: main.cpp:383 #, c-format msgid "" "\n" "Oops, something was wrong! %s has received signal %d (%s) and is trying to " "recover." msgstr "" #: main.cpp:407 msgid "You can open a new issue here, by filling the template as requested:" msgstr "" #: main.cpp:449 msgid "an error occurred while setting locale" msgstr "" #: options.cpp:124 #, c-format msgid "" "Selected CPU type (%u) is not a valid number (%u is the maximum for this CPU)" msgstr "" #: options.cpp:145 #, c-format msgid "" "Selected bandwidth test (%u) is not a valid number (%u is the maximum for " "this system)" msgstr "" #: options.cpp:168 #, c-format msgid "" "Selected RAM stick (%u) is not a valid number (%u is the maximum for this " "system)" msgstr "" #: options.cpp:188 #, c-format msgid "" "Selected graphic card (%u) is not a valid number (%u is the maximum for this " "system)" msgstr "" #: options.cpp:204 #, c-format msgid "failed to change CPU affinitiy to core %u" msgstr "" #: options.cpp:210 #, c-format msgid "" "Selected CPU core (%u) is not a valid number (%u is the maximum for this " "type of core)" msgstr "" #: options.cpp:284 #, c-format msgid "Selected tab (%u) is not a valid number (%u is the maximum)" msgstr "" #: tui_ncurses.cpp:111 msgid "Window is too small!" msgstr "" #: tui_ncurses.cpp:119 msgid "Press 'h' to see help." msgstr "" #: tui_ncurses.cpp:232 #, c-format msgid "Welcome in %s NCurses help!\n" msgstr "" #: tui_ncurses.cpp:233 msgid "This help describes how to use this Text-based User Interface." msgstr "" #: tui_ncurses.cpp:235 msgid "Global keys:" msgstr "" #: tui_ncurses.cpp:236 msgid "Press 'left' key or 'tab' key to switch in left tab." msgstr "" #: tui_ncurses.cpp:237 msgid "Press 'right' key or 'shift + tab' keys to switch in right tab." msgstr "" #: tui_ncurses.cpp:238 msgid "Press 'h' key to see this help." msgstr "" #: tui_ncurses.cpp:239 msgid "Press 'q' key to exit." msgstr "" #: tui_ncurses.cpp:241 msgid "CPU tab:" msgstr "" #: tui_ncurses.cpp:242 msgid "Press 'next page' key to decrease core type number to monitor." msgstr "" #: tui_ncurses.cpp:243 msgid "Press 'previous page' key to increase core type number to monitor." msgstr "" #: tui_ncurses.cpp:244 msgid "Press 'down' key to decrease CPU core number to monitor." msgstr "" #: tui_ncurses.cpp:245 msgid "Press 'up' key to increase CPU core number to monitor." msgstr "" #: tui_ncurses.cpp:247 msgid "Caches tab:" msgstr "" #: tui_ncurses.cpp:248 msgid "Press 'down' key to switch to previous test." msgstr "" #: tui_ncurses.cpp:249 msgid "Press 'up' key to switch to next test." msgstr "" #: tui_ncurses.cpp:251 msgid "Bench tab:" msgstr "" #: tui_ncurses.cpp:252 msgid "Press 'down' key to decrement benchmark duration." msgstr "" #: tui_ncurses.cpp:253 msgid "Press 'up' key to increment benchmark duration." msgstr "" #: tui_ncurses.cpp:254 msgid "Press 'next page' key to decrement number of threads to use." msgstr "" #: tui_ncurses.cpp:255 msgid "Press 'previous page' key to increment number of threads to use." msgstr "" #: tui_ncurses.cpp:256 msgid "Press 's' key to start/stop prime numbers (slow) benchmark." msgstr "" #: tui_ncurses.cpp:257 msgid "Press 'f' key to start/stop prime numbers (fast) benchmark." msgstr "" #: tui_ncurses.cpp:259 msgid "Graphics tab:" msgstr "" #: tui_ncurses.cpp:260 msgid "Press 'down' key to switch to previous graphic card." msgstr "" #: tui_ncurses.cpp:261 msgid "Press 'up' key to switch to next graphic card." msgstr "" #: tui_ncurses.cpp:263 msgid "Press any key to exit this help." msgstr "" #: tui_ncurses.cpp:640 msgid "Starting NCurses TUI…" msgstr "" #: tui_ncurses.cpp:649 msgid "" "FATAL ERROR: terminfo database could not be found (try to set TERMINFO " "environment variable)" msgstr "" #: tui_ncurses.cpp:654 #, c-format msgid "Failed to set up %s terminal (err=%i); falling back to %s" msgstr "" #: util.cpp:189 #, c-format msgid "cannot find unit in '%s' string at position %i" msgstr "" #: util.cpp:252 #, c-format msgid "an error occurred while opening file '%s'" msgstr "" #: util.cpp:297 #, c-format msgid "an error occurred while running command '%s'" msgstr "" #: util.cpp:437 msgid "set_cpu_affinity() not supported on this operating system" msgstr "" #: data.hpp:103 data.hpp:244 data.hpp:332 msgid "Vendor" msgstr "" #: data.hpp:104 msgid "Code Name" msgstr "" #: data.hpp:105 msgid "Package" msgstr "" #: data.hpp:106 msgid "Technology" msgstr "" #: data.hpp:107 data.hpp:268 msgid "Voltage" msgstr "" #: data.hpp:108 msgid "Specification" msgstr "" #: data.hpp:109 msgid "Family" msgstr "" #: data.hpp:110 msgid "Disp. Family" msgstr "" #: data.hpp:111 data.hpp:224 data.hpp:245 data.hpp:335 msgid "Model" msgstr "" #: data.hpp:112 msgid "Disp. Model" msgstr "" #: data.hpp:113 msgid "Temp." msgstr "" #: data.hpp:114 msgid "Stepping" msgstr "" #: data.hpp:115 msgid "Instructions" msgstr "" #: data.hpp:125 msgid "L1 Data" msgstr "" #: data.hpp:126 msgid "L1 Inst." msgstr "" #: data.hpp:127 msgid "Level 2" msgstr "" #: data.hpp:128 msgid "Level 3" msgstr "" #: data.hpp:137 cpu-x-gtk-3.12.ui:1232 msgid "Cores" msgstr "" #: data.hpp:138 data.hpp:408 cpu-x-gtk-3.12.ui:1252 msgid "Threads" msgstr "" #: data.hpp:155 msgid "Core Speed" msgstr "" #: data.hpp:156 msgid "Multiplier" msgstr "" #: data.hpp:157 msgid "Bus Speed" msgstr "" #: data.hpp:158 data.hpp:341 msgid "Usage" msgstr "" #: data.hpp:188 data.hpp:265 msgid "Size" msgstr "" #: data.hpp:189 data.hpp:267 msgid "Speed" msgstr "" #: data.hpp:223 data.hpp:259 msgid "Manufacturer" msgstr "" #: data.hpp:225 msgid "Revision" msgstr "" #: data.hpp:233 msgid "Brand" msgstr "" #: data.hpp:234 msgid "Version" msgstr "" #: data.hpp:235 msgid "Date" msgstr "" #: data.hpp:236 msgid "ROM Size" msgstr "" #: data.hpp:260 msgid "Part Number" msgstr "" #: data.hpp:261 msgid "Type" msgstr "" #: data.hpp:262 msgid "Type Detail" msgstr "" #: data.hpp:263 msgid "Device Locator" msgstr "" #: data.hpp:264 msgid "Bank Locator" msgstr "" #: data.hpp:266 msgid "Rank" msgstr "" #: data.hpp:292 msgid "Name" msgstr "" #: data.hpp:293 msgid "Kernel" msgstr "" #: data.hpp:294 msgid "Hostname" msgstr "" #: data.hpp:295 msgid "Uptime" msgstr "" #: data.hpp:303 msgid "Used" msgstr "" #: data.hpp:304 msgid "Buffers" msgstr "" #: data.hpp:305 msgid "Cached" msgstr "" #: data.hpp:306 msgid "Free" msgstr "" #: data.hpp:307 msgid "Swap" msgstr "" #: data.hpp:333 msgid "Driver" msgstr "" #: data.hpp:334 msgid "UMD Version" msgstr "" #: data.hpp:336 msgid "Compute Unit" msgstr "" #: data.hpp:337 msgid "Device ID" msgstr "" #: data.hpp:338 msgid "VBIOS Version" msgstr "" #. #-#-#-#-# source_ui.pot (cpu-x ) #-#-#-#-# #. Setting: "Interface" tab #: data.hpp:339 cpu-x-gtk-3.12.ui:5807 msgid "Interface" msgstr "" #: data.hpp:340 msgid "Temperature" msgstr "" #: data.hpp:342 msgid "Core Voltage" msgstr "" #: data.hpp:343 msgid "Power Avg" msgstr "" #: data.hpp:344 msgid "Core Clock" msgstr "" #: data.hpp:345 msgid "Memory Clock" msgstr "" #: data.hpp:346 msgid "Memory Used" msgstr "" #: data.hpp:347 msgid "Resizable BAR" msgstr "" #: data.hpp:348 msgid "Vulkan RT" msgstr "" #: data.hpp:349 msgid "OpenGL Version" msgstr "" #: data.hpp:350 msgid "Vulkan Version" msgstr "" #: data.hpp:351 msgid "OpenCL Version" msgstr "" #: data.hpp:387 msgid "Score" msgstr "" #: data.hpp:388 msgid "Run" msgstr "" #: data.hpp:407 msgid "Duration" msgstr "" #: util.hpp:77 msgid "bytes" msgstr "" #. TRANSLATORS: initials for kilobyte (10³): please put initials (keep it short) #: util.hpp:80 msgid "kB" msgstr "" #. TRANSLATORS: initials for megabyte (10⁶): please put initials (keep it short) #: util.hpp:82 msgid "MB" msgstr "" #. TRANSLATORS: initials for gigabyte (10⁹): please put initials (keep it short) #: util.hpp:84 msgid "GB" msgstr "" #. TRANSLATORS: initials for terabyte (10¹²): please put initials (keep it short) #: util.hpp:86 msgid "TB" msgstr "" #. TRANSLATORS: initials for kibibyte (2¹⁰): please put initials (keep it short) #: util.hpp:89 msgid "KiB" msgstr "" #. TRANSLATORS: initials for mebibyte (2²⁰): please put initials (keep it short) #: util.hpp:91 msgid "MiB" msgstr "" #. TRANSLATORS: initials for gibibyte (2³⁰): please put initials (keep it short) #: util.hpp:93 msgid "GiB" msgstr "" #. TRANSLATORS: initials for tebibyte (2⁴⁰): please put initials (keep it short) #: util.hpp:95 msgid "TiB" msgstr "" #: cpu-x-gtk-3.12.ui:1184 msgid "Cache" msgstr "" #. Setting: refresh time for UI #: cpu-x-gtk-3.12.ui:5721 msgid "Refresh time" msgstr "" #. Setting: GUI theme #: cpu-x-gtk-3.12.ui:5745 msgid "Text theme" msgstr "" #. Setting: automatic GUI theme #: cpu-x-gtk-3.12.ui:5760 msgid "Automatic" msgstr "" #. Setting: light GUI theme #: cpu-x-gtk-3.12.ui:5761 msgid "Blue for light theme" msgstr "" #. Setting: dark GUI theme #: cpu-x-gtk-3.12.ui:5762 msgid "Yellow for dark theme" msgstr "" #. Setting: temperature unit #: cpu-x-gtk-3.12.ui:5775 msgid "Temperature unit" msgstr "" #. Setting: default tab at startup #: cpu-x-gtk-3.12.ui:5826 msgid "Default tab" msgstr "" #. Setting: default CPU core at startup #: cpu-x-gtk-3.12.ui:5839 msgid "Default CPU core" msgstr "" #. Setting: default cache test at startup #: cpu-x-gtk-3.12.ui:5852 msgid "Default cache test" msgstr "" #. Setting: print CPUID values in decimal or hexadecimal #: cpu-x-gtk-3.12.ui:5895 msgid "Print CPUID values in decimal" msgstr "" #. Setting: default graphic card at startup #: cpu-x-gtk-3.12.ui:5928 #, fuzzy #| msgid "failed to find graphic card driver (%s)" msgid "Default graphic card" msgstr "nav atrasts grafiskā akseleratora draiveris (%s)" #. Setting: default CPU core at startup #: cpu-x-gtk-3.12.ui:5952 msgid "Default core type" msgstr "" #. Setting: default graphic card at startup #: cpu-x-gtk-3.12.ui:5976 msgid "Default memory stick" msgstr "" #. Setting: "Startup" tab #: cpu-x-gtk-3.12.ui:6004 msgid "Startup" msgstr "" #~ msgid "Calculating CPU multipliers" #~ msgstr "Izrēķinu CPU frekvences reizinātākus" #~ msgid "failed to retrieve GPU clocks" #~ msgstr "GPU frekvenču nolasīšana neveiksmīga" #, fuzzy, c-format #~| msgid "failed to call libcpuid (%s)" #~ msgid "failed to call wordexp (%i)" #~ msgstr "libcpuid izsaukšana neveiksmīga (%s)" #, fuzzy #~| msgid "could not reallocate memory" #~ msgid "FATAL ERROR: could not allocate memory" #~ msgstr "nav iespējams izdalīt atmiņu" #, fuzzy, c-format #~| msgid "failed to call dmidecode" #~ msgid "failed to call vkEnumerateInstanceExtensionProperties (%s)" #~ msgstr "Nav iespējams izsaukt dmidecode" #, fuzzy #~| msgid "failed to call dmidecode" #~ msgid "faild to call clGetDeviceIDs" #~ msgstr "Nav iespējams izsaukt dmidecode" #~ msgid "Exiting %s" #~ msgstr "Iziešana no %s" #~ msgid "Skip CPU MSR opening (need to be root)" #~ msgstr "" #~ "Tiek izlaista procesora MSR nolasīšana (nepieciešamas root tiesības)" #~ msgid "failed to open CPU MSR (%s)" #~ msgstr "Nav iespējams nolasīt procesora MSR (%s)" #~ msgid "Skip call to dmidecode (need to be root)" #~ msgstr "Tiek izlaista dmidecode izsaukšana (nepieciešamas root tiesības)" #~ msgid "failed to allocate memory for dmidecode" #~ msgstr "Nav iespējams izdalīt atmiņu priekš dmidecode" #~ msgid "Finding graphic card driver" #~ msgstr "Grafikas akseleratora draivera meklēšana" #~ msgid "(%s driver)" #~ msgstr "(%s draiveris)" #~ msgid "Retrieving GPU temperature" #~ msgstr "GPU temperatūras nolasīšana" #~ msgid "Off" #~ msgstr "Izslēgts" #~ msgid "failed to retrieve GPU temperature" #~ msgstr "GPU temperatūras noteikšana neveiksmīga" #~ msgid "Skip some GPU values (need to be root)" #~ msgstr "Izlaist dažus GPU parametrus (nepieciešamas root tiesības)" CPU-X-5.0.3/po/ml.po000066400000000000000000000655311454622605200137610ustar00rootroot00000000000000# CPU-X translations template # Copyright © 2014-2024 The Tumultuous Unicorn Of Darkness # This file is distributed under the same license as the cpu-x package. # Goutham Krishna , 2021. msgid "" msgstr "" "Project-Id-Version: cpu-x\n" "Report-Msgid-Bugs-To: https://github.com/TheTumultuousUnicornOfDarkness/CPU-" "X/issues\n" "POT-Creation-Date: 2023-12-09 13:09+0100\n" "PO-Revision-Date: 2021-10-16 19:26+0000\n" "Last-Translator: Goutham Krishna \n" "Language-Team: Malayalam \n" "Language: ml\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-dev\n" #: core.cpp:135 msgid "Finding CPU technology" msgstr "സിപിയു സാങ്കേതികവിദ്യ കണ്ടെത്തുന്നു" #: core.cpp:161 #, c-format msgid "" "Your CPU is not present in the database ==> %s, model: %i, ext. model: %i, " "ext. family: %i" msgstr "" "നിങ്ങളുടെ സിപിയു ഡാറ്റാബേസിൽ ഇല്ല ==> %s, മോഡൽ: %i, വിപുലമായ മോഡൽ: %i, വിപുലമായ " "കുടുംബം: %i" #: core.cpp:189 data.cpp:150 data.cpp:342 msgid "unknown" msgstr "" #: core.cpp:230 msgid "Calling libcpuid for retrieving static data" msgstr "നിശ്ചിത അടിസ്ഥാനവിവരം വീണ്ടെടുക്കുന്നതിനായി libcpuid വിളിക്കുന്നു" #: core.cpp:245 #, c-format msgid "failed to call libcpuid (%s)" msgstr "libcpuid വിളിക്കുന്നതിൽ പരാജയപ്പെട്ടു (%s)" #: core.cpp:340 msgid "Calling libcpuid for retrieving dynamic data" msgstr "അസ്ഥിരമായ അടിസ്ഥാനവിവരം വീണ്ടെടുക്കുന്നതിനായി libcpuid വിളിക്കുന്നു" #: core.cpp:353 msgid "Calling libcpuid for retrieving CPU MSR static values" msgstr "CPU MSR നിശ്ചിത അളവുകൾ വീണ്ടെടുക്കുന്നതിന് libcpuid വിളിക്കുന്നു" #: core.cpp:380 msgid "Calling libcpuid for retrieving CPU MSR dynamic values" msgstr "അളവുകൾ CPU MSR ചലനാത്മക അളവുകൾ വീണ്ടെടുക്കാൻ libcpuid- നെ വിളിക്കുന്നു" #: core.cpp:412 msgid "Calling dmidecode" msgstr "dmidecode വിളിക്കുന്നു" #: core.cpp:454 core.cpp:473 #, c-format msgid "%s (configured)" msgstr "" #: core.cpp:461 core.cpp:480 #, c-format msgid "%s (max)" msgstr "" #: core.cpp:466 #, c-format msgid "%s (min)" msgstr "" #: core.cpp:496 msgid "Calculating CPU usage" msgstr "സിപിയു ഉപയോഗം കണക്കാക്കുന്നു" #: core.cpp:546 msgid "Calling bandwidth" msgstr "കോളിന്റെ ബാൻഡ്‌വിഡ്ത്ത്" #: core.cpp:613 #, c-format msgid "" "pci_access is not properly initialized: it is a common issue when %s was " "built with a lower libpci version.\n" "Check that libpci %s library is present on your system. Otherwise, please " "rebuild %s." msgstr "" #: core.cpp:657 #, c-format msgid "No kernel driver in use for graphic card at path %s" msgstr "" #: core.cpp:693 #, c-format msgid "Your GPU kernel driver is unknown: %s" msgstr "നിങ്ങളുടെ GPU കേർണൽ ഡ്രൈവർ അജ്ഞാതമാണ്: %s" #: core.cpp:777 #, fuzzy, c-format #| msgid "Your GPU user mode driver is unknown: %s" msgid "Your GPU user mode driver is unknown for vendor %s: %s" msgstr "നിങ്ങളുടെ ജിപിയു ഉപയോക്തൃ മോഡ് ഡ്രൈവർ അജ്ഞാതമാണ്: %s" #: core.cpp:781 #, c-format msgid "failed to call GLFW (%i): %s" msgstr "" #: core.cpp:914 msgid "Finding Vulkan API version" msgstr "" #: core.cpp:926 #, fuzzy, c-format #| msgid "failed to call libcpuid (%s)" msgid "failed to call vkCreateInstance (%s)" msgstr "libcpuid വിളിക്കുന്നതിൽ പരാജയപ്പെട്ടു (%s)" #: core.cpp:929 #, c-format msgid "%s is not supported" msgstr "" #: core.cpp:937 #, fuzzy, c-format #| msgid "failed to call libcpuid (%s)" msgid "failed to call vkEnumeratePhysicalDevices (%s)" msgstr "libcpuid വിളിക്കുന്നതിൽ പരാജയപ്പെട്ടു (%s)" #: core.cpp:944 msgid "No available Vulkan devices" msgstr "" #: core.cpp:952 #, fuzzy, c-format #| msgid "failed to call libcpuid (%s)" msgid "No available physical devices (%s)" msgstr "libcpuid വിളിക്കുന്നതിൽ പരാജയപ്പെട്ടു (%s)" #: core.cpp:1015 #, fuzzy, c-format #| msgid "failed to call libcpuid (%s)" msgid "Failed to create Vulkan for device %u (%s)" msgstr "libcpuid വിളിക്കുന്നതിൽ പരാജയപ്പെട്ടു (%s)" #: core.cpp:1019 #, c-format msgid "%s is not supported for device %u, use only deviceID for matching" msgstr "" #: core.cpp:1051 core.cpp:1364 msgid "Enabled" msgstr "" #: core.cpp:1051 core.cpp:1364 msgid "Disabled" msgstr "" #: core.cpp:1088 msgid "Finding OpenCL API version" msgstr "" #: core.cpp:1092 #, c-format msgid "There is no platform with OpenCL support (%s)" msgstr "" #: core.cpp:1102 #, c-format msgid "failed to get all OpenCL platforms (%s)" msgstr "" #: core.cpp:1115 #, c-format msgid "failed to get name for platform %u (%s)" msgstr "" #: core.cpp:1123 #, c-format msgid "failed to get version for platform %u (%s)" msgstr "" #: core.cpp:1131 #, c-format msgid "failed to find number of OpenCL devices for platform '%s %s' (%s)" msgstr "" #: core.cpp:1131 msgid "0 device" msgstr "" #: core.cpp:1140 #, c-format msgid "failed to get all of OpenCL devices for platform '%s %s' (%s)" msgstr "" #: core.cpp:1160 #, c-format msgid "failed to get name for device %u (%s)" msgstr "" #: core.cpp:1168 #, c-format msgid "failed to get version for device %u (%s)" msgstr "" #: core.cpp:1190 #, c-format msgid "OpenCL driver for '%s %s' does not support CL_DEVICE_TOPOLOGY_AMD (%s)" msgstr "" #: core.cpp:1201 #, c-format msgid "" "OpenCL driver for '%s %s' does not support CL_DEVICE_GFXIP_MAJOR_AMD (%s)" msgstr "" #: core.cpp:1209 core.cpp:1229 core.cpp:1262 #, c-format msgid "" "OpenCL driver for '%s %s' does not support CL_DEVICE_MAX_COMPUTE_UNITS (%s)" msgstr "" #: core.cpp:1250 #, c-format msgid "" "OpenCL driver for '%s %s' does not support CL_DEVICE_PCI_DOMAIN_ID_NV (%s), " "CL_DEVICE_PCI_BUS_ID_NV (%s) or CL_DEVICE_PCI_SLOT_ID_NV (%s)" msgstr "" #: core.cpp:1273 #, c-format msgid "OpenCL is not supported with your GPU vendor (0x%X)" msgstr "" #: core.cpp:1295 msgid "Finding devices" msgstr "" #: core.cpp:1307 #, c-format msgid "Skip devices search (wrong permissions on %s device)" msgstr "" #: core.cpp:1350 #, c-format msgid "Your GPU vendor is unknown: %s (0x%X)" msgstr "" #: core.cpp:1370 msgid "failed to find chipset vendor and model" msgstr "" #: core.cpp:1385 msgid "failed to find graphic card vendor and model" msgstr "" #: core.cpp:1487 msgid "Retrieving GPU clocks" msgstr "" #: core.cpp:1500 msgid "None" msgstr "" #: core.cpp:1509 #, c-format msgid "DRM path for %s is unknown" msgstr "" #: core.cpp:1516 #, c-format msgid "Card number for %s is unknown" msgstr "" #: core.cpp:1541 #, c-format msgid "PCIe %s (current) / %s (max)" msgstr "" #: core.cpp:1650 #, c-format msgid "Driver for %s doesn't report frequencies" msgstr "" #: core.cpp:1671 #, c-format msgid "failed to retrieve all monitoring data for %s" msgstr "" #: core.cpp:1694 msgid "Identifying running system" msgstr "" #: core.cpp:1697 msgid "failed to identify running system" msgstr "" #: core.cpp:1749 core.cpp:1778 msgid "Calling libprocps" msgstr "" #: core.cpp:1752 msgid "unable to get system uptime" msgstr "" #: core.cpp:1758 msgid "unable to create meminfo structure" msgstr "" #: core.cpp:1804 msgid "Calling libstatgrab" msgstr "" #: core.cpp:1852 #, c-format msgid "%i days, %i hours, %i minutes, %i seconds" msgstr "" #: core.cpp:1915 msgid "Updating benchmark status" msgstr "" #: core.cpp:1918 msgid "Active" msgstr "" #: core.cpp:1921 #, c-format msgid "(%u hours left)" msgstr "" #: core.cpp:1923 #, c-format msgid "(%u minutes left)" msgstr "" #: core.cpp:1925 #, c-format msgid "(%u seconds left)" msgstr "" #: core.cpp:1929 core.cpp:1984 core.cpp:1985 msgid "Inactive" msgstr "" #: core.cpp:1932 #, c-format msgid "in %u hours" msgstr "" #: core.cpp:1934 #, c-format msgid "in %u minutes" msgstr "" #: core.cpp:1936 #, c-format msgid "in %u seconds" msgstr "" #: core.cpp:1953 #, c-format msgid "Starting benchmark with %u threads" msgstr "" #: core.cpp:1976 msgid "an error occurred while starting benchmark" msgstr "" #: core.cpp:2002 msgid "Finding CPU package in fallback mode" msgstr "" #: core.cpp:2032 #, c-format msgid "Your CPU socket is not present in the database ==> %s, codename: %s" msgstr "" #: core.cpp:2052 msgid "Calculating CPU multipliers in fallback mode" msgstr "" #: core.cpp:2072 msgid "Retrieving motherboard information in fallback mode" msgstr "" #: core.cpp:2085 msgid "failed to retrieve motherboard information (fallback mode)" msgstr "" #: core.cpp:2127 msgid "Retrieving CPU temperature in fallback mode" msgstr "" #: core.cpp:2173 msgid "failed to retrieve CPU temperature (fallback mode)" msgstr "" #: core.cpp:2188 msgid "Retrieving CPU voltage in fallback mode" msgstr "" #: core.cpp:2200 msgid "failed to retrieve CPU voltage (fallback mode)" msgstr "" #: core.cpp:2214 msgid "Retrieving CPU frequency in fallback mode" msgstr "" #: core.cpp:2220 msgid "failed to retrieve CPU frequency (fallback mode)" msgstr "" #: daemon_client.cpp:65 msgid "Starting daemon in background…" msgstr "" #: daemon_client.cpp:172 msgid "pkexec: authorization could not be obtained (dialog dismissed)" msgstr "" #: daemon_client.cpp:175 msgid "pkexec: authorization could not be obtained (not authorized)" msgstr "" #: daemon_client.cpp:178 msgid "pkexec: command not found" msgstr "" #: daemon_client.cpp:181 msgid "pkexec: unexpected error code" msgstr "" #: daemon_client.cpp:211 msgid "Connecting to daemon…" msgstr "" #: daemon_server.cpp:261 #, c-format msgid "request_handler: case %i not handled" msgstr "" #: data.cpp:124 cpu-x-gtk-3.12.ui:1370 msgid "CPU" msgstr "" #: data.cpp:187 msgid "P-core" msgstr "" #: data.cpp:188 msgid "E-core" msgstr "" #: data.cpp:189 data.cpp:192 msgid "Core" msgstr "" #: data.cpp:208 cpu-x-gtk-3.12.ui:746 msgid "Processor" msgstr "" #: data.cpp:240 data.cpp:329 cpu-x-gtk-3.12.ui:1968 msgid "Caches" msgstr "" #: data.cpp:247 #, c-format msgid "%2d x %4d %s, %2d-way" msgstr "" #: data.cpp:249 #, c-format msgid "%d %s, %d-way" msgstr "" #: data.cpp:263 msgid "Count" msgstr "" #: data.cpp:276 cpu-x-gtk-3.12.ui:968 msgid "Clocks" msgstr "" #: data.cpp:379 data.cpp:383 #, c-format msgid "L%u Cache" msgstr "" #: data.cpp:385 #, c-format msgid "%s associative, %d-%s line size" msgstr "" #: data.cpp:398 msgid "Test" msgstr "" #: data.cpp:409 data.cpp:423 cpu-x-gtk-3.12.ui:2146 cpu-x-gtk-3.12.ui:2517 msgid "Motherboard" msgstr "" #: data.cpp:437 cpu-x-gtk-3.12.ui:2367 msgid "BIOS" msgstr "" #: data.cpp:452 cpu-x-gtk-3.12.ui:2498 msgid "Chipset" msgstr "" #: data.cpp:467 data.cpp:569 cpu-x-gtk-3.12.ui:3156 cpu-x-gtk-3.12.ui:3761 msgid "Memory" msgstr "" #: data.cpp:483 #, c-format msgid "Stick %u" msgstr "" #: data.cpp:487 cpu-x-gtk-3.12.ui:3134 msgid "Sticks" msgstr "" #: data.cpp:541 cpu-x-gtk-3.12.ui:3780 msgid "System" msgstr "" #: data.cpp:554 cpu-x-gtk-3.12.ui:3380 msgid "Operating System" msgstr "" #: data.cpp:587 cpu-x-gtk-3.12.ui:4960 msgid "Graphics" msgstr "" #: data.cpp:621 #, c-format msgid "Card %u" msgstr "" #: data.cpp:625 cpu-x-gtk-3.12.ui:4938 msgid "Cards" msgstr "" #: data.cpp:672 cpu-x-gtk-3.12.ui:5300 msgid "Bench" msgstr "" #: data.cpp:685 msgid "Not started" msgstr "" #: data.cpp:688 cpu-x-gtk-3.12.ui:5070 msgid "Prime numbers (slow)" msgstr "" #: data.cpp:692 cpu-x-gtk-3.12.ui:5178 msgid "Prime numbers (fast)" msgstr "" #: data.cpp:696 cpu-x-gtk-3.12.ui:5281 msgid "Parameters" msgstr "" #: data.cpp:721 data.cpp:727 #, c-format msgid "%u mins" msgstr "" #: data.cpp:734 cpu-x-gtk-3.12.ui:5444 cpu-x-gtk-3.12.ui:5552 msgid "About" msgstr "" #: data.cpp:739 #, c-format msgid "" "%s is a Free software that gathers information\n" "on CPU, motherboard and more." msgstr "" #: data.cpp:744 msgid "About CPU-X" msgstr "" #: data.cpp:745 #, c-format msgid "Version %s" msgstr "" #: data.cpp:746 #, c-format msgid "Author: %s" msgstr "" #: data.cpp:747 #, c-format msgid "Site: %s" msgstr "" #: data.cpp:751 cpu-x-gtk-3.12.ui:5533 msgid "License" msgstr "" #: data.cpp:753 #, c-format msgid "This software is distributed under the terms of %s" msgstr "" #: data.cpp:754 main.cpp:176 msgid "This program comes with ABSOLUTELY NO WARRANTY" msgstr "" #: gui_gtk.cpp:61 #, c-format msgid "Cannot find path for '%s' file" msgstr "" #: gui_gtk.cpp:400 msgid "Start daemon" msgstr "" #: gui_gtk.cpp:403 msgid "Connected to daemon" msgstr "" #: gui_gtk.cpp:406 msgid "No polkit authentication agent found" msgstr "" #: gui_gtk.cpp:411 msgid "Ask password to start daemon in background" msgstr "" #: gui_gtk.cpp:415 msgid "Settings" msgstr "" #: gui_gtk.cpp:634 msgid "BaseFamily" msgstr "" #: gui_gtk.cpp:635 msgid "CPU display (\"true\") family (computed as BaseFamily+ExtendedFamily)" msgstr "" #: gui_gtk.cpp:636 msgid "BaseModel" msgstr "" #: gui_gtk.cpp:637 msgid "CPU display (\"true\") model (computed as (ExtendedModel<<4)+BaseModel)" msgstr "" #: gui_gtk.cpp:847 msgid "" "Identify the physically-labeled socket or board position where the memory " "device is located" msgstr "" #: gui_gtk.cpp:848 msgid "Identify the physically labeled bank where the memory device is located" msgstr "" #: gui_gtk.cpp:1052 msgid "User Mode Driver Version" msgstr "" #: gui_gtk.cpp:1066 msgid "Vulkan Ray Tracing" msgstr "" #: gui_gtk.cpp:1260 msgid "Starting GTK GUI…" msgstr "" #: gui_gtk.cpp:1272 msgid "failed to import UI in GtkBuilder" msgstr "" #: main.cpp:63 msgid "Start graphical user interface (GUI) (default)" msgstr "" #: main.cpp:64 msgid "Start text-based user interface (TUI)" msgstr "" #: main.cpp:65 msgid "Dump all data on standard output and exit" msgstr "" #: main.cpp:66 msgid "Run embedded command dmidecode and exit" msgstr "" #: main.cpp:67 msgid "Run embedded command bandwidth and exit" msgstr "" #: main.cpp:68 msgid "Set temperature unit (c[elsius]|f[ahrenheit]|k[elvin]|r[ankine])" msgstr "" #: main.cpp:69 msgid "Set custom time between two refreshes (in seconds)" msgstr "" #: main.cpp:70 msgid "Set default tab (integer)" msgstr "" #: main.cpp:71 msgid "Select core type to monitor (integer)" msgstr "" #: main.cpp:72 msgid "Select CPU core to monitor (integer)" msgstr "" #: main.cpp:73 msgid "Set custom bandwidth test for CPU caches speed (integer)" msgstr "" #: main.cpp:74 msgid "Select default memory stick (integer)" msgstr "" #: main.cpp:75 msgid "Select default graphic card (integer)" msgstr "" #: main.cpp:76 cpu-x-gtk-3.12.ui:5910 msgid "Start and connect to daemon" msgstr "" #: main.cpp:77 msgid "Verbose output" msgstr "" #: main.cpp:78 msgid "Print help and exit" msgstr "" #: main.cpp:79 msgid "Print version and exit" msgstr "" #: main.cpp:80 msgid "Print CPUID values in decimal (default is hexadeximal)" msgstr "" #: main.cpp:81 msgid "Disable colored output" msgstr "" #: main.cpp:82 msgid "Print information for debugging" msgstr "" #: main.cpp:83 msgid "Print required information to paste in an issue" msgstr "" #: main.cpp:84 msgid "Set key mapping for NCurses mode (a[rrows]|e[macs]|i[nverted-T]|v[im])" msgstr "" #: main.cpp:95 msgid "Add default command line arguments" msgstr "" #: main.cpp:96 msgid "Enforce the bus clock" msgstr "" #: main.cpp:97 msgid "" "Ignore CPU values reported by libcpuid (comma-separated values among 'temp', " "'volt' and 'freq')" msgstr "" #: main.cpp:98 msgid "Read CPUID raw data from a given file" msgstr "" #: main.cpp:99 msgid "Only print a message if CPU is not present in the database" msgstr "" #: main.cpp:126 #, c-format msgid "Usage: %s DISPLAY [OPTIONS]\n" msgstr "" #: main.cpp:127 msgid "Available DISPLAY:" msgstr "" #: main.cpp:135 msgid "Available OPTIONS:" msgstr "" #: main.cpp:144 msgid "Influenceable environment variables:" msgstr "" #: main.cpp:175 msgid "This is free software: you are free to change and redistribute it." msgstr "" #: main.cpp:177 #, c-format msgid "See the %s license: <%s>\n" msgstr "" #: main.cpp:184 #, c-format msgid "-- %-9s version: %s" msgstr "" #: main.cpp:381 #, c-format msgid "" "\n" "Oops, something was wrong! %s has received signal %d (%s) and has crashed." msgstr "" #: main.cpp:383 #, c-format msgid "" "\n" "Oops, something was wrong! %s has received signal %d (%s) and is trying to " "recover." msgstr "" #: main.cpp:407 msgid "You can open a new issue here, by filling the template as requested:" msgstr "" #: main.cpp:449 msgid "an error occurred while setting locale" msgstr "" #: options.cpp:124 #, c-format msgid "" "Selected CPU type (%u) is not a valid number (%u is the maximum for this CPU)" msgstr "" #: options.cpp:145 #, c-format msgid "" "Selected bandwidth test (%u) is not a valid number (%u is the maximum for " "this system)" msgstr "" #: options.cpp:168 #, c-format msgid "" "Selected RAM stick (%u) is not a valid number (%u is the maximum for this " "system)" msgstr "" #: options.cpp:188 #, c-format msgid "" "Selected graphic card (%u) is not a valid number (%u is the maximum for this " "system)" msgstr "" #: options.cpp:204 #, c-format msgid "failed to change CPU affinitiy to core %u" msgstr "" #: options.cpp:210 #, c-format msgid "" "Selected CPU core (%u) is not a valid number (%u is the maximum for this " "type of core)" msgstr "" #: options.cpp:284 #, c-format msgid "Selected tab (%u) is not a valid number (%u is the maximum)" msgstr "" #: tui_ncurses.cpp:111 msgid "Window is too small!" msgstr "" #: tui_ncurses.cpp:119 msgid "Press 'h' to see help." msgstr "" #: tui_ncurses.cpp:232 #, c-format msgid "Welcome in %s NCurses help!\n" msgstr "" #: tui_ncurses.cpp:233 msgid "This help describes how to use this Text-based User Interface." msgstr "" #: tui_ncurses.cpp:235 msgid "Global keys:" msgstr "" #: tui_ncurses.cpp:236 msgid "Press 'left' key or 'tab' key to switch in left tab." msgstr "" #: tui_ncurses.cpp:237 msgid "Press 'right' key or 'shift + tab' keys to switch in right tab." msgstr "" #: tui_ncurses.cpp:238 msgid "Press 'h' key to see this help." msgstr "" #: tui_ncurses.cpp:239 msgid "Press 'q' key to exit." msgstr "" #: tui_ncurses.cpp:241 msgid "CPU tab:" msgstr "" #: tui_ncurses.cpp:242 msgid "Press 'next page' key to decrease core type number to monitor." msgstr "" #: tui_ncurses.cpp:243 msgid "Press 'previous page' key to increase core type number to monitor." msgstr "" #: tui_ncurses.cpp:244 msgid "Press 'down' key to decrease CPU core number to monitor." msgstr "" #: tui_ncurses.cpp:245 msgid "Press 'up' key to increase CPU core number to monitor." msgstr "" #: tui_ncurses.cpp:247 msgid "Caches tab:" msgstr "" #: tui_ncurses.cpp:248 msgid "Press 'down' key to switch to previous test." msgstr "" #: tui_ncurses.cpp:249 msgid "Press 'up' key to switch to next test." msgstr "" #: tui_ncurses.cpp:251 msgid "Bench tab:" msgstr "" #: tui_ncurses.cpp:252 msgid "Press 'down' key to decrement benchmark duration." msgstr "" #: tui_ncurses.cpp:253 msgid "Press 'up' key to increment benchmark duration." msgstr "" #: tui_ncurses.cpp:254 msgid "Press 'next page' key to decrement number of threads to use." msgstr "" #: tui_ncurses.cpp:255 msgid "Press 'previous page' key to increment number of threads to use." msgstr "" #: tui_ncurses.cpp:256 msgid "Press 's' key to start/stop prime numbers (slow) benchmark." msgstr "" #: tui_ncurses.cpp:257 msgid "Press 'f' key to start/stop prime numbers (fast) benchmark." msgstr "" #: tui_ncurses.cpp:259 msgid "Graphics tab:" msgstr "" #: tui_ncurses.cpp:260 msgid "Press 'down' key to switch to previous graphic card." msgstr "" #: tui_ncurses.cpp:261 msgid "Press 'up' key to switch to next graphic card." msgstr "" #: tui_ncurses.cpp:263 msgid "Press any key to exit this help." msgstr "" #: tui_ncurses.cpp:640 msgid "Starting NCurses TUI…" msgstr "" #: tui_ncurses.cpp:649 msgid "" "FATAL ERROR: terminfo database could not be found (try to set TERMINFO " "environment variable)" msgstr "" #: tui_ncurses.cpp:654 #, c-format msgid "Failed to set up %s terminal (err=%i); falling back to %s" msgstr "" #: util.cpp:189 #, c-format msgid "cannot find unit in '%s' string at position %i" msgstr "" #: util.cpp:252 #, c-format msgid "an error occurred while opening file '%s'" msgstr "" #: util.cpp:297 #, c-format msgid "an error occurred while running command '%s'" msgstr "" #: util.cpp:437 msgid "set_cpu_affinity() not supported on this operating system" msgstr "" #: data.hpp:103 data.hpp:244 data.hpp:332 msgid "Vendor" msgstr "" #: data.hpp:104 msgid "Code Name" msgstr "" #: data.hpp:105 msgid "Package" msgstr "" #: data.hpp:106 msgid "Technology" msgstr "" #: data.hpp:107 data.hpp:268 msgid "Voltage" msgstr "" #: data.hpp:108 msgid "Specification" msgstr "" #: data.hpp:109 msgid "Family" msgstr "" #: data.hpp:110 msgid "Disp. Family" msgstr "" #: data.hpp:111 data.hpp:224 data.hpp:245 data.hpp:335 msgid "Model" msgstr "" #: data.hpp:112 msgid "Disp. Model" msgstr "" #: data.hpp:113 msgid "Temp." msgstr "" #: data.hpp:114 msgid "Stepping" msgstr "" #: data.hpp:115 msgid "Instructions" msgstr "" #: data.hpp:125 msgid "L1 Data" msgstr "" #: data.hpp:126 msgid "L1 Inst." msgstr "" #: data.hpp:127 msgid "Level 2" msgstr "" #: data.hpp:128 msgid "Level 3" msgstr "" #: data.hpp:137 cpu-x-gtk-3.12.ui:1232 msgid "Cores" msgstr "" #: data.hpp:138 data.hpp:408 cpu-x-gtk-3.12.ui:1252 msgid "Threads" msgstr "" #: data.hpp:155 msgid "Core Speed" msgstr "" #: data.hpp:156 msgid "Multiplier" msgstr "" #: data.hpp:157 msgid "Bus Speed" msgstr "" #: data.hpp:158 data.hpp:341 msgid "Usage" msgstr "" #: data.hpp:188 data.hpp:265 msgid "Size" msgstr "" #: data.hpp:189 data.hpp:267 msgid "Speed" msgstr "" #: data.hpp:223 data.hpp:259 msgid "Manufacturer" msgstr "" #: data.hpp:225 msgid "Revision" msgstr "" #: data.hpp:233 msgid "Brand" msgstr "" #: data.hpp:234 msgid "Version" msgstr "" #: data.hpp:235 msgid "Date" msgstr "" #: data.hpp:236 msgid "ROM Size" msgstr "" #: data.hpp:260 msgid "Part Number" msgstr "" #: data.hpp:261 msgid "Type" msgstr "" #: data.hpp:262 msgid "Type Detail" msgstr "" #: data.hpp:263 msgid "Device Locator" msgstr "" #: data.hpp:264 msgid "Bank Locator" msgstr "" #: data.hpp:266 msgid "Rank" msgstr "" #: data.hpp:292 msgid "Name" msgstr "" #: data.hpp:293 msgid "Kernel" msgstr "" #: data.hpp:294 msgid "Hostname" msgstr "" #: data.hpp:295 msgid "Uptime" msgstr "" #: data.hpp:303 msgid "Used" msgstr "" #: data.hpp:304 msgid "Buffers" msgstr "" #: data.hpp:305 msgid "Cached" msgstr "" #: data.hpp:306 msgid "Free" msgstr "" #: data.hpp:307 msgid "Swap" msgstr "" #: data.hpp:333 msgid "Driver" msgstr "" #: data.hpp:334 msgid "UMD Version" msgstr "" #: data.hpp:336 msgid "Compute Unit" msgstr "" #: data.hpp:337 msgid "Device ID" msgstr "" #: data.hpp:338 msgid "VBIOS Version" msgstr "" #. #-#-#-#-# source_ui.pot (cpu-x ) #-#-#-#-# #. Setting: "Interface" tab #: data.hpp:339 cpu-x-gtk-3.12.ui:5807 msgid "Interface" msgstr "" #: data.hpp:340 msgid "Temperature" msgstr "" #: data.hpp:342 msgid "Core Voltage" msgstr "" #: data.hpp:343 msgid "Power Avg" msgstr "" #: data.hpp:344 msgid "Core Clock" msgstr "" #: data.hpp:345 msgid "Memory Clock" msgstr "" #: data.hpp:346 msgid "Memory Used" msgstr "" #: data.hpp:347 msgid "Resizable BAR" msgstr "" #: data.hpp:348 msgid "Vulkan RT" msgstr "" #: data.hpp:349 msgid "OpenGL Version" msgstr "" #: data.hpp:350 msgid "Vulkan Version" msgstr "" #: data.hpp:351 msgid "OpenCL Version" msgstr "" #: data.hpp:387 msgid "Score" msgstr "" #: data.hpp:388 msgid "Run" msgstr "" #: data.hpp:407 msgid "Duration" msgstr "" #: util.hpp:77 msgid "bytes" msgstr "" #. TRANSLATORS: initials for kilobyte (10³): please put initials (keep it short) #: util.hpp:80 msgid "kB" msgstr "" #. TRANSLATORS: initials for megabyte (10⁶): please put initials (keep it short) #: util.hpp:82 msgid "MB" msgstr "" #. TRANSLATORS: initials for gigabyte (10⁹): please put initials (keep it short) #: util.hpp:84 msgid "GB" msgstr "" #. TRANSLATORS: initials for terabyte (10¹²): please put initials (keep it short) #: util.hpp:86 msgid "TB" msgstr "" #. TRANSLATORS: initials for kibibyte (2¹⁰): please put initials (keep it short) #: util.hpp:89 msgid "KiB" msgstr "" #. TRANSLATORS: initials for mebibyte (2²⁰): please put initials (keep it short) #: util.hpp:91 msgid "MiB" msgstr "" #. TRANSLATORS: initials for gibibyte (2³⁰): please put initials (keep it short) #: util.hpp:93 msgid "GiB" msgstr "" #. TRANSLATORS: initials for tebibyte (2⁴⁰): please put initials (keep it short) #: util.hpp:95 msgid "TiB" msgstr "" #: cpu-x-gtk-3.12.ui:1184 msgid "Cache" msgstr "" #. Setting: refresh time for UI #: cpu-x-gtk-3.12.ui:5721 msgid "Refresh time" msgstr "" #. Setting: GUI theme #: cpu-x-gtk-3.12.ui:5745 msgid "Text theme" msgstr "" #. Setting: automatic GUI theme #: cpu-x-gtk-3.12.ui:5760 msgid "Automatic" msgstr "" #. Setting: light GUI theme #: cpu-x-gtk-3.12.ui:5761 msgid "Blue for light theme" msgstr "" #. Setting: dark GUI theme #: cpu-x-gtk-3.12.ui:5762 msgid "Yellow for dark theme" msgstr "" #. Setting: temperature unit #: cpu-x-gtk-3.12.ui:5775 msgid "Temperature unit" msgstr "" #. Setting: default tab at startup #: cpu-x-gtk-3.12.ui:5826 msgid "Default tab" msgstr "" #. Setting: default CPU core at startup #: cpu-x-gtk-3.12.ui:5839 msgid "Default CPU core" msgstr "" #. Setting: default cache test at startup #: cpu-x-gtk-3.12.ui:5852 msgid "Default cache test" msgstr "" #. Setting: print CPUID values in decimal or hexadecimal #: cpu-x-gtk-3.12.ui:5895 msgid "Print CPUID values in decimal" msgstr "" #. Setting: default graphic card at startup #: cpu-x-gtk-3.12.ui:5928 msgid "Default graphic card" msgstr "" #. Setting: default CPU core at startup #: cpu-x-gtk-3.12.ui:5952 msgid "Default core type" msgstr "" #. Setting: default graphic card at startup #: cpu-x-gtk-3.12.ui:5976 msgid "Default memory stick" msgstr "" #. Setting: "Startup" tab #: cpu-x-gtk-3.12.ui:6004 msgid "Startup" msgstr "" #~ msgid "Calculating CPU multipliers" #~ msgstr "സിപിയു ഗുണിതങ്ങൾ (മൾട്ടിപ്ലയറുകൾ) കണക്കാക്കുന്നു" #, fuzzy, c-format #~| msgid "failed to call libcpuid (%s)" #~ msgid "failed to call vkEnumerateInstanceExtensionProperties (%s)" #~ msgstr "libcpuid വിളിക്കുന്നതിൽ പരാജയപ്പെട്ടു (%s)" CPU-X-5.0.3/po/mr.po000066400000000000000000001556021454622605200137660ustar00rootroot00000000000000# Copyright © 2014-2024 The Tumultuous Unicorn Of Darkness # This file is distributed under the same license as the CPU-X package. # Prachi Joshi , 2019, 2020, 2021. # Allan Nordhøy , 2020. # Sarang Bhaisare , 2022. msgid "" msgstr "" "Project-Id-Version: CPU-X\n" "Report-Msgid-Bugs-To: https://github.com/TheTumultuousUnicornOfDarkness/CPU-" "X/issues\n" "POT-Creation-Date: 2023-12-09 13:09+0100\n" "PO-Revision-Date: 2022-02-17 13:58+0000\n" "Last-Translator: Sarang Bhaisare \n" "Language-Team: Marathi \n" "Language: mr\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.11-dev\n" #: core.cpp:135 msgid "Finding CPU technology" msgstr "CPU तंत्रज्ञान शोधत आहे" #: core.cpp:161 #, c-format msgid "" "Your CPU is not present in the database ==> %s, model: %i, ext. model: %i, " "ext. family: %i" msgstr "" "आपला सीपीयू डेटाबेसमध्ये उपस्थित नाही==>%s,मॉडेल: %i, ext. मॉडेल: %i, ext. परिवार: " "%i मध्ये नाही" #: core.cpp:189 data.cpp:150 data.cpp:342 msgid "unknown" msgstr "" #: core.cpp:230 msgid "Calling libcpuid for retrieving static data" msgstr "स्थिर डेटा पुनर्प्राप्त करण्यासाठी libcpuid वर कॉल करीत आहे" #: core.cpp:245 #, c-format msgid "failed to call libcpuid (%s)" msgstr "libcpuid (%s) वर कॉल करण्यात अयशस्वी" #: core.cpp:340 msgid "Calling libcpuid for retrieving dynamic data" msgstr "डायनॅमिक डेटा पुनर्प्राप्त करण्यासाठी libcpuid वर कॉल करीत आहे" #: core.cpp:353 msgid "Calling libcpuid for retrieving CPU MSR static values" msgstr "सीपीयू एमएसआर स्थिर मूल्ये प्राप्त करण्यासाठी लिबकप्यूईडवर कॉल करीत आहे" #: core.cpp:380 msgid "Calling libcpuid for retrieving CPU MSR dynamic values" msgstr "सीपीयू एमएसआर डायनॅमिक मूल्ये पुनर्प्राप्त करण्यासाठी लिबकप्यूईड कॉल करीत आहे" #: core.cpp:412 msgid "Calling dmidecode" msgstr "डीमिडेकोडला कॉल करीत आहे" #: core.cpp:454 core.cpp:473 #, c-format msgid "%s (configured)" msgstr "" #: core.cpp:461 core.cpp:480 #, c-format msgid "%s (max)" msgstr "" #: core.cpp:466 #, c-format msgid "%s (min)" msgstr "" #: core.cpp:496 msgid "Calculating CPU usage" msgstr "सीपीयू वापराची गणना करत आहे" #: core.cpp:546 msgid "Calling bandwidth" msgstr "कॉलिंग बँडविड्थ" #: core.cpp:613 #, c-format msgid "" "pci_access is not properly initialized: it is a common issue when %s was " "built with a lower libpci version.\n" "Check that libpci %s library is present on your system. Otherwise, please " "rebuild %s." msgstr "" #: core.cpp:657 #, c-format msgid "No kernel driver in use for graphic card at path %s" msgstr "पथ %s वर ग्राफिक कार्ड करीता कर्नल ड्राइव्हर वापरात नाही" #: core.cpp:693 #, c-format msgid "Your GPU kernel driver is unknown: %s" msgstr "आपला GPU कर्नल ड्राइव्हर अज्ञात आहे: %s" #: core.cpp:777 #, fuzzy, c-format #| msgid "Your GPU user mode driver is unknown: %s" msgid "Your GPU user mode driver is unknown for vendor %s: %s" msgstr "आपला GPU वापरकर्ता मोड ड्राइव्हर अज्ञात आहे: %s" #: core.cpp:781 #, c-format msgid "failed to call GLFW (%i): %s" msgstr "GLFW (%i): %s वर कॉल करण्यात अयशस्वी" #: core.cpp:914 #, fuzzy #| msgid "Version" msgid "Finding Vulkan API version" msgstr "आवृत्ती" #: core.cpp:926 #, fuzzy, c-format #| msgid "failed to call dmidecode" msgid "failed to call vkCreateInstance (%s)" msgstr "dmidecode वर कॉल करण्यात अयशस्वी" #: core.cpp:929 #, c-format msgid "%s is not supported" msgstr "" #: core.cpp:937 #, fuzzy, c-format #| msgid "failed to call dmidecode" msgid "failed to call vkEnumeratePhysicalDevices (%s)" msgstr "dmidecode वर कॉल करण्यात अयशस्वी" #: core.cpp:944 msgid "No available Vulkan devices" msgstr "" #: core.cpp:952 #, fuzzy, c-format #| msgid "failed to call dmidecode" msgid "No available physical devices (%s)" msgstr "dmidecode वर कॉल करण्यात अयशस्वी" #: core.cpp:1015 #, fuzzy, c-format #| msgid "failed to call libcpuid (%s)" msgid "Failed to create Vulkan for device %u (%s)" msgstr "libcpuid (%s) वर कॉल करण्यात अयशस्वी" #: core.cpp:1019 #, c-format msgid "%s is not supported for device %u, use only deviceID for matching" msgstr "" #: core.cpp:1051 core.cpp:1364 msgid "Enabled" msgstr "सक्षम केले आहे" #: core.cpp:1051 core.cpp:1364 msgid "Disabled" msgstr "अक्षम केले आहे" #: core.cpp:1088 #, fuzzy #| msgid "Version" msgid "Finding OpenCL API version" msgstr "आवृत्ती" #: core.cpp:1092 #, c-format msgid "There is no platform with OpenCL support (%s)" msgstr "OpenCL समर्थनासह कोणतेही प्लॅटफॉर्म नाही (%s)" #: core.cpp:1102 #, c-format msgid "failed to get all OpenCL platforms (%s)" msgstr "सर्व OpenCL प्लॅटफॉर्म (%s) मिळविण्यात अयशस्वी" #: core.cpp:1115 #, c-format msgid "failed to get name for platform %u (%s)" msgstr "प्लॅटफॉर्म %u (%s) चे नाव मिळविण्यात अयशस्वी" #: core.cpp:1123 #, c-format msgid "failed to get version for platform %u (%s)" msgstr "कर्ल हस्तांतरण (%s) करण्यात अयशस्वी" #: core.cpp:1131 #, c-format msgid "failed to find number of OpenCL devices for platform '%s %s' (%s)" msgstr "व्यासपीठासाठी ओपन सीएल उपकरणांची संख्या शोधण्यात अयशस्वी '%s %s' (%s)" #: core.cpp:1131 #, fuzzy #| msgid "Finding devices" msgid "0 device" msgstr "उपकरणे शोधत आहे" #: core.cpp:1140 #, c-format msgid "failed to get all of OpenCL devices for platform '%s %s' (%s)" msgstr "व्यासपीठासाठी ओपन सीएल सर्व उपकरणे मिळविण्यात अयशस्वी '%s %s' (%s)" #: core.cpp:1160 #, fuzzy, c-format #| msgid "failed to call libcpuid (%s)" msgid "failed to get name for device %u (%s)" msgstr "libcpuid (%s) वर कॉल करण्यात अयशस्वी" #: core.cpp:1168 #, fuzzy, c-format #| msgid "failed to find graphic card driver (%s)" msgid "failed to get version for device %u (%s)" msgstr "ग्राफिक कार्ड ड्राइव्हर (%s) शोधण्यात अयशस्वी" #: core.cpp:1190 #, c-format msgid "OpenCL driver for '%s %s' does not support CL_DEVICE_TOPOLOGY_AMD (%s)" msgstr "" "%s %s' साठी OpenCL ड्राइव्हर CL_DEVICE_TOPOLOGY_AMD (%s) ला समर्थन देत नाही" #: core.cpp:1201 #, c-format msgid "" "OpenCL driver for '%s %s' does not support CL_DEVICE_GFXIP_MAJOR_AMD (%s)" msgstr "" "'%s %s' साठी OpenCL ड्राइव्हर CL_DEVICE_GFXIP_MAJOR_AMD (%s) ला समर्थन देत नाही" #: core.cpp:1209 core.cpp:1229 core.cpp:1262 #, c-format msgid "" "OpenCL driver for '%s %s' does not support CL_DEVICE_MAX_COMPUTE_UNITS (%s)" msgstr "" "'%s %s' साठी OpenCL ड्राइव्हर CL_DEVICE_MAX_COMPUTE_UNITS (%s) ला समर्थन देत नाही" #: core.cpp:1250 #, c-format msgid "" "OpenCL driver for '%s %s' does not support CL_DEVICE_PCI_DOMAIN_ID_NV (%s), " "CL_DEVICE_PCI_BUS_ID_NV (%s) or CL_DEVICE_PCI_SLOT_ID_NV (%s)" msgstr "" "'%s %s' साठी ओपन सीएल ड्राइव्हर CL_DEVICE_PCI_DOMAIN_ID_NV (%s), " "CL_DEVICE_PCI_BUS_ID_NV (%s) किंवा CL_DEVICE_PCI_SLOT_ID_NV (%s) ला समर्थन देत " "नाही" #: core.cpp:1273 #, c-format msgid "OpenCL is not supported with your GPU vendor (0x%X)" msgstr "तुमच्या चित्रक प्रक्रीयक एकक(GPU) विक्रेत्यासह ओपन सीएल समर्थित नाही (0x%X)" #: core.cpp:1295 msgid "Finding devices" msgstr "उपकरणे शोधत आहे" #: core.cpp:1307 #, c-format msgid "Skip devices search (wrong permissions on %s device)" msgstr "डिव्हाइस शोध वगळा (%s डिव्हाइसवर चुकीच्या परवानग्या)" #: core.cpp:1350 #, c-format msgid "Your GPU vendor is unknown: %s (0x%X)" msgstr "आपला GPU विक्रेता अज्ञात आहे: %s (0x%X)" #: core.cpp:1370 msgid "failed to find chipset vendor and model" msgstr "चिपसेट विक्रेता आणि मॉडेल शोधण्यात अयशस्वी" #: core.cpp:1385 msgid "failed to find graphic card vendor and model" msgstr "ग्राफिक कार्ड विक्रेता आणि मॉडेल शोधण्यात अयशस्वी" #: core.cpp:1487 msgid "Retrieving GPU clocks" msgstr "GPU घड्याळे प्राप्त करीत आहे" #: core.cpp:1500 msgid "None" msgstr "काहीही नाही" #: core.cpp:1509 #, c-format msgid "DRM path for %s is unknown" msgstr "" #: core.cpp:1516 #, c-format msgid "Card number for %s is unknown" msgstr "" #: core.cpp:1541 #, c-format msgid "PCIe %s (current) / %s (max)" msgstr "" #: core.cpp:1650 #, fuzzy, c-format #| msgid "Driver for GPU %u doesn't report frequencies" msgid "Driver for %s doesn't report frequencies" msgstr "GPU %u साठी ड्राइव्हर वारंवारिता नोंदवत नाही" #: core.cpp:1671 #, fuzzy, c-format #| msgid "failed to get all OpenCL platforms (%s)" msgid "failed to retrieve all monitoring data for %s" msgstr "सर्व OpenCL प्लॅटफॉर्म (%s) मिळविण्यात अयशस्वी" #: core.cpp:1694 msgid "Identifying running system" msgstr "कार्यरत प्रणाली ओळखत आहे" #: core.cpp:1697 msgid "failed to identify running system" msgstr "चालू प्रणाली ओळखण्यात अयशस्वी" #: core.cpp:1749 core.cpp:1778 msgid "Calling libprocps" msgstr "libprocps ला कॉल करीत आहे" #: core.cpp:1752 msgid "unable to get system uptime" msgstr "" #: core.cpp:1758 msgid "unable to create meminfo structure" msgstr "" #: core.cpp:1804 msgid "Calling libstatgrab" msgstr "libstatgrab ला कॉल करीत आहे" #: core.cpp:1852 #, c-format msgid "%i days, %i hours, %i minutes, %i seconds" msgstr "%i दिवस, %i तास, %i मिनिटे, %i सेकंद" #: core.cpp:1915 msgid "Updating benchmark status" msgstr "बेंचमार्क स्थिती अद्यतनित करीत आहे" #: core.cpp:1918 msgid "Active" msgstr "सक्रीय" #: core.cpp:1921 #, c-format msgid "(%u hours left)" msgstr "(%u तास बाकी)" #: core.cpp:1923 #, c-format msgid "(%u minutes left)" msgstr "(%u मिनिटे बाकी)" #: core.cpp:1925 #, c-format msgid "(%u seconds left)" msgstr "(%u सेकंद शिल्लक)" #: core.cpp:1929 core.cpp:1984 core.cpp:1985 msgid "Inactive" msgstr "निष्क्रीय" #: core.cpp:1932 #, c-format msgid "in %u hours" msgstr "%u तासात" #: core.cpp:1934 #, c-format msgid "in %u minutes" msgstr "%u मिनिटात" #: core.cpp:1936 #, c-format msgid "in %u seconds" msgstr "%u सेकंदात" #: core.cpp:1953 #, fuzzy, c-format #| msgid "Starting benchmark" msgid "Starting benchmark with %u threads" msgstr "बेंचमार्क सुरू करीत आहे" #: core.cpp:1976 msgid "an error occurred while starting benchmark" msgstr "बेंचमार्क सुरू करताना एक त्रुटी आली" #: core.cpp:2002 msgid "Finding CPU package in fallback mode" msgstr "फॉलबॅक मोडमध्ये सीपीयू पॅकेज शोधत आहे" #: core.cpp:2032 #, c-format msgid "Your CPU socket is not present in the database ==> %s, codename: %s" msgstr "आपला सीपीयू सॉकेट डेटाबेसमध्ये उपस्थित नाही==>%s, कोडनाव:%s मध्ये संबंधित नाही" #: core.cpp:2052 msgid "Calculating CPU multipliers in fallback mode" msgstr "फॉलबॅक मोडमध्ये सीपीयू मल्टिप्लायर्सची गणना करत आहे" #: core.cpp:2072 msgid "Retrieving motherboard information in fallback mode" msgstr "फॉलबॅक मोडमध्ये मदरबोर्ड माहिती पुनर्प्राप्त करीत आहे" #: core.cpp:2085 msgid "failed to retrieve motherboard information (fallback mode)" msgstr "मदरबोर्ड माहिती पुनर्प्राप्त करण्यात अयशस्वी (फॉलबॅक मोड)" #: core.cpp:2127 msgid "Retrieving CPU temperature in fallback mode" msgstr "फॉलबॅक मोडमध्ये सीपीयू तापमान प्राप्त करत आहे" #: core.cpp:2173 msgid "failed to retrieve CPU temperature (fallback mode)" msgstr "सीपीयू तापमान (फॉलबॅक मोड) पुनर्प्राप्त करण्यात अयशस्वी" #: core.cpp:2188 msgid "Retrieving CPU voltage in fallback mode" msgstr "फॉलबॅक मोडमध्ये सीपीयू व्होल्टेज पुनर्प्राप्त करीत आहे" #: core.cpp:2200 msgid "failed to retrieve CPU voltage (fallback mode)" msgstr "सीपीयू व्होल्टेज (फॉलबॅक मोड) पुनर्प्राप्त करण्यात अयशस्वी" #: core.cpp:2214 msgid "Retrieving CPU frequency in fallback mode" msgstr "फॉलबॅक मोडमध्ये सीपीयू वारंवारता पुनर्प्राप्त करीत आहे" #: core.cpp:2220 msgid "failed to retrieve CPU frequency (fallback mode)" msgstr "सीपीयू वारंवारता पुनर्प्राप्त करण्यात अयशस्वी (फॉलबॅक मोड)" #: daemon_client.cpp:65 #, fuzzy #| msgid "Ask password to start daemon in background" msgid "Starting daemon in background…" msgstr "पार्श्वभूमीवर डिमन सुरू करण्यासाठी संकेतशब्द विचारा" #: daemon_client.cpp:172 msgid "pkexec: authorization could not be obtained (dialog dismissed)" msgstr "pkexec: अधिकृतता प्राप्त होऊ शकली नाही (संवाद फेटाळला)" #: daemon_client.cpp:175 msgid "pkexec: authorization could not be obtained (not authorized)" msgstr "pkexec: अधिकृतता मिळू शकली नाही (अधिकृत नाही)" #: daemon_client.cpp:178 msgid "pkexec: command not found" msgstr "pkexec: कमांड आढळली नाही" #: daemon_client.cpp:181 msgid "pkexec: unexpected error code" msgstr "pkexec: अनपेक्षित त्रुटी कोड" #: daemon_client.cpp:211 #, fuzzy #| msgid "Connected to daemon" msgid "Connecting to daemon…" msgstr "डिमनशी कनेक्ट केले" #: daemon_server.cpp:261 #, c-format msgid "request_handler: case %i not handled" msgstr "विनंती_हांडलर: केस %i हाताळले नाही" #: data.cpp:124 cpu-x-gtk-3.12.ui:1370 msgid "CPU" msgstr "सीपीयू" #: data.cpp:187 #, fuzzy #| msgid "Score" msgid "P-core" msgstr "गुण" #: data.cpp:188 #, fuzzy #| msgid "Score" msgid "E-core" msgstr "गुण" #: data.cpp:189 data.cpp:192 #, fuzzy #| msgid "Core(s)" msgid "Core" msgstr "कोअर" #: data.cpp:208 cpu-x-gtk-3.12.ui:746 msgid "Processor" msgstr "प्रोसेसर" #: data.cpp:240 data.cpp:329 cpu-x-gtk-3.12.ui:1968 msgid "Caches" msgstr "कॅशे" #: data.cpp:247 #, fuzzy, c-format #| msgid "%d x %d %s, %d-way" msgid "%2d x %4d %s, %2d-way" msgstr "%d x %d %s, %d-way" #: data.cpp:249 #, c-format msgid "%d %s, %d-way" msgstr "%d %s,%d-वे" #: data.cpp:263 msgid "Count" msgstr "" #: data.cpp:276 cpu-x-gtk-3.12.ui:968 msgid "Clocks" msgstr "घड्याळे" #: data.cpp:379 data.cpp:383 #, fuzzy, c-format #| msgid "L%i Cache" msgid "L%u Cache" msgstr "L%i कॅशे" #: data.cpp:385 #, c-format msgid "%s associative, %d-%s line size" msgstr "%s सहकारी,%d-%s लाइन आकार" #: data.cpp:398 msgid "Test" msgstr "चाचणी" #: data.cpp:409 data.cpp:423 cpu-x-gtk-3.12.ui:2146 cpu-x-gtk-3.12.ui:2517 msgid "Motherboard" msgstr "मदरबोर्ड" #: data.cpp:437 cpu-x-gtk-3.12.ui:2367 msgid "BIOS" msgstr "BIOS" #: data.cpp:452 cpu-x-gtk-3.12.ui:2498 msgid "Chipset" msgstr "चिपसेट" #: data.cpp:467 data.cpp:569 cpu-x-gtk-3.12.ui:3156 cpu-x-gtk-3.12.ui:3761 msgid "Memory" msgstr "स्मृती" #: data.cpp:483 #, c-format msgid "Stick %u" msgstr "" #: data.cpp:487 cpu-x-gtk-3.12.ui:3134 msgid "Sticks" msgstr "" #: data.cpp:541 cpu-x-gtk-3.12.ui:3780 msgid "System" msgstr "प्रणाली" #: data.cpp:554 cpu-x-gtk-3.12.ui:3380 msgid "Operating System" msgstr "ऑपरेटिंग सिस्टम" #: data.cpp:587 cpu-x-gtk-3.12.ui:4960 msgid "Graphics" msgstr "ग्राफिक्स" #: data.cpp:621 #, fuzzy, c-format #| msgid "Card %i" msgid "Card %u" msgstr "कार्ड %i" #: data.cpp:625 cpu-x-gtk-3.12.ui:4938 #, fuzzy #| msgid "Card %i" msgid "Cards" msgstr "कार्ड %i" #: data.cpp:672 cpu-x-gtk-3.12.ui:5300 msgid "Bench" msgstr "बेन्च" #: data.cpp:685 msgid "Not started" msgstr "सुरू झाले नाही" #: data.cpp:688 cpu-x-gtk-3.12.ui:5070 msgid "Prime numbers (slow)" msgstr "मूळ संख्या(हळु)" #: data.cpp:692 cpu-x-gtk-3.12.ui:5178 msgid "Prime numbers (fast)" msgstr "मूळ संख्या (जलद)" #: data.cpp:696 cpu-x-gtk-3.12.ui:5281 msgid "Parameters" msgstr "घटक" #: data.cpp:721 data.cpp:727 #, c-format msgid "%u mins" msgstr "%u मि" #: data.cpp:734 cpu-x-gtk-3.12.ui:5444 cpu-x-gtk-3.12.ui:5552 msgid "About" msgstr "बद्दल" #: data.cpp:739 #, c-format msgid "" "%s is a Free software that gathers information\n" "on CPU, motherboard and more." msgstr "" "%s हे एक विनामूल्य सॉफ्टवेअर आहे जे\n" "सीपीयू, मदरबोर्ड आणि बरेच काहीची माहिती एकत्रित करते." #: data.cpp:744 #, fuzzy #| msgid "About" msgid "About CPU-X" msgstr "बद्दल" #: data.cpp:745 #, c-format msgid "Version %s" msgstr "आवृत्ती %s" #: data.cpp:746 #, c-format msgid "Author: %s" msgstr "लेखक: %s" #: data.cpp:747 #, c-format msgid "Site: %s" msgstr "साइट: %s" #: data.cpp:751 cpu-x-gtk-3.12.ui:5533 msgid "License" msgstr "परवाना" #: data.cpp:753 #, c-format msgid "This software is distributed under the terms of %s" msgstr "हे सॉफ्टवेअर %s च्या अटी अंतर्गत वितरीत केले गेले आहे" #: data.cpp:754 main.cpp:176 msgid "This program comes with ABSOLUTELY NO WARRANTY" msgstr "हा प्रोग्राम पूर्णपणे कोणतीही हमी देत नाही" #: gui_gtk.cpp:61 #, c-format msgid "Cannot find path for '%s' file" msgstr "" #: gui_gtk.cpp:400 msgid "Start daemon" msgstr "डिमन प्रारंभ करा" #: gui_gtk.cpp:403 msgid "Connected to daemon" msgstr "डिमनशी कनेक्ट केले" #: gui_gtk.cpp:406 msgid "No polkit authentication agent found" msgstr "कोणताही पोलकिट ऑथेंटिकेशन एजंट सापडला नाही" #: gui_gtk.cpp:411 msgid "Ask password to start daemon in background" msgstr "पार्श्वभूमीवर डिमन सुरू करण्यासाठी संकेतशब्द विचारा" #: gui_gtk.cpp:415 msgid "Settings" msgstr "" #: gui_gtk.cpp:634 msgid "BaseFamily" msgstr "मुळ कुटूंब" #: gui_gtk.cpp:635 msgid "CPU display (\"true\") family (computed as BaseFamily+ExtendedFamily)" msgstr "" "मध्यवर्ती प्रक्रीयक एकक(CPU) प्रदर्शक(Display) (\"खरे\") कुटूंब (मुळ कुटूंब+विस्तारित कुटुंब " "म्हणून गणना)" #: gui_gtk.cpp:636 msgid "BaseModel" msgstr "प्रतिकृती" #: gui_gtk.cpp:637 msgid "CPU display (\"true\") model (computed as (ExtendedModel<<4)+BaseModel)" msgstr "" #: gui_gtk.cpp:847 msgid "" "Identify the physically-labeled socket or board position where the memory " "device is located" msgstr "" #: gui_gtk.cpp:848 msgid "Identify the physically labeled bank where the memory device is located" msgstr "" #: gui_gtk.cpp:1052 #, fuzzy #| msgid "Version" msgid "User Mode Driver Version" msgstr "आवृत्ती" #: gui_gtk.cpp:1066 msgid "Vulkan Ray Tracing" msgstr "" #: gui_gtk.cpp:1260 msgid "Starting GTK GUI…" msgstr "जीटीके जीयूआय प्रारंभ करीत आहे …" #: gui_gtk.cpp:1272 msgid "failed to import UI in GtkBuilder" msgstr "GtkBuilder मध्ये UI आयात करण्यात अयशस्वी" #: main.cpp:63 msgid "Start graphical user interface (GUI) (default)" msgstr "ग्राफिकल यूजर इंटरफेस (जीयूआय) प्रारंभ करा (डीफॉल्ट)" #: main.cpp:64 msgid "Start text-based user interface (TUI)" msgstr "मजकूर-आधारित वापरकर्ता इंटरफेस (TUI) प्रारंभ करा" #: main.cpp:65 msgid "Dump all data on standard output and exit" msgstr "मानक आउटपुटवरील सर्व डेटा काढून टाका आणि बाहेर पडा" #: main.cpp:66 msgid "Run embedded command dmidecode and exit" msgstr "एम्बेडेड कमांड dmidecode चालवा आणि बाहेर पडा" #: main.cpp:67 msgid "Run embedded command bandwidth and exit" msgstr "एम्बेडेड कमांड बँडविड्थ चालवा आणि बाहेर पडा" #: main.cpp:68 msgid "Set temperature unit (c[elsius]|f[ahrenheit]|k[elvin]|r[ankine])" msgstr "" #: main.cpp:69 msgid "Set custom time between two refreshes (in seconds)" msgstr "दोन रीफ्रेश दरम्यान सानुकूल वेळ सेट करा (सेकंदात)" #: main.cpp:70 msgid "Set default tab (integer)" msgstr "डीफॉल्ट टॅब सेट करा (पूर्णांक)" #: main.cpp:71 #, fuzzy #| msgid "Select CPU core to monitor (integer)" msgid "Select core type to monitor (integer)" msgstr "निरीक्षण करण्यासाठी सीपीयू कोर निवडा (पूर्णांक)" #: main.cpp:72 msgid "Select CPU core to monitor (integer)" msgstr "निरीक्षण करण्यासाठी सीपीयू कोर निवडा (पूर्णांक)" #: main.cpp:73 msgid "Set custom bandwidth test for CPU caches speed (integer)" msgstr "सीपीयू कॅशे वेग (पूर्णांक) साठी सानुकूल बँडविड्थ चाचणी सेट करा" #: main.cpp:74 #, fuzzy #| msgid "Set default tab (integer)" msgid "Select default memory stick (integer)" msgstr "डीफॉल्ट टॅब सेट करा (पूर्णांक)" #: main.cpp:75 #, fuzzy #| msgid "Set default tab (integer)" msgid "Select default graphic card (integer)" msgstr "डीफॉल्ट टॅब सेट करा (पूर्णांक)" #: main.cpp:76 cpu-x-gtk-3.12.ui:5910 msgid "Start and connect to daemon" msgstr "डिमन प्रारंभ करा आणि कनेक्ट करा" #: main.cpp:77 msgid "Verbose output" msgstr "व्हर्बोज आउटपुट" #: main.cpp:78 msgid "Print help and exit" msgstr "मदत प्रिंट करा आणि बाहेर पडा" #: main.cpp:79 msgid "Print version and exit" msgstr "आवृत्ती मुद्रित करा आणि बाहेर पडा" #: main.cpp:80 msgid "Print CPUID values in decimal (default is hexadeximal)" msgstr "" #: main.cpp:81 msgid "Disable colored output" msgstr "रंगीत आउटपुट अक्षम करा" #: main.cpp:82 msgid "Print information for debugging" msgstr "" #: main.cpp:83 msgid "Print required information to paste in an issue" msgstr "समस्येमध्ये पेस्ट करण्यासाठी आवश्यक माहिती मुद्रित करा" #: main.cpp:84 msgid "Set key mapping for NCurses mode (a[rrows]|e[macs]|i[nverted-T]|v[im])" msgstr "" #: main.cpp:95 msgid "Add default command line arguments" msgstr "" #: main.cpp:96 msgid "Enforce the bus clock" msgstr "बस घड्याळ लागू करा" #: main.cpp:97 msgid "" "Ignore CPU values reported by libcpuid (comma-separated values among 'temp', " "'volt' and 'freq')" msgstr "" #: main.cpp:98 msgid "Read CPUID raw data from a given file" msgstr "दिलेल्या फाईलमधून CPUIDचा कच्चा डेटा वाचा" #: main.cpp:99 msgid "Only print a message if CPU is not present in the database" msgstr "डेटाबेसमध्ये सीपीयू नसल्यास केवळ संदेश मुद्रित करा" #: main.cpp:126 #, c-format msgid "Usage: %s DISPLAY [OPTIONS]\n" msgstr "वापर: %s प्रदर्शन [पर्याय]\n" #: main.cpp:127 msgid "Available DISPLAY:" msgstr "उपलब्ध प्रदर्शन:" #: main.cpp:135 msgid "Available OPTIONS:" msgstr "उपलब्ध पर्याय:" #: main.cpp:144 msgid "Influenceable environment variables:" msgstr "प्रभावशाली वातावरण बदल:" #: main.cpp:175 msgid "This is free software: you are free to change and redistribute it." msgstr "हे विनामूल्य सॉफ्टवेअर आहे: आपण ते बदलून पुन्हा वितरित करण्यास मोकळे आहात." #: main.cpp:177 #, c-format msgid "See the %s license: <%s>\n" msgstr "%s परवाना पहा: <%s>\n" #: main.cpp:184 #, c-format msgid "-- %-9s version: %s" msgstr "--%-9s चे आवृत्ती: %s" #: main.cpp:381 #, fuzzy, c-format #| msgid "" #| "\n" #| "%sOops, something was wrong! %s has received signal %d (%s) and has " #| "crashed.%s" msgid "" "\n" "Oops, something was wrong! %s has received signal %d (%s) and has crashed." msgstr "" "\n" "%s अरेरे, काहीतरी चूक झाली! %s ला सिग्नल %d (%s) प्राप्त झाला आहे आणि क्रॅश झाला आहे.%s" #: main.cpp:383 #, fuzzy, c-format #| msgid "" #| "\n" #| "%sOops, something was wrong! %s has received signal %d (%s) and has " #| "crashed.%s" msgid "" "\n" "Oops, something was wrong! %s has received signal %d (%s) and is trying to " "recover." msgstr "" "\n" "%s अरेरे, काहीतरी चूक झाली! %s ला सिग्नल %d (%s) प्राप्त झाला आहे आणि क्रॅश झाला आहे.%s" #: main.cpp:407 msgid "You can open a new issue here, by filling the template as requested:" msgstr "" #: main.cpp:449 msgid "an error occurred while setting locale" msgstr "लोकॅल सेट करताना एक त्रुटी आली" #: options.cpp:124 #, c-format msgid "" "Selected CPU type (%u) is not a valid number (%u is the maximum for this CPU)" msgstr "" #: options.cpp:145 #, c-format msgid "" "Selected bandwidth test (%u) is not a valid number (%u is the maximum for " "this system)" msgstr "" #: options.cpp:168 #, c-format msgid "" "Selected RAM stick (%u) is not a valid number (%u is the maximum for this " "system)" msgstr "" #: options.cpp:188 #, c-format msgid "" "Selected graphic card (%u) is not a valid number (%u is the maximum for this " "system)" msgstr "" #: options.cpp:204 #, c-format msgid "failed to change CPU affinitiy to core %u" msgstr "" #: options.cpp:210 #, c-format msgid "" "Selected CPU core (%u) is not a valid number (%u is the maximum for this " "type of core)" msgstr "" #: options.cpp:284 #, c-format msgid "Selected tab (%u) is not a valid number (%u is the maximum)" msgstr "" #: tui_ncurses.cpp:111 #, fuzzy #| msgid "Window is too small!\n" msgid "Window is too small!" msgstr "विंडो खूपच लहान आहे!\n" #: tui_ncurses.cpp:119 #, fuzzy #| msgid "Press 'h' to see help.\n" msgid "Press 'h' to see help." msgstr "मदत पाहण्यासाठी 'h' दाबा.\n" #: tui_ncurses.cpp:232 #, c-format msgid "Welcome in %s NCurses help!\n" msgstr "%s एनसीर्स मदत मध्ये आपले स्वागत आहे!\n" #: tui_ncurses.cpp:233 #, fuzzy #| msgid "This help describes how to use this Text-based User Interface.\n" msgid "This help describes how to use this Text-based User Interface." msgstr "हा मजकूर-आधारित वापरकर्ता इंटरफेस कसे वापरावे याचे वर्णन करते.\n" #: tui_ncurses.cpp:235 #, fuzzy #| msgid "" #| "\n" #| "Global keys:\n" msgid "Global keys:" msgstr "" "\n" "ग्लोबल की:\n" #: tui_ncurses.cpp:236 #, fuzzy #| msgid "\tPress 'left' key to switch in left tab.\n" msgid "Press 'left' key or 'tab' key to switch in left tab." msgstr "\tडाव्या टॅबमध्ये स्विच करण्यासाठी 'डावी' की दाबा.\n" #: tui_ncurses.cpp:237 #, fuzzy #| msgid "\tPress 'right' key to switch in right tab.\n" msgid "Press 'right' key or 'shift + tab' keys to switch in right tab." msgstr "\tउजव्या टॅबवर स्विच करण्यासाठी 'उजवी' की दाबा.\n" #: tui_ncurses.cpp:238 #, fuzzy #| msgid "\tPress 'h' key to see this help.\n" msgid "Press 'h' key to see this help." msgstr "\tही मदत पाहण्यासाठी 'h' की दाबा.\n" #: tui_ncurses.cpp:239 #, fuzzy #| msgid "\tPress 'q' key to exit.\n" msgid "Press 'q' key to exit." msgstr "\tबाहेर पडण्यासाठी 'q' की दाबा.\n" #: tui_ncurses.cpp:241 #, fuzzy #| msgid "" #| "\n" #| "CPU tab:\n" msgid "CPU tab:" msgstr "" "\n" "सीपीयू टॅब:\n" #: tui_ncurses.cpp:242 #, fuzzy #| msgid "\tPress 'down' key to decrease core number to monitor.\n" msgid "Press 'next page' key to decrease core type number to monitor." msgstr "\tमॉनिटर करण्यासाठी कोर नंबर कमी करण्यासाठी 'डाउन' की दाबा.\n" #: tui_ncurses.cpp:243 #, fuzzy #| msgid "\tPress 'up' key to increase core number to monitor.\n" msgid "Press 'previous page' key to increase core type number to monitor." msgstr "\tदेखरेखीसाठी कोअर नंबर वाढविण्यासाठी 'अप' की दाबा.\n" #: tui_ncurses.cpp:244 #, fuzzy #| msgid "\tPress 'down' key to decrease core number to monitor.\n" msgid "Press 'down' key to decrease CPU core number to monitor." msgstr "\tमॉनिटर करण्यासाठी कोर नंबर कमी करण्यासाठी 'डाउन' की दाबा.\n" #: tui_ncurses.cpp:245 #, fuzzy #| msgid "\tPress 'up' key to increase core number to monitor.\n" msgid "Press 'up' key to increase CPU core number to monitor." msgstr "\tदेखरेखीसाठी कोअर नंबर वाढविण्यासाठी 'अप' की दाबा.\n" #: tui_ncurses.cpp:247 #, fuzzy #| msgid "" #| "\n" #| "Caches tab:\n" msgid "Caches tab:" msgstr "" "\n" "कॅशे टॅब:\n" #: tui_ncurses.cpp:248 #, fuzzy #| msgid "\tPress 'down' key to switch to previous test.\n" msgid "Press 'down' key to switch to previous test." msgstr "\tमागील चाचणीवर स्विच करण्यासाठी 'डाउन' की दाबा.\n" #: tui_ncurses.cpp:249 #, fuzzy #| msgid "\tPress 'up' key' to switch to next test.\n" msgid "Press 'up' key to switch to next test." msgstr "\tपुढील चाचणीवर स्विच करण्यासाठी 'अप' की दाबा.\n" #: tui_ncurses.cpp:251 #, fuzzy #| msgid "" #| "\n" #| "Bench tab:\n" msgid "Bench tab:" msgstr "" "\n" "खंडपीठ टॅब:\n" #: tui_ncurses.cpp:252 #, fuzzy #| msgid "\tPress 'down' key to decrement benchmark duration.\n" msgid "Press 'down' key to decrement benchmark duration." msgstr "\tघटलेल्या बेंचमार्क कालावधीसाठी 'डाउन' की दाबा.\n" #: tui_ncurses.cpp:253 #, fuzzy #| msgid "\tPress 'up' key to increment benchmark duration.\n" msgid "Press 'up' key to increment benchmark duration." msgstr "\tवाढीव बेंचमार्क कालावधीसाठी 'अप' की दाबा.\n" #: tui_ncurses.cpp:254 #, fuzzy #| msgid "\tPress 'next page' key to decrement number of threads to use.\n" msgid "Press 'next page' key to decrement number of threads to use." msgstr "\tवापरण्यासाठी थ्रेडची संख्या कमी करण्यासाठी 'पुढचे पान' कि दाबा.\n" #: tui_ncurses.cpp:255 #, fuzzy #| msgid "\tPress 'previous page' key to increment number of threads to use.\n" msgid "Press 'previous page' key to increment number of threads to use." msgstr "\tवापरण्यासाठी थ्रेडच्या वाढीव संख्येसाठी 'मागील पृष्ठ' की दाबा.\n" #: tui_ncurses.cpp:256 #, fuzzy #| msgid "\tPress 's' key to start/stop prime numbers (slow) benchmark.\n" msgid "Press 's' key to start/stop prime numbers (slow) benchmark." msgstr "\tप्राइम नंबर (स्लो) बेंचमार्क सुरू करण्यासाठी /थांबवण्यासाठी 's' कि दाबा.\n" #: tui_ncurses.cpp:257 #, fuzzy #| msgid "\tPress 'f' key to start/stop prime numbers (fast) benchmark.\n" msgid "Press 'f' key to start/stop prime numbers (fast) benchmark." msgstr "\tप्राइम नंबर (स्लो) बेंचमार्क सुरू करण्यासाठी /थांबवण्यासाठी 's' कि दाबा.\n" #: tui_ncurses.cpp:259 #, fuzzy #| msgid "Graphics" msgid "Graphics tab:" msgstr "ग्राफिक्स" #: tui_ncurses.cpp:260 #, fuzzy #| msgid "\tPress 'down' key to switch to previous test.\n" msgid "Press 'down' key to switch to previous graphic card." msgstr "\tमागील चाचणीवर स्विच करण्यासाठी 'डाउन' की दाबा.\n" #: tui_ncurses.cpp:261 #, fuzzy #| msgid "\tPress 'up' key' to switch to next test.\n" msgid "Press 'up' key to switch to next graphic card." msgstr "\tपुढील चाचणीवर स्विच करण्यासाठी 'अप' की दाबा.\n" #: tui_ncurses.cpp:263 #, fuzzy #| msgid "" #| "\n" #| "Press any key to exit this help.\n" msgid "Press any key to exit this help." msgstr "" "\n" "या मदतीमधून बाहेर पडण्यासाठी कोणतीही की दाबा.\n" #: tui_ncurses.cpp:640 msgid "Starting NCurses TUI…" msgstr "एनकर्स टीयूआय प्रारंभ करीत आहे…" #: tui_ncurses.cpp:649 msgid "" "FATAL ERROR: terminfo database could not be found (try to set TERMINFO " "environment variable)" msgstr "" "FATAL ERROR: टर्मिनफो डेटाबेस सापडू शकला नाही (TERMINFO पर्यावरण व्हेरिएबल सेट " "करण्याचा प्रयत्न करा)" #: tui_ncurses.cpp:654 #, c-format msgid "Failed to set up %s terminal (err=%i); falling back to %s" msgstr "%s टर्मिनल स्थापित करण्यात अपयशी (err=%i); %s मागे पडतोय" #: util.cpp:189 #, c-format msgid "cannot find unit in '%s' string at position %i" msgstr "'%s' स्ट्रिंगमध्ये %i स्थानावर युनिट शोधू शकत नाही" #: util.cpp:252 #, fuzzy, c-format #| msgid "an error occurred while opening file '%s' (%s)" msgid "an error occurred while opening file '%s'" msgstr "फाइल '%s' (%s) उघडताना त्रुटी आली" #: util.cpp:297 #, fuzzy, c-format #| msgid "an error occurred while running command '%s' (%s)" msgid "an error occurred while running command '%s'" msgstr "'%s' (%s) कमांड चालू करताना त्रुटी आली" #: util.cpp:437 msgid "set_cpu_affinity() not supported on this operating system" msgstr "" #: data.hpp:103 data.hpp:244 data.hpp:332 msgid "Vendor" msgstr "विक्रेता" #: data.hpp:104 msgid "Code Name" msgstr "सांकेतिक नाव" #: data.hpp:105 msgid "Package" msgstr "पॅकेज" #: data.hpp:106 msgid "Technology" msgstr "तंत्रज्ञान" #: data.hpp:107 data.hpp:268 msgid "Voltage" msgstr "विद्युतदाब" #: data.hpp:108 msgid "Specification" msgstr "तपशील" #: data.hpp:109 msgid "Family" msgstr "परिवार" #: data.hpp:110 #, fuzzy #| msgid "Ext. Family" msgid "Disp. Family" msgstr "Ext. परिवार" #: data.hpp:111 data.hpp:224 data.hpp:245 data.hpp:335 msgid "Model" msgstr "मॉडेल" #: data.hpp:112 #, fuzzy #| msgid "Ext. Model" msgid "Disp. Model" msgstr "Ext. मॉडेल" #: data.hpp:113 msgid "Temp." msgstr "टेम्प." #: data.hpp:114 msgid "Stepping" msgstr "पायरी" #: data.hpp:115 msgid "Instructions" msgstr "सूचना" #: data.hpp:125 msgid "L1 Data" msgstr "एल 1 डेटा" #: data.hpp:126 msgid "L1 Inst." msgstr "एल 1 इन्स्ट." #: data.hpp:127 msgid "Level 2" msgstr "पातळी 2" #: data.hpp:128 msgid "Level 3" msgstr "पातळी 3" #: data.hpp:137 cpu-x-gtk-3.12.ui:1232 #, fuzzy #| msgid "Core(s)" msgid "Cores" msgstr "कोअर" #: data.hpp:138 data.hpp:408 cpu-x-gtk-3.12.ui:1252 msgid "Threads" msgstr "थ्रेड" #: data.hpp:155 msgid "Core Speed" msgstr "कोर गती" #: data.hpp:156 msgid "Multiplier" msgstr "गुणक" #: data.hpp:157 msgid "Bus Speed" msgstr "बस गती" #: data.hpp:158 data.hpp:341 msgid "Usage" msgstr "वापर" #: data.hpp:188 data.hpp:265 msgid "Size" msgstr "आकार" #: data.hpp:189 data.hpp:267 msgid "Speed" msgstr "वेग" #: data.hpp:223 data.hpp:259 msgid "Manufacturer" msgstr "निर्माता" #: data.hpp:225 msgid "Revision" msgstr "पुनरावृत्ती" #: data.hpp:233 msgid "Brand" msgstr "ब्रँड" #: data.hpp:234 msgid "Version" msgstr "आवृत्ती" #: data.hpp:235 msgid "Date" msgstr "तारीख" #: data.hpp:236 msgid "ROM Size" msgstr "रॉम आकार" #: data.hpp:260 msgid "Part Number" msgstr "" #: data.hpp:261 #, fuzzy #| msgid "Core #%i" msgid "Type" msgstr "कोर #%i" #: data.hpp:262 #, fuzzy #| msgid "Core #%i" msgid "Type Detail" msgstr "कोर #%i" #: data.hpp:263 msgid "Device Locator" msgstr "" #: data.hpp:264 msgid "Bank Locator" msgstr "" #: data.hpp:266 msgid "Rank" msgstr "" #: data.hpp:292 #, fuzzy #| msgid "Code Name" msgid "Name" msgstr "सांकेतिक नाव" #: data.hpp:293 msgid "Kernel" msgstr "कर्नल" #: data.hpp:294 msgid "Hostname" msgstr "होस्टनाव" #: data.hpp:295 msgid "Uptime" msgstr "अपटाइम" #: data.hpp:303 msgid "Used" msgstr "वापरलेले" #: data.hpp:304 msgid "Buffers" msgstr "बफर" #: data.hpp:305 msgid "Cached" msgstr "कॅश" #: data.hpp:306 msgid "Free" msgstr "मॊकळी" #: data.hpp:307 msgid "Swap" msgstr "स्वॅप" #: data.hpp:333 msgid "Driver" msgstr "ड्रायव्हर" #: data.hpp:334 #, fuzzy #| msgid "Version" msgid "UMD Version" msgstr "आवृत्ती" #: data.hpp:336 msgid "Compute Unit" msgstr "" #: data.hpp:337 msgid "Device ID" msgstr "" #: data.hpp:338 #, fuzzy #| msgid "Version" msgid "VBIOS Version" msgstr "आवृत्ती" #. #-#-#-#-# source_ui.pot (cpu-x ) #-#-#-#-# #. Setting: "Interface" tab #: data.hpp:339 cpu-x-gtk-3.12.ui:5807 msgid "Interface" msgstr "" #: data.hpp:340 msgid "Temperature" msgstr "तापमान" #: data.hpp:342 #, fuzzy #| msgid "Voltage" msgid "Core Voltage" msgstr "विद्युतदाब" #: data.hpp:343 msgid "Power Avg" msgstr "" #: data.hpp:344 #, fuzzy #| msgid "Memory clock" msgid "Core Clock" msgstr "स्मृती घड्याळ" #: data.hpp:345 #, fuzzy #| msgid "Memory clock" msgid "Memory Clock" msgstr "स्मृती घड्याळ" #: data.hpp:346 #, fuzzy #| msgid "Memory" msgid "Memory Used" msgstr "स्मृती" #: data.hpp:347 msgid "Resizable BAR" msgstr "" #: data.hpp:348 msgid "Vulkan RT" msgstr "" #: data.hpp:349 #, fuzzy #| msgid "Version" msgid "OpenGL Version" msgstr "आवृत्ती" #: data.hpp:350 #, fuzzy #| msgid "Version" msgid "Vulkan Version" msgstr "आवृत्ती" #: data.hpp:351 #, fuzzy #| msgid "Version" msgid "OpenCL Version" msgstr "आवृत्ती" #: data.hpp:387 msgid "Score" msgstr "गुण" #: data.hpp:388 msgid "Run" msgstr "चालवा" #: data.hpp:407 msgid "Duration" msgstr "कालावधी" #: util.hpp:77 msgid "bytes" msgstr "बाईट्स" #. TRANSLATORS: initials for kilobyte (10³): please put initials (keep it short) #: util.hpp:80 msgid "kB" msgstr "kB" #. TRANSLATORS: initials for megabyte (10⁶): please put initials (keep it short) #: util.hpp:82 msgid "MB" msgstr "एमबी" #. TRANSLATORS: initials for gigabyte (10⁹): please put initials (keep it short) #: util.hpp:84 msgid "GB" msgstr "जीबी" #. TRANSLATORS: initials for terabyte (10¹²): please put initials (keep it short) #: util.hpp:86 msgid "TB" msgstr "टीबी" #. TRANSLATORS: initials for kibibyte (2¹⁰): please put initials (keep it short) #: util.hpp:89 msgid "KiB" msgstr "" #. TRANSLATORS: initials for mebibyte (2²⁰): please put initials (keep it short) #: util.hpp:91 #, fuzzy #| msgid "MB" msgid "MiB" msgstr "एमबी" #. TRANSLATORS: initials for gibibyte (2³⁰): please put initials (keep it short) #: util.hpp:93 #, fuzzy #| msgid "GB" msgid "GiB" msgstr "जीबी" #. TRANSLATORS: initials for tebibyte (2⁴⁰): please put initials (keep it short) #: util.hpp:95 #, fuzzy #| msgid "TB" msgid "TiB" msgstr "टीबी" #: cpu-x-gtk-3.12.ui:1184 msgid "Cache" msgstr "कॅशे" #. Setting: refresh time for UI #: cpu-x-gtk-3.12.ui:5721 msgid "Refresh time" msgstr "" #. Setting: GUI theme #: cpu-x-gtk-3.12.ui:5745 msgid "Text theme" msgstr "" #. Setting: automatic GUI theme #: cpu-x-gtk-3.12.ui:5760 msgid "Automatic" msgstr "" #. Setting: light GUI theme #: cpu-x-gtk-3.12.ui:5761 msgid "Blue for light theme" msgstr "" #. Setting: dark GUI theme #: cpu-x-gtk-3.12.ui:5762 msgid "Yellow for dark theme" msgstr "" #. Setting: temperature unit #: cpu-x-gtk-3.12.ui:5775 #, fuzzy #| msgid "Temperature" msgid "Temperature unit" msgstr "तापमान" #. Setting: default tab at startup #: cpu-x-gtk-3.12.ui:5826 msgid "Default tab" msgstr "" #. Setting: default CPU core at startup #: cpu-x-gtk-3.12.ui:5839 msgid "Default CPU core" msgstr "" #. Setting: default cache test at startup #: cpu-x-gtk-3.12.ui:5852 msgid "Default cache test" msgstr "" #. Setting: print CPUID values in decimal or hexadecimal #: cpu-x-gtk-3.12.ui:5895 msgid "Print CPUID values in decimal" msgstr "" #. Setting: default graphic card at startup #: cpu-x-gtk-3.12.ui:5928 #, fuzzy #| msgid "Set default tab (integer)" msgid "Default graphic card" msgstr "डीफॉल्ट टॅब सेट करा (पूर्णांक)" #. Setting: default CPU core at startup #: cpu-x-gtk-3.12.ui:5952 msgid "Default core type" msgstr "" #. Setting: default graphic card at startup #: cpu-x-gtk-3.12.ui:5976 msgid "Default memory stick" msgstr "" #. Setting: "Startup" tab #: cpu-x-gtk-3.12.ui:6004 msgid "Startup" msgstr "" #~ msgid "Calculating CPU multipliers" #~ msgstr "सीपीयू गुणकांची गणना करत आहे" #, c-format #~ msgid "Current: PCIe Gen%1dx%d / Max: Gen%1dx%d" #~ msgstr "वर्तमान: PCIe Gen%1dx%d / कमाल: Gen%1dx%d" #~ msgid "failed to retrieve GPU clocks" #~ msgstr "GPU घड्याळे प्राप्त करण्यात अयशस्वी" #, c-format #~ msgid "Core #%i" #~ msgstr "कोर #%i" #~ msgid "Setting label names" #~ msgstr "लेबल नावे सेट करत आहे" #, c-format #~ msgid "Bank %i" #~ msgstr "बँक %i" #~ msgid "Reference" #~ msgstr "संदर्भ" #~ msgid "Distribution" #~ msgstr "वितरण" #~ msgid "Compiler" #~ msgstr "संकलक" #~ msgid "GPU clock" #~ msgstr "GPU घड्याळ" #~ msgid "Dumping data…" #~ msgstr "डम्पिंग डेटा…" #~ msgid "Freeing memory" #~ msgstr "मेमरी रिकामी करीत आहे" #, fuzzy, c-format #~| msgid "failed to call libcpuid (%s)" #~ msgid "failed to call wordexp (%i)" #~ msgstr "libcpuid (%s) वर कॉल करण्यात अयशस्वी" #, fuzzy #~| msgid "\tPress 'left' key to switch in left tab.\n" #~ msgid "Press 'home' key to scroll up in a page." #~ msgstr "\tडाव्या टॅबमध्ये स्विच करण्यासाठी 'डावी' की दाबा.\n" #, fuzzy #~| msgid "\tPress 'left' key to switch in left tab.\n" #~ msgid "Press 'end' key to scroll down in a page." #~ msgstr "\tडाव्या टॅबमध्ये स्विच करण्यासाठी 'डावी' की दाबा.\n" #, c-format #~ msgid "failed to open %s directory" #~ msgstr "%s निर्देशिका उघडण्यात अयशस्वी" #~ msgid "an error occurred while compiling regex" #~ msgstr "regex कंपाईल करताना त्रुटी आली" #~ msgid "FATAL ERROR: could not allocate memory" #~ msgstr "FATAL ERROR: मेमरी वाटप करू शकलो नाही" #, fuzzy, c-format #~| msgid "failed to call dmidecode" #~ msgid "failed to call vkEnumerateInstanceExtensionProperties (%s)" #~ msgstr "dmidecode वर कॉल करण्यात अयशस्वी" #, c-format #~ msgid "%s" #~ msgstr "%s" #, fuzzy, c-format #~ msgid "" #~ "CPU hybrid architecture is not supported. For more details, please refer " #~ "to following issue: %s" #~ msgstr "" #~ "या मध्यवर्ती प्रक्रियाक एकाकाचे (Central Processing Unit-CPU) वास्तु समर्थित " #~ "नाही. अधिक तपशीलांसाठी कृपया खालील त्रासाचा संदर्भ घ्या: %s" #, fuzzy #~ msgid "NOT SUPPORTED" #~ msgstr "समर्थित नाही" #, fuzzy #~| msgid "There is no platform with OpenCL support (%s)" #~ msgid "There is no device with Vulkan support" #~ msgstr "OpenCL समर्थनासह कोणतेही प्लॅटफॉर्म नाही (%s)" #~ msgid "Socket(s)" #~ msgstr "सॉकेट" #~ msgid "Thread(s)" #~ msgstr "थ्रेड" #~ msgid "You can paste this backtrace by opening a new issue here:" #~ msgstr "आपण येथे नवीन समस्या उघडून हा बॅकट्रॅस पेस्ट करू शकता:" #, fuzzy #~| msgid "failed to call dmidecode" #~ msgid "faild to call clGetDeviceIDs" #~ msgstr "dmidecode वर कॉल करण्यात अयशस्वी" #~ msgid "Exiting %s" #~ msgstr "%s बाहेर पडत आहे" #~ msgid "Skip CPU MSR opening (need to be root)" #~ msgstr "सीपीयू एमएसआर उघडणे वगळा (मूळ असणे आवश्यक आहे)" #~ msgid "failed to open CPU MSR (%s)" #~ msgstr "सीपीयू एमएसआर (%s) उघडण्यात अयशस्वी" #~ msgid "Skip call to dmidecode (need to be root)" #~ msgstr "डीमिडेकोडवर कॉल वगळा (रूट असणे आवश्यक आहे)" #~ msgid "failed to allocate memory for dmidecode" #~ msgstr "डीमिडेकोडसाठी मेमरी वाटप करण्यात अयशस्वी" #~ msgid "Finding graphic card driver" #~ msgstr "ग्राफिक कार्ड ड्रायव्हर शोधत आहे" #~ msgid "(%s driver)" #~ msgstr "(%s ड्राइव्हर)" #~ msgid "Retrieving GPU temperature" #~ msgstr "GPU तापमान मिळवत आहे" #~ msgid "Off" #~ msgstr "बंद" #~ msgid "failed to retrieve GPU temperature" #~ msgstr "GPU तापमान प्राप्त करण्यात अयशस्वी" #~ msgid "Skip some GPU values (need to be root)" #~ msgstr "काही GPU मूल्ये वगळा (रूट असणे आवश्यक आहे)" #~ msgid "failed to allocate memory for benchmark" #~ msgstr "बेंचमार्कसाठी मेमरी वाटप करण्यात अयशस्वी" #~ msgid "Some information will not be retrievable" #~ msgstr "काही माहिती पुनर्प्राप्त करण्यायोग्य होणार नाही" #~ msgid "Ignore" #~ msgstr "दुर्लक्ष करा" #~ msgid "Run as root" #~ msgstr "रूट म्हणून चालवा" #~ msgid "A new version of %s is available!" #~ msgstr "%s ची नवीन आवृत्ती उपलब्ध आहे!" #~ msgid "Not now" #~ msgstr "आता नाही" #~ msgid "Update" #~ msgstr "अद्यतनित करा" #~ msgid "Checking on Internet for a new version..." #~ msgstr "नवीन आवृत्तीसाठी इंटरनेटवर तपासत आहे ..." #~ msgid "failed to open a Curl session" #~ msgstr "कर्ल सत्र उघडण्यात अयशस्वी" #~ msgid "wrong write data" #~ msgstr "चुकीचे डेटा लेखन" #~ msgid "(version %s is available)" #~ msgstr "(आवृत्ती %s उपलब्ध आहे)" #~ msgid "No new version available" #~ msgstr "कोणतीही नवीन आवृत्ती उपलब्ध नाही" #~ msgid "(up-to-date)" #~ msgstr "(अद्ययावत)" #~ msgid "an error occurred while extracting %s archive (%s)" #~ msgstr "%s संग्रहण (%s) काढताना त्रुटी आली" #~ msgid "" #~ "Network access is disabled by environment variable (set CPUX_NETWORK with " #~ "a positive value to enable it)" #~ msgstr "" #~ "पर्यावरण प्रवेशाद्वारे नेटवर्क प्रवेश अक्षम केला आहे (ते सक्षम करण्यासाठी सकारात्मक " #~ "मूल्यासह CPUX_NETWORK सेट करा)" #~ msgid "failed to open %s archive for writing" #~ msgstr "लेखनासाठी %s संग्रह उघडण्यात अयशस्वी" #~ msgid "Downloading new version..." #~ msgstr "नवीन आवृत्ती डाउनलोड करीत आहे ..." #~ msgid "failed to download %s archive (%s)" #~ msgstr "%s संग्रहण (%s) डाउनलोड करण्यात अयशस्वी" #~ msgid "Extracting new version..." #~ msgstr "नवीन आवृत्ती काढत आहे ..." #~ msgid "Applying new version..." #~ msgstr "नवीन आवृत्ती लागू करत आहे ..." #~ msgid "an error occurred while removing/renaming files" #~ msgstr "फायली काढताना / पुनर्नामित करताना त्रुटी आली" #~ msgid "Update successful!" #~ msgstr "अद्यतन यशस्वी!" #~ msgid "Update portable version if a new version is available" #~ msgstr "नवीन आवृत्ती उपलब्ध असल्यास पोर्टेबल आवृत्ती अद्यतनित करा" #~ msgid "Temporarily disable network support" #~ msgstr "नेटवर्क समर्थन तात्पुरते अक्षम करा" #~ msgid "Built on %s, %s (with %s %s on %s)." #~ msgstr "%s,%s (%s वर %s %s सह) वर निर्मित." #~ msgid "" #~ "Sorry, you cannot update %s: 32-bit portable version is no more supported." #~ msgstr "" #~ "क्षमस्व, आपण%s अद्यतनित करू शकत नाही: 32-बिट पोर्टेबल आवृत्ती यापुढे समर्थित नाही." #~ msgid "If you want to update, press 'u' key, or anything else to skip.\n" #~ msgstr "आपण अद्यतनित करू इच्छित असल्यास, 'u' की किंवा वगळण्यासाठी काहीही दाबा.\n" #~ msgid "" #~ "\n" #~ "\n" #~ "%s will be updated." #~ msgstr "" #~ "\n" #~ "\n" #~ "%s अद्यतनित केले जाईल." CPU-X-5.0.3/po/ms.po000066400000000000000000001001451454622605200137570ustar00rootroot00000000000000# Copyright © 2014-2024 The Tumultuous Unicorn Of Darkness # This file is distributed under the same license as the CPU-X package. # abuyop , 2020. # Allan Nordhøy , 2020. # Kazuki278 , 2021. # Jacque Fresco , 2021. msgid "" msgstr "" "Project-Id-Version: CPU-X\n" "Report-Msgid-Bugs-To: https://github.com/TheTumultuousUnicornOfDarkness/CPU-" "X/issues\n" "POT-Creation-Date: 2023-12-09 13:09+0100\n" "PO-Revision-Date: 2021-11-02 07:37+0000\n" "Last-Translator: Kazuki278 \n" "Language-Team: Malay \n" "Language: ms\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-dev\n" #: core.cpp:135 msgid "Finding CPU technology" msgstr "Mencari teknologi CPU" #: core.cpp:161 #, c-format msgid "" "Your CPU is not present in the database ==> %s, model: %i, ext. model: %i, " "ext. family: %i" msgstr "" "CPU anda tiada di dalam pangkalan data ==> %s, model: %i, model ext.: %i, " "keluarga ext.: %i" #: core.cpp:189 data.cpp:150 data.cpp:342 msgid "unknown" msgstr "" #: core.cpp:230 msgid "Calling libcpuid for retrieving static data" msgstr "Memanggil libcpuid untuk mendapatkan semula data statik" #: core.cpp:245 #, c-format msgid "failed to call libcpuid (%s)" msgstr "gagal memanggil libcpuid (%s)" #: core.cpp:340 msgid "Calling libcpuid for retrieving dynamic data" msgstr "Memanggil libcpuid untuk mendapatkan semula data dinamik" #: core.cpp:353 msgid "Calling libcpuid for retrieving CPU MSR static values" msgstr "Memanggil libcpuid untuk mendapatkan semula nilai statik MSR CPU" #: core.cpp:380 msgid "Calling libcpuid for retrieving CPU MSR dynamic values" msgstr "Memanggil libcpuid untuk mendapatkan semula nilai dinamik MSR CPU" #: core.cpp:412 msgid "Calling dmidecode" msgstr "Memanggil dmidecode" #: core.cpp:454 core.cpp:473 #, c-format msgid "%s (configured)" msgstr "" #: core.cpp:461 core.cpp:480 #, c-format msgid "%s (max)" msgstr "" #: core.cpp:466 #, c-format msgid "%s (min)" msgstr "" #: core.cpp:496 msgid "Calculating CPU usage" msgstr "Mengira penggunaan CPU" #: core.cpp:546 msgid "Calling bandwidth" msgstr "Memanggil jalur lebar" #: core.cpp:613 #, c-format msgid "" "pci_access is not properly initialized: it is a common issue when %s was " "built with a lower libpci version.\n" "Check that libpci %s library is present on your system. Otherwise, please " "rebuild %s." msgstr "" #: core.cpp:657 #, c-format msgid "No kernel driver in use for graphic card at path %s" msgstr "" #: core.cpp:693 #, fuzzy, c-format #| msgid "Your GPU driver is unknown: %s" msgid "Your GPU kernel driver is unknown: %s" msgstr "Pemacu GPU anda tidak diketahui: %s" #: core.cpp:777 #, fuzzy, c-format #| msgid "Your GPU driver is unknown: %s" msgid "Your GPU user mode driver is unknown for vendor %s: %s" msgstr "Pemacu GPU anda tidak diketahui: %s" #: core.cpp:781 #, c-format msgid "failed to call GLFW (%i): %s" msgstr "gagal memanggil GLFW (%i):%s" #: core.cpp:914 #, fuzzy #| msgid "Version" msgid "Finding Vulkan API version" msgstr "Versi" #: core.cpp:926 #, fuzzy, c-format #| msgid "failed to call dmidecode" msgid "failed to call vkCreateInstance (%s)" msgstr "gagal memanggil dmidecode" #: core.cpp:929 #, c-format msgid "%s is not supported" msgstr "" #: core.cpp:937 #, fuzzy, c-format #| msgid "failed to call dmidecode" msgid "failed to call vkEnumeratePhysicalDevices (%s)" msgstr "gagal memanggil dmidecode" #: core.cpp:944 msgid "No available Vulkan devices" msgstr "" #: core.cpp:952 #, fuzzy, c-format #| msgid "failed to call dmidecode" msgid "No available physical devices (%s)" msgstr "gagal memanggil dmidecode" #: core.cpp:1015 #, fuzzy, c-format #| msgid "failed to call libcpuid (%s)" msgid "Failed to create Vulkan for device %u (%s)" msgstr "gagal memanggil libcpuid (%s)" #: core.cpp:1019 #, c-format msgid "%s is not supported for device %u, use only deviceID for matching" msgstr "" #: core.cpp:1051 core.cpp:1364 msgid "Enabled" msgstr "" #: core.cpp:1051 core.cpp:1364 msgid "Disabled" msgstr "" #: core.cpp:1088 #, fuzzy #| msgid "Version" msgid "Finding OpenCL API version" msgstr "Versi" #: core.cpp:1092 #, c-format msgid "There is no platform with OpenCL support (%s)" msgstr "Tiada platform yang menyokong OpenCL (%s)" #: core.cpp:1102 #, c-format msgid "failed to get all OpenCL platforms (%s)" msgstr "gagal mendapatkan semua platform OpenCL (%s)" #: core.cpp:1115 #, c-format msgid "failed to get name for platform %u (%s)" msgstr "gagal mendapatkan nama untuk platform %u (%s)" #: core.cpp:1123 #, c-format msgid "failed to get version for platform %u (%s)" msgstr "" #: core.cpp:1131 #, c-format msgid "failed to find number of OpenCL devices for platform '%s %s' (%s)" msgstr "" #: core.cpp:1131 #, fuzzy #| msgid "Finding devices" msgid "0 device" msgstr "Mencari peranti" #: core.cpp:1140 #, c-format msgid "failed to get all of OpenCL devices for platform '%s %s' (%s)" msgstr "" #: core.cpp:1160 #, fuzzy, c-format #| msgid "failed to call libcpuid (%s)" msgid "failed to get name for device %u (%s)" msgstr "gagal memanggil libcpuid (%s)" #: core.cpp:1168 #, c-format msgid "failed to get version for device %u (%s)" msgstr "" #: core.cpp:1190 #, c-format msgid "OpenCL driver for '%s %s' does not support CL_DEVICE_TOPOLOGY_AMD (%s)" msgstr "" #: core.cpp:1201 #, c-format msgid "" "OpenCL driver for '%s %s' does not support CL_DEVICE_GFXIP_MAJOR_AMD (%s)" msgstr "" #: core.cpp:1209 core.cpp:1229 core.cpp:1262 #, c-format msgid "" "OpenCL driver for '%s %s' does not support CL_DEVICE_MAX_COMPUTE_UNITS (%s)" msgstr "" #: core.cpp:1250 #, c-format msgid "" "OpenCL driver for '%s %s' does not support CL_DEVICE_PCI_DOMAIN_ID_NV (%s), " "CL_DEVICE_PCI_BUS_ID_NV (%s) or CL_DEVICE_PCI_SLOT_ID_NV (%s)" msgstr "" #: core.cpp:1273 #, c-format msgid "OpenCL is not supported with your GPU vendor (0x%X)" msgstr "" #: core.cpp:1295 msgid "Finding devices" msgstr "Mencari peranti" #: core.cpp:1307 #, c-format msgid "Skip devices search (wrong permissions on %s device)" msgstr "Langkau pencarian peranti (ralat kebenaran pada peranti %s)" #: core.cpp:1350 #, c-format msgid "Your GPU vendor is unknown: %s (0x%X)" msgstr "Vendor GPU anda tidak diketahui: %s (0x%X)" #: core.cpp:1370 msgid "failed to find chipset vendor and model" msgstr "gagal mencari vendor dan model cipset" #: core.cpp:1385 msgid "failed to find graphic card vendor and model" msgstr "gagal mencari vendor dan model kad grafik" #: core.cpp:1487 msgid "Retrieving GPU clocks" msgstr "Mendapatkan semula jam GPU" #: core.cpp:1500 msgid "None" msgstr "Tiada" #: core.cpp:1509 #, c-format msgid "DRM path for %s is unknown" msgstr "" #: core.cpp:1516 #, c-format msgid "Card number for %s is unknown" msgstr "" #: core.cpp:1541 #, c-format msgid "PCIe %s (current) / %s (max)" msgstr "" #: core.cpp:1650 #, fuzzy, c-format #| msgid "Driver for GPU %u doesn't report frequencies" msgid "Driver for %s doesn't report frequencies" msgstr "Pemacu untuk GPU %u tidak melaporkan frekuensi" #: core.cpp:1671 #, fuzzy, c-format #| msgid "failed to get all OpenCL platforms (%s)" msgid "failed to retrieve all monitoring data for %s" msgstr "gagal mendapatkan semua platform OpenCL (%s)" #: core.cpp:1694 msgid "Identifying running system" msgstr "Mengenal pasti sistem yang berjalan" #: core.cpp:1697 msgid "failed to identify running system" msgstr "gagal mengenal pasti sistem yang berjalan" #: core.cpp:1749 core.cpp:1778 msgid "Calling libprocps" msgstr "Memanggil libprocps" #: core.cpp:1752 msgid "unable to get system uptime" msgstr "" #: core.cpp:1758 msgid "unable to create meminfo structure" msgstr "" #: core.cpp:1804 msgid "Calling libstatgrab" msgstr "Memanggil libstatgrab" #: core.cpp:1852 #, c-format msgid "%i days, %i hours, %i minutes, %i seconds" msgstr "%i hari, %i jam, %i minit, %i saat" #: core.cpp:1915 msgid "Updating benchmark status" msgstr "Mengemas kini status tanda aras" #: core.cpp:1918 msgid "Active" msgstr "Aktif" #: core.cpp:1921 #, c-format msgid "(%u hours left)" msgstr "(%u jam berbaki)" #: core.cpp:1923 #, c-format msgid "(%u minutes left)" msgstr "(%u minit berbaki)" #: core.cpp:1925 #, c-format msgid "(%u seconds left)" msgstr "(%u saat berbaki)" #: core.cpp:1929 core.cpp:1984 core.cpp:1985 msgid "Inactive" msgstr "Tidak aktif" #: core.cpp:1932 #, c-format msgid "in %u hours" msgstr "dalam tempoh %u jam" #: core.cpp:1934 #, c-format msgid "in %u minutes" msgstr "dalam tempoh %u minit" #: core.cpp:1936 #, c-format msgid "in %u seconds" msgstr "dalam tempoh %u saat" #: core.cpp:1953 #, fuzzy, c-format #| msgid "Starting benchmark" msgid "Starting benchmark with %u threads" msgstr "Memulakan tanda aras" #: core.cpp:1976 msgid "an error occurred while starting benchmark" msgstr "satu ralat berlaku ketika memulakan tanda aras" #: core.cpp:2002 msgid "Finding CPU package in fallback mode" msgstr "Mencari pakej CPU dalam mod jatuh-balik" #: core.cpp:2032 #, fuzzy, c-format #| msgid "Your CPU socket does not belong in database ==> %s, codename: %s" msgid "Your CPU socket is not present in the database ==> %s, codename: %s" msgstr "Soket CPU anda tiada dalam pangkalan data ==> %s, nama kod: %s" #: core.cpp:2052 msgid "Calculating CPU multipliers in fallback mode" msgstr "Mengira pengganda CPU dalam mod jatuh-balik" #: core.cpp:2072 msgid "Retrieving motherboard information in fallback mode" msgstr "Mendapatkan semula maklumat papan induk dalam mod jatuh balik" #: core.cpp:2085 msgid "failed to retrieve motherboard information (fallback mode)" msgstr "gagal mendapatkan semula maklumat papan induk (mod jatuh-balik)" #: core.cpp:2127 msgid "Retrieving CPU temperature in fallback mode" msgstr "Mendapatkan semula suhu CPU dalam mod jatuh-balik" #: core.cpp:2173 msgid "failed to retrieve CPU temperature (fallback mode)" msgstr "gagal mendapatkan semula suhu CPU (mod jatuh-balik)" #: core.cpp:2188 msgid "Retrieving CPU voltage in fallback mode" msgstr "Mendapatkan semula voltan CPU dalam mod jatuh-balik" #: core.cpp:2200 msgid "failed to retrieve CPU voltage (fallback mode)" msgstr "gagal mendapatkan semula voltan CPU (mod jatuh-balik)" #: core.cpp:2214 msgid "Retrieving CPU frequency in fallback mode" msgstr "Mendapatkan semula frekuensi CPU dalam mod jatuh-balik" #: core.cpp:2220 msgid "failed to retrieve CPU frequency (fallback mode)" msgstr "gagal mendapatkan semula frekuensi CPU (mod jatuh-balik)" #: daemon_client.cpp:65 #, fuzzy #| msgid "Ask password to start daemon in background" msgid "Starting daemon in background…" msgstr "Tanya kata laluan untuk memulakan daemon secara latar belakang" #: daemon_client.cpp:172 msgid "pkexec: authorization could not be obtained (dialog dismissed)" msgstr "" #: daemon_client.cpp:175 msgid "pkexec: authorization could not be obtained (not authorized)" msgstr "" #: daemon_client.cpp:178 msgid "pkexec: command not found" msgstr "" #: daemon_client.cpp:181 msgid "pkexec: unexpected error code" msgstr "" #: daemon_client.cpp:211 #, fuzzy #| msgid "Connected to daemon" msgid "Connecting to daemon…" msgstr "Bersambung pada daemon" #: daemon_server.cpp:261 #, c-format msgid "request_handler: case %i not handled" msgstr "" #: data.cpp:124 cpu-x-gtk-3.12.ui:1370 msgid "CPU" msgstr "CPU" #: data.cpp:187 msgid "P-core" msgstr "" #: data.cpp:188 msgid "E-core" msgstr "" #: data.cpp:189 data.cpp:192 #, fuzzy #| msgid "Core(s)" msgid "Core" msgstr "Teras" #: data.cpp:208 cpu-x-gtk-3.12.ui:746 msgid "Processor" msgstr "Pemproses" #: data.cpp:240 data.cpp:329 cpu-x-gtk-3.12.ui:1968 msgid "Caches" msgstr "Cache" #: data.cpp:247 #, fuzzy, c-format #| msgid "%d x %d %s, %d-way" msgid "%2d x %4d %s, %2d-way" msgstr "%d x %d %s, %d-way" #: data.cpp:249 #, c-format msgid "%d %s, %d-way" msgstr "%d %s, %d-way" #: data.cpp:263 msgid "Count" msgstr "" #: data.cpp:276 cpu-x-gtk-3.12.ui:968 msgid "Clocks" msgstr "Jam" #: data.cpp:379 data.cpp:383 #, fuzzy, c-format #| msgid "L%i Cache" msgid "L%u Cache" msgstr "L%i Cache" #: data.cpp:385 #, c-format msgid "%s associative, %d-%s line size" msgstr "" #: data.cpp:398 msgid "Test" msgstr "Percubaan" #: data.cpp:409 data.cpp:423 cpu-x-gtk-3.12.ui:2146 cpu-x-gtk-3.12.ui:2517 msgid "Motherboard" msgstr "Papan induk" #: data.cpp:437 cpu-x-gtk-3.12.ui:2367 msgid "BIOS" msgstr "BIOS" #: data.cpp:452 cpu-x-gtk-3.12.ui:2498 msgid "Chipset" msgstr "Cipset" #: data.cpp:467 data.cpp:569 cpu-x-gtk-3.12.ui:3156 cpu-x-gtk-3.12.ui:3761 msgid "Memory" msgstr "Memori" #: data.cpp:483 #, c-format msgid "Stick %u" msgstr "" #: data.cpp:487 cpu-x-gtk-3.12.ui:3134 msgid "Sticks" msgstr "" #: data.cpp:541 cpu-x-gtk-3.12.ui:3780 msgid "System" msgstr "Sistem" #: data.cpp:554 cpu-x-gtk-3.12.ui:3380 msgid "Operating System" msgstr "Sistem Operasi" #: data.cpp:587 cpu-x-gtk-3.12.ui:4960 msgid "Graphics" msgstr "" #: data.cpp:621 #, c-format msgid "Card %u" msgstr "" #: data.cpp:625 cpu-x-gtk-3.12.ui:4938 msgid "Cards" msgstr "" #: data.cpp:672 cpu-x-gtk-3.12.ui:5300 msgid "Bench" msgstr "" #: data.cpp:685 msgid "Not started" msgstr "Belum mula" #: data.cpp:688 cpu-x-gtk-3.12.ui:5070 msgid "Prime numbers (slow)" msgstr "" #: data.cpp:692 cpu-x-gtk-3.12.ui:5178 msgid "Prime numbers (fast)" msgstr "" #: data.cpp:696 cpu-x-gtk-3.12.ui:5281 msgid "Parameters" msgstr "" #: data.cpp:721 data.cpp:727 #, c-format msgid "%u mins" msgstr "%u min" #: data.cpp:734 cpu-x-gtk-3.12.ui:5444 cpu-x-gtk-3.12.ui:5552 msgid "About" msgstr "" #: data.cpp:739 #, c-format msgid "" "%s is a Free software that gathers information\n" "on CPU, motherboard and more." msgstr "" #: data.cpp:744 msgid "About CPU-X" msgstr "" #: data.cpp:745 #, c-format msgid "Version %s" msgstr "Versi %s" #: data.cpp:746 #, c-format msgid "Author: %s" msgstr "" #: data.cpp:747 #, c-format msgid "Site: %s" msgstr "Laman Web: %s" #: data.cpp:751 cpu-x-gtk-3.12.ui:5533 msgid "License" msgstr "" #: data.cpp:753 #, c-format msgid "This software is distributed under the terms of %s" msgstr "" #: data.cpp:754 main.cpp:176 msgid "This program comes with ABSOLUTELY NO WARRANTY" msgstr "" #: gui_gtk.cpp:61 #, c-format msgid "Cannot find path for '%s' file" msgstr "" #: gui_gtk.cpp:400 msgid "Start daemon" msgstr "Mula daemon" #: gui_gtk.cpp:403 msgid "Connected to daemon" msgstr "Bersambung pada daemon" #: gui_gtk.cpp:406 msgid "No polkit authentication agent found" msgstr "" #: gui_gtk.cpp:411 msgid "Ask password to start daemon in background" msgstr "Tanya kata laluan untuk memulakan daemon secara latar belakang" #: gui_gtk.cpp:415 msgid "Settings" msgstr "" #: gui_gtk.cpp:634 #, fuzzy #| msgid "Family" msgid "BaseFamily" msgstr "Keluarga" #: gui_gtk.cpp:635 msgid "CPU display (\"true\") family (computed as BaseFamily+ExtendedFamily)" msgstr "" #: gui_gtk.cpp:636 #, fuzzy #| msgid "Model" msgid "BaseModel" msgstr "Model" #: gui_gtk.cpp:637 msgid "CPU display (\"true\") model (computed as (ExtendedModel<<4)+BaseModel)" msgstr "" #: gui_gtk.cpp:847 msgid "" "Identify the physically-labeled socket or board position where the memory " "device is located" msgstr "" #: gui_gtk.cpp:848 msgid "Identify the physically labeled bank where the memory device is located" msgstr "" #: gui_gtk.cpp:1052 #, fuzzy #| msgid "UMD Version" msgid "User Mode Driver Version" msgstr "Versi UMD" #: gui_gtk.cpp:1066 msgid "Vulkan Ray Tracing" msgstr "" #: gui_gtk.cpp:1260 msgid "Starting GTK GUI…" msgstr "Memulakan GTK GUI…" #: gui_gtk.cpp:1272 msgid "failed to import UI in GtkBuilder" msgstr "gagal mengimport UI dalam GtkBuilder" #: main.cpp:63 msgid "Start graphical user interface (GUI) (default)" msgstr "" #: main.cpp:64 msgid "Start text-based user interface (TUI)" msgstr "" #: main.cpp:65 msgid "Dump all data on standard output and exit" msgstr "" #: main.cpp:66 msgid "Run embedded command dmidecode and exit" msgstr "" #: main.cpp:67 msgid "Run embedded command bandwidth and exit" msgstr "" #: main.cpp:68 msgid "Set temperature unit (c[elsius]|f[ahrenheit]|k[elvin]|r[ankine])" msgstr "" #: main.cpp:69 msgid "Set custom time between two refreshes (in seconds)" msgstr "" #: main.cpp:70 msgid "Set default tab (integer)" msgstr "" #: main.cpp:71 msgid "Select core type to monitor (integer)" msgstr "" #: main.cpp:72 msgid "Select CPU core to monitor (integer)" msgstr "" #: main.cpp:73 msgid "Set custom bandwidth test for CPU caches speed (integer)" msgstr "" #: main.cpp:74 #, fuzzy #| msgid "failed to find graphic card driver (%s)" msgid "Select default memory stick (integer)" msgstr "gagal mencari pemacu kad grafik (%s)" #: main.cpp:75 #, fuzzy #| msgid "failed to find graphic card driver (%s)" msgid "Select default graphic card (integer)" msgstr "gagal mencari pemacu kad grafik (%s)" #: main.cpp:76 cpu-x-gtk-3.12.ui:5910 msgid "Start and connect to daemon" msgstr "" #: main.cpp:77 msgid "Verbose output" msgstr "" #: main.cpp:78 msgid "Print help and exit" msgstr "" #: main.cpp:79 msgid "Print version and exit" msgstr "" #: main.cpp:80 msgid "Print CPUID values in decimal (default is hexadeximal)" msgstr "" #: main.cpp:81 msgid "Disable colored output" msgstr "" #: main.cpp:82 msgid "Print information for debugging" msgstr "" #: main.cpp:83 msgid "Print required information to paste in an issue" msgstr "" #: main.cpp:84 msgid "Set key mapping for NCurses mode (a[rrows]|e[macs]|i[nverted-T]|v[im])" msgstr "" #: main.cpp:95 msgid "Add default command line arguments" msgstr "" #: main.cpp:96 msgid "Enforce the bus clock" msgstr "" #: main.cpp:97 msgid "" "Ignore CPU values reported by libcpuid (comma-separated values among 'temp', " "'volt' and 'freq')" msgstr "" #: main.cpp:98 msgid "Read CPUID raw data from a given file" msgstr "" #: main.cpp:99 msgid "Only print a message if CPU is not present in the database" msgstr "" #: main.cpp:126 #, c-format msgid "Usage: %s DISPLAY [OPTIONS]\n" msgstr "" #: main.cpp:127 msgid "Available DISPLAY:" msgstr "" #: main.cpp:135 msgid "Available OPTIONS:" msgstr "" #: main.cpp:144 msgid "Influenceable environment variables:" msgstr "" #: main.cpp:175 msgid "This is free software: you are free to change and redistribute it." msgstr "" #: main.cpp:177 #, c-format msgid "See the %s license: <%s>\n" msgstr "" #: main.cpp:184 #, c-format msgid "-- %-9s version: %s" msgstr "-- %-9s versi: %s" #: main.cpp:381 #, c-format msgid "" "\n" "Oops, something was wrong! %s has received signal %d (%s) and has crashed." msgstr "" #: main.cpp:383 #, c-format msgid "" "\n" "Oops, something was wrong! %s has received signal %d (%s) and is trying to " "recover." msgstr "" #: main.cpp:407 msgid "You can open a new issue here, by filling the template as requested:" msgstr "" #: main.cpp:449 msgid "an error occurred while setting locale" msgstr "" #: options.cpp:124 #, c-format msgid "" "Selected CPU type (%u) is not a valid number (%u is the maximum for this CPU)" msgstr "" #: options.cpp:145 #, c-format msgid "" "Selected bandwidth test (%u) is not a valid number (%u is the maximum for " "this system)" msgstr "" #: options.cpp:168 #, c-format msgid "" "Selected RAM stick (%u) is not a valid number (%u is the maximum for this " "system)" msgstr "" #: options.cpp:188 #, c-format msgid "" "Selected graphic card (%u) is not a valid number (%u is the maximum for this " "system)" msgstr "" #: options.cpp:204 #, c-format msgid "failed to change CPU affinitiy to core %u" msgstr "" #: options.cpp:210 #, c-format msgid "" "Selected CPU core (%u) is not a valid number (%u is the maximum for this " "type of core)" msgstr "" #: options.cpp:284 #, c-format msgid "Selected tab (%u) is not a valid number (%u is the maximum)" msgstr "" #: tui_ncurses.cpp:111 msgid "Window is too small!" msgstr "" #: tui_ncurses.cpp:119 msgid "Press 'h' to see help." msgstr "" #: tui_ncurses.cpp:232 #, c-format msgid "Welcome in %s NCurses help!\n" msgstr "" #: tui_ncurses.cpp:233 msgid "This help describes how to use this Text-based User Interface." msgstr "" #: tui_ncurses.cpp:235 msgid "Global keys:" msgstr "" #: tui_ncurses.cpp:236 msgid "Press 'left' key or 'tab' key to switch in left tab." msgstr "" #: tui_ncurses.cpp:237 msgid "Press 'right' key or 'shift + tab' keys to switch in right tab." msgstr "" #: tui_ncurses.cpp:238 msgid "Press 'h' key to see this help." msgstr "" #: tui_ncurses.cpp:239 msgid "Press 'q' key to exit." msgstr "" #: tui_ncurses.cpp:241 msgid "CPU tab:" msgstr "Tab CPU:" #: tui_ncurses.cpp:242 msgid "Press 'next page' key to decrease core type number to monitor." msgstr "" #: tui_ncurses.cpp:243 msgid "Press 'previous page' key to increase core type number to monitor." msgstr "" #: tui_ncurses.cpp:244 msgid "Press 'down' key to decrease CPU core number to monitor." msgstr "" #: tui_ncurses.cpp:245 msgid "Press 'up' key to increase CPU core number to monitor." msgstr "" #: tui_ncurses.cpp:247 #, fuzzy #| msgid "Cache" msgid "Caches tab:" msgstr "Cache" #: tui_ncurses.cpp:248 msgid "Press 'down' key to switch to previous test." msgstr "" #: tui_ncurses.cpp:249 msgid "Press 'up' key to switch to next test." msgstr "" #: tui_ncurses.cpp:251 msgid "Bench tab:" msgstr "" #: tui_ncurses.cpp:252 msgid "Press 'down' key to decrement benchmark duration." msgstr "" #: tui_ncurses.cpp:253 msgid "Press 'up' key to increment benchmark duration." msgstr "" #: tui_ncurses.cpp:254 msgid "Press 'next page' key to decrement number of threads to use." msgstr "" #: tui_ncurses.cpp:255 msgid "Press 'previous page' key to increment number of threads to use." msgstr "" #: tui_ncurses.cpp:256 msgid "Press 's' key to start/stop prime numbers (slow) benchmark." msgstr "" #: tui_ncurses.cpp:257 msgid "Press 'f' key to start/stop prime numbers (fast) benchmark." msgstr "" #: tui_ncurses.cpp:259 msgid "Graphics tab:" msgstr "" #: tui_ncurses.cpp:260 msgid "Press 'down' key to switch to previous graphic card." msgstr "" #: tui_ncurses.cpp:261 msgid "Press 'up' key to switch to next graphic card." msgstr "" #: tui_ncurses.cpp:263 msgid "Press any key to exit this help." msgstr "" #: tui_ncurses.cpp:640 msgid "Starting NCurses TUI…" msgstr "" #: tui_ncurses.cpp:649 msgid "" "FATAL ERROR: terminfo database could not be found (try to set TERMINFO " "environment variable)" msgstr "" #: tui_ncurses.cpp:654 #, c-format msgid "Failed to set up %s terminal (err=%i); falling back to %s" msgstr "" #: util.cpp:189 #, c-format msgid "cannot find unit in '%s' string at position %i" msgstr "" #: util.cpp:252 #, fuzzy, c-format #| msgid "an error occurred while starting benchmark" msgid "an error occurred while opening file '%s'" msgstr "satu ralat berlaku ketika memulakan tanda aras" #: util.cpp:297 #, fuzzy, c-format #| msgid "an error occurred while starting benchmark" msgid "an error occurred while running command '%s'" msgstr "satu ralat berlaku ketika memulakan tanda aras" #: util.cpp:437 msgid "set_cpu_affinity() not supported on this operating system" msgstr "" #: data.hpp:103 data.hpp:244 data.hpp:332 msgid "Vendor" msgstr "Vendor" #: data.hpp:104 msgid "Code Name" msgstr "Nama Kod" #: data.hpp:105 msgid "Package" msgstr "Pakej" #: data.hpp:106 msgid "Technology" msgstr "Teknologi" #: data.hpp:107 data.hpp:268 msgid "Voltage" msgstr "Voltan" #: data.hpp:108 msgid "Specification" msgstr "Spesifikasi" #: data.hpp:109 msgid "Family" msgstr "Keluarga" #: data.hpp:110 #, fuzzy #| msgid "Ext. Family" msgid "Disp. Family" msgstr "Keluarga Ext" #: data.hpp:111 data.hpp:224 data.hpp:245 data.hpp:335 msgid "Model" msgstr "Model" #: data.hpp:112 #, fuzzy #| msgid "Ext. Model" msgid "Disp. Model" msgstr "Model Ext" #: data.hpp:113 msgid "Temp." msgstr "Suhu." #: data.hpp:114 msgid "Stepping" msgstr "Langkah" #: data.hpp:115 msgid "Instructions" msgstr "Arahan" #: data.hpp:125 msgid "L1 Data" msgstr "L1 Data" #: data.hpp:126 msgid "L1 Inst." msgstr "L1 Inst." #: data.hpp:127 msgid "Level 2" msgstr "Tahap 2" #: data.hpp:128 msgid "Level 3" msgstr "Tahap 3" #: data.hpp:137 cpu-x-gtk-3.12.ui:1232 #, fuzzy #| msgid "Core(s)" msgid "Cores" msgstr "Teras" #: data.hpp:138 data.hpp:408 cpu-x-gtk-3.12.ui:1252 msgid "Threads" msgstr "" #: data.hpp:155 msgid "Core Speed" msgstr "Kelajuan Teras" #: data.hpp:156 msgid "Multiplier" msgstr "Pengganda" #: data.hpp:157 msgid "Bus Speed" msgstr "Kelajuan Bas" #: data.hpp:158 data.hpp:341 msgid "Usage" msgstr "Penggunaan" #: data.hpp:188 data.hpp:265 msgid "Size" msgstr "Saiz" #: data.hpp:189 data.hpp:267 msgid "Speed" msgstr "Kelajuan" #: data.hpp:223 data.hpp:259 msgid "Manufacturer" msgstr "Pengilang" #: data.hpp:225 msgid "Revision" msgstr "" #: data.hpp:233 msgid "Brand" msgstr "Jenama" #: data.hpp:234 msgid "Version" msgstr "Versi" #: data.hpp:235 msgid "Date" msgstr "Tarikh" #: data.hpp:236 msgid "ROM Size" msgstr "Saiz ROM" #: data.hpp:260 msgid "Part Number" msgstr "" #: data.hpp:261 #, fuzzy #| msgid "Core #%i" msgid "Type" msgstr "Teras #%i" #: data.hpp:262 #, fuzzy #| msgid "Core #%i" msgid "Type Detail" msgstr "Teras #%i" #: data.hpp:263 msgid "Device Locator" msgstr "" #: data.hpp:264 msgid "Bank Locator" msgstr "" #: data.hpp:266 msgid "Rank" msgstr "" #: data.hpp:292 #, fuzzy #| msgid "Code Name" msgid "Name" msgstr "Nama Kod" #: data.hpp:293 msgid "Kernel" msgstr "Kernel" #: data.hpp:294 msgid "Hostname" msgstr "" #: data.hpp:295 msgid "Uptime" msgstr "" #: data.hpp:303 msgid "Used" msgstr "Digunakan" #: data.hpp:304 msgid "Buffers" msgstr "Buffer" #: data.hpp:305 msgid "Cached" msgstr "" #: data.hpp:306 msgid "Free" msgstr "" #: data.hpp:307 msgid "Swap" msgstr "" #: data.hpp:333 msgid "Driver" msgstr "" #: data.hpp:334 msgid "UMD Version" msgstr "Versi UMD" #: data.hpp:336 msgid "Compute Unit" msgstr "" #: data.hpp:337 msgid "Device ID" msgstr "" #: data.hpp:338 #, fuzzy #| msgid "Version" msgid "VBIOS Version" msgstr "Versi" #. #-#-#-#-# source_ui.pot (cpu-x ) #-#-#-#-# #. Setting: "Interface" tab #: data.hpp:339 cpu-x-gtk-3.12.ui:5807 msgid "Interface" msgstr "" #: data.hpp:340 msgid "Temperature" msgstr "" #: data.hpp:342 #, fuzzy #| msgid "Voltage" msgid "Core Voltage" msgstr "Voltan" #: data.hpp:343 msgid "Power Avg" msgstr "" #: data.hpp:344 #, fuzzy #| msgid "Clocks" msgid "Core Clock" msgstr "Jam" #: data.hpp:345 #, fuzzy #| msgid "Memory" msgid "Memory Clock" msgstr "Memori" #: data.hpp:346 msgid "Memory Used" msgstr "" #: data.hpp:347 msgid "Resizable BAR" msgstr "" #: data.hpp:348 msgid "Vulkan RT" msgstr "" #: data.hpp:349 #, fuzzy #| msgid "Version" msgid "OpenGL Version" msgstr "Versi" #: data.hpp:350 #, fuzzy #| msgid "Version" msgid "Vulkan Version" msgstr "Versi" #: data.hpp:351 #, fuzzy #| msgid "Version" msgid "OpenCL Version" msgstr "Versi" #: data.hpp:387 msgid "Score" msgstr "" #: data.hpp:388 msgid "Run" msgstr "" #: data.hpp:407 msgid "Duration" msgstr "" #: util.hpp:77 msgid "bytes" msgstr "" #. TRANSLATORS: initials for kilobyte (10³): please put initials (keep it short) #: util.hpp:80 msgid "kB" msgstr "kB" #. TRANSLATORS: initials for megabyte (10⁶): please put initials (keep it short) #: util.hpp:82 msgid "MB" msgstr "MB" #. TRANSLATORS: initials for gigabyte (10⁹): please put initials (keep it short) #: util.hpp:84 msgid "GB" msgstr "GB" #. TRANSLATORS: initials for terabyte (10¹²): please put initials (keep it short) #: util.hpp:86 msgid "TB" msgstr "TB" #. TRANSLATORS: initials for kibibyte (2¹⁰): please put initials (keep it short) #: util.hpp:89 msgid "KiB" msgstr "KiB" #. TRANSLATORS: initials for mebibyte (2²⁰): please put initials (keep it short) #: util.hpp:91 msgid "MiB" msgstr "MiB" #. TRANSLATORS: initials for gibibyte (2³⁰): please put initials (keep it short) #: util.hpp:93 msgid "GiB" msgstr "GiB" #. TRANSLATORS: initials for tebibyte (2⁴⁰): please put initials (keep it short) #: util.hpp:95 msgid "TiB" msgstr "TiB" #: cpu-x-gtk-3.12.ui:1184 msgid "Cache" msgstr "Cache" #. Setting: refresh time for UI #: cpu-x-gtk-3.12.ui:5721 msgid "Refresh time" msgstr "" #. Setting: GUI theme #: cpu-x-gtk-3.12.ui:5745 msgid "Text theme" msgstr "" #. Setting: automatic GUI theme #: cpu-x-gtk-3.12.ui:5760 msgid "Automatic" msgstr "" #. Setting: light GUI theme #: cpu-x-gtk-3.12.ui:5761 msgid "Blue for light theme" msgstr "" #. Setting: dark GUI theme #: cpu-x-gtk-3.12.ui:5762 msgid "Yellow for dark theme" msgstr "" #. Setting: temperature unit #: cpu-x-gtk-3.12.ui:5775 msgid "Temperature unit" msgstr "" #. Setting: default tab at startup #: cpu-x-gtk-3.12.ui:5826 msgid "Default tab" msgstr "" #. Setting: default CPU core at startup #: cpu-x-gtk-3.12.ui:5839 msgid "Default CPU core" msgstr "" #. Setting: default cache test at startup #: cpu-x-gtk-3.12.ui:5852 msgid "Default cache test" msgstr "" #. Setting: print CPUID values in decimal or hexadecimal #: cpu-x-gtk-3.12.ui:5895 msgid "Print CPUID values in decimal" msgstr "" #. Setting: default graphic card at startup #: cpu-x-gtk-3.12.ui:5928 #, fuzzy #| msgid "failed to find graphic card driver (%s)" msgid "Default graphic card" msgstr "gagal mencari pemacu kad grafik (%s)" #. Setting: default CPU core at startup #: cpu-x-gtk-3.12.ui:5952 msgid "Default core type" msgstr "" #. Setting: default graphic card at startup #: cpu-x-gtk-3.12.ui:5976 msgid "Default memory stick" msgstr "" #. Setting: "Startup" tab #: cpu-x-gtk-3.12.ui:6004 msgid "Startup" msgstr "" #~ msgid "Calculating CPU multipliers" #~ msgstr "Mengira pengganda CPU" #, c-format #~ msgid "Current: PCIe Gen%1dx%d / Max: Gen%1dx%d" #~ msgstr "Semasa: PCIe Gen%1dx%d / Maksimum: Gen%1dx%d" #~ msgid "failed to retrieve GPU clocks" #~ msgstr "gagal mendapatkan semula jam GPU" #, c-format #~ msgid "Core #%i" #~ msgstr "Teras #%i" #~ msgid "Setting label names" #~ msgstr "Menetapkan nama label" #~ msgid "Reference" #~ msgstr "Rujukan" #~ msgid "Distribution" #~ msgstr "Distribusi" #, fuzzy, c-format #~| msgid "failed to call libcpuid (%s)" #~ msgid "failed to call wordexp (%i)" #~ msgstr "gagal memanggil libcpuid (%s)" #, fuzzy #~| msgid "could not reallocate memory" #~ msgid "FATAL ERROR: could not allocate memory" #~ msgstr "tidak dapat memperuntuk semula ingatan" #, fuzzy, c-format #~| msgid "failed to call dmidecode" #~ msgid "failed to call vkEnumerateInstanceExtensionProperties (%s)" #~ msgstr "gagal memanggil dmidecode" #, c-format #~ msgid "%s" #~ msgstr "%s" #, fuzzy #~| msgid "There is no platform with OpenCL support (%s)" #~ msgid "There is no device with Vulkan support" #~ msgstr "Tiada platform yang menyokong OpenCL (%s)" #~ msgid "Socket(s)" #~ msgstr "Soket" #~ msgid "Thread(s)" #~ msgstr "Bebenang" #, fuzzy #~| msgid "failed to call dmidecode" #~ msgid "faild to call clGetDeviceIDs" #~ msgstr "gagal memanggil dmidecode" #~ msgid "Exiting %s" #~ msgstr "Keluar dari %s" #~ msgid "Skip CPU MSR opening (need to be root)" #~ msgstr "Langkau pembukaan MSR CPU (perlu dalam root)" #~ msgid "failed to open CPU MSR (%s)" #~ msgstr "gagal membuka MSR CPU (%s)" #~ msgid "Skip call to dmidecode (need to be root)" #~ msgstr "Langkau panggilan ke dmidecode (perlu dalam root)" #~ msgid "failed to allocate memory for dmidecode" #~ msgstr "gagal memperuntukkan ingatan untuk dmidecode" #~ msgid "Finding graphic card driver" #~ msgstr "Mencari pemacu kad grafik" #~ msgid "(%s driver)" #~ msgstr "(pemacu %s)" #~ msgid "Retrieving GPU temperature" #~ msgstr "Mendapatkan semula suhu GPU" #~ msgid "Off" #~ msgstr "Mati" #~ msgid "failed to retrieve GPU temperature" #~ msgstr "gagal mendapatkan semula suhu GPU" #~ msgid "Skip some GPU values (need to be root)" #~ msgstr "Langkau beberapa nilai GPU (perlu dalam root)" #~ msgid "failed to allocate memory for benchmark" #~ msgstr "gagal memperuntuk ingatan untuk tanda aras" #~ msgid "Root privileges are required to work properly" #~ msgstr "Kelayakan root diperlukan untuk berfungsi dengan baik" #~ msgid "Some information will not be retrievable" #~ msgstr "Beberapa maklumat tidak boleh diperoleh" #~ msgid "Ignore" #~ msgstr "Abai" #~ msgid "Run as root" #~ msgstr "Jalan sebagai root" #~ msgid "A new version of %s is available!" #~ msgstr "Satu versi baharu %s sudah tersedia!" #~ msgid "" #~ "Do you want to update %s to version %s after exit?\n" #~ "It will erase this binary file (%s) by the new version." #~ msgstr "" #~ "Anda mahu mengemas kini %s ke versi %s selepas keluar?\n" #~ "Ia akan memadam fail perduaan ini (%s) dengan versi baharu." #~ msgid "Not now" #~ msgstr "Bukan sekarang" #~ msgid "Update" #~ msgstr "Kemas kini" CPU-X-5.0.3/po/nb_NO.po000066400000000000000000001253521454622605200143420ustar00rootroot00000000000000# Copyright © 2014-2024 The Tumultuous Unicorn Of Darkness # This file is distributed under the same license as the CPU-X package. # Translators: # Allan Nordhøy , 2019, 2020, 2021, 2022, 2023. # Michal Čihař , 2019. # L-M-H , 2022. msgid "" msgstr "" "Project-Id-Version: CPU-X\n" "Report-Msgid-Bugs-To: https://github.com/TheTumultuousUnicornOfDarkness/CPU-" "X/issues\n" "POT-Creation-Date: 2023-12-09 13:09+0100\n" "PO-Revision-Date: 2023-11-06 13:36+0000\n" "Last-Translator: Allan Nordhøy \n" "Language-Team: Norwegian Bokmål \n" "Language: nb_NO\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.2-dev\n" #: core.cpp:135 msgid "Finding CPU technology" msgstr "Finner prosessor-teknologi" #: core.cpp:161 #, c-format msgid "" "Your CPU is not present in the database ==> %s, model: %i, ext. model: %i, " "ext. family: %i" msgstr "" "Prosessoren din finnes ikke i databasen → %s, modell: %i, ekst. modell: %i, " "ekst. familie: %i" #: core.cpp:189 data.cpp:150 data.cpp:342 msgid "unknown" msgstr "ukjent" #: core.cpp:230 msgid "Calling libcpuid for retrieving static data" msgstr "Kaller libcpuid for innhenting av statisk data" #: core.cpp:245 #, c-format msgid "failed to call libcpuid (%s)" msgstr "Klarte ikke å kalle libcpuid (%s)" #: core.cpp:340 #, fuzzy msgid "Calling libcpuid for retrieving dynamic data" msgstr "Kaller libcpuid for innhenting av dynamisk data …" #: core.cpp:353 #, fuzzy msgid "Calling libcpuid for retrieving CPU MSR static values" msgstr "Kaller libcpuid for mottak av statiske CPU MSR-verdier …" #: core.cpp:380 #, fuzzy msgid "Calling libcpuid for retrieving CPU MSR dynamic values" msgstr "Kaller libcpuid for mottak av dynamiske CPU MSR-verdier …" #: core.cpp:412 msgid "Calling dmidecode" msgstr "Kaller dmidecode" #: core.cpp:454 core.cpp:473 #, fuzzy, c-format msgid "%s (configured)" msgstr "%s (konfigurert)" #: core.cpp:461 core.cpp:480 #, c-format msgid "%s (max)" msgstr "%s (maks.)" #: core.cpp:466 #, c-format msgid "%s (min)" msgstr "%s (min.)" #: core.cpp:496 #, fuzzy msgid "Calculating CPU usage" msgstr "Regner ut prosessor-bruk …" #: core.cpp:546 msgid "Calling bandwidth" msgstr "Kaller båndbredde" #: core.cpp:613 #, c-format msgid "" "pci_access is not properly initialized: it is a common issue when %s was " "built with a lower libpci version.\n" "Check that libpci %s library is present on your system. Otherwise, please " "rebuild %s." msgstr "" "pci_access er ikke igangsatt på riktig vis: Dette er et vanlig problem når " "%s er bygd med en lavere libpci-versjon.\n" "Sjekk at libpci %s-biblioteket er å finne på systemet ditt. Ellers må du " "bygge %s igjen." #: core.cpp:657 #, c-format msgid "No kernel driver in use for graphic card at path %s" msgstr "Ingen kjernedriver i bruk for grafikkort på stien %s" #: core.cpp:693 #, fuzzy, c-format #| msgid "Your GPU driver is unknown: %s" msgid "Your GPU kernel driver is unknown: %s" msgstr "Ukjent sjermkortdriver: %s" #: core.cpp:777 #, fuzzy, c-format #| msgid "Your GPU driver is unknown: %s" msgid "Your GPU user mode driver is unknown for vendor %s: %s" msgstr "Ukjent sjermkortdriver: %s" #: core.cpp:781 #, fuzzy, c-format #| msgid "failed to call wordexp (%i)" msgid "failed to call GLFW (%i): %s" msgstr "Klarte ikke å kalle GLFW (%i): %s" #: core.cpp:914 #, fuzzy #| msgid "Version" msgid "Finding Vulkan API version" msgstr "Versjon" #: core.cpp:926 #, fuzzy, c-format #| msgid "failed to call dmidecode" msgid "failed to call vkCreateInstance (%s)" msgstr "kall til dmidecode mislyktes" #: core.cpp:929 #, c-format msgid "%s is not supported" msgstr "%s støttes ikke" #: core.cpp:937 #, fuzzy, c-format #| msgid "failed to call dmidecode" msgid "failed to call vkEnumeratePhysicalDevices (%s)" msgstr "kall til dmidecode mislyktes" #: core.cpp:944 #, fuzzy #| msgid "There is no available physical device (%s)" msgid "No available Vulkan devices" msgstr "Ingen tilgjengelige fysiske enheter (%s)" #: core.cpp:952 #, fuzzy, c-format #| msgid "There is no available physical device (%s)" msgid "No available physical devices (%s)" msgstr "Ingen tilgjengelige fysiske enheter (%s)" #: core.cpp:1015 #, fuzzy, c-format #| msgid "failed to get name for device %u (%s)" msgid "Failed to create Vulkan for device %u (%s)" msgstr "klarte ikke å hente navn på enhet %u (%s)" #: core.cpp:1019 #, c-format msgid "%s is not supported for device %u, use only deviceID for matching" msgstr "" #: core.cpp:1051 core.cpp:1364 #, fuzzy msgid "Enabled" msgstr "Påskrudd" #: core.cpp:1051 core.cpp:1364 msgid "Disabled" msgstr "Avskrudd" #: core.cpp:1088 #, fuzzy #| msgid "Version" msgid "Finding OpenCL API version" msgstr "Versjon" #: core.cpp:1092 #, fuzzy, c-format msgid "There is no platform with OpenCL support (%s)" msgstr "Det finnes ingen plattform med OpenCL-støtte (%s)" #: core.cpp:1102 #, c-format msgid "failed to get all OpenCL platforms (%s)" msgstr "klarte ikke å hente alle OpenCL-plattformer (%s)" #: core.cpp:1115 #, c-format msgid "failed to get name for platform %u (%s)" msgstr "klarte ikke å hente plattformsnavn %u (%s)" #: core.cpp:1123 #, c-format msgid "failed to get version for platform %u (%s)" msgstr "klarte ikke å hente plattformsversjon %u (%s)" #: core.cpp:1131 #, fuzzy, c-format msgid "failed to find number of OpenCL devices for platform '%s %s' (%s)" msgstr "klarte ikke å finne antall OpenCL-enheter for plattformen «%s %s» (%s»" #: core.cpp:1131 #, fuzzy #| msgid "DeviceID" msgid "0 device" msgstr "Enhets-ID" #: core.cpp:1140 #, fuzzy, c-format msgid "failed to get all of OpenCL devices for platform '%s %s' (%s)" msgstr "klarte ikke å hente alle OpenCL-enheter for plattformen «%s %s» (%s)" #: core.cpp:1160 #, c-format msgid "failed to get name for device %u (%s)" msgstr "klarte ikke å hente navn på enhet %u (%s)" #: core.cpp:1168 #, c-format msgid "failed to get version for device %u (%s)" msgstr "klarte ikke å hente enhetsversjon %u (%s)" #: core.cpp:1190 #, c-format msgid "OpenCL driver for '%s %s' does not support CL_DEVICE_TOPOLOGY_AMD (%s)" msgstr "" "OpenCL-driverrutine for «%s %s» støtter ikke CL_DEVICE_TOPOLOGY_AMD (%s)" #: core.cpp:1201 #, c-format msgid "" "OpenCL driver for '%s %s' does not support CL_DEVICE_GFXIP_MAJOR_AMD (%s)" msgstr "" "OpenCL-driverrutine for «%s %s» støtter ikke CL_DEVICE_GFXIP_MAJOR_AMD (%s)" #: core.cpp:1209 core.cpp:1229 core.cpp:1262 #, c-format msgid "" "OpenCL driver for '%s %s' does not support CL_DEVICE_MAX_COMPUTE_UNITS (%s)" msgstr "" "OpenCL-driverrutine for «%s %s» støtter ikke CL_DEVICE_MAX_COMPUTE_UNITS (%s)" #: core.cpp:1250 #, c-format msgid "" "OpenCL driver for '%s %s' does not support CL_DEVICE_PCI_DOMAIN_ID_NV (%s), " "CL_DEVICE_PCI_BUS_ID_NV (%s) or CL_DEVICE_PCI_SLOT_ID_NV (%s)" msgstr "" "OpenCL-driverrutine for «%s %s» støtter ikke CL_DEVICE_PCI_DOMAIN_ID_NV " "(%s), CL_DEVICE_PCI_BUS_ID_NV (%s) eller CL_DEVICE_PCI_SLOT_ID_NV (%s)" #: core.cpp:1273 #, c-format msgid "OpenCL is not supported with your GPU vendor (0x%X)" msgstr "OpenCL støttes ikke med din GPU-leverandør (0x%X)" #: core.cpp:1295 msgid "Finding devices" msgstr "Finner enheter" #: core.cpp:1307 #, c-format msgid "Skip devices search (wrong permissions on %s device)" msgstr "Hopp over søk etter enheter (feil tilganger på %s-enhet)" #: core.cpp:1350 #, c-format msgid "Your GPU vendor is unknown: %s (0x%X)" msgstr "Din GPU-tilvirker er ukjent: %s (0x%X)" #: core.cpp:1370 msgid "failed to find chipset vendor and model" msgstr "klarte ikke å finne brikkesetttilverker eller modell" #: core.cpp:1385 msgid "failed to find graphic card vendor and model" msgstr "klarte ikke å finne grafikkorttilvirker eller modell" #: core.cpp:1487 msgid "Retrieving GPU clocks" msgstr "Henter GPU-klokker" #: core.cpp:1500 msgid "None" msgstr "Ingen" #: core.cpp:1509 #, c-format msgid "DRM path for %s is unknown" msgstr "" #: core.cpp:1516 #, c-format msgid "Card number for %s is unknown" msgstr "" #: core.cpp:1541 #, c-format msgid "PCIe %s (current) / %s (max)" msgstr "" #: core.cpp:1650 #, fuzzy, c-format #| msgid "Driver for GPU %u doesn't report frequencies" msgid "Driver for %s doesn't report frequencies" msgstr "Driver for GPU %u rapporterer ikke frekvenser" #: core.cpp:1671 #, fuzzy, c-format #| msgid "failed to get all OpenCL platforms (%s)" msgid "failed to retrieve all monitoring data for %s" msgstr "klarte ikke å hente alle OpenCL-plattformer (%s)" #: core.cpp:1694 msgid "Identifying running system" msgstr "Identifiserer kjørende system" #: core.cpp:1697 msgid "failed to identify running system" msgstr "klarte ikke å identifisere kjørende system" #: core.cpp:1749 core.cpp:1778 msgid "Calling libprocps" msgstr "Kaller libprocps" #: core.cpp:1752 msgid "unable to get system uptime" msgstr "kunne ikke hente systemets oppetid" #: core.cpp:1758 msgid "unable to create meminfo structure" msgstr "kunne ikke opprette struktur for minneinfo" #: core.cpp:1804 msgid "Calling libstatgrab" msgstr "Kaller libstatgrab" #: core.cpp:1852 #, c-format msgid "%i days, %i hours, %i minutes, %i seconds" msgstr "%i dager, %i timer, %i minutter, %i sekunder" #: core.cpp:1915 msgid "Updating benchmark status" msgstr "Oppdaterer ytelsesteststatus" #: core.cpp:1918 msgid "Active" msgstr "Aktiv" #: core.cpp:1921 #, c-format msgid "(%u hours left)" msgstr "(%u timer gjenstår)" #: core.cpp:1923 #, c-format msgid "(%u minutes left)" msgstr "(%u minutter gjenstår)" #: core.cpp:1925 #, c-format msgid "(%u seconds left)" msgstr "(%u sekunder gjenstår)" #: core.cpp:1929 core.cpp:1984 core.cpp:1985 msgid "Inactive" msgstr "Inaktiv" #: core.cpp:1932 #, c-format msgid "in %u hours" msgstr "om %u timer" #: core.cpp:1934 #, c-format msgid "in %u minutes" msgstr "in %u minutter" #: core.cpp:1936 #, c-format msgid "in %u seconds" msgstr "om %u sekunder" #: core.cpp:1953 #, fuzzy, c-format #| msgid "Starting benchmark" msgid "Starting benchmark with %u threads" msgstr "Starter ytelsestest" #: core.cpp:1976 msgid "an error occurred while starting benchmark" msgstr "En feil inntraff under oppstart av ytelsestest" #: core.cpp:2002 msgid "Finding CPU package in fallback mode" msgstr "Finner prosessor-pakke i tilbakefallsmodus" #: core.cpp:2032 #, fuzzy, c-format #| msgid "Your CPU socket does not belong in database ==> %s, codename: %s" msgid "Your CPU socket is not present in the database ==> %s, codename: %s" msgstr "Din prosessor-sokkel finnes ikke i databasen ➜ %s, kodenavn: %s" #: core.cpp:2052 msgid "Calculating CPU multipliers in fallback mode" msgstr "Regner ut prosessor-multiplikatorer i tilbakefallsmodus" #: core.cpp:2072 #, fuzzy msgid "Retrieving motherboard information in fallback mode" msgstr "Henter hovedkortinformasjon i tilbakefallsmodus" #: core.cpp:2085 #, fuzzy msgid "failed to retrieve motherboard information (fallback mode)" msgstr "Klarte ikke å hente hovedkortinformasjon (tilbakefallsmodus)" #: core.cpp:2127 msgid "Retrieving CPU temperature in fallback mode" msgstr "Henter prosessor-temperatur i tilbakefallsmodus" #: core.cpp:2173 msgid "failed to retrieve CPU temperature (fallback mode)" msgstr "Klarte ikke å hente prosessor-temperatur (tilbakefallsmodus)" #: core.cpp:2188 msgid "Retrieving CPU voltage in fallback mode" msgstr "Henter prosessor-spenning i tilbakefallsmodus" #: core.cpp:2200 msgid "failed to retrieve CPU voltage (fallback mode)" msgstr "Klarte ikke å hente prosessor-spenning (tilbakefallsmodus)" #: core.cpp:2214 msgid "Retrieving CPU frequency in fallback mode" msgstr "Henter prosessor-frekvens i tilbakefallsmodus" #: core.cpp:2220 msgid "failed to retrieve CPU frequency (fallback mode)" msgstr "Klarte ikke å hente prosessor-frekvens (tilbakefallsmodus)" #: daemon_client.cpp:65 #, fuzzy #| msgid "Ask password to start daemon in background" msgid "Starting daemon in background…" msgstr "Forespør passord for å starte nisse i bakgrunnen" #: daemon_client.cpp:172 msgid "pkexec: authorization could not be obtained (dialog dismissed)" msgstr "pkexec: Kunne ikke utføre identitetsbekreftelse (dialogvindu avvist)" #: daemon_client.cpp:175 msgid "pkexec: authorization could not be obtained (not authorized)" msgstr "pkexec: Kunne ikke utføre dentitetsbekreftelse (fant ikke)" #: daemon_client.cpp:178 msgid "pkexec: command not found" msgstr "pkexec: Fant ikke kommandoen" #: daemon_client.cpp:181 msgid "pkexec: unexpected error code" msgstr "pkexec: Uventet feilkode" #: daemon_client.cpp:211 #, fuzzy #| msgid "Connected to daemon" msgid "Connecting to daemon…" msgstr "Tilkoblet nisse" #: daemon_server.cpp:261 #, c-format msgid "request_handler: case %i not handled" msgstr "forespørselshåndterer: Tilfelle %i ikke håndtert" #: data.cpp:124 cpu-x-gtk-3.12.ui:1370 msgid "CPU" msgstr "Prosessor" #: data.cpp:187 #, fuzzy #| msgid "Score" msgid "P-core" msgstr "Poengsum" #: data.cpp:188 #, fuzzy #| msgid "Score" msgid "E-core" msgstr "Poengsum" #: data.cpp:189 data.cpp:192 #, fuzzy #| msgid "Core(s)" msgid "Core" msgstr "Kjerne(r)" #: data.cpp:208 cpu-x-gtk-3.12.ui:746 msgid "Processor" msgstr "Prosessor" #: data.cpp:240 data.cpp:329 cpu-x-gtk-3.12.ui:1968 msgid "Caches" msgstr "Hurtiglagre" #: data.cpp:247 #, fuzzy, c-format #| msgid "%d x %d %s, %d-way" msgid "%2d x %4d %s, %2d-way" msgstr "%d x %d %s, %d-veis" #: data.cpp:249 #, c-format msgid "%d %s, %d-way" msgstr "%d %s, %d-veis" #: data.cpp:263 msgid "Count" msgstr "" #: data.cpp:276 cpu-x-gtk-3.12.ui:968 msgid "Clocks" msgstr "Klokker" #: data.cpp:379 data.cpp:383 #, fuzzy, c-format #| msgid "L%i Cache" msgid "L%u Cache" msgstr "L%i-hurtiglager" #: data.cpp:385 #, fuzzy, c-format msgid "%s associative, %d-%s line size" msgstr "%s-tilknytning, %d-%s-bytelinjestørrelse" #: data.cpp:398 msgid "Test" msgstr "Test" #: data.cpp:409 data.cpp:423 cpu-x-gtk-3.12.ui:2146 cpu-x-gtk-3.12.ui:2517 msgid "Motherboard" msgstr "Hovedkort" #: data.cpp:437 cpu-x-gtk-3.12.ui:2367 msgid "BIOS" msgstr "BIOS" #: data.cpp:452 cpu-x-gtk-3.12.ui:2498 msgid "Chipset" msgstr "Brikkesett" #: data.cpp:467 data.cpp:569 cpu-x-gtk-3.12.ui:3156 cpu-x-gtk-3.12.ui:3761 msgid "Memory" msgstr "Minne" #: data.cpp:483 #, c-format msgid "Stick %u" msgstr "" #: data.cpp:487 cpu-x-gtk-3.12.ui:3134 msgid "Sticks" msgstr "" #: data.cpp:541 cpu-x-gtk-3.12.ui:3780 msgid "System" msgstr "System" #: data.cpp:554 cpu-x-gtk-3.12.ui:3380 msgid "Operating System" msgstr "Operativsystem" #: data.cpp:587 cpu-x-gtk-3.12.ui:4960 msgid "Graphics" msgstr "Grafikk" #: data.cpp:621 #, fuzzy, c-format #| msgid "Card %i" msgid "Card %u" msgstr "Kort %i" #: data.cpp:625 cpu-x-gtk-3.12.ui:4938 #, fuzzy #| msgid "Card %i" msgid "Cards" msgstr "Kort %i" #: data.cpp:672 cpu-x-gtk-3.12.ui:5300 msgid "Bench" msgstr "Ytelsestest" #: data.cpp:685 msgid "Not started" msgstr "Ikke startet" #: data.cpp:688 cpu-x-gtk-3.12.ui:5070 msgid "Prime numbers (slow)" msgstr "Primtall (tregt)" #: data.cpp:692 cpu-x-gtk-3.12.ui:5178 msgid "Prime numbers (fast)" msgstr "Primtall (raskt)" #: data.cpp:696 cpu-x-gtk-3.12.ui:5281 msgid "Parameters" msgstr "Parameter" #: data.cpp:721 data.cpp:727 #, c-format msgid "%u mins" msgstr "%u minutter" #: data.cpp:734 cpu-x-gtk-3.12.ui:5444 cpu-x-gtk-3.12.ui:5552 msgid "About" msgstr "Om" #: data.cpp:739 #, c-format msgid "" "%s is a Free software that gathers information\n" "on CPU, motherboard and more." msgstr "" "%s er fri programvare som henter info om\n" "prosessor, hovedkort, med mer." #: data.cpp:744 #, fuzzy #| msgid "About" msgid "About CPU-X" msgstr "Om" #: data.cpp:745 #, c-format msgid "Version %s" msgstr "Versjon %s" #: data.cpp:746 #, c-format msgid "Author: %s" msgstr "Utvikler: %s" #: data.cpp:747 #, fuzzy, c-format msgid "Site: %s" msgstr "Nettside: %s" #: data.cpp:751 cpu-x-gtk-3.12.ui:5533 #, fuzzy msgid "License" msgstr "Lisens" #: data.cpp:753 #, c-format msgid "This software is distributed under the terms of %s" msgstr "Denne programvaren utgis i henhold til vilkårene i %s" #: data.cpp:754 main.cpp:176 msgid "This program comes with ABSOLUTELY NO WARRANTY" msgstr "Dette programmet kommer deg i hende UTEN NOEN FORM FOR GARANTI" #: gui_gtk.cpp:61 #, c-format msgid "Cannot find path for '%s' file" msgstr "" #: gui_gtk.cpp:400 msgid "Start daemon" msgstr "Start nisse" #: gui_gtk.cpp:403 msgid "Connected to daemon" msgstr "Tilkoblet nisse" #: gui_gtk.cpp:406 msgid "No polkit authentication agent found" msgstr "Fant ingen polkit-identitetsbekreftelsesagent" #: gui_gtk.cpp:411 msgid "Ask password to start daemon in background" msgstr "Forespør passord for å starte nisse i bakgrunnen" #: gui_gtk.cpp:415 msgid "Settings" msgstr "Innstillinger" #: gui_gtk.cpp:634 #, fuzzy #| msgid "Family" msgid "BaseFamily" msgstr "Familie" #: gui_gtk.cpp:635 msgid "CPU display (\"true\") family (computed as BaseFamily+ExtendedFamily)" msgstr "" "Representativ (ekte) prosessorfamilie, (utregnet som " "BaseFamily+ExtendeFamily)" #: gui_gtk.cpp:636 #, fuzzy #| msgid "Model" msgid "BaseModel" msgstr "Modell" #: gui_gtk.cpp:637 msgid "CPU display (\"true\") model (computed as (ExtendedModel<<4)+BaseModel)" msgstr "" "Representativ (ekte) prosessormodell, (utregnet som " "(ExtendedModel<<4)+BaseModel)" #: gui_gtk.cpp:847 msgid "" "Identify the physically-labeled socket or board position where the memory " "device is located" msgstr "" #: gui_gtk.cpp:848 msgid "Identify the physically labeled bank where the memory device is located" msgstr "" #: gui_gtk.cpp:1052 #, fuzzy #| msgid "Version" msgid "User Mode Driver Version" msgstr "Versjon" #: gui_gtk.cpp:1066 msgid "Vulkan Ray Tracing" msgstr "Strålesporing (Vulkan)" #: gui_gtk.cpp:1260 #, fuzzy msgid "Starting GTK GUI…" msgstr "Starter grafisk GTK-brukergrensesnitt…" #: gui_gtk.cpp:1272 msgid "failed to import UI in GtkBuilder" msgstr "Klarte ikke å importere grensesnitt i GtkBuilder" #: main.cpp:63 msgid "Start graphical user interface (GUI) (default)" msgstr "Start grafisk brukergrensesnitt (GUI) (forvalg)" #: main.cpp:64 msgid "Start text-based user interface (TUI)" msgstr "Start tekstbasert brukergrensesnitt (TUI)" #: main.cpp:65 #, fuzzy msgid "Dump all data on standard output and exit" msgstr "Dump all data til forvalgt utdata og avslutt" #: main.cpp:66 msgid "Run embedded command dmidecode and exit" msgstr "Kjør den innebygde kommandoen dmidecode og avslutt" #: main.cpp:67 msgid "Run embedded command bandwidth and exit" msgstr "Kjør den innebygde kommandoen bandwidth og avslutt" #: main.cpp:68 msgid "Set temperature unit (c[elsius]|f[ahrenheit]|k[elvin]|r[ankine])" msgstr "" #: main.cpp:69 msgid "Set custom time between two refreshes (in seconds)" msgstr "Sett egendefinert tid mellom to oppdateringer (i sekunder)" #: main.cpp:70 msgid "Set default tab (integer)" msgstr "Sett forvalgt fane (heltall)" #: main.cpp:71 #, fuzzy #| msgid "Select CPU core to monitor (integer)" msgid "Select core type to monitor (integer)" msgstr "Velg prosessor-kjerne å overvåke (heltall)" #: main.cpp:72 msgid "Select CPU core to monitor (integer)" msgstr "Velg prosessor-kjerne å overvåke (heltall)" #: main.cpp:73 msgid "Set custom bandwidth test for CPU caches speed (integer)" msgstr "" "Sett egendefinert båndbreddetest for hastigheter for prosessor-hurtiglagre " "(heltall)" #: main.cpp:74 #, fuzzy #| msgid "Set default tab (integer)" msgid "Select default memory stick (integer)" msgstr "Sett forvalgt fane (heltall)" #: main.cpp:75 #, fuzzy #| msgid "Set default tab (integer)" msgid "Select default graphic card (integer)" msgstr "Sett forvalgt fane (heltall)" #: main.cpp:76 cpu-x-gtk-3.12.ui:5910 msgid "Start and connect to daemon" msgstr "Start og koble til nisse" #: main.cpp:77 msgid "Verbose output" msgstr "Ordrik utdata" #: main.cpp:78 msgid "Print help and exit" msgstr "Skriv ut hjelp og avslutt" #: main.cpp:79 msgid "Print version and exit" msgstr "Skriv ut versjon og avslutt" #: main.cpp:80 #, fuzzy msgid "Print CPUID values in decimal (default is hexadeximal)" msgstr "Skriv ut CPUID-verdier i desimalform (forvalget er heksadesimaler)" #: main.cpp:81 msgid "Disable colored output" msgstr "Skru av fargelagt utdata" #: main.cpp:82 msgid "Print information for debugging" msgstr "Skriv ut info for avlusing" #: main.cpp:83 msgid "Print required information to paste in an issue" msgstr "Skriv ut påkrevd informasjon å lime inn i en feilrapport" #: main.cpp:84 #, fuzzy msgid "Set key mapping for NCurses mode (a[rrows]|e[macs]|i[nverted-T]|v[im])" msgstr "" "Sett tastetildeling for NCurses-modus (a[rrows]|e[macs]|i[nverted-T]|v[im])" #: main.cpp:95 msgid "Add default command line arguments" msgstr "Sett forvalgte kommandolinjeargumenter" #: main.cpp:96 msgid "Enforce the bus clock" msgstr "Påtving bussklokkefrekvens" #: main.cpp:97 msgid "" "Ignore CPU values reported by libcpuid (comma-separated values among 'temp', " "'volt' and 'freq')" msgstr "" #: main.cpp:98 msgid "Read CPUID raw data from a given file" msgstr "Les CPUID-rådata fra en gitt fil" #: main.cpp:99 msgid "Only print a message if CPU is not present in the database" msgstr "Kun skriv ut en melding hvis prosessoren ikke finnes i databasen" #: main.cpp:126 #, c-format msgid "Usage: %s DISPLAY [OPTIONS]\n" msgstr "Bruk: %s SKJERM {VALG]\n" #: main.cpp:127 msgid "Available DISPLAY:" msgstr "Tilgjengelig SKJERM:" #: main.cpp:135 msgid "Available OPTIONS:" msgstr "Tilgjengelige VALG:" #: main.cpp:144 msgid "Influenceable environment variables:" msgstr "Påvirkelige miljøvariabler:" #: main.cpp:175 msgid "This is free software: you are free to change and redistribute it." msgstr "" "Dette er fri programvare: Du står fritt til å endre og redistribuere den." #: main.cpp:177 #, c-format msgid "See the %s license: <%s>\n" msgstr "Vis %s-linsensen: <%s>\n" #: main.cpp:184 #, c-format msgid "-- %-9s version: %s" msgstr "-- %-9s versjon: %s" #: main.cpp:381 #, fuzzy, c-format #| msgid "" #| "\n" #| "%sOops, something was wrong! %s has received signal %d (%s) and has " #| "crashed.%s" msgid "" "\n" "Oops, something was wrong! %s has received signal %d (%s) and has crashed." msgstr "" "\n" "%s! %s has received signal %d (%s) and has crashed.%s" #: main.cpp:383 #, fuzzy, c-format #| msgid "" #| "\n" #| "%sOops, something was wrong! %s has received signal %d (%s) and has " #| "crashed.%s" msgid "" "\n" "Oops, something was wrong! %s has received signal %d (%s) and is trying to " "recover." msgstr "" "\n" "%s! %s has received signal %d (%s) and has crashed.%s" #: main.cpp:407 msgid "You can open a new issue here, by filling the template as requested:" msgstr "" "Du kan åpne en ny problemrapport her ved å fylle ut malen som forespurt:" #: main.cpp:449 #, fuzzy msgid "an error occurred while setting locale" msgstr "Kunne ikke sette lokalitet" #: options.cpp:124 #, c-format msgid "" "Selected CPU type (%u) is not a valid number (%u is the maximum for this CPU)" msgstr "" #: options.cpp:145 #, c-format msgid "" "Selected bandwidth test (%u) is not a valid number (%u is the maximum for " "this system)" msgstr "" #: options.cpp:168 #, c-format msgid "" "Selected RAM stick (%u) is not a valid number (%u is the maximum for this " "system)" msgstr "" #: options.cpp:188 #, c-format msgid "" "Selected graphic card (%u) is not a valid number (%u is the maximum for this " "system)" msgstr "" #: options.cpp:204 #, c-format msgid "failed to change CPU affinitiy to core %u" msgstr "" #: options.cpp:210 #, c-format msgid "" "Selected CPU core (%u) is not a valid number (%u is the maximum for this " "type of core)" msgstr "" #: options.cpp:284 #, c-format msgid "Selected tab (%u) is not a valid number (%u is the maximum)" msgstr "" #: tui_ncurses.cpp:111 msgid "Window is too small!" msgstr "Vinduet er for lite!" #: tui_ncurses.cpp:119 msgid "Press 'h' to see help." msgstr "Trykk \"h\" for å vise hjelp." #: tui_ncurses.cpp:232 #, fuzzy, c-format msgid "Welcome in %s NCurses help!\n" msgstr "Velkommen til %s-ncurseshjelpen!\n" #: tui_ncurses.cpp:233 msgid "This help describes how to use this Text-based User Interface." msgstr "" "Denne hjelpen beskriver bruken av dette tekstbaserte brukergrensesnittet." #: tui_ncurses.cpp:235 msgid "Global keys:" msgstr "Programvide hurtigtaster:" #: tui_ncurses.cpp:236 msgid "Press 'left' key or 'tab' key to switch in left tab." msgstr "" "Trykk \"venstre\"-tasten eller \"tab\"-tasten for å veksle i venstre fane." #: tui_ncurses.cpp:237 msgid "Press 'right' key or 'shift + tab' keys to switch in right tab." msgstr "" "Trykk \"høyre\"-tasten eller \"shift + tab\"-tastene for å veksle i høyre " "fane." #: tui_ncurses.cpp:238 #, fuzzy msgid "Press 'h' key to see this help." msgstr "\tTrykk \"h\"-tasten for å se denne hjelpen.\n" #: tui_ncurses.cpp:239 #, fuzzy msgid "Press 'q' key to exit." msgstr "\tTrykk \"q\"-tast for å avslutte.\n" #: tui_ncurses.cpp:241 msgid "CPU tab:" msgstr "Prosessor-fane:" #: tui_ncurses.cpp:242 #, fuzzy msgid "Press 'next page' key to decrease core type number to monitor." msgstr "" "\tTrykk \"nedover-piltast\" ↓ for å senke kjerneantall å holde oppsikt med.\n" #: tui_ncurses.cpp:243 #, fuzzy #| msgid "\tPress 'up' key to increase core number to monitor.\n" msgid "Press 'previous page' key to increase core type number to monitor." msgstr "" "\tTrykk \"oppover-piltast\" ↑ for å øke kjerneantallet å holde oppsyn med.\n" #: tui_ncurses.cpp:244 #, fuzzy msgid "Press 'down' key to decrease CPU core number to monitor." msgstr "" "\tTrykk \"nedover-piltast\" ↓ for å senke kjerneantall å holde oppsikt med.\n" #: tui_ncurses.cpp:245 #, fuzzy #| msgid "\tPress 'up' key to increase core number to monitor.\n" msgid "Press 'up' key to increase CPU core number to monitor." msgstr "" "\tTrykk \"oppover-piltast\" ↑ for å øke kjerneantallet å holde oppsyn med.\n" #: tui_ncurses.cpp:247 msgid "Caches tab:" msgstr "Fane for hurtiglagre:" #: tui_ncurses.cpp:248 #, fuzzy msgid "Press 'down' key to switch to previous test." msgstr "\tTrykk \"nedovertast\" ↓ for å bytte til forrige test.\n" #: tui_ncurses.cpp:249 #, fuzzy msgid "Press 'up' key to switch to next test." msgstr "\tTrykk \"nedovertast\" ↑ for å bytte til neste test.\n" #: tui_ncurses.cpp:251 msgid "Bench tab:" msgstr "Ytelsestestfane:" #: tui_ncurses.cpp:252 #, fuzzy msgid "Press 'down' key to decrement benchmark duration." msgstr "\tTrykk \"nedover-piltast\" ↓ for å senke ytelsestestens varighet.\n" #: tui_ncurses.cpp:253 #, fuzzy #| msgid "\tPress 'up' key to increment benchmark duration.\n" msgid "Press 'up' key to increment benchmark duration." msgstr "\tTrykk \"oppovertast\" ↑ for å endre ytelsestestens varighet.\n" #: tui_ncurses.cpp:254 #, fuzzy #| msgid "\tPress 'next page' key to decrement number of threads to use.\n" msgid "Press 'next page' key to decrement number of threads to use." msgstr "\tTrykk \"neste side-tast\" for å senke antall tråder i bruk.\n" #: tui_ncurses.cpp:255 #, fuzzy #| msgid "\tPress 'previous page' key to increment number of threads to use.\n" msgid "Press 'previous page' key to increment number of threads to use." msgstr "\tTrykk \"forrige side-tast\" for å øke antall tråder i bruk.\n" #: tui_ncurses.cpp:256 #, fuzzy msgid "Press 's' key to start/stop prime numbers (slow) benchmark." msgstr "\tTrykk \"s\"-tast for å starte/stoppe primtall (treg) ytelsestest.\n" #: tui_ncurses.cpp:257 #, fuzzy msgid "Press 'f' key to start/stop prime numbers (fast) benchmark." msgstr "\tTrykk \"f\"-tast for å starte/stoppe primtall (rask) ytelsestest.\n" #: tui_ncurses.cpp:259 #, fuzzy #| msgid "Graphics" msgid "Graphics tab:" msgstr "Grafikk" #: tui_ncurses.cpp:260 #, fuzzy msgid "Press 'down' key to switch to previous graphic card." msgstr "\tTrykk \"nedovertast\" ↓ for å bytte til forrige test.\n" #: tui_ncurses.cpp:261 #, fuzzy msgid "Press 'up' key to switch to next graphic card." msgstr "\tTrykk \"nedovertast\" ↑ for å bytte til neste test.\n" #: tui_ncurses.cpp:263 msgid "Press any key to exit this help." msgstr "Trykk vilkårlig tast for å avslutte denne hjelpen." #: tui_ncurses.cpp:640 msgid "Starting NCurses TUI…" msgstr "Starter NCurses-TUI …" #: tui_ncurses.cpp:649 msgid "" "FATAL ERROR: terminfo database could not be found (try to set TERMINFO " "environment variable)" msgstr "" "FATAL FEIL: Fant ikke terminfo-database. (Prøv å sette TERMINFO-" "miljøvariabel.)" #: tui_ncurses.cpp:654 #, c-format msgid "Failed to set up %s terminal (err=%i); falling back to %s" msgstr "Klarte ikke å sette opp %s-terminal (err=%i); faller tilbake til %s" #: util.cpp:189 #, c-format msgid "cannot find unit in '%s' string at position %i" msgstr "finner ikke enheten «%s»-streng i posisjon %i" #: util.cpp:252 #, fuzzy, c-format #| msgid "an error occurred while opening file '%s' (%s)" msgid "an error occurred while opening file '%s'" msgstr "Kunne ikke åpne fil \"%s\" (%s)" #: util.cpp:297 #, fuzzy, c-format msgid "an error occurred while running command '%s'" msgstr "Kunne ikke kjøre kommandoen \"%s\" (%s)" #: util.cpp:437 msgid "set_cpu_affinity() not supported on this operating system" msgstr "" #: data.hpp:103 data.hpp:244 data.hpp:332 msgid "Vendor" msgstr "Leverandør" #: data.hpp:104 msgid "Code Name" msgstr "Kodenavn" #: data.hpp:105 msgid "Package" msgstr "Pakke" #: data.hpp:106 msgid "Technology" msgstr "Teknologi" #: data.hpp:107 data.hpp:268 msgid "Voltage" msgstr "Spenning" #: data.hpp:108 msgid "Specification" msgstr "Spesifikasjon" #: data.hpp:109 msgid "Family" msgstr "Familie" #: data.hpp:110 #, fuzzy msgid "Disp. Family" msgstr "Ekst. familie" #: data.hpp:111 data.hpp:224 data.hpp:245 data.hpp:335 msgid "Model" msgstr "Modell" #: data.hpp:112 #, fuzzy msgid "Disp. Model" msgstr "Ekst. modell" #: data.hpp:113 #, fuzzy msgid "Temp." msgstr "Temp." #: data.hpp:114 #, fuzzy msgid "Stepping" msgstr "Stepping" #: data.hpp:115 msgid "Instructions" msgstr "Instruksjoner" #: data.hpp:125 msgid "L1 Data" msgstr "L1-data" #: data.hpp:126 msgid "L1 Inst." msgstr "L1-instr." #: data.hpp:127 msgid "Level 2" msgstr "Nivå 2" #: data.hpp:128 msgid "Level 3" msgstr "Nivå 3" #: data.hpp:137 cpu-x-gtk-3.12.ui:1232 #, fuzzy #| msgid "Core(s)" msgid "Cores" msgstr "Kjerne(r)" #: data.hpp:138 data.hpp:408 cpu-x-gtk-3.12.ui:1252 msgid "Threads" msgstr "Tråder" #: data.hpp:155 msgid "Core Speed" msgstr "Kjernehastighet" #: data.hpp:156 msgid "Multiplier" msgstr "Multiplikator" #: data.hpp:157 msgid "Bus Speed" msgstr "Busshastighet" #: data.hpp:158 data.hpp:341 msgid "Usage" msgstr "Bruk" #: data.hpp:188 data.hpp:265 msgid "Size" msgstr "Størrelse" #: data.hpp:189 data.hpp:267 msgid "Speed" msgstr "Hastighet" #: data.hpp:223 data.hpp:259 msgid "Manufacturer" msgstr "Fabrikant" #: data.hpp:225 msgid "Revision" msgstr "Revisjon" #: data.hpp:233 msgid "Brand" msgstr "Merke" #: data.hpp:234 msgid "Version" msgstr "Versjon" #: data.hpp:235 msgid "Date" msgstr "Dato" #: data.hpp:236 msgid "ROM Size" msgstr "ROM-størrelse" #: data.hpp:260 msgid "Part Number" msgstr "" #: data.hpp:261 #, fuzzy #| msgid "Core #%i" msgid "Type" msgstr "Kjerne #%i" #: data.hpp:262 #, fuzzy #| msgid "Core #%i" msgid "Type Detail" msgstr "Kjerne #%i" #: data.hpp:263 msgid "Device Locator" msgstr "" #: data.hpp:264 msgid "Bank Locator" msgstr "" #: data.hpp:266 msgid "Rank" msgstr "" #: data.hpp:292 #, fuzzy #| msgid "Code Name" msgid "Name" msgstr "Kodenavn" #: data.hpp:293 msgid "Kernel" msgstr "Kjerne" #: data.hpp:294 msgid "Hostname" msgstr "Vertsnavn" #: data.hpp:295 msgid "Uptime" msgstr "Oppetid" #: data.hpp:303 msgid "Used" msgstr "Brukt" #: data.hpp:304 msgid "Buffers" msgstr "Mellomlagre" #: data.hpp:305 msgid "Cached" msgstr "Mellomlagret" #: data.hpp:306 msgid "Free" msgstr "Ledig" #: data.hpp:307 msgid "Swap" msgstr "Sidevekslingsfil" #: data.hpp:333 msgid "Driver" msgstr "Driver" #: data.hpp:334 #, fuzzy #| msgid "Version" msgid "UMD Version" msgstr "Versjon" #: data.hpp:336 #, fuzzy msgid "Compute Unit" msgstr "Regneenhet" #: data.hpp:337 #, fuzzy #| msgid "DeviceID" msgid "Device ID" msgstr "Enhets-ID" #: data.hpp:338 #, fuzzy #| msgid "Version" msgid "VBIOS Version" msgstr "Versjon" #. #-#-#-#-# source_ui.pot (cpu-x ) #-#-#-#-# #. Setting: "Interface" tab #: data.hpp:339 cpu-x-gtk-3.12.ui:5807 msgid "Interface" msgstr "Grensesnitt" #: data.hpp:340 msgid "Temperature" msgstr "Temperatur" #: data.hpp:342 msgid "Core Voltage" msgstr "Kjernespenning" #: data.hpp:343 msgid "Power Avg" msgstr "Effektgjennomsnitt" #: data.hpp:344 #, fuzzy msgid "Core Clock" msgstr "Minne-klokke" #: data.hpp:345 #, fuzzy msgid "Memory Clock" msgstr "Minne-klokke" #: data.hpp:346 #, fuzzy #| msgid "Memory" msgid "Memory Used" msgstr "Minne" #: data.hpp:347 #, fuzzy msgid "Resizable BAR" msgstr "Tilpassbar BAR" #: data.hpp:348 msgid "Vulkan RT" msgstr "Vulkan RT" #: data.hpp:349 #, fuzzy #| msgid "Version" msgid "OpenGL Version" msgstr "Versjon" #: data.hpp:350 #, fuzzy #| msgid "Version" msgid "Vulkan Version" msgstr "Versjon" #: data.hpp:351 #, fuzzy #| msgid "Version" msgid "OpenCL Version" msgstr "Versjon" #: data.hpp:387 msgid "Score" msgstr "Poengsum" #: data.hpp:388 msgid "Run" msgstr "Kjør" #: data.hpp:407 msgid "Duration" msgstr "Varighet" #: util.hpp:77 msgid "bytes" msgstr "byte" #. TRANSLATORS: initials for kilobyte (10³): please put initials (keep it short) #: util.hpp:80 msgid "kB" msgstr "kB" #. TRANSLATORS: initials for megabyte (10⁶): please put initials (keep it short) #: util.hpp:82 msgid "MB" msgstr "MB" #. TRANSLATORS: initials for gigabyte (10⁹): please put initials (keep it short) #: util.hpp:84 msgid "GB" msgstr "GB" #. TRANSLATORS: initials for terabyte (10¹²): please put initials (keep it short) #: util.hpp:86 msgid "TB" msgstr "TB" #. TRANSLATORS: initials for kibibyte (2¹⁰): please put initials (keep it short) #: util.hpp:89 msgid "KiB" msgstr "KiB" #. TRANSLATORS: initials for mebibyte (2²⁰): please put initials (keep it short) #: util.hpp:91 #, fuzzy #| msgid "MB" msgid "MiB" msgstr "MB" #. TRANSLATORS: initials for gibibyte (2³⁰): please put initials (keep it short) #: util.hpp:93 #, fuzzy #| msgid "GB" msgid "GiB" msgstr "GB" #. TRANSLATORS: initials for tebibyte (2⁴⁰): please put initials (keep it short) #: util.hpp:95 #, fuzzy #| msgid "TB" msgid "TiB" msgstr "TB" #: cpu-x-gtk-3.12.ui:1184 msgid "Cache" msgstr "Hurtiglager" #. Setting: refresh time for UI #: cpu-x-gtk-3.12.ui:5721 #, fuzzy msgid "Refresh time" msgstr "Gjenoppfriskningstid" #. Setting: GUI theme #: cpu-x-gtk-3.12.ui:5745 #, fuzzy #| msgid "Theme" msgid "Text theme" msgstr "Drakt" #. Setting: automatic GUI theme #: cpu-x-gtk-3.12.ui:5760 msgid "Automatic" msgstr "Automatisk" #. Setting: light GUI theme #: cpu-x-gtk-3.12.ui:5761 msgid "Blue for light theme" msgstr "" #. Setting: dark GUI theme #: cpu-x-gtk-3.12.ui:5762 msgid "Yellow for dark theme" msgstr "" #. Setting: temperature unit #: cpu-x-gtk-3.12.ui:5775 #, fuzzy #| msgid "Temperature" msgid "Temperature unit" msgstr "Temperatur" #. Setting: default tab at startup #: cpu-x-gtk-3.12.ui:5826 msgid "Default tab" msgstr "Forvalgt fane" #. Setting: default CPU core at startup #: cpu-x-gtk-3.12.ui:5839 msgid "Default CPU core" msgstr "Forvalgt prosessorkjerne" #. Setting: default cache test at startup #: cpu-x-gtk-3.12.ui:5852 msgid "Default cache test" msgstr "Forvalgt hurtiglagertekst" #. Setting: print CPUID values in decimal or hexadecimal #: cpu-x-gtk-3.12.ui:5895 #, fuzzy msgid "Print CPUID values in decimal" msgstr "Skriv ut CPUID-verdier i desimalform (forvalget er heksadesimaler)" #. Setting: default graphic card at startup #: cpu-x-gtk-3.12.ui:5928 #, fuzzy #| msgid "Set default tab (integer)" msgid "Default graphic card" msgstr "Sett forvalgt fane (heltall)" #. Setting: default CPU core at startup #: cpu-x-gtk-3.12.ui:5952 #, fuzzy #| msgid "Default cache test" msgid "Default core type" msgstr "Forvalgt hurtiglagertekst" #. Setting: default graphic card at startup #: cpu-x-gtk-3.12.ui:5976 #, fuzzy #| msgid "Default cache test" msgid "Default memory stick" msgstr "Forvalgt hurtiglagertekst" #. Setting: "Startup" tab #: cpu-x-gtk-3.12.ui:6004 msgid "Startup" msgstr "Oppstart" #~ msgid "Light" #~ msgstr "Lys" #~ msgid "Dark" #~ msgstr "Mørk" #, fuzzy #~ msgid "Calculating CPU multipliers" #~ msgstr "Regner ut prosessor-multiplikatorer …" #, fuzzy, c-format #~ msgid "Current: PCIe Gen%1dx%d / Max: Gen%1dx%d" #~ msgstr "Nåværende: PCIe-gen%1dx%d / Maks: gen%1dx%d" #~ msgid "failed to retrieve GPU clocks" #~ msgstr "klarte ikke å hente GPU-klokker" #, c-format #~ msgid "Core #%i" #~ msgstr "Kjerne #%i" #~ msgid "Setting label names" #~ msgstr "Setter etikettnavn" #, fuzzy, c-format #~ msgid "Bank %i" #~ msgstr "Bank %i" #~ msgid "Reference" #~ msgstr "Referanse" #~ msgid "Distribution" #~ msgstr "Distro" #~ msgid "Compiler" #~ msgstr "Kompilator" #~ msgid "GPU clock" #~ msgstr "prosessor-klokke" #, fuzzy #~ msgid "Dumping data…" #~ msgstr "Dumper data …" #~ msgid "Freeing memory" #~ msgstr "Frigjør minne" #~ msgid "Ignore CPU frequency reported by libcpuid" #~ msgstr "Ignorer prosessorfrekvens rapportert av libcpuid" #, c-format #~ msgid "failed to call wordexp (%i)" #~ msgstr "Klarte ikke å kalle wordexp (%i)" #~ msgid "Press 'home' key to scroll up in a page." #~ msgstr "Trykk på \"hjem\"-tasten for å bla oppover på en side." #, fuzzy #~| msgid "\tPress 'left' key to switch in left tab.\n" #~ msgid "Press 'end' key to scroll down in a page." #~ msgstr "\tTrykk \"venstre piltast\" for å veksle i venstre fane.\n" #, c-format #~ msgid "String '%s' is too long, truncating…" #~ msgstr "Strengen «%s» er for lang, forkorter …" #, c-format #~ msgid "failed to open %s directory" #~ msgstr "Klarte ikke å åpne %s-mappen" #~ msgid "an error occurred while compiling regex" #~ msgstr "Feil under kompilering av regulære uttrykk" #~ msgid "FATAL ERROR: could not allocate memory" #~ msgstr "Fatal feil: Kunne ikke tildele minne" #, fuzzy, c-format #~| msgid "failed to call dmidecode" #~ msgid "failed to call vkEnumerateInstanceExtensionProperties (%s)" #~ msgstr "kall til dmidecode mislyktes" #~ msgid "Vulkan API is not available" #~ msgstr "Vulkan-API-et er ikke tilgjengelig" #, c-format #~ msgid "%s" #~ msgstr "%s" #, c-format #~ msgid "" #~ "CPU hybrid architecture is not supported. For more details, please refer " #~ "to following issue: %s" #~ msgstr "" #~ "Hybrid-prosessorarkitektur støttes ikke. Flere detaljer er å finne i " #~ "denne feilrapporten: %s" #~ msgid "NOT SUPPORTED" #~ msgstr "IKKE STØTTET" #, fuzzy #~ msgid "There is no device with Vulkan support" #~ msgstr "Det finnes ingen plattform med OpenCL-støtte (%s)" #~ msgid "Socket(s)" #~ msgstr "Sokkel" #~ msgid "Thread(s)" #~ msgstr "Tråd(er)" #~ msgid "You can paste this backtrace by opening a new issue here:" #~ msgstr "" #~ "Du kan lime inn denne tilbakesporingen ved å åpne en ny feilrapport her:" #, fuzzy #~| msgid "failed to call dmidecode" #~ msgid "faild to call clGetDeviceIDs" #~ msgstr "kall til dmidecode mislyktes" #~ msgid "Exiting %s" #~ msgstr "Avslutter %s" #, fuzzy #~ msgid "Skip CPU MSR opening (need to be root)" #~ msgstr "Hopp over CPU MSR-åpning (superbrukerrettigheter påkrevd)" #~ msgid "failed to open CPU MSR (%s)" #~ msgstr "Klarete ikke å åpne CPU MSR (%s)" #~ msgid "Skip call to dmidecode (need to be root)" #~ msgstr "Hopp over kall til dmidecode (root-rettigheter behøves)" #~ msgid "failed to allocate memory for dmidecode" #~ msgstr "klarte ikke å tildele minne til dmidecode" #~ msgid "Finding graphic card driver" #~ msgstr "Finner grafikkortdriver" #~ msgid "(%s driver)" #~ msgstr "(%s-driver)" #~ msgid "Retrieving GPU temperature" #~ msgstr "Henter GPU-temperatur" #~ msgid "Off" #~ msgstr "Av" #~ msgid "failed to retrieve GPU temperature" #~ msgstr "Klarte ikke å hente GPU-temperatur" #~ msgid "Skip some GPU values (need to be root)" #~ msgstr "Hopp over noen GPU-verdier (root-tilgang behøves)" #~ msgid "failed to allocate memory for benchmark" #~ msgstr "Klarte ikke å tildele minne for ytelsestest" #, fuzzy #~ msgid "Root privileges are required to work properly" #~ msgstr "Superbrukerprivilegier kreves for at ting skal virke" #~ msgid "Some information will not be retrievable" #~ msgstr "Noe info kunne ikke innhentes" #~ msgid "Ignore" #~ msgstr "Ignorer" #~ msgid "Run as root" #~ msgstr "Kjør som superbruker" #~ msgid "A new version of %s is available!" #~ msgstr "Ny versjon av %s tilgjengelig." #~ msgid "" #~ "Do you want to update %s to version %s after exit?\n" #~ "It will erase this binary file (%s) by the new version." #~ msgstr "" #~ "Ønsker du å oppgradere %s til versjon %s etter avslutning?\n" #~ "Det vil slette den kjørbare filen (%s) og erstatte den med den nye " #~ "versjonen." #~ msgid "Not now" #~ msgstr "Ikke nå" #~ msgid "Update" #~ msgstr "Oppgrader" #, fuzzy #~ msgid "Checking on Internet for a new version..." #~ msgstr "Ser etter ny versjon…" #, fuzzy #~ msgid "failed to open a Curl session" #~ msgstr "Klarte ikke å åpne Curl-økt" #~ msgid "wrong write data" #~ msgstr "Feil data forsøkt skrevet" #~ msgid "(version %s is available)" #~ msgstr "(versjon %s er tilgjengelig)" #~ msgid "No new version available" #~ msgstr "Ingen ny versjon tilgjengelig" #~ msgid "(up-to-date)" #~ msgstr "(nyeste versjon)" #~ msgid "an error occurred while extracting %s archive (%s)" #~ msgstr "Feil under utpakking %s-arkiv (%s)" #~ msgid "" #~ "Network access is disabled by environment variable (set CPUX_NETWORK with " #~ "a positive value to enable it)" #~ msgstr "" #~ "Nettverkstilgang er avskrudd av miljøvariabel (sett CPUX_NETWORK med " #~ "positiv verdi for å skru den på)" #, fuzzy #~ msgid "failed to open %s archive for writing" #~ msgstr "Klarte ikke å åpne %s-arkiv for skriving" #~ msgid "Downloading new version..." #~ msgstr "Laster ned ny versjon…" #, fuzzy #~ msgid "failed to download %s archive (%s)" #~ msgstr "Kunne ikke laste ned %s-arkiv (%s)" #~ msgid "Extracting new version..." #~ msgstr "Pakker ut ny versjon…" #, fuzzy #~ msgid "Applying new version..." #~ msgstr "Iverksetter ny versjon…" #~ msgid "an error occurred while removing/renaming files" #~ msgstr "En feil inntraff under flytting/endring av filnavn" #~ msgid "Update successful!" #~ msgstr "Oppgradert." #~ msgid "Update portable version if a new version is available" #~ msgstr "Oppgrader portabel versjon hvis en ny versjon er tilgjengelig" #~ msgid "Temporarily disable network support" #~ msgstr "Skru av nettverksstøtte midlertidig" #, fuzzy #~ msgid "Built on %s, %s (with %s %s on %s)." #~ msgstr "Bygd på %s, %s (med %s %s på %s)." #~ msgid "" #~ "Sorry, you cannot update %s: 32-bit portable version is no more supported." #~ msgstr "" #~ "Du kan ikke oppgradere %s: 32-biters portabel versjon støttes ikke lenger." #~ msgid "If you want to update, press 'u' key, or anything else to skip.\n" #~ msgstr "" #~ "Hvis du vil oppgradere, trykk \"u\"-tasten, eller vilkårlig annen tast " #~ "for å hoppe over.\n" #, fuzzy #~ msgid "" #~ "\n" #~ "\n" #~ "%s will be updated." #~ msgstr "" #~ "\n" #~ "\n" #~ "%s vil bli oppgradert." CPU-X-5.0.3/po/nl.po000066400000000000000000001117331454622605200137560ustar00rootroot00000000000000# CPU-X translations template # Copyright © 2014-2024 The Tumultuous Unicorn Of Darkness # This file is distributed under the same license as the cpu-x package. # Heimen Stoffels , 2021. # Heimen Stoffels , 2022. # Matrix , 2023. # 跨性别 , 2023. msgid "" msgstr "" "Project-Id-Version: cpu-x\n" "Report-Msgid-Bugs-To: https://github.com/TheTumultuousUnicornOfDarkness/CPU-" "X/issues\n" "POT-Creation-Date: 2023-12-09 13:09+0100\n" "PO-Revision-Date: 2023-12-14 19:17+0000\n" "Last-Translator: 跨性别 \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.3\n" #: core.cpp:135 msgid "Finding CPU technology" msgstr "Zoeken naar CPU-technologie" #: core.cpp:161 #, c-format msgid "" "Your CPU is not present in the database ==> %s, model: %i, ext. model: %i, " "ext. family: %i" msgstr "" "Uw cpu is niet opgenomen in de databank. %s - model: %i - ext. model: %i - " "ext. familie: %i" #: core.cpp:189 data.cpp:150 data.cpp:342 msgid "unknown" msgstr "onbekend" #: core.cpp:230 msgid "Calling libcpuid for retrieving static data" msgstr "Libcpuid aanroepen om statische data op te halen" #: core.cpp:245 #, c-format msgid "failed to call libcpuid (%s)" msgstr "libcpuid kan niet worden aangeroepen (%s)" #: core.cpp:340 msgid "Calling libcpuid for retrieving dynamic data" msgstr "Libcpuid aanroepen om dynamische data op te halen" #: core.cpp:353 msgid "Calling libcpuid for retrieving CPU MSR static values" msgstr "Libcpuid aanroepen om statische CPU MSR warden op te halen" #: core.cpp:380 msgid "Calling libcpuid for retrieving CPU MSR dynamic values" msgstr "Libcpuid aanroepen om dynamische CPU MSR waardenop te halen" #: core.cpp:412 msgid "Calling dmidecode" msgstr "Dmidecode aanroepen" #: core.cpp:454 core.cpp:473 #, c-format msgid "%s (configured)" msgstr "%s (Geconfigureerd)" #: core.cpp:461 core.cpp:480 #, c-format msgid "%s (max)" msgstr "%s (max)" #: core.cpp:466 #, c-format msgid "%s (min)" msgstr "%s (min)" #: core.cpp:496 msgid "Calculating CPU usage" msgstr "Bezig met berekenen van CPU-verbruik" #: core.cpp:546 msgid "Calling bandwidth" msgstr "Bandwidth aanroepen" #: core.cpp:613 #, c-format msgid "" "pci_access is not properly initialized: it is a common issue when %s was " "built with a lower libpci version.\n" "Check that libpci %s library is present on your system. Otherwise, please " "rebuild %s." msgstr "" "pci_acces is niet correct geïnitialiseerd: het is een veelvoorkomend " "probleem als %s gebouwd is met een lagere libpci versie.\n" "Controleer of de libpci %s bibliotheek aanwezig is op uw systeem. Anders, " "herbouw alstublieft %s." #: core.cpp:657 #, c-format msgid "No kernel driver in use for graphic card at path %s" msgstr "Geen kernel-stuurprogramma in gebruik voor grafische kaart op pad %s" #: core.cpp:693 #, c-format msgid "Your GPU kernel driver is unknown: %s" msgstr "Uw GPU kernel-stuurprogramma is onbekend: %s" #: core.cpp:777 #, c-format msgid "Your GPU user mode driver is unknown for vendor %s: %s" msgstr "Uw GPU gebruikersmodusstuurprogramma is onbekend: %s: %s" #: core.cpp:781 #, c-format msgid "failed to call GLFW (%i): %s" msgstr "Kon GLFW niet aanroepen (%i): %s" #: core.cpp:914 msgid "Finding Vulkan API version" msgstr "Zoeken naar Vulkan API versie" #: core.cpp:926 #, c-format msgid "failed to call vkCreateInstance (%s)" msgstr "Kon vkCreateInstance niet aanroepen (%s)" #: core.cpp:929 #, c-format msgid "%s is not supported" msgstr "%s wordt niet ondersteund" #: core.cpp:937 #, c-format msgid "failed to call vkEnumeratePhysicalDevices (%s)" msgstr "kon vkEnumeratePhysicalDevices niet aanroepen (%s)" #: core.cpp:944 msgid "No available Vulkan devices" msgstr "Geen beschikbare Vulkan apparaten" #: core.cpp:952 #, c-format msgid "No available physical devices (%s)" msgstr "Geen beschikbare fysieke apparaten (%s)" #: core.cpp:1015 #, c-format msgid "Failed to create Vulkan for device %u (%s)" msgstr "Kon Vulkan niet aanmaken voor apparaat %u (%s)" #: core.cpp:1019 #, c-format msgid "%s is not supported for device %u, use only deviceID for matching" msgstr "" "%s is niet ondersteund voor apparaat %u, gebruik alleen deviceID voor " "matching" #: core.cpp:1051 core.cpp:1364 msgid "Enabled" msgstr "Ingeschakeld" #: core.cpp:1051 core.cpp:1364 msgid "Disabled" msgstr "Uitgeschakeld" #: core.cpp:1088 msgid "Finding OpenCL API version" msgstr "Zoeken naar OpenCL API versie" #: core.cpp:1092 #, c-format msgid "There is no platform with OpenCL support (%s)" msgstr "Er is geen platform met OpenCL ondersteuning (%s)" #: core.cpp:1102 #, c-format msgid "failed to get all OpenCL platforms (%s)" msgstr "Kon niet alle OpenCL platformen krijgen (%s)" #: core.cpp:1115 #, c-format msgid "failed to get name for platform %u (%s)" msgstr "Kon niet de naam krijgen voor platform %u (%s)" #: core.cpp:1123 #, c-format msgid "failed to get version for platform %u (%s)" msgstr "Kon niet de versie krijgen voor platform %u (%s)" #: core.cpp:1131 #, c-format msgid "failed to find number of OpenCL devices for platform '%s %s' (%s)" msgstr "Kon niet het aantal OpenCL apparaten vinden voor platform '%s %s' (%s)" #: core.cpp:1131 msgid "0 device" msgstr "0 apparaten" #: core.cpp:1140 #, c-format msgid "failed to get all of OpenCL devices for platform '%s %s' (%s)" msgstr "Kon niet alle OpenCL apparaten krijgen voor platfrom '%s %s' (%s)" #: core.cpp:1160 #, c-format msgid "failed to get name for device %u (%s)" msgstr "Kon niet de naam krijgen voor apparaat %u (%s)" #: core.cpp:1168 #, c-format msgid "failed to get version for device %u (%s)" msgstr "Kon niet de versie krijgen voor apparaat %u (%s)" #: core.cpp:1190 #, c-format msgid "OpenCL driver for '%s %s' does not support CL_DEVICE_TOPOLOGY_AMD (%s)" msgstr "" "OpenCL stuurprogramma voor '%s%s' ondersteunt CL_DEVICE_TOPOLGY_AMD(%s) niet" #: core.cpp:1201 #, c-format msgid "" "OpenCL driver for '%s %s' does not support CL_DEVICE_GFXIP_MAJOR_AMD (%s)" msgstr "" "OpenCL stuurprogramma voor '%s%s' ondersteunt CL_DEVICE_GFXIP_MAJOR_AMD (%s) " "niet" #: core.cpp:1209 core.cpp:1229 core.cpp:1262 #, c-format msgid "" "OpenCL driver for '%s %s' does not support CL_DEVICE_MAX_COMPUTE_UNITS (%s)" msgstr "" "OpenCL stuurprogramma voor '%s%s' ondersteunt CL_DEVICE_MAX_COMPUTE_UNITS " "(%s) niet" #: core.cpp:1250 #, c-format msgid "" "OpenCL driver for '%s %s' does not support CL_DEVICE_PCI_DOMAIN_ID_NV (%s), " "CL_DEVICE_PCI_BUS_ID_NV (%s) or CL_DEVICE_PCI_SLOT_ID_NV (%s)" msgstr "" "OpenCL stuurprogramma voor '%s%s' ondersteunt CL_DEVICE_PCI_DOMAIN_ID_NV " "(%s), CL_DEVICE_PCI_BUS_ID_NV (%s) or CL_DEVICE_PCI_SLOT_ID_NV (%s) niet" #: core.cpp:1273 #, c-format msgid "OpenCL is not supported with your GPU vendor (0x%X)" msgstr "OpenCL wordt niet ondersteund door uw GPU fabrikant (0x%X)" #: core.cpp:1295 msgid "Finding devices" msgstr "Zoeken naar apparaten" #: core.cpp:1307 #, c-format msgid "Skip devices search (wrong permissions on %s device)" msgstr "Zoeken naar apparaten overslaan (verkeerde rechten op %s device)" #: core.cpp:1350 #, c-format msgid "Your GPU vendor is unknown: %s (0x%X)" msgstr "Uw GPU fabrikant is onbekend: %s (0x%X)" #: core.cpp:1370 msgid "failed to find chipset vendor and model" msgstr "Kon niet de chipsetfabrikant en model vinden" #: core.cpp:1385 msgid "failed to find graphic card vendor and model" msgstr "Kon niet de grafische kaart fabrikant en model vinden" #: core.cpp:1487 msgid "Retrieving GPU clocks" msgstr "GPU klokken ophalen" #: core.cpp:1500 msgid "None" msgstr "Geen" #: core.cpp:1509 #, c-format msgid "DRM path for %s is unknown" msgstr "DRM pad voor GPU %s is onbekend" #: core.cpp:1516 #, c-format msgid "Card number for %s is unknown" msgstr "Kaartnummer voor GPU %s is onbekend" #: core.cpp:1541 #, c-format msgid "PCIe %s (current) / %s (max)" msgstr "PCIe %s (huidig) / %s (max)" #: core.cpp:1650 #, c-format msgid "Driver for %s doesn't report frequencies" msgstr "Stuurprogramma voor GPU %s meldt geen frequenties" #: core.cpp:1671 #, c-format msgid "failed to retrieve all monitoring data for %s" msgstr "Kon niet alle monitorgegevens ophalen voor (%s)" #: core.cpp:1694 msgid "Identifying running system" msgstr "Lopend systeem wordt geïdentificeerd" #: core.cpp:1697 msgid "failed to identify running system" msgstr "Kon het lopende besturingssysteem niet identificeren" #: core.cpp:1749 core.cpp:1778 msgid "Calling libprocps" msgstr "Libprocps aanroepen" #: core.cpp:1752 msgid "unable to get system uptime" msgstr "De bedrijfstijd van het systeem kan niet worden bepaald" #: core.cpp:1758 msgid "unable to create meminfo structure" msgstr "Meminfo structuur kan niet gemaakt worden" #: core.cpp:1804 msgid "Calling libstatgrab" msgstr "Libstatgrab aanroepen" #: core.cpp:1852 #, c-format msgid "%i days, %i hours, %i minutes, %i seconds" msgstr "%i dagen, %i uren, %i minuten, %i seconden" #: core.cpp:1915 msgid "Updating benchmark status" msgstr "Benchmark status wordt bijgewerkt" #: core.cpp:1918 msgid "Active" msgstr "Actief" #: core.cpp:1921 #, c-format msgid "(%u hours left)" msgstr "(%u uren over)" #: core.cpp:1923 #, c-format msgid "(%u minutes left)" msgstr "(%u minuten over)" #: core.cpp:1925 #, c-format msgid "(%u seconds left)" msgstr "(%u seconden over)" #: core.cpp:1929 core.cpp:1984 core.cpp:1985 msgid "Inactive" msgstr "Inactief" #: core.cpp:1932 #, c-format msgid "in %u hours" msgstr "in %u uren" #: core.cpp:1934 #, c-format msgid "in %u minutes" msgstr "in %u minuten" #: core.cpp:1936 #, c-format msgid "in %u seconds" msgstr "in %u seconden" #: core.cpp:1953 #, c-format msgid "Starting benchmark with %u threads" msgstr "Benchmark aan het starten met %u threads" #: core.cpp:1976 msgid "an error occurred while starting benchmark" msgstr "er is een fout opgetreden tijdens het starten van de benchmark" #: core.cpp:2002 msgid "Finding CPU package in fallback mode" msgstr "CPU pakket zoeken in back-up modus" #: core.cpp:2032 #, c-format msgid "Your CPU socket is not present in the database ==> %s, codename: %s" msgstr "" "Uw CPU aansluiting is niet aanwezig in de database ==> %s, codename: %s" #: core.cpp:2052 msgid "Calculating CPU multipliers in fallback mode" msgstr "CPU multiplicators in back-up modus berekenen" #: core.cpp:2072 msgid "Retrieving motherboard information in fallback mode" msgstr "Moederbord informatie ophalen in back-up modus" #: core.cpp:2085 msgid "failed to retrieve motherboard information (fallback mode)" msgstr "Kon moederbord informatie niet ophalen (back-up modus)" #: core.cpp:2127 msgid "Retrieving CPU temperature in fallback mode" msgstr "CPU temperatuur ophalen in back-up modus" #: core.cpp:2173 msgid "failed to retrieve CPU temperature (fallback mode)" msgstr "Kon CPU temperatuur niet ophalen (back-up modus)" #: core.cpp:2188 msgid "Retrieving CPU voltage in fallback mode" msgstr "CPU spanning ophalen in back-up modus" #: core.cpp:2200 msgid "failed to retrieve CPU voltage (fallback mode)" msgstr "Kon CPU spanning niet ophalen (back-up modus)" #: core.cpp:2214 msgid "Retrieving CPU frequency in fallback mode" msgstr "CPU frequentie ophalen in back-up modus" #: core.cpp:2220 msgid "failed to retrieve CPU frequency (fallback mode)" msgstr "Kon CPU frequentie niet ophalen (back-up modus)" #: daemon_client.cpp:65 msgid "Starting daemon in background…" msgstr "Daemon in de achtergrond aan het starten…" #: daemon_client.cpp:172 msgid "pkexec: authorization could not be obtained (dialog dismissed)" msgstr "pkexec: autorisatie kon niet verkregen worden (dialoog afgewezen)" #: daemon_client.cpp:175 msgid "pkexec: authorization could not be obtained (not authorized)" msgstr "pkexec: autorisatie kon niet verkregen worden (niet geautoriseerd)" #: daemon_client.cpp:178 msgid "pkexec: command not found" msgstr "pkexec: commando niet gevonden" #: daemon_client.cpp:181 msgid "pkexec: unexpected error code" msgstr "pkexec: onverwachte foutcode" #: daemon_client.cpp:211 msgid "Connecting to daemon…" msgstr "Verbinden met daemon…" #: daemon_server.cpp:261 #, c-format msgid "request_handler: case %i not handled" msgstr "request_handler: geval %i niet verwerkt" #: data.cpp:124 cpu-x-gtk-3.12.ui:1370 msgid "CPU" msgstr "CPU" #: data.cpp:187 msgid "P-core" msgstr "P-Kern" #: data.cpp:188 msgid "E-core" msgstr "E-Kern" #: data.cpp:189 data.cpp:192 msgid "Core" msgstr "Kern" #: data.cpp:208 cpu-x-gtk-3.12.ui:746 msgid "Processor" msgstr "Processor" #: data.cpp:240 data.cpp:329 cpu-x-gtk-3.12.ui:1968 msgid "Caches" msgstr "Caches" #: data.cpp:247 #, c-format msgid "%2d x %4d %s, %2d-way" msgstr "%2d x %4d %s, %2d-voudig" #: data.cpp:249 #, c-format msgid "%d %s, %d-way" msgstr "%d %s, %d-voudig" #: data.cpp:263 msgid "Count" msgstr "Tel" #: data.cpp:276 cpu-x-gtk-3.12.ui:968 msgid "Clocks" msgstr "Klokken" #: data.cpp:379 data.cpp:383 #, c-format msgid "L%u Cache" msgstr "L%u Cache" #: data.cpp:385 #, c-format msgid "%s associative, %d-%s line size" msgstr "%s associatief, %d-%s regelgrootte" #: data.cpp:398 msgid "Test" msgstr "Test" #: data.cpp:409 data.cpp:423 cpu-x-gtk-3.12.ui:2146 cpu-x-gtk-3.12.ui:2517 msgid "Motherboard" msgstr "Moederbord" #: data.cpp:437 cpu-x-gtk-3.12.ui:2367 msgid "BIOS" msgstr "BIOS" #: data.cpp:452 cpu-x-gtk-3.12.ui:2498 msgid "Chipset" msgstr "Chipset" #: data.cpp:467 data.cpp:569 cpu-x-gtk-3.12.ui:3156 cpu-x-gtk-3.12.ui:3761 msgid "Memory" msgstr "Geheugen" #: data.cpp:483 #, c-format msgid "Stick %u" msgstr "Stick %u" #: data.cpp:487 cpu-x-gtk-3.12.ui:3134 msgid "Sticks" msgstr "Sticks" #: data.cpp:541 cpu-x-gtk-3.12.ui:3780 msgid "System" msgstr "Systeem" #: data.cpp:554 cpu-x-gtk-3.12.ui:3380 msgid "Operating System" msgstr "Besturingssysteem" #: data.cpp:587 cpu-x-gtk-3.12.ui:4960 msgid "Graphics" msgstr "Grafisch" #: data.cpp:621 #, c-format msgid "Card %u" msgstr "Kaart %u" #: data.cpp:625 cpu-x-gtk-3.12.ui:4938 msgid "Cards" msgstr "Kaarten" #: data.cpp:672 cpu-x-gtk-3.12.ui:5300 msgid "Bench" msgstr "Bench" #: data.cpp:685 msgid "Not started" msgstr "Niet gestart" #: data.cpp:688 cpu-x-gtk-3.12.ui:5070 msgid "Prime numbers (slow)" msgstr "Priemgetallen (langzaam)" #: data.cpp:692 cpu-x-gtk-3.12.ui:5178 msgid "Prime numbers (fast)" msgstr "Priemgetallen (snel)" #: data.cpp:696 cpu-x-gtk-3.12.ui:5281 msgid "Parameters" msgstr "Parameters" #: data.cpp:721 data.cpp:727 #, c-format msgid "%u mins" msgstr "%u minuten" #: data.cpp:734 cpu-x-gtk-3.12.ui:5444 cpu-x-gtk-3.12.ui:5552 msgid "About" msgstr "Over" #: data.cpp:739 #, c-format msgid "" "%s is a Free software that gathers information\n" "on CPU, motherboard and more." msgstr "" "%s is een Gratis software die informatie\n" "over CPU, moederbord en meer verzameld." #: data.cpp:744 msgid "About CPU-X" msgstr "Over CPU-X" #: data.cpp:745 #, c-format msgid "Version %s" msgstr "Versie %s" #: data.cpp:746 #, c-format msgid "Author: %s" msgstr "Auteur: %s" #: data.cpp:747 #, c-format msgid "Site: %s" msgstr "Site: %s" #: data.cpp:751 cpu-x-gtk-3.12.ui:5533 msgid "License" msgstr "Licentie" #: data.cpp:753 #, c-format msgid "This software is distributed under the terms of %s" msgstr "Deze software wordt verspreid onder de voorwaarden van %s" #: data.cpp:754 main.cpp:176 msgid "This program comes with ABSOLUTELY NO WARRANTY" msgstr "Dit programma komt met ABSOLUUT GEEN GARANTIE" #: gui_gtk.cpp:61 #, c-format msgid "Cannot find path for '%s' file" msgstr "Kan het pad voor '%s' niet vinden" #: gui_gtk.cpp:400 msgid "Start daemon" msgstr "Start daemon" #: gui_gtk.cpp:403 msgid "Connected to daemon" msgstr "Verbonden met daemon" #: gui_gtk.cpp:406 msgid "No polkit authentication agent found" msgstr "Geen polkit authenticatieagent gevonden" #: gui_gtk.cpp:411 msgid "Ask password to start daemon in background" msgstr "Vraag wachtwoord om daemon op de achtergrond te starten" #: gui_gtk.cpp:415 msgid "Settings" msgstr "Instellingen" #: gui_gtk.cpp:634 msgid "BaseFamily" msgstr "BaseFamily" #: gui_gtk.cpp:635 msgid "CPU display (\"true\") family (computed as BaseFamily+ExtendedFamily)" msgstr "" "CPU weergave (\"true\") CPU familie(berekend als BaseFamily+ExtendedFamily)" #: gui_gtk.cpp:636 msgid "BaseModel" msgstr "BaseModel" #: gui_gtk.cpp:637 msgid "CPU display (\"true\") model (computed as (ExtendedModel<<4)+BaseModel)" msgstr "" "CPU weergave (\"true\") model (berekend als (ExtendedModel<<4)+BaseModel)" #: gui_gtk.cpp:847 msgid "" "Identify the physically-labeled socket or board position where the memory " "device is located" msgstr "" "Identificeer de fysiek gelabelde socket of kaartpositie waar het " "geheugenapparaat zich bevindt" #: gui_gtk.cpp:848 msgid "Identify the physically labeled bank where the memory device is located" msgstr "" "Identificeer de fysiek gelabelde bank waar het geheugenapparaat zich bevindt" #: gui_gtk.cpp:1052 msgid "User Mode Driver Version" msgstr "Gebruikersmodus Stuurprogramma Versie" #: gui_gtk.cpp:1066 msgid "Vulkan Ray Tracing" msgstr "Vulkan Ray Tracing" #: gui_gtk.cpp:1260 msgid "Starting GTK GUI…" msgstr "GTK GUI wordt gestart…" #: gui_gtk.cpp:1272 msgid "failed to import UI in GtkBuilder" msgstr "Kon UI niet importeren in GtkBuilder" #: main.cpp:63 msgid "Start graphical user interface (GUI) (default)" msgstr "Grafische Gebruikers Interface (GUI) starten (Standaard)" #: main.cpp:64 msgid "Start text-based user interface (TUI)" msgstr "Tekstgebaseerde gebruikersinterface (TUI) starten" #: main.cpp:65 msgid "Dump all data on standard output and exit" msgstr "Alle data dumpen naar de standaard uitvoer en beëindig het programma" #: main.cpp:66 msgid "Run embedded command dmidecode and exit" msgstr "Voer embedded commando dmidecode uit en beëindig het programma" #: main.cpp:67 msgid "Run embedded command bandwidth and exit" msgstr "Voer embedded commando bandwidth uit en beëindig het programma" #: main.cpp:68 msgid "Set temperature unit (c[elsius]|f[ahrenheit]|k[elvin]|r[ankine])" msgstr "" "Ingestelde temperatuureenheid (c[elsius]|f[ahrenheit]|k[elvin]|r[ankine])" #: main.cpp:69 msgid "Set custom time between two refreshes (in seconds)" msgstr "Stel aangepaste tijd in tussen twee verversingen (in seconden)" #: main.cpp:70 msgid "Set default tab (integer)" msgstr "Standaard tab instellen (Geheel getal)" #: main.cpp:71 msgid "Select core type to monitor (integer)" msgstr "Selecteer een kern om te monitoren (Geheel getal)" #: main.cpp:72 msgid "Select CPU core to monitor (integer)" msgstr "Selecteer CPU kern om te monitoren (Geheel getal)" #: main.cpp:73 msgid "Set custom bandwidth test for CPU caches speed (integer)" msgstr "" "Stel aangepaste bandbreedte test in voor CPU cache snelheid (Geheel getal)" #: main.cpp:74 msgid "Select default memory stick (integer)" msgstr "Selecteer standaard geheugenstick (geheel getal)" #: main.cpp:75 msgid "Select default graphic card (integer)" msgstr "Selecteer standaard grafische kaart (Geheel getal)" #: main.cpp:76 cpu-x-gtk-3.12.ui:5910 msgid "Start and connect to daemon" msgstr "Start en verbind met daemon" #: main.cpp:77 msgid "Verbose output" msgstr "Uitgebreide uitvoer" #: main.cpp:78 msgid "Print help and exit" msgstr "Druk helptekst af en beëindig het programma" #: main.cpp:79 msgid "Print version and exit" msgstr "Druk versie af en beëindig het programma" #: main.cpp:80 msgid "Print CPUID values in decimal (default is hexadeximal)" msgstr "Druk CPUID waardes af in decimale weergave (standaard is hexadecimaal)" #: main.cpp:81 msgid "Disable colored output" msgstr "Gekleurde uitvoer uitschakelen" #: main.cpp:82 msgid "Print information for debugging" msgstr "Druk informatie af voor foutopsporing" #: main.cpp:83 msgid "Print required information to paste in an issue" msgstr "Druk vereiste informatie af om te plakken in een probleembericht" #: main.cpp:84 msgid "Set key mapping for NCurses mode (a[rrows]|e[macs]|i[nverted-T]|v[im])" msgstr "" "Sneltoetsen instellen voor NCurses modus (a[pijlen]|e[macs]|i[omgekeerde-T]|" "v[im])" #: main.cpp:95 msgid "Add default command line arguments" msgstr "Voeg standaard commandoargumenten toe" #: main.cpp:96 msgid "Enforce the bus clock" msgstr "Forceer busklok" #: main.cpp:97 msgid "" "Ignore CPU values reported by libcpuid (comma-separated values among 'temp', " "'volt' and 'freq')" msgstr "" "Negeer CPU-waarden gerapporteerd door libcpuid (door komma's gescheiden " "waarden tussen 'temp', 'volt' en 'freq')" #: main.cpp:98 msgid "Read CPUID raw data from a given file" msgstr "Lees ruwe CPUID data van een gegeven bestand" #: main.cpp:99 msgid "Only print a message if CPU is not present in the database" msgstr "Druk alleen een bericht af als CPU niet aanwezig is in de database" #: main.cpp:126 #, c-format msgid "Usage: %s DISPLAY [OPTIONS]\n" msgstr "Gebruik: %s WEERGAVE [OPTIES]\n" #: main.cpp:127 msgid "Available DISPLAY:" msgstr "Beschikbare WEERGAVE:" #: main.cpp:135 msgid "Available OPTIONS:" msgstr "Beschikbare OPTIES:" #: main.cpp:144 msgid "Influenceable environment variables:" msgstr "Aanpasbare omgevingsvariabelen:" #: main.cpp:175 msgid "This is free software: you are free to change and redistribute it." msgstr "" "Dit is vrije software: u bent vrij om het te veranderen en verspreiden." #: main.cpp:177 #, c-format msgid "See the %s license: <%s>\n" msgstr "Zie de %s licentie: %s\n" #: main.cpp:184 #, c-format msgid "-- %-9s version: %s" msgstr "-- %-9s versie: %s" #: main.cpp:381 #, c-format msgid "" "\n" "Oops, something was wrong! %s has received signal %d (%s) and has crashed." msgstr "" "\n" "Oeps, er ging iets verkeerd! %s heeft het signaal %d (%s) ontvangen en is " "gecrasht." #: main.cpp:383 #, c-format msgid "" "\n" "Oops, something was wrong! %s has received signal %d (%s) and is trying to " "recover." msgstr "" "\n" "Oeps, er ging iets fout! %s heeft het signaal %d (%s) ontvangen en probeert " "te herstellen." #: main.cpp:407 msgid "You can open a new issue here, by filling the template as requested:" msgstr "" "U kunt hier een nieuw probleem openen, door het invullen van het sjabloon " "zoals gevraagd:" #: main.cpp:449 msgid "an error occurred while setting locale" msgstr "Er is een fout opgetreden tijdens het instellen van de locale" #: options.cpp:124 #, c-format msgid "" "Selected CPU type (%u) is not a valid number (%u is the maximum for this CPU)" msgstr "" "Geselecteerde CPU type (%u) is geen geldig getal (%u is het maximum voor " "deze CPU)" #: options.cpp:145 #, c-format msgid "" "Selected bandwidth test (%u) is not a valid number (%u is the maximum for " "this system)" msgstr "" "Geselecteerde CPU type (%u) is geen geldig getal (%u is het maximum voor dut " "system)" #: options.cpp:168 #, c-format msgid "" "Selected RAM stick (%u) is not a valid number (%u is the maximum for this " "system)" msgstr "" "Geselecteerde RAM stick (%u) is geen geldig getal (%u is het maximum voor " "dit systeem)" #: options.cpp:188 #, c-format msgid "" "Selected graphic card (%u) is not a valid number (%u is the maximum for this " "system)" msgstr "" "Geselecteerde grafische kaart (%u) is geen geldig getal (%u is het maximum " "voor dit systeem)" #: options.cpp:204 #, c-format msgid "failed to change CPU affinitiy to core %u" msgstr "Kon de CPU aansluiting niet veranderen naar kern %u" #: options.cpp:210 #, c-format msgid "" "Selected CPU core (%u) is not a valid number (%u is the maximum for this " "type of core)" msgstr "" "Geselecteerde CPU-kern (%u) is geen geldig getal (%u is het maximum voor dit " "type kern)" #: options.cpp:284 #, c-format msgid "Selected tab (%u) is not a valid number (%u is the maximum)" msgstr "Geselecteerde tabblad (%u) is geen geldig getal (%u is het maximum)" #: tui_ncurses.cpp:111 msgid "Window is too small!" msgstr "Venster is te klein!" #: tui_ncurses.cpp:119 msgid "Press 'h' to see help." msgstr "Druk op 'h' voor hulp." #: tui_ncurses.cpp:232 #, c-format msgid "Welcome in %s NCurses help!\n" msgstr "Welkom bij de %s NCurses hulp!\n" #: tui_ncurses.cpp:233 msgid "This help describes how to use this Text-based User Interface." msgstr "" "Deze hulp beschrijft het gebruikt van deze tekstgebaseerde " "gebruikersinterface." #: tui_ncurses.cpp:235 msgid "Global keys:" msgstr "Globale toetsen:" #: tui_ncurses.cpp:236 msgid "Press 'left' key or 'tab' key to switch in left tab." msgstr "" "Druk op de 'linker pijl' of 'tab' toets om naar het linker tab te wisselen." #: tui_ncurses.cpp:237 msgid "Press 'right' key or 'shift + tab' keys to switch in right tab." msgstr "" "Druk op de 'rechter pijl' of 'shift+tab' toets om naar het rechter tab te " "wisselen." #: tui_ncurses.cpp:238 msgid "Press 'h' key to see this help." msgstr "Druk op de 'h' toets om deze hulp te zien." #: tui_ncurses.cpp:239 msgid "Press 'q' key to exit." msgstr "Druk op de 'q' toets om af te sluiten." #: tui_ncurses.cpp:241 msgid "CPU tab:" msgstr "CPU tab:" #: tui_ncurses.cpp:242 msgid "Press 'next page' key to decrease core type number to monitor." msgstr "" "Druk op de \"page down\" toets om het te monitoren kerntypenummer te " "verlagen." #: tui_ncurses.cpp:243 msgid "Press 'previous page' key to increase core type number to monitor." msgstr "" "Druk op de \"page up\" toets om het te monitoren kerntypenummer te verhogen." #: tui_ncurses.cpp:244 msgid "Press 'down' key to decrease CPU core number to monitor." msgstr "" "Druk op de \"omlaag\" toets om het te monitoren CPU kernnummer te verlagen." #: tui_ncurses.cpp:245 msgid "Press 'up' key to increase CPU core number to monitor." msgstr "" "Druk op de \"omhoog\" toets om het te monitoren CPU kernnummer te verhogen." #: tui_ncurses.cpp:247 msgid "Caches tab:" msgstr "Caches tab:" #: tui_ncurses.cpp:248 msgid "Press 'down' key to switch to previous test." msgstr "Druk op de \"omlaag\" toets om te wisselen naar de vorige test." #: tui_ncurses.cpp:249 msgid "Press 'up' key to switch to next test." msgstr "Druk op de \"omhoog\" toets om te wisselen naar de volgende test." #: tui_ncurses.cpp:251 msgid "Bench tab:" msgstr "Bench tab:" #: tui_ncurses.cpp:252 msgid "Press 'down' key to decrement benchmark duration." msgstr "Druk op de \"omlaag\" toets om de benchmark duur te verlagen." #: tui_ncurses.cpp:253 msgid "Press 'up' key to increment benchmark duration." msgstr "Druk op de \"omhoog\" toets om de benchmark duur te verhogen." #: tui_ncurses.cpp:254 msgid "Press 'next page' key to decrement number of threads to use." msgstr "" "Druk op de \"page down\" toets om het aantal te gebruiken threads te " "verlagen." #: tui_ncurses.cpp:255 msgid "Press 'previous page' key to increment number of threads to use." msgstr "" "Druk op de \"page up\" toets om het aantal te gebruiken threads te verhogen." #: tui_ncurses.cpp:256 msgid "Press 's' key to start/stop prime numbers (slow) benchmark." msgstr "" "Druk op de \"s\" toets om de priemgetallen (langzaam) benchmark te starten/" "stoppen." #: tui_ncurses.cpp:257 msgid "Press 'f' key to start/stop prime numbers (fast) benchmark." msgstr "" "Druk op de \"f\" toets om de priemgetallen (snel) benchmark te starten/" "stoppen." #: tui_ncurses.cpp:259 msgid "Graphics tab:" msgstr "Grafisch tab:" #: tui_ncurses.cpp:260 msgid "Press 'down' key to switch to previous graphic card." msgstr "" "Druk op de \"omlaag\" toets om te wisselen naar de vorige grafische kaart." #: tui_ncurses.cpp:261 msgid "Press 'up' key to switch to next graphic card." msgstr "" "Druk op de \"omhoog\" toets om te wisselen naar de volgende grafische kaart." #: tui_ncurses.cpp:263 msgid "Press any key to exit this help." msgstr "Druk op een toets om deze hulp af te sluiten." #: tui_ncurses.cpp:640 msgid "Starting NCurses TUI…" msgstr "NCurses TUI wordt gestart…" #: tui_ncurses.cpp:649 msgid "" "FATAL ERROR: terminfo database could not be found (try to set TERMINFO " "environment variable)" msgstr "" "FATALE FOUT: terminfo database kon niet gevonden worden (probeer de " "omgevingsvariabele TERMINFO in te stellen)" #: tui_ncurses.cpp:654 #, c-format msgid "Failed to set up %s terminal (err=%i); falling back to %s" msgstr "Kon %s terminal (Fout=%i) niet instellen; Terugvallen naar %s" #: util.cpp:189 #, c-format msgid "cannot find unit in '%s' string at position %i" msgstr "kan geen eenheid vinden in string '%s' op positie %i" #: util.cpp:252 #, c-format msgid "an error occurred while opening file '%s'" msgstr "Er trad een fout op tijdens het openen van het bestand '%s'" #: util.cpp:297 #, c-format msgid "an error occurred while running command '%s'" msgstr "Er trad een fout op tijdens het uitvoeren van het commando '%s'" #: util.cpp:437 msgid "set_cpu_affinity() not supported on this operating system" msgstr "set_cpu_affinity() wordt niet ondersteund op dit besturingssysteem" #: data.hpp:103 data.hpp:244 data.hpp:332 msgid "Vendor" msgstr "Fabrikant" #: data.hpp:104 msgid "Code Name" msgstr "Code Name" #: data.hpp:105 msgid "Package" msgstr "Pakket" #: data.hpp:106 msgid "Technology" msgstr "Technologie" #: data.hpp:107 data.hpp:268 msgid "Voltage" msgstr "Spanning" #: data.hpp:108 msgid "Specification" msgstr "Specificatie" #: data.hpp:109 msgid "Family" msgstr "Familie" #: data.hpp:110 msgid "Disp. Family" msgstr "Weergave Familie" #: data.hpp:111 data.hpp:224 data.hpp:245 data.hpp:335 msgid "Model" msgstr "Model" #: data.hpp:112 msgid "Disp. Model" msgstr "Weergave model" #: data.hpp:113 msgid "Temp." msgstr "Temp." #: data.hpp:114 msgid "Stepping" msgstr "Revisie" #: data.hpp:115 msgid "Instructions" msgstr "Instructies" #: data.hpp:125 msgid "L1 Data" msgstr "L1 Data" #: data.hpp:126 msgid "L1 Inst." msgstr "L1 Inst." #: data.hpp:127 msgid "Level 2" msgstr "Level 2" #: data.hpp:128 msgid "Level 3" msgstr "Level 3" #: data.hpp:137 cpu-x-gtk-3.12.ui:1232 msgid "Cores" msgstr "Kernen" #: data.hpp:138 data.hpp:408 cpu-x-gtk-3.12.ui:1252 msgid "Threads" msgstr "Threads" #: data.hpp:155 msgid "Core Speed" msgstr "Kernsnelheid" #: data.hpp:156 msgid "Multiplier" msgstr "Multiplicator" #: data.hpp:157 msgid "Bus Speed" msgstr "Bussnelheid" #: data.hpp:158 data.hpp:341 msgid "Usage" msgstr "Verbruik" #: data.hpp:188 data.hpp:265 msgid "Size" msgstr "Grootte" #: data.hpp:189 data.hpp:267 msgid "Speed" msgstr "Snelheid" #: data.hpp:223 data.hpp:259 msgid "Manufacturer" msgstr "Fabrikant" #: data.hpp:225 msgid "Revision" msgstr "Revisie" #: data.hpp:233 msgid "Brand" msgstr "Merk" #: data.hpp:234 msgid "Version" msgstr "Versie" #: data.hpp:235 msgid "Date" msgstr "Datum" #: data.hpp:236 msgid "ROM Size" msgstr "Rom grootte" #: data.hpp:260 msgid "Part Number" msgstr "Onderdeel nummer" #: data.hpp:261 msgid "Type" msgstr "Type" #: data.hpp:262 msgid "Type Detail" msgstr "Type Detail" #: data.hpp:263 msgid "Device Locator" msgstr "Apparaatzoeker" #: data.hpp:264 msgid "Bank Locator" msgstr "Bankzoeker" #: data.hpp:266 msgid "Rank" msgstr "Rang" #: data.hpp:292 msgid "Name" msgstr "Naam" #: data.hpp:293 msgid "Kernel" msgstr "Kernel" #: data.hpp:294 msgid "Hostname" msgstr "Hostnaam" #: data.hpp:295 msgid "Uptime" msgstr "Bedrijfstijd" #: data.hpp:303 msgid "Used" msgstr "Gebruikt" #: data.hpp:304 msgid "Buffers" msgstr "Buffers" #: data.hpp:305 msgid "Cached" msgstr "Cached" #: data.hpp:306 msgid "Free" msgstr "Vrij" #: data.hpp:307 msgid "Swap" msgstr "Swap" #: data.hpp:333 msgid "Driver" msgstr "Stuurprogramma" #: data.hpp:334 msgid "UMD Version" msgstr "UMD versie" #: data.hpp:336 msgid "Compute Unit" msgstr "Rekeneenheid" #: data.hpp:337 msgid "Device ID" msgstr "Apparaat ID" #: data.hpp:338 msgid "VBIOS Version" msgstr "VBIOS versie" #. #-#-#-#-# source_ui.pot (cpu-x ) #-#-#-#-# #. Setting: "Interface" tab #: data.hpp:339 cpu-x-gtk-3.12.ui:5807 msgid "Interface" msgstr "Interface" #: data.hpp:340 msgid "Temperature" msgstr "Temperatuur" #: data.hpp:342 msgid "Core Voltage" msgstr "Kernspanning" #: data.hpp:343 msgid "Power Avg" msgstr "Gem. Vermogen" #: data.hpp:344 msgid "Core Clock" msgstr "Kernklok" #: data.hpp:345 msgid "Memory Clock" msgstr "Geheugenklok" #: data.hpp:346 msgid "Memory Used" msgstr "Geheugen gebruikt" #: data.hpp:347 msgid "Resizable BAR" msgstr "Aanpasbare BAR" #: data.hpp:348 msgid "Vulkan RT" msgstr "Vulkan RT" #: data.hpp:349 msgid "OpenGL Version" msgstr "OpenGL Versie" #: data.hpp:350 msgid "Vulkan Version" msgstr "Vulkan Versie" #: data.hpp:351 msgid "OpenCL Version" msgstr "OpenCL Versie" #: data.hpp:387 msgid "Score" msgstr "Score" #: data.hpp:388 msgid "Run" msgstr "Uitvoeren" #: data.hpp:407 msgid "Duration" msgstr "Duur" #: util.hpp:77 msgid "bytes" msgstr "bytes" #. TRANSLATORS: initials for kilobyte (10³): please put initials (keep it short) #: util.hpp:80 msgid "kB" msgstr "kB" #. TRANSLATORS: initials for megabyte (10⁶): please put initials (keep it short) #: util.hpp:82 msgid "MB" msgstr "MB" #. TRANSLATORS: initials for gigabyte (10⁹): please put initials (keep it short) #: util.hpp:84 msgid "GB" msgstr "GB" #. TRANSLATORS: initials for terabyte (10¹²): please put initials (keep it short) #: util.hpp:86 msgid "TB" msgstr "TB" #. TRANSLATORS: initials for kibibyte (2¹⁰): please put initials (keep it short) #: util.hpp:89 msgid "KiB" msgstr "KiB" #. TRANSLATORS: initials for mebibyte (2²⁰): please put initials (keep it short) #: util.hpp:91 msgid "MiB" msgstr "MiB" #. TRANSLATORS: initials for gibibyte (2³⁰): please put initials (keep it short) #: util.hpp:93 msgid "GiB" msgstr "GiB" #. TRANSLATORS: initials for tebibyte (2⁴⁰): please put initials (keep it short) #: util.hpp:95 msgid "TiB" msgstr "TiB" #: cpu-x-gtk-3.12.ui:1184 msgid "Cache" msgstr "Cache" #. Setting: refresh time for UI #: cpu-x-gtk-3.12.ui:5721 msgid "Refresh time" msgstr "Verversingstijd" #. Setting: GUI theme #: cpu-x-gtk-3.12.ui:5745 msgid "Text theme" msgstr "Tekst thema" #. Setting: automatic GUI theme #: cpu-x-gtk-3.12.ui:5760 msgid "Automatic" msgstr "Automatisch" #. Setting: light GUI theme #: cpu-x-gtk-3.12.ui:5761 msgid "Blue for light theme" msgstr "Blauw voor licht thema" #. Setting: dark GUI theme #: cpu-x-gtk-3.12.ui:5762 msgid "Yellow for dark theme" msgstr "Geel voor donker thema" #. Setting: temperature unit #: cpu-x-gtk-3.12.ui:5775 msgid "Temperature unit" msgstr "Temperatuureenheid" #. Setting: default tab at startup #: cpu-x-gtk-3.12.ui:5826 msgid "Default tab" msgstr "Standaard tab" #. Setting: default CPU core at startup #: cpu-x-gtk-3.12.ui:5839 msgid "Default CPU core" msgstr "Standaard CPU kern" #. Setting: default cache test at startup #: cpu-x-gtk-3.12.ui:5852 msgid "Default cache test" msgstr "Standaard cache test" #. Setting: print CPUID values in decimal or hexadecimal #: cpu-x-gtk-3.12.ui:5895 msgid "Print CPUID values in decimal" msgstr "Druk CPUID waardes af in decimalen" #. Setting: default graphic card at startup #: cpu-x-gtk-3.12.ui:5928 msgid "Default graphic card" msgstr "Standaard grafische kaart" #. Setting: default CPU core at startup #: cpu-x-gtk-3.12.ui:5952 msgid "Default core type" msgstr "Standaard kerntype" #. Setting: default graphic card at startup #: cpu-x-gtk-3.12.ui:5976 msgid "Default memory stick" msgstr "Standaard geheugenstick" #. Setting: "Startup" tab #: cpu-x-gtk-3.12.ui:6004 msgid "Startup" msgstr "Opstart" #~ msgid "Light" #~ msgstr "Licht" #~ msgid "Dark" #~ msgstr "Donker" #~ msgid "Calculating CPU multipliers" #~ msgstr "CPU vermenigvuldigers aan het berekenen" #, c-format #~ msgid "Current: PCIe Gen%1dx%d / Max: Gen%1dx%d" #~ msgstr "Huidig: PCIe Gen%1dx%d / Max: Gen%1dx%d" #~ msgid "failed to retrieve GPU clocks" #~ msgstr "Kon de GPU klokken niet ophalen" #, c-format #~ msgid "Core #%i" #~ msgstr "Kern #%i" #~ msgid "Setting label names" #~ msgstr "Labelnamen instellen" #, c-format #~ msgid "Bank %i" #~ msgstr "Bank %i" #~ msgid "Reference" #~ msgstr "Referentie" #~ msgid "Distribution" #~ msgstr "Distributie" #~ msgid "Compiler" #~ msgstr "Compiler" #~ msgid "GPU clock" #~ msgstr "GPU klok" #~ msgid "Dumping data…" #~ msgstr "Gegevens dumpen…" #~ msgid "Freeing memory" #~ msgstr "Geheugen vrijmaken" #~ msgid "Ignore CPU frequency reported by libcpuid" #~ msgstr "Negeer gerapporteerde CPU frequentie van libcpuid" #, c-format #~ msgid "failed to call wordexp (%i)" #~ msgstr "Kon wordexp niet aanroepen (%i)" #~ msgid "Press 'home' key to scroll up in a page." #~ msgstr "Druk op de 'home' toets om omhoog te scrollen op een pagina." #~ msgid "Press 'end' key to scroll down in a page." #~ msgstr "Druk op de 'end' toets om omlaag te scrollen op een pagina." #, c-format #~ msgid "String '%s' is too long, truncating…" #~ msgstr "String '%s' is te lang, afkappen…" #, c-format #~ msgid "failed to open %s directory" #~ msgstr "Kan de map %s niet openen" #~ msgid "an error occurred while compiling regex" #~ msgstr "Er trad een fout op tijdens het compileren van regex" #~ msgid "FATAL ERROR: could not allocate memory" #~ msgstr "FATALE FOUT: kon geen geheugen toewijzen" #, fuzzy, c-format #~| msgid "failed to call libcpuid (%s)" #~ msgid "failed to call vkEnumerateInstanceExtensionProperties (%s)" #~ msgstr "libcpuid kan niet worden aangeroepen (%s)" #, c-format #~ msgid "" #~ "CPU hybrid architecture is not supported. For more details, please refer " #~ "to following issue: %s" #~ msgstr "" #~ "Deze hybride cpu-architectuur wordt niet ondersteund. Ga voor meer " #~ "informatie naar %s" #~ msgid "NOT SUPPORTED" #~ msgstr "NIET-ONDERSTEUND" CPU-X-5.0.3/po/pa.po000066400000000000000000000606621454622605200137510ustar00rootroot00000000000000# CPU-X translations template # Copyright © 2014-2024 The Tumultuous Unicorn Of Darkness # This file is distributed under the same license as the cpu-x package. # Aman ALam , 2020. msgid "" msgstr "" "Project-Id-Version: cpu-x\n" "Report-Msgid-Bugs-To: https://github.com/TheTumultuousUnicornOfDarkness/CPU-" "X/issues\n" "POT-Creation-Date: 2023-12-09 13:09+0100\n" "PO-Revision-Date: 2020-07-05 01:41+0000\n" "Last-Translator: Aman ALam \n" "Language-Team: Punjabi \n" "Language: pa\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.2-dev\n" #: core.cpp:135 msgid "Finding CPU technology" msgstr "CPU ਤਕਨਾਲੋਜੀ ਲੱਭੀ ਜਾ ਰਹੀ ਹੈ" #: core.cpp:161 #, c-format msgid "" "Your CPU is not present in the database ==> %s, model: %i, ext. model: %i, " "ext. family: %i" msgstr "" #: core.cpp:189 data.cpp:150 data.cpp:342 msgid "unknown" msgstr "" #: core.cpp:230 msgid "Calling libcpuid for retrieving static data" msgstr "" #: core.cpp:245 #, c-format msgid "failed to call libcpuid (%s)" msgstr "" #: core.cpp:340 msgid "Calling libcpuid for retrieving dynamic data" msgstr "" #: core.cpp:353 msgid "Calling libcpuid for retrieving CPU MSR static values" msgstr "" #: core.cpp:380 msgid "Calling libcpuid for retrieving CPU MSR dynamic values" msgstr "" #: core.cpp:412 msgid "Calling dmidecode" msgstr "" #: core.cpp:454 core.cpp:473 #, c-format msgid "%s (configured)" msgstr "" #: core.cpp:461 core.cpp:480 #, c-format msgid "%s (max)" msgstr "" #: core.cpp:466 #, c-format msgid "%s (min)" msgstr "" #: core.cpp:496 msgid "Calculating CPU usage" msgstr "" #: core.cpp:546 msgid "Calling bandwidth" msgstr "" #: core.cpp:613 #, c-format msgid "" "pci_access is not properly initialized: it is a common issue when %s was " "built with a lower libpci version.\n" "Check that libpci %s library is present on your system. Otherwise, please " "rebuild %s." msgstr "" #: core.cpp:657 #, c-format msgid "No kernel driver in use for graphic card at path %s" msgstr "" #: core.cpp:693 #, c-format msgid "Your GPU kernel driver is unknown: %s" msgstr "" #: core.cpp:777 #, c-format msgid "Your GPU user mode driver is unknown for vendor %s: %s" msgstr "" #: core.cpp:781 #, c-format msgid "failed to call GLFW (%i): %s" msgstr "" #: core.cpp:914 msgid "Finding Vulkan API version" msgstr "" #: core.cpp:926 #, c-format msgid "failed to call vkCreateInstance (%s)" msgstr "" #: core.cpp:929 #, c-format msgid "%s is not supported" msgstr "" #: core.cpp:937 #, c-format msgid "failed to call vkEnumeratePhysicalDevices (%s)" msgstr "" #: core.cpp:944 msgid "No available Vulkan devices" msgstr "" #: core.cpp:952 #, c-format msgid "No available physical devices (%s)" msgstr "" #: core.cpp:1015 #, c-format msgid "Failed to create Vulkan for device %u (%s)" msgstr "" #: core.cpp:1019 #, c-format msgid "%s is not supported for device %u, use only deviceID for matching" msgstr "" #: core.cpp:1051 core.cpp:1364 msgid "Enabled" msgstr "" #: core.cpp:1051 core.cpp:1364 msgid "Disabled" msgstr "" #: core.cpp:1088 msgid "Finding OpenCL API version" msgstr "" #: core.cpp:1092 #, c-format msgid "There is no platform with OpenCL support (%s)" msgstr "" #: core.cpp:1102 #, c-format msgid "failed to get all OpenCL platforms (%s)" msgstr "" #: core.cpp:1115 #, c-format msgid "failed to get name for platform %u (%s)" msgstr "" #: core.cpp:1123 #, c-format msgid "failed to get version for platform %u (%s)" msgstr "" #: core.cpp:1131 #, c-format msgid "failed to find number of OpenCL devices for platform '%s %s' (%s)" msgstr "" #: core.cpp:1131 msgid "0 device" msgstr "" #: core.cpp:1140 #, c-format msgid "failed to get all of OpenCL devices for platform '%s %s' (%s)" msgstr "" #: core.cpp:1160 #, c-format msgid "failed to get name for device %u (%s)" msgstr "" #: core.cpp:1168 #, c-format msgid "failed to get version for device %u (%s)" msgstr "" #: core.cpp:1190 #, c-format msgid "OpenCL driver for '%s %s' does not support CL_DEVICE_TOPOLOGY_AMD (%s)" msgstr "" #: core.cpp:1201 #, c-format msgid "" "OpenCL driver for '%s %s' does not support CL_DEVICE_GFXIP_MAJOR_AMD (%s)" msgstr "" #: core.cpp:1209 core.cpp:1229 core.cpp:1262 #, c-format msgid "" "OpenCL driver for '%s %s' does not support CL_DEVICE_MAX_COMPUTE_UNITS (%s)" msgstr "" #: core.cpp:1250 #, c-format msgid "" "OpenCL driver for '%s %s' does not support CL_DEVICE_PCI_DOMAIN_ID_NV (%s), " "CL_DEVICE_PCI_BUS_ID_NV (%s) or CL_DEVICE_PCI_SLOT_ID_NV (%s)" msgstr "" #: core.cpp:1273 #, c-format msgid "OpenCL is not supported with your GPU vendor (0x%X)" msgstr "" #: core.cpp:1295 msgid "Finding devices" msgstr "" #: core.cpp:1307 #, c-format msgid "Skip devices search (wrong permissions on %s device)" msgstr "" #: core.cpp:1350 #, c-format msgid "Your GPU vendor is unknown: %s (0x%X)" msgstr "" #: core.cpp:1370 msgid "failed to find chipset vendor and model" msgstr "" #: core.cpp:1385 msgid "failed to find graphic card vendor and model" msgstr "" #: core.cpp:1487 msgid "Retrieving GPU clocks" msgstr "" #: core.cpp:1500 msgid "None" msgstr "" #: core.cpp:1509 #, c-format msgid "DRM path for %s is unknown" msgstr "" #: core.cpp:1516 #, c-format msgid "Card number for %s is unknown" msgstr "" #: core.cpp:1541 #, c-format msgid "PCIe %s (current) / %s (max)" msgstr "" #: core.cpp:1650 #, c-format msgid "Driver for %s doesn't report frequencies" msgstr "" #: core.cpp:1671 #, c-format msgid "failed to retrieve all monitoring data for %s" msgstr "" #: core.cpp:1694 msgid "Identifying running system" msgstr "" #: core.cpp:1697 msgid "failed to identify running system" msgstr "" #: core.cpp:1749 core.cpp:1778 msgid "Calling libprocps" msgstr "" #: core.cpp:1752 msgid "unable to get system uptime" msgstr "" #: core.cpp:1758 msgid "unable to create meminfo structure" msgstr "" #: core.cpp:1804 msgid "Calling libstatgrab" msgstr "" #: core.cpp:1852 #, c-format msgid "%i days, %i hours, %i minutes, %i seconds" msgstr "" #: core.cpp:1915 msgid "Updating benchmark status" msgstr "" #: core.cpp:1918 msgid "Active" msgstr "" #: core.cpp:1921 #, c-format msgid "(%u hours left)" msgstr "" #: core.cpp:1923 #, c-format msgid "(%u minutes left)" msgstr "" #: core.cpp:1925 #, c-format msgid "(%u seconds left)" msgstr "" #: core.cpp:1929 core.cpp:1984 core.cpp:1985 msgid "Inactive" msgstr "" #: core.cpp:1932 #, c-format msgid "in %u hours" msgstr "" #: core.cpp:1934 #, c-format msgid "in %u minutes" msgstr "" #: core.cpp:1936 #, c-format msgid "in %u seconds" msgstr "" #: core.cpp:1953 #, c-format msgid "Starting benchmark with %u threads" msgstr "" #: core.cpp:1976 msgid "an error occurred while starting benchmark" msgstr "" #: core.cpp:2002 msgid "Finding CPU package in fallback mode" msgstr "" #: core.cpp:2032 #, c-format msgid "Your CPU socket is not present in the database ==> %s, codename: %s" msgstr "" #: core.cpp:2052 msgid "Calculating CPU multipliers in fallback mode" msgstr "" #: core.cpp:2072 msgid "Retrieving motherboard information in fallback mode" msgstr "" #: core.cpp:2085 msgid "failed to retrieve motherboard information (fallback mode)" msgstr "" #: core.cpp:2127 msgid "Retrieving CPU temperature in fallback mode" msgstr "" #: core.cpp:2173 msgid "failed to retrieve CPU temperature (fallback mode)" msgstr "" #: core.cpp:2188 msgid "Retrieving CPU voltage in fallback mode" msgstr "" #: core.cpp:2200 msgid "failed to retrieve CPU voltage (fallback mode)" msgstr "" #: core.cpp:2214 msgid "Retrieving CPU frequency in fallback mode" msgstr "" #: core.cpp:2220 msgid "failed to retrieve CPU frequency (fallback mode)" msgstr "" #: daemon_client.cpp:65 msgid "Starting daemon in background…" msgstr "" #: daemon_client.cpp:172 msgid "pkexec: authorization could not be obtained (dialog dismissed)" msgstr "" #: daemon_client.cpp:175 msgid "pkexec: authorization could not be obtained (not authorized)" msgstr "" #: daemon_client.cpp:178 msgid "pkexec: command not found" msgstr "" #: daemon_client.cpp:181 msgid "pkexec: unexpected error code" msgstr "" #: daemon_client.cpp:211 msgid "Connecting to daemon…" msgstr "" #: daemon_server.cpp:261 #, c-format msgid "request_handler: case %i not handled" msgstr "" #: data.cpp:124 cpu-x-gtk-3.12.ui:1370 msgid "CPU" msgstr "" #: data.cpp:187 msgid "P-core" msgstr "" #: data.cpp:188 msgid "E-core" msgstr "" #: data.cpp:189 data.cpp:192 msgid "Core" msgstr "" #: data.cpp:208 cpu-x-gtk-3.12.ui:746 msgid "Processor" msgstr "" #: data.cpp:240 data.cpp:329 cpu-x-gtk-3.12.ui:1968 msgid "Caches" msgstr "" #: data.cpp:247 #, fuzzy, c-format #| msgid "%d x %d %s, %d-way" msgid "%2d x %4d %s, %2d-way" msgstr "%d x %d %s, %d-ਵੇਅ" #: data.cpp:249 #, c-format msgid "%d %s, %d-way" msgstr "" #: data.cpp:263 msgid "Count" msgstr "" #: data.cpp:276 cpu-x-gtk-3.12.ui:968 msgid "Clocks" msgstr "" #: data.cpp:379 data.cpp:383 #, c-format msgid "L%u Cache" msgstr "" #: data.cpp:385 #, c-format msgid "%s associative, %d-%s line size" msgstr "" #: data.cpp:398 msgid "Test" msgstr "" #: data.cpp:409 data.cpp:423 cpu-x-gtk-3.12.ui:2146 cpu-x-gtk-3.12.ui:2517 msgid "Motherboard" msgstr "" #: data.cpp:437 cpu-x-gtk-3.12.ui:2367 msgid "BIOS" msgstr "" #: data.cpp:452 cpu-x-gtk-3.12.ui:2498 msgid "Chipset" msgstr "" #: data.cpp:467 data.cpp:569 cpu-x-gtk-3.12.ui:3156 cpu-x-gtk-3.12.ui:3761 msgid "Memory" msgstr "" #: data.cpp:483 #, c-format msgid "Stick %u" msgstr "" #: data.cpp:487 cpu-x-gtk-3.12.ui:3134 msgid "Sticks" msgstr "" #: data.cpp:541 cpu-x-gtk-3.12.ui:3780 msgid "System" msgstr "" #: data.cpp:554 cpu-x-gtk-3.12.ui:3380 msgid "Operating System" msgstr "" #: data.cpp:587 cpu-x-gtk-3.12.ui:4960 msgid "Graphics" msgstr "" #: data.cpp:621 #, c-format msgid "Card %u" msgstr "" #: data.cpp:625 cpu-x-gtk-3.12.ui:4938 msgid "Cards" msgstr "" #: data.cpp:672 cpu-x-gtk-3.12.ui:5300 msgid "Bench" msgstr "" #: data.cpp:685 msgid "Not started" msgstr "" #: data.cpp:688 cpu-x-gtk-3.12.ui:5070 msgid "Prime numbers (slow)" msgstr "" #: data.cpp:692 cpu-x-gtk-3.12.ui:5178 msgid "Prime numbers (fast)" msgstr "" #: data.cpp:696 cpu-x-gtk-3.12.ui:5281 msgid "Parameters" msgstr "" #: data.cpp:721 data.cpp:727 #, c-format msgid "%u mins" msgstr "" #: data.cpp:734 cpu-x-gtk-3.12.ui:5444 cpu-x-gtk-3.12.ui:5552 msgid "About" msgstr "" #: data.cpp:739 #, c-format msgid "" "%s is a Free software that gathers information\n" "on CPU, motherboard and more." msgstr "" #: data.cpp:744 msgid "About CPU-X" msgstr "" #: data.cpp:745 #, c-format msgid "Version %s" msgstr "" #: data.cpp:746 #, c-format msgid "Author: %s" msgstr "" #: data.cpp:747 #, c-format msgid "Site: %s" msgstr "" #: data.cpp:751 cpu-x-gtk-3.12.ui:5533 msgid "License" msgstr "" #: data.cpp:753 #, c-format msgid "This software is distributed under the terms of %s" msgstr "" #: data.cpp:754 main.cpp:176 msgid "This program comes with ABSOLUTELY NO WARRANTY" msgstr "" #: gui_gtk.cpp:61 #, c-format msgid "Cannot find path for '%s' file" msgstr "" #: gui_gtk.cpp:400 msgid "Start daemon" msgstr "" #: gui_gtk.cpp:403 msgid "Connected to daemon" msgstr "" #: gui_gtk.cpp:406 msgid "No polkit authentication agent found" msgstr "" #: gui_gtk.cpp:411 msgid "Ask password to start daemon in background" msgstr "" #: gui_gtk.cpp:415 msgid "Settings" msgstr "" #: gui_gtk.cpp:634 msgid "BaseFamily" msgstr "" #: gui_gtk.cpp:635 msgid "CPU display (\"true\") family (computed as BaseFamily+ExtendedFamily)" msgstr "" #: gui_gtk.cpp:636 msgid "BaseModel" msgstr "" #: gui_gtk.cpp:637 msgid "CPU display (\"true\") model (computed as (ExtendedModel<<4)+BaseModel)" msgstr "" #: gui_gtk.cpp:847 msgid "" "Identify the physically-labeled socket or board position where the memory " "device is located" msgstr "" #: gui_gtk.cpp:848 msgid "Identify the physically labeled bank where the memory device is located" msgstr "" #: gui_gtk.cpp:1052 msgid "User Mode Driver Version" msgstr "" #: gui_gtk.cpp:1066 msgid "Vulkan Ray Tracing" msgstr "" #: gui_gtk.cpp:1260 msgid "Starting GTK GUI…" msgstr "" #: gui_gtk.cpp:1272 msgid "failed to import UI in GtkBuilder" msgstr "" #: main.cpp:63 msgid "Start graphical user interface (GUI) (default)" msgstr "" #: main.cpp:64 msgid "Start text-based user interface (TUI)" msgstr "" #: main.cpp:65 msgid "Dump all data on standard output and exit" msgstr "" #: main.cpp:66 msgid "Run embedded command dmidecode and exit" msgstr "" #: main.cpp:67 msgid "Run embedded command bandwidth and exit" msgstr "" #: main.cpp:68 msgid "Set temperature unit (c[elsius]|f[ahrenheit]|k[elvin]|r[ankine])" msgstr "" #: main.cpp:69 msgid "Set custom time between two refreshes (in seconds)" msgstr "" #: main.cpp:70 msgid "Set default tab (integer)" msgstr "" #: main.cpp:71 msgid "Select core type to monitor (integer)" msgstr "" #: main.cpp:72 msgid "Select CPU core to monitor (integer)" msgstr "" #: main.cpp:73 msgid "Set custom bandwidth test for CPU caches speed (integer)" msgstr "" #: main.cpp:74 msgid "Select default memory stick (integer)" msgstr "" #: main.cpp:75 msgid "Select default graphic card (integer)" msgstr "" #: main.cpp:76 cpu-x-gtk-3.12.ui:5910 msgid "Start and connect to daemon" msgstr "" #: main.cpp:77 msgid "Verbose output" msgstr "" #: main.cpp:78 msgid "Print help and exit" msgstr "" #: main.cpp:79 msgid "Print version and exit" msgstr "" #: main.cpp:80 msgid "Print CPUID values in decimal (default is hexadeximal)" msgstr "" #: main.cpp:81 msgid "Disable colored output" msgstr "" #: main.cpp:82 msgid "Print information for debugging" msgstr "" #: main.cpp:83 msgid "Print required information to paste in an issue" msgstr "" #: main.cpp:84 msgid "Set key mapping for NCurses mode (a[rrows]|e[macs]|i[nverted-T]|v[im])" msgstr "" #: main.cpp:95 msgid "Add default command line arguments" msgstr "" #: main.cpp:96 msgid "Enforce the bus clock" msgstr "" #: main.cpp:97 msgid "" "Ignore CPU values reported by libcpuid (comma-separated values among 'temp', " "'volt' and 'freq')" msgstr "" #: main.cpp:98 msgid "Read CPUID raw data from a given file" msgstr "" #: main.cpp:99 msgid "Only print a message if CPU is not present in the database" msgstr "" #: main.cpp:126 #, c-format msgid "Usage: %s DISPLAY [OPTIONS]\n" msgstr "" #: main.cpp:127 msgid "Available DISPLAY:" msgstr "" #: main.cpp:135 msgid "Available OPTIONS:" msgstr "" #: main.cpp:144 msgid "Influenceable environment variables:" msgstr "" #: main.cpp:175 msgid "This is free software: you are free to change and redistribute it." msgstr "" #: main.cpp:177 #, c-format msgid "See the %s license: <%s>\n" msgstr "" #: main.cpp:184 #, c-format msgid "-- %-9s version: %s" msgstr "" #: main.cpp:381 #, c-format msgid "" "\n" "Oops, something was wrong! %s has received signal %d (%s) and has crashed." msgstr "" #: main.cpp:383 #, c-format msgid "" "\n" "Oops, something was wrong! %s has received signal %d (%s) and is trying to " "recover." msgstr "" #: main.cpp:407 msgid "You can open a new issue here, by filling the template as requested:" msgstr "" #: main.cpp:449 msgid "an error occurred while setting locale" msgstr "" #: options.cpp:124 #, c-format msgid "" "Selected CPU type (%u) is not a valid number (%u is the maximum for this CPU)" msgstr "" #: options.cpp:145 #, c-format msgid "" "Selected bandwidth test (%u) is not a valid number (%u is the maximum for " "this system)" msgstr "" #: options.cpp:168 #, c-format msgid "" "Selected RAM stick (%u) is not a valid number (%u is the maximum for this " "system)" msgstr "" #: options.cpp:188 #, c-format msgid "" "Selected graphic card (%u) is not a valid number (%u is the maximum for this " "system)" msgstr "" #: options.cpp:204 #, c-format msgid "failed to change CPU affinitiy to core %u" msgstr "" #: options.cpp:210 #, c-format msgid "" "Selected CPU core (%u) is not a valid number (%u is the maximum for this " "type of core)" msgstr "" #: options.cpp:284 #, c-format msgid "Selected tab (%u) is not a valid number (%u is the maximum)" msgstr "" #: tui_ncurses.cpp:111 msgid "Window is too small!" msgstr "" #: tui_ncurses.cpp:119 msgid "Press 'h' to see help." msgstr "" #: tui_ncurses.cpp:232 #, c-format msgid "Welcome in %s NCurses help!\n" msgstr "" #: tui_ncurses.cpp:233 msgid "This help describes how to use this Text-based User Interface." msgstr "" #: tui_ncurses.cpp:235 msgid "Global keys:" msgstr "" #: tui_ncurses.cpp:236 msgid "Press 'left' key or 'tab' key to switch in left tab." msgstr "" #: tui_ncurses.cpp:237 msgid "Press 'right' key or 'shift + tab' keys to switch in right tab." msgstr "" #: tui_ncurses.cpp:238 msgid "Press 'h' key to see this help." msgstr "" #: tui_ncurses.cpp:239 msgid "Press 'q' key to exit." msgstr "" #: tui_ncurses.cpp:241 msgid "CPU tab:" msgstr "" #: tui_ncurses.cpp:242 msgid "Press 'next page' key to decrease core type number to monitor." msgstr "" #: tui_ncurses.cpp:243 msgid "Press 'previous page' key to increase core type number to monitor." msgstr "" #: tui_ncurses.cpp:244 msgid "Press 'down' key to decrease CPU core number to monitor." msgstr "" #: tui_ncurses.cpp:245 msgid "Press 'up' key to increase CPU core number to monitor." msgstr "" #: tui_ncurses.cpp:247 msgid "Caches tab:" msgstr "" #: tui_ncurses.cpp:248 msgid "Press 'down' key to switch to previous test." msgstr "" #: tui_ncurses.cpp:249 msgid "Press 'up' key to switch to next test." msgstr "" #: tui_ncurses.cpp:251 msgid "Bench tab:" msgstr "" #: tui_ncurses.cpp:252 msgid "Press 'down' key to decrement benchmark duration." msgstr "" #: tui_ncurses.cpp:253 msgid "Press 'up' key to increment benchmark duration." msgstr "" #: tui_ncurses.cpp:254 msgid "Press 'next page' key to decrement number of threads to use." msgstr "" #: tui_ncurses.cpp:255 msgid "Press 'previous page' key to increment number of threads to use." msgstr "" #: tui_ncurses.cpp:256 msgid "Press 's' key to start/stop prime numbers (slow) benchmark." msgstr "" #: tui_ncurses.cpp:257 msgid "Press 'f' key to start/stop prime numbers (fast) benchmark." msgstr "" #: tui_ncurses.cpp:259 msgid "Graphics tab:" msgstr "" #: tui_ncurses.cpp:260 msgid "Press 'down' key to switch to previous graphic card." msgstr "" #: tui_ncurses.cpp:261 msgid "Press 'up' key to switch to next graphic card." msgstr "" #: tui_ncurses.cpp:263 msgid "Press any key to exit this help." msgstr "" #: tui_ncurses.cpp:640 msgid "Starting NCurses TUI…" msgstr "" #: tui_ncurses.cpp:649 msgid "" "FATAL ERROR: terminfo database could not be found (try to set TERMINFO " "environment variable)" msgstr "" #: tui_ncurses.cpp:654 #, c-format msgid "Failed to set up %s terminal (err=%i); falling back to %s" msgstr "" #: util.cpp:189 #, c-format msgid "cannot find unit in '%s' string at position %i" msgstr "" #: util.cpp:252 #, c-format msgid "an error occurred while opening file '%s'" msgstr "" #: util.cpp:297 #, c-format msgid "an error occurred while running command '%s'" msgstr "" #: util.cpp:437 msgid "set_cpu_affinity() not supported on this operating system" msgstr "" #: data.hpp:103 data.hpp:244 data.hpp:332 msgid "Vendor" msgstr "" #: data.hpp:104 msgid "Code Name" msgstr "" #: data.hpp:105 msgid "Package" msgstr "" #: data.hpp:106 msgid "Technology" msgstr "" #: data.hpp:107 data.hpp:268 msgid "Voltage" msgstr "" #: data.hpp:108 msgid "Specification" msgstr "" #: data.hpp:109 msgid "Family" msgstr "" #: data.hpp:110 msgid "Disp. Family" msgstr "" #: data.hpp:111 data.hpp:224 data.hpp:245 data.hpp:335 msgid "Model" msgstr "" #: data.hpp:112 msgid "Disp. Model" msgstr "" #: data.hpp:113 msgid "Temp." msgstr "" #: data.hpp:114 msgid "Stepping" msgstr "" #: data.hpp:115 msgid "Instructions" msgstr "" #: data.hpp:125 msgid "L1 Data" msgstr "" #: data.hpp:126 msgid "L1 Inst." msgstr "" #: data.hpp:127 msgid "Level 2" msgstr "" #: data.hpp:128 msgid "Level 3" msgstr "" #: data.hpp:137 cpu-x-gtk-3.12.ui:1232 msgid "Cores" msgstr "" #: data.hpp:138 data.hpp:408 cpu-x-gtk-3.12.ui:1252 msgid "Threads" msgstr "" #: data.hpp:155 msgid "Core Speed" msgstr "" #: data.hpp:156 msgid "Multiplier" msgstr "" #: data.hpp:157 msgid "Bus Speed" msgstr "" #: data.hpp:158 data.hpp:341 msgid "Usage" msgstr "" #: data.hpp:188 data.hpp:265 msgid "Size" msgstr "" #: data.hpp:189 data.hpp:267 msgid "Speed" msgstr "" #: data.hpp:223 data.hpp:259 msgid "Manufacturer" msgstr "" #: data.hpp:225 msgid "Revision" msgstr "" #: data.hpp:233 msgid "Brand" msgstr "" #: data.hpp:234 msgid "Version" msgstr "" #: data.hpp:235 msgid "Date" msgstr "" #: data.hpp:236 msgid "ROM Size" msgstr "" #: data.hpp:260 msgid "Part Number" msgstr "" #: data.hpp:261 msgid "Type" msgstr "" #: data.hpp:262 msgid "Type Detail" msgstr "" #: data.hpp:263 msgid "Device Locator" msgstr "" #: data.hpp:264 msgid "Bank Locator" msgstr "" #: data.hpp:266 msgid "Rank" msgstr "" #: data.hpp:292 msgid "Name" msgstr "" #: data.hpp:293 msgid "Kernel" msgstr "" #: data.hpp:294 msgid "Hostname" msgstr "" #: data.hpp:295 msgid "Uptime" msgstr "" #: data.hpp:303 msgid "Used" msgstr "" #: data.hpp:304 msgid "Buffers" msgstr "" #: data.hpp:305 msgid "Cached" msgstr "" #: data.hpp:306 msgid "Free" msgstr "" #: data.hpp:307 msgid "Swap" msgstr "" #: data.hpp:333 msgid "Driver" msgstr "" #: data.hpp:334 msgid "UMD Version" msgstr "" #: data.hpp:336 msgid "Compute Unit" msgstr "" #: data.hpp:337 msgid "Device ID" msgstr "" #: data.hpp:338 msgid "VBIOS Version" msgstr "" #. #-#-#-#-# source_ui.pot (cpu-x ) #-#-#-#-# #. Setting: "Interface" tab #: data.hpp:339 cpu-x-gtk-3.12.ui:5807 msgid "Interface" msgstr "" #: data.hpp:340 msgid "Temperature" msgstr "" #: data.hpp:342 msgid "Core Voltage" msgstr "" #: data.hpp:343 msgid "Power Avg" msgstr "" #: data.hpp:344 msgid "Core Clock" msgstr "" #: data.hpp:345 msgid "Memory Clock" msgstr "" #: data.hpp:346 msgid "Memory Used" msgstr "" #: data.hpp:347 msgid "Resizable BAR" msgstr "" #: data.hpp:348 msgid "Vulkan RT" msgstr "" #: data.hpp:349 msgid "OpenGL Version" msgstr "" #: data.hpp:350 msgid "Vulkan Version" msgstr "" #: data.hpp:351 msgid "OpenCL Version" msgstr "" #: data.hpp:387 msgid "Score" msgstr "" #: data.hpp:388 msgid "Run" msgstr "" #: data.hpp:407 msgid "Duration" msgstr "" #: util.hpp:77 msgid "bytes" msgstr "" #. TRANSLATORS: initials for kilobyte (10³): please put initials (keep it short) #: util.hpp:80 msgid "kB" msgstr "" #. TRANSLATORS: initials for megabyte (10⁶): please put initials (keep it short) #: util.hpp:82 msgid "MB" msgstr "" #. TRANSLATORS: initials for gigabyte (10⁹): please put initials (keep it short) #: util.hpp:84 msgid "GB" msgstr "" #. TRANSLATORS: initials for terabyte (10¹²): please put initials (keep it short) #: util.hpp:86 msgid "TB" msgstr "" #. TRANSLATORS: initials for kibibyte (2¹⁰): please put initials (keep it short) #: util.hpp:89 msgid "KiB" msgstr "" #. TRANSLATORS: initials for mebibyte (2²⁰): please put initials (keep it short) #: util.hpp:91 msgid "MiB" msgstr "" #. TRANSLATORS: initials for gibibyte (2³⁰): please put initials (keep it short) #: util.hpp:93 msgid "GiB" msgstr "" #. TRANSLATORS: initials for tebibyte (2⁴⁰): please put initials (keep it short) #: util.hpp:95 msgid "TiB" msgstr "" #: cpu-x-gtk-3.12.ui:1184 msgid "Cache" msgstr "" #. Setting: refresh time for UI #: cpu-x-gtk-3.12.ui:5721 msgid "Refresh time" msgstr "" #. Setting: GUI theme #: cpu-x-gtk-3.12.ui:5745 msgid "Text theme" msgstr "" #. Setting: automatic GUI theme #: cpu-x-gtk-3.12.ui:5760 msgid "Automatic" msgstr "" #. Setting: light GUI theme #: cpu-x-gtk-3.12.ui:5761 msgid "Blue for light theme" msgstr "" #. Setting: dark GUI theme #: cpu-x-gtk-3.12.ui:5762 msgid "Yellow for dark theme" msgstr "" #. Setting: temperature unit #: cpu-x-gtk-3.12.ui:5775 msgid "Temperature unit" msgstr "" #. Setting: default tab at startup #: cpu-x-gtk-3.12.ui:5826 msgid "Default tab" msgstr "" #. Setting: default CPU core at startup #: cpu-x-gtk-3.12.ui:5839 msgid "Default CPU core" msgstr "" #. Setting: default cache test at startup #: cpu-x-gtk-3.12.ui:5852 msgid "Default cache test" msgstr "" #. Setting: print CPUID values in decimal or hexadecimal #: cpu-x-gtk-3.12.ui:5895 msgid "Print CPUID values in decimal" msgstr "" #. Setting: default graphic card at startup #: cpu-x-gtk-3.12.ui:5928 msgid "Default graphic card" msgstr "" #. Setting: default CPU core at startup #: cpu-x-gtk-3.12.ui:5952 msgid "Default core type" msgstr "" #. Setting: default graphic card at startup #: cpu-x-gtk-3.12.ui:5976 msgid "Default memory stick" msgstr "" #. Setting: "Startup" tab #: cpu-x-gtk-3.12.ui:6004 msgid "Startup" msgstr "" CPU-X-5.0.3/po/pl.po000066400000000000000000001262101454622605200137540ustar00rootroot00000000000000# Copyright © 2014-2024 The Tumultuous Unicorn Of Darkness # This file is distributed under the same license as the CPU-X package. # Translators: # Michał Głowienka , 2016 # WaldiS , 2019, 2020. # Mr Talon63 , 2019. # kakiremora , 2020. # Michal Biesiada , 2020. # WaldiS , 2020, 2021, 2022, 2023. # Jacek , 2022. # Eryk Michalak , 2023. msgid "" msgstr "" "Project-Id-Version: CPU-X\n" "Report-Msgid-Bugs-To: https://github.com/TheTumultuousUnicornOfDarkness/CPU-" "X/issues\n" "POT-Creation-Date: 2023-12-09 13:09+0100\n" "PO-Revision-Date: 2023-11-03 19:35+0000\n" "Last-Translator: WaldiS \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=4; plural=(n==1 ? 0 : (n%10>=2 && n%10<=4) && " "(n%100<12 || n%100>14) ? 1 : n!=1 && (n%10>=0 && n%10<=1) || (n%10>=5 && " "n%10<=9) || (n%100>=12 && n%100<=14) ? 2 : 3);\n" "X-Generator: Weblate 5.2-dev\n" #: core.cpp:135 msgid "Finding CPU technology" msgstr "Wyszukiwanie technologi procesora" #: core.cpp:161 #, c-format msgid "" "Your CPU is not present in the database ==> %s, model: %i, ext. model: %i, " "ext. family: %i" msgstr "" "Twój CPU nie jest obecny w bazie danych ==> %s, model: %i, ext. model: %i, " "ext. family: %i" #: core.cpp:189 data.cpp:150 data.cpp:342 msgid "unknown" msgstr "nieznany" #: core.cpp:230 msgid "Calling libcpuid for retrieving static data" msgstr "Wywołanie libcpuid w celu pobierania danych statycznych" #: core.cpp:245 #, c-format msgid "failed to call libcpuid (%s)" msgstr "nie udało się wywołać libcpuid (%s)" #: core.cpp:340 msgid "Calling libcpuid for retrieving dynamic data" msgstr "Wywołanie libcpuid w celu pobierania danych dynamicznych" #: core.cpp:353 msgid "Calling libcpuid for retrieving CPU MSR static values" msgstr "Wywołanie libcpuid w celu pobrania statycznych danych z CPU MSR" #: core.cpp:380 msgid "Calling libcpuid for retrieving CPU MSR dynamic values" msgstr "Wywołanie libcpuid w celu pobrania dynamicznych danych z CPU MSR" #: core.cpp:412 msgid "Calling dmidecode" msgstr "Wywołanie dmidecode" #: core.cpp:454 core.cpp:473 #, c-format msgid "%s (configured)" msgstr "%s (konfiguracji)" #: core.cpp:461 core.cpp:480 #, c-format msgid "%s (max)" msgstr "%s (max)" #: core.cpp:466 #, c-format msgid "%s (min)" msgstr "%s (min)" #: core.cpp:496 msgid "Calculating CPU usage" msgstr "Obliczanie użycia procesora" #: core.cpp:546 msgid "Calling bandwidth" msgstr "Wywołanie bandwidth" #: core.cpp:613 #, c-format msgid "" "pci_access is not properly initialized: it is a common issue when %s was " "built with a lower libpci version.\n" "Check that libpci %s library is present on your system. Otherwise, please " "rebuild %s." msgstr "" "pci_access nie jest poprawnie zainicjowany: jest to częsty problem, gdy %s " "został zbudowany z niższą wersją libpci.\n" "Sprawdź, czy biblioteka libpci %s jest obecna w Twoim systemie. W przeciwnym " "razie należy przebudować %s." #: core.cpp:657 #, c-format msgid "No kernel driver in use for graphic card at path %s" msgstr "Brak sterownika jądra dla karty graficznej przy ścieżce %s" #: core.cpp:693 #, c-format msgid "Your GPU kernel driver is unknown: %s" msgstr "Nieznany sterownik jądra GPU: %s" #: core.cpp:777 #, fuzzy, c-format #| msgid "Your GPU user mode driver is unknown: %s" msgid "Your GPU user mode driver is unknown for vendor %s: %s" msgstr "Nieznany sterownik trybu użytkownika Twojego układu GPU: %s" #: core.cpp:781 #, c-format msgid "failed to call GLFW (%i): %s" msgstr "nie udało się wywołać GLFW (%i): %s" #: core.cpp:914 msgid "Finding Vulkan API version" msgstr "Szukanie wersji API Vulkan" #: core.cpp:926 #, c-format msgid "failed to call vkCreateInstance (%s)" msgstr "nie udało się wywołać vkCreateInstance (%s)" #: core.cpp:929 #, c-format msgid "%s is not supported" msgstr "%s nie jest obsługiwany" #: core.cpp:937 #, c-format msgid "failed to call vkEnumeratePhysicalDevices (%s)" msgstr "nie udało się wywołać vkEnumeratePhysicalDevices (%s)" #: core.cpp:944 msgid "No available Vulkan devices" msgstr "Brak dostępnych urządzeń Vulkan" #: core.cpp:952 #, c-format msgid "No available physical devices (%s)" msgstr "Brak dostępnych urządzeń fizycznych (%s)" #: core.cpp:1015 #, c-format msgid "Failed to create Vulkan for device %u (%s)" msgstr "Nie udało się stworzyć Vulkan dla urządzenia %u (%s)" #: core.cpp:1019 #, c-format msgid "%s is not supported for device %u, use only deviceID for matching" msgstr "" "%s nie jest obsługiwany dla urządzenia %u, użyj tylko deviceID aby dopasować" #: core.cpp:1051 core.cpp:1364 msgid "Enabled" msgstr "Włączone" #: core.cpp:1051 core.cpp:1364 msgid "Disabled" msgstr "Wyłączone" #: core.cpp:1088 msgid "Finding OpenCL API version" msgstr "Szukanie wersji OpenCL API" #: core.cpp:1092 #, c-format msgid "There is no platform with OpenCL support (%s)" msgstr "Nie ma platformy obsługującej OpenCL (%s)" #: core.cpp:1102 #, c-format msgid "failed to get all OpenCL platforms (%s)" msgstr "nie udało się uzyskać wszystkich platform OpenCL (%s)" #: core.cpp:1115 #, c-format msgid "failed to get name for platform %u (%s)" msgstr "nie udało się uzyskać nazwy platformy %u (%s)" #: core.cpp:1123 #, c-format msgid "failed to get version for platform %u (%s)" msgstr "nie udało się pobrać wersji na platformę %u (%s)" #: core.cpp:1131 #, c-format msgid "failed to find number of OpenCL devices for platform '%s %s' (%s)" msgstr "" "nie udało się znaleźć liczby urządzeń OpenCL dla platformy '%s %s' (%s)" #: core.cpp:1131 msgid "0 device" msgstr "0 urządzenie" #: core.cpp:1140 #, c-format msgid "failed to get all of OpenCL devices for platform '%s %s' (%s)" msgstr "" "nie udało się pobrać wszystkich urządzeń OpenCL na platformę '%s %s' (%s)" #: core.cpp:1160 #, c-format msgid "failed to get name for device %u (%s)" msgstr "nie udało się uzyskać nazwy urządzenia %u (%s)" #: core.cpp:1168 #, c-format msgid "failed to get version for device %u (%s)" msgstr "nie udało się pobrać wersji dla urządzenia %u (%s)" #: core.cpp:1190 #, c-format msgid "OpenCL driver for '%s %s' does not support CL_DEVICE_TOPOLOGY_AMD (%s)" msgstr "Sterownik OpenCL dla '%s %s'nie obsługuje CL_DEVICE_TOPOLOGY_AMD (%s)" #: core.cpp:1201 #, c-format msgid "" "OpenCL driver for '%s %s' does not support CL_DEVICE_GFXIP_MAJOR_AMD (%s)" msgstr "" "Sterownik OpenCL dla '%s %s' nie obsługuje CL_DEVICE_GFXIP_MAJOR_AMD (%s)" #: core.cpp:1209 core.cpp:1229 core.cpp:1262 #, c-format msgid "" "OpenCL driver for '%s %s' does not support CL_DEVICE_MAX_COMPUTE_UNITS (%s)" msgstr "" "Sterownik OpenCL dla '%s %s' nie obsługuje CL_DEVICE_MAX_COMPUTE_UNITS (%s)" #: core.cpp:1250 #, c-format msgid "" "OpenCL driver for '%s %s' does not support CL_DEVICE_PCI_DOMAIN_ID_NV (%s), " "CL_DEVICE_PCI_BUS_ID_NV (%s) or CL_DEVICE_PCI_SLOT_ID_NV (%s)" msgstr "" "Sterownik OpenCL dla '%s %s' nie obsługuje CL_DEVICE_PCI_DOMAIN_ID_NV (%s), " "CL_DEVICE_PCI_BUS_ID_NV (%s) lub CL_DEVICE_PCI_SLOT_ID_NV (%s)" #: core.cpp:1273 #, c-format msgid "OpenCL is not supported with your GPU vendor (0x%X)" msgstr "Dostawca GPU nie obsługuje standardu OpenCL (0x%X)" #: core.cpp:1295 msgid "Finding devices" msgstr "Wyszukiwanie urządzeń" #: core.cpp:1307 #, c-format msgid "Skip devices search (wrong permissions on %s device)" msgstr "Pomiń wyszukiwanie urządzeń (brak uprawnień do urządzenia %s)" #: core.cpp:1350 #, c-format msgid "Your GPU vendor is unknown: %s (0x%X)" msgstr "Dostawca procesora GPU jest nieznany: %s (0x%X)" #: core.cpp:1370 msgid "failed to find chipset vendor and model" msgstr "nie udało się znaleźć producenta i modelu chipsetu" #: core.cpp:1385 msgid "failed to find graphic card vendor and model" msgstr "nie udało się znaleźć producenta i modelu GPU" #: core.cpp:1487 msgid "Retrieving GPU clocks" msgstr "Pobieranie zegarów GPU" #: core.cpp:1500 msgid "None" msgstr "Żaden" #: core.cpp:1509 #, c-format msgid "DRM path for %s is unknown" msgstr "Ścieżka DRM dla %s jest nieznana" #: core.cpp:1516 #, c-format msgid "Card number for %s is unknown" msgstr "Numer karty %s jest nieznany" #: core.cpp:1541 #, c-format msgid "PCIe %s (current) / %s (max)" msgstr "" #: core.cpp:1650 #, c-format msgid "Driver for %s doesn't report frequencies" msgstr "Sterownik dla %s nie raportuje częstotliwości" #: core.cpp:1671 #, c-format msgid "failed to retrieve all monitoring data for %s" msgstr "nie udało się pobrać wszystkich danych monitorowania dla %s" #: core.cpp:1694 msgid "Identifying running system" msgstr "Identyfikacja uruchomionego systemu" #: core.cpp:1697 msgid "failed to identify running system" msgstr "nie udało się zidentyfikować uruchomionego systemu" #: core.cpp:1749 core.cpp:1778 msgid "Calling libprocps" msgstr "Wywołanie libprocps" #: core.cpp:1752 msgid "unable to get system uptime" msgstr "nie można uzyskać czasu pracy systemu" #: core.cpp:1758 msgid "unable to create meminfo structure" msgstr "nie można utworzyć struktury meminfo" #: core.cpp:1804 msgid "Calling libstatgrab" msgstr "Wywołanie libstatgrab" #: core.cpp:1852 #, c-format msgid "%i days, %i hours, %i minutes, %i seconds" msgstr "%i dni, %i godzin, %i minut, %i sekund" #: core.cpp:1915 msgid "Updating benchmark status" msgstr "Aktualizacja statusu benchmarku" #: core.cpp:1918 msgid "Active" msgstr "Aktywny" #: core.cpp:1921 #, c-format msgid "(%u hours left)" msgstr "(%u godzin pozostało)" #: core.cpp:1923 #, c-format msgid "(%u minutes left)" msgstr "(%u minut pozostało)" #: core.cpp:1925 #, c-format msgid "(%u seconds left)" msgstr "(pozostało %u sekund)" #: core.cpp:1929 core.cpp:1984 core.cpp:1985 msgid "Inactive" msgstr "Nieaktywny" #: core.cpp:1932 #, c-format msgid "in %u hours" msgstr "w %u godzinach" #: core.cpp:1934 #, c-format msgid "in %u minutes" msgstr "w %u minutach" #: core.cpp:1936 #, c-format msgid "in %u seconds" msgstr "w %u sekundach" #: core.cpp:1953 #, c-format msgid "Starting benchmark with %u threads" msgstr "Rozpoczęcie testu porównawczego z %u wątków" #: core.cpp:1976 msgid "an error occurred while starting benchmark" msgstr "wystąpił błąd podczas uruchamiania benchmarku" #: core.cpp:2002 msgid "Finding CPU package in fallback mode" msgstr "Wyszukiwanie rodzaju układu CPU w trybie awaryjnym" #: core.cpp:2032 #, c-format msgid "Your CPU socket is not present in the database ==> %s, codename: %s" msgstr "Twojego gniazda CPU nie ma w bazie ==> %s, codename: %s" #: core.cpp:2052 msgid "Calculating CPU multipliers in fallback mode" msgstr "Obliczanie mnożnika CPU w trybie awaryjnym" #: core.cpp:2072 msgid "Retrieving motherboard information in fallback mode" msgstr "Pozyskiwanie informacji o płycie głównej w trybie awaryjnym" #: core.cpp:2085 msgid "failed to retrieve motherboard information (fallback mode)" msgstr "nie udało się pobrać informacji o płycie głównej (tryb awaryjny)" #: core.cpp:2127 msgid "Retrieving CPU temperature in fallback mode" msgstr "Pozyskiwanie informacji o temperaturze CPU w trybie awaryjnym" #: core.cpp:2173 msgid "failed to retrieve CPU temperature (fallback mode)" msgstr "nie udało się pobrać temperatury CPU (tryb awaryjny)" #: core.cpp:2188 msgid "Retrieving CPU voltage in fallback mode" msgstr "Pozyskiwanie napięcia CPU w trybie awaryjnym" #: core.cpp:2200 msgid "failed to retrieve CPU voltage (fallback mode)" msgstr "nie udało się pozyskać napięcia CPU (tryb awaryjny)" #: core.cpp:2214 msgid "Retrieving CPU frequency in fallback mode" msgstr "Pobieranie częstotliwości procesora w trybie awaryjnym" #: core.cpp:2220 msgid "failed to retrieve CPU frequency (fallback mode)" msgstr "nie udało się pobrać częstotliwości procesora (tryb awaryjny)" #: daemon_client.cpp:65 msgid "Starting daemon in background…" msgstr "Uruchamianie demona w tle…" #: daemon_client.cpp:172 msgid "pkexec: authorization could not be obtained (dialog dismissed)" msgstr "" "pkexec: nie można uzyskać autoryzacji (okno dialogowe zostało odrzucone)" #: daemon_client.cpp:175 msgid "pkexec: authorization could not be obtained (not authorized)" msgstr "pkexec: nie można było uzyskać autoryzacji (nie autoryzowano)" #: daemon_client.cpp:178 msgid "pkexec: command not found" msgstr "pkexec: nie znaleziono polecenia" #: daemon_client.cpp:181 msgid "pkexec: unexpected error code" msgstr "pkexec: nieoczekiwany kod błędu" #: daemon_client.cpp:211 msgid "Connecting to daemon…" msgstr "Łączę się z demonem…" #: daemon_server.cpp:261 #, c-format msgid "request_handler: case %i not handled" msgstr "moduł obsługi żądań: przypadek %i nie obsługiwany" #: data.cpp:124 cpu-x-gtk-3.12.ui:1370 msgid "CPU" msgstr "CPU" #: data.cpp:187 msgid "P-core" msgstr "P-core" #: data.cpp:188 msgid "E-core" msgstr "E-core" #: data.cpp:189 data.cpp:192 msgid "Core" msgstr "Rdzeń" #: data.cpp:208 cpu-x-gtk-3.12.ui:746 msgid "Processor" msgstr "Procesor" #: data.cpp:240 data.cpp:329 cpu-x-gtk-3.12.ui:1968 msgid "Caches" msgstr "Pamięci Podręczne" #: data.cpp:247 #, c-format msgid "%2d x %4d %s, %2d-way" msgstr "%2d x %4d %s, %2d-sposób" #: data.cpp:249 #, c-format msgid "%d %s, %d-way" msgstr "%d %s, %d-sposób" #: data.cpp:263 #, fuzzy msgid "Count" msgstr "Licznik" #: data.cpp:276 cpu-x-gtk-3.12.ui:968 msgid "Clocks" msgstr "Zegary" #: data.cpp:379 data.cpp:383 #, c-format msgid "L%u Cache" msgstr "Pamięć podręczna L%u" #: data.cpp:385 #, c-format msgid "%s associative, %d-%s line size" msgstr "%s przemienne, %d-%s rozmiar linii" #: data.cpp:398 msgid "Test" msgstr "Testy" #: data.cpp:409 data.cpp:423 cpu-x-gtk-3.12.ui:2146 cpu-x-gtk-3.12.ui:2517 msgid "Motherboard" msgstr "Płyta główna" #: data.cpp:437 cpu-x-gtk-3.12.ui:2367 msgid "BIOS" msgstr "BIOS" #: data.cpp:452 cpu-x-gtk-3.12.ui:2498 msgid "Chipset" msgstr "Chipset" #: data.cpp:467 data.cpp:569 cpu-x-gtk-3.12.ui:3156 cpu-x-gtk-3.12.ui:3761 msgid "Memory" msgstr "Pamięć" #: data.cpp:483 #, c-format msgid "Stick %u" msgstr "" #: data.cpp:487 cpu-x-gtk-3.12.ui:3134 msgid "Sticks" msgstr "" #: data.cpp:541 cpu-x-gtk-3.12.ui:3780 msgid "System" msgstr "System" #: data.cpp:554 cpu-x-gtk-3.12.ui:3380 msgid "Operating System" msgstr "System operacyjny" #: data.cpp:587 cpu-x-gtk-3.12.ui:4960 msgid "Graphics" msgstr "Grafika" #: data.cpp:621 #, c-format msgid "Card %u" msgstr "Karta %u" #: data.cpp:625 cpu-x-gtk-3.12.ui:4938 msgid "Cards" msgstr "Karty" #: data.cpp:672 cpu-x-gtk-3.12.ui:5300 msgid "Bench" msgstr "Bench" #: data.cpp:685 msgid "Not started" msgstr "Nie uruchomiono" #: data.cpp:688 cpu-x-gtk-3.12.ui:5070 msgid "Prime numbers (slow)" msgstr "Liczby pierwsze (wolno)" #: data.cpp:692 cpu-x-gtk-3.12.ui:5178 msgid "Prime numbers (fast)" msgstr "Liczby pierwsze (szybko)" #: data.cpp:696 cpu-x-gtk-3.12.ui:5281 msgid "Parameters" msgstr "Parametry" #: data.cpp:721 data.cpp:727 #, c-format msgid "%u mins" msgstr "%u min" #: data.cpp:734 cpu-x-gtk-3.12.ui:5444 cpu-x-gtk-3.12.ui:5552 msgid "About" msgstr "O Programie" #: data.cpp:739 #, c-format msgid "" "%s is a Free software that gathers information\n" "on CPU, motherboard and more." msgstr "" "%s jest darmowym programem który gromadzi informacje\n" "o CPU, płycie głównej i wiele więcej." #: data.cpp:744 msgid "About CPU-X" msgstr "O Programie CPU-X" #: data.cpp:745 #, c-format msgid "Version %s" msgstr "Wersja %s" #: data.cpp:746 #, c-format msgid "Author: %s" msgstr "Autor: %s" #: data.cpp:747 #, c-format msgid "Site: %s" msgstr "Strona domowa: %s" #: data.cpp:751 cpu-x-gtk-3.12.ui:5533 msgid "License" msgstr "Licencja" #: data.cpp:753 #, c-format msgid "This software is distributed under the terms of %s" msgstr "To oprogramowanie jest rozpowszechniane na warunkach %s" #: data.cpp:754 main.cpp:176 msgid "This program comes with ABSOLUTELY NO WARRANTY" msgstr "To oprogramowanie jest dostarczane bez ŻADNEJ GWARANCJI" #: gui_gtk.cpp:61 #, c-format msgid "Cannot find path for '%s' file" msgstr "Nie można znaleźć ścieżki do pliku'%s'" #: gui_gtk.cpp:400 msgid "Start daemon" msgstr "Uruchom demon" #: gui_gtk.cpp:403 msgid "Connected to daemon" msgstr "Połączony z demonem" #: gui_gtk.cpp:406 msgid "No polkit authentication agent found" msgstr "Nie znaleziono agenta uwierzytelniającego polkit" #: gui_gtk.cpp:411 msgid "Ask password to start daemon in background" msgstr "Pytaj o hasło, aby uruchomić demona w tle" #: gui_gtk.cpp:415 msgid "Settings" msgstr "Ustawienia" #: gui_gtk.cpp:634 msgid "BaseFamily" msgstr "Rodzina bazowa" #: gui_gtk.cpp:635 msgid "CPU display (\"true\") family (computed as BaseFamily+ExtendedFamily)" msgstr "" "Rodzina wyświetlaczy CPU (\"true\") (obliczana jako " "BaseFamily+ExtendedFamily)" #: gui_gtk.cpp:636 msgid "BaseModel" msgstr "Model bazowy" #: gui_gtk.cpp:637 msgid "CPU display (\"true\") model (computed as (ExtendedModel<<4)+BaseModel)" msgstr "" "Model wyświetlania procesora (\"true\") (obliczany jako " "(ExtendedModel<<4)+BaseModel)" #: gui_gtk.cpp:847 #, fuzzy msgid "" "Identify the physically-labeled socket or board position where the memory " "device is located" msgstr "" "Zidentyfikuj fizycznie oznaczone gniazdo lub pozycję płyty, na której " "znajduje się urządzenie pamięci" #: gui_gtk.cpp:848 #, fuzzy msgid "Identify the physically labeled bank where the memory device is located" msgstr "" "Zidentyfikuj fizycznie oznaczony bank, w którym znajduje się urządzenie " "pamięci" #: gui_gtk.cpp:1052 msgid "User Mode Driver Version" msgstr "Tryb użytkownika Wersja sterownika" #: gui_gtk.cpp:1066 msgid "Vulkan Ray Tracing" msgstr "Vulkan Ray Tracing" #: gui_gtk.cpp:1260 msgid "Starting GTK GUI…" msgstr "Uruchamianie GTK GUI…" #: gui_gtk.cpp:1272 msgid "failed to import UI in GtkBuilder" msgstr "nie udało się zaimportować interfejsu z GtkBuilder" #: main.cpp:63 msgid "Start graphical user interface (GUI) (default)" msgstr "Uruchom graficzny interfejs użytkownika (GUI) (domyślnie)" #: main.cpp:64 msgid "Start text-based user interface (TUI)" msgstr "Uruchom tekstowy interfejs użytkownika (TUI)" #: main.cpp:65 msgid "Dump all data on standard output and exit" msgstr "Zrzuć wszystkie dane na standardowe wyjście i wyjdź" #: main.cpp:66 msgid "Run embedded command dmidecode and exit" msgstr "Uruchom wbudowane polecenie dmidecode i wyjdź" #: main.cpp:67 msgid "Run embedded command bandwidth and exit" msgstr "Uruchom wbudowane pasmo poleceń i zakończ" #: main.cpp:68 msgid "Set temperature unit (c[elsius]|f[ahrenheit]|k[elvin]|r[ankine])" msgstr "" "Ustawienie jednostki temperatury (c[elsius]|f[ahrenheit]|k[elvin]|r[ankine])" #: main.cpp:69 msgid "Set custom time between two refreshes (in seconds)" msgstr "Ustaw niestandardowy czas między dwoma odświeżeniami (w sekundach)" #: main.cpp:70 msgid "Set default tab (integer)" msgstr "Ustaw domyślną kartę (liczba całkowita)" #: main.cpp:71 msgid "Select core type to monitor (integer)" msgstr "Wybierz typ rdzenia do monitorowania (liczba całkowita)" #: main.cpp:72 msgid "Select CPU core to monitor (integer)" msgstr "Wybierz rdzeń procesora do monitorowania (liczba całkowita)" #: main.cpp:73 msgid "Set custom bandwidth test for CPU caches speed (integer)" msgstr "" "Ustaw niestandardowy test przepustowości dla szybkości pamięci podręcznej " "procesora (liczba całkowita)" #: main.cpp:74 msgid "Select default memory stick (integer)" msgstr "Wybierz domyślną kartę pamięci (liczba całkowita)" #: main.cpp:75 msgid "Select default graphic card (integer)" msgstr "Wybierz domyślną kartę graficzną (liczba całkowita)" #: main.cpp:76 cpu-x-gtk-3.12.ui:5910 msgid "Start and connect to daemon" msgstr "Uruchamianie i łączenie się z demonem" #: main.cpp:77 msgid "Verbose output" msgstr "Pełne dane wyjściowe" #: main.cpp:78 msgid "Print help and exit" msgstr "Drukuj pomoc i wyjdź" #: main.cpp:79 msgid "Print version and exit" msgstr "Wydrukuj wersję i wyjdź" #: main.cpp:80 msgid "Print CPUID values in decimal (default is hexadeximal)" msgstr "" "Wydrukuj wartości CPUID w systemie dziesiętnym (domyślnie szesnastkowo)" #: main.cpp:81 msgid "Disable colored output" msgstr "Wyłącz kolorowe wyjście" #: main.cpp:82 msgid "Print information for debugging" msgstr "Wydrukuj informacje do debugowania" #: main.cpp:83 msgid "Print required information to paste in an issue" msgstr "Wydrukuj wymagane informacje do wklejenia w śledzeniu problemów" #: main.cpp:84 msgid "Set key mapping for NCurses mode (a[rrows]|e[macs]|i[nverted-T]|v[im])" msgstr "" "Ustaw mapowanie klawiszy dla trybu NCurses (a [rrows] | e [macs] | i " "[nverted-T] | v [im])" #: main.cpp:95 msgid "Add default command line arguments" msgstr "Dodaj domyślne argumenty wiersza poleceń" #: main.cpp:96 msgid "Enforce the bus clock" msgstr "Wymuszanie zegara magistrali" #: main.cpp:97 msgid "" "Ignore CPU values reported by libcpuid (comma-separated values among 'temp', " "'volt' and 'freq')" msgstr "" "Ignoruj wartości procesora zgłaszane przez libcpuid (wartości oddzielone " "przecinkami pomiędzy 'temp', 'volt' i 'freq')" #: main.cpp:98 msgid "Read CPUID raw data from a given file" msgstr "Odczyt danych nieprzetworzonych CPUID z danego pliku" #: main.cpp:99 msgid "Only print a message if CPU is not present in the database" msgstr "Wydrukuj komunikat tylko wtedy, gdy CPU nie ma w bazie danych" #: main.cpp:126 #, c-format msgid "Usage: %s DISPLAY [OPTIONS]\n" msgstr "Użycie: %s WYŚWIETL [OPCJE]\n" #: main.cpp:127 msgid "Available DISPLAY:" msgstr "Dostępny WYŚWIETLACZ:" #: main.cpp:135 msgid "Available OPTIONS:" msgstr "Dostępne OPCJE:" #: main.cpp:144 msgid "Influenceable environment variables:" msgstr "Zmienne środowiskowe, na które można wpłynąć:" #: main.cpp:175 msgid "This is free software: you are free to change and redistribute it." msgstr "To jest wolne oprogramowanie: możesz je zmieniać i rozpowszechniać." #: main.cpp:177 #, c-format msgid "See the %s license: <%s>\n" msgstr "Zobacz licencje %s: <%s>\n" #: main.cpp:184 #, c-format msgid "-- %-9s version: %s" msgstr "-- %-9s wersja: %s" #: main.cpp:381 #, c-format msgid "" "\n" "Oops, something was wrong! %s has received signal %d (%s) and has crashed." msgstr "" "\n" "Ups, coś poszło nie tak! %s odebrał sygnał %d (%s) i uległ awarii." #: main.cpp:383 #, c-format msgid "" "\n" "Oops, something was wrong! %s has received signal %d (%s) and is trying to " "recover." msgstr "" "\n" "Ups, coś poszło nie tak! %s odebrał sygnał %d (%s) i próbuje się odbudować." #: main.cpp:407 msgid "You can open a new issue here, by filling the template as requested:" msgstr "" "Możesz otworzyć nowy problem tutaj, wypełniając szablon zgodnie z żądaniem:" #: main.cpp:449 msgid "an error occurred while setting locale" msgstr "wystąpił błąd podczas ustawiania ustawień regionalnych" #: options.cpp:124 #, c-format msgid "" "Selected CPU type (%u) is not a valid number (%u is the maximum for this CPU)" msgstr "" "Wybrany typ procesora (%u) nie jest prawidłową liczbą (%u jest maksymalną " "liczbą dla tego procesora)" #: options.cpp:145 #, c-format msgid "" "Selected bandwidth test (%u) is not a valid number (%u is the maximum for " "this system)" msgstr "" "Wybrany test przepustowości (%u) nie jest prawidłową liczbą (%u to maksimum " "dla tego systemu)" #: options.cpp:168 #, c-format msgid "" "Selected RAM stick (%u) is not a valid number (%u is the maximum for this " "system)" msgstr "" "Wybrana pamięć RAM (%u) jest nieprawidłową liczbą (%u to maksimum dla tego " "systemu)" #: options.cpp:188 #, c-format msgid "" "Selected graphic card (%u) is not a valid number (%u is the maximum for this " "system)" msgstr "" "Wybrana karta graficzna (%u) nie jest prawidłową liczbą (%u to maksimum dla " "tego systemu)" #: options.cpp:204 #, c-format msgid "failed to change CPU affinitiy to core %u" msgstr "nie udało się zmienić koligacji procesora do rdzenia %u" #: options.cpp:210 #, c-format msgid "" "Selected CPU core (%u) is not a valid number (%u is the maximum for this " "type of core)" msgstr "" "Wybrany rdzeń procesora (%u) nie jest prawidłową liczbą (%u jest maksymalną " "liczbą dla tego typu rdzenia)" #: options.cpp:284 #, c-format msgid "Selected tab (%u) is not a valid number (%u is the maximum)" msgstr "Wybrana zakładka (%u) nie jest prawidłową liczbą (%u to maksimum)" #: tui_ncurses.cpp:111 msgid "Window is too small!" msgstr "Okno jest za małe!" #: tui_ncurses.cpp:119 msgid "Press 'h' to see help." msgstr "Naciśnij „h”, aby wyświetlić pomoc." #: tui_ncurses.cpp:232 #, c-format msgid "Welcome in %s NCurses help!\n" msgstr "Witamy w pomocy %s NCurses!\n" #: tui_ncurses.cpp:233 msgid "This help describes how to use this Text-based User Interface." msgstr "" "W tej pomocy opisano sposób korzystania z tekstowego interfejsu użytkownika." #: tui_ncurses.cpp:235 msgid "Global keys:" msgstr "Klucze globalne:" #: tui_ncurses.cpp:236 msgid "Press 'left' key or 'tab' key to switch in left tab." msgstr "" "Naciśnij klawisz „w lewo” lub klawisz „tab”, aby przełączyć się na lewą " "kartę." #: tui_ncurses.cpp:237 msgid "Press 'right' key or 'shift + tab' keys to switch in right tab." msgstr "" "Naciśnij klawisz „w prawo” lub klawisze „shift + tab”, aby przełączyć się na " "prawą kartę." #: tui_ncurses.cpp:238 msgid "Press 'h' key to see this help." msgstr "Naciśnij klawisz „h”, aby wyświetlić pomoc." #: tui_ncurses.cpp:239 msgid "Press 'q' key to exit." msgstr "Nacisnąć klawisz \"q\", aby wyjść." #: tui_ncurses.cpp:241 msgid "CPU tab:" msgstr "Zakładka CPU:" #: tui_ncurses.cpp:242 msgid "Press 'next page' key to decrease core type number to monitor." msgstr "" "Naciśnij klawisz „następna strona”, aby zmniejszyć numer typu rdzenia do " "monitorowania." #: tui_ncurses.cpp:243 msgid "Press 'previous page' key to increase core type number to monitor." msgstr "" "Naciśnij klawisz „poprzednia strona”, aby zwiększyć numer typu rdzenia do " "monitorowania." #: tui_ncurses.cpp:244 msgid "Press 'down' key to decrease CPU core number to monitor." msgstr "" "Naciśnij \"w dół\", aby zmniejszyć liczbę rdzeni procesora do monitorowania." #: tui_ncurses.cpp:245 msgid "Press 'up' key to increase CPU core number to monitor." msgstr "" "Naciśnij \"w górę\", aby zwiększyć liczbę rdzeni procesora do monitorowania." #: tui_ncurses.cpp:247 msgid "Caches tab:" msgstr "Karta Pamięć Podręczna:" #: tui_ncurses.cpp:248 msgid "Press 'down' key to switch to previous test." msgstr "Naciśnij klawisz „w dół”, aby wrócić do poprzedniego testu." #: tui_ncurses.cpp:249 msgid "Press 'up' key to switch to next test." msgstr "Naciśnij klawisz „w górę”, aby przejść do następnego testu." #: tui_ncurses.cpp:251 msgid "Bench tab:" msgstr "Karta testy wydajności:" #: tui_ncurses.cpp:252 msgid "Press 'down' key to decrement benchmark duration." msgstr "" "Naciśnij klawisz „w dół”, aby zmniejszyć czas trwania testu porównawczego." #: tui_ncurses.cpp:253 msgid "Press 'up' key to increment benchmark duration." msgstr "" "Naciśnij klawisz „w górę”, aby zwiększyć czas trwania testu porównawczego." #: tui_ncurses.cpp:254 msgid "Press 'next page' key to decrement number of threads to use." msgstr "" "Naciśnij przycisk „następna strona”, aby zmniejszyć liczbę używanych wątków." #: tui_ncurses.cpp:255 msgid "Press 'previous page' key to increment number of threads to use." msgstr "" "Naciśnij przycisk „poprzednia strona”, aby zwiększyć liczbę używanych wątków." #: tui_ncurses.cpp:256 msgid "Press 's' key to start/stop prime numbers (slow) benchmark." msgstr "" "Naciśnij klawisz 's', aby rozpocząć/zatrzymać test wydajności liczenia liczb " "pierwszych (powoli)." #: tui_ncurses.cpp:257 msgid "Press 'f' key to start/stop prime numbers (fast) benchmark." msgstr "" "Naciśnij klawisz 'f', aby uruchomić/zatrzymać test wydajności zliczania " "liczb pierwszych (szybko)." #: tui_ncurses.cpp:259 msgid "Graphics tab:" msgstr "Karta Grafika:" #: tui_ncurses.cpp:260 msgid "Press 'down' key to switch to previous graphic card." msgstr "" "Naciśnij klawisz 'w dół', aby przełączyć się na poprzednią kartę graficzną." #: tui_ncurses.cpp:261 msgid "Press 'up' key to switch to next graphic card." msgstr "Naciśnij klawisz „w górę”, aby przejść do następnej karty graficznej." #: tui_ncurses.cpp:263 msgid "Press any key to exit this help." msgstr "Naciśnij dowolny klawisz, aby zamknąć pomoc." #: tui_ncurses.cpp:640 msgid "Starting NCurses TUI…" msgstr "Uruchamianie NCurses TUI…" #: tui_ncurses.cpp:649 msgid "" "FATAL ERROR: terminfo database could not be found (try to set TERMINFO " "environment variable)" msgstr "" "Błąd krytyczny: nie można było znaleźć bazy danych terminfo (spróbuj ustawić " "zmienną środowiskową TERMINFO)" #: tui_ncurses.cpp:654 #, c-format msgid "Failed to set up %s terminal (err=%i); falling back to %s" msgstr "Nie można skonfigurować terminala %s (err=%i); powrót do %s" #: util.cpp:189 #, c-format msgid "cannot find unit in '%s' string at position %i" msgstr "nie można odnaleźć jednostki w ciągu '%s' w pozycji %i" #: util.cpp:252 #, c-format msgid "an error occurred while opening file '%s'" msgstr "wystąpił błąd podczas otwierania pliku '%s'" #: util.cpp:297 #, c-format msgid "an error occurred while running command '%s'" msgstr "wystąpił błąd podczas wykonywania polecenia '%s'" #: util.cpp:437 msgid "set_cpu_affinity() not supported on this operating system" msgstr "set_cpu_affinity() nie jest obsługiwana w tym systemie operacyjnym" #: data.hpp:103 data.hpp:244 data.hpp:332 msgid "Vendor" msgstr "Producent" #: data.hpp:104 msgid "Code Name" msgstr "Nazwa kodowa" #: data.hpp:105 msgid "Package" msgstr "Rodzaj Układu" #: data.hpp:106 msgid "Technology" msgstr "Technologia" #: data.hpp:107 data.hpp:268 msgid "Voltage" msgstr "Napięcie" #: data.hpp:108 msgid "Specification" msgstr "Specyfikacja" #: data.hpp:109 msgid "Family" msgstr "Rodzina" #: data.hpp:110 msgid "Disp. Family" msgstr "Wyśw. Rodzina" #: data.hpp:111 data.hpp:224 data.hpp:245 data.hpp:335 msgid "Model" msgstr "Model" #: data.hpp:112 msgid "Disp. Model" msgstr "Wyśw. Model" #: data.hpp:113 msgid "Temp." msgstr "Temperatura." #: data.hpp:114 msgid "Stepping" msgstr "Krok" #: data.hpp:115 msgid "Instructions" msgstr "Instrukcje" #: data.hpp:125 msgid "L1 Data" msgstr "L1 Dane" #: data.hpp:126 msgid "L1 Inst." msgstr "L1 Instrukcja." #: data.hpp:127 msgid "Level 2" msgstr "Poziom 2" #: data.hpp:128 msgid "Level 3" msgstr "Poziom 3" #: data.hpp:137 cpu-x-gtk-3.12.ui:1232 msgid "Cores" msgstr "Rdzenie" #: data.hpp:138 data.hpp:408 cpu-x-gtk-3.12.ui:1252 msgid "Threads" msgstr "Wątki" #: data.hpp:155 msgid "Core Speed" msgstr "Częstotliwość rdzenia" #: data.hpp:156 msgid "Multiplier" msgstr "Mnożnik" #: data.hpp:157 msgid "Bus Speed" msgstr "Częstotliwość Szyny" #: data.hpp:158 data.hpp:341 msgid "Usage" msgstr "Użycie" #: data.hpp:188 data.hpp:265 msgid "Size" msgstr "Rozmiar" #: data.hpp:189 data.hpp:267 msgid "Speed" msgstr "Prędkość" #: data.hpp:223 data.hpp:259 msgid "Manufacturer" msgstr "Producent" #: data.hpp:225 msgid "Revision" msgstr "Rewizja" #: data.hpp:233 msgid "Brand" msgstr "Marka" #: data.hpp:234 msgid "Version" msgstr "Wersja" #: data.hpp:235 msgid "Date" msgstr "Data" #: data.hpp:236 msgid "ROM Size" msgstr "ROM Rozmiar" #: data.hpp:260 #, fuzzy msgid "Part Number" msgstr "Numer części" #: data.hpp:261 msgid "Type" msgstr "Typ" #: data.hpp:262 msgid "Type Detail" msgstr "Szczegóły typu" #: data.hpp:263 msgid "Device Locator" msgstr "Lokalizator urządzeń" #: data.hpp:264 msgid "Bank Locator" msgstr "Lokalizator banku" #: data.hpp:266 #, fuzzy msgid "Rank" msgstr "Pozycja" #: data.hpp:292 msgid "Name" msgstr "Nazwa" #: data.hpp:293 msgid "Kernel" msgstr "Jądro" #: data.hpp:294 msgid "Hostname" msgstr "Nazwa hosta" #: data.hpp:295 msgid "Uptime" msgstr "Czas pracy" #: data.hpp:303 msgid "Used" msgstr "Używana" #: data.hpp:304 msgid "Buffers" msgstr "Buforowana" #: data.hpp:305 msgid "Cached" msgstr "Podręczna" #: data.hpp:306 msgid "Free" msgstr "Wolna" #: data.hpp:307 msgid "Swap" msgstr "Wymiany" #: data.hpp:333 msgid "Driver" msgstr "Sterownik" #: data.hpp:334 msgid "UMD Version" msgstr "Wersja UMD" #: data.hpp:336 msgid "Compute Unit" msgstr "Jednostka obliczeniowa" #: data.hpp:337 msgid "Device ID" msgstr "ID urządzenia" #: data.hpp:338 msgid "VBIOS Version" msgstr "Wersja VBIOS" #. #-#-#-#-# source_ui.pot (cpu-x ) #-#-#-#-# #. Setting: "Interface" tab #: data.hpp:339 cpu-x-gtk-3.12.ui:5807 msgid "Interface" msgstr "Wygląd" #: data.hpp:340 msgid "Temperature" msgstr "Temperatura" #: data.hpp:342 msgid "Core Voltage" msgstr "Napięcie rdzenia" #: data.hpp:343 msgid "Power Avg" msgstr "Moc śr" #: data.hpp:344 msgid "Core Clock" msgstr "Zegar rdzenia" #: data.hpp:345 msgid "Memory Clock" msgstr "Zegar Pamięci" #: data.hpp:346 msgid "Memory Used" msgstr "Używana pamięć" #: data.hpp:347 msgid "Resizable BAR" msgstr "Zmień rozmiar paska" #: data.hpp:348 msgid "Vulkan RT" msgstr "Vulkan RT" #: data.hpp:349 msgid "OpenGL Version" msgstr "Wersja OpenGL" #: data.hpp:350 msgid "Vulkan Version" msgstr "Wersja Vulkan" #: data.hpp:351 msgid "OpenCL Version" msgstr "Wersja OpenCL" #: data.hpp:387 msgid "Score" msgstr "Wynik" #: data.hpp:388 msgid "Run" msgstr "Uruchom" #: data.hpp:407 msgid "Duration" msgstr "Czas trwania" #: util.hpp:77 msgid "bytes" msgstr "bajtów" #. TRANSLATORS: initials for kilobyte (10³): please put initials (keep it short) #: util.hpp:80 msgid "kB" msgstr "kB" #. TRANSLATORS: initials for megabyte (10⁶): please put initials (keep it short) #: util.hpp:82 msgid "MB" msgstr "MB" #. TRANSLATORS: initials for gigabyte (10⁹): please put initials (keep it short) #: util.hpp:84 msgid "GB" msgstr "GB" #. TRANSLATORS: initials for terabyte (10¹²): please put initials (keep it short) #: util.hpp:86 msgid "TB" msgstr "TB" #. TRANSLATORS: initials for kibibyte (2¹⁰): please put initials (keep it short) #: util.hpp:89 msgid "KiB" msgstr "KiB" #. TRANSLATORS: initials for mebibyte (2²⁰): please put initials (keep it short) #: util.hpp:91 msgid "MiB" msgstr "MiB" #. TRANSLATORS: initials for gibibyte (2³⁰): please put initials (keep it short) #: util.hpp:93 msgid "GiB" msgstr "GiB" #. TRANSLATORS: initials for tebibyte (2⁴⁰): please put initials (keep it short) #: util.hpp:95 msgid "TiB" msgstr "TiB" #: cpu-x-gtk-3.12.ui:1184 msgid "Cache" msgstr "Pamięć podręczna" #. Setting: refresh time for UI #: cpu-x-gtk-3.12.ui:5721 msgid "Refresh time" msgstr "Czas odświeżenia" #. Setting: GUI theme #: cpu-x-gtk-3.12.ui:5745 #, fuzzy #| msgid "Theme" msgid "Text theme" msgstr "Kompozycja" #. Setting: automatic GUI theme #: cpu-x-gtk-3.12.ui:5760 msgid "Automatic" msgstr "Automatyczny" #. Setting: light GUI theme #: cpu-x-gtk-3.12.ui:5761 msgid "Blue for light theme" msgstr "" #. Setting: dark GUI theme #: cpu-x-gtk-3.12.ui:5762 msgid "Yellow for dark theme" msgstr "" #. Setting: temperature unit #: cpu-x-gtk-3.12.ui:5775 msgid "Temperature unit" msgstr "Jednostka temperatury" #. Setting: default tab at startup #: cpu-x-gtk-3.12.ui:5826 msgid "Default tab" msgstr "Domyślna karta" #. Setting: default CPU core at startup #: cpu-x-gtk-3.12.ui:5839 msgid "Default CPU core" msgstr "Domyślny rdzeń procesora" #. Setting: default cache test at startup #: cpu-x-gtk-3.12.ui:5852 msgid "Default cache test" msgstr "Domyślny test pamięci podręcznej" #. Setting: print CPUID values in decimal or hexadecimal #: cpu-x-gtk-3.12.ui:5895 msgid "Print CPUID values in decimal" msgstr "Wydrukuj wartości CPUID w postaci dziesiętnej" #. Setting: default graphic card at startup #: cpu-x-gtk-3.12.ui:5928 msgid "Default graphic card" msgstr "Domyślna karta graficzna" #. Setting: default CPU core at startup #: cpu-x-gtk-3.12.ui:5952 msgid "Default core type" msgstr "Domyślny typ rdzenia" #. Setting: default graphic card at startup #: cpu-x-gtk-3.12.ui:5976 msgid "Default memory stick" msgstr "Domyślna karta pamięci" #. Setting: "Startup" tab #: cpu-x-gtk-3.12.ui:6004 msgid "Startup" msgstr "Uruchamianie" #~ msgid "Light" #~ msgstr "Jasny" #~ msgid "Dark" #~ msgstr "Ciemny" #~ msgid "Calculating CPU multipliers" #~ msgstr "Obliczanie mnożnika CPU" #, c-format #~ msgid "Current: PCIe Gen%1dx%d / Max: Gen%1dx%d" #~ msgstr "Aktualne: PCIe Gen%1dx%d / Max: Gen%1dx%d" #~ msgid "failed to retrieve GPU clocks" #~ msgstr "nie udało się znaleźć zegarów GPU" #, c-format #~ msgid "Core #%i" #~ msgstr "Rdzeń #%i" #~ msgid "Setting label names" #~ msgstr "Ustawianie nazw etykiet" #, c-format #~ msgid "Bank %i" #~ msgstr "Slot %i" #~ msgid "Reference" #~ msgstr "Referencja" #~ msgid "Distribution" #~ msgstr "Dystrybucja" #~ msgid "Compiler" #~ msgstr "Kompilator" #~ msgid "GPU clock" #~ msgstr "Zegar GPU" #~ msgid "Dumping data…" #~ msgstr "Przesyłanie danych…" #~ msgid "Freeing memory" #~ msgstr "Zwalnianie pamięci" #~ msgid "Ignore CPU frequency reported by libcpuid" #~ msgstr "Ignoruj częstotliwość procesora zgłaszaną przez libcpuid" #, c-format #~ msgid "failed to call wordexp (%i)" #~ msgstr "nie udało się wywołać wordexp (%i)" #~ msgid "Press 'home' key to scroll up in a page." #~ msgstr "Naciśnij klawisz „home”, aby przewinąć stronę w górę." #~ msgid "Press 'end' key to scroll down in a page." #~ msgstr "Naciśnij \"end\", aby przewinąć stronę w dół." #, c-format #~ msgid "String '%s' is too long, truncating…" #~ msgstr "Ciąg '%s' jest za długi, obcinanie…" #, c-format #~ msgid "failed to open %s directory" #~ msgstr "Nie udało się otworzyć pliku %s" #~ msgid "an error occurred while compiling regex" #~ msgstr "wystąpił błąd podczas kompilacji wyrażenia regularnego" #~ msgid "FATAL ERROR: could not allocate memory" #~ msgstr "Błąd krytyczny: nie można przydzielić pamięci" #, fuzzy, c-format #~| msgid "failed to call vkCreateInstance" #~ msgid "failed to call vkEnumerateInstanceExtensionProperties (%s)" #~ msgstr "nie udało się wywołać vkCreateInstance" #~ msgid "Vulkan API is not available" #~ msgstr "API Vulkan jest niedostępny" #, c-format #~ msgid "%s" #~ msgstr "%s" #, c-format #~ msgid "" #~ "CPU hybrid architecture is not supported. For more details, please refer " #~ "to following issue: %s" #~ msgstr "" #~ "Architektura hybrydowa CPU nie jest obsługiwana. Aby uzyskać więcej " #~ "informacji, zapoznaj się z następującym zagadnieniem: %s" #~ msgid "NOT SUPPORTED" #~ msgstr "NIEOBSŁUGIWANE" #~ msgid "There is no device with Vulkan support" #~ msgstr "Nie ma żadnych urządzeń z obsługą Vulkan" #~ msgid "Socket(s)" #~ msgstr "Gniazda" #~ msgid "Thread(s)" #~ msgstr "Wątki" #~ msgid "You can paste this backtrace by opening a new issue here:" #~ msgstr "Możesz wkleić to śledzenie, otwierając nowy problem tutaj:" #, fuzzy #~| msgid "failed to call dmidecode" #~ msgid "faild to call clGetDeviceIDs" #~ msgstr "nie udało się wywołać dmidecode" #~ msgid "Exiting %s" #~ msgstr "Wychodzące %s" #~ msgid "Skip CPU MSR opening (need to be root)" #~ msgstr "Pomijam otwarcie CPU MSR (musisz być użytkownikiem root)" #~ msgid "failed to open CPU MSR (%s)" #~ msgstr "nie udało się otworzyć CPU MSR (%s)" #~ msgid "Skip call to dmidecode (need to be root)" #~ msgstr "Pomijam wykonanie dmidecode (musisz być użytkownikiem root)" #~ msgid "failed to allocate memory for dmidecode" #~ msgstr "nie udało się przydzielić pamięci dla dmidecode" #~ msgid "Finding graphic card driver" #~ msgstr "Szukam sterownika karty graficznej" #~ msgid "(%s driver)" #~ msgstr "(sterownik %s)" #~ msgid "Retrieving GPU temperature" #~ msgstr "Pobieranie temperatury GPU" #~ msgid "Off" #~ msgstr "Wyłączone" #~ msgid "failed to retrieve GPU temperature" #~ msgstr "nie udało się pobrać temperatury GPU" #~ msgid "Skip some GPU values (need to be root)" #~ msgstr "" #~ "Pomijanie kilku wartości o procesorze graficznym (musisz mieć uprawnienia " #~ "root'a)" #~ msgid "failed to allocate memory for benchmark" #~ msgstr "nie udało się przydzielić pamięci dla benchmarku" #~ msgid "Root privileges are required to work properly" #~ msgstr "Do prawidłowego działania wymagane są prawa użytkownika root" #~ msgid "Some information will not be retrievable" #~ msgstr "Niektóre informacje nie mogą być pozyskane" #~ msgid "Ignore" #~ msgstr "Ignoruj" #~ msgid "Run as root" #~ msgstr "Uruchom jako root" #~ msgid "A new version of %s is available!" #~ msgstr "Nowa wersja programu %s jest dostępna!" #~ msgid "" #~ "Do you want to update %s to version %s after exit?\n" #~ "It will erase this binary file (%s) by the new version." #~ msgstr "" #~ "Czy chcesz zaktualizować %s do wersji %s przed zamknięciem?\n" #~ "Spowoduje to nadpisanie pliku binarnego (%s) przez nową wersję." #~ msgid "Not now" #~ msgstr "Nie teraz" #~ msgid "Update" #~ msgstr "Zaktualizuj" #~ msgid "Checking on Internet for a new version..." #~ msgstr "Sprawdzanie dostępności nowej wersji..." #~ msgid "failed to open a Curl session" #~ msgstr "Nie udało się otworzyć sesji Curl" #~ msgid "wrong write data" #~ msgstr "nieprawidłowy zapis danych" #~ msgid "(version %s is available)" #~ msgstr "(wersja %s jest dostępna)" #~ msgid "No new version available" #~ msgstr "Nie ma nowej wersji" #~ msgid "(up-to-date)" #~ msgstr "(zaktualizowane)" #~ msgid "an error occurred while extracting %s archive (%s)" #~ msgstr "wystąpił błąd podczas wyodrębniania %s archiwum (%s)" #~ msgid "" #~ "Network access is disabled by environment variable (set CPUX_NETWORK with " #~ "a positive value to enable it)" #~ msgstr "" #~ "Dostęp do sieci jest wyłączany przez zmienną środowiskową (ustaw wartość " #~ "CPUX_NETWORK na wartość dodatnią, aby ją włączyć)" #~ msgid "failed to open %s archive for writing" #~ msgstr "nie można otworzyć archiwum %s do zapisu" #~ msgid "Downloading new version..." #~ msgstr "Pobieranie nowej wersji..." #~ msgid "failed to download %s archive (%s)" #~ msgstr "nie można wczytać %s archiwum (%s)" #~ msgid "Extracting new version..." #~ msgstr "Rozpakowywanie nowej wersji..." #~ msgid "Applying new version..." #~ msgstr "Stosowanie nowej wersji..." #~ msgid "an error occurred while removing/renaming files" #~ msgstr "podczas usuwania/zmiany nazwy plików wystąpił błąd" #~ msgid "Update successful!" #~ msgstr "Aktualizacja zakończona powodzeniem!" #~ msgid "Update portable version if a new version is available" #~ msgstr "Zaktualizuj wersję przenośną, jeśli dostępna jest nowa wersja" #~ msgid "Temporarily disable network support" #~ msgstr "Tymczasowo wyłącz obsługę sieci" #~ msgid "Built on %s, %s (with %s %s on %s)." #~ msgstr "Zbudowane na %s i %s (z użyciem %s%s na %s)." #~ msgid "" #~ "Sorry, you cannot update %s: 32-bit portable version is no more supported." #~ msgstr "" #~ "Niestety nie możesz zaktualizować %s: 32-bitowa wersja przenośna nie jest " #~ "już obsługiwana." #~ msgid "If you want to update, press 'u' key, or anything else to skip.\n" #~ msgstr "" #~ "Jeśli chcesz zaktualizować, naciśnij klawisz 'u', lub cokolwiek innego " #~ "aby pominąć.\n" #~ msgid "" #~ "\n" #~ "\n" #~ "%s will be updated." #~ msgstr "" #~ "\n" #~ "\n" #~ "%s zostaną zaktualizowane." CPU-X-5.0.3/po/pt.po000066400000000000000000001273521454622605200137740ustar00rootroot00000000000000# Copyright © 2014-2024 The Tumultuous Unicorn Of Darkness # This file is distributed under the same license as the CPU-X package. # Rui Mendes , 2019. # ssantos , 2019, 2020, 2021, 2023. # Allan Nordhøy , 2020. # Sérgio Morais , 2021. # SC , 2022. # Hugo Carvalho , 2022, 2023. msgid "" msgstr "" "Project-Id-Version: CPU-X\n" "Report-Msgid-Bugs-To: https://github.com/TheTumultuousUnicornOfDarkness/CPU-" "X/issues\n" "POT-Creation-Date: 2023-12-09 13:09+0100\n" "PO-Revision-Date: 2023-11-15 23:52+0000\n" "Last-Translator: Hugo Carvalho \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 5.2-dev\n" #: core.cpp:135 msgid "Finding CPU technology" msgstr "A encontrar tecnologias da CPU" #: core.cpp:161 #, c-format msgid "" "Your CPU is not present in the database ==> %s, model: %i, ext. model: %i, " "ext. family: %i" msgstr "" "A sua CPU não existe na base de dados ==> %s, modelo: %i, ext. modelo: %i, " "ext. família: %i" #: core.cpp:189 data.cpp:150 data.cpp:342 msgid "unknown" msgstr "desconhecido" #: core.cpp:230 msgid "Calling libcpuid for retrieving static data" msgstr "A chamar libcpuid para recuperar dados estáticos" #: core.cpp:245 #, c-format msgid "failed to call libcpuid (%s)" msgstr "falhou a chamada de libcpuid (%s)" #: core.cpp:340 msgid "Calling libcpuid for retrieving dynamic data" msgstr "A chamar o libcpuid para recuperar dados dinâmicos" #: core.cpp:353 msgid "Calling libcpuid for retrieving CPU MSR static values" msgstr "" "A chamar libcpuid para recuperar valores estáticos do MSR (registo de modelo " "específico) da CPU" #: core.cpp:380 msgid "Calling libcpuid for retrieving CPU MSR dynamic values" msgstr "" "A chamar libcpuid para recuperar valores dinâmicos do MSR (registo de modelo " "específico) da CPU" #: core.cpp:412 msgid "Calling dmidecode" msgstr "A chamar dmidecode" #: core.cpp:454 core.cpp:473 #, c-format msgid "%s (configured)" msgstr "%s (configurado)" #: core.cpp:461 core.cpp:480 #, c-format msgid "%s (max)" msgstr "%s (máx)" #: core.cpp:466 #, c-format msgid "%s (min)" msgstr "%s (mín)" #: core.cpp:496 msgid "Calculating CPU usage" msgstr "A calcular a utilização da CPU" #: core.cpp:546 msgid "Calling bandwidth" msgstr "A chamar a largura de banda" #: core.cpp:613 #, c-format msgid "" "pci_access is not properly initialized: it is a common issue when %s was " "built with a lower libpci version.\n" "Check that libpci %s library is present on your system. Otherwise, please " "rebuild %s." msgstr "" "pci_access não foi inicializado corretamente: é um problema comum quando %s " "foi compilado com uma versão inferior da libpci.\n" "Verifique se a biblioteca libpci %s está presente no seu sistema. Caso " "contrário, compile %s." #: core.cpp:657 #, c-format msgid "No kernel driver in use for graphic card at path %s" msgstr "" "Nenhum driver do kernel em utilização para a placa de vídeo no caminho %s" #: core.cpp:693 #, c-format msgid "Your GPU kernel driver is unknown: %s" msgstr "O driver da sua GPU é desconhecido: %s" #: core.cpp:777 #, fuzzy, c-format #| msgid "Your GPU user mode driver is unknown: %s" msgid "Your GPU user mode driver is unknown for vendor %s: %s" msgstr "O driver modo de utilizador da sua GPU é desconhecido: %s" #: core.cpp:781 #, c-format msgid "failed to call GLFW (%i): %s" msgstr "Houve uma falha ao invocar o GLFW (%i): %s" #: core.cpp:914 msgid "Finding Vulkan API version" msgstr "Encontrando a versão da API do Vulkan" #: core.cpp:926 #, c-format msgid "failed to call vkCreateInstance (%s)" msgstr "houve uma falha ao chamar vkCreateInstance (%s)" #: core.cpp:929 #, c-format msgid "%s is not supported" msgstr "%s não é suportado" #: core.cpp:937 #, c-format msgid "failed to call vkEnumeratePhysicalDevices (%s)" msgstr "Houve uma falha ao chamar o vkEnumeratePhysicalDevices (%s)" #: core.cpp:944 msgid "No available Vulkan devices" msgstr "Não há nenhum dispositivo físico Vulkan disponível" #: core.cpp:952 #, c-format msgid "No available physical devices (%s)" msgstr "Não há nenhum dispositivo físico disponível (%s)" #: core.cpp:1015 #, c-format msgid "Failed to create Vulkan for device %u (%s)" msgstr "Houve uma falha ao criar o Vulkan para o dispositivo %u (%s)" #: core.cpp:1019 #, c-format msgid "%s is not supported for device %u, use only deviceID for matching" msgstr "" "%s não é compatível com o dispositivo %u, use apenas o deviceID para " "correspondência" #: core.cpp:1051 core.cpp:1364 msgid "Enabled" msgstr "Ativado" #: core.cpp:1051 core.cpp:1364 msgid "Disabled" msgstr "Desativado" #: core.cpp:1088 msgid "Finding OpenCL API version" msgstr "Encontrando a versão da API do OpenCL" #: core.cpp:1092 #, c-format msgid "There is no platform with OpenCL support (%s)" msgstr "Não há plataforma com suporte ao OpenCL (%s)" #: core.cpp:1102 #, c-format msgid "failed to get all OpenCL platforms (%s)" msgstr "houve uma falha ao obter todas as plataformas OpenCL (%s)" #: core.cpp:1115 #, c-format msgid "failed to get name for platform %u (%s)" msgstr "houve uma falha ao obter o nome da plataforma %u (%s)" #: core.cpp:1123 #, c-format msgid "failed to get version for platform %u (%s)" msgstr "houve uma falha ao obter a versão para a plataforma %u (%s)" #: core.cpp:1131 #, c-format msgid "failed to find number of OpenCL devices for platform '%s %s' (%s)" msgstr "" "houve uma falha ao encontrar a quantidade dos dispositivos OpenCL para a " "plataforma '%s %s' (%s)" #: core.cpp:1131 msgid "0 device" msgstr "0 dispositivos" #: core.cpp:1140 #, c-format msgid "failed to get all of OpenCL devices for platform '%s %s' (%s)" msgstr "" "houve uma falha ao obter todos os dispositivos OpenCL para a plataforma '%s " "%s' (%s)" #: core.cpp:1160 #, c-format msgid "failed to get name for device %u (%s)" msgstr "houve uma falha ao obter o nome do dispositivo %u (%s)" #: core.cpp:1168 #, c-format msgid "failed to get version for device %u (%s)" msgstr "houve uma falha ao obter a versão para o dispositivo %u (%s)" #: core.cpp:1190 #, c-format msgid "OpenCL driver for '%s %s' does not support CL_DEVICE_TOPOLOGY_AMD (%s)" msgstr "" "O driver OpenCL para '%s %s' não é compatível com CL_DEVICE_TOPOLOGY_AMD (%s)" #: core.cpp:1201 #, c-format msgid "" "OpenCL driver for '%s %s' does not support CL_DEVICE_GFXIP_MAJOR_AMD (%s)" msgstr "" "O driver OpenCL para '%s %s' não é compatível com CL_DEVICE_GFXIP_MAJOR_AMD " "(%s)" #: core.cpp:1209 core.cpp:1229 core.cpp:1262 #, c-format msgid "" "OpenCL driver for '%s %s' does not support CL_DEVICE_MAX_COMPUTE_UNITS (%s)" msgstr "" "O driver OpenCL para '%s %s' não é compatível com " "CL_DEVICE_MAX_COMPUTE_UNITS (%s)" #: core.cpp:1250 #, c-format msgid "" "OpenCL driver for '%s %s' does not support CL_DEVICE_PCI_DOMAIN_ID_NV (%s), " "CL_DEVICE_PCI_BUS_ID_NV (%s) or CL_DEVICE_PCI_SLOT_ID_NV (%s)" msgstr "" "O driver OpenCL para '%s %s' não é compatível com CL_DEVICE_PCI_DOMAIN_ID_NV " "(%s), CL_DEVICE_PCI_BUS_ID_NV (%s) ou CL_DEVICE_PCI_SLOT_ID_NV (%s)" #: core.cpp:1273 #, c-format msgid "OpenCL is not supported with your GPU vendor (0x%X)" msgstr "O OpenCL não é compatível com o modelo da sua GPU (0x %X)" #: core.cpp:1295 msgid "Finding devices" msgstr "A procurar dispositivos" #: core.cpp:1307 #, c-format msgid "Skip devices search (wrong permissions on %s device)" msgstr "" "A ignorar pesquisa de dispositivos (permissões erradas no dispositivo %s)" #: core.cpp:1350 #, c-format msgid "Your GPU vendor is unknown: %s (0x%X)" msgstr "O fabricante da GPU é desconhecido: %s (0x%X)" #: core.cpp:1370 msgid "failed to find chipset vendor and model" msgstr "não foi possível encontrar o fabricante e o modelo do chipset" #: core.cpp:1385 msgid "failed to find graphic card vendor and model" msgstr "não foi possível encontrar o fabricante e o modelo da placa gráfica" #: core.cpp:1487 msgid "Retrieving GPU clocks" msgstr "A obter as velocidades da GPU" #: core.cpp:1500 msgid "None" msgstr "Nenhum" #: core.cpp:1509 #, c-format msgid "DRM path for %s is unknown" msgstr "O caminho DRM para %s é desconhecido" #: core.cpp:1516 #, c-format msgid "Card number for %s is unknown" msgstr "O número da placa para %s é desconhecido" #: core.cpp:1541 #, c-format msgid "PCIe %s (current) / %s (max)" msgstr "" #: core.cpp:1650 #, c-format msgid "Driver for %s doesn't report frequencies" msgstr "O driver para %s não reporta frequências" #: core.cpp:1671 #, fuzzy, c-format #| msgid "failed to get all OpenCL platforms (%s)" msgid "failed to retrieve all monitoring data for %s" msgstr "houve uma falha ao obter todas as plataformas OpenCL (%s)" #: core.cpp:1694 msgid "Identifying running system" msgstr "A identificar o sistema operativo em execução" #: core.cpp:1697 msgid "failed to identify running system" msgstr "não foi possível identificar o sistema operativo em execução" #: core.cpp:1749 core.cpp:1778 msgid "Calling libprocps" msgstr "A chamar libprocps" #: core.cpp:1752 msgid "unable to get system uptime" msgstr "não foi possível obter o tempo de atividade do sistema" #: core.cpp:1758 msgid "unable to create meminfo structure" msgstr "não foi possível criar a estrutura meminfo" #: core.cpp:1804 msgid "Calling libstatgrab" msgstr "A chamar libstatgrab" #: core.cpp:1852 #, c-format msgid "%i days, %i hours, %i minutes, %i seconds" msgstr "%i dias, %i horas, %i minutos, %i segundos" #: core.cpp:1915 msgid "Updating benchmark status" msgstr "A atualizar o estado da performance" #: core.cpp:1918 msgid "Active" msgstr "Ativo" #: core.cpp:1921 #, c-format msgid "(%u hours left)" msgstr "(%u horas restantes)" #: core.cpp:1923 #, c-format msgid "(%u minutes left)" msgstr "(%u minutos restantes)" #: core.cpp:1925 #, c-format msgid "(%u seconds left)" msgstr "(%u segundos restantes)" #: core.cpp:1929 core.cpp:1984 core.cpp:1985 msgid "Inactive" msgstr "Inativo" #: core.cpp:1932 #, c-format msgid "in %u hours" msgstr "em %u horas" #: core.cpp:1934 #, c-format msgid "in %u minutes" msgstr "em %u minutos" #: core.cpp:1936 #, c-format msgid "in %u seconds" msgstr "em %u segundos" #: core.cpp:1953 #, fuzzy, c-format #| msgid "Starting benchmark" msgid "Starting benchmark with %u threads" msgstr "A iniciar o teste de performance" #: core.cpp:1976 msgid "an error occurred while starting benchmark" msgstr "ocorreu um erro enquanto iniciava o teste de performance" #: core.cpp:2002 msgid "Finding CPU package in fallback mode" msgstr "Encontrando o pacote da CPU em modo fallback" #: core.cpp:2032 #, c-format msgid "Your CPU socket is not present in the database ==> %s, codename: %s" msgstr "" "O soquete da sua CPU não consta na base de dados ==> %s, nome de código: %s" #: core.cpp:2052 msgid "Calculating CPU multipliers in fallback mode" msgstr "Calculando multiplicadores da CPU em modo fallback" #: core.cpp:2072 msgid "Retrieving motherboard information in fallback mode" msgstr "Recuperando informações da placa-mãe em modo fallback" #: core.cpp:2085 msgid "failed to retrieve motherboard information (fallback mode)" msgstr "falhou ao recuperar informações da placa-mãe (modo fallback)" #: core.cpp:2127 msgid "Retrieving CPU temperature in fallback mode" msgstr "Recuperando a temperatura da CPU em modo fallback" #: core.cpp:2173 msgid "failed to retrieve CPU temperature (fallback mode)" msgstr "falhou ao recuperar a temperatura da CPU (modo fallback)" #: core.cpp:2188 msgid "Retrieving CPU voltage in fallback mode" msgstr "Recuperando a voltagem da CPU em modo fallback" #: core.cpp:2200 msgid "failed to retrieve CPU voltage (fallback mode)" msgstr "falhou ao recuperar a voltagem da CPU (modo fallback)" #: core.cpp:2214 msgid "Retrieving CPU frequency in fallback mode" msgstr "Recuperando a frequência da CPU em modo fallback" #: core.cpp:2220 msgid "failed to retrieve CPU frequency (fallback mode)" msgstr "falhou ao recuperar a frequência da CPU (modo fallback)" #: daemon_client.cpp:65 #, fuzzy #| msgid "Ask password to start daemon in background" msgid "Starting daemon in background…" msgstr "Pedir palavra-passe para iniciar o daemon em segundo plano" #: daemon_client.cpp:172 msgid "pkexec: authorization could not be obtained (dialog dismissed)" msgstr "" "pkexec: não foi possível obter a autorização (caixa de diálogo ignorada)" #: daemon_client.cpp:175 msgid "pkexec: authorization could not be obtained (not authorized)" msgstr "pkexec: não foi possível obter a autorização (não autorizado)" #: daemon_client.cpp:178 msgid "pkexec: command not found" msgstr "pkexec: comando não encontrado" #: daemon_client.cpp:181 msgid "pkexec: unexpected error code" msgstr "pkexec: código de erro inesperado" #: daemon_client.cpp:211 #, fuzzy #| msgid "Connected to daemon" msgid "Connecting to daemon…" msgstr "A conectar ao daemon" #: daemon_server.cpp:261 #, c-format msgid "request_handler: case %i not handled" msgstr "request_handler: caso %i não tratado" #: data.cpp:124 cpu-x-gtk-3.12.ui:1370 msgid "CPU" msgstr "CPU" #: data.cpp:187 msgid "P-core" msgstr "P-core" #: data.cpp:188 msgid "E-core" msgstr "E-core" #: data.cpp:189 data.cpp:192 msgid "Core" msgstr "Núcleo" #: data.cpp:208 cpu-x-gtk-3.12.ui:746 msgid "Processor" msgstr "Processador" #: data.cpp:240 data.cpp:329 cpu-x-gtk-3.12.ui:1968 msgid "Caches" msgstr "Caches" #: data.cpp:247 #, fuzzy, c-format #| msgid "%d x %d %s, %d-way" msgid "%2d x %4d %s, %2d-way" msgstr "%d x %d %s, %d-via" #: data.cpp:249 #, c-format msgid "%d %s, %d-way" msgstr "%d %s, %d-via" #: data.cpp:263 msgid "Count" msgstr "" #: data.cpp:276 cpu-x-gtk-3.12.ui:968 msgid "Clocks" msgstr "Frequências" #: data.cpp:379 data.cpp:383 #, fuzzy, c-format #| msgid "L%i Cache" msgid "L%u Cache" msgstr "Cache L%i" #: data.cpp:385 #, c-format msgid "%s associative, %d-%s line size" msgstr "%s associativa, %d-%s tamanho da linha" #: data.cpp:398 msgid "Test" msgstr "Testar" #: data.cpp:409 data.cpp:423 cpu-x-gtk-3.12.ui:2146 cpu-x-gtk-3.12.ui:2517 msgid "Motherboard" msgstr "Placa-mãe" #: data.cpp:437 cpu-x-gtk-3.12.ui:2367 msgid "BIOS" msgstr "BIOS" #: data.cpp:452 cpu-x-gtk-3.12.ui:2498 msgid "Chipset" msgstr "Chipset" #: data.cpp:467 data.cpp:569 cpu-x-gtk-3.12.ui:3156 cpu-x-gtk-3.12.ui:3761 msgid "Memory" msgstr "Memória" #: data.cpp:483 #, c-format msgid "Stick %u" msgstr "" #: data.cpp:487 cpu-x-gtk-3.12.ui:3134 msgid "Sticks" msgstr "" #: data.cpp:541 cpu-x-gtk-3.12.ui:3780 msgid "System" msgstr "Sistema" #: data.cpp:554 cpu-x-gtk-3.12.ui:3380 msgid "Operating System" msgstr "Sistema operativo" #: data.cpp:587 cpu-x-gtk-3.12.ui:4960 msgid "Graphics" msgstr "Gráficos" #: data.cpp:621 #, fuzzy, c-format #| msgid "Card %i" msgid "Card %u" msgstr "Placa %i" #: data.cpp:625 cpu-x-gtk-3.12.ui:4938 msgid "Cards" msgstr "Placas" #: data.cpp:672 cpu-x-gtk-3.12.ui:5300 msgid "Bench" msgstr "Bench" #: data.cpp:685 msgid "Not started" msgstr "Não iniciado" #: data.cpp:688 cpu-x-gtk-3.12.ui:5070 msgid "Prime numbers (slow)" msgstr "Números primos (lento)" #: data.cpp:692 cpu-x-gtk-3.12.ui:5178 msgid "Prime numbers (fast)" msgstr "Números primos (rápido)" #: data.cpp:696 cpu-x-gtk-3.12.ui:5281 msgid "Parameters" msgstr "Parâmetros" #: data.cpp:721 data.cpp:727 #, c-format msgid "%u mins" msgstr "%u min" #: data.cpp:734 cpu-x-gtk-3.12.ui:5444 cpu-x-gtk-3.12.ui:5552 msgid "About" msgstr "Sobre" #: data.cpp:739 #, c-format msgid "" "%s is a Free software that gathers information\n" "on CPU, motherboard and more." msgstr "" "%s é um programa de código livre que recolhe\n" "informações sobre o processador, a placa-mãe e mais." #: data.cpp:744 #, fuzzy #| msgid "About" msgid "About CPU-X" msgstr "Sobre" #: data.cpp:745 #, c-format msgid "Version %s" msgstr "Versão %s" #: data.cpp:746 #, c-format msgid "Author: %s" msgstr "Autor: %s" #: data.cpp:747 #, c-format msgid "Site: %s" msgstr "Site: %s" #: data.cpp:751 cpu-x-gtk-3.12.ui:5533 msgid "License" msgstr "Licença" #: data.cpp:753 #, c-format msgid "This software is distributed under the terms of %s" msgstr "Este programa é distribuído nos termos da licença %s" #: data.cpp:754 main.cpp:176 msgid "This program comes with ABSOLUTELY NO WARRANTY" msgstr "Este programa é fornecido ABSOLUTAMENTE SEM NENHUMA GARANTIA" #: gui_gtk.cpp:61 #, c-format msgid "Cannot find path for '%s' file" msgstr "" #: gui_gtk.cpp:400 msgid "Start daemon" msgstr "Iniciar daemon" #: gui_gtk.cpp:403 msgid "Connected to daemon" msgstr "A conectar ao daemon" #: gui_gtk.cpp:406 msgid "No polkit authentication agent found" msgstr "Nenhum agente de autenticação polkit foi encontrado" #: gui_gtk.cpp:411 msgid "Ask password to start daemon in background" msgstr "Pedir palavra-passe para iniciar o daemon em segundo plano" #: gui_gtk.cpp:415 msgid "Settings" msgstr "" #: gui_gtk.cpp:634 msgid "BaseFamily" msgstr "FamíliaBase" #: gui_gtk.cpp:635 msgid "CPU display (\"true\") family (computed as BaseFamily+ExtendedFamily)" msgstr "" "Mostrar a família da CPU (\"true\") (calculada como " "FamíliaBase+FamíliaExtendida)" #: gui_gtk.cpp:636 msgid "BaseModel" msgstr "ModeloBase" #: gui_gtk.cpp:637 msgid "CPU display (\"true\") model (computed as (ExtendedModel<<4)+BaseModel)" msgstr "" "Mostrar o modelo da CPU (\"true\") (calculada como " "(ModeloExtendido<<4)+ModeloBase)" #: gui_gtk.cpp:847 msgid "" "Identify the physically-labeled socket or board position where the memory " "device is located" msgstr "" #: gui_gtk.cpp:848 msgid "Identify the physically labeled bank where the memory device is located" msgstr "" #: gui_gtk.cpp:1052 msgid "User Mode Driver Version" msgstr "User Mode Driver Version" #: gui_gtk.cpp:1066 msgid "Vulkan Ray Tracing" msgstr "Vulkan Ray Tracing" #: gui_gtk.cpp:1260 msgid "Starting GTK GUI…" msgstr "A iniciar a interface gráfica GTK…" #: gui_gtk.cpp:1272 msgid "failed to import UI in GtkBuilder" msgstr "Falha ao importar a interface do utilizador no GtkBuilder" #: main.cpp:63 msgid "Start graphical user interface (GUI) (default)" msgstr "Iniciar a interface de utilizador em modo gráfico (GUI) (padrão)" #: main.cpp:64 msgid "Start text-based user interface (TUI)" msgstr "Iniciar a interface de utilizador em modo de texto (TUI)" #: main.cpp:65 msgid "Dump all data on standard output and exit" msgstr "Despejar todos os dados na saída padrão e sair" #: main.cpp:66 msgid "Run embedded command dmidecode and exit" msgstr "Executa o comando dmidecode embutido e sai" #: main.cpp:67 msgid "Run embedded command bandwidth and exit" msgstr "Executa o comando bandwidth embutido e sai" #: main.cpp:68 msgid "Set temperature unit (c[elsius]|f[ahrenheit]|k[elvin]|r[ankine])" msgstr "" #: main.cpp:69 msgid "Set custom time between two refreshes (in seconds)" msgstr "" "Definir um intervalo personalizado entre duas atualizações (em segundos)" #: main.cpp:70 msgid "Set default tab (integer)" msgstr "Define a aba padrão (inteiro)" #: main.cpp:71 msgid "Select core type to monitor (integer)" msgstr "Selecione o tipo de núcleo a vigiar (inteiro)" #: main.cpp:72 msgid "Select CPU core to monitor (integer)" msgstr "Selecione um núcleo de CPU a vigiar (inteiro)" #: main.cpp:73 msgid "Set custom bandwidth test for CPU caches speed (integer)" msgstr "" "Definir um teste de performance personalizado para a velocidade de cache da " "CPU (inteiro)" #: main.cpp:74 #, fuzzy #| msgid "Select default graphic card (integer)" msgid "Select default memory stick (integer)" msgstr "Defina a placa gráfica padrão (valor inteiro)" #: main.cpp:75 msgid "Select default graphic card (integer)" msgstr "Defina a placa gráfica padrão (valor inteiro)" #: main.cpp:76 cpu-x-gtk-3.12.ui:5910 msgid "Start and connect to daemon" msgstr "Iniciar e conectar ao daemon" #: main.cpp:77 msgid "Verbose output" msgstr "Saída verbosa" #: main.cpp:78 msgid "Print help and exit" msgstr "Imprime a ajuda e sai" #: main.cpp:79 msgid "Print version and exit" msgstr "Imprime a versão e sai" #: main.cpp:80 msgid "Print CPUID values in decimal (default is hexadeximal)" msgstr "Imprima os valores do CPUID em decimal (o padrão é hexadeximal)" #: main.cpp:81 msgid "Disable colored output" msgstr "Desativar saída a cores" #: main.cpp:82 msgid "Print information for debugging" msgstr "Imprimir as informações para a depuração" #: main.cpp:83 msgid "Print required information to paste in an issue" msgstr "Imprimir informações necessárias para colar em uma questão" #: main.cpp:84 msgid "Set key mapping for NCurses mode (a[rrows]|e[macs]|i[nverted-T]|v[im])" msgstr "" "Definir o mapeamento das chaves para o modo NCurses (a[rrows]|e[macs]|" "i[nverted-T]|v[im])" #: main.cpp:95 msgid "Add default command line arguments" msgstr "Adicione as opções padrão na linha de comando" #: main.cpp:96 msgid "Enforce the bus clock" msgstr "Forçar a velocidade do bus" #: main.cpp:97 msgid "" "Ignore CPU values reported by libcpuid (comma-separated values among 'temp', " "'volt' and 'freq')" msgstr "" #: main.cpp:98 msgid "Read CPUID raw data from a given file" msgstr "Ler dados crus do CPUID de um determinado ficheiro" #: main.cpp:99 msgid "Only print a message if CPU is not present in the database" msgstr "Mostrar apenas uma mensagem caso a CPU não exista na base de dados" #: main.cpp:126 #, c-format msgid "Usage: %s DISPLAY [OPTIONS]\n" msgstr "Utilização: %s ECRÃ [OPÇÕES]\n" #: main.cpp:127 msgid "Available DISPLAY:" msgstr "ECRÃ disponível:" #: main.cpp:135 msgid "Available OPTIONS:" msgstr "OPÇÕES disponíveis:" #: main.cpp:144 msgid "Influenceable environment variables:" msgstr "Variáveis de ambiente influenciáveis:" #: main.cpp:175 msgid "This is free software: you are free to change and redistribute it." msgstr "" "Isto é um programa livre: tem a liberdade de o alterar e redistribuí-lo." #: main.cpp:177 #, c-format msgid "See the %s license: <%s>\n" msgstr "Veja a licença %s em: <%s>\n" #: main.cpp:184 #, c-format msgid "-- %-9s version: %s" msgstr "-- %-9s versão: %s" #: main.cpp:381 #, c-format msgid "" "\n" "Oops, something was wrong! %s has received signal %d (%s) and has crashed." msgstr "" "\n" "Oops, alguma coisa está errada! %s recebeu o sinal %d (%s) e saiu." #: main.cpp:383 #, c-format msgid "" "\n" "Oops, something was wrong! %s has received signal %d (%s) and is trying to " "recover." msgstr "" "\n" "Oops, alguma coisa está errada! %s recebeu o sinal %d (%s) e está a tentar " "recuperar." #: main.cpp:407 msgid "You can open a new issue here, by filling the template as requested:" msgstr "" "Pode reportar o problema aqui, preenchendo o modelo conforme solicitado:" #: main.cpp:449 msgid "an error occurred while setting locale" msgstr "ocorreu um erro ao definir as configurações locsis" #: options.cpp:124 #, c-format msgid "" "Selected CPU type (%u) is not a valid number (%u is the maximum for this CPU)" msgstr "" "O tipo da CPU selecionada (%u) não é um número válido (%u é o máximo para " "esta CPU)" #: options.cpp:145 #, fuzzy, c-format #| msgid "" #| "Selected CPU type (%u) is not a valid number (%u is the maximum for this " #| "CPU)" msgid "" "Selected bandwidth test (%u) is not a valid number (%u is the maximum for " "this system)" msgstr "" "O tipo da CPU selecionada (%u) não é um número válido (%u é o máximo para " "esta CPU)" #: options.cpp:168 #, fuzzy, c-format #| msgid "" #| "Selected CPU type (%u) is not a valid number (%u is the maximum for this " #| "CPU)" msgid "" "Selected RAM stick (%u) is not a valid number (%u is the maximum for this " "system)" msgstr "" "O tipo da CPU selecionada (%u) não é um número válido (%u é o máximo para " "esta CPU)" #: options.cpp:188 #, fuzzy, c-format #| msgid "" #| "Selected CPU core (%u) is not a valid number (%u is the maximum for this " #| "type of core)" msgid "" "Selected graphic card (%u) is not a valid number (%u is the maximum for this " "system)" msgstr "" "O núcleo da CPU selecionada (%u) não é um número válido (%u é o máximo para " "este tipo de núcleo)" #: options.cpp:204 #, c-format msgid "failed to change CPU affinitiy to core %u" msgstr "houve uma falha ao alterar a afinidade da CPU para o núcleo %u" #: options.cpp:210 #, c-format msgid "" "Selected CPU core (%u) is not a valid number (%u is the maximum for this " "type of core)" msgstr "" "O núcleo da CPU selecionada (%u) não é um número válido (%u é o máximo para " "este tipo de núcleo)" #: options.cpp:284 #, fuzzy, c-format #| msgid "" #| "Selected CPU type (%u) is not a valid number (%u is the maximum for this " #| "CPU)" msgid "Selected tab (%u) is not a valid number (%u is the maximum)" msgstr "" "O tipo da CPU selecionada (%u) não é um número válido (%u é o máximo para " "esta CPU)" #: tui_ncurses.cpp:111 msgid "Window is too small!" msgstr "A janela é muito pequena!" #: tui_ncurses.cpp:119 msgid "Press 'h' to see help." msgstr "Pressione 'h' para ver a ajuda." #: tui_ncurses.cpp:232 #, c-format msgid "Welcome in %s NCurses help!\n" msgstr "Bem-vindo(a) à ajuda do %s Ncurses!\n" #: tui_ncurses.cpp:233 msgid "This help describes how to use this Text-based User Interface." msgstr "" "Essa ajuda descreve como usar a interface do utilizador com base em texto." #: tui_ncurses.cpp:235 msgid "Global keys:" msgstr "Chaves globais:" #: tui_ncurses.cpp:236 msgid "Press 'left' key or 'tab' key to switch in left tab." msgstr "" "Pressione a tecla 'esquerda' ou a tecla 'tab' para alternar na aba da " "esquerda." #: tui_ncurses.cpp:237 msgid "Press 'right' key or 'shift + tab' keys to switch in right tab." msgstr "" "Pressione a tecla 'direita' ou as teclas 'shift + tab' para alternar para a " "aba direita." #: tui_ncurses.cpp:238 msgid "Press 'h' key to see this help." msgstr "Pressione a tecla 'h' para ver esta ajuda." #: tui_ncurses.cpp:239 msgid "Press 'q' key to exit." msgstr "Pressione a tecla 'q' para encerrar." #: tui_ncurses.cpp:241 msgid "CPU tab:" msgstr "Aba da CPU:" #: tui_ncurses.cpp:242 msgid "Press 'next page' key to decrease core type number to monitor." msgstr "" "Pressione a tecla 'próxima página' para diminuir o número do tipo do núcleo " "que será vigiado." #: tui_ncurses.cpp:243 msgid "Press 'previous page' key to increase core type number to monitor." msgstr "" "Pressione a tecla 'próxima página' para aumentar o número do tipo do núcleo " "que será vigiado." #: tui_ncurses.cpp:244 msgid "Press 'down' key to decrease CPU core number to monitor." msgstr "" "Pressione a tecla 'abaixo' para reduzir a quantidade dos núcleos da CPU que " "serão vigiados." #: tui_ncurses.cpp:245 msgid "Press 'up' key to increase CPU core number to monitor." msgstr "" "Pressione a tecla 'acima' para aumentar a quantidade dos núcleos da CPU que " "serão vigiados." #: tui_ncurses.cpp:247 msgid "Caches tab:" msgstr "Aba caches:" #: tui_ncurses.cpp:248 msgid "Press 'down' key to switch to previous test." msgstr "Pressione a tecla 'abaixo' para alternar para o teste anterior." #: tui_ncurses.cpp:249 msgid "Press 'up' key to switch to next test." msgstr "Pressione a tecla 'acima' para alternar para o próximo teste." #: tui_ncurses.cpp:251 msgid "Bench tab:" msgstr "Aba performance:" #: tui_ncurses.cpp:252 msgid "Press 'down' key to decrement benchmark duration." msgstr "" "Pressione a tecla 'abaixo' para reduzir a duração do teste de performance." #: tui_ncurses.cpp:253 msgid "Press 'up' key to increment benchmark duration." msgstr "" "Pressione a tecla 'acima' para aumentar a duração do teste d eperformance." #: tui_ncurses.cpp:254 msgid "Press 'next page' key to decrement number of threads to use." msgstr "" "Pressione a tecla 'próxima página' para reduzir a quantidade de threads." #: tui_ncurses.cpp:255 msgid "Press 'previous page' key to increment number of threads to use." msgstr "" "Pressione a tecla 'página anterior' para aumentar a quantidade das threads." #: tui_ncurses.cpp:256 msgid "Press 's' key to start/stop prime numbers (slow) benchmark." msgstr "" "Pressione a tecla 's' para iniciar/parar o teste de performance dos números " "primos (lento)." #: tui_ncurses.cpp:257 msgid "Press 'f' key to start/stop prime numbers (fast) benchmark." msgstr "" "Pressione a tecla 'f' para iniciar/parar o teste de performance dos números " "primos (rápido)." #: tui_ncurses.cpp:259 msgid "Graphics tab:" msgstr "Aba gráficos:" #: tui_ncurses.cpp:260 msgid "Press 'down' key to switch to previous graphic card." msgstr "" "Pressione a tecla 'abaixo' para alternar para a placa gráfica anterior." #: tui_ncurses.cpp:261 msgid "Press 'up' key to switch to next graphic card." msgstr "Pressione a tecla 'acima' para alternar para a próxima placa gráfica." #: tui_ncurses.cpp:263 msgid "Press any key to exit this help." msgstr "Pressione qualquer tecla para encerrar esta ajuda." #: tui_ncurses.cpp:640 msgid "Starting NCurses TUI…" msgstr "A iniciar a interface de texto NCurses…" #: tui_ncurses.cpp:649 msgid "" "FATAL ERROR: terminfo database could not be found (try to set TERMINFO " "environment variable)" msgstr "" "ERRO FATAL: não foi possível encontrar a base de dados terminfo (tente " "definir a variável de ambiente TERMINFO)" #: tui_ncurses.cpp:654 #, c-format msgid "Failed to set up %s terminal (err=%i); falling back to %s" msgstr "Falha ao configurar o terminal %s (err=%i); voltando para %s" #: util.cpp:189 #, c-format msgid "cannot find unit in '%s' string at position %i" msgstr "não é possível encontrar a unidade na cadeia '%s' na posição %i" #: util.cpp:252 #, fuzzy, c-format #| msgid "an error occurred while opening file '%s' (%s)" msgid "an error occurred while opening file '%s'" msgstr "um erro ocorreu enquanto abria o ficheiro '%s' (%s)" #: util.cpp:297 #, fuzzy, c-format #| msgid "an error occurred while running command '%s' (%s)" msgid "an error occurred while running command '%s'" msgstr "um erro ocorreu enquanto rodava o comando '%s' (%s)" #: util.cpp:437 msgid "set_cpu_affinity() not supported on this operating system" msgstr "set_cpu_affinity() não é compatível neste sistema operativo" #: data.hpp:103 data.hpp:244 data.hpp:332 msgid "Vendor" msgstr "Fabricante" #: data.hpp:104 msgid "Code Name" msgstr "Nome de código" #: data.hpp:105 msgid "Package" msgstr "Pacote" #: data.hpp:106 msgid "Technology" msgstr "Tecnologia" #: data.hpp:107 data.hpp:268 msgid "Voltage" msgstr "Voltagem" #: data.hpp:108 msgid "Specification" msgstr "Especificação" #: data.hpp:109 msgid "Family" msgstr "Família" #: data.hpp:110 msgid "Disp. Family" msgstr "Most. Família" #: data.hpp:111 data.hpp:224 data.hpp:245 data.hpp:335 msgid "Model" msgstr "Modelo" #: data.hpp:112 msgid "Disp. Model" msgstr "Most. Modelo" #: data.hpp:113 msgid "Temp." msgstr "Temp." #: data.hpp:114 msgid "Stepping" msgstr "Revisão" #: data.hpp:115 msgid "Instructions" msgstr "Instruções" #: data.hpp:125 msgid "L1 Data" msgstr "L1 Data" #: data.hpp:126 msgid "L1 Inst." msgstr "L1 Instruções" #: data.hpp:127 msgid "Level 2" msgstr "Nível 2" #: data.hpp:128 msgid "Level 3" msgstr "Nível 3" #: data.hpp:137 cpu-x-gtk-3.12.ui:1232 msgid "Cores" msgstr "Núcleos" #: data.hpp:138 data.hpp:408 cpu-x-gtk-3.12.ui:1252 msgid "Threads" msgstr "Threads" #: data.hpp:155 msgid "Core Speed" msgstr "Velocidade do núcleo" #: data.hpp:156 msgid "Multiplier" msgstr "Multiplicador" #: data.hpp:157 msgid "Bus Speed" msgstr "Velocidade do bus" #: data.hpp:158 data.hpp:341 msgid "Usage" msgstr "Utilização" #: data.hpp:188 data.hpp:265 msgid "Size" msgstr "Tamanho" #: data.hpp:189 data.hpp:267 msgid "Speed" msgstr "Velocidade" #: data.hpp:223 data.hpp:259 msgid "Manufacturer" msgstr "Fabricante" #: data.hpp:225 msgid "Revision" msgstr "Revisão" #: data.hpp:233 msgid "Brand" msgstr "Marca" #: data.hpp:234 msgid "Version" msgstr "Versão" #: data.hpp:235 msgid "Date" msgstr "Data" #: data.hpp:236 msgid "ROM Size" msgstr "Tamanho da ROM" #: data.hpp:260 msgid "Part Number" msgstr "" #: data.hpp:261 #, fuzzy #| msgid "Type #%i" msgid "Type" msgstr "Tipo #%i" #: data.hpp:262 #, fuzzy #| msgid "Type #%i" msgid "Type Detail" msgstr "Tipo #%i" #: data.hpp:263 msgid "Device Locator" msgstr "" #: data.hpp:264 msgid "Bank Locator" msgstr "" #: data.hpp:266 msgid "Rank" msgstr "" #: data.hpp:292 #, fuzzy #| msgid "Code Name" msgid "Name" msgstr "Nome de código" #: data.hpp:293 msgid "Kernel" msgstr "Kernel" #: data.hpp:294 msgid "Hostname" msgstr "Nome do host" #: data.hpp:295 msgid "Uptime" msgstr "Tempo ligado" #: data.hpp:303 msgid "Used" msgstr "Utilizado" #: data.hpp:304 msgid "Buffers" msgstr "Buffers" #: data.hpp:305 msgid "Cached" msgstr "Em cache" #: data.hpp:306 msgid "Free" msgstr "Livre" #: data.hpp:307 msgid "Swap" msgstr "Swap" #: data.hpp:333 msgid "Driver" msgstr "Driver" #: data.hpp:334 msgid "UMD Version" msgstr "Versão UMD" #: data.hpp:336 msgid "Compute Unit" msgstr "Unidade de cálculo" #: data.hpp:337 #, fuzzy #| msgid "DeviceID" msgid "Device ID" msgstr "ID do dispositivo" #: data.hpp:338 msgid "VBIOS Version" msgstr "Versão VBIOS" #. #-#-#-#-# source_ui.pot (cpu-x ) #-#-#-#-# #. Setting: "Interface" tab #: data.hpp:339 cpu-x-gtk-3.12.ui:5807 msgid "Interface" msgstr "Interface" #: data.hpp:340 msgid "Temperature" msgstr "Temperatura" #: data.hpp:342 msgid "Core Voltage" msgstr "Voltagem do núcleo" #: data.hpp:343 msgid "Power Avg" msgstr "Média da alimentação" #: data.hpp:344 #, fuzzy #| msgid "Memory clock" msgid "Core Clock" msgstr "Velocidade da memória" #: data.hpp:345 #, fuzzy #| msgid "Memory clock" msgid "Memory Clock" msgstr "Velocidade da memória" #: data.hpp:346 msgid "Memory Used" msgstr "Utilização da memória" #: data.hpp:347 msgid "Resizable BAR" msgstr "Barra redimensionável" #: data.hpp:348 msgid "Vulkan RT" msgstr "Vulkan RT" #: data.hpp:349 msgid "OpenGL Version" msgstr "Versão OpenGL" #: data.hpp:350 msgid "Vulkan Version" msgstr "Versão Vulkan" #: data.hpp:351 msgid "OpenCL Version" msgstr "Versão OpenCL" #: data.hpp:387 msgid "Score" msgstr "Pontuação" #: data.hpp:388 msgid "Run" msgstr "Executar" #: data.hpp:407 msgid "Duration" msgstr "Duração" #: util.hpp:77 msgid "bytes" msgstr "bytes" #. TRANSLATORS: initials for kilobyte (10³): please put initials (keep it short) #: util.hpp:80 msgid "kB" msgstr "kB" #. TRANSLATORS: initials for megabyte (10⁶): please put initials (keep it short) #: util.hpp:82 msgid "MB" msgstr "MB" #. TRANSLATORS: initials for gigabyte (10⁹): please put initials (keep it short) #: util.hpp:84 msgid "GB" msgstr "GB" #. TRANSLATORS: initials for terabyte (10¹²): please put initials (keep it short) #: util.hpp:86 msgid "TB" msgstr "TB" #. TRANSLATORS: initials for kibibyte (2¹⁰): please put initials (keep it short) #: util.hpp:89 msgid "KiB" msgstr "KiB" #. TRANSLATORS: initials for mebibyte (2²⁰): please put initials (keep it short) #: util.hpp:91 msgid "MiB" msgstr "MiB" #. TRANSLATORS: initials for gibibyte (2³⁰): please put initials (keep it short) #: util.hpp:93 msgid "GiB" msgstr "GiB" #. TRANSLATORS: initials for tebibyte (2⁴⁰): please put initials (keep it short) #: util.hpp:95 msgid "TiB" msgstr "TiB" #: cpu-x-gtk-3.12.ui:1184 msgid "Cache" msgstr "Cache" #. Setting: refresh time for UI #: cpu-x-gtk-3.12.ui:5721 msgid "Refresh time" msgstr "Tempo de atualização" #. Setting: GUI theme #: cpu-x-gtk-3.12.ui:5745 #, fuzzy #| msgid "Theme" msgid "Text theme" msgstr "Tema" #. Setting: automatic GUI theme #: cpu-x-gtk-3.12.ui:5760 msgid "Automatic" msgstr "Automático" #. Setting: light GUI theme #: cpu-x-gtk-3.12.ui:5761 msgid "Blue for light theme" msgstr "" #. Setting: dark GUI theme #: cpu-x-gtk-3.12.ui:5762 msgid "Yellow for dark theme" msgstr "" #. Setting: temperature unit #: cpu-x-gtk-3.12.ui:5775 #, fuzzy #| msgid "Temperature" msgid "Temperature unit" msgstr "Temperatura" #. Setting: default tab at startup #: cpu-x-gtk-3.12.ui:5826 msgid "Default tab" msgstr "Aba padrão" #. Setting: default CPU core at startup #: cpu-x-gtk-3.12.ui:5839 msgid "Default CPU core" msgstr "Núcleo padrão da CPU" #. Setting: default cache test at startup #: cpu-x-gtk-3.12.ui:5852 msgid "Default cache test" msgstr "Teste de cache padrão" #. Setting: print CPUID values in decimal or hexadecimal #: cpu-x-gtk-3.12.ui:5895 msgid "Print CPUID values in decimal" msgstr "Imprimir os valores do CPUID em decimal" #. Setting: default graphic card at startup #: cpu-x-gtk-3.12.ui:5928 msgid "Default graphic card" msgstr "Placa gráfica padrão" #. Setting: default CPU core at startup #: cpu-x-gtk-3.12.ui:5952 msgid "Default core type" msgstr "Tipo de núcleo padrão" #. Setting: default graphic card at startup #: cpu-x-gtk-3.12.ui:5976 #, fuzzy #| msgid "Default core type" msgid "Default memory stick" msgstr "Tipo de núcleo padrão" #. Setting: "Startup" tab #: cpu-x-gtk-3.12.ui:6004 msgid "Startup" msgstr "Inicialização" #~ msgid "Light" #~ msgstr "Claro" #~ msgid "Dark" #~ msgstr "Escuro" #~ msgid "Calculating CPU multipliers" #~ msgstr "A calcular multiplicadores da CPU" #, c-format #~ msgid "Current: PCIe Gen%1dx%d / Max: Gen%1dx%d" #~ msgstr "Atual: PCIe Gen%1dx%d / Max: Gen%1dx%d" #~ msgid "failed to retrieve GPU clocks" #~ msgstr "não foi possível obter as velocidades da GPU" #, c-format #~ msgid "Core #%i" #~ msgstr "Núcleo #%i" #~ msgid "Setting label names" #~ msgstr "Configurando nome dos rótulos" #, c-format #~ msgid "Bank %i" #~ msgstr "Banco %i" #~ msgid "Reference" #~ msgstr "Referência" #~ msgid "Distribution" #~ msgstr "Distribuição" #~ msgid "Compiler" #~ msgstr "Compilador" #~ msgid "GPU clock" #~ msgstr "Velocidade da GPU" #~ msgid "Dumping data…" #~ msgstr "A despejar dados (dumping)…" #~ msgid "Freeing memory" #~ msgstr "A libertar memória" #~ msgid "Ignore CPU frequency reported by libcpuid" #~ msgstr "Ignorar a frequência da CPU informada pelo libcpuid" #, c-format #~ msgid "failed to call wordexp (%i)" #~ msgstr "Houve uma falha ao invocar o wordexp (%i)" #~ msgid "Press 'home' key to scroll up in a page." #~ msgstr "Pressione a tecla 'home' para deslocar uma página para cima." #~ msgid "Press 'end' key to scroll down in a page." #~ msgstr "Pressione a tecla 'end' para deslocar uma página para baixo." #, c-format #~ msgid "String '%s' is too long, truncating…" #~ msgstr "A cadeia '%s' é muito grande, a cortar…" #, c-format #~ msgid "failed to open %s directory" #~ msgstr "falhou ao abrir o diretório %s" #~ msgid "an error occurred while compiling regex" #~ msgstr "um erro ocorreu enquanto compilava o regex" #~ msgid "FATAL ERROR: could not allocate memory" #~ msgstr "ERRO FATAL: não foi possível alocar a memória" #, fuzzy, c-format #~| msgid "failed to call vkCreateInstance (%s)" #~ msgid "failed to call vkEnumerateInstanceExtensionProperties (%s)" #~ msgstr "houve uma falha ao chamar vkCreateInstance (%s)" #~ msgid "Vulkan API is not available" #~ msgstr "A API Vulkan não está disponível" #, c-format #~ msgid "%s" #~ msgstr "%s" #, c-format #~ msgid "" #~ "CPU hybrid architecture is not supported. For more details, please refer " #~ "to following issue: %s" #~ msgstr "" #~ "A arquitetura híbrida da CPU não é suportada. Para obter mais detalhes, " #~ "consulte o seguinte problema: %s" #~ msgid "NOT SUPPORTED" #~ msgstr "NÃO SUPORTADO" #~ msgid "There is no device with Vulkan support" #~ msgstr "Não há nenhum dispositivo com suporte Vulkan" #~ msgid "Socket(s)" #~ msgstr "Socket(s)" #~ msgid "Thread(s)" #~ msgstr "Thread(s)" #~ msgid "You can paste this backtrace by opening a new issue here:" #~ msgstr "" #~ "Pode colar este backtrace criando um novo relatório de problemas em:" #, fuzzy #~| msgid "failed to call dmidecode" #~ msgid "faild to call clGetDeviceIDs" #~ msgstr "falhou a chamada de dmidecode" #~ msgid "Exiting %s" #~ msgstr "A sair do %s" #~ msgid "Skip CPU MSR opening (need to be root)" #~ msgstr "" #~ "A ignorar a abertura do MSR (registo de modelo específico) da CPU (tem de " #~ "ser root)" #~ msgid "failed to open CPU MSR (%s)" #~ msgstr "" #~ "Não foi possível abrir o MSR (registo de modelo específico) da CPU (%s)" #~ msgid "Skip call to dmidecode (need to be root)" #~ msgstr "A ignorar a chamada ao dmidecode (tem de ser root)" #~ msgid "failed to allocate memory for dmidecode" #~ msgstr "falhou a alocação de memória para o dmidecode" #~ msgid "Finding graphic card driver" #~ msgstr "A procurar o controlador da placa gráfica" #~ msgid "(%s driver)" #~ msgstr "(%s controlador)" #~ msgid "Retrieving GPU temperature" #~ msgstr "A obter a temperatura da GPU" #~ msgid "Off" #~ msgstr "Desligado" #~ msgid "failed to retrieve GPU temperature" #~ msgstr "não foi possível obter a temperatura da GPU" #~ msgid "Skip some GPU values (need to be root)" #~ msgstr "Ignorar alguns valores da GPU (tem de ser root)" #~ msgid "failed to allocate memory for benchmark" #~ msgstr "falhou ao alocar memória para o benchmark" #~ msgid "Root privileges are required to work properly" #~ msgstr "É necessário privilégios de root para funcionar corretamente" #~ msgid "Some information will not be retrievable" #~ msgstr "Algumas informações não serão recuperáveis" #~ msgid "Ignore" #~ msgstr "Ignorar" #~ msgid "Run as root" #~ msgstr "Executar como root" #~ msgid "A new version of %s is available!" #~ msgstr "Está disponível uma nova versão do %s!" #~ msgid "" #~ "Do you want to update %s to version %s after exit?\n" #~ "It will erase this binary file (%s) by the new version." #~ msgstr "" #~ "Quer atualizar o %s para a versão %s depois de sair?\n" #~ "Isso vai substituir o ficheiro binário (%s) pela nova versão." #~ msgid "Not now" #~ msgstr "Agora não" #~ msgid "Update" #~ msgstr "Atualizar" #~ msgid "Checking on Internet for a new version..." #~ msgstr "A verificar se existe uma nova versão na Internet..." #~ msgid "failed to open a Curl session" #~ msgstr "não foi possível abrir uma sessão do Curl" #~ msgid "wrong write data" #~ msgstr "dados de escrita incorretos" #~ msgid "(version %s is available)" #~ msgstr "(está disponível a versão %s)" #~ msgid "No new version available" #~ msgstr "Não há nova versão disponível" #~ msgid "(up-to-date)" #~ msgstr "(atualizado)" #~ msgid "an error occurred while extracting %s archive (%s)" #~ msgstr "ocorreu um erro ao extrair o arquivo %s (%s)" #~ msgid "" #~ "Network access is disabled by environment variable (set CPUX_NETWORK with " #~ "a positive value to enable it)" #~ msgstr "" #~ "O acesso à rede está desativado por uma variável de ambiente (defina " #~ "CPUX_NETWORK com um valor positivo para ativar)" #~ msgid "failed to open %s archive for writing" #~ msgstr "falhou ao abrir o arquivo %s para escrita" #~ msgid "Downloading new version..." #~ msgstr "A descarregar a nova versão..." #~ msgid "failed to download %s archive (%s)" #~ msgstr "não foi possível descarregar o arquivo %s (%s)" #~ msgid "Extracting new version..." #~ msgstr "A extrair a nova versão..." #~ msgid "Applying new version..." #~ msgstr "A aplicar a nova versão..." #~ msgid "an error occurred while removing/renaming files" #~ msgstr "ocorreu um erro ocorreu ao eliminar/alterar o nome dos ficheiros" #~ msgid "Update successful!" #~ msgstr "Atualização bem sucedida!" #~ msgid "Update portable version if a new version is available" #~ msgstr "Atualizar a versão portátil se uma nova versão estiver disponível" #~ msgid "Temporarily disable network support" #~ msgstr "Desabilitar temporariamente o suporte à rede" #~ msgid "Built on %s, %s (with %s %s on %s)." #~ msgstr "Compilado em %s, %s (com %s %s em %s)." #~ msgid "" #~ "Sorry, you cannot update %s: 32-bit portable version is no more supported." #~ msgstr "" #~ "Desculpe, você não pode atualizar %s: a versão portátil de 32 bits não é " #~ "mais suportada." #~ msgid "If you want to update, press 'u' key, or anything else to skip.\n" #~ msgstr "" #~ "se você quiser atualizar, pressione a tecla 'u', ou qualquer outra para " #~ "pular.\n" #~ msgid "" #~ "\n" #~ "\n" #~ "%s will be updated." #~ msgstr "" #~ "\n" #~ "\n" #~ "%s vai ser atualizado." CPU-X-5.0.3/po/pt_BR.po000066400000000000000000001270741454622605200143600ustar00rootroot00000000000000# Copyright © 2014-2024 The Tumultuous Unicorn Of Darkness # This file is distributed under the same license as the CPU-X package. # Translators: # Lara Maia , 2015-2016,2018 # Rui Mendes , 2019. # Seila Oxe , 2019. # DanielDevBR , 2020. # Celio Alves , 2020, 2021. # Samuel Carvalho de Araújo , 2020. # André Marcelo Alvarenga , 2020. # LL Magical , 2020. # Wellington Terumi Uemura , 2021, 2022, 2023. msgid "" msgstr "" "Project-Id-Version: CPU-X\n" "Report-Msgid-Bugs-To: https://github.com/TheTumultuousUnicornOfDarkness/CPU-" "X/issues\n" "POT-Creation-Date: 2023-12-09 13:09+0100\n" "PO-Revision-Date: 2023-12-11 17:05+0000\n" "Last-Translator: Wellington Terumi Uemura \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.3-dev\n" #: core.cpp:135 msgid "Finding CPU technology" msgstr "Identificando a tecnologia da CPU" #: core.cpp:161 #, c-format msgid "" "Your CPU is not present in the database ==> %s, model: %i, ext. model: %i, " "ext. family: %i" msgstr "" "A sua CPU não consta do banco de dados ==> %s, modelo: %i, ext. modelo: %i, " "ext. família: %i" #: core.cpp:189 data.cpp:150 data.cpp:342 msgid "unknown" msgstr "desconhecido" #: core.cpp:230 msgid "Calling libcpuid for retrieving static data" msgstr "Invocando o libcpuid para recuperar os dados estáticos" #: core.cpp:245 #, c-format msgid "failed to call libcpuid (%s)" msgstr "Houve uma falha ao invocar o libcpuid (%s)" #: core.cpp:340 msgid "Calling libcpuid for retrieving dynamic data" msgstr "Invocando o libcpuid para recuperar os dados dinâmicos" #: core.cpp:353 msgid "Calling libcpuid for retrieving CPU MSR static values" msgstr "Invocando o libcpuid para recuperar os valores estáticos da CPU MSR" #: core.cpp:380 msgid "Calling libcpuid for retrieving CPU MSR dynamic values" msgstr "Invocando o libcpuid para recuperar os valores dinâmicos da CPU MSR" #: core.cpp:412 msgid "Calling dmidecode" msgstr "Invocando o dmidecode" #: core.cpp:454 core.cpp:473 #, c-format msgid "%s (configured)" msgstr "%s (configurado)" #: core.cpp:461 core.cpp:480 #, c-format msgid "%s (max)" msgstr "%s (max)" #: core.cpp:466 #, c-format msgid "%s (min)" msgstr "%s (min)" #: core.cpp:496 msgid "Calculating CPU usage" msgstr "Calculando a utilização da CPU" #: core.cpp:546 msgid "Calling bandwidth" msgstr "Invocando a largura de banda" #: core.cpp:613 #, c-format msgid "" "pci_access is not properly initialized: it is a common issue when %s was " "built with a lower libpci version.\n" "Check that libpci %s library is present on your system. Otherwise, please " "rebuild %s." msgstr "" "pci_access não foi devidamente iniciado: é um problema comum quando %s foi " "construído com uma versão libpci mais antiga.\n" "Verifique se a biblioteca libpci %s está presente no seu sistema. Caso " "contrário, compile %s novamente." #: core.cpp:657 #, c-format msgid "No kernel driver in use for graphic card at path %s" msgstr "" "Não há um driver do kernel sendo utilizado para a placa de vídeo no caminho " "%s" #: core.cpp:693 #, c-format msgid "Your GPU kernel driver is unknown: %s" msgstr "O driver da sua GPU é desconhecido: %s" #: core.cpp:777 #, c-format msgid "Your GPU user mode driver is unknown for vendor %s: %s" msgstr "" "O driver de modo de usuário da GPU é desconhecido para o fornecedor %s: %s" #: core.cpp:781 #, c-format msgid "failed to call GLFW (%i): %s" msgstr "Houve uma falha ao invocar o GLFW (%i): %s" #: core.cpp:914 msgid "Finding Vulkan API version" msgstr "Encontrando a versão da API do Vulkan" #: core.cpp:926 #, c-format msgid "failed to call vkCreateInstance (%s)" msgstr "houve uma falha ao chamar vkCreateInstance (%s)" #: core.cpp:929 #, c-format msgid "%s is not supported" msgstr "%s não é suportado" #: core.cpp:937 #, c-format msgid "failed to call vkEnumeratePhysicalDevices (%s)" msgstr "Houve uma falha ao chamar o vkEnumeratePhysicalDevices (%s)" #: core.cpp:944 msgid "No available Vulkan devices" msgstr "Nenhum dispositivo Vulkan está disponível" #: core.cpp:952 #, c-format msgid "No available physical devices (%s)" msgstr "Não há nenhum dispositivo físico disponível (%s)" #: core.cpp:1015 #, c-format msgid "Failed to create Vulkan for device %u (%s)" msgstr "Houve uma falha ao criar o Vulkan para o dispositivo %u (%s)" #: core.cpp:1019 #, c-format msgid "%s is not supported for device %u, use only deviceID for matching" msgstr "" "%s não é compatível com o dispositivo %u, use apenas o deviceID para " "correspondência" #: core.cpp:1051 core.cpp:1364 msgid "Enabled" msgstr "Ativado" #: core.cpp:1051 core.cpp:1364 msgid "Disabled" msgstr "Desativado" #: core.cpp:1088 msgid "Finding OpenCL API version" msgstr "Encontrando uma versão API OpenCL" #: core.cpp:1092 #, c-format msgid "There is no platform with OpenCL support (%s)" msgstr "Não há plataforma com suporte ao OpenCL (%s)" #: core.cpp:1102 #, c-format msgid "failed to get all OpenCL platforms (%s)" msgstr "houve uma falha ao obter todas as plataformas OpenCL (%s)" #: core.cpp:1115 #, c-format msgid "failed to get name for platform %u (%s)" msgstr "Houve uma falha ao obter o nome da plataforma %u (%s)" #: core.cpp:1123 #, c-format msgid "failed to get version for platform %u (%s)" msgstr "houve uma falha ao obter a versão para a plataforma %u (%s)" #: core.cpp:1131 #, c-format msgid "failed to find number of OpenCL devices for platform '%s %s' (%s)" msgstr "" "houve uma falha ao encontrar a quantidade dos dispositivos OpenCL para a " "plataforma '%s %s' (%s)" #: core.cpp:1131 msgid "0 device" msgstr "0 dispositivo" #: core.cpp:1140 #, c-format msgid "failed to get all of OpenCL devices for platform '%s %s' (%s)" msgstr "" "houve uma falha ao obter todos os dispositivos OpenCL para a plataforma '%s " "%s' (%s)" #: core.cpp:1160 #, c-format msgid "failed to get name for device %u (%s)" msgstr "houve uma falha ao obter o nome do dispositivo %u (%s)" #: core.cpp:1168 #, c-format msgid "failed to get version for device %u (%s)" msgstr "houve uma falha ao obter a versão para o dispositivo %u (%s)" #: core.cpp:1190 #, c-format msgid "OpenCL driver for '%s %s' does not support CL_DEVICE_TOPOLOGY_AMD (%s)" msgstr "" "O driver OpenCL para '%s %s' não é compatível com CL_DEVICE_TOPOLOGY_AMD (%s)" #: core.cpp:1201 #, c-format msgid "" "OpenCL driver for '%s %s' does not support CL_DEVICE_GFXIP_MAJOR_AMD (%s)" msgstr "" "O driver OpenCL para '%s %s' não é compatível com CL_DEVICE_GFXIP_MAJOR_AMD " "(%s)" #: core.cpp:1209 core.cpp:1229 core.cpp:1262 #, c-format msgid "" "OpenCL driver for '%s %s' does not support CL_DEVICE_MAX_COMPUTE_UNITS (%s)" msgstr "" "O driver OpenCL para '%s %s' não é compatível com " "CL_DEVICE_MAX_COMPUTE_UNITS (%s)" #: core.cpp:1250 #, c-format msgid "" "OpenCL driver for '%s %s' does not support CL_DEVICE_PCI_DOMAIN_ID_NV (%s), " "CL_DEVICE_PCI_BUS_ID_NV (%s) or CL_DEVICE_PCI_SLOT_ID_NV (%s)" msgstr "" "O driver OpenCL para '%s %s' não é compatível com CL_DEVICE_PCI_DOMAIN_ID_NV " "(%s), CL_DEVICE_PCI_BUS_ID_NV (%s) ou CL_DEVICE_PCI_SLOT_ID_NV (%s)" #: core.cpp:1273 #, c-format msgid "OpenCL is not supported with your GPU vendor (0x%X)" msgstr "O OpenCL não é compatível com o modelo da sua GPU (0x %X)" #: core.cpp:1295 msgid "Finding devices" msgstr "Localizando os dispositivos" #: core.cpp:1307 #, c-format msgid "Skip devices search (wrong permissions on %s device)" msgstr "Ignore a busca dos dispositivos (permissões erradas no dispositivo %s)" #: core.cpp:1350 #, c-format msgid "Your GPU vendor is unknown: %s (0x%X)" msgstr "O fabricante da sua GPU é desconhecido: %s (0x%X)" #: core.cpp:1370 msgid "failed to find chipset vendor and model" msgstr "" "houve uma falha durante a localização do fabricante e do modelo do chipset" #: core.cpp:1385 msgid "failed to find graphic card vendor and model" msgstr "" "houve uma falha durante a localização do fabricante e do modelo da placa de " "vídeo" #: core.cpp:1487 msgid "Retrieving GPU clocks" msgstr "Obtendo a frequência da GPU" #: core.cpp:1500 msgid "None" msgstr "Nenhum" #: core.cpp:1509 #, c-format msgid "DRM path for %s is unknown" msgstr "O caminho de DRM para %s é desconhecido" #: core.cpp:1516 #, c-format msgid "Card number for %s is unknown" msgstr "Número do cartão para %s é desconhecido" #: core.cpp:1541 #, c-format msgid "PCIe %s (current) / %s (max)" msgstr "PCIe %s (atual) / %s (max)" #: core.cpp:1650 #, c-format msgid "Driver for %s doesn't report frequencies" msgstr "O driver para %s não informa as frequências" #: core.cpp:1671 #, c-format msgid "failed to retrieve all monitoring data for %s" msgstr "Houve uma falha ao recuperar todos os dados de monitoramento para %s" #: core.cpp:1694 msgid "Identifying running system" msgstr "Identificando o sistema atual" #: core.cpp:1697 msgid "failed to identify running system" msgstr "houve uma falha durante a identificação do sistema atual" #: core.cpp:1749 core.cpp:1778 msgid "Calling libprocps" msgstr "Invocando o libprocps" #: core.cpp:1752 msgid "unable to get system uptime" msgstr "não foi possível obter o tempo de atividade do sistema" #: core.cpp:1758 msgid "unable to create meminfo structure" msgstr "não foi possível criar a estrutura meminfo" #: core.cpp:1804 msgid "Calling libstatgrab" msgstr "Invocando o libstatgrab" #: core.cpp:1852 #, c-format msgid "%i days, %i hours, %i minutes, %i seconds" msgstr "%i dias, %i horas, %i minutos, %i segundos" #: core.cpp:1915 msgid "Updating benchmark status" msgstr "Atualizando o status do benchmark" #: core.cpp:1918 msgid "Active" msgstr "Ativo" #: core.cpp:1921 #, c-format msgid "(%u hours left)" msgstr "(%u horas restantes)" #: core.cpp:1923 #, c-format msgid "(%u minutes left)" msgstr "(%u minutos restantes)" #: core.cpp:1925 #, c-format msgid "(%u seconds left)" msgstr "(%u segundos restantes)" #: core.cpp:1929 core.cpp:1984 core.cpp:1985 msgid "Inactive" msgstr "Inativo" #: core.cpp:1932 #, c-format msgid "in %u hours" msgstr "em %u horas" #: core.cpp:1934 #, c-format msgid "in %u minutes" msgstr "em %u minutos" #: core.cpp:1936 #, c-format msgid "in %u seconds" msgstr "em %u segundos" #: core.cpp:1953 #, c-format msgid "Starting benchmark with %u threads" msgstr "Iniciando o benchmark com %u threads" #: core.cpp:1976 msgid "an error occurred while starting benchmark" msgstr "ocorreu um erro durante a inicialização do benchmark" #: core.cpp:2002 msgid "Finding CPU package in fallback mode" msgstr "Localizando o pacote da CPU no modo fallback" #: core.cpp:2032 #, c-format msgid "Your CPU socket is not present in the database ==> %s, codename: %s" msgstr "O soquete da sua CPU não consta no banco de dados ==> %s, codinome: %s" #: core.cpp:2052 msgid "Calculating CPU multipliers in fallback mode" msgstr "Calculando os multiplicadores da CPU no modo fallback" #: core.cpp:2072 msgid "Retrieving motherboard information in fallback mode" msgstr "Recuperando as informações da placa-mãe no modo fallback" #: core.cpp:2085 msgid "failed to retrieve motherboard information (fallback mode)" msgstr "" "houve uma falha durante a recuperação das informações da placa-mãe (modo " "fallback)" #: core.cpp:2127 msgid "Retrieving CPU temperature in fallback mode" msgstr "Recuperando a temperatura da CPU em modo fallback" #: core.cpp:2173 msgid "failed to retrieve CPU temperature (fallback mode)" msgstr "" "houve uma falha durante a recuperação da temperatura da CPU (modo fallback)" #: core.cpp:2188 msgid "Retrieving CPU voltage in fallback mode" msgstr "Recuperando a tensão da CPU no modo fallback" #: core.cpp:2200 msgid "failed to retrieve CPU voltage (fallback mode)" msgstr "houve uma falha durante a recuperação da tensão da CPU (modo fallback)" #: core.cpp:2214 msgid "Retrieving CPU frequency in fallback mode" msgstr "Recuperando a frequência da CPU em modo fallback" #: core.cpp:2220 msgid "failed to retrieve CPU frequency (fallback mode)" msgstr "" "houve uma falha durante a recuperação da frequência da CPU (modo fallback)" #: daemon_client.cpp:65 msgid "Starting daemon in background…" msgstr "Iniciando o daemon em segundo plano…" #: daemon_client.cpp:172 msgid "pkexec: authorization could not be obtained (dialog dismissed)" msgstr "" "pkexec: não foi possível obter a autorização (caixa de diálogo ignorada)" #: daemon_client.cpp:175 msgid "pkexec: authorization could not be obtained (not authorized)" msgstr "pkexec: não foi possível obter a autorização (não autorizado)" #: daemon_client.cpp:178 msgid "pkexec: command not found" msgstr "pkexec: o comando não foi encontrado" #: daemon_client.cpp:181 msgid "pkexec: unexpected error code" msgstr "pkexec: código de erro inesperado" #: daemon_client.cpp:211 msgid "Connecting to daemon…" msgstr "Conectando ao daemon…" #: daemon_server.cpp:261 #, c-format msgid "request_handler: case %i not handled" msgstr "request_handler: caso %i não tratado" #: data.cpp:124 cpu-x-gtk-3.12.ui:1370 msgid "CPU" msgstr "CPU" #: data.cpp:187 msgid "P-core" msgstr "P-core" #: data.cpp:188 msgid "E-core" msgstr "E-core" #: data.cpp:189 data.cpp:192 msgid "Core" msgstr "Núcleo" #: data.cpp:208 cpu-x-gtk-3.12.ui:746 msgid "Processor" msgstr "Processador" #: data.cpp:240 data.cpp:329 cpu-x-gtk-3.12.ui:1968 msgid "Caches" msgstr "Caches" #: data.cpp:247 #, c-format msgid "%2d x %4d %s, %2d-way" msgstr "%2d x %4d %s, %2d-via" #: data.cpp:249 #, c-format msgid "%d %s, %d-way" msgstr "%d %s, %d-via(s)" #: data.cpp:263 msgid "Count" msgstr "Contagem" #: data.cpp:276 cpu-x-gtk-3.12.ui:968 msgid "Clocks" msgstr "Frequências" #: data.cpp:379 data.cpp:383 #, c-format msgid "L%u Cache" msgstr "L%u Cache" #: data.cpp:385 #, c-format msgid "%s associative, %d-%s line size" msgstr "%s associativa, tam. linha %d-%s" #: data.cpp:398 msgid "Test" msgstr "Teste" #: data.cpp:409 data.cpp:423 cpu-x-gtk-3.12.ui:2146 cpu-x-gtk-3.12.ui:2517 msgid "Motherboard" msgstr "Placa-mãe" #: data.cpp:437 cpu-x-gtk-3.12.ui:2367 msgid "BIOS" msgstr "BIOS" #: data.cpp:452 cpu-x-gtk-3.12.ui:2498 msgid "Chipset" msgstr "Chipset" #: data.cpp:467 data.cpp:569 cpu-x-gtk-3.12.ui:3156 cpu-x-gtk-3.12.ui:3761 msgid "Memory" msgstr "Memória" #: data.cpp:483 #, c-format msgid "Stick %u" msgstr "Vara %u" #: data.cpp:487 cpu-x-gtk-3.12.ui:3134 msgid "Sticks" msgstr "Sticks" #: data.cpp:541 cpu-x-gtk-3.12.ui:3780 msgid "System" msgstr "Sistema" #: data.cpp:554 cpu-x-gtk-3.12.ui:3380 msgid "Operating System" msgstr "Sistema operacional" #: data.cpp:587 cpu-x-gtk-3.12.ui:4960 msgid "Graphics" msgstr "Gráficos" #: data.cpp:621 #, c-format msgid "Card %u" msgstr "Placa %u" #: data.cpp:625 cpu-x-gtk-3.12.ui:4938 msgid "Cards" msgstr "Placas" #: data.cpp:672 cpu-x-gtk-3.12.ui:5300 msgid "Bench" msgstr "Bench" #: data.cpp:685 msgid "Not started" msgstr "Não foi iniciado" #: data.cpp:688 cpu-x-gtk-3.12.ui:5070 msgid "Prime numbers (slow)" msgstr "Números primos (lento)" #: data.cpp:692 cpu-x-gtk-3.12.ui:5178 msgid "Prime numbers (fast)" msgstr "Números primos (rápido)" #: data.cpp:696 cpu-x-gtk-3.12.ui:5281 msgid "Parameters" msgstr "Parâmetros" #: data.cpp:721 data.cpp:727 #, c-format msgid "%u mins" msgstr "%u min" #: data.cpp:734 cpu-x-gtk-3.12.ui:5444 cpu-x-gtk-3.12.ui:5552 msgid "About" msgstr "Sobre" #: data.cpp:739 #, c-format msgid "" "%s is a Free software that gathers information\n" "on CPU, motherboard and more." msgstr "" "%s é um software Livre que coleta informações sobre\n" "a sua CPU, placa-mãe e mais." #: data.cpp:744 msgid "About CPU-X" msgstr "Sobre CPU-X" #: data.cpp:745 #, c-format msgid "Version %s" msgstr "Versão %s" #: data.cpp:746 #, c-format msgid "Author: %s" msgstr "Autor: %s" #: data.cpp:747 #, c-format msgid "Site: %s" msgstr "Site: %s" #: data.cpp:751 cpu-x-gtk-3.12.ui:5533 msgid "License" msgstr "Licença" #: data.cpp:753 #, c-format msgid "This software is distributed under the terms of %s" msgstr "Este programa é distribuído sob os termos da %s" #: data.cpp:754 main.cpp:176 msgid "This program comes with ABSOLUTELY NO WARRANTY" msgstr "Este programa vem com ABSOLUTAMENTE NENHUMA GARANTIA" #: gui_gtk.cpp:61 #, c-format msgid "Cannot find path for '%s' file" msgstr "Não é possível encontrar caminho para o arquivo '%s'" #: gui_gtk.cpp:400 msgid "Start daemon" msgstr "Iniciar o daemon" #: gui_gtk.cpp:403 msgid "Connected to daemon" msgstr "Conectado ao daemon" #: gui_gtk.cpp:406 msgid "No polkit authentication agent found" msgstr "Não foi encontrado nenhum agente de autenticação polkit" #: gui_gtk.cpp:411 msgid "Ask password to start daemon in background" msgstr "Peça pela senha para iniciar o daemon em segundo plano" #: gui_gtk.cpp:415 msgid "Settings" msgstr "Configurações" #: gui_gtk.cpp:634 msgid "BaseFamily" msgstr "Família" #: gui_gtk.cpp:635 msgid "CPU display (\"true\") family (computed as BaseFamily+ExtendedFamily)" msgstr "" "Exiba a família da CPU (\"true\") (calculada como BaseFamily+ExtendedFamily)" #: gui_gtk.cpp:636 msgid "BaseModel" msgstr "Modelo" #: gui_gtk.cpp:637 msgid "CPU display (\"true\") model (computed as (ExtendedModel<<4)+BaseModel)" msgstr "" "Exiba o modelo da CPU (\"true\") (computado como " "(ExtendedModel<<4)+BaseModel)" #: gui_gtk.cpp:847 msgid "" "Identify the physically-labeled socket or board position where the memory " "device is located" msgstr "" "Identifique o soquete com uma etiqueta física ou a posição da placa onde o " "dispositivo de memória está localizado" #: gui_gtk.cpp:848 msgid "Identify the physically labeled bank where the memory device is located" msgstr "" "Identifique o banco físico marcado onde o dispositivo de memória está " "localizado" #: gui_gtk.cpp:1052 msgid "User Mode Driver Version" msgstr "Versão do usuário UMD" #: gui_gtk.cpp:1066 msgid "Vulkan Ray Tracing" msgstr "Vulkan Ray Tracing" #: gui_gtk.cpp:1260 msgid "Starting GTK GUI…" msgstr "Iniciando a interface gráfica GTK…" #: gui_gtk.cpp:1272 msgid "failed to import UI in GtkBuilder" msgstr "Houve uma falha ao importar a IU no GtkBuilder" #: main.cpp:63 msgid "Start graphical user interface (GUI) (default)" msgstr "Inicie a interface do usuário em modo gráfico (GUI) (padrão)" #: main.cpp:64 msgid "Start text-based user interface (TUI)" msgstr "Inicie a interface de usuário em modo texto (TUI)" #: main.cpp:65 msgid "Dump all data on standard output and exit" msgstr "Despeje todos os dados na saída padrão e encerre" #: main.cpp:66 msgid "Run embedded command dmidecode and exit" msgstr "Execute o comando integrado dmidecode e encerre" #: main.cpp:67 msgid "Run embedded command bandwidth and exit" msgstr "Execute o comando integrado bandwidth e encerre" #: main.cpp:68 msgid "Set temperature unit (c[elsius]|f[ahrenheit]|k[elvin]|r[ankine])" msgstr "" "Defina a unidade de temperatura (c[elsius]|f[ahrenheit]|k[elvin]|r[ankine])" #: main.cpp:69 msgid "Set custom time between two refreshes (in seconds)" msgstr "" "Defina um intervalo personalizado entre as duas atualizações (em segundos)" #: main.cpp:70 msgid "Set default tab (integer)" msgstr "Defina a aba padrão (valor inteiro)" #: main.cpp:71 msgid "Select core type to monitor (integer)" msgstr "Selecione o tipo do núcleo para monitorar (inteiro)" #: main.cpp:72 msgid "Select CPU core to monitor (integer)" msgstr "Selecione um núcleo da CPU para monitorar (inteiro)" #: main.cpp:73 msgid "Set custom bandwidth test for CPU caches speed (integer)" msgstr "" "Defina um teste de bandwidth personalizado para a velocidade da cache da CPU " "(valor inteiro)" #: main.cpp:74 msgid "Select default memory stick (integer)" msgstr "Defina a memória padrão (valor inteiro)" #: main.cpp:75 msgid "Select default graphic card (integer)" msgstr "Defina a placa gráfica padrão (valor inteiro)" #: main.cpp:76 cpu-x-gtk-3.12.ui:5910 msgid "Start and connect to daemon" msgstr "Inicie e conecte ao daemon" #: main.cpp:77 msgid "Verbose output" msgstr "Saída detalhada" #: main.cpp:78 msgid "Print help and exit" msgstr "Imprima a ajuda e encerre" #: main.cpp:79 msgid "Print version and exit" msgstr "Imprima a versão e encerre" #: main.cpp:80 msgid "Print CPUID values in decimal (default is hexadeximal)" msgstr "Imprima os valores do CPUID em decimal (o padrão é hexadeximal)" #: main.cpp:81 msgid "Disable colored output" msgstr "Desabilite a saída colorida" #: main.cpp:82 msgid "Print information for debugging" msgstr "Imprima as informações para a depuração" #: main.cpp:83 msgid "Print required information to paste in an issue" msgstr "Imprima as informações necessárias para colar em um assunto" #: main.cpp:84 msgid "Set key mapping for NCurses mode (a[rrows]|e[macs]|i[nverted-T]|v[im])" msgstr "" "Definir o mapeamento das chaves para o modo NCurses (a[rrows]|e[macs]|" "i[nverted-T]|v[im])" #: main.cpp:95 msgid "Add default command line arguments" msgstr "Adicione as opções padrão na linha de comando" #: main.cpp:96 msgid "Enforce the bus clock" msgstr "Imponha a frequência do barramento" #: main.cpp:97 msgid "" "Ignore CPU values reported by libcpuid (comma-separated values among 'temp', " "'volt' and 'freq')" msgstr "" "Ignorar os valores informados da CPU pela libcpuid (valores separados por " "vírgula entre 'temp', 'volt' e 'freq')" #: main.cpp:98 msgid "Read CPUID raw data from a given file" msgstr "Leia os dados brutos do CPUID a partir de um determinado arquivo" #: main.cpp:99 msgid "Only print a message if CPU is not present in the database" msgstr "Exiba somente uma mensagem caso a CPU não exista no banco de dados" #: main.cpp:126 #, c-format msgid "Usage: %s DISPLAY [OPTIONS]\n" msgstr "Uso: %s TELA [OPÇÕES]\n" #: main.cpp:127 msgid "Available DISPLAY:" msgstr "Tela disponível:" #: main.cpp:135 msgid "Available OPTIONS:" msgstr "OPÇÕES disponíveis:" #: main.cpp:144 msgid "Influenceable environment variables:" msgstr "Variáveis importantes do ambiente:" #: main.cpp:175 msgid "This is free software: you are free to change and redistribute it." msgstr "" "Este é um programa livre: você é livre para modificá-lo e para redistribuí-" "lo." #: main.cpp:177 #, c-format msgid "See the %s license: <%s>\n" msgstr "Consulte a %s licença: <%s>\n" #: main.cpp:184 #, c-format msgid "-- %-9s version: %s" msgstr "-- %-9s versão: %s" #: main.cpp:381 #, c-format msgid "" "\n" "Oops, something was wrong! %s has received signal %d (%s) and has crashed." msgstr "" "\n" "Oops, alguma coisa está errada! %s recebeu o sinal %d (%s) e encerrou." #: main.cpp:383 #, c-format msgid "" "\n" "Oops, something was wrong! %s has received signal %d (%s) and is trying to " "recover." msgstr "" "\n" "Oops, alguma coisa deu errado! %s recebeu o sinal %d (%s) e está tentando " "recuperar." #: main.cpp:407 msgid "You can open a new issue here, by filling the template as requested:" msgstr "" "Você pode abrir uma nova emissão de problema aqui, preenchendo o modelo " "conforme for solicitado:" #: main.cpp:449 msgid "an error occurred while setting locale" msgstr "ocorreu um erro enquanto a localização estava sendo definida" #: options.cpp:124 #, c-format msgid "" "Selected CPU type (%u) is not a valid number (%u is the maximum for this CPU)" msgstr "" "O tipo da CPU selecionada (%u) não é um número válido (%u é o máximo para " "esta CPU)" #: options.cpp:145 #, c-format msgid "" "Selected bandwidth test (%u) is not a valid number (%u is the maximum for " "this system)" msgstr "" "O teste de largura de banda selecionado (%u) não é um número válido (%u é o " "máximo para esse sistema)" #: options.cpp:168 #, c-format msgid "" "Selected RAM stick (%u) is not a valid number (%u is the maximum for this " "system)" msgstr "" "A placa de RAM selecionada (%u) não é um número válido (%u é o máximo para " "esse sistema)" #: options.cpp:188 #, c-format msgid "" "Selected graphic card (%u) is not a valid number (%u is the maximum for this " "system)" msgstr "" "A placa gráfica selecionada (%u) não é um número válido (%u é o máximo para " "este sistema)" #: options.cpp:204 #, c-format msgid "failed to change CPU affinitiy to core %u" msgstr "houve uma falha ao alterar a afinidade da CPU para o núcleo %u" #: options.cpp:210 #, c-format msgid "" "Selected CPU core (%u) is not a valid number (%u is the maximum for this " "type of core)" msgstr "" "O núcleo da CPU selecionada (%u) não é um número válido (%u é o máximo para " "este tipo de núcleo)" #: options.cpp:284 #, c-format msgid "Selected tab (%u) is not a valid number (%u is the maximum)" msgstr "O registro selecionado (%u) não é um número válido (%u é o máximo)" #: tui_ncurses.cpp:111 msgid "Window is too small!" msgstr "A janela é muito pequena!" #: tui_ncurses.cpp:119 msgid "Press 'h' to see help." msgstr "Pressione 'h' para ver a ajuda." #: tui_ncurses.cpp:232 #, c-format msgid "Welcome in %s NCurses help!\n" msgstr "Bem vindo a ajuda do %s Ncurses!\n" #: tui_ncurses.cpp:233 msgid "This help describes how to use this Text-based User Interface." msgstr "" "Essa ajuda descreve como usar a interface do usuário com base em texto." #: tui_ncurses.cpp:235 msgid "Global keys:" msgstr "Chaves globais:" #: tui_ncurses.cpp:236 msgid "Press 'left' key or 'tab' key to switch in left tab." msgstr "" "Pressione a tecla 'esquerda' ou a tecla 'tab' para alternar na guia da " "esquerda." #: tui_ncurses.cpp:237 msgid "Press 'right' key or 'shift + tab' keys to switch in right tab." msgstr "" "Pressione a tecla 'direita' ou as teclas 'shift + tab' para alternar na guia " "da direita." #: tui_ncurses.cpp:238 msgid "Press 'h' key to see this help." msgstr "Pressione 'h' para ver esta ajuda." #: tui_ncurses.cpp:239 msgid "Press 'q' key to exit." msgstr "Pressione a tecla 'q' para encerrar." #: tui_ncurses.cpp:241 msgid "CPU tab:" msgstr "Aba da CPU:" #: tui_ncurses.cpp:242 msgid "Press 'next page' key to decrease core type number to monitor." msgstr "" "Pressione a tecla 'próxima página' para diminuir o número do tipo do núcleo " "que será monitorado." #: tui_ncurses.cpp:243 msgid "Press 'previous page' key to increase core type number to monitor." msgstr "" "Pressione a tecla 'página anterior' para aumentar o número do tipo de núcleo " "que será monitorado." #: tui_ncurses.cpp:244 msgid "Press 'down' key to decrease CPU core number to monitor." msgstr "" "Pressione a tecla 'down' para diminuir o número do núcleo da CPU que será " "monitorado." #: tui_ncurses.cpp:245 msgid "Press 'up' key to increase CPU core number to monitor." msgstr "" "Pressione a tecla 'up' para aumentar o número do núcleo da CPU que será " "monitorado." #: tui_ncurses.cpp:247 msgid "Caches tab:" msgstr "Aba Caches:" #: tui_ncurses.cpp:248 msgid "Press 'down' key to switch to previous test." msgstr "Pressione a tecla 'abaixo' para alternar para o teste anterior." #: tui_ncurses.cpp:249 msgid "Press 'up' key to switch to next test." msgstr "Pressione a tecla 'up' para alternar para o próximo teste." #: tui_ncurses.cpp:251 msgid "Bench tab:" msgstr "Aba Bench:" #: tui_ncurses.cpp:252 msgid "Press 'down' key to decrement benchmark duration." msgstr "Pressione a tecla 'abaixo' para reduzir a duração do benchmark." #: tui_ncurses.cpp:253 msgid "Press 'up' key to increment benchmark duration." msgstr "Pressione a tecla 'acima' para aumentar a duração do benchmark." #: tui_ncurses.cpp:254 msgid "Press 'next page' key to decrement number of threads to use." msgstr "" "Pressione a tecla 'próxima página' para reduzir a quantidade de threads." #: tui_ncurses.cpp:255 msgid "Press 'previous page' key to increment number of threads to use." msgstr "" "Pressione a tecla 'página anterior' para aumentar a quantidade das threads." #: tui_ncurses.cpp:256 msgid "Press 's' key to start/stop prime numbers (slow) benchmark." msgstr "" "Pressione a tecla 's' para iniciar/parar o benchmark dos números primos " "(lento)." #: tui_ncurses.cpp:257 msgid "Press 'f' key to start/stop prime numbers (fast) benchmark." msgstr "" "Pressione a tecla 'f' para iniciar/parar o benchmark dos números primos " "(rápido)." #: tui_ncurses.cpp:259 msgid "Graphics tab:" msgstr "Aba gráficos:" #: tui_ncurses.cpp:260 msgid "Press 'down' key to switch to previous graphic card." msgstr "" "Pressione a tecla 'abaixo' para alternar para a placa gráfica anterior." #: tui_ncurses.cpp:261 msgid "Press 'up' key to switch to next graphic card." msgstr "Pressione a tecla 'acima' para alternar para a próxima placa gráfica." #: tui_ncurses.cpp:263 msgid "Press any key to exit this help." msgstr "Pressione qualquer tecla para encerrar esta ajuda." #: tui_ncurses.cpp:640 msgid "Starting NCurses TUI…" msgstr "Iniciando a interface de texto NCurses…" #: tui_ncurses.cpp:649 msgid "" "FATAL ERROR: terminfo database could not be found (try to set TERMINFO " "environment variable)" msgstr "" "ERRO FATAL: não foi possível encontrar o banco de dados terminfo (tente " "definir a variável de ambiente TERMINFO)" #: tui_ncurses.cpp:654 #, c-format msgid "Failed to set up %s terminal (err=%i); falling back to %s" msgstr "" "Houve uma falha ao configurar o terminal %s (err=%i); retornando para %s" #: util.cpp:189 #, c-format msgid "cannot find unit in '%s' string at position %i" msgstr "não é possível encontrar a unidade na string '%s' na posição %i" #: util.cpp:252 #, c-format msgid "an error occurred while opening file '%s'" msgstr "ocorreu um erro ao abrir o arquivo '%s'" #: util.cpp:297 #, c-format msgid "an error occurred while running command '%s'" msgstr "ocorreu um erro ao executar o comando '%s'" #: util.cpp:437 msgid "set_cpu_affinity() not supported on this operating system" msgstr "set_cpu_affinity() não é compatível neste sistema operacional" #: data.hpp:103 data.hpp:244 data.hpp:332 msgid "Vendor" msgstr "Fornecedor" #: data.hpp:104 msgid "Code Name" msgstr "Codinome" #: data.hpp:105 msgid "Package" msgstr "Pacote" #: data.hpp:106 msgid "Technology" msgstr "Tecnologia" #: data.hpp:107 data.hpp:268 msgid "Voltage" msgstr "Tensão" #: data.hpp:108 msgid "Specification" msgstr "Especificação" #: data.hpp:109 msgid "Family" msgstr "Família" #: data.hpp:110 msgid "Disp. Family" msgstr "Disp. Família" #: data.hpp:111 data.hpp:224 data.hpp:245 data.hpp:335 msgid "Model" msgstr "Modelo" #: data.hpp:112 msgid "Disp. Model" msgstr "Disp. Modelo" #: data.hpp:113 msgid "Temp." msgstr "Temp." #: data.hpp:114 msgid "Stepping" msgstr "Passo" #: data.hpp:115 msgid "Instructions" msgstr "Instruções" #: data.hpp:125 msgid "L1 Data" msgstr "L1 Data" #: data.hpp:126 msgid "L1 Inst." msgstr "L1 Inst." #: data.hpp:127 msgid "Level 2" msgstr "Level 2" #: data.hpp:128 msgid "Level 3" msgstr "Level 3" #: data.hpp:137 cpu-x-gtk-3.12.ui:1232 msgid "Cores" msgstr "Núcleos" #: data.hpp:138 data.hpp:408 cpu-x-gtk-3.12.ui:1252 msgid "Threads" msgstr "Threads" #: data.hpp:155 msgid "Core Speed" msgstr "Velocidade do núcleo" #: data.hpp:156 msgid "Multiplier" msgstr "Multiplicador" #: data.hpp:157 msgid "Bus Speed" msgstr "Velocidade do barramento" #: data.hpp:158 data.hpp:341 msgid "Usage" msgstr "Uso" #: data.hpp:188 data.hpp:265 msgid "Size" msgstr "Tamanho" #: data.hpp:189 data.hpp:267 msgid "Speed" msgstr "Velocidade" #: data.hpp:223 data.hpp:259 msgid "Manufacturer" msgstr "Fabricante" #: data.hpp:225 msgid "Revision" msgstr "Revisão" #: data.hpp:233 msgid "Brand" msgstr "Marca" #: data.hpp:234 msgid "Version" msgstr "Versão" #: data.hpp:235 msgid "Date" msgstr "Data" #: data.hpp:236 msgid "ROM Size" msgstr "Tamanho da ROM" #: data.hpp:260 msgid "Part Number" msgstr "Número da peça" #: data.hpp:261 msgid "Type" msgstr "Tipo" #: data.hpp:262 msgid "Type Detail" msgstr "Detalhe do tipo" #: data.hpp:263 msgid "Device Locator" msgstr "Localizador de dispositivos" #: data.hpp:264 msgid "Bank Locator" msgstr "Localizador de bancos" #: data.hpp:266 msgid "Rank" msgstr "Posição" #: data.hpp:292 msgid "Name" msgstr "Nome" #: data.hpp:293 msgid "Kernel" msgstr "Kernel" #: data.hpp:294 msgid "Hostname" msgstr "Nome do host" #: data.hpp:295 msgid "Uptime" msgstr "Tempo de operação" #: data.hpp:303 msgid "Used" msgstr "Utilizado" #: data.hpp:304 msgid "Buffers" msgstr "Buffers" #: data.hpp:305 msgid "Cached" msgstr "Em cache" #: data.hpp:306 msgid "Free" msgstr "Disponível" #: data.hpp:307 msgid "Swap" msgstr "Swap" #: data.hpp:333 msgid "Driver" msgstr "Controladora" #: data.hpp:334 msgid "UMD Version" msgstr "Versão UMD" #: data.hpp:336 msgid "Compute Unit" msgstr "Unidade de cálculo" #: data.hpp:337 msgid "Device ID" msgstr "ID do dispositivo" #: data.hpp:338 msgid "VBIOS Version" msgstr "Versão VBIOS" #. #-#-#-#-# source_ui.pot (cpu-x ) #-#-#-#-# #. Setting: "Interface" tab #: data.hpp:339 cpu-x-gtk-3.12.ui:5807 msgid "Interface" msgstr "Interface" #: data.hpp:340 msgid "Temperature" msgstr "Temperatura" #: data.hpp:342 msgid "Core Voltage" msgstr "Tensão principal" #: data.hpp:343 msgid "Power Avg" msgstr "Média da alimentação" #: data.hpp:344 msgid "Core Clock" msgstr "Frequência principal" #: data.hpp:345 msgid "Memory Clock" msgstr "Frequência da memória" #: data.hpp:346 msgid "Memory Used" msgstr "Utilização da memória" #: data.hpp:347 msgid "Resizable BAR" msgstr "Barra redimensionável" #: data.hpp:348 msgid "Vulkan RT" msgstr "Vulkan RT" #: data.hpp:349 msgid "OpenGL Version" msgstr "Versão OpenGL" #: data.hpp:350 msgid "Vulkan Version" msgstr "Versão Vulkan" #: data.hpp:351 msgid "OpenCL Version" msgstr "Versão OpenCL" #: data.hpp:387 msgid "Score" msgstr "Nota" #: data.hpp:388 msgid "Run" msgstr "Execute" #: data.hpp:407 msgid "Duration" msgstr "Duração" #: util.hpp:77 msgid "bytes" msgstr "bytes" #. TRANSLATORS: initials for kilobyte (10³): please put initials (keep it short) #: util.hpp:80 msgid "kB" msgstr "kB" #. TRANSLATORS: initials for megabyte (10⁶): please put initials (keep it short) #: util.hpp:82 msgid "MB" msgstr "MB" #. TRANSLATORS: initials for gigabyte (10⁹): please put initials (keep it short) #: util.hpp:84 msgid "GB" msgstr "GB" #. TRANSLATORS: initials for terabyte (10¹²): please put initials (keep it short) #: util.hpp:86 msgid "TB" msgstr "TB" #. TRANSLATORS: initials for kibibyte (2¹⁰): please put initials (keep it short) #: util.hpp:89 msgid "KiB" msgstr "KiB" #. TRANSLATORS: initials for mebibyte (2²⁰): please put initials (keep it short) #: util.hpp:91 msgid "MiB" msgstr "MiB" #. TRANSLATORS: initials for gibibyte (2³⁰): please put initials (keep it short) #: util.hpp:93 msgid "GiB" msgstr "GiB" #. TRANSLATORS: initials for tebibyte (2⁴⁰): please put initials (keep it short) #: util.hpp:95 msgid "TiB" msgstr "TiB" #: cpu-x-gtk-3.12.ui:1184 msgid "Cache" msgstr "Cache" #. Setting: refresh time for UI #: cpu-x-gtk-3.12.ui:5721 msgid "Refresh time" msgstr "Tempo de atualização" #. Setting: GUI theme #: cpu-x-gtk-3.12.ui:5745 msgid "Text theme" msgstr "Tema texto" #. Setting: automatic GUI theme #: cpu-x-gtk-3.12.ui:5760 msgid "Automatic" msgstr "Automático" #. Setting: light GUI theme #: cpu-x-gtk-3.12.ui:5761 msgid "Blue for light theme" msgstr "Azul para o tema claro" #. Setting: dark GUI theme #: cpu-x-gtk-3.12.ui:5762 msgid "Yellow for dark theme" msgstr "Amarelo para o tema escuro" #. Setting: temperature unit #: cpu-x-gtk-3.12.ui:5775 msgid "Temperature unit" msgstr "Unidade de temperatura" #. Setting: default tab at startup #: cpu-x-gtk-3.12.ui:5826 msgid "Default tab" msgstr "Aba padrão" #. Setting: default CPU core at startup #: cpu-x-gtk-3.12.ui:5839 msgid "Default CPU core" msgstr "Núcleo predefinido da CPU" #. Setting: default cache test at startup #: cpu-x-gtk-3.12.ui:5852 msgid "Default cache test" msgstr "Teste de cache padrão" #. Setting: print CPUID values in decimal or hexadecimal #: cpu-x-gtk-3.12.ui:5895 msgid "Print CPUID values in decimal" msgstr "Imprima os valores do CPUID em decimal" #. Setting: default graphic card at startup #: cpu-x-gtk-3.12.ui:5928 msgid "Default graphic card" msgstr "Placa gráfica predefinida" #. Setting: default CPU core at startup #: cpu-x-gtk-3.12.ui:5952 msgid "Default core type" msgstr "Tipo do núcleo padrão" #. Setting: default graphic card at startup #: cpu-x-gtk-3.12.ui:5976 msgid "Default memory stick" msgstr "Placa da padrão da memória" #. Setting: "Startup" tab #: cpu-x-gtk-3.12.ui:6004 msgid "Startup" msgstr "Inicialização" #~ msgid "Light" #~ msgstr "Claro" #~ msgid "Dark" #~ msgstr "Escuro" #~ msgid "Calculating CPU multipliers" #~ msgstr "Calculando os multiplicadores da CPU" #, c-format #~ msgid "Current: PCIe Gen%1dx%d / Max: Gen%1dx%d" #~ msgstr "Atual: PCIe Gen%1dx%d / Max: Gen%1dx%d" #~ msgid "failed to retrieve GPU clocks" #~ msgstr "Houve uma falha durante a obtenção da frequência da GPU" #, c-format #~ msgid "Core #%i" #~ msgstr "Núcleo #%i" #~ msgid "Setting label names" #~ msgstr "Configurando o nome das etiquetas" #, c-format #~ msgid "Bank %i" #~ msgstr "Banco %i" #~ msgid "Reference" #~ msgstr "Referência" #~ msgid "Distribution" #~ msgstr "Distribuição" #~ msgid "Compiler" #~ msgstr "Compilador" #~ msgid "GPU clock" #~ msgstr "Frequência da GPU" #~ msgid "Dumping data…" #~ msgstr "Despejando os dados…" #~ msgid "Freeing memory" #~ msgstr "Liberando a memória" #~ msgid "Ignore CPU frequency reported by libcpuid" #~ msgstr "Ignore a frequência da CPU informada pelo libcpuid" #, c-format #~ msgid "failed to call wordexp (%i)" #~ msgstr "Houve uma falha ao invocar o wordexp (%i)" #~ msgid "Press 'home' key to scroll up in a page." #~ msgstr "Pressione a tecla 'home' para rolar uma página para cima." #~ msgid "Press 'end' key to scroll down in a page." #~ msgstr "Pressione a tecla 'end' para rolar uma página para baixo." #, c-format #~ msgid "String '%s' is too long, truncating…" #~ msgstr "A string '%s' é muito grande, cortando…" #, c-format #~ msgid "failed to open %s directory" #~ msgstr "houve uma falha ao abrir o diretório %s" #~ msgid "an error occurred while compiling regex" #~ msgstr "ocorreu um erro enquanto compilava o regex" #~ msgid "FATAL ERROR: could not allocate memory" #~ msgstr "ERRO FATAL: não foi possível alocar a memória" #~ msgid "Enumerating Vulkan instance extension properties" #~ msgstr "Enumerando as propriedades da extensão da instância Vulkan" #, c-format #~ msgid "failed to call vkEnumerateInstanceExtensionProperties (%s)" #~ msgstr "" #~ "houve uma falha ao chamar vkEnumerateInstanceExtensionProperties (%s)" #, c-format #~ msgid "" #~ "failed to call vkEnumerateInstanceExtensionProperties to fill " #~ "VkExtensionProperties (%s)" #~ msgstr "" #~ "houve uma falha ao chamar vkEnumerateInstanceExtensionProperties para " #~ "preencher VkExtensionProperties (%s)" #~ msgid "Vulkan API is not available" #~ msgstr "A API Vulkan não está disponível" #, c-format #~ msgid "%s" #~ msgstr "%s" #, c-format #~ msgid "" #~ "CPU hybrid architecture is not supported. For more details, please refer " #~ "to following issue: %s" #~ msgstr "" #~ "A arquitetura híbrida da CPU não é suportada. Para obter mais detalhes, " #~ "consulte a seguinte questão: %s" #~ msgid "NOT SUPPORTED" #~ msgstr "NÃO SUPORTADO" #~ msgid "There is no device with Vulkan support" #~ msgstr "Não há dispositivo com suporte ao Vulkan" #~ msgid "Socket(s)" #~ msgstr "Socket(s)" #~ msgid "Thread(s)" #~ msgstr "Thread(s)" #~ msgid "You can paste this backtrace by opening a new issue here:" #~ msgstr "Você pode colar esse backtrace abrindo uma nova issue aqui:" #, fuzzy #~| msgid "failed to call dmidecode" #~ msgid "faild to call clGetDeviceIDs" #~ msgstr "falhou ao chamar o dmidecode" #~ msgid "Exiting %s" #~ msgstr "Saindo %s" #~ msgid "Skip CPU MSR opening (need to be root)" #~ msgstr "Pular abertura do CPU MSR (precisa estar em root)" #~ msgid "failed to open CPU MSR (%s)" #~ msgstr "Falha ao abrir CPU MSR (%s)" #~ msgid "Skip call to dmidecode (need to be root)" #~ msgstr "Pular chamada ao dmidecode (precisa estar em root)" #~ msgid "failed to allocate memory for dmidecode" #~ msgstr "falhou ao alocar memória para o dmidecode" #~ msgid "Finding graphic card driver" #~ msgstr "Encontrando driver da placa de vídeo" #~ msgid "(%s driver)" #~ msgstr "(%s driver)" #~ msgid "Retrieving GPU temperature" #~ msgstr "Obtendo temperatura da GPU" #~ msgid "Off" #~ msgstr "Desativado" #~ msgid "failed to retrieve GPU temperature" #~ msgstr "falha ao obter a temperatura da GPU" #~ msgid "Skip some GPU values (need to be root)" #~ msgstr "Ignorar alguns valores da GPU (precisa ser root)" #~ msgid "failed to allocate memory for benchmark" #~ msgstr "falhou ao alocar memória para o benchmark" #~ msgid "Root privileges are required to work properly" #~ msgstr "É necessário privilégios de root para funcionar corretamente" #~ msgid "Some information will not be retrievable" #~ msgstr "Algumas informações não serão recuperáveis" #~ msgid "Ignore" #~ msgstr "Ignorar" #~ msgid "Run as root" #~ msgstr "Executar como root" #~ msgid "A new version of %s is available!" #~ msgstr "Uma nova versão do %s está disponível!" #~ msgid "" #~ "Do you want to update %s to version %s after exit?\n" #~ "It will erase this binary file (%s) by the new version." #~ msgstr "" #~ "Você quer atualizar %s para a versão %s depois de sair?\n" #~ "Isso vai substituir o arquivo binário (%s) com a nova versão." #~ msgid "Not now" #~ msgstr "Não agora" #~ msgid "Update" #~ msgstr "Atualizar" #~ msgid "Checking on Internet for a new version..." #~ msgstr "Checando na internet por uma nova versão..." #~ msgid "failed to open a Curl session" #~ msgstr "falhou ao abrir uma sessão do Curl" #~ msgid "wrong write data" #~ msgstr "dados de escrita incorretos" #~ msgid "(version %s is available)" #~ msgstr "(versão %s está disponível)" #~ msgid "No new version available" #~ msgstr "Nenhuma nova versão disponível" #~ msgid "(up-to-date)" #~ msgstr "(atualizado)" #~ msgid "an error occurred while extracting %s archive (%s)" #~ msgstr "um erro ocorreu enquanto extraía o arquivo %s (%s)" #~ msgid "" #~ "Network access is disabled by environment variable (set CPUX_NETWORK with " #~ "a positive value to enable it)" #~ msgstr "" #~ "O acesso a rede está desabilitado por uma variável de ambiente (defina " #~ "CPUX_NETWORK com um valor positivo para habilitar)" #~ msgid "failed to open %s archive for writing" #~ msgstr "falhou ao abrir o arquivo %s para escrita" #~ msgid "Downloading new version..." #~ msgstr "Baixando nova versão..." #~ msgid "failed to download %s archive (%s)" #~ msgstr "falhou ao baixar o arquivo %s (%s)" #~ msgid "Extracting new version..." #~ msgstr "Extraindo nova versão..." #~ msgid "Applying new version..." #~ msgstr "Aplicando nova versão..." #~ msgid "an error occurred while removing/renaming files" #~ msgstr "um erro ocorreu enquanto deletava/renomeava arquivos" #~ msgid "Update successful!" #~ msgstr "Atualização bem sucedida!" #~ msgid "Update portable version if a new version is available" #~ msgstr "Atualizar a versão portátil se uma nova versão estiver disponível" #~ msgid "Temporarily disable network support" #~ msgstr "Desabilitar temporariamente o suporte à rede" #~ msgid "Built on %s, %s (with %s %s on %s)." #~ msgstr "Compilado em %s, %s (com %s %s em %s)." #~ msgid "" #~ "Sorry, you cannot update %s: 32-bit portable version is no more supported." #~ msgstr "" #~ "Desculpe, você não pode atualizar %s: a versão portátil de 32 bits não é " #~ "mais suportada." #~ msgid "If you want to update, press 'u' key, or anything else to skip.\n" #~ msgstr "" #~ "se você quiser atualizar, pressione a tecla 'u', ou qualquer outra para " #~ "pular.\n" #~ msgid "" #~ "\n" #~ "\n" #~ "%s will be updated." #~ msgstr "" #~ "\n" #~ "\n" #~ "%s vai ser atualizado." CPU-X-5.0.3/po/ro.po000066400000000000000000001153471454622605200137720ustar00rootroot00000000000000# CPU-X translations template # Copyright © 2014-2024 The Tumultuous Unicorn Of Darkness # This file is distributed under the same license as the cpu-x package. # Daniel , 2022. msgid "" msgstr "" "Project-Id-Version: cpu-x\n" "Report-Msgid-Bugs-To: https://github.com/TheTumultuousUnicornOfDarkness/CPU-" "X/issues\n" "POT-Creation-Date: 2023-12-09 13:09+0100\n" "PO-Revision-Date: 2022-01-13 02:56+0000\n" "Last-Translator: Daniel \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" "Plural-Forms: nplurals=3; plural=n==1 ? 0 : (n==0 || (n%100 > 0 && n%100 < " "20)) ? 1 : 2;\n" "X-Generator: Weblate 4.10.1\n" #: core.cpp:135 msgid "Finding CPU technology" msgstr "Se găsește tehnologia procesorului" #: core.cpp:161 #, c-format msgid "" "Your CPU is not present in the database ==> %s, model: %i, ext. model: %i, " "ext. family: %i" msgstr "" "Procesorul dumneavoastră nu este prezent în baza de date ==> %s, model: %i, " "model extins: %i, familie extinsă: %i" #: core.cpp:189 data.cpp:150 data.cpp:342 msgid "unknown" msgstr "" #: core.cpp:230 msgid "Calling libcpuid for retrieving static data" msgstr "Se apelează libcpuid pentru obținerea datelor statice" #: core.cpp:245 #, c-format msgid "failed to call libcpuid (%s)" msgstr "a eșuat apelarea libcpuid (%s)" #: core.cpp:340 msgid "Calling libcpuid for retrieving dynamic data" msgstr "Se apelează libcpuid pentru obținerea datelor dinamice" #: core.cpp:353 msgid "Calling libcpuid for retrieving CPU MSR static values" msgstr "" "Se apelează libcpuid pentru obținerea valorilor statice registrului specific " "modelului procesorului" #: core.cpp:380 msgid "Calling libcpuid for retrieving CPU MSR dynamic values" msgstr "" "Calling libcpuid pentru obținerea valorilor dinamice registrului specific " "modelului procesorului" #: core.cpp:412 msgid "Calling dmidecode" msgstr "Se apelează dmidecode" #: core.cpp:454 core.cpp:473 #, c-format msgid "%s (configured)" msgstr "" #: core.cpp:461 core.cpp:480 #, c-format msgid "%s (max)" msgstr "" #: core.cpp:466 #, c-format msgid "%s (min)" msgstr "" #: core.cpp:496 msgid "Calculating CPU usage" msgstr "Se calculează folosirea procesorului" #: core.cpp:546 msgid "Calling bandwidth" msgstr "Se apelează lățimea de bandă" #: core.cpp:613 #, c-format msgid "" "pci_access is not properly initialized: it is a common issue when %s was " "built with a lower libpci version.\n" "Check that libpci %s library is present on your system. Otherwise, please " "rebuild %s." msgstr "" #: core.cpp:657 #, c-format msgid "No kernel driver in use for graphic card at path %s" msgstr "Niciun ghidator nucleu pentru placa video pe calea %s" #: core.cpp:693 #, c-format msgid "Your GPU kernel driver is unknown: %s" msgstr "Ghidatorul nucleu pentru placa dumneavoastră video este necunoscut: %s" #: core.cpp:777 #, fuzzy, c-format #| msgid "Your GPU user mode driver is unknown: %s" msgid "Your GPU user mode driver is unknown for vendor %s: %s" msgstr "" "Ghidatorul mod utilizator pentru placa dumneavoastră video este necunoscut: " "%s" #: core.cpp:781 #, c-format msgid "failed to call GLFW (%i): %s" msgstr "a eșuat apelarea GLFW (%i): %s" #: core.cpp:914 #, fuzzy #| msgid "Version" msgid "Finding Vulkan API version" msgstr "Versiunea" #: core.cpp:926 #, fuzzy, c-format #| msgid "failed to call wordexp (%i)" msgid "failed to call vkCreateInstance (%s)" msgstr "a eșuat apelarea wordexp (%i)" #: core.cpp:929 #, c-format msgid "%s is not supported" msgstr "" #: core.cpp:937 #, fuzzy, c-format #| msgid "failed to call libcpuid (%s)" msgid "failed to call vkEnumeratePhysicalDevices (%s)" msgstr "a eșuat apelarea libcpuid (%s)" #: core.cpp:944 msgid "No available Vulkan devices" msgstr "" #: core.cpp:952 #, fuzzy, c-format #| msgid "failed to call libcpuid (%s)" msgid "No available physical devices (%s)" msgstr "a eșuat apelarea libcpuid (%s)" #: core.cpp:1015 #, fuzzy, c-format #| msgid "failed to get name for device %u (%s)" msgid "Failed to create Vulkan for device %u (%s)" msgstr "a eșuat obținerea numelui pentru dispozitivul %u (%s)" #: core.cpp:1019 #, c-format msgid "%s is not supported for device %u, use only deviceID for matching" msgstr "" #: core.cpp:1051 core.cpp:1364 msgid "Enabled" msgstr "Activat" #: core.cpp:1051 core.cpp:1364 msgid "Disabled" msgstr "Dezactivat" #: core.cpp:1088 #, fuzzy #| msgid "Version" msgid "Finding OpenCL API version" msgstr "Versiunea" #: core.cpp:1092 #, c-format msgid "There is no platform with OpenCL support (%s)" msgstr "Nu există nicio platformă cu sprijin pentru OpenCL (%s)" #: core.cpp:1102 #, c-format msgid "failed to get all OpenCL platforms (%s)" msgstr "a eșuat obținerea tuturor platformelor OpenCL (%s)" #: core.cpp:1115 #, c-format msgid "failed to get name for platform %u (%s)" msgstr "a eșuat obținerea numelui platformei %u (%s)" #: core.cpp:1123 #, c-format msgid "failed to get version for platform %u (%s)" msgstr "a eșuat obținerea versiunii platformei %u (%s)" #: core.cpp:1131 #, c-format msgid "failed to find number of OpenCL devices for platform '%s %s' (%s)" msgstr "" "a eșuat găsirea numărului de dispozitive OpenCL pentru platforma '%s %s' (%s)" #: core.cpp:1131 #, fuzzy #| msgid "DeviceID" msgid "0 device" msgstr "Identifiatorul dispozitivului" #: core.cpp:1140 #, c-format msgid "failed to get all of OpenCL devices for platform '%s %s' (%s)" msgstr "" "a eșuat obținerea tuturor dispozitivelor OpenCL pentru platforma '%s %s' (%s)" #: core.cpp:1160 #, c-format msgid "failed to get name for device %u (%s)" msgstr "a eșuat obținerea numelui pentru dispozitivul %u (%s)" #: core.cpp:1168 #, c-format msgid "failed to get version for device %u (%s)" msgstr "a eșuat obținerea versiunii dispozitivului %u (%s)" #: core.cpp:1190 #, c-format msgid "OpenCL driver for '%s %s' does not support CL_DEVICE_TOPOLOGY_AMD (%s)" msgstr "" "Ghidatorul OpenCL pentru „%s %s” does nu sprijină CL_DEVICE_TOPOLOGY_AMD (%s)" #: core.cpp:1201 #, c-format msgid "" "OpenCL driver for '%s %s' does not support CL_DEVICE_GFXIP_MAJOR_AMD (%s)" msgstr "" "Ghidatorul OpenCL pentru „%s %s” does nu sprijină CL_DEVICE_GFXIP_MAJOR_AMD " "(%s)" #: core.cpp:1209 core.cpp:1229 core.cpp:1262 #, c-format msgid "" "OpenCL driver for '%s %s' does not support CL_DEVICE_MAX_COMPUTE_UNITS (%s)" msgstr "" "Ghidatorul OpenCL pentru „%s %s” does nu sprijină " "CL_DEVICE_MAX_COMPUTE_UNITS (%s)" #: core.cpp:1250 #, c-format msgid "" "OpenCL driver for '%s %s' does not support CL_DEVICE_PCI_DOMAIN_ID_NV (%s), " "CL_DEVICE_PCI_BUS_ID_NV (%s) or CL_DEVICE_PCI_SLOT_ID_NV (%s)" msgstr "" "Ghidatorul OpenCL pentru „%s %s” does nu sprijină CL_DEVICE_PCI_DOMAIN_ID_NV " "(%s), CL_DEVICE_PCI_BUS_ID_NV (%s) sau CL_DEVICE_PCI_SLOT_ID_NV (%s)" #: core.cpp:1273 #, c-format msgid "OpenCL is not supported with your GPU vendor (0x%X)" msgstr "" "OpenCL nu este sprijinit de vânzătorul plăcii dumneavoastre video (0x%X)" #: core.cpp:1295 msgid "Finding devices" msgstr "Se găsesc dispozitivele" #: core.cpp:1307 #, c-format msgid "Skip devices search (wrong permissions on %s device)" msgstr "Omite căutarea dispozitivelor (permisiuni greșite pe dispozitivul %s)" #: core.cpp:1350 #, c-format msgid "Your GPU vendor is unknown: %s (0x%X)" msgstr "Vânzătorul plăcii dumeavoastră vide este necunoscut: %s (0x%X)" #: core.cpp:1370 msgid "failed to find chipset vendor and model" msgstr "a eșuat găsirea furnizorului și modelul cipsetului" #: core.cpp:1385 msgid "failed to find graphic card vendor and model" msgstr "a eșuat găsirea furnizorului și modelul plăcii video" #: core.cpp:1487 msgid "Retrieving GPU clocks" msgstr "Se obțin tactările plăcii video" #: core.cpp:1500 msgid "None" msgstr "Niciunul" #: core.cpp:1509 #, c-format msgid "DRM path for %s is unknown" msgstr "" #: core.cpp:1516 #, c-format msgid "Card number for %s is unknown" msgstr "" #: core.cpp:1541 #, c-format msgid "PCIe %s (current) / %s (max)" msgstr "" #: core.cpp:1650 #, fuzzy, c-format #| msgid "Driver for GPU %u doesn't report frequencies" msgid "Driver for %s doesn't report frequencies" msgstr "Ghidatorul pentru placa video %u nu raportează frecvențele" #: core.cpp:1671 #, fuzzy, c-format #| msgid "failed to get all OpenCL platforms (%s)" msgid "failed to retrieve all monitoring data for %s" msgstr "a eșuat obținerea tuturor platformelor OpenCL (%s)" #: core.cpp:1694 msgid "Identifying running system" msgstr "Se identifică sistemul actual" #: core.cpp:1697 msgid "failed to identify running system" msgstr "a eșuat identificarea sistemului actual" #: core.cpp:1749 core.cpp:1778 msgid "Calling libprocps" msgstr "Se apelează libprocps" #: core.cpp:1752 msgid "unable to get system uptime" msgstr "" #: core.cpp:1758 msgid "unable to create meminfo structure" msgstr "" #: core.cpp:1804 msgid "Calling libstatgrab" msgstr "Se apelează libstatgrab" #: core.cpp:1852 #, c-format msgid "%i days, %i hours, %i minutes, %i seconds" msgstr "%i zile, %i ore, %i minute, %i secunde" #: core.cpp:1915 msgid "Updating benchmark status" msgstr "Se actualizează starea testării performanței" #: core.cpp:1918 msgid "Active" msgstr "Activ" #: core.cpp:1921 #, c-format msgid "(%u hours left)" msgstr "(%u ore rămase)" #: core.cpp:1923 #, c-format msgid "(%u minutes left)" msgstr "(%u minute rămase)" #: core.cpp:1925 #, c-format msgid "(%u seconds left)" msgstr "(%u secunde rămase)" #: core.cpp:1929 core.cpp:1984 core.cpp:1985 msgid "Inactive" msgstr "Inactiv" #: core.cpp:1932 #, c-format msgid "in %u hours" msgstr "în %u ore" #: core.cpp:1934 #, c-format msgid "in %u minutes" msgstr "în %u minute" #: core.cpp:1936 #, c-format msgid "in %u seconds" msgstr "în %u secunde" #: core.cpp:1953 #, fuzzy, c-format #| msgid "Starting benchmark" msgid "Starting benchmark with %u threads" msgstr "Se pornește testarea performanței" #: core.cpp:1976 msgid "an error occurred while starting benchmark" msgstr "a apărut o eroare la pornirea testării performanței" #: core.cpp:2002 msgid "Finding CPU package in fallback mode" msgstr "Se găsește pachetul procesorului în modul de rezervă" #: core.cpp:2032 #, c-format msgid "Your CPU socket is not present in the database ==> %s, codename: %s" msgstr "" "Soclul procesorului dumneavoastră nu este în baza de date ==> %s, numele de " "cod: %s" #: core.cpp:2052 msgid "Calculating CPU multipliers in fallback mode" msgstr "Se calculează multiplicatorii procesorului în modul de rezervă" #: core.cpp:2072 msgid "Retrieving motherboard information in fallback mode" msgstr "Se obțin informațiile plăcii de bază în modul de rezervă" #: core.cpp:2085 msgid "failed to retrieve motherboard information (fallback mode)" msgstr "a eșuat obținerea informațiilor plăcii de bază (în modul de rezervă)" #: core.cpp:2127 msgid "Retrieving CPU temperature in fallback mode" msgstr "Se obține temperatura procesorului în modul de rezervă" #: core.cpp:2173 msgid "failed to retrieve CPU temperature (fallback mode)" msgstr "a eșuat obținerea temperaturii procesorului (în modul de rezervă)" #: core.cpp:2188 msgid "Retrieving CPU voltage in fallback mode" msgstr "Se obține voltajul procesorului în modul de rezervă" #: core.cpp:2200 msgid "failed to retrieve CPU voltage (fallback mode)" msgstr "a eșuat obținerea voltajului procesorului (în modul de rezervă)" #: core.cpp:2214 msgid "Retrieving CPU frequency in fallback mode" msgstr "Se obține frecvența procesorului în modul de rezervă" #: core.cpp:2220 msgid "failed to retrieve CPU frequency (fallback mode)" msgstr "a eșuat obținerea frecvenței procesorului (în modul de rezervă)" #: daemon_client.cpp:65 #, fuzzy #| msgid "Ask password to start daemon in background" msgid "Starting daemon in background…" msgstr "Cere parola la pornirea daemon-ului pe fundal" #: daemon_client.cpp:172 msgid "pkexec: authorization could not be obtained (dialog dismissed)" msgstr "pkexec: autorizarea nu a putut fi obținută (dialog respins)" #: daemon_client.cpp:175 msgid "pkexec: authorization could not be obtained (not authorized)" msgstr "pkexec: autorizarea nu a putut fi obținută (neautorizat)" #: daemon_client.cpp:178 msgid "pkexec: command not found" msgstr "pkexec: comanda nu a putut fi găsită" #: daemon_client.cpp:181 msgid "pkexec: unexpected error code" msgstr "pkexec: cod de eroare neașteptat" #: daemon_client.cpp:211 #, fuzzy #| msgid "Connected to daemon" msgid "Connecting to daemon…" msgstr "Connectat la daemon" #: daemon_server.cpp:261 #, c-format msgid "request_handler: case %i not handled" msgstr "request_handler: cazul %i nu este gestionat" #: data.cpp:124 cpu-x-gtk-3.12.ui:1370 msgid "CPU" msgstr "Procesor" #: data.cpp:187 #, fuzzy #| msgid "Score" msgid "P-core" msgstr "Scor" #: data.cpp:188 #, fuzzy #| msgid "Score" msgid "E-core" msgstr "Scor" #: data.cpp:189 data.cpp:192 #, fuzzy #| msgid "Core(s)" msgid "Core" msgstr "Nuclee" #: data.cpp:208 cpu-x-gtk-3.12.ui:746 msgid "Processor" msgstr "Procesor" #: data.cpp:240 data.cpp:329 cpu-x-gtk-3.12.ui:1968 msgid "Caches" msgstr "Memorii tampon" #: data.cpp:247 #, fuzzy, c-format #| msgid "%d x %d %s, %d-way" msgid "%2d x %4d %s, %2d-way" msgstr "%d x %d %s, %d-căi" #: data.cpp:249 #, c-format msgid "%d %s, %d-way" msgstr "%d %s, %d-căi" #: data.cpp:263 msgid "Count" msgstr "" #: data.cpp:276 cpu-x-gtk-3.12.ui:968 msgid "Clocks" msgstr "Tactările" #: data.cpp:379 data.cpp:383 #, fuzzy, c-format #| msgid "L%i Cache" msgid "L%u Cache" msgstr "Memoria tampon de nivel %i" #: data.cpp:385 #, c-format msgid "%s associative, %d-%s line size" msgstr "în %s asociativă, dimensiune line de %d-%s" #: data.cpp:398 msgid "Test" msgstr "Testare" #: data.cpp:409 data.cpp:423 cpu-x-gtk-3.12.ui:2146 cpu-x-gtk-3.12.ui:2517 msgid "Motherboard" msgstr "Placa de bază" #: data.cpp:437 cpu-x-gtk-3.12.ui:2367 msgid "BIOS" msgstr "Sistemul Intrare/Ieșire de bază (BIOS)" #: data.cpp:452 cpu-x-gtk-3.12.ui:2498 msgid "Chipset" msgstr "Cipsetul" #: data.cpp:467 data.cpp:569 cpu-x-gtk-3.12.ui:3156 cpu-x-gtk-3.12.ui:3761 msgid "Memory" msgstr "Memoria" #: data.cpp:483 #, c-format msgid "Stick %u" msgstr "" #: data.cpp:487 cpu-x-gtk-3.12.ui:3134 msgid "Sticks" msgstr "" #: data.cpp:541 cpu-x-gtk-3.12.ui:3780 msgid "System" msgstr "Sistemul" #: data.cpp:554 cpu-x-gtk-3.12.ui:3380 msgid "Operating System" msgstr "Sistemul de operare" #: data.cpp:587 cpu-x-gtk-3.12.ui:4960 msgid "Graphics" msgstr "Plăcile video" #: data.cpp:621 #, fuzzy, c-format #| msgid "Card %i" msgid "Card %u" msgstr "Placa %i" #: data.cpp:625 cpu-x-gtk-3.12.ui:4938 msgid "Cards" msgstr "Plăcile video" #: data.cpp:672 cpu-x-gtk-3.12.ui:5300 msgid "Bench" msgstr "Testarea performanței" #: data.cpp:685 msgid "Not started" msgstr "Neînceput" #: data.cpp:688 cpu-x-gtk-3.12.ui:5070 msgid "Prime numbers (slow)" msgstr "Numere prime (încet)" #: data.cpp:692 cpu-x-gtk-3.12.ui:5178 msgid "Prime numbers (fast)" msgstr "Numere prime (repede)" #: data.cpp:696 cpu-x-gtk-3.12.ui:5281 msgid "Parameters" msgstr "Parametrii" #: data.cpp:721 data.cpp:727 #, c-format msgid "%u mins" msgstr "%u minute" #: data.cpp:734 cpu-x-gtk-3.12.ui:5444 cpu-x-gtk-3.12.ui:5552 msgid "About" msgstr "Despre" #: data.cpp:739 #, c-format msgid "" "%s is a Free software that gathers information\n" "on CPU, motherboard and more." msgstr "" "%s este un program liber care adună informațiile\n" " despre procesor, placa de bază și alte dispozitive." #: data.cpp:744 #, fuzzy #| msgid "About" msgid "About CPU-X" msgstr "Despre" #: data.cpp:745 #, c-format msgid "Version %s" msgstr "Versiunea %s" #: data.cpp:746 #, c-format msgid "Author: %s" msgstr "Autorul: %s" #: data.cpp:747 #, c-format msgid "Site: %s" msgstr "Situl web: %s" #: data.cpp:751 cpu-x-gtk-3.12.ui:5533 msgid "License" msgstr "Licența" #: data.cpp:753 #, c-format msgid "This software is distributed under the terms of %s" msgstr "Acest program este distribuit sub termenii licenței %s" #: data.cpp:754 main.cpp:176 msgid "This program comes with ABSOLUTELY NO WARRANTY" msgstr "Acest program vine cu ABSOLUT NICIO GARANȚIE" #: gui_gtk.cpp:61 #, c-format msgid "Cannot find path for '%s' file" msgstr "" #: gui_gtk.cpp:400 msgid "Start daemon" msgstr "Pornește daemon-ul" #: gui_gtk.cpp:403 msgid "Connected to daemon" msgstr "Connectat la daemon" #: gui_gtk.cpp:406 msgid "No polkit authentication agent found" msgstr "Nu a fost găsit niciu agent de autentificare polkit" #: gui_gtk.cpp:411 msgid "Ask password to start daemon in background" msgstr "Cere parola la pornirea daemon-ului pe fundal" #: gui_gtk.cpp:415 msgid "Settings" msgstr "" #: gui_gtk.cpp:634 msgid "BaseFamily" msgstr "Familia de bază" #: gui_gtk.cpp:635 msgid "CPU display (\"true\") family (computed as BaseFamily+ExtendedFamily)" msgstr "" "Pentru procesor afișează (adevărat - „true”) familia (compusă ca Famila de " "bază + Familia extinsă)" #: gui_gtk.cpp:636 msgid "BaseModel" msgstr "Modelul de bază" #: gui_gtk.cpp:637 msgid "CPU display (\"true\") model (computed as (ExtendedModel<<4)+BaseModel)" msgstr "" "Pentru procesor afișează (adevărat - „true”) modelul (compus ca (modelul " "extins<<4)+Modelul de bază)" #: gui_gtk.cpp:847 msgid "" "Identify the physically-labeled socket or board position where the memory " "device is located" msgstr "" #: gui_gtk.cpp:848 msgid "Identify the physically labeled bank where the memory device is located" msgstr "" #: gui_gtk.cpp:1052 msgid "User Mode Driver Version" msgstr "Versiune ghidator mod utilizator" #: gui_gtk.cpp:1066 msgid "Vulkan Ray Tracing" msgstr "" #: gui_gtk.cpp:1260 msgid "Starting GTK GUI…" msgstr "Se pornește interfața grafică de tip GTK…" #: gui_gtk.cpp:1272 msgid "failed to import UI in GtkBuilder" msgstr "a eșuat importarea interfeței grafice în unealta GtkBuilder" #: main.cpp:63 msgid "Start graphical user interface (GUI) (default)" msgstr "Pornește interfața grafică cu utilizatorul (IGU) (implicit)" #: main.cpp:64 msgid "Start text-based user interface (TUI)" msgstr "Pornește interfața textuală cu utilizatorul (ITU)" #: main.cpp:65 msgid "Dump all data on standard output and exit" msgstr "Aruncă toate datele pe ieșirea standard și închide programul" #: main.cpp:66 msgid "Run embedded command dmidecode and exit" msgstr "Rulează comanda dmidecode integrată și închide programul" #: main.cpp:67 msgid "Run embedded command bandwidth and exit" msgstr "Rulează comanda lățimii de bandă și închide programul" #: main.cpp:68 msgid "Set temperature unit (c[elsius]|f[ahrenheit]|k[elvin]|r[ankine])" msgstr "" #: main.cpp:69 msgid "Set custom time between two refreshes (in seconds)" msgstr "" "Stabilește o durată personalizată între două reîmprospătări (în secunde)" #: main.cpp:70 msgid "Set default tab (integer)" msgstr "Stabiliți pagina implicită (întreg)" #: main.cpp:71 #, fuzzy #| msgid "Select CPU core to monitor (integer)" msgid "Select core type to monitor (integer)" msgstr "Selectați nucleul procesorului de monitorizat (întreg)" #: main.cpp:72 msgid "Select CPU core to monitor (integer)" msgstr "Selectați nucleul procesorului de monitorizat (întreg)" #: main.cpp:73 msgid "Set custom bandwidth test for CPU caches speed (integer)" msgstr "" "Stabiliți testul cu lățime de bandă personalizată pentru memoriile tampon " "ale procesorului (întreg)" #: main.cpp:74 #, fuzzy #| msgid "Select default graphic card (integer)" msgid "Select default memory stick (integer)" msgstr "Selectați placa video implicită (întreg)" #: main.cpp:75 msgid "Select default graphic card (integer)" msgstr "Selectați placa video implicită (întreg)" #: main.cpp:76 cpu-x-gtk-3.12.ui:5910 msgid "Start and connect to daemon" msgstr "Pornește și conectează-te la daemon" #: main.cpp:77 msgid "Verbose output" msgstr "Ieșire detaliată" #: main.cpp:78 msgid "Print help and exit" msgstr "Tipărește ajutorul și închide programul" #: main.cpp:79 msgid "Print version and exit" msgstr "Tipărește versiunea și închide programul" #: main.cpp:80 msgid "Print CPUID values in decimal (default is hexadeximal)" msgstr "" "Tipărește indentificatorul procesorului în zecimal (implicit este în " "hexazecimal)" #: main.cpp:81 msgid "Disable colored output" msgstr "Dezactivează ieșirea colorată" #: main.cpp:82 msgid "Print information for debugging" msgstr "Tipărește informațiile de depanare" #: main.cpp:83 msgid "Print required information to paste in an issue" msgstr "Tipărește informațiile necesare de lipit într-un defect" #: main.cpp:84 msgid "Set key mapping for NCurses mode (a[rrows]|e[macs]|i[nverted-T]|v[im])" msgstr "" "Stabilește asocierea tastelor pentru modul NCurses (a[rrows]|e[macs]|" "i[nverted-T]|v[im])" #: main.cpp:95 msgid "Add default command line arguments" msgstr "Adaugă argumente implicite pentru linia de comandă" #: main.cpp:96 msgid "Enforce the bus clock" msgstr "Impune tactarea magistralei" #: main.cpp:97 msgid "" "Ignore CPU values reported by libcpuid (comma-separated values among 'temp', " "'volt' and 'freq')" msgstr "" #: main.cpp:98 msgid "Read CPUID raw data from a given file" msgstr "Citește datele crude CPUID dintr-un fișier dat" #: main.cpp:99 msgid "Only print a message if CPU is not present in the database" msgstr "Arată doar un mesaj dacă procesorul nu este prezent în baza de date" #: main.cpp:126 #, c-format msgid "Usage: %s DISPLAY [OPTIONS]\n" msgstr "Folosire: %s AFIȘAJ [OPȚIUNI]\n" #: main.cpp:127 msgid "Available DISPLAY:" msgstr "AFIȘAJ disponibil:" #: main.cpp:135 msgid "Available OPTIONS:" msgstr "OPȚIUNI disponibile:" #: main.cpp:144 msgid "Influenceable environment variables:" msgstr "Variabile de mediu influențabile:" #: main.cpp:175 msgid "This is free software: you are free to change and redistribute it." msgstr "" "Acesta este software liber: sunteți liber(ă) să îl schimbați și " "redistribuiți." #: main.cpp:177 #, c-format msgid "See the %s license: <%s>\n" msgstr "Vedeți licența %s: <%s>\n" #: main.cpp:184 #, c-format msgid "-- %-9s version: %s" msgstr "-- %-9s versiunea: %s" #: main.cpp:381 #, fuzzy, c-format #| msgid "" #| "\n" #| "%sOops, something was wrong! %s has received signal %d (%s) and has " #| "crashed.%s" msgid "" "\n" "Oops, something was wrong! %s has received signal %d (%s) and has crashed." msgstr "" "\n" "%sOpa, ceva a fost greșit! %s a primit semnalul %d (%s) și a picat.%s" #: main.cpp:383 #, fuzzy, c-format #| msgid "" #| "\n" #| "%sOops, something was wrong! %s has received signal %d (%s) and has " #| "crashed.%s" msgid "" "\n" "Oops, something was wrong! %s has received signal %d (%s) and is trying to " "recover." msgstr "" "\n" "%sOpa, ceva a fost greșit! %s a primit semnalul %d (%s) și a picat.%s" #: main.cpp:407 msgid "You can open a new issue here, by filling the template as requested:" msgstr "" #: main.cpp:449 msgid "an error occurred while setting locale" msgstr "o eroare a apărut în timp ce se stabilea locația de limbă" #: options.cpp:124 #, c-format msgid "" "Selected CPU type (%u) is not a valid number (%u is the maximum for this CPU)" msgstr "" #: options.cpp:145 #, c-format msgid "" "Selected bandwidth test (%u) is not a valid number (%u is the maximum for " "this system)" msgstr "" #: options.cpp:168 #, c-format msgid "" "Selected RAM stick (%u) is not a valid number (%u is the maximum for this " "system)" msgstr "" #: options.cpp:188 #, c-format msgid "" "Selected graphic card (%u) is not a valid number (%u is the maximum for this " "system)" msgstr "" #: options.cpp:204 #, c-format msgid "failed to change CPU affinitiy to core %u" msgstr "" #: options.cpp:210 #, c-format msgid "" "Selected CPU core (%u) is not a valid number (%u is the maximum for this " "type of core)" msgstr "" #: options.cpp:284 #, c-format msgid "Selected tab (%u) is not a valid number (%u is the maximum)" msgstr "" #: tui_ncurses.cpp:111 msgid "Window is too small!" msgstr "Fereastra este prea mică!" #: tui_ncurses.cpp:119 msgid "Press 'h' to see help." msgstr "Apăsați litera „h” pentru a vedea ajutorul." #: tui_ncurses.cpp:232 #, c-format msgid "Welcome in %s NCurses help!\n" msgstr "Bun venit în ajutorul de tip NCurses pentru %s!\n" #: tui_ncurses.cpp:233 msgid "This help describes how to use this Text-based User Interface." msgstr "" "Acest ajutor descrie cum să folosiți această interfață cu utilizatorul " "bazată pe text." #: tui_ncurses.cpp:235 msgid "Global keys:" msgstr "Taste globale:" #: tui_ncurses.cpp:236 #, fuzzy #| msgid "Press 'left' key to switch in left tab." msgid "Press 'left' key or 'tab' key to switch in left tab." msgstr "Apăsați tasta „stânga” pentru a comuta la tabul din stânga." #: tui_ncurses.cpp:237 #, fuzzy #| msgid "Press 'right' key to switch in right tab." msgid "Press 'right' key or 'shift + tab' keys to switch in right tab." msgstr "Apăsați tasta „dreapta” pentru a comuta la tabul din dreapta." #: tui_ncurses.cpp:238 msgid "Press 'h' key to see this help." msgstr "Apăsați tasta „h” pentru a vedea acest ajutor." #: tui_ncurses.cpp:239 msgid "Press 'q' key to exit." msgstr "Apăsați tasta „q” key pentru a închide programul." #: tui_ncurses.cpp:241 msgid "CPU tab:" msgstr "Pagina procesorului:" #: tui_ncurses.cpp:242 #, fuzzy #| msgid "Press 'down' key to decrease core number to monitor." msgid "Press 'next page' key to decrease core type number to monitor." msgstr "Apăsați tasta „jos” pentru a scade numărul nucleelor de monitorizat." #: tui_ncurses.cpp:243 #, fuzzy #| msgid "Press 'up' key to increase core number to monitor." msgid "Press 'previous page' key to increase core type number to monitor." msgstr "Apăsați tasta „sus” pentru a crește numărul nucleelor de monitorizat." #: tui_ncurses.cpp:244 #, fuzzy #| msgid "Press 'down' key to decrease core number to monitor." msgid "Press 'down' key to decrease CPU core number to monitor." msgstr "Apăsați tasta „jos” pentru a scade numărul nucleelor de monitorizat." #: tui_ncurses.cpp:245 #, fuzzy #| msgid "Press 'up' key to increase core number to monitor." msgid "Press 'up' key to increase CPU core number to monitor." msgstr "Apăsați tasta „sus” pentru a crește numărul nucleelor de monitorizat." #: tui_ncurses.cpp:247 msgid "Caches tab:" msgstr "Pagina memoriilor tampon:" #: tui_ncurses.cpp:248 msgid "Press 'down' key to switch to previous test." msgstr "Apăsați tasta „jos” pentru a comuta la testul anterior." #: tui_ncurses.cpp:249 #, fuzzy #| msgid "Press 'up' key' to switch to next test." msgid "Press 'up' key to switch to next test." msgstr "Apăsați tasta „sus” pentru a comuta la testul următor." #: tui_ncurses.cpp:251 msgid "Bench tab:" msgstr "Pagina testarea performanței:" #: tui_ncurses.cpp:252 msgid "Press 'down' key to decrement benchmark duration." msgstr "Apăsați tasta „jos” pentru a scade durata testării performanței." #: tui_ncurses.cpp:253 msgid "Press 'up' key to increment benchmark duration." msgstr "Apăsați tasta „sus” pentru a crește durata testării performanței." #: tui_ncurses.cpp:254 msgid "Press 'next page' key to decrement number of threads to use." msgstr "" "Apăsați tasta „pagina următoare” pentru a crește numărul de fire de execuție " "folosite." #: tui_ncurses.cpp:255 msgid "Press 'previous page' key to increment number of threads to use." msgstr "" "Apăsați tasta „pagina anterioară” pentru a crește numărul de fire de " "execuție folosite." #: tui_ncurses.cpp:256 msgid "Press 's' key to start/stop prime numbers (slow) benchmark." msgstr "" "Apăsați tasta „s” pentru a porni/opri testarea performanței cu numere prime " "(înceată)." #: tui_ncurses.cpp:257 msgid "Press 'f' key to start/stop prime numbers (fast) benchmark." msgstr "" "Apăsați tasta „f” pentru a porni/opri testarea performanței cu numere prime " "(rapidă)." #: tui_ncurses.cpp:259 msgid "Graphics tab:" msgstr "Pagina plăcilor video:" #: tui_ncurses.cpp:260 msgid "Press 'down' key to switch to previous graphic card." msgstr "Apăsați tasta „jos” pentru a comuta la placa video anterioară." #: tui_ncurses.cpp:261 msgid "Press 'up' key to switch to next graphic card." msgstr "Apăsați tasta „sus” pentru a comuta la placa video următoare." #: tui_ncurses.cpp:263 msgid "Press any key to exit this help." msgstr "Apăsați orice tasă pentru a ieși din acest ajutor." #: tui_ncurses.cpp:640 msgid "Starting NCurses TUI…" msgstr "Se porntește interfața textuală NCurses…" #: tui_ncurses.cpp:649 msgid "" "FATAL ERROR: terminfo database could not be found (try to set TERMINFO " "environment variable)" msgstr "" "EROARE FATALĂ: baza de date terminfo nu a putut fi găsită (încercați să " "stabiliți variabila de mediu TERMINFO)" #: tui_ncurses.cpp:654 #, c-format msgid "Failed to set up %s terminal (err=%i); falling back to %s" msgstr "A eșuat instalarea terminalului %s (eroarea=%i); se revine la %s" #: util.cpp:189 #, c-format msgid "cannot find unit in '%s' string at position %i" msgstr "Nu a putut fi găsit șirul „%s” la poziția %i" #: util.cpp:252 #, fuzzy, c-format #| msgid "an error occurred while opening file '%s' (%s)" msgid "an error occurred while opening file '%s'" msgstr "a apărut o eroare în timp ce se deschidea fișierul „%s” (%s)" #: util.cpp:297 #, fuzzy, c-format #| msgid "an error occurred while running command '%s' (%s)" msgid "an error occurred while running command '%s'" msgstr "a apărut o eroare în timp ce se rula comanda „%s” (%s)" #: util.cpp:437 msgid "set_cpu_affinity() not supported on this operating system" msgstr "" #: data.hpp:103 data.hpp:244 data.hpp:332 msgid "Vendor" msgstr "Furnizor" #: data.hpp:104 msgid "Code Name" msgstr "Numele de cod" #: data.hpp:105 msgid "Package" msgstr "Pachetul" #: data.hpp:106 msgid "Technology" msgstr "Tehnologia" #: data.hpp:107 data.hpp:268 msgid "Voltage" msgstr "Voltajul" #: data.hpp:108 msgid "Specification" msgstr "Specificația" #: data.hpp:109 msgid "Family" msgstr "Familia" #: data.hpp:110 msgid "Disp. Family" msgstr "Afișarea familiei" #: data.hpp:111 data.hpp:224 data.hpp:245 data.hpp:335 msgid "Model" msgstr "Modelul" #: data.hpp:112 msgid "Disp. Model" msgstr "Afișarea modelului" #: data.hpp:113 msgid "Temp." msgstr "Temperatura" #: data.hpp:114 msgid "Stepping" msgstr "Revizia" #: data.hpp:115 msgid "Instructions" msgstr "Instrucțiunile" #: data.hpp:125 msgid "L1 Data" msgstr "Date N1" #: data.hpp:126 msgid "L1 Inst." msgstr "Instrucț. N1" #: data.hpp:127 msgid "Level 2" msgstr "N2" #: data.hpp:128 msgid "Level 3" msgstr "N3" #: data.hpp:137 cpu-x-gtk-3.12.ui:1232 #, fuzzy #| msgid "Core(s)" msgid "Cores" msgstr "Nuclee" #: data.hpp:138 data.hpp:408 cpu-x-gtk-3.12.ui:1252 msgid "Threads" msgstr "Fire" #: data.hpp:155 msgid "Core Speed" msgstr "Viteza nucleelor" #: data.hpp:156 msgid "Multiplier" msgstr "Multiplicatorul" #: data.hpp:157 msgid "Bus Speed" msgstr "Viteza magistralei" #: data.hpp:158 data.hpp:341 msgid "Usage" msgstr "Folosirea" #: data.hpp:188 data.hpp:265 msgid "Size" msgstr "Dimensiunea" #: data.hpp:189 data.hpp:267 msgid "Speed" msgstr "Viteza" #: data.hpp:223 data.hpp:259 msgid "Manufacturer" msgstr "Producătorul" #: data.hpp:225 msgid "Revision" msgstr "Revizia" #: data.hpp:233 msgid "Brand" msgstr "Marca" #: data.hpp:234 msgid "Version" msgstr "Versiunea" #: data.hpp:235 msgid "Date" msgstr "Data" #: data.hpp:236 msgid "ROM Size" msgstr "Dimensiunea ROM" #: data.hpp:260 msgid "Part Number" msgstr "" #: data.hpp:261 #, fuzzy #| msgid "Core #%i" msgid "Type" msgstr "Nucleu #%i" #: data.hpp:262 #, fuzzy #| msgid "Core #%i" msgid "Type Detail" msgstr "Nucleu #%i" #: data.hpp:263 msgid "Device Locator" msgstr "" #: data.hpp:264 msgid "Bank Locator" msgstr "" #: data.hpp:266 msgid "Rank" msgstr "" #: data.hpp:292 #, fuzzy #| msgid "Code Name" msgid "Name" msgstr "Numele de cod" #: data.hpp:293 msgid "Kernel" msgstr "Nucleul" #: data.hpp:294 msgid "Hostname" msgstr "Numele de gazdă" #: data.hpp:295 msgid "Uptime" msgstr "Durata de funcționare" #: data.hpp:303 msgid "Used" msgstr "Folosită" #: data.hpp:304 msgid "Buffers" msgstr "Prestocări" #: data.hpp:305 msgid "Cached" msgstr "Prealocată" #: data.hpp:306 msgid "Free" msgstr "Liberă" #: data.hpp:307 msgid "Swap" msgstr "De schimb" #: data.hpp:333 msgid "Driver" msgstr "Ghidatorul" #: data.hpp:334 msgid "UMD Version" msgstr "Versiunea UMD" #: data.hpp:336 msgid "Compute Unit" msgstr "Unitatea computațională" #: data.hpp:337 #, fuzzy #| msgid "DeviceID" msgid "Device ID" msgstr "Identifiatorul dispozitivului" #: data.hpp:338 #, fuzzy #| msgid "Version" msgid "VBIOS Version" msgstr "Versiunea" #. #-#-#-#-# source_ui.pot (cpu-x ) #-#-#-#-# #. Setting: "Interface" tab #: data.hpp:339 cpu-x-gtk-3.12.ui:5807 msgid "Interface" msgstr "Interfața" #: data.hpp:340 msgid "Temperature" msgstr "Temperatura" #: data.hpp:342 msgid "Core Voltage" msgstr "Voltajul nucleului" #: data.hpp:343 msgid "Power Avg" msgstr "Media energiei electrice" #: data.hpp:344 #, fuzzy #| msgid "Memory clock" msgid "Core Clock" msgstr "Tactarea memoriei" #: data.hpp:345 #, fuzzy #| msgid "Memory clock" msgid "Memory Clock" msgstr "Tactarea memoriei" #: data.hpp:346 msgid "Memory Used" msgstr "Memoria folosită" #: data.hpp:347 msgid "Resizable BAR" msgstr "BAR redimensionabil" #: data.hpp:348 msgid "Vulkan RT" msgstr "" #: data.hpp:349 #, fuzzy #| msgid "Version" msgid "OpenGL Version" msgstr "Versiunea" #: data.hpp:350 #, fuzzy #| msgid "Version" msgid "Vulkan Version" msgstr "Versiunea" #: data.hpp:351 #, fuzzy #| msgid "Version" msgid "OpenCL Version" msgstr "Versiunea" #: data.hpp:387 msgid "Score" msgstr "Scor" #: data.hpp:388 msgid "Run" msgstr "Rulare" #: data.hpp:407 msgid "Duration" msgstr "Durată" #: util.hpp:77 msgid "bytes" msgstr "octeți" #. TRANSLATORS: initials for kilobyte (10³): please put initials (keep it short) #: util.hpp:80 msgid "kB" msgstr "kO" #. TRANSLATORS: initials for megabyte (10⁶): please put initials (keep it short) #: util.hpp:82 msgid "MB" msgstr "MO" #. TRANSLATORS: initials for gigabyte (10⁹): please put initials (keep it short) #: util.hpp:84 msgid "GB" msgstr "GO" #. TRANSLATORS: initials for terabyte (10¹²): please put initials (keep it short) #: util.hpp:86 msgid "TB" msgstr "TO" #. TRANSLATORS: initials for kibibyte (2¹⁰): please put initials (keep it short) #: util.hpp:89 msgid "KiB" msgstr "KiO" #. TRANSLATORS: initials for mebibyte (2²⁰): please put initials (keep it short) #: util.hpp:91 msgid "MiB" msgstr "MiO" #. TRANSLATORS: initials for gibibyte (2³⁰): please put initials (keep it short) #: util.hpp:93 msgid "GiB" msgstr "GiO" #. TRANSLATORS: initials for tebibyte (2⁴⁰): please put initials (keep it short) #: util.hpp:95 msgid "TiB" msgstr "TiO" #: cpu-x-gtk-3.12.ui:1184 msgid "Cache" msgstr "Memoria tampon (cache)" #. Setting: refresh time for UI #: cpu-x-gtk-3.12.ui:5721 msgid "Refresh time" msgstr "" #. Setting: GUI theme #: cpu-x-gtk-3.12.ui:5745 msgid "Text theme" msgstr "" #. Setting: automatic GUI theme #: cpu-x-gtk-3.12.ui:5760 msgid "Automatic" msgstr "" #. Setting: light GUI theme #: cpu-x-gtk-3.12.ui:5761 msgid "Blue for light theme" msgstr "" #. Setting: dark GUI theme #: cpu-x-gtk-3.12.ui:5762 msgid "Yellow for dark theme" msgstr "" #. Setting: temperature unit #: cpu-x-gtk-3.12.ui:5775 #, fuzzy #| msgid "Temperature" msgid "Temperature unit" msgstr "Temperatura" #. Setting: default tab at startup #: cpu-x-gtk-3.12.ui:5826 msgid "Default tab" msgstr "" #. Setting: default CPU core at startup #: cpu-x-gtk-3.12.ui:5839 msgid "Default CPU core" msgstr "" #. Setting: default cache test at startup #: cpu-x-gtk-3.12.ui:5852 msgid "Default cache test" msgstr "" #. Setting: print CPUID values in decimal or hexadecimal #: cpu-x-gtk-3.12.ui:5895 #, fuzzy #| msgid "Print CPUID values in decimal (default is hexadeximal)" msgid "Print CPUID values in decimal" msgstr "" "Tipărește indentificatorul procesorului în zecimal (implicit este în " "hexazecimal)" #. Setting: default graphic card at startup #: cpu-x-gtk-3.12.ui:5928 #, fuzzy #| msgid "Select default graphic card (integer)" msgid "Default graphic card" msgstr "Selectați placa video implicită (întreg)" #. Setting: default CPU core at startup #: cpu-x-gtk-3.12.ui:5952 msgid "Default core type" msgstr "" #. Setting: default graphic card at startup #: cpu-x-gtk-3.12.ui:5976 msgid "Default memory stick" msgstr "" #. Setting: "Startup" tab #: cpu-x-gtk-3.12.ui:6004 msgid "Startup" msgstr "" #~ msgid "Calculating CPU multipliers" #~ msgstr "Se calculează multiplicatorii procesorului" #, c-format #~ msgid "Current: PCIe Gen%1dx%d / Max: Gen%1dx%d" #~ msgstr "Actual: PCIe Gen%1dx%d / Maxim: Gen%1dx%d" #~ msgid "failed to retrieve GPU clocks" #~ msgstr "a eșuat obținerea tactărilor plăcii video" #, c-format #~ msgid "Core #%i" #~ msgstr "Nucleu #%i" #~ msgid "Setting label names" #~ msgstr "Stabilirea numelor etichetelor" #, c-format #~ msgid "Bank %i" #~ msgstr "Banca %i" #~ msgid "Reference" #~ msgstr "Referința" #~ msgid "Distribution" #~ msgstr "Distribuția" #~ msgid "Compiler" #~ msgstr "Compilatorul" #~ msgid "GPU clock" #~ msgstr "Tactarea procesorului grafic" #~ msgid "Dumping data…" #~ msgstr "Se aruncă datele…" #~ msgid "Freeing memory" #~ msgstr "Se eliberează memoria" #~ msgid "Ignore CPU frequency reported by libcpuid" #~ msgstr "Ignoră frecvența procesorului raportată de libcpuid" #, c-format #~ msgid "failed to call wordexp (%i)" #~ msgstr "a eșuat apelarea wordexp (%i)" #, fuzzy #~| msgid "Press 'left' key to switch in left tab." #~ msgid "Press 'home' key to scroll up in a page." #~ msgstr "Apăsați tasta „stânga” pentru a comuta la tabul din stânga." #, fuzzy #~| msgid "Press 'left' key to switch in left tab." #~ msgid "Press 'end' key to scroll down in a page." #~ msgstr "Apăsați tasta „stânga” pentru a comuta la tabul din stânga." #, c-format #~ msgid "String '%s' is too long, truncating…" #~ msgstr "Șirul „%s” este prea lung, se taie…" #, c-format #~ msgid "failed to open %s directory" #~ msgstr "a eșuat deschiderea directorului %s" #~ msgid "an error occurred while compiling regex" #~ msgstr "o eroare a apărut în timp ce se compila expresia regulată" #~ msgid "FATAL ERROR: could not allocate memory" #~ msgstr "EROARE FATALĂ: nu s-a putut aloca memorie" #, fuzzy, c-format #~| msgid "failed to call wordexp (%i)" #~ msgid "failed to call vkEnumerateInstanceExtensionProperties (%s)" #~ msgstr "a eșuat apelarea wordexp (%i)" #, c-format #~ msgid "%s" #~ msgstr "%s" #, fuzzy #~| msgid "There is no platform with OpenCL support (%s)" #~ msgid "There is no device with Vulkan support" #~ msgstr "Nu există nicio platformă cu sprijin pentru OpenCL (%s)" #~ msgid "Socket(s)" #~ msgstr "Socluri" #~ msgid "Thread(s)" #~ msgstr "Fire" #~ msgid "You can paste this backtrace by opening a new issue here:" #~ msgstr "" #~ "Puteți să lipiți această urmă înapoi prin deschiderea unei probleme noi " #~ "aici:" CPU-X-5.0.3/po/ru.po000066400000000000000000001477661454622605200140120ustar00rootroot00000000000000# Copyright © 2014-2024 The Tumultuous Unicorn Of Darkness # This file is distributed under the same license as the CPU-X package. # Translators: # TotalCaesar659 , 2016,2018 # Andrei Stepanov , 2020, 2021, 2022, 2023. # Artem , 2020. # Alex , 2020. # Виктор Ерухин , 2021. # Andrey F. , 2021. # vadimkozhin , 2021. # Axus Wizix , 2021. # S3aBreeze , 2021, 2022. # Axus Wizix , 2022. # antohami , 2022. # Alexey Dokuchaev , 2023. # Артём Котлубай , 2023. # Aleksandr Melman , 2023. msgid "" msgstr "" "Project-Id-Version: CPU-X\n" "Report-Msgid-Bugs-To: https://github.com/TheTumultuousUnicornOfDarkness/CPU-" "X/issues\n" "POT-Creation-Date: 2023-12-09 13:09+0100\n" "PO-Revision-Date: 2023-12-10 08:16+0000\n" "Last-Translator: Andrei Stepanov \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=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && " "n%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || " "(n%100>=11 && n%100<=14)? 2 : 3);\n" "X-Generator: Weblate 5.3-dev\n" #: core.cpp:135 msgid "Finding CPU technology" msgstr "Определяется технология ЦП" #: core.cpp:161 #, c-format msgid "" "Your CPU is not present in the database ==> %s, model: %i, ext. model: %i, " "ext. family: %i" msgstr "" "Ваш ЦП отсутствует в базе данных ==> %s, модель: %i, доп. модель: %i, доп. " "семейство: %i" #: core.cpp:189 data.cpp:150 data.cpp:342 msgid "unknown" msgstr "неизвестно" #: core.cpp:230 msgid "Calling libcpuid for retrieving static data" msgstr "Вызывается libcpuid для получения статических данных" #: core.cpp:245 #, c-format msgid "failed to call libcpuid (%s)" msgstr "не удалось вызвать libcpuid (%s)" #: core.cpp:340 msgid "Calling libcpuid for retrieving dynamic data" msgstr "Вызывается libcpuid для получения динамических данных" #: core.cpp:353 msgid "Calling libcpuid for retrieving CPU MSR static values" msgstr "" "Вызывается libcpuid для получения статических значений моделезависимых " "регистров ЦП" #: core.cpp:380 msgid "Calling libcpuid for retrieving CPU MSR dynamic values" msgstr "" "Вызывается libcpuid для получения динамических значений моделезависимых " "регистров ЦП" #: core.cpp:412 msgid "Calling dmidecode" msgstr "Вызывается dmidecode" #: core.cpp:454 core.cpp:473 #, c-format msgid "%s (configured)" msgstr "%s (настроено)" #: core.cpp:461 core.cpp:480 #, c-format msgid "%s (max)" msgstr "%s (макс.)" #: core.cpp:466 #, c-format msgid "%s (min)" msgstr "%s (мин.)" #: core.cpp:496 msgid "Calculating CPU usage" msgstr "Вычисление использования ЦП" #: core.cpp:546 msgid "Calling bandwidth" msgstr "Вызов bandwidth" #: core.cpp:613 #, c-format msgid "" "pci_access is not properly initialized: it is a common issue when %s was " "built with a lower libpci version.\n" "Check that libpci %s library is present on your system. Otherwise, please " "rebuild %s." msgstr "" "pci_access не был правильно загружен: это частая проблема, когда %s был " "собран с более ранней версией libpci.\n" "Проверьте, что библиотека libpci %s присутствует в вашей системе. В " "противном случае, пожалуйста, пересоберите %s." #: core.cpp:657 #, c-format msgid "No kernel driver in use for graphic card at path %s" msgstr "В ядре нет драйвера для видеокарты по адресу %s" #: core.cpp:693 #, c-format msgid "Your GPU kernel driver is unknown: %s" msgstr "Ваш драйвер ядра ГП неизвестен: %s" #: core.cpp:777 #, c-format msgid "Your GPU user mode driver is unknown for vendor %s: %s" msgstr "" "Ваш драйвер ГП пользовательского режима неизвестен производителю %s: %s" #: core.cpp:781 #, c-format msgid "failed to call GLFW (%i): %s" msgstr "не удалось вызвать GLFW (%i): %s" #: core.cpp:914 msgid "Finding Vulkan API version" msgstr "Определение версии API Vulkan" #: core.cpp:926 #, c-format msgid "failed to call vkCreateInstance (%s)" msgstr "не удалось вызвать vkCreateInstance (%s)" #: core.cpp:929 #, c-format msgid "%s is not supported" msgstr "%s не поддерживается" #: core.cpp:937 #, c-format msgid "failed to call vkEnumeratePhysicalDevices (%s)" msgstr "не удалось вызвать vkEnumeratePhysicalDevices (%s)" #: core.cpp:944 msgid "No available Vulkan devices" msgstr "Нет доступных устройств Vulkan" #: core.cpp:952 #, c-format msgid "No available physical devices (%s)" msgstr "Нет доступных физических устройств (%s)" #: core.cpp:1015 #, c-format msgid "Failed to create Vulkan for device %u (%s)" msgstr "Не удалось создать Vulkan для устройства %u (%s)" #: core.cpp:1019 #, c-format msgid "%s is not supported for device %u, use only deviceID for matching" msgstr "" "%s не поддерживается для устройства %u, используйте только идентификатор " "устройства для соответствия" #: core.cpp:1051 core.cpp:1364 msgid "Enabled" msgstr "Включено" #: core.cpp:1051 core.cpp:1364 msgid "Disabled" msgstr "Отключено" #: core.cpp:1088 msgid "Finding OpenCL API version" msgstr "Определяется версия API OpenCL" #: core.cpp:1092 #, c-format msgid "There is no platform with OpenCL support (%s)" msgstr "Нет платформы с поддержкой OpenCL (%s)" #: core.cpp:1102 #, c-format msgid "failed to get all OpenCL platforms (%s)" msgstr "не удалось определить все платформы OpenCL (%s)" #: core.cpp:1115 #, c-format msgid "failed to get name for platform %u (%s)" msgstr "не удалось определить название платформы %u (%s)" #: core.cpp:1123 #, c-format msgid "failed to get version for platform %u (%s)" msgstr "не удалось определить версию платформы %u (%s)" #: core.cpp:1131 #, c-format msgid "failed to find number of OpenCL devices for platform '%s %s' (%s)" msgstr "не удалось определить число устройств OpenCL платформы «%s %s» (%s)" #: core.cpp:1131 msgid "0 device" msgstr "устройство 0" #: core.cpp:1140 #, c-format msgid "failed to get all of OpenCL devices for platform '%s %s' (%s)" msgstr "не удалось определить все устройства OpenCL платформы «%s %s» (%s)" #: core.cpp:1160 #, c-format msgid "failed to get name for device %u (%s)" msgstr "не удалось определить имя устройства %u (%s)" #: core.cpp:1168 #, c-format msgid "failed to get version for device %u (%s)" msgstr "не удалось определить версию устройства %u (%s)" #: core.cpp:1190 #, c-format msgid "OpenCL driver for '%s %s' does not support CL_DEVICE_TOPOLOGY_AMD (%s)" msgstr "Драйвер OpenCL для «%s %s» не поддерживает CL_DEVICE_TOPOLOGY_AMD (%s)" #: core.cpp:1201 #, c-format msgid "" "OpenCL driver for '%s %s' does not support CL_DEVICE_GFXIP_MAJOR_AMD (%s)" msgstr "" "Драйвер OpenCL для «%s %s» не поддерживает CL_DEVICE_GFXIP_MAJOR_AMD (%s)" #: core.cpp:1209 core.cpp:1229 core.cpp:1262 #, c-format msgid "" "OpenCL driver for '%s %s' does not support CL_DEVICE_MAX_COMPUTE_UNITS (%s)" msgstr "" "Драйвер OpenCL для «%s %s» не поддерживает CL_DEVICE_MAX_COMPUTE_UNITS (%s)" #: core.cpp:1250 #, c-format msgid "" "OpenCL driver for '%s %s' does not support CL_DEVICE_PCI_DOMAIN_ID_NV (%s), " "CL_DEVICE_PCI_BUS_ID_NV (%s) or CL_DEVICE_PCI_SLOT_ID_NV (%s)" msgstr "" "Драйвер OpenCL для «%s %s» не поддерживает CL_DEVICE_PCI_DOMAIN_ID_NV (%s), " "CL_DEVICE_PCI_BUS_ID_NV (%s) или CL_DEVICE_PCI_SLOT_ID_NV (%s)" #: core.cpp:1273 #, c-format msgid "OpenCL is not supported with your GPU vendor (0x%X)" msgstr "OpenCL не поддерживается вашим производителем ГП (0x%X)" #: core.cpp:1295 msgid "Finding devices" msgstr "Поиск устройств" #: core.cpp:1307 #, c-format msgid "Skip devices search (wrong permissions on %s device)" msgstr "Пропустить поиск устройств (некорректные права на устройстве %s)" #: core.cpp:1350 #, c-format msgid "Your GPU vendor is unknown: %s (0x%X)" msgstr "Неизвестный производитель ГП: %s (0x%X)" #: core.cpp:1370 msgid "failed to find chipset vendor and model" msgstr "не удалось определить производителя и модель чипсета" #: core.cpp:1385 msgid "failed to find graphic card vendor and model" msgstr "не удалось определить производителя и модель видеокарты" #: core.cpp:1487 msgid "Retrieving GPU clocks" msgstr "Получение частоты ГП" #: core.cpp:1500 msgid "None" msgstr "Отсутствует" #: core.cpp:1509 #, c-format msgid "DRM path for %s is unknown" msgstr "Путь DRM для %s неизвестен" #: core.cpp:1516 #, c-format msgid "Card number for %s is unknown" msgstr "Номер карты для %s неизвестен" #: core.cpp:1541 #, c-format msgid "PCIe %s (current) / %s (max)" msgstr "PCIe %s (текущий) / %s (макс.)" #: core.cpp:1650 #, c-format msgid "Driver for %s doesn't report frequencies" msgstr "Драйвер %s не сообщает значения частоты" #: core.cpp:1671 #, c-format msgid "failed to retrieve all monitoring data for %s" msgstr "не удалось получить все данные мониторинга для %s" #: core.cpp:1694 msgid "Identifying running system" msgstr "Определение запущенной системы" #: core.cpp:1697 msgid "failed to identify running system" msgstr "не удалось определить запущенную систему" #: core.cpp:1749 core.cpp:1778 msgid "Calling libprocps" msgstr "Вызов libprocps" #: core.cpp:1752 msgid "unable to get system uptime" msgstr "не удаётся получить время работы системы" #: core.cpp:1758 msgid "unable to create meminfo structure" msgstr "не удаётся создать структуру meminfo" #: core.cpp:1804 msgid "Calling libstatgrab" msgstr "Вызов libstatgrab" #: core.cpp:1852 #, c-format msgid "%i days, %i hours, %i minutes, %i seconds" msgstr "%i дн., %i ч, %i м, %i с" #: core.cpp:1915 msgid "Updating benchmark status" msgstr "Обновление состояния бенчмарка" #: core.cpp:1918 msgid "Active" msgstr "Активен" #: core.cpp:1921 #, c-format msgid "(%u hours left)" msgstr "(осталось %u ч)" #: core.cpp:1923 #, c-format msgid "(%u minutes left)" msgstr "(осталось %u м)" #: core.cpp:1925 #, c-format msgid "(%u seconds left)" msgstr "(осталось %u с)" #: core.cpp:1929 core.cpp:1984 core.cpp:1985 msgid "Inactive" msgstr "Неактивен" #: core.cpp:1932 #, c-format msgid "in %u hours" msgstr "за %u ч" #: core.cpp:1934 #, c-format msgid "in %u minutes" msgstr "за %u м" #: core.cpp:1936 #, c-format msgid "in %u seconds" msgstr "за %u с" #: core.cpp:1953 #, c-format msgid "Starting benchmark with %u threads" msgstr "Запускается бенчмарк с %u потоками" #: core.cpp:1976 msgid "an error occurred while starting benchmark" msgstr "ошибка при запуске бенчмарка" #: core.cpp:2002 msgid "Finding CPU package in fallback mode" msgstr "Поиск корпусировки ЦП в режиме с откатом" #: core.cpp:2032 #, c-format msgid "Your CPU socket is not present in the database ==> %s, codename: %s" msgstr "Вашего сокета ЦП нет в базе данных ==> %s, кодовое имя: %s" #: core.cpp:2052 msgid "Calculating CPU multipliers in fallback mode" msgstr "Подсчёт множителей ЦП в режиме c откатом" #: core.cpp:2072 msgid "Retrieving motherboard information in fallback mode" msgstr "Получение информации о материнской плате в режиме с откатом" #: core.cpp:2085 msgid "failed to retrieve motherboard information (fallback mode)" msgstr "не удалось получить информацию о материнской плате (режим с откатом)" #: core.cpp:2127 msgid "Retrieving CPU temperature in fallback mode" msgstr "Получение температуры ЦП в режиме с откатом" #: core.cpp:2173 msgid "failed to retrieve CPU temperature (fallback mode)" msgstr "не удалось получить температуру ЦП (режим с откатом)" #: core.cpp:2188 msgid "Retrieving CPU voltage in fallback mode" msgstr "Получение напряжения ЦП в режиме с откатом" #: core.cpp:2200 msgid "failed to retrieve CPU voltage (fallback mode)" msgstr "не удалось получить напряжение ЦП (режим с откатом)" #: core.cpp:2214 msgid "Retrieving CPU frequency in fallback mode" msgstr "Получение частоты ЦП в режиме с откатом" #: core.cpp:2220 msgid "failed to retrieve CPU frequency (fallback mode)" msgstr "не удалось получить частоту ЦП (режим с откатом)" #: daemon_client.cpp:65 msgid "Starting daemon in background…" msgstr "Запускается демон в фоновом режиме…" #: daemon_client.cpp:172 msgid "pkexec: authorization could not be obtained (dialog dismissed)" msgstr "pkexec: не удаётся получить авторизацию (диалог отключён)" #: daemon_client.cpp:175 msgid "pkexec: authorization could not be obtained (not authorized)" msgstr "pkexec: не удаётся получить авторизацию (нет авторизации)" #: daemon_client.cpp:178 msgid "pkexec: command not found" msgstr "pkexec: команда не найдена" #: daemon_client.cpp:181 msgid "pkexec: unexpected error code" msgstr "pkexec: непредвиденный код ошибки" #: daemon_client.cpp:211 msgid "Connecting to daemon…" msgstr "Подключение к демону…" #: daemon_server.cpp:261 #, c-format msgid "request_handler: case %i not handled" msgstr "request_handler: %i не обрабатывается" #: data.cpp:124 cpu-x-gtk-3.12.ui:1370 msgid "CPU" msgstr "ЦП" #: data.cpp:187 msgid "P-core" msgstr "P-ядро" #: data.cpp:188 msgid "E-core" msgstr "E-ядро" #: data.cpp:189 data.cpp:192 msgid "Core" msgstr "Ядро" #: data.cpp:208 cpu-x-gtk-3.12.ui:746 msgid "Processor" msgstr "Процессор" #: data.cpp:240 data.cpp:329 cpu-x-gtk-3.12.ui:1968 msgid "Caches" msgstr "Кэши" #: data.cpp:247 #, c-format msgid "%2d x %4d %s, %2d-way" msgstr "%2d x %4d %s, %2d-канал." #: data.cpp:249 #, c-format msgid "%d %s, %d-way" msgstr "%d %s, %d-канал." #: data.cpp:263 msgid "Count" msgstr "Число" #: data.cpp:276 cpu-x-gtk-3.12.ui:968 msgid "Clocks" msgstr "Частоты" #: data.cpp:379 data.cpp:383 #, c-format msgid "L%u Cache" msgstr "Кэш L%u" #: data.cpp:385 #, c-format msgid "%s associative, %d-%s line size" msgstr "%s ассоциатив., %d %s кэш-линии" #: data.cpp:398 msgid "Test" msgstr "Тест" #: data.cpp:409 data.cpp:423 cpu-x-gtk-3.12.ui:2146 cpu-x-gtk-3.12.ui:2517 msgid "Motherboard" msgstr "Мат. плата" #: data.cpp:437 cpu-x-gtk-3.12.ui:2367 msgid "BIOS" msgstr "BIOS" #: data.cpp:452 cpu-x-gtk-3.12.ui:2498 msgid "Chipset" msgstr "Чипсет" #: data.cpp:467 data.cpp:569 cpu-x-gtk-3.12.ui:3156 cpu-x-gtk-3.12.ui:3761 msgid "Memory" msgstr "Оперативная память" #: data.cpp:483 #, c-format msgid "Stick %u" msgstr "Планка %u" #: data.cpp:487 cpu-x-gtk-3.12.ui:3134 msgid "Sticks" msgstr "Планки" #: data.cpp:541 cpu-x-gtk-3.12.ui:3780 msgid "System" msgstr "Система" #: data.cpp:554 cpu-x-gtk-3.12.ui:3380 msgid "Operating System" msgstr "Операционная система" #: data.cpp:587 cpu-x-gtk-3.12.ui:4960 msgid "Graphics" msgstr "Графика" #: data.cpp:621 #, c-format msgid "Card %u" msgstr "Карта %u" #: data.cpp:625 cpu-x-gtk-3.12.ui:4938 msgid "Cards" msgstr "Карты" #: data.cpp:672 cpu-x-gtk-3.12.ui:5300 msgid "Bench" msgstr "Тест" #: data.cpp:685 msgid "Not started" msgstr "Не запускался" #: data.cpp:688 cpu-x-gtk-3.12.ui:5070 msgid "Prime numbers (slow)" msgstr "Простые числа (медленно)" #: data.cpp:692 cpu-x-gtk-3.12.ui:5178 msgid "Prime numbers (fast)" msgstr "Простые числа (быстро)" #: data.cpp:696 cpu-x-gtk-3.12.ui:5281 msgid "Parameters" msgstr "Параметры" #: data.cpp:721 data.cpp:727 #, c-format msgid "%u mins" msgstr "%u м" #: data.cpp:734 cpu-x-gtk-3.12.ui:5444 cpu-x-gtk-3.12.ui:5552 msgid "About" msgstr "О приложении" #: data.cpp:739 #, c-format msgid "" "%s is a Free software that gathers information\n" "on CPU, motherboard and more." msgstr "" "%s — это свободное программное обеспечение для сбора\n" "сведений о процессоре, материнской плате и многом другом." #: data.cpp:744 msgid "About CPU-X" msgstr "О приложении CPU-X" #: data.cpp:745 #, c-format msgid "Version %s" msgstr "Версия %s" #: data.cpp:746 #, c-format msgid "Author: %s" msgstr "Автор: %s" #: data.cpp:747 #, c-format msgid "Site: %s" msgstr "Сайт: %s" #: data.cpp:751 cpu-x-gtk-3.12.ui:5533 msgid "License" msgstr "Лицензия" #: data.cpp:753 #, c-format msgid "This software is distributed under the terms of %s" msgstr "Эта программа распространяется на условиях %s" #: data.cpp:754 main.cpp:176 msgid "This program comes with ABSOLUTELY NO WARRANTY" msgstr "Эта программа предоставляется БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ" #: gui_gtk.cpp:61 #, c-format msgid "Cannot find path for '%s' file" msgstr "Не удаётся найти путь для файла «%s»" #: gui_gtk.cpp:400 msgid "Start daemon" msgstr "Запустить демона" #: gui_gtk.cpp:403 msgid "Connected to daemon" msgstr "Подключено к демону" #: gui_gtk.cpp:406 msgid "No polkit authentication agent found" msgstr "Агент аутентификации polkit не найден" #: gui_gtk.cpp:411 msgid "Ask password to start daemon in background" msgstr "Требуется пароль для запуска демона в фоновом режиме" #: gui_gtk.cpp:415 msgid "Settings" msgstr "Настройки" #: gui_gtk.cpp:634 msgid "BaseFamily" msgstr "Базовое семейство" #: gui_gtk.cpp:635 msgid "CPU display (\"true\") family (computed as BaseFamily+ExtendedFamily)" msgstr "" "Отображаемое («истинное») семейство ЦП (вычисляется как базовое семейство + " "расширенное семейство)" #: gui_gtk.cpp:636 msgid "BaseModel" msgstr "Базовая модель" #: gui_gtk.cpp:637 msgid "CPU display (\"true\") model (computed as (ExtendedModel<<4)+BaseModel)" msgstr "" "Отображаемая («истинная») модель ЦП (вычисляется как (расширенная модель << " "4) + базовая модель)" #: gui_gtk.cpp:847 msgid "" "Identify the physically-labeled socket or board position where the memory " "device is located" msgstr "" "Определить физически помеченное положение сокета или платы, где находится " "устройство памяти" #: gui_gtk.cpp:848 msgid "Identify the physically labeled bank where the memory device is located" msgstr "" "Определить физически обозначенный банк, где находится устройство памяти" #: gui_gtk.cpp:1052 msgid "User Mode Driver Version" msgstr "Версия драйвера пользовательского режима" #: gui_gtk.cpp:1066 msgid "Vulkan Ray Tracing" msgstr "Трассировка лучей Vulkan" #: gui_gtk.cpp:1260 msgid "Starting GTK GUI…" msgstr "Запуск интерфейса GTK…" #: gui_gtk.cpp:1272 msgid "failed to import UI in GtkBuilder" msgstr "не удалось импортировать интерфейс в GtkBuilder" #: main.cpp:63 msgid "Start graphical user interface (GUI) (default)" msgstr "Запустить графический интерфейс (GUI) (по умолчанию)" #: main.cpp:64 msgid "Start text-based user interface (TUI)" msgstr "Запустить текстовый интерфейс (TUI)" #: main.cpp:65 msgid "Dump all data on standard output and exit" msgstr "Вывести все данные в стандартный вывод и выйти" #: main.cpp:66 msgid "Run embedded command dmidecode and exit" msgstr "Запустить встроенную команду dmidecode и выйти" #: main.cpp:67 msgid "Run embedded command bandwidth and exit" msgstr "Запустить встроенную команду bandwidth и выйти" #: main.cpp:68 msgid "Set temperature unit (c[elsius]|f[ahrenheit]|k[elvin]|r[ankine])" msgstr "" "Задать единицу измерения температуры (c[elsius]|f[ahrenheit]|k[elvin]|" "r[ankine])" #: main.cpp:69 msgid "Set custom time between two refreshes (in seconds)" msgstr "Установить время между обновлениями (в секундах)" #: main.cpp:70 msgid "Set default tab (integer)" msgstr "Установить вкладку по умолчанию (целое число)" #: main.cpp:71 msgid "Select core type to monitor (integer)" msgstr "Выберите тип ядра для мониторинга (целое число)" #: main.cpp:72 msgid "Select CPU core to monitor (integer)" msgstr "Выберите ядро ЦП для мониторинга (целое число)" #: main.cpp:73 msgid "Set custom bandwidth test for CPU caches speed (integer)" msgstr "" "Установить тест пропускной способности для скорости кэша ЦП (целое число)" #: main.cpp:74 msgid "Select default memory stick (integer)" msgstr "Выбрать планку памяти по умолчанию (целое число)" #: main.cpp:75 msgid "Select default graphic card (integer)" msgstr "Выбрать графическую карту по умолчанию (целое число)" #: main.cpp:76 cpu-x-gtk-3.12.ui:5910 msgid "Start and connect to daemon" msgstr "Запускать и подключаться к демону" #: main.cpp:77 msgid "Verbose output" msgstr "Подробный вывод" #: main.cpp:78 msgid "Print help and exit" msgstr "Показать помощь и выйти" #: main.cpp:79 msgid "Print version and exit" msgstr "Показать версию и выйти" #: main.cpp:80 msgid "Print CPUID values in decimal (default is hexadeximal)" msgstr "" "Выводить значения CPUID в десятичном формате (по умолчанию — " "шестнадцатеричном)" #: main.cpp:81 msgid "Disable colored output" msgstr "Отключить цветной вывод" #: main.cpp:82 msgid "Print information for debugging" msgstr "Вывод информации для отладки" #: main.cpp:83 msgid "Print required information to paste in an issue" msgstr "Вывести требуемую информацию для вставки в отчёт об ошибке" #: main.cpp:84 msgid "Set key mapping for NCurses mode (a[rrows]|e[macs]|i[nverted-T]|v[im])" msgstr "" "Установить сопоставление клавиш для режима NCurses (a[rrows]|e[macs]|" "i[nverted-T]|v[im])" #: main.cpp:95 msgid "Add default command line arguments" msgstr "Добавить аргументы командной строки по умолчанию" #: main.cpp:96 msgid "Enforce the bus clock" msgstr "Принудительно установить тактовую частоту шины" #: main.cpp:97 msgid "" "Ignore CPU values reported by libcpuid (comma-separated values among 'temp', " "'volt' and 'freq')" msgstr "" "Игнорировать значения процессора, сообщённые libcpuid (значения, разделённые " "запятыми, среди «temp», «volt» и «freq»)" #: main.cpp:98 msgid "Read CPUID raw data from a given file" msgstr "Прочитать сырые данные CPUID из заданного файла" #: main.cpp:99 msgid "Only print a message if CPU is not present in the database" msgstr "Выводить сообщение только если ЦП отсутствует в базе данных" #: main.cpp:126 #, c-format msgid "Usage: %s DISPLAY [OPTIONS]\n" msgstr "Использование: %s ВЫВЕСТИ [ПАРАМЕТРЫ]\n" #: main.cpp:127 msgid "Available DISPLAY:" msgstr "Доступный ДИСПЛЕЙ:" #: main.cpp:135 msgid "Available OPTIONS:" msgstr "Доступные ОПЦИИ:" #: main.cpp:144 msgid "Influenceable environment variables:" msgstr "Затрагиваемые переменные окружения:" #: main.cpp:175 msgid "This is free software: you are free to change and redistribute it." msgstr "" "Это свободное программное обеспечение. Вы можете изменять и распространять " "его." #: main.cpp:177 #, c-format msgid "See the %s license: <%s>\n" msgstr "Посмотреть лицензию %s: <%s>\n" #: main.cpp:184 #, c-format msgid "-- %-9s version: %s" msgstr "— %-9s версия: %s" #: main.cpp:381 #, c-format msgid "" "\n" "Oops, something was wrong! %s has received signal %d (%s) and has crashed." msgstr "" "\n" "Ой, что-то пошло не так! %s получил сигнал %d (%s) и аварийно завершился." #: main.cpp:383 #, c-format msgid "" "\n" "Oops, something was wrong! %s has received signal %d (%s) and is trying to " "recover." msgstr "" "\n" "Ой, что-то пошло не так! %s получил сигнал %d (%s) и пытается восстановиться." #: main.cpp:407 msgid "You can open a new issue here, by filling the template as requested:" msgstr "" "Здесь вы можете создать новый отчет об ошибке, заполнив шаблон следующим " "образом:" #: main.cpp:449 msgid "an error occurred while setting locale" msgstr "ошибка при установке локализации" #: options.cpp:124 #, c-format msgid "" "Selected CPU type (%u) is not a valid number (%u is the maximum for this CPU)" msgstr "" "Выбранный тип ЦП (%u) не является допустимым числом (%u — максимум для этого " "ЦП)" #: options.cpp:145 #, c-format msgid "" "Selected bandwidth test (%u) is not a valid number (%u is the maximum for " "this system)" msgstr "" "Выбранная проверка пропускной способности (%u) не является допустимым числом " "(%u — максимум для этой системы)" #: options.cpp:168 #, c-format msgid "" "Selected RAM stick (%u) is not a valid number (%u is the maximum for this " "system)" msgstr "" "Выбранная планка оперативной памяти (%u) не является допустимым числом (%u — " "максимум для этой системы)" #: options.cpp:188 #, c-format msgid "" "Selected graphic card (%u) is not a valid number (%u is the maximum for this " "system)" msgstr "" "Выбранная видеокарта (%u) не является допустимым числом (%u — максимум для " "этой системы)" #: options.cpp:204 #, c-format msgid "failed to change CPU affinitiy to core %u" msgstr "не удалось изменить привязку ЦП к ядру %u" #: options.cpp:210 #, c-format msgid "" "Selected CPU core (%u) is not a valid number (%u is the maximum for this " "type of core)" msgstr "" "Выбранное ядро ЦП (%u) не является допустимым числом (%u — максимум для " "этого типа ядра)" #: options.cpp:284 #, c-format msgid "Selected tab (%u) is not a valid number (%u is the maximum)" msgstr "Выбранная вкладка (%u) не является допустимым числом (%u — максимум)" #: tui_ncurses.cpp:111 msgid "Window is too small!" msgstr "Окно слишком маленькое!" #: tui_ncurses.cpp:119 msgid "Press 'h' to see help." msgstr "Нажмите клавишу «H» для получения помощи." #: tui_ncurses.cpp:232 #, c-format msgid "Welcome in %s NCurses help!\n" msgstr "Добро пожаловать в %s помощь NCurses!\n" #: tui_ncurses.cpp:233 msgid "This help describes how to use this Text-based User Interface." msgstr "В этой справке описано, как использовать текстовый интерфейс." #: tui_ncurses.cpp:235 msgid "Global keys:" msgstr "Глобальные клавиши:" #: tui_ncurses.cpp:236 msgid "Press 'left' key or 'tab' key to switch in left tab." msgstr "Нажмите клавиши «Влево» или «Tab» для переключения на левую вкладку." #: tui_ncurses.cpp:237 msgid "Press 'right' key or 'shift + tab' keys to switch in right tab." msgstr "" "Нажмите клавиши «Вправо» или «Shift + Tab» для переключения на правую " "вкладку." #: tui_ncurses.cpp:238 msgid "Press 'h' key to see this help." msgstr "Нажмите клавишу «H» для вызова помощи." #: tui_ncurses.cpp:239 msgid "Press 'q' key to exit." msgstr "Нажмите клавишу «Q» для выхода." #: tui_ncurses.cpp:241 msgid "CPU tab:" msgstr "Вкладка «ЦП»:" #: tui_ncurses.cpp:242 msgid "Press 'next page' key to decrease core type number to monitor." msgstr "" "Нажмите клавишу «Следующая страница» для уменьшения числа типа ядра для " "мониторинга." #: tui_ncurses.cpp:243 msgid "Press 'previous page' key to increase core type number to monitor." msgstr "" "Нажмите клавишу «Предыдущая страница» для увеличения числа типа ядра для " "мониторинга." #: tui_ncurses.cpp:244 msgid "Press 'down' key to decrease CPU core number to monitor." msgstr "Нажмите клавишу «Вниз» для уменьшения числа ядер ЦП для мониторинга." #: tui_ncurses.cpp:245 msgid "Press 'up' key to increase CPU core number to monitor." msgstr "Нажмите клавишу «Вверх» для увеличения числа ядер ЦП для мониторинга." #: tui_ncurses.cpp:247 msgid "Caches tab:" msgstr "Вкладка «Кэши»:" #: tui_ncurses.cpp:248 msgid "Press 'down' key to switch to previous test." msgstr "Нажмите клавишу «Вниз» для перехода к предыдущему тесту." #: tui_ncurses.cpp:249 msgid "Press 'up' key to switch to next test." msgstr "Нажмите клавишу «Вверх» для перехода к следующему тесту." #: tui_ncurses.cpp:251 msgid "Bench tab:" msgstr "Вкладка «Тест»:" #: tui_ncurses.cpp:252 msgid "Press 'down' key to decrement benchmark duration." msgstr "Нажмите клавишу «Вниз» для уменьшения длительности бенчмарка." #: tui_ncurses.cpp:253 msgid "Press 'up' key to increment benchmark duration." msgstr "Нажмите клавишу «Вверх» для увеличения длительности бенчмарка." #: tui_ncurses.cpp:254 msgid "Press 'next page' key to decrement number of threads to use." msgstr "" "Нажмите клавишу «Следующая страница» для уменьшения числа используемых " "потоков." #: tui_ncurses.cpp:255 msgid "Press 'previous page' key to increment number of threads to use." msgstr "" "Нажмите клавишу «Предыдущая страница» для увеличения числа используемых " "потоков." #: tui_ncurses.cpp:256 msgid "Press 's' key to start/stop prime numbers (slow) benchmark." msgstr "" "Нажмите клавишу «S» для запуска/остановки бенчмарка «простые числа " "(медленно)»." #: tui_ncurses.cpp:257 msgid "Press 'f' key to start/stop prime numbers (fast) benchmark." msgstr "" "Нажмите клавишу «F» для запуска/остановки бенчмарка «простые числа (быстро)»." #: tui_ncurses.cpp:259 msgid "Graphics tab:" msgstr "Вкладка «Графика»:" #: tui_ncurses.cpp:260 msgid "Press 'down' key to switch to previous graphic card." msgstr "Нажмите клавишу «Вниз» для перехода к предыдущей видеокарте." #: tui_ncurses.cpp:261 msgid "Press 'up' key to switch to next graphic card." msgstr "Нажмите клавишу «Вверх» для перехода к следующей видеокарте." #: tui_ncurses.cpp:263 msgid "Press any key to exit this help." msgstr "Нажмите любую клавишу для выхода из справки." #: tui_ncurses.cpp:640 msgid "Starting NCurses TUI…" msgstr "Запуск текстового интерфейса NCurses…" #: tui_ncurses.cpp:649 msgid "" "FATAL ERROR: terminfo database could not be found (try to set TERMINFO " "environment variable)" msgstr "" "КРИТИЧЕСКАЯ ОШИБКА: база данных terminfo не найдена (попробуйте установить " "переменную окружения TERMINFO)" #: tui_ncurses.cpp:654 #, c-format msgid "Failed to set up %s terminal (err=%i); falling back to %s" msgstr "Ошибка установки %s (err=%i); откат к %s" #: util.cpp:189 #, c-format msgid "cannot find unit in '%s' string at position %i" msgstr "не удаётся найти блок в строке «%s» на позиции %i" #: util.cpp:252 #, c-format msgid "an error occurred while opening file '%s'" msgstr "ошибка при открытии файла «%s»" #: util.cpp:297 #, c-format msgid "an error occurred while running command '%s'" msgstr "ошибка при выполнении команды «%s»" #: util.cpp:437 msgid "set_cpu_affinity() not supported on this operating system" msgstr "set_cpu_affinity() не поддерживается в этой операционной системе" #: data.hpp:103 data.hpp:244 data.hpp:332 msgid "Vendor" msgstr "Производитель" #: data.hpp:104 msgid "Code Name" msgstr "Кодовое имя" #: data.hpp:105 msgid "Package" msgstr "Сокет" #: data.hpp:106 msgid "Technology" msgstr "Технология" #: data.hpp:107 data.hpp:268 msgid "Voltage" msgstr "Напряжение" #: data.hpp:108 msgid "Specification" msgstr "Спецификация" #: data.hpp:109 msgid "Family" msgstr "Семейство" #: data.hpp:110 msgid "Disp. Family" msgstr "Отобр. семейство" #: data.hpp:111 data.hpp:224 data.hpp:245 data.hpp:335 msgid "Model" msgstr "Модель" #: data.hpp:112 msgid "Disp. Model" msgstr "Отобр. модель" #: data.hpp:113 msgid "Temp." msgstr "Темп-ра" #: data.hpp:114 msgid "Stepping" msgstr "Степпинг" #: data.hpp:115 msgid "Instructions" msgstr "Инструкции" #: data.hpp:125 msgid "L1 Data" msgstr "Ур. 1 (данные)" #: data.hpp:126 msgid "L1 Inst." msgstr "Ур. 1 (инстр.)" #: data.hpp:127 msgid "Level 2" msgstr "Уровень 2" #: data.hpp:128 msgid "Level 3" msgstr "Уровень 3" #: data.hpp:137 cpu-x-gtk-3.12.ui:1232 msgid "Cores" msgstr "Ядра" #: data.hpp:138 data.hpp:408 cpu-x-gtk-3.12.ui:1252 msgid "Threads" msgstr "Потоки" #: data.hpp:155 msgid "Core Speed" msgstr "Такт. частота ядра" #: data.hpp:156 msgid "Multiplier" msgstr "Множитель" #: data.hpp:157 msgid "Bus Speed" msgstr "Скорость шины" #: data.hpp:158 data.hpp:341 msgid "Usage" msgstr "Использование" #: data.hpp:188 data.hpp:265 msgid "Size" msgstr "Размер" #: data.hpp:189 data.hpp:267 msgid "Speed" msgstr "Скорость" #: data.hpp:223 data.hpp:259 msgid "Manufacturer" msgstr "Производитель" #: data.hpp:225 msgid "Revision" msgstr "Ревизия" #: data.hpp:233 msgid "Brand" msgstr "Марка" #: data.hpp:234 msgid "Version" msgstr "Версия" #: data.hpp:235 msgid "Date" msgstr "Дата" #: data.hpp:236 msgid "ROM Size" msgstr "Размер ПЗУ" #: data.hpp:260 msgid "Part Number" msgstr "Номер части" #: data.hpp:261 msgid "Type" msgstr "Тип" #: data.hpp:262 msgid "Type Detail" msgstr "Деталь типа" #: data.hpp:263 msgid "Device Locator" msgstr "Локатор устройства" #: data.hpp:264 msgid "Bank Locator" msgstr "Локатор банка" #: data.hpp:266 msgid "Rank" msgstr "Ранг" #: data.hpp:292 msgid "Name" msgstr "Название" #: data.hpp:293 msgid "Kernel" msgstr "Ядро ОС" #: data.hpp:294 msgid "Hostname" msgstr "Имя хоста" #: data.hpp:295 msgid "Uptime" msgstr "Время работы" #: data.hpp:303 msgid "Used" msgstr "Использовано" #: data.hpp:304 msgid "Buffers" msgstr "Буферы" #: data.hpp:305 msgid "Cached" msgstr "Кэшировано" #: data.hpp:306 msgid "Free" msgstr "Свободно" #: data.hpp:307 msgid "Swap" msgstr "Подкачка" #: data.hpp:333 msgid "Driver" msgstr "Драйвер" #: data.hpp:334 msgid "UMD Version" msgstr "Версия драйвера" #: data.hpp:336 msgid "Compute Unit" msgstr "Вычислит. блок" #: data.hpp:337 msgid "Device ID" msgstr "ИД устройства" #: data.hpp:338 msgid "VBIOS Version" msgstr "Версия VBIOS" #. #-#-#-#-# source_ui.pot (cpu-x ) #-#-#-#-# #. Setting: "Interface" tab #: data.hpp:339 cpu-x-gtk-3.12.ui:5807 msgid "Interface" msgstr "Интерфейс" #: data.hpp:340 msgid "Temperature" msgstr "Температура" #: data.hpp:342 msgid "Core Voltage" msgstr "Напряжение ядра" #: data.hpp:343 msgid "Power Avg" msgstr "Сред. мощность" #: data.hpp:344 msgid "Core Clock" msgstr "Частота ядра" #: data.hpp:345 msgid "Memory Clock" msgstr "Частота памяти" #: data.hpp:346 msgid "Memory Used" msgstr "Памяти занято" #: data.hpp:347 msgid "Resizable BAR" msgstr "Resizable BAR" #: data.hpp:348 msgid "Vulkan RT" msgstr "Vulkan RT" #: data.hpp:349 msgid "OpenGL Version" msgstr "Версия OpenGL" #: data.hpp:350 msgid "Vulkan Version" msgstr "Версия Vulkan" #: data.hpp:351 msgid "OpenCL Version" msgstr "Версия OpenCL" #: data.hpp:387 msgid "Score" msgstr "Оценка" #: data.hpp:388 msgid "Run" msgstr "Запустить" #: data.hpp:407 msgid "Duration" msgstr "Длительность" #: util.hpp:77 msgid "bytes" msgstr "байта" #. TRANSLATORS: initials for kilobyte (10³): please put initials (keep it short) #: util.hpp:80 msgid "kB" msgstr "КБ" #. TRANSLATORS: initials for megabyte (10⁶): please put initials (keep it short) #: util.hpp:82 msgid "MB" msgstr "МБ" #. TRANSLATORS: initials for gigabyte (10⁹): please put initials (keep it short) #: util.hpp:84 msgid "GB" msgstr "ГБ" #. TRANSLATORS: initials for terabyte (10¹²): please put initials (keep it short) #: util.hpp:86 msgid "TB" msgstr "ТБ" #. TRANSLATORS: initials for kibibyte (2¹⁰): please put initials (keep it short) #: util.hpp:89 msgid "KiB" msgstr "КиБ" #. TRANSLATORS: initials for mebibyte (2²⁰): please put initials (keep it short) #: util.hpp:91 msgid "MiB" msgstr "МиБ" #. TRANSLATORS: initials for gibibyte (2³⁰): please put initials (keep it short) #: util.hpp:93 msgid "GiB" msgstr "ГиБ" #. TRANSLATORS: initials for tebibyte (2⁴⁰): please put initials (keep it short) #: util.hpp:95 msgid "TiB" msgstr "ТиБ" #: cpu-x-gtk-3.12.ui:1184 msgid "Cache" msgstr "Кэш" #. Setting: refresh time for UI #: cpu-x-gtk-3.12.ui:5721 msgid "Refresh time" msgstr "Период обновления" #. Setting: GUI theme #: cpu-x-gtk-3.12.ui:5745 msgid "Text theme" msgstr "Тема текста" #. Setting: automatic GUI theme #: cpu-x-gtk-3.12.ui:5760 msgid "Automatic" msgstr "Автоматическая" #. Setting: light GUI theme #: cpu-x-gtk-3.12.ui:5761 msgid "Blue for light theme" msgstr "Синяя для светлой темы" #. Setting: dark GUI theme #: cpu-x-gtk-3.12.ui:5762 msgid "Yellow for dark theme" msgstr "Жёлтая для тёмной темы" #. Setting: temperature unit #: cpu-x-gtk-3.12.ui:5775 msgid "Temperature unit" msgstr "Единица измерения температуры" #. Setting: default tab at startup #: cpu-x-gtk-3.12.ui:5826 msgid "Default tab" msgstr "Вкладка по умолчанию" #. Setting: default CPU core at startup #: cpu-x-gtk-3.12.ui:5839 msgid "Default CPU core" msgstr "Ядро ЦП по умолчанию" #. Setting: default cache test at startup #: cpu-x-gtk-3.12.ui:5852 msgid "Default cache test" msgstr "Тест кэша по умолчанию" #. Setting: print CPUID values in decimal or hexadecimal #: cpu-x-gtk-3.12.ui:5895 msgid "Print CPUID values in decimal" msgstr "Выводить значения CPUID в десятичном формате" #. Setting: default graphic card at startup #: cpu-x-gtk-3.12.ui:5928 msgid "Default graphic card" msgstr "Видеокарта по умолчанию" #. Setting: default CPU core at startup #: cpu-x-gtk-3.12.ui:5952 msgid "Default core type" msgstr "Тип ядра по умолчанию" #. Setting: default graphic card at startup #: cpu-x-gtk-3.12.ui:5976 msgid "Default memory stick" msgstr "Карта памяти по умолчанию" #. Setting: "Startup" tab #: cpu-x-gtk-3.12.ui:6004 msgid "Startup" msgstr "Запуск" #~ msgid "Light" #~ msgstr "Светлая" #~ msgid "Dark" #~ msgstr "Тёмная" #~ msgid "Calculating CPU multipliers" #~ msgstr "Подсчёт множителей ЦП" #, c-format #~ msgid "Current: PCIe Gen%1dx%d / Max: Gen%1dx%d" #~ msgstr "Текущий: PCIe Gen%1dx%d / Макс.: Gen%1dx%d" #~ msgid "failed to retrieve GPU clocks" #~ msgstr "не удалось получить частоту ГП" #, c-format #~ msgid "Core #%i" #~ msgstr "Ядро №%i" #~ msgid "Setting label names" #~ msgstr "Установка названий меток" #, c-format #~ msgid "Bank %i" #~ msgstr "Модуль %i" #~ msgid "Reference" #~ msgstr "Описание" #~ msgid "Distribution" #~ msgstr "Дистрибутив" #~ msgid "Compiler" #~ msgstr "Компилятор" #~ msgid "GPU clock" #~ msgstr "Частота ГП" #~ msgid "Dumping data…" #~ msgstr "Получение дампа данных…" #~ msgid "Freeing memory" #~ msgstr "Освобождение памяти" #~ msgid "Ignore CPU frequency reported by libcpuid" #~ msgstr "Игнорировать частоту ЦП, сообщаемую libcpuid" #, c-format #~ msgid "failed to call wordexp (%i)" #~ msgstr "не удалось вызвать wordexp (%i)" #~ msgid "Press 'home' key to scroll up in a page." #~ msgstr "Нажмите клавишу «Home» для прокрутки страницы вверх." #~ msgid "Press 'end' key to scroll down in a page." #~ msgstr "Нажмите клавишу «End» для прокрутки страницы вниз." #, c-format #~ msgid "String '%s' is too long, truncating…" #~ msgstr "Строка «%s» слишком длинная, обрезается…" #, c-format #~ msgid "failed to open %s directory" #~ msgstr "не удалось открыть папку «%s»" #~ msgid "an error occurred while compiling regex" #~ msgstr "ошибка при компиляции регулярных выражений" #~ msgid "FATAL ERROR: could not allocate memory" #~ msgstr "КРИТИЧЕСКАЯ ОШИБКА: не удалось выделить память" #~ msgid "Enumerating Vulkan instance extension properties" #~ msgstr "Перечисление свойств расширений экземпляра Vulkan" #, c-format #~ msgid "failed to call vkEnumerateInstanceExtensionProperties (%s)" #~ msgstr "не удалось вызвать vkEnumerateInstanceExtensionProperties (%s)" #, c-format #~ msgid "" #~ "failed to call vkEnumerateInstanceExtensionProperties to fill " #~ "VkExtensionProperties (%s)" #~ msgstr "" #~ "не удалось вызвать vkEnumerateInstanceExtensionProperties для заполнения " #~ "VkExtensionProperties (%s)" #~ msgid "Vulkan API is not available" #~ msgstr "Vulkan API недоступно" #, c-format #~ msgid "%s" #~ msgstr "%s" #, c-format #~ msgid "" #~ "CPU hybrid architecture is not supported. For more details, please refer " #~ "to following issue: %s" #~ msgstr "" #~ "Гибридная архитектура ЦП не поддерживается. Для подробностей, пожалуйста, " #~ "посмотрите следующую проблему: %s" #~ msgid "NOT SUPPORTED" #~ msgstr "НЕ ПОДДЕРЖИВАЕТСЯ" #~ msgid "There is no device with Vulkan support" #~ msgstr "Отсутствуют устройства с поддержкой Vulkan" #~ msgid "Socket(s)" #~ msgstr "Сокет(-ы)" #~ msgid "Thread(s)" #~ msgstr "Поток(-и)" #~ msgid "You can paste this backtrace by opening a new issue here:" #~ msgstr "Вы можете открыть новую тему и вставить в нее вывод ошибки:" #, fuzzy #~| msgid "failed to call dmidecode" #~ msgid "faild to call clGetDeviceIDs" #~ msgstr "не удалось вызвать dmidecode" #~ msgid "Exiting %s" #~ msgstr "Выход из %s" #~ msgid "Skip CPU MSR opening (need to be root)" #~ msgstr "" #~ "Пропустить открытие моделезависимых регистров ЦП (требуются права " #~ "администратора)" #~ msgid "failed to open CPU MSR (%s)" #~ msgstr "не удалось открыть моделезависимые регистры ЦП (%s)" #~ msgid "Skip call to dmidecode (need to be root)" #~ msgstr "Пропустить вызов dmidecode (требуются права администратора)" #~ msgid "failed to allocate memory for dmidecode" #~ msgstr "не удалось переназначить память для dmidecode" #~ msgid "Finding graphic card driver" #~ msgstr "Поиск драйвера видеокарты" #~ msgid "(%s driver)" #~ msgstr "(драйвер %s)" #~ msgid "Retrieving GPU temperature" #~ msgstr "Получение температуры ГП" #~ msgid "Off" #~ msgstr "Выкл" #~ msgid "failed to retrieve GPU temperature" #~ msgstr "не удалось получить температуру ГП" #~ msgid "Skip some GPU values (need to be root)" #~ msgstr "Пропускать некоторые значения ГП (требуются права администратора)" #~ msgid "failed to allocate memory for benchmark" #~ msgstr "не удалось переназначить память для бенчмарка" #~ msgid "Root privileges are required to work properly" #~ msgstr "Для корректной работы требуются права администратора" #~ msgid "Some information will not be retrievable" #~ msgstr "Невозможно получить некоторые данные" #~ msgid "Ignore" #~ msgstr "Пропустить" #~ msgid "Run as root" #~ msgstr "Запустить с правами администратора" #~ msgid "A new version of %s is available!" #~ msgstr "Доступна новая версия %s!" #~ msgid "" #~ "Do you want to update %s to version %s after exit?\n" #~ "It will erase this binary file (%s) by the new version." #~ msgstr "" #~ "Вы хотите обновить %s до версии %s после выхода?\n" #~ "Бинарный файл (%s) будет заменен новой версией." #~ msgid "Not now" #~ msgstr "Не сейчас" #~ msgid "Update" #~ msgstr "Обновить" #~ msgid "Checking on Internet for a new version..." #~ msgstr "Проверка обновлений через интернет..." #~ msgid "failed to open a Curl session" #~ msgstr "не удалось открыть сессию Curl" #~ msgid "wrong write data" #~ msgstr "неверные данные записи" #~ msgid "(version %s is available)" #~ msgstr "(доступна версия %s)" #~ msgid "No new version available" #~ msgstr "Обновлений нет" #~ msgid "(up-to-date)" #~ msgstr "(последняя версия)" #~ msgid "an error occurred while extracting %s archive (%s)" #~ msgstr "ошибка при извлечении архива %s (%s)" #~ msgid "" #~ "Network access is disabled by environment variable (set CPUX_NETWORK with " #~ "a positive value to enable it)" #~ msgstr "" #~ "Доступ к сети отключен переменной окружения (для его включения установите " #~ "положительное значение CPUX_NETWORK)" #~ msgid "failed to open %s archive for writing" #~ msgstr "не удалось открыть архив %s для записи" #~ msgid "Downloading new version..." #~ msgstr "Загрузка новой версии..." #~ msgid "failed to download %s archive (%s)" #~ msgstr "не удалось загрузить архив %s (%s)" #~ msgid "Extracting new version..." #~ msgstr "Извлечение обновлений..." #~ msgid "Applying new version..." #~ msgstr "Применение обновлений..." #~ msgid "an error occurred while removing/renaming files" #~ msgstr "ошибка при удалении/переименовании файлов" #~ msgid "Update successful!" #~ msgstr "Обновление завершено!" #~ msgid "Update portable version if a new version is available" #~ msgstr "Обновить переносную версию (при доступности обновлений)" #~ msgid "Temporarily disable network support" #~ msgstr "Временно отключить поддержку сети" #~ msgid "Built on %s, %s (with %s %s on %s)." #~ msgstr "Скомпилировано на %s, %s (с помощью %s %s на %s)." #~ msgid "" #~ "Sorry, you cannot update %s: 32-bit portable version is no more supported." #~ msgstr "" #~ "Извините, вы не можете обновить %s: 32-битная портативная версия больше " #~ "не поддерживается." #~ msgid "If you want to update, press 'u' key, or anything else to skip.\n" #~ msgstr "Нажмите клавишу «U» для обновления или любую другую для пропуска.\n" #~ msgid "" #~ "\n" #~ "\n" #~ "%s will be updated." #~ msgstr "" #~ "\n" #~ "\n" #~ "%s будет обновлен." CPU-X-5.0.3/po/si.po000066400000000000000000000606361454622605200137650ustar00rootroot00000000000000# CPU-X translations template # Copyright © 2014-2024 The Tumultuous Unicorn Of Darkness # This file is distributed under the same license as the cpu-x package. # HelaBasa , 2021. msgid "" msgstr "" "Project-Id-Version: cpu-x\n" "Report-Msgid-Bugs-To: https://github.com/TheTumultuousUnicornOfDarkness/CPU-" "X/issues\n" "POT-Creation-Date: 2023-12-09 13:09+0100\n" "PO-Revision-Date: 2021-02-23 09:50+0000\n" "Last-Translator: HelaBasa \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" "X-Generator: Weblate 4.5\n" #: core.cpp:135 msgid "Finding CPU technology" msgstr "" #: core.cpp:161 #, c-format msgid "" "Your CPU is not present in the database ==> %s, model: %i, ext. model: %i, " "ext. family: %i" msgstr "" #: core.cpp:189 data.cpp:150 data.cpp:342 msgid "unknown" msgstr "" #: core.cpp:230 msgid "Calling libcpuid for retrieving static data" msgstr "" #: core.cpp:245 #, c-format msgid "failed to call libcpuid (%s)" msgstr "" #: core.cpp:340 msgid "Calling libcpuid for retrieving dynamic data" msgstr "" #: core.cpp:353 msgid "Calling libcpuid for retrieving CPU MSR static values" msgstr "" #: core.cpp:380 msgid "Calling libcpuid for retrieving CPU MSR dynamic values" msgstr "" #: core.cpp:412 msgid "Calling dmidecode" msgstr "" #: core.cpp:454 core.cpp:473 #, c-format msgid "%s (configured)" msgstr "" #: core.cpp:461 core.cpp:480 #, c-format msgid "%s (max)" msgstr "" #: core.cpp:466 #, c-format msgid "%s (min)" msgstr "" #: core.cpp:496 msgid "Calculating CPU usage" msgstr "" #: core.cpp:546 msgid "Calling bandwidth" msgstr "" #: core.cpp:613 #, c-format msgid "" "pci_access is not properly initialized: it is a common issue when %s was " "built with a lower libpci version.\n" "Check that libpci %s library is present on your system. Otherwise, please " "rebuild %s." msgstr "" #: core.cpp:657 #, c-format msgid "No kernel driver in use for graphic card at path %s" msgstr "" #: core.cpp:693 #, c-format msgid "Your GPU kernel driver is unknown: %s" msgstr "" #: core.cpp:777 #, c-format msgid "Your GPU user mode driver is unknown for vendor %s: %s" msgstr "" #: core.cpp:781 #, c-format msgid "failed to call GLFW (%i): %s" msgstr "" #: core.cpp:914 msgid "Finding Vulkan API version" msgstr "" #: core.cpp:926 #, c-format msgid "failed to call vkCreateInstance (%s)" msgstr "" #: core.cpp:929 #, c-format msgid "%s is not supported" msgstr "" #: core.cpp:937 #, c-format msgid "failed to call vkEnumeratePhysicalDevices (%s)" msgstr "" #: core.cpp:944 msgid "No available Vulkan devices" msgstr "" #: core.cpp:952 #, c-format msgid "No available physical devices (%s)" msgstr "" #: core.cpp:1015 #, c-format msgid "Failed to create Vulkan for device %u (%s)" msgstr "" #: core.cpp:1019 #, c-format msgid "%s is not supported for device %u, use only deviceID for matching" msgstr "" #: core.cpp:1051 core.cpp:1364 msgid "Enabled" msgstr "" #: core.cpp:1051 core.cpp:1364 msgid "Disabled" msgstr "" #: core.cpp:1088 msgid "Finding OpenCL API version" msgstr "" #: core.cpp:1092 #, c-format msgid "There is no platform with OpenCL support (%s)" msgstr "" #: core.cpp:1102 #, c-format msgid "failed to get all OpenCL platforms (%s)" msgstr "" #: core.cpp:1115 #, c-format msgid "failed to get name for platform %u (%s)" msgstr "" #: core.cpp:1123 #, c-format msgid "failed to get version for platform %u (%s)" msgstr "" #: core.cpp:1131 #, c-format msgid "failed to find number of OpenCL devices for platform '%s %s' (%s)" msgstr "" #: core.cpp:1131 #, fuzzy #| msgid "Finding devices" msgid "0 device" msgstr "උපාංග සොයමින්" #: core.cpp:1140 #, c-format msgid "failed to get all of OpenCL devices for platform '%s %s' (%s)" msgstr "" #: core.cpp:1160 #, c-format msgid "failed to get name for device %u (%s)" msgstr "" #: core.cpp:1168 #, c-format msgid "failed to get version for device %u (%s)" msgstr "" #: core.cpp:1190 #, c-format msgid "OpenCL driver for '%s %s' does not support CL_DEVICE_TOPOLOGY_AMD (%s)" msgstr "" #: core.cpp:1201 #, c-format msgid "" "OpenCL driver for '%s %s' does not support CL_DEVICE_GFXIP_MAJOR_AMD (%s)" msgstr "" #: core.cpp:1209 core.cpp:1229 core.cpp:1262 #, c-format msgid "" "OpenCL driver for '%s %s' does not support CL_DEVICE_MAX_COMPUTE_UNITS (%s)" msgstr "" #: core.cpp:1250 #, c-format msgid "" "OpenCL driver for '%s %s' does not support CL_DEVICE_PCI_DOMAIN_ID_NV (%s), " "CL_DEVICE_PCI_BUS_ID_NV (%s) or CL_DEVICE_PCI_SLOT_ID_NV (%s)" msgstr "" #: core.cpp:1273 #, c-format msgid "OpenCL is not supported with your GPU vendor (0x%X)" msgstr "" #: core.cpp:1295 msgid "Finding devices" msgstr "උපාංග සොයමින්" #: core.cpp:1307 #, c-format msgid "Skip devices search (wrong permissions on %s device)" msgstr "" #: core.cpp:1350 #, c-format msgid "Your GPU vendor is unknown: %s (0x%X)" msgstr "" #: core.cpp:1370 msgid "failed to find chipset vendor and model" msgstr "" #: core.cpp:1385 msgid "failed to find graphic card vendor and model" msgstr "" #: core.cpp:1487 msgid "Retrieving GPU clocks" msgstr "" #: core.cpp:1500 msgid "None" msgstr "" #: core.cpp:1509 #, c-format msgid "DRM path for %s is unknown" msgstr "" #: core.cpp:1516 #, c-format msgid "Card number for %s is unknown" msgstr "" #: core.cpp:1541 #, c-format msgid "PCIe %s (current) / %s (max)" msgstr "" #: core.cpp:1650 #, c-format msgid "Driver for %s doesn't report frequencies" msgstr "" #: core.cpp:1671 #, c-format msgid "failed to retrieve all monitoring data for %s" msgstr "" #: core.cpp:1694 msgid "Identifying running system" msgstr "" #: core.cpp:1697 msgid "failed to identify running system" msgstr "" #: core.cpp:1749 core.cpp:1778 msgid "Calling libprocps" msgstr "" #: core.cpp:1752 msgid "unable to get system uptime" msgstr "" #: core.cpp:1758 msgid "unable to create meminfo structure" msgstr "" #: core.cpp:1804 msgid "Calling libstatgrab" msgstr "" #: core.cpp:1852 #, c-format msgid "%i days, %i hours, %i minutes, %i seconds" msgstr "" #: core.cpp:1915 msgid "Updating benchmark status" msgstr "" #: core.cpp:1918 msgid "Active" msgstr "" #: core.cpp:1921 #, c-format msgid "(%u hours left)" msgstr "" #: core.cpp:1923 #, c-format msgid "(%u minutes left)" msgstr "" #: core.cpp:1925 #, c-format msgid "(%u seconds left)" msgstr "" #: core.cpp:1929 core.cpp:1984 core.cpp:1985 msgid "Inactive" msgstr "" #: core.cpp:1932 #, c-format msgid "in %u hours" msgstr "" #: core.cpp:1934 #, c-format msgid "in %u minutes" msgstr "" #: core.cpp:1936 #, c-format msgid "in %u seconds" msgstr "" #: core.cpp:1953 #, c-format msgid "Starting benchmark with %u threads" msgstr "" #: core.cpp:1976 msgid "an error occurred while starting benchmark" msgstr "" #: core.cpp:2002 msgid "Finding CPU package in fallback mode" msgstr "" #: core.cpp:2032 #, c-format msgid "Your CPU socket is not present in the database ==> %s, codename: %s" msgstr "" #: core.cpp:2052 msgid "Calculating CPU multipliers in fallback mode" msgstr "" #: core.cpp:2072 msgid "Retrieving motherboard information in fallback mode" msgstr "" #: core.cpp:2085 msgid "failed to retrieve motherboard information (fallback mode)" msgstr "" #: core.cpp:2127 msgid "Retrieving CPU temperature in fallback mode" msgstr "" #: core.cpp:2173 msgid "failed to retrieve CPU temperature (fallback mode)" msgstr "" #: core.cpp:2188 msgid "Retrieving CPU voltage in fallback mode" msgstr "" #: core.cpp:2200 msgid "failed to retrieve CPU voltage (fallback mode)" msgstr "" #: core.cpp:2214 msgid "Retrieving CPU frequency in fallback mode" msgstr "" #: core.cpp:2220 msgid "failed to retrieve CPU frequency (fallback mode)" msgstr "" #: daemon_client.cpp:65 msgid "Starting daemon in background…" msgstr "" #: daemon_client.cpp:172 msgid "pkexec: authorization could not be obtained (dialog dismissed)" msgstr "" #: daemon_client.cpp:175 msgid "pkexec: authorization could not be obtained (not authorized)" msgstr "" #: daemon_client.cpp:178 msgid "pkexec: command not found" msgstr "" #: daemon_client.cpp:181 msgid "pkexec: unexpected error code" msgstr "" #: daemon_client.cpp:211 msgid "Connecting to daemon…" msgstr "" #: daemon_server.cpp:261 #, c-format msgid "request_handler: case %i not handled" msgstr "" #: data.cpp:124 cpu-x-gtk-3.12.ui:1370 msgid "CPU" msgstr "" #: data.cpp:187 msgid "P-core" msgstr "" #: data.cpp:188 msgid "E-core" msgstr "" #: data.cpp:189 data.cpp:192 msgid "Core" msgstr "" #: data.cpp:208 cpu-x-gtk-3.12.ui:746 msgid "Processor" msgstr "" #: data.cpp:240 data.cpp:329 cpu-x-gtk-3.12.ui:1968 msgid "Caches" msgstr "" #: data.cpp:247 #, c-format msgid "%2d x %4d %s, %2d-way" msgstr "" #: data.cpp:249 #, c-format msgid "%d %s, %d-way" msgstr "" #: data.cpp:263 msgid "Count" msgstr "" #: data.cpp:276 cpu-x-gtk-3.12.ui:968 msgid "Clocks" msgstr "" #: data.cpp:379 data.cpp:383 #, c-format msgid "L%u Cache" msgstr "" #: data.cpp:385 #, c-format msgid "%s associative, %d-%s line size" msgstr "" #: data.cpp:398 msgid "Test" msgstr "" #: data.cpp:409 data.cpp:423 cpu-x-gtk-3.12.ui:2146 cpu-x-gtk-3.12.ui:2517 msgid "Motherboard" msgstr "" #: data.cpp:437 cpu-x-gtk-3.12.ui:2367 msgid "BIOS" msgstr "" #: data.cpp:452 cpu-x-gtk-3.12.ui:2498 msgid "Chipset" msgstr "" #: data.cpp:467 data.cpp:569 cpu-x-gtk-3.12.ui:3156 cpu-x-gtk-3.12.ui:3761 msgid "Memory" msgstr "" #: data.cpp:483 #, c-format msgid "Stick %u" msgstr "" #: data.cpp:487 cpu-x-gtk-3.12.ui:3134 msgid "Sticks" msgstr "" #: data.cpp:541 cpu-x-gtk-3.12.ui:3780 msgid "System" msgstr "" #: data.cpp:554 cpu-x-gtk-3.12.ui:3380 msgid "Operating System" msgstr "" #: data.cpp:587 cpu-x-gtk-3.12.ui:4960 msgid "Graphics" msgstr "" #: data.cpp:621 #, c-format msgid "Card %u" msgstr "" #: data.cpp:625 cpu-x-gtk-3.12.ui:4938 msgid "Cards" msgstr "" #: data.cpp:672 cpu-x-gtk-3.12.ui:5300 msgid "Bench" msgstr "" #: data.cpp:685 msgid "Not started" msgstr "" #: data.cpp:688 cpu-x-gtk-3.12.ui:5070 msgid "Prime numbers (slow)" msgstr "" #: data.cpp:692 cpu-x-gtk-3.12.ui:5178 msgid "Prime numbers (fast)" msgstr "" #: data.cpp:696 cpu-x-gtk-3.12.ui:5281 msgid "Parameters" msgstr "" #: data.cpp:721 data.cpp:727 #, c-format msgid "%u mins" msgstr "" #: data.cpp:734 cpu-x-gtk-3.12.ui:5444 cpu-x-gtk-3.12.ui:5552 msgid "About" msgstr "" #: data.cpp:739 #, c-format msgid "" "%s is a Free software that gathers information\n" "on CPU, motherboard and more." msgstr "" #: data.cpp:744 msgid "About CPU-X" msgstr "" #: data.cpp:745 #, c-format msgid "Version %s" msgstr "" #: data.cpp:746 #, c-format msgid "Author: %s" msgstr "" #: data.cpp:747 #, c-format msgid "Site: %s" msgstr "" #: data.cpp:751 cpu-x-gtk-3.12.ui:5533 msgid "License" msgstr "" #: data.cpp:753 #, c-format msgid "This software is distributed under the terms of %s" msgstr "" #: data.cpp:754 main.cpp:176 msgid "This program comes with ABSOLUTELY NO WARRANTY" msgstr "" #: gui_gtk.cpp:61 #, c-format msgid "Cannot find path for '%s' file" msgstr "" #: gui_gtk.cpp:400 msgid "Start daemon" msgstr "" #: gui_gtk.cpp:403 msgid "Connected to daemon" msgstr "" #: gui_gtk.cpp:406 msgid "No polkit authentication agent found" msgstr "" #: gui_gtk.cpp:411 msgid "Ask password to start daemon in background" msgstr "" #: gui_gtk.cpp:415 msgid "Settings" msgstr "" #: gui_gtk.cpp:634 msgid "BaseFamily" msgstr "" #: gui_gtk.cpp:635 msgid "CPU display (\"true\") family (computed as BaseFamily+ExtendedFamily)" msgstr "" #: gui_gtk.cpp:636 msgid "BaseModel" msgstr "" #: gui_gtk.cpp:637 msgid "CPU display (\"true\") model (computed as (ExtendedModel<<4)+BaseModel)" msgstr "" #: gui_gtk.cpp:847 msgid "" "Identify the physically-labeled socket or board position where the memory " "device is located" msgstr "" #: gui_gtk.cpp:848 msgid "Identify the physically labeled bank where the memory device is located" msgstr "" #: gui_gtk.cpp:1052 msgid "User Mode Driver Version" msgstr "" #: gui_gtk.cpp:1066 msgid "Vulkan Ray Tracing" msgstr "" #: gui_gtk.cpp:1260 msgid "Starting GTK GUI…" msgstr "" #: gui_gtk.cpp:1272 msgid "failed to import UI in GtkBuilder" msgstr "" #: main.cpp:63 msgid "Start graphical user interface (GUI) (default)" msgstr "" #: main.cpp:64 msgid "Start text-based user interface (TUI)" msgstr "" #: main.cpp:65 msgid "Dump all data on standard output and exit" msgstr "" #: main.cpp:66 msgid "Run embedded command dmidecode and exit" msgstr "" #: main.cpp:67 msgid "Run embedded command bandwidth and exit" msgstr "" #: main.cpp:68 msgid "Set temperature unit (c[elsius]|f[ahrenheit]|k[elvin]|r[ankine])" msgstr "" #: main.cpp:69 msgid "Set custom time between two refreshes (in seconds)" msgstr "" #: main.cpp:70 msgid "Set default tab (integer)" msgstr "" #: main.cpp:71 msgid "Select core type to monitor (integer)" msgstr "" #: main.cpp:72 msgid "Select CPU core to monitor (integer)" msgstr "" #: main.cpp:73 msgid "Set custom bandwidth test for CPU caches speed (integer)" msgstr "" #: main.cpp:74 msgid "Select default memory stick (integer)" msgstr "" #: main.cpp:75 msgid "Select default graphic card (integer)" msgstr "" #: main.cpp:76 cpu-x-gtk-3.12.ui:5910 msgid "Start and connect to daemon" msgstr "" #: main.cpp:77 msgid "Verbose output" msgstr "" #: main.cpp:78 msgid "Print help and exit" msgstr "" #: main.cpp:79 msgid "Print version and exit" msgstr "" #: main.cpp:80 msgid "Print CPUID values in decimal (default is hexadeximal)" msgstr "" #: main.cpp:81 msgid "Disable colored output" msgstr "" #: main.cpp:82 msgid "Print information for debugging" msgstr "" #: main.cpp:83 msgid "Print required information to paste in an issue" msgstr "" #: main.cpp:84 msgid "Set key mapping for NCurses mode (a[rrows]|e[macs]|i[nverted-T]|v[im])" msgstr "" #: main.cpp:95 msgid "Add default command line arguments" msgstr "" #: main.cpp:96 msgid "Enforce the bus clock" msgstr "" #: main.cpp:97 msgid "" "Ignore CPU values reported by libcpuid (comma-separated values among 'temp', " "'volt' and 'freq')" msgstr "" #: main.cpp:98 msgid "Read CPUID raw data from a given file" msgstr "" #: main.cpp:99 msgid "Only print a message if CPU is not present in the database" msgstr "" #: main.cpp:126 #, c-format msgid "Usage: %s DISPLAY [OPTIONS]\n" msgstr "" #: main.cpp:127 msgid "Available DISPLAY:" msgstr "" #: main.cpp:135 msgid "Available OPTIONS:" msgstr "" #: main.cpp:144 msgid "Influenceable environment variables:" msgstr "" #: main.cpp:175 msgid "This is free software: you are free to change and redistribute it." msgstr "" #: main.cpp:177 #, c-format msgid "See the %s license: <%s>\n" msgstr "" #: main.cpp:184 #, c-format msgid "-- %-9s version: %s" msgstr "" #: main.cpp:381 #, c-format msgid "" "\n" "Oops, something was wrong! %s has received signal %d (%s) and has crashed." msgstr "" #: main.cpp:383 #, c-format msgid "" "\n" "Oops, something was wrong! %s has received signal %d (%s) and is trying to " "recover." msgstr "" #: main.cpp:407 msgid "You can open a new issue here, by filling the template as requested:" msgstr "" #: main.cpp:449 msgid "an error occurred while setting locale" msgstr "" #: options.cpp:124 #, c-format msgid "" "Selected CPU type (%u) is not a valid number (%u is the maximum for this CPU)" msgstr "" #: options.cpp:145 #, c-format msgid "" "Selected bandwidth test (%u) is not a valid number (%u is the maximum for " "this system)" msgstr "" #: options.cpp:168 #, c-format msgid "" "Selected RAM stick (%u) is not a valid number (%u is the maximum for this " "system)" msgstr "" #: options.cpp:188 #, c-format msgid "" "Selected graphic card (%u) is not a valid number (%u is the maximum for this " "system)" msgstr "" #: options.cpp:204 #, c-format msgid "failed to change CPU affinitiy to core %u" msgstr "" #: options.cpp:210 #, c-format msgid "" "Selected CPU core (%u) is not a valid number (%u is the maximum for this " "type of core)" msgstr "" #: options.cpp:284 #, c-format msgid "Selected tab (%u) is not a valid number (%u is the maximum)" msgstr "" #: tui_ncurses.cpp:111 msgid "Window is too small!" msgstr "" #: tui_ncurses.cpp:119 msgid "Press 'h' to see help." msgstr "" #: tui_ncurses.cpp:232 #, c-format msgid "Welcome in %s NCurses help!\n" msgstr "" #: tui_ncurses.cpp:233 msgid "This help describes how to use this Text-based User Interface." msgstr "" #: tui_ncurses.cpp:235 msgid "Global keys:" msgstr "" #: tui_ncurses.cpp:236 msgid "Press 'left' key or 'tab' key to switch in left tab." msgstr "" #: tui_ncurses.cpp:237 msgid "Press 'right' key or 'shift + tab' keys to switch in right tab." msgstr "" #: tui_ncurses.cpp:238 msgid "Press 'h' key to see this help." msgstr "" #: tui_ncurses.cpp:239 msgid "Press 'q' key to exit." msgstr "" #: tui_ncurses.cpp:241 msgid "CPU tab:" msgstr "" #: tui_ncurses.cpp:242 msgid "Press 'next page' key to decrease core type number to monitor." msgstr "" #: tui_ncurses.cpp:243 msgid "Press 'previous page' key to increase core type number to monitor." msgstr "" #: tui_ncurses.cpp:244 msgid "Press 'down' key to decrease CPU core number to monitor." msgstr "" #: tui_ncurses.cpp:245 msgid "Press 'up' key to increase CPU core number to monitor." msgstr "" #: tui_ncurses.cpp:247 msgid "Caches tab:" msgstr "" #: tui_ncurses.cpp:248 msgid "Press 'down' key to switch to previous test." msgstr "" #: tui_ncurses.cpp:249 msgid "Press 'up' key to switch to next test." msgstr "" #: tui_ncurses.cpp:251 msgid "Bench tab:" msgstr "" #: tui_ncurses.cpp:252 msgid "Press 'down' key to decrement benchmark duration." msgstr "" #: tui_ncurses.cpp:253 msgid "Press 'up' key to increment benchmark duration." msgstr "" #: tui_ncurses.cpp:254 msgid "Press 'next page' key to decrement number of threads to use." msgstr "" #: tui_ncurses.cpp:255 msgid "Press 'previous page' key to increment number of threads to use." msgstr "" #: tui_ncurses.cpp:256 msgid "Press 's' key to start/stop prime numbers (slow) benchmark." msgstr "" #: tui_ncurses.cpp:257 msgid "Press 'f' key to start/stop prime numbers (fast) benchmark." msgstr "" #: tui_ncurses.cpp:259 msgid "Graphics tab:" msgstr "" #: tui_ncurses.cpp:260 msgid "Press 'down' key to switch to previous graphic card." msgstr "" #: tui_ncurses.cpp:261 msgid "Press 'up' key to switch to next graphic card." msgstr "" #: tui_ncurses.cpp:263 msgid "Press any key to exit this help." msgstr "" #: tui_ncurses.cpp:640 msgid "Starting NCurses TUI…" msgstr "" #: tui_ncurses.cpp:649 msgid "" "FATAL ERROR: terminfo database could not be found (try to set TERMINFO " "environment variable)" msgstr "" #: tui_ncurses.cpp:654 #, c-format msgid "Failed to set up %s terminal (err=%i); falling back to %s" msgstr "" #: util.cpp:189 #, c-format msgid "cannot find unit in '%s' string at position %i" msgstr "" #: util.cpp:252 #, c-format msgid "an error occurred while opening file '%s'" msgstr "" #: util.cpp:297 #, c-format msgid "an error occurred while running command '%s'" msgstr "" #: util.cpp:437 msgid "set_cpu_affinity() not supported on this operating system" msgstr "" #: data.hpp:103 data.hpp:244 data.hpp:332 msgid "Vendor" msgstr "" #: data.hpp:104 msgid "Code Name" msgstr "" #: data.hpp:105 msgid "Package" msgstr "" #: data.hpp:106 msgid "Technology" msgstr "" #: data.hpp:107 data.hpp:268 msgid "Voltage" msgstr "" #: data.hpp:108 msgid "Specification" msgstr "" #: data.hpp:109 msgid "Family" msgstr "" #: data.hpp:110 msgid "Disp. Family" msgstr "" #: data.hpp:111 data.hpp:224 data.hpp:245 data.hpp:335 msgid "Model" msgstr "" #: data.hpp:112 msgid "Disp. Model" msgstr "" #: data.hpp:113 msgid "Temp." msgstr "" #: data.hpp:114 msgid "Stepping" msgstr "" #: data.hpp:115 msgid "Instructions" msgstr "" #: data.hpp:125 msgid "L1 Data" msgstr "" #: data.hpp:126 msgid "L1 Inst." msgstr "" #: data.hpp:127 msgid "Level 2" msgstr "" #: data.hpp:128 msgid "Level 3" msgstr "" #: data.hpp:137 cpu-x-gtk-3.12.ui:1232 msgid "Cores" msgstr "" #: data.hpp:138 data.hpp:408 cpu-x-gtk-3.12.ui:1252 msgid "Threads" msgstr "" #: data.hpp:155 msgid "Core Speed" msgstr "" #: data.hpp:156 msgid "Multiplier" msgstr "" #: data.hpp:157 msgid "Bus Speed" msgstr "" #: data.hpp:158 data.hpp:341 msgid "Usage" msgstr "" #: data.hpp:188 data.hpp:265 msgid "Size" msgstr "" #: data.hpp:189 data.hpp:267 msgid "Speed" msgstr "" #: data.hpp:223 data.hpp:259 msgid "Manufacturer" msgstr "" #: data.hpp:225 msgid "Revision" msgstr "" #: data.hpp:233 msgid "Brand" msgstr "" #: data.hpp:234 msgid "Version" msgstr "" #: data.hpp:235 msgid "Date" msgstr "" #: data.hpp:236 msgid "ROM Size" msgstr "" #: data.hpp:260 msgid "Part Number" msgstr "" #: data.hpp:261 msgid "Type" msgstr "" #: data.hpp:262 msgid "Type Detail" msgstr "" #: data.hpp:263 msgid "Device Locator" msgstr "" #: data.hpp:264 msgid "Bank Locator" msgstr "" #: data.hpp:266 msgid "Rank" msgstr "" #: data.hpp:292 msgid "Name" msgstr "" #: data.hpp:293 msgid "Kernel" msgstr "" #: data.hpp:294 msgid "Hostname" msgstr "" #: data.hpp:295 msgid "Uptime" msgstr "" #: data.hpp:303 msgid "Used" msgstr "" #: data.hpp:304 msgid "Buffers" msgstr "" #: data.hpp:305 msgid "Cached" msgstr "" #: data.hpp:306 msgid "Free" msgstr "" #: data.hpp:307 msgid "Swap" msgstr "" #: data.hpp:333 msgid "Driver" msgstr "" #: data.hpp:334 msgid "UMD Version" msgstr "" #: data.hpp:336 msgid "Compute Unit" msgstr "" #: data.hpp:337 msgid "Device ID" msgstr "" #: data.hpp:338 msgid "VBIOS Version" msgstr "" #. #-#-#-#-# source_ui.pot (cpu-x ) #-#-#-#-# #. Setting: "Interface" tab #: data.hpp:339 cpu-x-gtk-3.12.ui:5807 msgid "Interface" msgstr "" #: data.hpp:340 msgid "Temperature" msgstr "" #: data.hpp:342 msgid "Core Voltage" msgstr "" #: data.hpp:343 msgid "Power Avg" msgstr "" #: data.hpp:344 msgid "Core Clock" msgstr "" #: data.hpp:345 msgid "Memory Clock" msgstr "" #: data.hpp:346 msgid "Memory Used" msgstr "" #: data.hpp:347 msgid "Resizable BAR" msgstr "" #: data.hpp:348 msgid "Vulkan RT" msgstr "" #: data.hpp:349 msgid "OpenGL Version" msgstr "" #: data.hpp:350 msgid "Vulkan Version" msgstr "" #: data.hpp:351 msgid "OpenCL Version" msgstr "" #: data.hpp:387 msgid "Score" msgstr "" #: data.hpp:388 msgid "Run" msgstr "" #: data.hpp:407 msgid "Duration" msgstr "" #: util.hpp:77 msgid "bytes" msgstr "" #. TRANSLATORS: initials for kilobyte (10³): please put initials (keep it short) #: util.hpp:80 msgid "kB" msgstr "" #. TRANSLATORS: initials for megabyte (10⁶): please put initials (keep it short) #: util.hpp:82 msgid "MB" msgstr "" #. TRANSLATORS: initials for gigabyte (10⁹): please put initials (keep it short) #: util.hpp:84 msgid "GB" msgstr "" #. TRANSLATORS: initials for terabyte (10¹²): please put initials (keep it short) #: util.hpp:86 msgid "TB" msgstr "" #. TRANSLATORS: initials for kibibyte (2¹⁰): please put initials (keep it short) #: util.hpp:89 msgid "KiB" msgstr "" #. TRANSLATORS: initials for mebibyte (2²⁰): please put initials (keep it short) #: util.hpp:91 msgid "MiB" msgstr "" #. TRANSLATORS: initials for gibibyte (2³⁰): please put initials (keep it short) #: util.hpp:93 msgid "GiB" msgstr "" #. TRANSLATORS: initials for tebibyte (2⁴⁰): please put initials (keep it short) #: util.hpp:95 msgid "TiB" msgstr "" #: cpu-x-gtk-3.12.ui:1184 msgid "Cache" msgstr "" #. Setting: refresh time for UI #: cpu-x-gtk-3.12.ui:5721 msgid "Refresh time" msgstr "" #. Setting: GUI theme #: cpu-x-gtk-3.12.ui:5745 msgid "Text theme" msgstr "" #. Setting: automatic GUI theme #: cpu-x-gtk-3.12.ui:5760 msgid "Automatic" msgstr "" #. Setting: light GUI theme #: cpu-x-gtk-3.12.ui:5761 msgid "Blue for light theme" msgstr "" #. Setting: dark GUI theme #: cpu-x-gtk-3.12.ui:5762 msgid "Yellow for dark theme" msgstr "" #. Setting: temperature unit #: cpu-x-gtk-3.12.ui:5775 msgid "Temperature unit" msgstr "" #. Setting: default tab at startup #: cpu-x-gtk-3.12.ui:5826 msgid "Default tab" msgstr "" #. Setting: default CPU core at startup #: cpu-x-gtk-3.12.ui:5839 msgid "Default CPU core" msgstr "" #. Setting: default cache test at startup #: cpu-x-gtk-3.12.ui:5852 msgid "Default cache test" msgstr "" #. Setting: print CPUID values in decimal or hexadecimal #: cpu-x-gtk-3.12.ui:5895 msgid "Print CPUID values in decimal" msgstr "" #. Setting: default graphic card at startup #: cpu-x-gtk-3.12.ui:5928 msgid "Default graphic card" msgstr "" #. Setting: default CPU core at startup #: cpu-x-gtk-3.12.ui:5952 msgid "Default core type" msgstr "" #. Setting: default graphic card at startup #: cpu-x-gtk-3.12.ui:5976 msgid "Default memory stick" msgstr "" #. Setting: "Startup" tab #: cpu-x-gtk-3.12.ui:6004 msgid "Startup" msgstr "" CPU-X-5.0.3/po/sv.po000066400000000000000000001121331454622605200137700ustar00rootroot00000000000000# CPU-X translations template # Copyright © 2014-2024 The Tumultuous Unicorn Of Darkness # This file is distributed under the same license as the cpu-x package. # Åke Engelbrektson , 2021, 2022, 2023. # bittin1ddc447d824349b2 , 2023. msgid "" msgstr "" "Project-Id-Version: cpu-x\n" "Report-Msgid-Bugs-To: https://github.com/TheTumultuousUnicornOfDarkness/CPU-" "X/issues\n" "POT-Creation-Date: 2023-12-09 13:09+0100\n" "PO-Revision-Date: 2023-12-11 17:05+0000\n" "Last-Translator: Åke Engelbrektson \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.3-dev\n" #: core.cpp:135 msgid "Finding CPU technology" msgstr "Söker CPU-teknologi" #: core.cpp:161 #, c-format msgid "" "Your CPU is not present in the database ==> %s, model: %i, ext. model: %i, " "ext. family: %i" msgstr "" "Din CPU finns inte i databasen ==> %s, modell: %i, ext. model: %i, ext. " "family: %i" #: core.cpp:189 data.cpp:150 data.cpp:342 msgid "unknown" msgstr "okänd" #: core.cpp:230 msgid "Calling libcpuid for retrieving static data" msgstr "Anropar libcpuid för hämtning av statisk data" #: core.cpp:245 #, c-format msgid "failed to call libcpuid (%s)" msgstr "kunde inte anropa libcpuid (%s)" #: core.cpp:340 msgid "Calling libcpuid for retrieving dynamic data" msgstr "Anropar libcpuid för hämtning av dynamisk data" #: core.cpp:353 msgid "Calling libcpuid for retrieving CPU MSR static values" msgstr "Anropar libcpuid för hämtning av CPU MSR statisk data" #: core.cpp:380 msgid "Calling libcpuid for retrieving CPU MSR dynamic values" msgstr "Anropar libcpuid för hämtning av CPU MSR dynamisk data" #: core.cpp:412 msgid "Calling dmidecode" msgstr "Anropar dmidecode" #: core.cpp:454 core.cpp:473 #, c-format msgid "%s (configured)" msgstr "%s (konfigurerad)" #: core.cpp:461 core.cpp:480 #, c-format msgid "%s (max)" msgstr "%s (max)" #: core.cpp:466 #, c-format msgid "%s (min)" msgstr "%s (min)" #: core.cpp:496 msgid "Calculating CPU usage" msgstr "Beräknar CPU-användning" #: core.cpp:546 msgid "Calling bandwidth" msgstr "Anropar bandbredd" #: core.cpp:613 #, c-format msgid "" "pci_access is not properly initialized: it is a common issue when %s was " "built with a lower libpci version.\n" "Check that libpci %s library is present on your system. Otherwise, please " "rebuild %s." msgstr "" "pci_access är inte ordentligt initierad. Det är ett vanligt problem när %s " "byggts med en lägre libpci-version.\n" "Kontrollera att libpci %s bibliotek finns i ditt system. Annars, bygg om %s." #: core.cpp:657 #, c-format msgid "No kernel driver in use for graphic card at path %s" msgstr "" "Ingen drivrutin för kärnan som används, för grafikkortet på sökvägen %s" #: core.cpp:693 #, c-format msgid "Your GPU kernel driver is unknown: %s" msgstr "Din GPU-kärndrivrutin är okänd: %s" #: core.cpp:777 #, c-format msgid "Your GPU user mode driver is unknown for vendor %s: %s" msgstr "Din drivrutin för GPU-användarläge är okänd för leverantören %s: %s" #: core.cpp:781 #, c-format msgid "failed to call GLFW (%i): %s" msgstr "kunde inte anropa GLFW (%i): %s" #: core.cpp:914 msgid "Finding Vulkan API version" msgstr "Hittar Vulkan API-version" #: core.cpp:926 #, c-format msgid "failed to call vkCreateInstance (%s)" msgstr "kunde inte anropa vkCreateInstance (%s)" #: core.cpp:929 #, c-format msgid "%s is not supported" msgstr "%s stöds inte" #: core.cpp:937 #, c-format msgid "failed to call vkEnumeratePhysicalDevices (%s)" msgstr "kunde inte anropa vkEnumeratePhysicalDevices (%s)" #: core.cpp:944 msgid "No available Vulkan devices" msgstr "Inga tillgängliga Vulkan-enheter" #: core.cpp:952 #, c-format msgid "No available physical devices (%s)" msgstr "Inga fysiska enheter tillgängliga (%s)" #: core.cpp:1015 #, c-format msgid "Failed to create Vulkan for device %u (%s)" msgstr "Kunde inte skapa Vulkan för enhet %u (%s)" #: core.cpp:1019 #, c-format msgid "%s is not supported for device %u, use only deviceID for matching" msgstr "%s stöds inte för enheten %u, använd endast deviceID för matchning." #: core.cpp:1051 core.cpp:1364 msgid "Enabled" msgstr "Aktiverad" #: core.cpp:1051 core.cpp:1364 msgid "Disabled" msgstr "Inaktiverad" #: core.cpp:1088 msgid "Finding OpenCL API version" msgstr "Hittar OpenCL API-version" #: core.cpp:1092 #, c-format msgid "There is no platform with OpenCL support (%s)" msgstr "Det finns ingen plattform med OpenCL-stöd (%s)" #: core.cpp:1102 #, c-format msgid "failed to get all OpenCL platforms (%s)" msgstr "kunde inte hämta alla OpenCL-plattformar (%s)" #: core.cpp:1115 #, c-format msgid "failed to get name for platform %u (%s)" msgstr "kunde inte hämta namn för plattformen %u (%s)" #: core.cpp:1123 #, c-format msgid "failed to get version for platform %u (%s)" msgstr "kunde inte hämta versionsinfo för plattformen %u (%s)" #: core.cpp:1131 #, c-format msgid "failed to find number of OpenCL devices for platform '%s %s' (%s)" msgstr "kunde inte hitta antalet OpenCL-enheter för plattformen \"%s %s\" (%s)" #: core.cpp:1131 msgid "0 device" msgstr "0-enhet" #: core.cpp:1140 #, c-format msgid "failed to get all of OpenCL devices for platform '%s %s' (%s)" msgstr "kunde inte hämta alla OpenCL-enheter för plattformen \"%s %s\" (%s)" #: core.cpp:1160 #, c-format msgid "failed to get name for device %u (%s)" msgstr "kunde inte hämta namn för enhet %u (%s)" #: core.cpp:1168 #, c-format msgid "failed to get version for device %u (%s)" msgstr "kunde inte hämta versionen för enheten %u (%s)" #: core.cpp:1190 #, c-format msgid "OpenCL driver for '%s %s' does not support CL_DEVICE_TOPOLOGY_AMD (%s)" msgstr "" "OpenCL-drivrutin för \"%s %s\" stödjer inte CL_DEVICE_TOPOLOGY_AMD (%s)" #: core.cpp:1201 #, c-format msgid "" "OpenCL driver for '%s %s' does not support CL_DEVICE_GFXIP_MAJOR_AMD (%s)" msgstr "" "OpenCL-drivrutin för \"%s %s\" stödjer inte CL_DEVICE_GFXIP_MAJOR_AMD (%s)" #: core.cpp:1209 core.cpp:1229 core.cpp:1262 #, c-format msgid "" "OpenCL driver for '%s %s' does not support CL_DEVICE_MAX_COMPUTE_UNITS (%s)" msgstr "" "OpenCL-drivrutin för \"%s %s\" stödjer inte CL_DEVICE_MAX_COMPUTE_UNITS (%s)" #: core.cpp:1250 #, c-format msgid "" "OpenCL driver for '%s %s' does not support CL_DEVICE_PCI_DOMAIN_ID_NV (%s), " "CL_DEVICE_PCI_BUS_ID_NV (%s) or CL_DEVICE_PCI_SLOT_ID_NV (%s)" msgstr "" "OpenCL-drivrutin för \"%s %s\" stödjer inte CL_DEVICE_PCI_DOMAIN_ID_NV (%s), " "CL_DEVICE_PCI_BUS_ID_NV (%s) eller CL_DEVICE_PCI_SLOT_ID_NV (%s)" #: core.cpp:1273 #, c-format msgid "OpenCL is not supported with your GPU vendor (0x%X)" msgstr "OpenCL stöds inte med din GPU-leverantör (0x%X)" #: core.cpp:1295 msgid "Finding devices" msgstr "Söker enheter" #: core.cpp:1307 #, c-format msgid "Skip devices search (wrong permissions on %s device)" msgstr "Hoppa över enhetssök (fel behörigheter på %s)" #: core.cpp:1350 #, c-format msgid "Your GPU vendor is unknown: %s (0x%X)" msgstr "Din GPU-leverantör är okänd: %s (0x%X)" #: core.cpp:1370 msgid "failed to find chipset vendor and model" msgstr "kunde inte hitta chipset-leverantör och modell" #: core.cpp:1385 msgid "failed to find graphic card vendor and model" msgstr "kunde inte hitta grafikkortsleverantör och modell" #: core.cpp:1487 msgid "Retrieving GPU clocks" msgstr "Hämtar GPU-frekvenser" #: core.cpp:1500 msgid "None" msgstr "Inga" #: core.cpp:1509 #, c-format msgid "DRM path for %s is unknown" msgstr "DRM-sökväg för %s är okänd" #: core.cpp:1516 #, c-format msgid "Card number for %s is unknown" msgstr "Kortnummer för %s är okänt" #: core.cpp:1541 #, c-format msgid "PCIe %s (current) / %s (max)" msgstr "PCIe %s (nuvarande) / %s (max)" #: core.cpp:1650 #, c-format msgid "Driver for %s doesn't report frequencies" msgstr "Drivrutinen för %s rapporterar inte frekvenser" #: core.cpp:1671 #, c-format msgid "failed to retrieve all monitoring data for %s" msgstr "kunde inte hämta alla övervakningsdata %s" #: core.cpp:1694 msgid "Identifying running system" msgstr "Identifierar aktuellt system" #: core.cpp:1697 msgid "failed to identify running system" msgstr "kunde inte identifiera aktuellt system" #: core.cpp:1749 core.cpp:1778 msgid "Calling libprocps" msgstr "Anropar libprocps" #: core.cpp:1752 msgid "unable to get system uptime" msgstr "kunde inte hämta systemets upptid" #: core.cpp:1758 msgid "unable to create meminfo structure" msgstr "kunde inte skapa struktur för minnesinformation" #: core.cpp:1804 msgid "Calling libstatgrab" msgstr "Anropar libstatgrab" #: core.cpp:1852 #, c-format msgid "%i days, %i hours, %i minutes, %i seconds" msgstr "%i dagar, %i timmar, %i minuter, %i sekunder" #: core.cpp:1915 msgid "Updating benchmark status" msgstr "Uppdaterar prestandateststatus" #: core.cpp:1918 msgid "Active" msgstr "Aktiv" #: core.cpp:1921 #, c-format msgid "(%u hours left)" msgstr "(%u timmar kvar)" #: core.cpp:1923 #, c-format msgid "(%u minutes left)" msgstr "(%u minuter kvar)" #: core.cpp:1925 #, c-format msgid "(%u seconds left)" msgstr "(%u sekunder kvar)" #: core.cpp:1929 core.cpp:1984 core.cpp:1985 msgid "Inactive" msgstr "Inaktiv" #: core.cpp:1932 #, c-format msgid "in %u hours" msgstr "om %u timmar" #: core.cpp:1934 #, c-format msgid "in %u minutes" msgstr "om %u minuter" #: core.cpp:1936 #, c-format msgid "in %u seconds" msgstr "om %u sekunder" #: core.cpp:1953 #, c-format msgid "Starting benchmark with %u threads" msgstr "Startar test med %u trådar" #: core.cpp:1976 msgid "an error occurred while starting benchmark" msgstr "ett fel inträffade under start av prestandatest" #: core.cpp:2002 msgid "Finding CPU package in fallback mode" msgstr "Söker CPU-paket i nödfallsläge" #: core.cpp:2032 #, c-format msgid "Your CPU socket is not present in the database ==> %s, codename: %s" msgstr "Din CPU-sockel finns inte databasen ==> %s, kodnamn: %s" #: core.cpp:2052 msgid "Calculating CPU multipliers in fallback mode" msgstr "Beräknar CPU-multiplikatorer i nödfallsläge" #: core.cpp:2072 msgid "Retrieving motherboard information in fallback mode" msgstr "Hämtar moderkortsinformation i nödfallsläge" #: core.cpp:2085 msgid "failed to retrieve motherboard information (fallback mode)" msgstr "kunde inte hämta moderkortsinformation (nödfallsläge)" #: core.cpp:2127 msgid "Retrieving CPU temperature in fallback mode" msgstr "Hämtar CPU-temperatur i nödfallsläge" #: core.cpp:2173 msgid "failed to retrieve CPU temperature (fallback mode)" msgstr "kunde inte hämta CPU-temperatur (nödfallsläge)" #: core.cpp:2188 msgid "Retrieving CPU voltage in fallback mode" msgstr "Hämtar CPU-spänning i nödfallsläge" #: core.cpp:2200 msgid "failed to retrieve CPU voltage (fallback mode)" msgstr "kunde inte hämta CPU-spänning (nödfallsläge)" #: core.cpp:2214 msgid "Retrieving CPU frequency in fallback mode" msgstr "Hämtar CPU-frekvens i nödfallsläge" #: core.cpp:2220 msgid "failed to retrieve CPU frequency (fallback mode)" msgstr "kunde inte hämta CPU-frekvens (nödfallsläge)" #: daemon_client.cpp:65 msgid "Starting daemon in background…" msgstr "Startar tjänsten i bakgrunden…" #: daemon_client.cpp:172 msgid "pkexec: authorization could not be obtained (dialog dismissed)" msgstr "pkexec: Auktorisering kunde inte erhållas (dialog avfärdas)" #: daemon_client.cpp:175 msgid "pkexec: authorization could not be obtained (not authorized)" msgstr "pkexec: Auktorisation kunde inte erhållas (ej auktoriserad)" #: daemon_client.cpp:178 msgid "pkexec: command not found" msgstr "pkexec: Kommandot hittades inte" #: daemon_client.cpp:181 msgid "pkexec: unexpected error code" msgstr "pkexec: Oväntad felkod" #: daemon_client.cpp:211 msgid "Connecting to daemon…" msgstr "Ansluter till tjänsten…" #: daemon_server.cpp:261 #, c-format msgid "request_handler: case %i not handled" msgstr "request_handler: Fall %i hanterades inte" #: data.cpp:124 cpu-x-gtk-3.12.ui:1370 msgid "CPU" msgstr "CPU" #: data.cpp:187 msgid "P-core" msgstr "P-kärna" #: data.cpp:188 msgid "E-core" msgstr "E-kärna" #: data.cpp:189 data.cpp:192 msgid "Core" msgstr "Kärna" #: data.cpp:208 cpu-x-gtk-3.12.ui:746 msgid "Processor" msgstr "Processor" #: data.cpp:240 data.cpp:329 cpu-x-gtk-3.12.ui:1968 msgid "Caches" msgstr "Cache" #: data.cpp:247 #, c-format msgid "%2d x %4d %s, %2d-way" msgstr "%2d x %4d %s, %2d-way" #: data.cpp:249 #, c-format msgid "%d %s, %d-way" msgstr "%d %s, %d-way" #: data.cpp:263 msgid "Count" msgstr "Antal" #: data.cpp:276 cpu-x-gtk-3.12.ui:968 msgid "Clocks" msgstr "Frekvenser" #: data.cpp:379 data.cpp:383 #, c-format msgid "L%u Cache" msgstr "L%u Cache" #: data.cpp:385 #, c-format msgid "%s associative, %d-%s line size" msgstr "%s associativa, %d-%s radstorlek" #: data.cpp:398 msgid "Test" msgstr "Test" #: data.cpp:409 data.cpp:423 cpu-x-gtk-3.12.ui:2146 cpu-x-gtk-3.12.ui:2517 msgid "Motherboard" msgstr "Moderkort" #: data.cpp:437 cpu-x-gtk-3.12.ui:2367 msgid "BIOS" msgstr "BIOS" #: data.cpp:452 cpu-x-gtk-3.12.ui:2498 msgid "Chipset" msgstr "Chipset" #: data.cpp:467 data.cpp:569 cpu-x-gtk-3.12.ui:3156 cpu-x-gtk-3.12.ui:3761 msgid "Memory" msgstr "Minne" #: data.cpp:483 #, c-format msgid "Stick %u" msgstr "Sticka %u" #: data.cpp:487 cpu-x-gtk-3.12.ui:3134 msgid "Sticks" msgstr "Sticka" #: data.cpp:541 cpu-x-gtk-3.12.ui:3780 msgid "System" msgstr "System" #: data.cpp:554 cpu-x-gtk-3.12.ui:3380 msgid "Operating System" msgstr "Operativsystem" #: data.cpp:587 cpu-x-gtk-3.12.ui:4960 msgid "Graphics" msgstr "Grafik" #: data.cpp:621 #, c-format msgid "Card %u" msgstr "Kort %u" #: data.cpp:625 cpu-x-gtk-3.12.ui:4938 msgid "Cards" msgstr "Kort" #: data.cpp:672 cpu-x-gtk-3.12.ui:5300 msgid "Bench" msgstr "Testbänk" #: data.cpp:685 msgid "Not started" msgstr "Inte startad" #: data.cpp:688 cpu-x-gtk-3.12.ui:5070 msgid "Prime numbers (slow)" msgstr "Primtal (långsam)" #: data.cpp:692 cpu-x-gtk-3.12.ui:5178 msgid "Prime numbers (fast)" msgstr "Primtal (snabb)" #: data.cpp:696 cpu-x-gtk-3.12.ui:5281 msgid "Parameters" msgstr "Parametrar" #: data.cpp:721 data.cpp:727 #, c-format msgid "%u mins" msgstr "%u min." #: data.cpp:734 cpu-x-gtk-3.12.ui:5444 cpu-x-gtk-3.12.ui:5552 msgid "About" msgstr "Om" #: data.cpp:739 #, c-format msgid "" "%s is a Free software that gathers information\n" "on CPU, motherboard and more." msgstr "" "%s är fri mjukvara som samlar in information\n" "om CPU, moderkort och mer." #: data.cpp:744 msgid "About CPU-X" msgstr "Om GPU-X" #: data.cpp:745 #, c-format msgid "Version %s" msgstr "Version %s" #: data.cpp:746 #, c-format msgid "Author: %s" msgstr "Utvecklare: %s" #: data.cpp:747 #, c-format msgid "Site: %s" msgstr "Sajt: %s" #: data.cpp:751 cpu-x-gtk-3.12.ui:5533 msgid "License" msgstr "Licens" #: data.cpp:753 #, c-format msgid "This software is distributed under the terms of %s" msgstr "Denna mjukvara distribueras under villkoren för %s" #: data.cpp:754 main.cpp:176 msgid "This program comes with ABSOLUTELY NO WARRANTY" msgstr "Detta program levereras UTAN NÅGRA SOM HELST GARANTIER" #: gui_gtk.cpp:61 #, c-format msgid "Cannot find path for '%s' file" msgstr "Kan inte hitta sökvägen för \"%s\"" #: gui_gtk.cpp:400 msgid "Start daemon" msgstr "Starta tjänsten" #: gui_gtk.cpp:403 msgid "Connected to daemon" msgstr "Ansluten till tjänsten" #: gui_gtk.cpp:406 msgid "No polkit authentication agent found" msgstr "Ingen polkit-autentiseringsagent hittades" #: gui_gtk.cpp:411 msgid "Ask password to start daemon in background" msgstr "Be om lösenord för att starta tjänsten i bakgrunden" #: gui_gtk.cpp:415 msgid "Settings" msgstr "Inställningar" #: gui_gtk.cpp:634 msgid "BaseFamily" msgstr "Basfamilj" #: gui_gtk.cpp:635 msgid "CPU display (\"true\") family (computed as BaseFamily+ExtendedFamily)" msgstr "CPU-visningsfamilj (\"true\")(beräknad som BaseFamily+ExtendedFamily)" #: gui_gtk.cpp:636 msgid "BaseModel" msgstr "Basmodell" #: gui_gtk.cpp:637 msgid "CPU display (\"true\") model (computed as (ExtendedModel<<4)+BaseModel)" msgstr "" "CPU-visningsmodell (\"true\")(beräknad som (ExtendedModel<<4)+BaseModel)" #: gui_gtk.cpp:847 msgid "" "Identify the physically-labeled socket or board position where the memory " "device is located" msgstr "" "Identifiera det fysiskt märkta uttaget eller kortposition där minnesenheten " "är placerad" #: gui_gtk.cpp:848 msgid "Identify the physically labeled bank where the memory device is located" msgstr "Identifiera det fysiskt märkta uttaget där minnesenheten finns" #: gui_gtk.cpp:1052 msgid "User Mode Driver Version" msgstr "Användarlägesversion" #: gui_gtk.cpp:1066 msgid "Vulkan Ray Tracing" msgstr "Vulkan Ray-spårning" #: gui_gtk.cpp:1260 msgid "Starting GTK GUI…" msgstr "Startar GTK-gui…" #: gui_gtk.cpp:1272 msgid "failed to import UI in GtkBuilder" msgstr "kunde inte importera UI i GtkBuilder" #: main.cpp:63 msgid "Start graphical user interface (GUI) (default)" msgstr "Starta grafiskt användargränssnitt (GUI) (standard)" #: main.cpp:64 msgid "Start text-based user interface (TUI)" msgstr "Starta textbaserat användargränssnitt (TUI)" #: main.cpp:65 msgid "Dump all data on standard output and exit" msgstr "Dumpa all data till standard utdata och avsluta" #: main.cpp:66 msgid "Run embedded command dmidecode and exit" msgstr "Kör inbäddad kommando-dmidecode och avsluta" #: main.cpp:67 msgid "Run embedded command bandwidth and exit" msgstr "Kör inbäddad kommandobandbredd och avsluta" #: main.cpp:68 msgid "Set temperature unit (c[elsius]|f[ahrenheit]|k[elvin]|r[ankine])" msgstr "Ange temperaturenhet (c[elsius]|f[ahrenheit]|k[elvin]|r[ankine])" #: main.cpp:69 msgid "Set custom time between two refreshes (in seconds)" msgstr "Ange anpassad tid mellan två uppdateringar (i sekunder)" #: main.cpp:70 msgid "Set default tab (integer)" msgstr "Ange standardflik (heltal)" #: main.cpp:71 msgid "Select core type to monitor (integer)" msgstr "Välj kärntyp att övervaka (heltal)" #: main.cpp:72 msgid "Select CPU core to monitor (integer)" msgstr "Välj CPU-kärna att övervaka (heltal)" #: main.cpp:73 msgid "Set custom bandwidth test for CPU caches speed (integer)" msgstr "Ange anpassad bandbreddstest för CPU-cachehastighet (heltal)" #: main.cpp:74 msgid "Select default memory stick (integer)" msgstr "Välj standardminnessticka (heltal)" #: main.cpp:75 msgid "Select default graphic card (integer)" msgstr "Välj standardgrafikkort (heltal)" #: main.cpp:76 cpu-x-gtk-3.12.ui:5910 msgid "Start and connect to daemon" msgstr "Starta och anslut till tjänsten" #: main.cpp:77 msgid "Verbose output" msgstr "Utförlig utdata" #: main.cpp:78 msgid "Print help and exit" msgstr "Skriv ut hjälp och avsluta" #: main.cpp:79 msgid "Print version and exit" msgstr "Skriv ut version och avsluta" #: main.cpp:80 msgid "Print CPUID values in decimal (default is hexadeximal)" msgstr "Skriv ut CPUID-värden decimalt (standard är hexadeximalt)" #: main.cpp:81 msgid "Disable colored output" msgstr "Inaktivera färgad utdata" #: main.cpp:82 msgid "Print information for debugging" msgstr "Skriv ut information för felsökning" #: main.cpp:83 msgid "Print required information to paste in an issue" msgstr "Skriv ut önskad information att klistra in i ett ärende" #: main.cpp:84 msgid "Set key mapping for NCurses mode (a[rrows]|e[macs]|i[nverted-T]|v[im])" msgstr "" "Ange tangentmappning för NCurses-läge (a[rrows]|e[macs]|i[nverted-T]|v[im])" #: main.cpp:95 msgid "Add default command line arguments" msgstr "Lägg till standardargument för kommandorad" #: main.cpp:96 msgid "Enforce the bus clock" msgstr "Framtvinga bussfrekvens" #: main.cpp:97 msgid "" "Ignore CPU values reported by libcpuid (comma-separated values among 'temp', " "'volt' and 'freq')" msgstr "" "Ignorera CPU-värden som rapporterats av libcpuid (komma-separerade värden " "bland \"temp\", \"volt\" och \"freq\")" #: main.cpp:98 msgid "Read CPUID raw data from a given file" msgstr "Läs CPUID-rådata från en given fil" #: main.cpp:99 msgid "Only print a message if CPU is not present in the database" msgstr "Skriv bara ut ett meddelande om CPU:n inte finns med i databasen" #: main.cpp:126 #, c-format msgid "Usage: %s DISPLAY [OPTIONS]\n" msgstr "Användning: %s DISPLAY [OPTIONS]\n" #: main.cpp:127 msgid "Available DISPLAY:" msgstr "Tillgänglig SKÄRM:" #: main.cpp:135 msgid "Available OPTIONS:" msgstr "Tillgängliga ALTERNATIV:" #: main.cpp:144 msgid "Influenceable environment variables:" msgstr "Påverkbara miljövariabler:" #: main.cpp:175 msgid "This is free software: you are free to change and redistribute it." msgstr "Detta är fri mjukvara: Du får ändra och återdistribuera den." #: main.cpp:177 #, c-format msgid "See the %s license: <%s>\n" msgstr "Se %s-licensen: <%s>\n" #: main.cpp:184 #, c-format msgid "-- %-9s version: %s" msgstr "-- %-9s version: %s" #: main.cpp:381 #, c-format msgid "" "\n" "Oops, something was wrong! %s has received signal %d (%s) and has crashed." msgstr "" "\n" "Hoppsan, något gick snett! %s har mottagit signal %d (%s) och har kraschat." #: main.cpp:383 #, c-format msgid "" "\n" "Oops, something was wrong! %s has received signal %d (%s) and is trying to " "recover." msgstr "" "\n" "Hoppsan, något gick snett! %s har mottagit signal %d (%s) och försöker " "återställa." #: main.cpp:407 msgid "You can open a new issue here, by filling the template as requested:" msgstr "" "Du kan öppna ett nytt ärende här, genom att fylla i mallen enligt begäran:" #: main.cpp:449 msgid "an error occurred while setting locale" msgstr "ett fel uppstod vid inställning av språk" #: options.cpp:124 #, c-format msgid "" "Selected CPU type (%u) is not a valid number (%u is the maximum for this CPU)" msgstr "" "Vald CPU-typ (%u) är inte ett giltigt antal (%u är det maximala antalet för " "den här CPU:n)" #: options.cpp:145 #, c-format msgid "" "Selected bandwidth test (%u) is not a valid number (%u is the maximum for " "this system)" msgstr "" "Valt bandbreddstest (%u) är inte ett giltigt tal (%u är det maximala antalet " "för det här systemet)" #: options.cpp:168 #, c-format msgid "" "Selected RAM stick (%u) is not a valid number (%u is the maximum for this " "system)" msgstr "" "Vald RAM-sticka (%u) är inte ett giltigt tal (%u är det maximala antalet för " "den här CPU:n)" #: options.cpp:188 #, c-format msgid "" "Selected graphic card (%u) is not a valid number (%u is the maximum for this " "system)" msgstr "" "Valt grafikkort (%u) är inte ett giltigt tal (%u är det maximala antalet för " "det här systemet)" #: options.cpp:204 #, c-format msgid "failed to change CPU affinitiy to core %u" msgstr "det gick inte att ändra CPU-tillhörighet för kärna %u" #: options.cpp:210 #, c-format msgid "" "Selected CPU core (%u) is not a valid number (%u is the maximum for this " "type of core)" msgstr "" "Valda CPU-kärnor (%u) är inte ett giltigt antal (%u är det maximala antalet " "för denna typ av kärna)" #: options.cpp:284 #, c-format msgid "Selected tab (%u) is not a valid number (%u is the maximum)" msgstr "Vald flik (%u) är inte ett giltigt tal (%u är max)" #: tui_ncurses.cpp:111 msgid "Window is too small!" msgstr "Fönstret är för litet!" #: tui_ncurses.cpp:119 msgid "Press 'h' to see help." msgstr "Tryck \"h\" för att se hjälpen." #: tui_ncurses.cpp:232 #, c-format msgid "Welcome in %s NCurses help!\n" msgstr "Välkommen till %s NCurses hjälp!\n" #: tui_ncurses.cpp:233 msgid "This help describes how to use this Text-based User Interface." msgstr "" "Denna hjälp beskriver hur man använder detta textbaserade användargränssnitt." #: tui_ncurses.cpp:235 msgid "Global keys:" msgstr "Systemövergripande tangenter:" #: tui_ncurses.cpp:236 msgid "Press 'left' key or 'tab' key to switch in left tab." msgstr "Tryck \"vänster\" eller \"tab\" för att växla till vänster flik." #: tui_ncurses.cpp:237 msgid "Press 'right' key or 'shift + tab' keys to switch in right tab." msgstr "Tryck \"höger\" eller \"shift + tab\" för att växla till höger flik." #: tui_ncurses.cpp:238 msgid "Press 'h' key to see this help." msgstr "Tryck \"h\" för att se den här hjälpen." #: tui_ncurses.cpp:239 msgid "Press 'q' key to exit." msgstr "Tryck \"q\" för att avsluta." #: tui_ncurses.cpp:241 msgid "CPU tab:" msgstr "CPU-flik:" #: tui_ncurses.cpp:242 msgid "Press 'next page' key to decrease core type number to monitor." msgstr "Tryck \"next page\" för att minska antalet kärntyper att övervaka." #: tui_ncurses.cpp:243 msgid "Press 'previous page' key to increase core type number to monitor." msgstr "Tryck \"previous page\" för att öka antalet kärntyper att övervaka." #: tui_ncurses.cpp:244 msgid "Press 'down' key to decrease CPU core number to monitor." msgstr "Tryck \"ner\" för att minska antalet CPU-kärnor att övervaka." #: tui_ncurses.cpp:245 msgid "Press 'up' key to increase CPU core number to monitor." msgstr "Tryck \"upp\" för att öka antalet CPU-kärnor att övervaka." #: tui_ncurses.cpp:247 msgid "Caches tab:" msgstr "Cache-flik:" #: tui_ncurses.cpp:248 msgid "Press 'down' key to switch to previous test." msgstr "Tryck \"ner\" för att växla till föregående test." #: tui_ncurses.cpp:249 msgid "Press 'up' key to switch to next test." msgstr "Tryck \"upp\" för att växla till nästa test." #: tui_ncurses.cpp:251 msgid "Bench tab:" msgstr "Testflik:" #: tui_ncurses.cpp:252 msgid "Press 'down' key to decrement benchmark duration." msgstr "Tryck \"ner\" för att minska varaktigheten för prestandatestet." #: tui_ncurses.cpp:253 msgid "Press 'up' key to increment benchmark duration." msgstr "Tryck \"upp\" för att öka varaktigheten för prestandatestet." #: tui_ncurses.cpp:254 msgid "Press 'next page' key to decrement number of threads to use." msgstr "Tryck \"nästa sida\" för att minska antalet trådar som används." #: tui_ncurses.cpp:255 msgid "Press 'previous page' key to increment number of threads to use." msgstr "Tryck \"föregående sida\" för att öka anatalet trådar som används." #: tui_ncurses.cpp:256 msgid "Press 's' key to start/stop prime numbers (slow) benchmark." msgstr "Tryck \"s\" för att starta/stoppa primtalstest (långsam)." #: tui_ncurses.cpp:257 msgid "Press 'f' key to start/stop prime numbers (fast) benchmark." msgstr "Tryck \"f\" för att starta/stoppa primtalstest (snabbt)." #: tui_ncurses.cpp:259 msgid "Graphics tab:" msgstr "Grafikflik:" #: tui_ncurses.cpp:260 msgid "Press 'down' key to switch to previous graphic card." msgstr "Tryck \"ner\" för att växla till föregående grafikkort." #: tui_ncurses.cpp:261 msgid "Press 'up' key to switch to next graphic card." msgstr "Tryck \"upp\" för att växla till nästa grafikkort." #: tui_ncurses.cpp:263 msgid "Press any key to exit this help." msgstr "Tryck valfri tangent för avsluta denna hjälp." #: tui_ncurses.cpp:640 msgid "Starting NCurses TUI…" msgstr "Startar NCurses TUI…" #: tui_ncurses.cpp:649 msgid "" "FATAL ERROR: terminfo database could not be found (try to set TERMINFO " "environment variable)" msgstr "" "ALLVARLIGT FEL: terminfo-databasen kunde inte hittas (försök ange TERMINFO " "miljövariabel)" #: tui_ncurses.cpp:654 #, c-format msgid "Failed to set up %s terminal (err=%i); falling back to %s" msgstr "Det gick inte att starta %s terminal (fel=%i); Faller tillbaka på %s" #: util.cpp:189 #, c-format msgid "cannot find unit in '%s' string at position %i" msgstr "kan inte hitta enhet i strängen \"%s\" på position %i" #: util.cpp:252 #, c-format msgid "an error occurred while opening file '%s'" msgstr "ett fel inträffade vid öppning av filen \"%s\"" #: util.cpp:297 #, c-format msgid "an error occurred while running command '%s'" msgstr "ett fel inträffade vid körning av kommandot \"%s\"" #: util.cpp:437 msgid "set_cpu_affinity() not supported on this operating system" msgstr "set_cpu_affinity() stöds inte på det här operativsystemet" #: data.hpp:103 data.hpp:244 data.hpp:332 msgid "Vendor" msgstr "Producent" #: data.hpp:104 msgid "Code Name" msgstr "Kodnamn" #: data.hpp:105 msgid "Package" msgstr "Paket" #: data.hpp:106 msgid "Technology" msgstr "Teknologi" #: data.hpp:107 data.hpp:268 msgid "Voltage" msgstr "Spänning" #: data.hpp:108 msgid "Specification" msgstr "Specifikation" #: data.hpp:109 msgid "Family" msgstr "Familj" #: data.hpp:110 msgid "Disp. Family" msgstr "Disp. familj" #: data.hpp:111 data.hpp:224 data.hpp:245 data.hpp:335 msgid "Model" msgstr "Modell" #: data.hpp:112 msgid "Disp. Model" msgstr "Disp. modell" #: data.hpp:113 msgid "Temp." msgstr "Temp." #: data.hpp:114 msgid "Stepping" msgstr "Stepping" #: data.hpp:115 msgid "Instructions" msgstr "Instruktioner" #: data.hpp:125 msgid "L1 Data" msgstr "L1-Data" #: data.hpp:126 msgid "L1 Inst." msgstr "L1-Inst." #: data.hpp:127 msgid "Level 2" msgstr "Nivå 2" #: data.hpp:128 msgid "Level 3" msgstr "Nivå 3" #: data.hpp:137 cpu-x-gtk-3.12.ui:1232 msgid "Cores" msgstr "Kärnor" #: data.hpp:138 data.hpp:408 cpu-x-gtk-3.12.ui:1252 msgid "Threads" msgstr "Trådar" #: data.hpp:155 msgid "Core Speed" msgstr "Kärnhastighet" #: data.hpp:156 msgid "Multiplier" msgstr "Multiplikator" #: data.hpp:157 msgid "Bus Speed" msgstr "Busshastighet" #: data.hpp:158 data.hpp:341 msgid "Usage" msgstr "Användning" #: data.hpp:188 data.hpp:265 msgid "Size" msgstr "Storlek" #: data.hpp:189 data.hpp:267 msgid "Speed" msgstr "Hastighet" #: data.hpp:223 data.hpp:259 msgid "Manufacturer" msgstr "Tillverkare" #: data.hpp:225 msgid "Revision" msgstr "Revision" #: data.hpp:233 msgid "Brand" msgstr "Varumärke" #: data.hpp:234 msgid "Version" msgstr "Version" #: data.hpp:235 msgid "Date" msgstr "Datum" #: data.hpp:236 msgid "ROM Size" msgstr "ROM-storlek" #: data.hpp:260 msgid "Part Number" msgstr "Delnummer" #: data.hpp:261 msgid "Type" msgstr "Typ" #: data.hpp:262 msgid "Type Detail" msgstr "Typdetalj" #: data.hpp:263 msgid "Device Locator" msgstr "Enhetsidentifierare" #: data.hpp:264 msgid "Bank Locator" msgstr "Bankidentifierare" #: data.hpp:266 msgid "Rank" msgstr "Ranking" #: data.hpp:292 msgid "Name" msgstr "Namn" #: data.hpp:293 msgid "Kernel" msgstr "Kärna" #: data.hpp:294 msgid "Hostname" msgstr "Värdnamn" #: data.hpp:295 msgid "Uptime" msgstr "Upptid" #: data.hpp:303 msgid "Used" msgstr "Använt" #: data.hpp:304 msgid "Buffers" msgstr "Buffertar" #: data.hpp:305 msgid "Cached" msgstr "Cache-lagrat" #: data.hpp:306 msgid "Free" msgstr "Ledigt" #: data.hpp:307 msgid "Swap" msgstr "Växlingsutrymme" #: data.hpp:333 msgid "Driver" msgstr "Drivrutin" #: data.hpp:334 msgid "UMD Version" msgstr "UMD-version" #: data.hpp:336 msgid "Compute Unit" msgstr "Beräkningsenhet" #: data.hpp:337 msgid "Device ID" msgstr "Enhets-ID" #: data.hpp:338 msgid "VBIOS Version" msgstr "VBIOS-version" #. #-#-#-#-# source_ui.pot (cpu-x ) #-#-#-#-# #. Setting: "Interface" tab #: data.hpp:339 cpu-x-gtk-3.12.ui:5807 msgid "Interface" msgstr "Gränssnitt" #: data.hpp:340 msgid "Temperature" msgstr "Temperatur" #: data.hpp:342 msgid "Core Voltage" msgstr "Kärnspänning" #: data.hpp:343 msgid "Power Avg" msgstr "Effekt Genomsnitt" #: data.hpp:344 msgid "Core Clock" msgstr "Kärnfrekvens" #: data.hpp:345 msgid "Memory Clock" msgstr "Minnesfrekvens" #: data.hpp:346 msgid "Memory Used" msgstr "Använt minne" #: data.hpp:347 msgid "Resizable BAR" msgstr "Skalbart BAR" #: data.hpp:348 msgid "Vulkan RT" msgstr "Vulkan RT" #: data.hpp:349 msgid "OpenGL Version" msgstr "OpenGL-version" #: data.hpp:350 msgid "Vulkan Version" msgstr "Vulkan-version" #: data.hpp:351 msgid "OpenCL Version" msgstr "OpenCL-version" #: data.hpp:387 msgid "Score" msgstr "Poäng" #: data.hpp:388 msgid "Run" msgstr "Kör" #: data.hpp:407 msgid "Duration" msgstr "Varaktighet" #: util.hpp:77 msgid "bytes" msgstr "byte" #. TRANSLATORS: initials for kilobyte (10³): please put initials (keep it short) #: util.hpp:80 msgid "kB" msgstr "kB" #. TRANSLATORS: initials for megabyte (10⁶): please put initials (keep it short) #: util.hpp:82 msgid "MB" msgstr "MB" #. TRANSLATORS: initials for gigabyte (10⁹): please put initials (keep it short) #: util.hpp:84 msgid "GB" msgstr "GB" #. TRANSLATORS: initials for terabyte (10¹²): please put initials (keep it short) #: util.hpp:86 msgid "TB" msgstr "TB" #. TRANSLATORS: initials for kibibyte (2¹⁰): please put initials (keep it short) #: util.hpp:89 msgid "KiB" msgstr "KiB" #. TRANSLATORS: initials for mebibyte (2²⁰): please put initials (keep it short) #: util.hpp:91 msgid "MiB" msgstr "MiB" #. TRANSLATORS: initials for gibibyte (2³⁰): please put initials (keep it short) #: util.hpp:93 msgid "GiB" msgstr "GiB" #. TRANSLATORS: initials for tebibyte (2⁴⁰): please put initials (keep it short) #: util.hpp:95 msgid "TiB" msgstr "TiB" #: cpu-x-gtk-3.12.ui:1184 msgid "Cache" msgstr "Cache" #. Setting: refresh time for UI #: cpu-x-gtk-3.12.ui:5721 msgid "Refresh time" msgstr "Uppdateringstid" #. Setting: GUI theme #: cpu-x-gtk-3.12.ui:5745 msgid "Text theme" msgstr "Texttema" #. Setting: automatic GUI theme #: cpu-x-gtk-3.12.ui:5760 msgid "Automatic" msgstr "Automatisk" #. Setting: light GUI theme #: cpu-x-gtk-3.12.ui:5761 msgid "Blue for light theme" msgstr "Blått för ljust tema" #. Setting: dark GUI theme #: cpu-x-gtk-3.12.ui:5762 msgid "Yellow for dark theme" msgstr "Gult för mörkt tema" #. Setting: temperature unit #: cpu-x-gtk-3.12.ui:5775 msgid "Temperature unit" msgstr "Temperaturenhet" #. Setting: default tab at startup #: cpu-x-gtk-3.12.ui:5826 msgid "Default tab" msgstr "Standardflik" #. Setting: default CPU core at startup #: cpu-x-gtk-3.12.ui:5839 msgid "Default CPU core" msgstr "Standard CPU-kärna" #. Setting: default cache test at startup #: cpu-x-gtk-3.12.ui:5852 msgid "Default cache test" msgstr "Standardtest för cacheminnet" #. Setting: print CPUID values in decimal or hexadecimal #: cpu-x-gtk-3.12.ui:5895 msgid "Print CPUID values in decimal" msgstr "Skriv ut CPUID-värden decimalt" #. Setting: default graphic card at startup #: cpu-x-gtk-3.12.ui:5928 msgid "Default graphic card" msgstr "Standardgrafikkort" #. Setting: default CPU core at startup #: cpu-x-gtk-3.12.ui:5952 msgid "Default core type" msgstr "Standardkärntyp" #. Setting: default graphic card at startup #: cpu-x-gtk-3.12.ui:5976 msgid "Default memory stick" msgstr "Standardminnessticka" #. Setting: "Startup" tab #: cpu-x-gtk-3.12.ui:6004 msgid "Startup" msgstr "Uppstart" #~ msgid "Light" #~ msgstr "Ljus" #~ msgid "Dark" #~ msgstr "Mörk" #~ msgid "Calculating CPU multipliers" #~ msgstr "Beräknar CPU-multiplikatorer" #, c-format #~ msgid "Current: PCIe Gen%1dx%d / Max: Gen%1dx%d" #~ msgstr "Aktuellt: PCIe Gen%1dx%d / Max: Gen%1dx%d" #~ msgid "failed to retrieve GPU clocks" #~ msgstr "kunde inte hämta GPU-frekvenser" #, c-format #~ msgid "Core #%i" #~ msgstr "Kärna #%i" #~ msgid "Setting label names" #~ msgstr "Anger etikettnamn" #, c-format #~ msgid "Bank %i" #~ msgstr "Bank %i" #~ msgid "Reference" #~ msgstr "Referens" #~ msgid "Distribution" #~ msgstr "Distribution" #~ msgid "Compiler" #~ msgstr "Kompilator" #~ msgid "GPU clock" #~ msgstr "GPU-frekvens" #~ msgid "Dumping data…" #~ msgstr "Dumpar data…" #~ msgid "Freeing memory" #~ msgstr "Frigör minne" #~ msgid "Ignore CPU frequency reported by libcpuid" #~ msgstr "Ignorera CPU-frekvens rapporterad a libcpuid" #, c-format #~ msgid "failed to call wordexp (%i)" #~ msgstr "kunde inte anropa wordexp (%i)" #~ msgid "Press 'home' key to scroll up in a page." #~ msgstr "Tryck \"Home\" för att skrolla upp i en sida." #~ msgid "Press 'end' key to scroll down in a page." #~ msgstr "Tryck \"End\" för att skrolla ner i en sida." #, c-format #~ msgid "String '%s' is too long, truncating…" #~ msgstr "Strängen \"%s\" är för lång, trunkerar…" #, c-format #~ msgid "failed to open %s directory" #~ msgstr "kunde inte öppna mappen %s" #~ msgid "an error occurred while compiling regex" #~ msgstr "ett fel inträffade vid regex-kompilering" #~ msgid "FATAL ERROR: could not allocate memory" #~ msgstr "ALLVARLIGT FEL: Kunde inte allokera minne" #~ msgid "Enumerating Vulkan instance extension properties" #~ msgstr "Uppräkning av egenskaper för Vulkan-instanstillägg" #, c-format #~ msgid "failed to call vkEnumerateInstanceExtensionProperties (%s)" #~ msgstr "kunde inte anropa vkEnumerateInstanceExtensionProperties (%s)" #, c-format #~ msgid "" #~ "failed to call vkEnumerateInstanceExtensionProperties to fill " #~ "VkExtensionProperties (%s)" #~ msgstr "" #~ "det gick inte att anropa vkEnumerateInstanceExtensionProperties för att " #~ "fylla i VkExtensionProperties (%s)" #~ msgid "Vulkan API is not available" #~ msgstr "Vulkan-API inte tillgänglig" #, c-format #~ msgid "%s" #~ msgstr "%s" #, c-format #~ msgid "" #~ "CPU hybrid architecture is not supported. For more details, please refer " #~ "to following issue: %s" #~ msgstr "" #~ "CPU-hybridarkitektur stöds inte. Mer information finns i följande ärende: " #~ "%s" #~ msgid "NOT SUPPORTED" #~ msgstr "STÖDS EJ" #~ msgid "There is no device with Vulkan support" #~ msgstr "Det finns ingen enhet med Vulkan-stöd" #~ msgid "Socket(s)" #~ msgstr "Socklar" #~ msgid "Thread(s)" #~ msgstr "Trådar" #~ msgid "You can paste this backtrace by opening a new issue here:" #~ msgstr "" #~ "Du kan klistra in denna bakåtspårning genom att öppna ett nytt ärende här:" #, fuzzy #~| msgid "failed to call libcpuid (%s)" #~ msgid "faild to call clGetDeviceIDs" #~ msgstr "kunde inte anropa libcpuid (%s)" CPU-X-5.0.3/po/ta.po000066400000000000000000001225271454622605200137540ustar00rootroot00000000000000# CPU-X translations template # Copyright © 2014-2024 The Tumultuous Unicorn Of Darkness # This file is distributed under the same license as the cpu-x package. # K.B.Dharun Krishna , 2022, 2023. # "K.B.Dharun Krishna" , 2023. msgid "" msgstr "" "Project-Id-Version: cpu-x\n" "Report-Msgid-Bugs-To: https://github.com/TheTumultuousUnicornOfDarkness/CPU-" "X/issues\n" "POT-Creation-Date: 2023-12-09 13:09+0100\n" "PO-Revision-Date: 2023-11-15 23:52+0000\n" "Last-Translator: \"K.B.Dharun Krishna\" \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.2-dev\n" #: core.cpp:135 msgid "Finding CPU technology" msgstr "CPU தொழில்நுட்பத்தைக் கண்டறிதல்" #: core.cpp:161 #, c-format msgid "" "Your CPU is not present in the database ==> %s, model: %i, ext. model: %i, " "ext. family: %i" msgstr "" "உங்கள் CPU தரவுத்தளத்தில் இல்லை ==> %s, மாதிரி: %i, ext. மாதிரி: %i, ext. குடும்பம்: " "%i" #: core.cpp:189 data.cpp:150 data.cpp:342 msgid "unknown" msgstr "தெரியவில்லை" #: core.cpp:230 msgid "Calling libcpuid for retrieving static data" msgstr "நிலையான தரவை மீட்டெடுக்க libcpuid ஐ அழைக்கிறது" #: core.cpp:245 #, c-format msgid "failed to call libcpuid (%s)" msgstr "libcpuid (%s) ஐ அழைக்க முடியவில்லை" #: core.cpp:340 msgid "Calling libcpuid for retrieving dynamic data" msgstr "டைனமிக் தரவை மீட்டெடுக்க libcpuid ஐ அழைக்கிறது" #: core.cpp:353 msgid "Calling libcpuid for retrieving CPU MSR static values" msgstr "CPU MSR நிலையான மதிப்புகளை மீட்டெடுக்க libcpuid ஐ அழைக்கிறது" #: core.cpp:380 msgid "Calling libcpuid for retrieving CPU MSR dynamic values" msgstr "CPU MSR டைனமிக் மதிப்புகளை மீட்டெடுக்க libcpuid ஐ அழைக்கிறது" #: core.cpp:412 msgid "Calling dmidecode" msgstr "dmidecode ஐ அழைக்கிறது" #: core.cpp:454 core.cpp:473 #, c-format msgid "%s (configured)" msgstr "%s (கட்டமைக்கப்பட்டது)" #: core.cpp:461 core.cpp:480 #, c-format msgid "%s (max)" msgstr "%s (அதிகபட்சம்)" #: core.cpp:466 #, c-format msgid "%s (min)" msgstr "%s (குறைந்தபட்சம்)" #: core.cpp:496 msgid "Calculating CPU usage" msgstr "CPU பயன்பாட்டைக் கணக்கிடுகிறது" #: core.cpp:546 msgid "Calling bandwidth" msgstr "அலைவரிசையை அழைக்கிறது" #: core.cpp:613 #, c-format msgid "" "pci_access is not properly initialized: it is a common issue when %s was " "built with a lower libpci version.\n" "Check that libpci %s library is present on your system. Otherwise, please " "rebuild %s." msgstr "" "pci_access சரியாக துவக்கப்படவில்லை: %s குறைந்த libpci பதிப்பில் கட்டமைக்கப்படும் போது " "இது ஒரு பொதுவான சிக்கலாகும்.\n" "உங்கள் கணினியில் libpci %s நூலகம் உள்ளதா எனச் சரிபார்க்கவும். இல்லையெனில், %s ஐ மீண்டும் " "உருவாக்கவும்." #: core.cpp:657 #, c-format msgid "No kernel driver in use for graphic card at path %s" msgstr "பாதை %s இல் கிராஃபிக் கார்டுக்கு கர்னல் இயக்கி இல்லை" #: core.cpp:693 #, c-format msgid "Your GPU kernel driver is unknown: %s" msgstr "உங்கள் GPU கர்னல் இயக்கி தெரியவில்லை: %s" #: core.cpp:777 #, fuzzy, c-format #| msgid "Your GPU user mode driver is unknown: %s" msgid "Your GPU user mode driver is unknown for vendor %s: %s" msgstr "உங்கள் GPU பயனர் பயன்முறை இயக்கி தெரியவில்லை: %s" #: core.cpp:781 #, c-format msgid "failed to call GLFW (%i): %s" msgstr "GLFW ஐ அழைப்பதில் தோல்வி (%i): %s" #: core.cpp:914 msgid "Finding Vulkan API version" msgstr "Vulkan API பதிப்பைக் கண்டறிதல்" #: core.cpp:926 #, c-format msgid "failed to call vkCreateInstance (%s)" msgstr "vkCreateInstance (%s) ஐ அழைக்க முடியவில்லை" #: core.cpp:929 #, c-format msgid "%s is not supported" msgstr "%s ஆதரிக்கப்படவில்லை" #: core.cpp:937 #, c-format msgid "failed to call vkEnumeratePhysicalDevices (%s)" msgstr "vkEnumeratePhysicalDevices (%s) ஐ அழைக்க முடியவில்லை" #: core.cpp:944 msgid "No available Vulkan devices" msgstr "Vulkan சாதனங்கள் இல்லை" #: core.cpp:952 #, c-format msgid "No available physical devices (%s)" msgstr "இயற்பியல் சாதனங்கள் இல்லை (%s)" #: core.cpp:1015 #, c-format msgid "Failed to create Vulkan for device %u (%s)" msgstr "%u (%s) சாதனத்திற்கான வல்கனை (Vulkan) உருவாக்குவதில் தோல்வி" #: core.cpp:1019 #, c-format msgid "%s is not supported for device %u, use only deviceID for matching" msgstr "" "%s ஆதரிக்கப்படவில்லை %u சாதனத்திர்கு , பொருத்துவதற்கு சாதன ஐடியை மட்டும் பயன்படுத்தவும்" #: core.cpp:1051 core.cpp:1364 msgid "Enabled" msgstr "இயக்கப்பட்டது" #: core.cpp:1051 core.cpp:1364 msgid "Disabled" msgstr "முடக்கப்பட்டது" #: core.cpp:1088 msgid "Finding OpenCL API version" msgstr "OpenCL API பதிப்பைக் கண்டறிதல்" #: core.cpp:1092 #, c-format msgid "There is no platform with OpenCL support (%s)" msgstr "OpenCL ஆதரவுடன் எந்த தளமும் இல்லை (%s)" #: core.cpp:1102 #, c-format msgid "failed to get all OpenCL platforms (%s)" msgstr "அனைத்து OpenCL இயங்குதளங்களையும் (%s) பெற முடியவில்லை" #: core.cpp:1115 #, c-format msgid "failed to get name for platform %u (%s)" msgstr "%u (%s) இயங்குதளத்திற்கான பெயரைப் பெற முடியவில்லை" #: core.cpp:1123 #, c-format msgid "failed to get version for platform %u (%s)" msgstr "இயங்குதளம் %u (%s)க்கான பதிப்பைப் பெறுவதில் தோல்வி" #: core.cpp:1131 #, c-format msgid "failed to find number of OpenCL devices for platform '%s %s' (%s)" msgstr "" "'%s %s' (%s) இயங்குதளத்திற்கான OpenCL சாதனங்களின் எண்ணிக்கையைக் கண்டறிய முடியவில்லை" #: core.cpp:1131 msgid "0 device" msgstr "0 சாதனம்" #: core.cpp:1140 #, c-format msgid "failed to get all of OpenCL devices for platform '%s %s' (%s)" msgstr "'%s %s' (%s) இயங்குதளத்திற்கான அனைத்து OpenCL சாதனங்களையும் பெறுவதில் தோல்வி" #: core.cpp:1160 #, c-format msgid "failed to get name for device %u (%s)" msgstr "%u (%s) சாதனத்திற்கான பெயரைப் பெறுவதில் தோல்வி" #: core.cpp:1168 #, c-format msgid "failed to get version for device %u (%s)" msgstr "%u (%s) சாதனத்திற்கான பதிப்பைப் பெறுவதில் தோல்வி" #: core.cpp:1190 #, c-format msgid "OpenCL driver for '%s %s' does not support CL_DEVICE_TOPOLOGY_AMD (%s)" msgstr "'%s %s' க்கான OpenCL இயக்கி CL_DEVICE_TOPOLOGY_AMD (%s) ஐ ஆதரிக்காது" #: core.cpp:1201 #, c-format msgid "" "OpenCL driver for '%s %s' does not support CL_DEVICE_GFXIP_MAJOR_AMD (%s)" msgstr "'%s %s' க்கான OpenCL இயக்கி CL_DEVICE_GFXIP_MAJOR_AMD (%s) ஐ ஆதரிக்காது" #: core.cpp:1209 core.cpp:1229 core.cpp:1262 #, c-format msgid "" "OpenCL driver for '%s %s' does not support CL_DEVICE_MAX_COMPUTE_UNITS (%s)" msgstr "'%s %s' க்கான OpenCL இயக்கி CL_DEVICE_MAX_COMPUTE_UNITS (%s) ஐ ஆதரிக்காது" #: core.cpp:1250 #, c-format msgid "" "OpenCL driver for '%s %s' does not support CL_DEVICE_PCI_DOMAIN_ID_NV (%s), " "CL_DEVICE_PCI_BUS_ID_NV (%s) or CL_DEVICE_PCI_SLOT_ID_NV (%s)" msgstr "" "'%s %s'க்கான OpenCL இயக்கி CL_DEVICE_PCI_DOMAIN_ID_NV (%s), " "CL_DEVICE_PCI_BUS_ID_NV (%s) அல்லது CL_DEVICE_PCI_SLOT_ID_NV (%s) ஐ ஆதரிக்காது" #: core.cpp:1273 #, c-format msgid "OpenCL is not supported with your GPU vendor (0x%X)" msgstr "உங்கள் GPU விற்பனையாளருடன் OpenCL ஆதரிக்கப்படவில்லை (0x%X)" #: core.cpp:1295 msgid "Finding devices" msgstr "சாதனங்களைக் கண்டறிதல்" #: core.cpp:1307 #, c-format msgid "Skip devices search (wrong permissions on %s device)" msgstr "சாதனத் தேடலைத் தவிர்க்கவும் (%s சாதனத்தில் தவறான அனுமதிகள்)" #: core.cpp:1350 #, c-format msgid "Your GPU vendor is unknown: %s (0x%X)" msgstr "உங்கள் GPU விற்பனையாளர் தெரியவில்லை: %s (0x%X)" #: core.cpp:1370 msgid "failed to find chipset vendor and model" msgstr "சிப்செட் விற்பனையாளரையும் மாதிரியையும் கண்டுபிடிக்க முடியவில்லை" #: core.cpp:1385 msgid "failed to find graphic card vendor and model" msgstr "கிராஃபிக் கார்டு விற்பனையாளரையும் மாடலையும் கண்டுபிடிக்க முடியவில்லை" #: core.cpp:1487 msgid "Retrieving GPU clocks" msgstr "GPU கடிகாரங்களை மீட்டெடுக்கிறது" #: core.cpp:1500 msgid "None" msgstr "எதுவும் இல்லை" #: core.cpp:1509 #, c-format msgid "DRM path for %s is unknown" msgstr "%s க்கான DRM பாதை தெரியவில்லை" #: core.cpp:1516 #, c-format msgid "Card number for %s is unknown" msgstr "%s க்கான கார்டு எண் தெரியவில்லை" #: core.cpp:1541 #, c-format msgid "PCIe %s (current) / %s (max)" msgstr "PCIe %s (தற்போதைய) / %s (அதிகபட்சம்)" #: core.cpp:1650 #, c-format msgid "Driver for %s doesn't report frequencies" msgstr "%s க்கான இயக்கி அதிர்வெண்களைப் புகாரளிக்கவில்லை" #: core.cpp:1671 #, fuzzy, c-format #| msgid "failed to get all OpenCL platforms (%s)" msgid "failed to retrieve all monitoring data for %s" msgstr "அனைத்து OpenCL இயங்குதளங்களையும் (%s) பெற முடியவில்லை" #: core.cpp:1694 msgid "Identifying running system" msgstr "இயங்கும் அமைப்பைக் கண்டறிதல்" #: core.cpp:1697 msgid "failed to identify running system" msgstr "இயங்கும் அமைப்பை அடையாளம் காண முடியவில்லை" #: core.cpp:1749 core.cpp:1778 msgid "Calling libprocps" msgstr "libprocps ஐ அழைக்கிறது" #: core.cpp:1752 msgid "unable to get system uptime" msgstr "கணினி இயக்க நேரத்தைப் பெற முடியவில்லை" #: core.cpp:1758 msgid "unable to create meminfo structure" msgstr "meminfo அமைப்பை உருவாக்க முடியவில்லை" #: core.cpp:1804 msgid "Calling libstatgrab" msgstr "libstatgrab ஐ அழைக்கிறது" #: core.cpp:1852 #, c-format msgid "%i days, %i hours, %i minutes, %i seconds" msgstr "%i நாட்களில், %i மணிநேரத்தில், %i நிமிடங்களில், %i நொடிகளில்" #: core.cpp:1915 msgid "Updating benchmark status" msgstr "பெஞ்ச்மார்க் நிலையை மேம்படுத்துகிறது" #: core.cpp:1918 msgid "Active" msgstr "செயலில் உள்ளது" #: core.cpp:1921 #, c-format msgid "(%u hours left)" msgstr "(%u மணிநேரம் மீதமுள்ளது)" #: core.cpp:1923 #, c-format msgid "(%u minutes left)" msgstr "(%u நிமிடங்கள் மீதமுள்ளன)" #: core.cpp:1925 #, c-format msgid "(%u seconds left)" msgstr "(%u வினாடிகள் மீதமுள்ளன)" #: core.cpp:1929 core.cpp:1984 core.cpp:1985 msgid "Inactive" msgstr "செயலற்றது" #: core.cpp:1932 #, c-format msgid "in %u hours" msgstr "%u மணிநேரத்தில்" #: core.cpp:1934 #, c-format msgid "in %u minutes" msgstr "%u நிமிடங்களில்" #: core.cpp:1936 #, c-format msgid "in %u seconds" msgstr "%u வினாடிகளில்" #: core.cpp:1953 #, fuzzy, c-format #| msgid "Starting benchmark" msgid "Starting benchmark with %u threads" msgstr "பெஞ்ச்மார்க் தொடங்குகிறது" #: core.cpp:1976 msgid "an error occurred while starting benchmark" msgstr "பெஞ்ச்மார்க் தொடங்கும் போது பிழை ஏற்பட்டது" #: core.cpp:2002 msgid "Finding CPU package in fallback mode" msgstr "ஃபால்பேக் பயன்முறையில் CPU தொகுப்பைக் கண்டறிதல்" #: core.cpp:2032 #, c-format msgid "Your CPU socket is not present in the database ==> %s, codename: %s" msgstr "உங்கள் CPU சாக்கெட் தரவுத்தளத்தில் இல்லை ==> %s, குறியீட்டு பெயர்: %s" #: core.cpp:2052 msgid "Calculating CPU multipliers in fallback mode" msgstr "ஃபால்பேக் பயன்முறையில் CPU பெருக்கிகளைக் கணக்கிடுகிறது" #: core.cpp:2072 msgid "Retrieving motherboard information in fallback mode" msgstr "ஃபால்பேக் பயன்முறையில் மதர்போர்டு தகவலை மீட்டெடுக்கிறது" #: core.cpp:2085 msgid "failed to retrieve motherboard information (fallback mode)" msgstr "மதர்போர்டு தகவலை மீட்டெடுக்க முடியவில்லை (ஃபால்பேக் பயன்முறை)" #: core.cpp:2127 msgid "Retrieving CPU temperature in fallback mode" msgstr "ஃபால்பேக் பயன்முறையில் CPU வெப்பநிலையை மீட்டெடுக்கிறது" #: core.cpp:2173 msgid "failed to retrieve CPU temperature (fallback mode)" msgstr "CPU வெப்பநிலையை மீட்டெடுக்க முடியவில்லை (ஃபால்பேக் பயன்முறை)" #: core.cpp:2188 msgid "Retrieving CPU voltage in fallback mode" msgstr "ஃபால்பேக் பயன்முறையில் CPU மின்னழுத்தத்தை மீட்டெடுக்கிறது" #: core.cpp:2200 msgid "failed to retrieve CPU voltage (fallback mode)" msgstr "CPU மின்னழுத்தத்தை மீட்டெடுக்க முடியவில்லை (ஃபால்பேக் பயன்முறை)" #: core.cpp:2214 msgid "Retrieving CPU frequency in fallback mode" msgstr "ஃபால்பேக் பயன்முறையில் CPU அலைவரிசையை மீட்டெடுக்கிறது" #: core.cpp:2220 msgid "failed to retrieve CPU frequency (fallback mode)" msgstr "CPU அதிர்வெண்ணை மீட்டெடுக்க முடியவில்லை (ஃபால்பேக் பயன்முறை)" #: daemon_client.cpp:65 #, fuzzy #| msgid "Ask password to start daemon in background" msgid "Starting daemon in background…" msgstr "பின்னணியில் டீமனைத் தொடங்க கடவுச்சொல்லைக் கேட்கவும்" #: daemon_client.cpp:172 msgid "pkexec: authorization could not be obtained (dialog dismissed)" msgstr "" #: daemon_client.cpp:175 msgid "pkexec: authorization could not be obtained (not authorized)" msgstr "" #: daemon_client.cpp:178 msgid "pkexec: command not found" msgstr "" #: daemon_client.cpp:181 msgid "pkexec: unexpected error code" msgstr "" #: daemon_client.cpp:211 #, fuzzy #| msgid "Connected to daemon" msgid "Connecting to daemon…" msgstr "டெமானுடன் இணைக்கப்பட்டது" #: daemon_server.cpp:261 #, c-format msgid "request_handler: case %i not handled" msgstr "request_handler: வழக்கு %i கையாளப்படவில்லை" #: data.cpp:124 cpu-x-gtk-3.12.ui:1370 msgid "CPU" msgstr "CPU" #: data.cpp:187 msgid "P-core" msgstr "" #: data.cpp:188 msgid "E-core" msgstr "" #: data.cpp:189 data.cpp:192 msgid "Core" msgstr "" #: data.cpp:208 cpu-x-gtk-3.12.ui:746 msgid "Processor" msgstr "செயலி" #: data.cpp:240 data.cpp:329 cpu-x-gtk-3.12.ui:1968 msgid "Caches" msgstr "தற்காலிக சேமிப்புகள்" #: data.cpp:247 #, fuzzy, c-format #| msgid "%d x %d %s, %d-way" msgid "%2d x %4d %s, %2d-way" msgstr "%d x %d %s, %d-வழி" #: data.cpp:249 #, c-format msgid "%d %s, %d-way" msgstr "%d %s, %d-வழி" #: data.cpp:263 msgid "Count" msgstr "" #: data.cpp:276 cpu-x-gtk-3.12.ui:968 msgid "Clocks" msgstr "கடிகாரங்கள்" #: data.cpp:379 data.cpp:383 #, fuzzy, c-format #| msgid "L%i Cache" msgid "L%u Cache" msgstr "L%i தற்காலிக சேமிப்பு" #: data.cpp:385 #, c-format msgid "%s associative, %d-%s line size" msgstr "%s அசோசியேட்டிவ், %d-%s வரி அளவு" #: data.cpp:398 msgid "Test" msgstr "சோதனை" #: data.cpp:409 data.cpp:423 cpu-x-gtk-3.12.ui:2146 cpu-x-gtk-3.12.ui:2517 msgid "Motherboard" msgstr "மதர்போர்டு" #: data.cpp:437 cpu-x-gtk-3.12.ui:2367 msgid "BIOS" msgstr "BIOS" #: data.cpp:452 cpu-x-gtk-3.12.ui:2498 msgid "Chipset" msgstr "சிப்செட்" #: data.cpp:467 data.cpp:569 cpu-x-gtk-3.12.ui:3156 cpu-x-gtk-3.12.ui:3761 msgid "Memory" msgstr "நினைவு" #: data.cpp:483 #, c-format msgid "Stick %u" msgstr "" #: data.cpp:487 cpu-x-gtk-3.12.ui:3134 msgid "Sticks" msgstr "" #: data.cpp:541 cpu-x-gtk-3.12.ui:3780 msgid "System" msgstr "அமைப்பு" #: data.cpp:554 cpu-x-gtk-3.12.ui:3380 msgid "Operating System" msgstr "இயக்க முறைமை" #: data.cpp:587 cpu-x-gtk-3.12.ui:4960 msgid "Graphics" msgstr "வரைகலை" #: data.cpp:621 #, fuzzy, c-format #| msgid "Card %i" msgid "Card %u" msgstr "அட்டை %i" #: data.cpp:625 cpu-x-gtk-3.12.ui:4938 msgid "Cards" msgstr "அட்டைகள்" #: data.cpp:672 cpu-x-gtk-3.12.ui:5300 msgid "Bench" msgstr "விசுப்பலகை" #: data.cpp:685 msgid "Not started" msgstr "துவங்கவில்லை" #: data.cpp:688 cpu-x-gtk-3.12.ui:5070 msgid "Prime numbers (slow)" msgstr "முதன்மை எண்கள் (மெதுவாக)" #: data.cpp:692 cpu-x-gtk-3.12.ui:5178 msgid "Prime numbers (fast)" msgstr "முதன்மை எண்கள் (வேகமாக)" #: data.cpp:696 cpu-x-gtk-3.12.ui:5281 msgid "Parameters" msgstr "அளவுருக்கள்" #: data.cpp:721 data.cpp:727 #, c-format msgid "%u mins" msgstr "%u நிமிடங்கள்" #: data.cpp:734 cpu-x-gtk-3.12.ui:5444 cpu-x-gtk-3.12.ui:5552 msgid "About" msgstr "பற்றி" #: data.cpp:739 #, c-format msgid "" "%s is a Free software that gathers information\n" "on CPU, motherboard and more." msgstr "" "%s என்பது தகவல்களை சேகரிக்கும் இலவச மென்பொருள் \n" "CPU, மதர்போர்டு மற்றும் பலவற்றில்." #: data.cpp:744 #, fuzzy #| msgid "About" msgid "About CPU-X" msgstr "பற்றி" #: data.cpp:745 #, c-format msgid "Version %s" msgstr "பதிப்பு %s" #: data.cpp:746 #, c-format msgid "Author: %s" msgstr "ஆசிரியர்: %s" #: data.cpp:747 #, c-format msgid "Site: %s" msgstr "தளம்: %s" #: data.cpp:751 cpu-x-gtk-3.12.ui:5533 msgid "License" msgstr "உரிமம்" #: data.cpp:753 #, c-format msgid "This software is distributed under the terms of %s" msgstr "" #: data.cpp:754 main.cpp:176 msgid "This program comes with ABSOLUTELY NO WARRANTY" msgstr "" #: gui_gtk.cpp:61 #, c-format msgid "Cannot find path for '%s' file" msgstr "" #: gui_gtk.cpp:400 msgid "Start daemon" msgstr "டீமனைத் தொடங்கு" #: gui_gtk.cpp:403 msgid "Connected to daemon" msgstr "டெமானுடன் இணைக்கப்பட்டது" #: gui_gtk.cpp:406 msgid "No polkit authentication agent found" msgstr "போல்கிட் அங்கீகார முகவர் இல்லை" #: gui_gtk.cpp:411 msgid "Ask password to start daemon in background" msgstr "பின்னணியில் டீமனைத் தொடங்க கடவுச்சொல்லைக் கேட்கவும்" #: gui_gtk.cpp:415 msgid "Settings" msgstr "" #: gui_gtk.cpp:634 msgid "BaseFamily" msgstr "அடிப்படை குடும்பம்" #: gui_gtk.cpp:635 msgid "CPU display (\"true\") family (computed as BaseFamily+ExtendedFamily)" msgstr "" "CPU காட்சி (\"உண்மை\") குடும்பம் (அடிப்படை குடும்பம்+விரிவாக்கப்பட்ட குடும்பமாக " "கணக்கிடப்பட்டது)" #: gui_gtk.cpp:636 msgid "BaseModel" msgstr "அடிப்படை மாதிரி" #: gui_gtk.cpp:637 msgid "CPU display (\"true\") model (computed as (ExtendedModel<<4)+BaseModel)" msgstr "" "CPU காட்சி (\"உண்மை\") மாதிரி ((ExtendedModel<<4)+BaseModel என கணக்கிடப்பட்டது)" #: gui_gtk.cpp:847 msgid "" "Identify the physically-labeled socket or board position where the memory " "device is located" msgstr "" #: gui_gtk.cpp:848 msgid "Identify the physically labeled bank where the memory device is located" msgstr "" #: gui_gtk.cpp:1052 msgid "User Mode Driver Version" msgstr "பயனர் பயன்முறை இயக்கி பதிப்பு" #: gui_gtk.cpp:1066 msgid "Vulkan Ray Tracing" msgstr "வல்கன் ரே டிரேசிங்" #: gui_gtk.cpp:1260 msgid "Starting GTK GUI…" msgstr "GTK GUIஐத் தொடங்குகிறது…" #: gui_gtk.cpp:1272 msgid "failed to import UI in GtkBuilder" msgstr "GtkBuilder இல் UI ஐ இறக்குமதி செய்ய முடியவில்லை" #: main.cpp:63 msgid "Start graphical user interface (GUI) (default)" msgstr "" #: main.cpp:64 msgid "Start text-based user interface (TUI)" msgstr "" #: main.cpp:65 msgid "Dump all data on standard output and exit" msgstr "" #: main.cpp:66 msgid "Run embedded command dmidecode and exit" msgstr "" #: main.cpp:67 msgid "Run embedded command bandwidth and exit" msgstr "" #: main.cpp:68 msgid "Set temperature unit (c[elsius]|f[ahrenheit]|k[elvin]|r[ankine])" msgstr "" #: main.cpp:69 msgid "Set custom time between two refreshes (in seconds)" msgstr "" #: main.cpp:70 msgid "Set default tab (integer)" msgstr "" #: main.cpp:71 msgid "Select core type to monitor (integer)" msgstr "" #: main.cpp:72 msgid "Select CPU core to monitor (integer)" msgstr "" #: main.cpp:73 msgid "Set custom bandwidth test for CPU caches speed (integer)" msgstr "" #: main.cpp:74 msgid "Select default memory stick (integer)" msgstr "" #: main.cpp:75 msgid "Select default graphic card (integer)" msgstr "" #: main.cpp:76 cpu-x-gtk-3.12.ui:5910 msgid "Start and connect to daemon" msgstr "" #: main.cpp:77 msgid "Verbose output" msgstr "" #: main.cpp:78 msgid "Print help and exit" msgstr "" #: main.cpp:79 msgid "Print version and exit" msgstr "" #: main.cpp:80 msgid "Print CPUID values in decimal (default is hexadeximal)" msgstr "" #: main.cpp:81 msgid "Disable colored output" msgstr "" #: main.cpp:82 msgid "Print information for debugging" msgstr "" #: main.cpp:83 msgid "Print required information to paste in an issue" msgstr "" #: main.cpp:84 msgid "Set key mapping for NCurses mode (a[rrows]|e[macs]|i[nverted-T]|v[im])" msgstr "" #: main.cpp:95 msgid "Add default command line arguments" msgstr "" #: main.cpp:96 msgid "Enforce the bus clock" msgstr "" #: main.cpp:97 msgid "" "Ignore CPU values reported by libcpuid (comma-separated values among 'temp', " "'volt' and 'freq')" msgstr "" #: main.cpp:98 msgid "Read CPUID raw data from a given file" msgstr "" #: main.cpp:99 msgid "Only print a message if CPU is not present in the database" msgstr "" #: main.cpp:126 #, c-format msgid "Usage: %s DISPLAY [OPTIONS]\n" msgstr "" #: main.cpp:127 msgid "Available DISPLAY:" msgstr "" #: main.cpp:135 msgid "Available OPTIONS:" msgstr "" #: main.cpp:144 msgid "Influenceable environment variables:" msgstr "" #: main.cpp:175 msgid "This is free software: you are free to change and redistribute it." msgstr "" #: main.cpp:177 #, c-format msgid "See the %s license: <%s>\n" msgstr "" #: main.cpp:184 #, c-format msgid "-- %-9s version: %s" msgstr "" #: main.cpp:381 #, c-format msgid "" "\n" "Oops, something was wrong! %s has received signal %d (%s) and has crashed." msgstr "" #: main.cpp:383 #, c-format msgid "" "\n" "Oops, something was wrong! %s has received signal %d (%s) and is trying to " "recover." msgstr "" #: main.cpp:407 msgid "You can open a new issue here, by filling the template as requested:" msgstr "" #: main.cpp:449 msgid "an error occurred while setting locale" msgstr "" #: options.cpp:124 #, c-format msgid "" "Selected CPU type (%u) is not a valid number (%u is the maximum for this CPU)" msgstr "" "தேர்ந்தெடுக்கப்பட்ட CPU வகை (%u) செல்லுபடியாகும் எண் அல்ல (இந்த CPU க்கு %u தான் " "அதிகபட்சம்)" #: options.cpp:145 #, fuzzy, c-format #| msgid "" #| "Selected CPU type (%u) is not a valid number (%u is the maximum for this " #| "CPU)" msgid "" "Selected bandwidth test (%u) is not a valid number (%u is the maximum for " "this system)" msgstr "" "தேர்ந்தெடுக்கப்பட்ட CPU வகை (%u) செல்லுபடியாகும் எண் அல்ல (இந்த CPU க்கு %u தான் " "அதிகபட்சம்)" #: options.cpp:168 #, fuzzy, c-format #| msgid "" #| "Selected CPU type (%u) is not a valid number (%u is the maximum for this " #| "CPU)" msgid "" "Selected RAM stick (%u) is not a valid number (%u is the maximum for this " "system)" msgstr "" "தேர்ந்தெடுக்கப்பட்ட CPU வகை (%u) செல்லுபடியாகும் எண் அல்ல (இந்த CPU க்கு %u தான் " "அதிகபட்சம்)" #: options.cpp:188 #, fuzzy, c-format #| msgid "" #| "Selected CPU core (%u) is not a valid number (%u is the maximum for this " #| "type of core)" msgid "" "Selected graphic card (%u) is not a valid number (%u is the maximum for this " "system)" msgstr "" "தேர்ந்தெடுக்கப்பட்ட CPU கோர் (%u) செல்லுபடியாகும் எண் அல்ல (இந்த வகை மையத்திற்கு %u தான் " "அதிகபட்சம்)" #: options.cpp:204 #, c-format msgid "failed to change CPU affinitiy to core %u" msgstr "" #: options.cpp:210 #, c-format msgid "" "Selected CPU core (%u) is not a valid number (%u is the maximum for this " "type of core)" msgstr "" "தேர்ந்தெடுக்கப்பட்ட CPU கோர் (%u) செல்லுபடியாகும் எண் அல்ல (இந்த வகை மையத்திற்கு %u தான் " "அதிகபட்சம்)" #: options.cpp:284 #, fuzzy, c-format #| msgid "" #| "Selected CPU type (%u) is not a valid number (%u is the maximum for this " #| "CPU)" msgid "Selected tab (%u) is not a valid number (%u is the maximum)" msgstr "" "தேர்ந்தெடுக்கப்பட்ட CPU வகை (%u) செல்லுபடியாகும் எண் அல்ல (இந்த CPU க்கு %u தான் " "அதிகபட்சம்)" #: tui_ncurses.cpp:111 msgid "Window is too small!" msgstr "" #: tui_ncurses.cpp:119 msgid "Press 'h' to see help." msgstr "" #: tui_ncurses.cpp:232 #, c-format msgid "Welcome in %s NCurses help!\n" msgstr "" #: tui_ncurses.cpp:233 msgid "This help describes how to use this Text-based User Interface." msgstr "" #: tui_ncurses.cpp:235 msgid "Global keys:" msgstr "" #: tui_ncurses.cpp:236 msgid "Press 'left' key or 'tab' key to switch in left tab." msgstr "" #: tui_ncurses.cpp:237 msgid "Press 'right' key or 'shift + tab' keys to switch in right tab." msgstr "" #: tui_ncurses.cpp:238 msgid "Press 'h' key to see this help." msgstr "" #: tui_ncurses.cpp:239 msgid "Press 'q' key to exit." msgstr "" #: tui_ncurses.cpp:241 msgid "CPU tab:" msgstr "" #: tui_ncurses.cpp:242 msgid "Press 'next page' key to decrease core type number to monitor." msgstr "" #: tui_ncurses.cpp:243 msgid "Press 'previous page' key to increase core type number to monitor." msgstr "" #: tui_ncurses.cpp:244 msgid "Press 'down' key to decrease CPU core number to monitor." msgstr "" #: tui_ncurses.cpp:245 msgid "Press 'up' key to increase CPU core number to monitor." msgstr "" #: tui_ncurses.cpp:247 msgid "Caches tab:" msgstr "" #: tui_ncurses.cpp:248 msgid "Press 'down' key to switch to previous test." msgstr "" #: tui_ncurses.cpp:249 msgid "Press 'up' key to switch to next test." msgstr "" #: tui_ncurses.cpp:251 msgid "Bench tab:" msgstr "" #: tui_ncurses.cpp:252 msgid "Press 'down' key to decrement benchmark duration." msgstr "" #: tui_ncurses.cpp:253 msgid "Press 'up' key to increment benchmark duration." msgstr "" #: tui_ncurses.cpp:254 msgid "Press 'next page' key to decrement number of threads to use." msgstr "" #: tui_ncurses.cpp:255 msgid "Press 'previous page' key to increment number of threads to use." msgstr "" #: tui_ncurses.cpp:256 msgid "Press 's' key to start/stop prime numbers (slow) benchmark." msgstr "" #: tui_ncurses.cpp:257 msgid "Press 'f' key to start/stop prime numbers (fast) benchmark." msgstr "" #: tui_ncurses.cpp:259 msgid "Graphics tab:" msgstr "" #: tui_ncurses.cpp:260 msgid "Press 'down' key to switch to previous graphic card." msgstr "" #: tui_ncurses.cpp:261 msgid "Press 'up' key to switch to next graphic card." msgstr "" #: tui_ncurses.cpp:263 msgid "Press any key to exit this help." msgstr "" #: tui_ncurses.cpp:640 msgid "Starting NCurses TUI…" msgstr "" #: tui_ncurses.cpp:649 msgid "" "FATAL ERROR: terminfo database could not be found (try to set TERMINFO " "environment variable)" msgstr "" #: tui_ncurses.cpp:654 #, c-format msgid "Failed to set up %s terminal (err=%i); falling back to %s" msgstr "" #: util.cpp:189 #, c-format msgid "cannot find unit in '%s' string at position %i" msgstr "" #: util.cpp:252 #, fuzzy, c-format #| msgid "an error occurred while starting benchmark" msgid "an error occurred while opening file '%s'" msgstr "பெஞ்ச்மார்க் தொடங்கும் போது பிழை ஏற்பட்டது" #: util.cpp:297 #, fuzzy, c-format #| msgid "an error occurred while starting benchmark" msgid "an error occurred while running command '%s'" msgstr "பெஞ்ச்மார்க் தொடங்கும் போது பிழை ஏற்பட்டது" #: util.cpp:437 msgid "set_cpu_affinity() not supported on this operating system" msgstr "" #: data.hpp:103 data.hpp:244 data.hpp:332 msgid "Vendor" msgstr "விற்பனையாளர்" #: data.hpp:104 msgid "Code Name" msgstr "குறியீட்டு பெயர்" #: data.hpp:105 msgid "Package" msgstr "தொகுப்பு" #: data.hpp:106 msgid "Technology" msgstr "தொழில்நுட்பம்" #: data.hpp:107 data.hpp:268 msgid "Voltage" msgstr "மின்னழுத்தம்" #: data.hpp:108 msgid "Specification" msgstr "விவரக்குறிப்பு" #: data.hpp:109 msgid "Family" msgstr "குடும்பம்" #: data.hpp:110 msgid "Disp. Family" msgstr "காட்சி குடும்பம்" #: data.hpp:111 data.hpp:224 data.hpp:245 data.hpp:335 msgid "Model" msgstr "மாதிரி" #: data.hpp:112 msgid "Disp. Model" msgstr "காட்சி மாதிரி" #: data.hpp:113 msgid "Temp." msgstr "வெப்பநிலை." #: data.hpp:114 msgid "Stepping" msgstr "அடியெடுத்து வைப்பது" #: data.hpp:115 msgid "Instructions" msgstr "வழிமுறைகள்" #: data.hpp:125 msgid "L1 Data" msgstr "L1 தரவு" #: data.hpp:126 msgid "L1 Inst." msgstr "L1 வழிமுறை." #: data.hpp:127 msgid "Level 2" msgstr "நிலை 2" #: data.hpp:128 msgid "Level 3" msgstr "நிலை 3" #: data.hpp:137 cpu-x-gtk-3.12.ui:1232 msgid "Cores" msgstr "கோர்கள்" #: data.hpp:138 data.hpp:408 cpu-x-gtk-3.12.ui:1252 msgid "Threads" msgstr "நூல்கள்" #: data.hpp:155 msgid "Core Speed" msgstr "மைய வேகம்" #: data.hpp:156 msgid "Multiplier" msgstr "பெருக்கி" #: data.hpp:157 msgid "Bus Speed" msgstr "பேருந்தின் வேகம்" #: data.hpp:158 data.hpp:341 msgid "Usage" msgstr "பயன்பாடு" #: data.hpp:188 data.hpp:265 msgid "Size" msgstr "அளவு" #: data.hpp:189 data.hpp:267 msgid "Speed" msgstr "வேகம்" #: data.hpp:223 data.hpp:259 msgid "Manufacturer" msgstr "உற்பத்தியாளர்" #: data.hpp:225 msgid "Revision" msgstr "திருத்தம்" #: data.hpp:233 msgid "Brand" msgstr "நிறுவனம்" #: data.hpp:234 msgid "Version" msgstr "பதிப்பு" #: data.hpp:235 msgid "Date" msgstr "தேதி" #: data.hpp:236 msgid "ROM Size" msgstr "ROM அளவு" #: data.hpp:260 msgid "Part Number" msgstr "" #: data.hpp:261 #, fuzzy #| msgid "Type #%i" msgid "Type" msgstr "வகை #%i" #: data.hpp:262 #, fuzzy #| msgid "Type #%i" msgid "Type Detail" msgstr "வகை #%i" #: data.hpp:263 msgid "Device Locator" msgstr "" #: data.hpp:264 msgid "Bank Locator" msgstr "" #: data.hpp:266 msgid "Rank" msgstr "" #: data.hpp:292 #, fuzzy #| msgid "Code Name" msgid "Name" msgstr "குறியீட்டு பெயர்" #: data.hpp:293 msgid "Kernel" msgstr "கெர்னல்" #: data.hpp:294 msgid "Hostname" msgstr "புரவலன் பெயர்" #: data.hpp:295 msgid "Uptime" msgstr "இயக்க நேரம்" #: data.hpp:303 msgid "Used" msgstr "பயன்படுத்தப்பட்டது" #: data.hpp:304 msgid "Buffers" msgstr "இடையகங்கள்" #: data.hpp:305 msgid "Cached" msgstr "தற்காலிக சேமிப்பு" #: data.hpp:306 msgid "Free" msgstr "இலவசம்" #: data.hpp:307 msgid "Swap" msgstr "இடமாற்று" #: data.hpp:333 msgid "Driver" msgstr "இயக்கி" #: data.hpp:334 msgid "UMD Version" msgstr "UMD பதிப்பு" #: data.hpp:336 msgid "Compute Unit" msgstr "கணக்கீட்டு அலகு" #: data.hpp:337 #, fuzzy #| msgid "DeviceID" msgid "Device ID" msgstr "சாதன ஐடி" #: data.hpp:338 msgid "VBIOS Version" msgstr "VBIOS பதிப்பு" #. #-#-#-#-# source_ui.pot (cpu-x ) #-#-#-#-# #. Setting: "Interface" tab #: data.hpp:339 cpu-x-gtk-3.12.ui:5807 msgid "Interface" msgstr "இடைமுகம்" #: data.hpp:340 msgid "Temperature" msgstr "வெப்பநிலை" #: data.hpp:342 msgid "Core Voltage" msgstr "மைய மின்னழுத்தம்" #: data.hpp:343 msgid "Power Avg" msgstr "சக்தி சராசரி" #: data.hpp:344 #, fuzzy #| msgid "Memory clock" msgid "Core Clock" msgstr "நினைவக கடிகாரம்" #: data.hpp:345 #, fuzzy #| msgid "Memory clock" msgid "Memory Clock" msgstr "நினைவக கடிகாரம்" #: data.hpp:346 msgid "Memory Used" msgstr "நினைவகம் பயன்படுத்தப்பட்டது" #: data.hpp:347 msgid "Resizable BAR" msgstr "மறுஅளவிடக்கூடிய BAR" #: data.hpp:348 msgid "Vulkan RT" msgstr "Vulkan RT" #: data.hpp:349 msgid "OpenGL Version" msgstr "OpenGL பதிப்பு" #: data.hpp:350 msgid "Vulkan Version" msgstr "Vulkan பதிப்பு" #: data.hpp:351 msgid "OpenCL Version" msgstr "OpenCL பதிப்பு" #: data.hpp:387 msgid "Score" msgstr "மதிப்பெண்" #: data.hpp:388 msgid "Run" msgstr "ஓடு" #: data.hpp:407 msgid "Duration" msgstr "கால அளவு" #: util.hpp:77 msgid "bytes" msgstr "" #. TRANSLATORS: initials for kilobyte (10³): please put initials (keep it short) #: util.hpp:80 msgid "kB" msgstr "" #. TRANSLATORS: initials for megabyte (10⁶): please put initials (keep it short) #: util.hpp:82 msgid "MB" msgstr "" #. TRANSLATORS: initials for gigabyte (10⁹): please put initials (keep it short) #: util.hpp:84 msgid "GB" msgstr "" #. TRANSLATORS: initials for terabyte (10¹²): please put initials (keep it short) #: util.hpp:86 msgid "TB" msgstr "" #. TRANSLATORS: initials for kibibyte (2¹⁰): please put initials (keep it short) #: util.hpp:89 msgid "KiB" msgstr "" #. TRANSLATORS: initials for mebibyte (2²⁰): please put initials (keep it short) #: util.hpp:91 msgid "MiB" msgstr "" #. TRANSLATORS: initials for gibibyte (2³⁰): please put initials (keep it short) #: util.hpp:93 msgid "GiB" msgstr "" #. TRANSLATORS: initials for tebibyte (2⁴⁰): please put initials (keep it short) #: util.hpp:95 msgid "TiB" msgstr "" #: cpu-x-gtk-3.12.ui:1184 msgid "Cache" msgstr "தற்காலிக சேமிப்பு" #. Setting: refresh time for UI #: cpu-x-gtk-3.12.ui:5721 msgid "Refresh time" msgstr "" #. Setting: GUI theme #: cpu-x-gtk-3.12.ui:5745 msgid "Text theme" msgstr "" #. Setting: automatic GUI theme #: cpu-x-gtk-3.12.ui:5760 msgid "Automatic" msgstr "" #. Setting: light GUI theme #: cpu-x-gtk-3.12.ui:5761 msgid "Blue for light theme" msgstr "" #. Setting: dark GUI theme #: cpu-x-gtk-3.12.ui:5762 msgid "Yellow for dark theme" msgstr "" #. Setting: temperature unit #: cpu-x-gtk-3.12.ui:5775 #, fuzzy #| msgid "Temperature" msgid "Temperature unit" msgstr "வெப்பநிலை" #. Setting: default tab at startup #: cpu-x-gtk-3.12.ui:5826 msgid "Default tab" msgstr "" #. Setting: default CPU core at startup #: cpu-x-gtk-3.12.ui:5839 msgid "Default CPU core" msgstr "" #. Setting: default cache test at startup #: cpu-x-gtk-3.12.ui:5852 msgid "Default cache test" msgstr "" #. Setting: print CPUID values in decimal or hexadecimal #: cpu-x-gtk-3.12.ui:5895 msgid "Print CPUID values in decimal" msgstr "" #. Setting: default graphic card at startup #: cpu-x-gtk-3.12.ui:5928 msgid "Default graphic card" msgstr "" #. Setting: default CPU core at startup #: cpu-x-gtk-3.12.ui:5952 msgid "Default core type" msgstr "" #. Setting: default graphic card at startup #: cpu-x-gtk-3.12.ui:5976 msgid "Default memory stick" msgstr "" #. Setting: "Startup" tab #: cpu-x-gtk-3.12.ui:6004 msgid "Startup" msgstr "" #~ msgid "Calculating CPU multipliers" #~ msgstr "CPU பெருக்கிகளைக் கணக்கிடுகிறது" #, c-format #~ msgid "Current: PCIe Gen%1dx%d / Max: Gen%1dx%d" #~ msgstr "தற்போதைய: PCIe Gen%1dx%d / அதிகபட்சம்: Gen%1dx%d" #~ msgid "failed to retrieve GPU clocks" #~ msgstr "GPU கடிகாரங்களை மீட்டெடுக்க முடியவில்லை" #, c-format #~ msgid "Core #%i" #~ msgstr "கோர் #%i" #~ msgid "Setting label names" #~ msgstr "லேபிள் பெயர்களை அமைத்தல்" #, c-format #~ msgid "Bank %i" #~ msgstr "வங்கி %i" #~ msgid "Reference" #~ msgstr "குறிப்பு" #~ msgid "Distribution" #~ msgstr "விநியோகம்" #~ msgid "Compiler" #~ msgstr "தொகுப்பாளர்" #~ msgid "GPU clock" #~ msgstr "GPU கடிகாரம்" CPU-X-5.0.3/po/tr.po000066400000000000000000001254701454622605200137750ustar00rootroot00000000000000# Copyright © 2014-2024 The Tumultuous Unicorn Of Darkness # This file is distributed under the same license as the CPU-X package. # Brsn , 2019. # Mesut Akcan , 2019. # illaki , 2019. # Ömer Çakmak , 2019. # Ferit Etem , 2019. # Ali A. , 2019. # mahmut özcan , 2019, 2020. # Burak , 2019. # Sabri Ünal , 2020, 2021, 2023. # Çalgan Aygün , 2020. # Adnan1091 , 2020. # Yaşar Çiv , 2020. # Anonymous , 2020. # Oğuz Ersen , 2020, 2021, 2022. # Oğuz Ersen , 2022, 2023. # Ensar Melih Bulut , 2023. msgid "" msgstr "" "Project-Id-Version: CPU-X\n" "Report-Msgid-Bugs-To: https://github.com/TheTumultuousUnicornOfDarkness/CPU-" "X/issues\n" "POT-Creation-Date: 2023-12-09 13:09+0100\n" "PO-Revision-Date: 2023-12-10 08:16+0000\n" "Last-Translator: Oğuz Ersen \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 5.3-dev\n" #: core.cpp:135 msgid "Finding CPU technology" msgstr "İşlemci teknolojisi bulunuyor" #: core.cpp:161 #, c-format msgid "" "Your CPU is not present in the database ==> %s, model: %i, ext. model: %i, " "ext. family: %i" msgstr "" "Veri tabanında CPU'nuz yok ==> %s, model: %i, genişletilmiş model: %i, " "genişletilmiş aile: %i" #: core.cpp:189 data.cpp:150 data.cpp:342 msgid "unknown" msgstr "bilinmeyen" #: core.cpp:230 msgid "Calling libcpuid for retrieving static data" msgstr "Statik veri almak için libcpuid çağrılıyor" #: core.cpp:245 #, c-format msgid "failed to call libcpuid (%s)" msgstr "libcpuid çağrılamadı (%s)" #: core.cpp:340 msgid "Calling libcpuid for retrieving dynamic data" msgstr "Dinamik veri almak için libcpuid çağrılıyor" #: core.cpp:353 msgid "Calling libcpuid for retrieving CPU MSR static values" msgstr "CPU MSR statik değerlerini almak için libcpuid çağrılıyor" #: core.cpp:380 msgid "Calling libcpuid for retrieving CPU MSR dynamic values" msgstr "CPU MSR dinamik değerlerini almak için libcpuid çağrılıyor" #: core.cpp:412 msgid "Calling dmidecode" msgstr "dmidecode çağrılıyor" #: core.cpp:454 core.cpp:473 #, c-format msgid "%s (configured)" msgstr "%s (yapılandırıldı)" #: core.cpp:461 core.cpp:480 #, c-format msgid "%s (max)" msgstr "%s (azami)" #: core.cpp:466 #, c-format msgid "%s (min)" msgstr "%s (asgari)" #: core.cpp:496 msgid "Calculating CPU usage" msgstr "CPU kullanımı hesaplanıyor" #: core.cpp:546 msgid "Calling bandwidth" msgstr "Bant genişliği çağrılıyor" #: core.cpp:613 #, c-format msgid "" "pci_access is not properly initialized: it is a common issue when %s was " "built with a lower libpci version.\n" "Check that libpci %s library is present on your system. Otherwise, please " "rebuild %s." msgstr "" "pci_access düzgün başlatılmadı: bu, %s daha düşük bir libpci sürümüyle " "derlendiğinde görülen yaygın bir sorundur.\n" "Sisteminizde libpci %s kütüphanesinin bulunup bulunmadığına bakın. Aksi " "takdirde, lütfen %s'i yeniden derleyin." #: core.cpp:657 #, c-format msgid "No kernel driver in use for graphic card at path %s" msgstr "%s yolundaki grafik kartı için kullanılan çekirdek sürücüsü yok" #: core.cpp:693 #, c-format msgid "Your GPU kernel driver is unknown: %s" msgstr "GPU çekirdek sürücünüz bilinmiyor: %s" #: core.cpp:777 #, c-format msgid "Your GPU user mode driver is unknown for vendor %s: %s" msgstr "%s markası için GPU kullanıcı modu sürücünüz bilinmiyor: %s" #: core.cpp:781 #, c-format msgid "failed to call GLFW (%i): %s" msgstr "GLFW çağrılamadı (%i): %s" #: core.cpp:914 msgid "Finding Vulkan API version" msgstr "Vulkan API sürümü bulunuyor" #: core.cpp:926 #, c-format msgid "failed to call vkCreateInstance (%s)" msgstr "vkCreateInstance çağrılamadı (%s)" #: core.cpp:929 #, c-format msgid "%s is not supported" msgstr "%s desteklenmiyor" #: core.cpp:937 #, c-format msgid "failed to call vkEnumeratePhysicalDevices (%s)" msgstr "vkEnumeratePhysicalDevices çağrılamadı (%s)" #: core.cpp:944 msgid "No available Vulkan devices" msgstr "Kullanılabilir Vulkan aygıtı yok" #: core.cpp:952 #, c-format msgid "No available physical devices (%s)" msgstr "Kullanılabilir fiziksel aygıt yok (%s)" #: core.cpp:1015 #, c-format msgid "Failed to create Vulkan for device %u (%s)" msgstr "Aygıt %u için Vulkan oluşturulamadı (%s)" #: core.cpp:1019 #, c-format msgid "%s is not supported for device %u, use only deviceID for matching" msgstr "" "%s, aygıt %u için desteklenmiyor, eşleştirme için yalnızca aygıt kimliğini " "kullanın" #: core.cpp:1051 core.cpp:1364 msgid "Enabled" msgstr "Etkinleştirildi" #: core.cpp:1051 core.cpp:1364 msgid "Disabled" msgstr "Devre dışı" #: core.cpp:1088 msgid "Finding OpenCL API version" msgstr "OpenCL API sürümü bulunuyor" #: core.cpp:1092 #, c-format msgid "There is no platform with OpenCL support (%s)" msgstr "OpenCL desteğine sahip bir platform yok (%s)" #: core.cpp:1102 #, c-format msgid "failed to get all OpenCL platforms (%s)" msgstr "tüm OpenCL platformları alınamadı (%s)" #: core.cpp:1115 #, c-format msgid "failed to get name for platform %u (%s)" msgstr "%u. platformun adı alınamadı (%s)" #: core.cpp:1123 #, c-format msgid "failed to get version for platform %u (%s)" msgstr "%u .platform için sürüm alınamadı (%s)" #: core.cpp:1131 #, c-format msgid "failed to find number of OpenCL devices for platform '%s %s' (%s)" msgstr "'%s %s' platformu için OpenCL aygıtlarının sayısı bulunamadı (%s)" #: core.cpp:1131 msgid "0 device" msgstr "0 aygıt" #: core.cpp:1140 #, c-format msgid "failed to get all of OpenCL devices for platform '%s %s' (%s)" msgstr "'%s %s' platformu için tüm OpenCL aygıtları alınamadı (%s)" #: core.cpp:1160 #, c-format msgid "failed to get name for device %u (%s)" msgstr "%u. aygıtın adı alınamadı (%s)" #: core.cpp:1168 #, c-format msgid "failed to get version for device %u (%s)" msgstr "%u. aygıt için sürüm alınamadı (%s)" #: core.cpp:1190 #, c-format msgid "OpenCL driver for '%s %s' does not support CL_DEVICE_TOPOLOGY_AMD (%s)" msgstr "'%s %s' için OpenCL sürücüsü CL_DEVICE_TOPOLOGY_AMD desteklemiyor (%s)" #: core.cpp:1201 #, c-format msgid "" "OpenCL driver for '%s %s' does not support CL_DEVICE_GFXIP_MAJOR_AMD (%s)" msgstr "" "'%s %s' için OpenCL sürücüsü CL_DEVICE_GFXIP_MAJOR_AMD desteklemiyor (%s)" #: core.cpp:1209 core.cpp:1229 core.cpp:1262 #, c-format msgid "" "OpenCL driver for '%s %s' does not support CL_DEVICE_MAX_COMPUTE_UNITS (%s)" msgstr "" "'%s %s' için OpenCL sürücüsü CL_DEVICE_MAX_COMPUTE_UNITS desteklemiyor (%s)" #: core.cpp:1250 #, c-format msgid "" "OpenCL driver for '%s %s' does not support CL_DEVICE_PCI_DOMAIN_ID_NV (%s), " "CL_DEVICE_PCI_BUS_ID_NV (%s) or CL_DEVICE_PCI_SLOT_ID_NV (%s)" msgstr "" "'%s %s' için OpenCL sürücüsü CL_DEVICE_PCI_DOMAIN_ID_NV (%s), " "CL_DEVICE_PCI_BUS_ID_NV (%s) veya CL_DEVICE_PCI_SLOT_ID_NV (%s) desteklemiyor" #: core.cpp:1273 #, c-format msgid "OpenCL is not supported with your GPU vendor (0x%X)" msgstr "GPU markanız OpenCL'yi desteklenmiyor (0x%X)" #: core.cpp:1295 msgid "Finding devices" msgstr "Aygıtlar bulunuyor" #: core.cpp:1307 #, c-format msgid "Skip devices search (wrong permissions on %s device)" msgstr "Aygıt aramayı atla (%s aygıtında yanlış izinler)" #: core.cpp:1350 #, c-format msgid "Your GPU vendor is unknown: %s (0x%X)" msgstr "GPU satıcınız bilinmiyor: %s (0x%X)" #: core.cpp:1370 msgid "failed to find chipset vendor and model" msgstr "yonga seti satıcısı ve model bulunamadı" #: core.cpp:1385 msgid "failed to find graphic card vendor and model" msgstr "ekran kartı marka ve modeli bulunamadı" #: core.cpp:1487 msgid "Retrieving GPU clocks" msgstr "GPU saatleri alınıyor" #: core.cpp:1500 msgid "None" msgstr "Hiçbiri" #: core.cpp:1509 #, c-format msgid "DRM path for %s is unknown" msgstr "%s için DRM yolu bilinmiyor" #: core.cpp:1516 #, c-format msgid "Card number for %s is unknown" msgstr "%s için kart numarası bilinmiyor" #: core.cpp:1541 #, c-format msgid "PCIe %s (current) / %s (max)" msgstr "PCIe %s (geçerli) / %s (azami)" #: core.cpp:1650 #, c-format msgid "Driver for %s doesn't report frequencies" msgstr "%s sürücüsü frekansları bildirmiyor" #: core.cpp:1671 #, c-format msgid "failed to retrieve all monitoring data for %s" msgstr "%s için tüm izmele verileri alınamadı" #: core.cpp:1694 msgid "Identifying running system" msgstr "İşletim sistemi tanımlanıyor" #: core.cpp:1697 msgid "failed to identify running system" msgstr "işletim sistemi tanımlanamadı" #: core.cpp:1749 core.cpp:1778 msgid "Calling libprocps" msgstr "libprocps çağrılıyor" #: core.cpp:1752 msgid "unable to get system uptime" msgstr "sistem çalışma süresi alınamıyor" #: core.cpp:1758 msgid "unable to create meminfo structure" msgstr "meminfo yapısı oluşturulamıyor" #: core.cpp:1804 msgid "Calling libstatgrab" msgstr "libstatgrab çağrılıyor" #: core.cpp:1852 #, c-format msgid "%i days, %i hours, %i minutes, %i seconds" msgstr "%i gün, %i saat, %i dakika, %i saniye" #: core.cpp:1915 msgid "Updating benchmark status" msgstr "Karşılaştırma durumu güncelleniyor" #: core.cpp:1918 msgid "Active" msgstr "Etkin" #: core.cpp:1921 #, c-format msgid "(%u hours left)" msgstr "(%u saat kaldı)" #: core.cpp:1923 #, c-format msgid "(%u minutes left)" msgstr "(%u dakika kaldı)" #: core.cpp:1925 #, c-format msgid "(%u seconds left)" msgstr "(%u saniye kaldı)" #: core.cpp:1929 core.cpp:1984 core.cpp:1985 msgid "Inactive" msgstr "Etkin değil" #: core.cpp:1932 #, c-format msgid "in %u hours" msgstr "%u saat içinde" #: core.cpp:1934 #, c-format msgid "in %u minutes" msgstr "%u dakika içinde" #: core.cpp:1936 #, c-format msgid "in %u seconds" msgstr "%u saniye içinde" #: core.cpp:1953 #, c-format msgid "Starting benchmark with %u threads" msgstr "Karşılaştırma %u iş parçacığıyla başlatılıyor" #: core.cpp:1976 msgid "an error occurred while starting benchmark" msgstr "karşılaştırma başlatılırken hata oluştu" #: core.cpp:2002 msgid "Finding CPU package in fallback mode" msgstr "Yedek modda CPU paketi bulunuyor" #: core.cpp:2032 #, c-format msgid "Your CPU socket is not present in the database ==> %s, codename: %s" msgstr "Veri tabanında CPU soketiniz yok ==> %s, kod adı: %s" #: core.cpp:2052 msgid "Calculating CPU multipliers in fallback mode" msgstr "Yedek modda CPU çarpanları hesaplanıyor" #: core.cpp:2072 msgid "Retrieving motherboard information in fallback mode" msgstr "Yedek modda anakart bilgisi alınıyor" #: core.cpp:2085 msgid "failed to retrieve motherboard information (fallback mode)" msgstr "anakart bilgisi alınamadı (yedek modu)" #: core.cpp:2127 msgid "Retrieving CPU temperature in fallback mode" msgstr "Yedek modda CPU sıcaklığı alınıyor" #: core.cpp:2173 msgid "failed to retrieve CPU temperature (fallback mode)" msgstr "CPU sıcaklığı alınamadı (yedek mod)" #: core.cpp:2188 msgid "Retrieving CPU voltage in fallback mode" msgstr "Yedek modda CPU gerilimi alınıyor" #: core.cpp:2200 msgid "failed to retrieve CPU voltage (fallback mode)" msgstr "CPU gerilimi alınamadı (yedek mod)" #: core.cpp:2214 msgid "Retrieving CPU frequency in fallback mode" msgstr "Yedek modda CPU frekansı alınıyor" #: core.cpp:2220 msgid "failed to retrieve CPU frequency (fallback mode)" msgstr "CPU frekansı alınamadı (yedek mod)" #: daemon_client.cpp:65 msgid "Starting daemon in background…" msgstr "Art alan hizmeti arka planda başlatılıyor…" #: daemon_client.cpp:172 msgid "pkexec: authorization could not be obtained (dialog dismissed)" msgstr "pkexec: yetkilendirme alınamadı (iletişim kutusu kapatıldı)" #: daemon_client.cpp:175 msgid "pkexec: authorization could not be obtained (not authorized)" msgstr "pkexec: yetkilendirme alınamadı (yetkilendirilmedi)" #: daemon_client.cpp:178 msgid "pkexec: command not found" msgstr "pkexec: komut bulunamadı" #: daemon_client.cpp:181 msgid "pkexec: unexpected error code" msgstr "pkexec: beklenmedik hata kodu" #: daemon_client.cpp:211 msgid "Connecting to daemon…" msgstr "Art alan hizmetine bağlanılıyor…" #: daemon_server.cpp:261 #, c-format msgid "request_handler: case %i not handled" msgstr "request_handler: %i durumu işlemedi" #: data.cpp:124 cpu-x-gtk-3.12.ui:1370 msgid "CPU" msgstr "CPU" #: data.cpp:187 msgid "P-core" msgstr "P-çekirdek" #: data.cpp:188 msgid "E-core" msgstr "E-çekirdek" #: data.cpp:189 data.cpp:192 msgid "Core" msgstr "Çekirdek" #: data.cpp:208 cpu-x-gtk-3.12.ui:746 msgid "Processor" msgstr "İşlemci" #: data.cpp:240 data.cpp:329 cpu-x-gtk-3.12.ui:1968 msgid "Caches" msgstr "Önbellekler" #: data.cpp:247 #, c-format msgid "%2d x %4d %s, %2d-way" msgstr "%2d x %4d %s, %2d-yol" #: data.cpp:249 #, c-format msgid "%d %s, %d-way" msgstr "%d %s, %d-yol" #: data.cpp:263 msgid "Count" msgstr "Say" #: data.cpp:276 cpu-x-gtk-3.12.ui:968 msgid "Clocks" msgstr "Saatler" #: data.cpp:379 data.cpp:383 #, c-format msgid "L%u Cache" msgstr "L%u Önbelleği" #: data.cpp:385 #, c-format msgid "%s associative, %d-%s line size" msgstr "%s ilişkilendirilebilir, %d-%s satır boyutu" #: data.cpp:398 msgid "Test" msgstr "Test" #: data.cpp:409 data.cpp:423 cpu-x-gtk-3.12.ui:2146 cpu-x-gtk-3.12.ui:2517 msgid "Motherboard" msgstr "Anakart" #: data.cpp:437 cpu-x-gtk-3.12.ui:2367 msgid "BIOS" msgstr "BIOS" #: data.cpp:452 cpu-x-gtk-3.12.ui:2498 msgid "Chipset" msgstr "Yonga seti" #: data.cpp:467 data.cpp:569 cpu-x-gtk-3.12.ui:3156 cpu-x-gtk-3.12.ui:3761 msgid "Memory" msgstr "Bellek" #: data.cpp:483 #, c-format msgid "Stick %u" msgstr "Çubuk %u" #: data.cpp:487 cpu-x-gtk-3.12.ui:3134 msgid "Sticks" msgstr "Çubuklar" #: data.cpp:541 cpu-x-gtk-3.12.ui:3780 msgid "System" msgstr "Sistem" #: data.cpp:554 cpu-x-gtk-3.12.ui:3380 msgid "Operating System" msgstr "İşletim Sistemi" #: data.cpp:587 cpu-x-gtk-3.12.ui:4960 msgid "Graphics" msgstr "Grafikler" #: data.cpp:621 #, c-format msgid "Card %u" msgstr "Kart %u" #: data.cpp:625 cpu-x-gtk-3.12.ui:4938 msgid "Cards" msgstr "Kartlar" #: data.cpp:672 cpu-x-gtk-3.12.ui:5300 msgid "Bench" msgstr "Karşılaştırma" #: data.cpp:685 msgid "Not started" msgstr "Başlatılmadı" #: data.cpp:688 cpu-x-gtk-3.12.ui:5070 msgid "Prime numbers (slow)" msgstr "Asal sayılar (yavaş)" #: data.cpp:692 cpu-x-gtk-3.12.ui:5178 msgid "Prime numbers (fast)" msgstr "Asal sayılar (hızlı)" #: data.cpp:696 cpu-x-gtk-3.12.ui:5281 msgid "Parameters" msgstr "Parametreler" #: data.cpp:721 data.cpp:727 #, c-format msgid "%u mins" msgstr "%u dakika" #: data.cpp:734 cpu-x-gtk-3.12.ui:5444 cpu-x-gtk-3.12.ui:5552 msgid "About" msgstr "Hakkında" #: data.cpp:739 #, c-format msgid "" "%s is a Free software that gathers information\n" "on CPU, motherboard and more." msgstr "" "%s CPU, anakart ve daha fazlası hakkında bilgi\n" "toplayan özgür bir yazılımdır." #: data.cpp:744 msgid "About CPU-X" msgstr "CPU-X Hakkında" #: data.cpp:745 #, c-format msgid "Version %s" msgstr "Sürüm %s" #: data.cpp:746 #, c-format msgid "Author: %s" msgstr "Yazar: %s" #: data.cpp:747 #, c-format msgid "Site: %s" msgstr "Site: %s" #: data.cpp:751 cpu-x-gtk-3.12.ui:5533 msgid "License" msgstr "Lisans" #: data.cpp:753 #, c-format msgid "This software is distributed under the terms of %s" msgstr "Bu yazılım %s koşulları altında dağıtılmıştır" #: data.cpp:754 main.cpp:176 msgid "This program comes with ABSOLUTELY NO WARRANTY" msgstr "Bu programın KESİNLİKLE HİÇBİR GARANTİSİ yoktur" #: gui_gtk.cpp:61 #, c-format msgid "Cannot find path for '%s' file" msgstr "'%s' dosyasının yolu bulunamadı" #: gui_gtk.cpp:400 msgid "Start daemon" msgstr "Art alan hizmetini başlat" #: gui_gtk.cpp:403 msgid "Connected to daemon" msgstr "Art alan hizmetine bağlanıldı" #: gui_gtk.cpp:406 msgid "No polkit authentication agent found" msgstr "Hiçbir polkit kimlik doğrulama aracısı bulunamadı" #: gui_gtk.cpp:411 msgid "Ask password to start daemon in background" msgstr "Art alan hizmetini başlatmak için parola sor" #: gui_gtk.cpp:415 msgid "Settings" msgstr "Ayarlar" #: gui_gtk.cpp:634 msgid "BaseFamily" msgstr "TemelAile" #: gui_gtk.cpp:635 msgid "CPU display (\"true\") family (computed as BaseFamily+ExtendedFamily)" msgstr "" "Görüntülenen (\"gerçek\") CPU ailesi (TemelAile+GenişletilmişAile olarak " "hesaplanır)" #: gui_gtk.cpp:636 msgid "BaseModel" msgstr "TemelModel" #: gui_gtk.cpp:637 msgid "CPU display (\"true\") model (computed as (ExtendedModel<<4)+BaseModel)" msgstr "" "Görüntülenen (\"gerçek\") CPU modeli ((GenişletilmişModel<<4)+TemelModel " "olarak hesaplanır)" #: gui_gtk.cpp:847 msgid "" "Identify the physically-labeled socket or board position where the memory " "device is located" msgstr "" "Bellek aygıtının bulunduğu fiziksel olarak etiketlenmiş soketi ya da kart " "konumunu tanımla" #: gui_gtk.cpp:848 msgid "Identify the physically labeled bank where the memory device is located" msgstr "Bellek aygıtının bulunduğu fiziksel olarak etiketlenmiş bakoyu tanımla" #: gui_gtk.cpp:1052 msgid "User Mode Driver Version" msgstr "Kullanıcı Modu Sürücü Sürümü" #: gui_gtk.cpp:1066 msgid "Vulkan Ray Tracing" msgstr "Vulkan Işın Yansıma (Ray Tracing)" #: gui_gtk.cpp:1260 msgid "Starting GTK GUI…" msgstr "GTK GUI başlatılıyor…" #: gui_gtk.cpp:1272 msgid "failed to import UI in GtkBuilder" msgstr "GtkBuilder'da kullanıcı arayüzü içe aktarılamadı" #: main.cpp:63 msgid "Start graphical user interface (GUI) (default)" msgstr "Grafiksel kullanıcı arayüzünü (GUI) başlat (öntanımlı)" #: main.cpp:64 msgid "Start text-based user interface (TUI)" msgstr "Metin tabanlı kullanıcı arayüzünü (TUI) başlat" #: main.cpp:65 msgid "Dump all data on standard output and exit" msgstr "Tüm verileri standart çıktıya dök ve çık" #: main.cpp:66 msgid "Run embedded command dmidecode and exit" msgstr "Gömülü dmidecode komutunu çalıştır ve çık" #: main.cpp:67 msgid "Run embedded command bandwidth and exit" msgstr "Gömülü bandwidth komutunu çalıştır ve çık" #: main.cpp:68 msgid "Set temperature unit (c[elsius]|f[ahrenheit]|k[elvin]|r[ankine])" msgstr "Sıcaklık birimini ayarla (c[elsius]|f[ahrenheit]|k[elvin]|r[ankine])" #: main.cpp:69 msgid "Set custom time between two refreshes (in seconds)" msgstr "İki yenileme arasında özel süre ayarla (saniye cinsinden)" #: main.cpp:70 msgid "Set default tab (integer)" msgstr "Öntanımlı sekmeyi ayarla (tam sayı)" #: main.cpp:71 msgid "Select core type to monitor (integer)" msgstr "İzlenecek çekirdek türünü seç (tam sayı)" #: main.cpp:72 msgid "Select CPU core to monitor (integer)" msgstr "İzlenecek işlemci çekirdeğini seç (tam sayı)" #: main.cpp:73 msgid "Set custom bandwidth test for CPU caches speed (integer)" msgstr "İşlemci önbellek hızı için özel bant genişliği ayarla (tam sayı)" #: main.cpp:74 msgid "Select default memory stick (integer)" msgstr "Öntanımlı bellek çubuğunu seç (tam sayı)" #: main.cpp:75 msgid "Select default graphic card (integer)" msgstr "Öntanımlı grafik kartını seç (tam sayı)" #: main.cpp:76 cpu-x-gtk-3.12.ui:5910 msgid "Start and connect to daemon" msgstr "Art alan hizmetini başlat ve bağlan" #: main.cpp:77 msgid "Verbose output" msgstr "Ayrıntılı çıktı" #: main.cpp:78 msgid "Print help and exit" msgstr "Yardımı yazdır ve çık" #: main.cpp:79 msgid "Print version and exit" msgstr "Sürümü yazdır ve çık" #: main.cpp:80 msgid "Print CPUID values in decimal (default is hexadeximal)" msgstr "" "CPUID değerlerini ondalık olarak yazdır (öntanımlı olarak onaltılıktır)" #: main.cpp:81 msgid "Disable colored output" msgstr "Renkli çıktıyı devre dışı bırak" #: main.cpp:82 msgid "Print information for debugging" msgstr "Hata ayıklama bilgilerini yazdır" #: main.cpp:83 msgid "Print required information to paste in an issue" msgstr "Bir soruna yapıştırmak için gerekli bilgileri yazdır" #: main.cpp:84 msgid "Set key mapping for NCurses mode (a[rrows]|e[macs]|i[nverted-T]|v[im])" msgstr "" "NCurses modu için tuş atamasını ayarla (a[rrows]|e[macs]|i[nverted-T]|v[im])" #: main.cpp:95 msgid "Add default command line arguments" msgstr "Öntanımlı komut satırı argümanlarını ekle" #: main.cpp:96 msgid "Enforce the bus clock" msgstr "Veri yolu saatini zorla" #: main.cpp:97 msgid "" "Ignore CPU values reported by libcpuid (comma-separated values among 'temp', " "'volt' and 'freq')" msgstr "" "Libcpuid tarafından bildirilen CPU değerlerini görmezden gel ('temp', 'volt' " "ve 'freq' arasında virgülle ayrılmış değerler)" #: main.cpp:98 msgid "Read CPUID raw data from a given file" msgstr "Belirtilen bir dosyadan CPUID ham verilerini oku" #: main.cpp:99 msgid "Only print a message if CPU is not present in the database" msgstr "Yalnızca veri tabanında CPU yoksa bir mesaj yazdır" #: main.cpp:126 #, c-format msgid "Usage: %s DISPLAY [OPTIONS]\n" msgstr "Kullanım: %s EKRAN [SEÇENEKLER]\n" #: main.cpp:127 msgid "Available DISPLAY:" msgstr "Kullanılabilir EKRAN:" #: main.cpp:135 msgid "Available OPTIONS:" msgstr "Kullanılabilir SEÇENEKLER:" #: main.cpp:144 msgid "Influenceable environment variables:" msgstr "Etkilenebilir ortam değişkenleri:" #: main.cpp:175 msgid "This is free software: you are free to change and redistribute it." msgstr "Bu bir özgür yazılımdır: değiştirmek ve yeniden dağıtmakta özgürsünüz." #: main.cpp:177 #, c-format msgid "See the %s license: <%s>\n" msgstr "%s lisansına bakın: <%s>\n" #: main.cpp:184 #, c-format msgid "-- %-9s version: %s" msgstr "-- %-9s sürümü: %s" #: main.cpp:381 #, c-format msgid "" "\n" "Oops, something was wrong! %s has received signal %d (%s) and has crashed." msgstr "" "\n" "Hay aksi, birşeyler yanlış gitti! %s, %d (%s) sinyali aldı ve çöktü." #: main.cpp:383 #, c-format msgid "" "\n" "Oops, something was wrong! %s has received signal %d (%s) and is trying to " "recover." msgstr "" "\n" "Hay aksi, birşeyler yanlış gitti! %s, %d (%s) sinyali aldı ve kurtarmaya " "çalışıyor." #: main.cpp:407 msgid "You can open a new issue here, by filling the template as requested:" msgstr "Şablonu istendiği gibi doldurarak burada yeni bir sorun açabilirsiniz:" #: main.cpp:449 msgid "an error occurred while setting locale" msgstr "yerel ayar yapılırken bir hata oluştu" #: options.cpp:124 #, c-format msgid "" "Selected CPU type (%u) is not a valid number (%u is the maximum for this CPU)" msgstr "" "Seçilen CPU türü (%u) geçerli bir sayı değil (%u bu CPU için azami değerdir)" #: options.cpp:145 #, c-format msgid "" "Selected bandwidth test (%u) is not a valid number (%u is the maximum for " "this system)" msgstr "" "Seçilen bant genişliği türü (%u) geçerli bir sayı değil (%u bu sistem için " "azami değerdir)" #: options.cpp:168 #, c-format msgid "" "Selected RAM stick (%u) is not a valid number (%u is the maximum for this " "system)" msgstr "" "Seçilen RAM türü (%u) geçerli bir sayı değil (%u bu sistem için azami " "değerdir)" #: options.cpp:188 #, c-format msgid "" "Selected graphic card (%u) is not a valid number (%u is the maximum for this " "system)" msgstr "" "Seçilen grafik kartı (%u) geçerli bir sayı değil (%u bu sistem için azami " "sayıdır)" #: options.cpp:204 #, c-format msgid "failed to change CPU affinitiy to core %u" msgstr "Çekirdek %u için CPU benzeşimi değiştirilemedi" #: options.cpp:210 #, c-format msgid "" "Selected CPU core (%u) is not a valid number (%u is the maximum for this " "type of core)" msgstr "" "Seçilen CPU çekirdeği (%u) geçerli bir sayı değil (%u bu çekirdek türü için " "azami sayıdır)" #: options.cpp:284 #, c-format msgid "Selected tab (%u) is not a valid number (%u is the maximum)" msgstr "Seçilen sekme (%u) geçerli bir sayı değil (%u azami değerdir)" #: tui_ncurses.cpp:111 msgid "Window is too small!" msgstr "Pencere çok küçük!" #: tui_ncurses.cpp:119 msgid "Press 'h' to see help." msgstr "Yardımı görmek için 'h' tuşuna basın." #: tui_ncurses.cpp:232 #, c-format msgid "Welcome in %s NCurses help!\n" msgstr "%s NCurses yardımına hoş geldiniz!\n" #: tui_ncurses.cpp:233 msgid "This help describes how to use this Text-based User Interface." msgstr "" "Bu yardım, metin tabanlı kullanıcı arayüzünün nasıl kullanılacağını açıklar." #: tui_ncurses.cpp:235 msgid "Global keys:" msgstr "Genel tuşlar:" #: tui_ncurses.cpp:236 msgid "Press 'left' key or 'tab' key to switch in left tab." msgstr "Sol sekmeye geçmek için 'sol' veya 'tab' tuşuna basın." #: tui_ncurses.cpp:237 msgid "Press 'right' key or 'shift + tab' keys to switch in right tab." msgstr "Sağ sekmeye geçmek için 'sağ' veya 'shift + tab' tuşuna basın." #: tui_ncurses.cpp:238 msgid "Press 'h' key to see this help." msgstr "Bu yardımı görmek için 'h' tuşuna basın." #: tui_ncurses.cpp:239 msgid "Press 'q' key to exit." msgstr "Çıkmak için 'q' tuşuna basın." #: tui_ncurses.cpp:241 msgid "CPU tab:" msgstr "CPU sekmesi:" #: tui_ncurses.cpp:242 msgid "Press 'next page' key to decrease core type number to monitor." msgstr "" "İzlenecek çekirdek türü sayısını azaltmak için 'sonraki sayfa' tuşuna basın." #: tui_ncurses.cpp:243 msgid "Press 'previous page' key to increase core type number to monitor." msgstr "" "İzlenecek çekirdek türü sayısını arttırmak için 'önceki sayfa' tuşuna basın." #: tui_ncurses.cpp:244 msgid "Press 'down' key to decrease CPU core number to monitor." msgstr "İzlenecek CPU çekirdek sayısını azaltmak için 'aşağı' tuşuna basın." #: tui_ncurses.cpp:245 msgid "Press 'up' key to increase CPU core number to monitor." msgstr "İzlenecek CPU çekirdek sayısını artırmak için 'yukarı' tuşuna basın." #: tui_ncurses.cpp:247 msgid "Caches tab:" msgstr "Önbellek sekmesi:" #: tui_ncurses.cpp:248 msgid "Press 'down' key to switch to previous test." msgstr "Önceki teste geçmek için 'aşağı' tuşuna basın." #: tui_ncurses.cpp:249 msgid "Press 'up' key to switch to next test." msgstr "Sonraki teste geçmek için 'yukarı' tuşuna basın." #: tui_ncurses.cpp:251 msgid "Bench tab:" msgstr "Karşılaştırma sekmesi:" #: tui_ncurses.cpp:252 msgid "Press 'down' key to decrement benchmark duration." msgstr "Karşılaştırma süresini azaltmak için 'aşağı' tuşuna basın." #: tui_ncurses.cpp:253 msgid "Press 'up' key to increment benchmark duration." msgstr "Karşılaştırma süresini artırmak için 'yukarı' tuşuna basın." #: tui_ncurses.cpp:254 msgid "Press 'next page' key to decrement number of threads to use." msgstr "" "Kullanılacak iş parçacığı sayısını azaltmak için 'sonraki sayfa' tuşuna " "basın." #: tui_ncurses.cpp:255 msgid "Press 'previous page' key to increment number of threads to use." msgstr "" "Kullanılacak iş parçacığı sayısını artırmak için 'önceki sayfa' tuşuna basın." #: tui_ncurses.cpp:256 msgid "Press 's' key to start/stop prime numbers (slow) benchmark." msgstr "" "Asal sayıları (yavaş) karşılaştırmayı başlatmak/durdurmak için 's' tuşuna " "basın." #: tui_ncurses.cpp:257 msgid "Press 'f' key to start/stop prime numbers (fast) benchmark." msgstr "" "Asal sayıları (hızlı) karşılaştırmayı başlatmak/durdurmak için 'f' tuşuna " "basın." #: tui_ncurses.cpp:259 msgid "Graphics tab:" msgstr "Grafikler sekmesi:" #: tui_ncurses.cpp:260 msgid "Press 'down' key to switch to previous graphic card." msgstr "Önceki grafik kartına geçmek için 'aşağı' tuşuna basın." #: tui_ncurses.cpp:261 msgid "Press 'up' key to switch to next graphic card." msgstr "Sonraki grafik kartına geçmek için 'yukarı' tuşuna basın." #: tui_ncurses.cpp:263 msgid "Press any key to exit this help." msgstr "Yardımdan çıkmak için herhangi bir tuşa basın." #: tui_ncurses.cpp:640 msgid "Starting NCurses TUI…" msgstr "NCurses metin tabanlı arayüzü başlatılıyor…" #: tui_ncurses.cpp:649 msgid "" "FATAL ERROR: terminfo database could not be found (try to set TERMINFO " "environment variable)" msgstr "" "ÖNEMLİ HATA: terminfo veri tabanı bulunamadı (TERMINFO ortam değişkenini " "ayarlamayı deneyin)" #: tui_ncurses.cpp:654 #, c-format msgid "Failed to set up %s terminal (err=%i); falling back to %s" msgstr "%s terminali ayarlanamadı (err=%i); yedek olarak %s kullanılıyor" #: util.cpp:189 #, c-format msgid "cannot find unit in '%s' string at position %i" msgstr "'%s' dizgesinde %i konumundaki birim bulunamıyor" #: util.cpp:252 #, c-format msgid "an error occurred while opening file '%s'" msgstr "'%s' dosyası açılırken bir hata oluştu" #: util.cpp:297 #, c-format msgid "an error occurred while running command '%s'" msgstr "'%s' komutu çalıştırılırken bir hata oluştu" #: util.cpp:437 msgid "set_cpu_affinity() not supported on this operating system" msgstr "set_cpu_affinity() bu işletim sisteminde desteklenmiyor" #: data.hpp:103 data.hpp:244 data.hpp:332 msgid "Vendor" msgstr "Satıcı" #: data.hpp:104 msgid "Code Name" msgstr "Kod Adı" #: data.hpp:105 msgid "Package" msgstr "Paket" #: data.hpp:106 msgid "Technology" msgstr "Teknoloji" #: data.hpp:107 data.hpp:268 msgid "Voltage" msgstr "Gerilim" #: data.hpp:108 msgid "Specification" msgstr "Tanımlama" #: data.hpp:109 msgid "Family" msgstr "Aile" #: data.hpp:110 msgid "Disp. Family" msgstr "Görüntülenen Aile" #: data.hpp:111 data.hpp:224 data.hpp:245 data.hpp:335 msgid "Model" msgstr "Model" #: data.hpp:112 msgid "Disp. Model" msgstr "Görüntülenen Model" #: data.hpp:113 msgid "Temp." msgstr "Sıcaklık" #: data.hpp:114 msgid "Stepping" msgstr "Basamak Seviyesi" #: data.hpp:115 msgid "Instructions" msgstr "Talimatlar" #: data.hpp:125 msgid "L1 Data" msgstr "L1 Verileri" #: data.hpp:126 msgid "L1 Inst." msgstr "L1 Talimat." #: data.hpp:127 msgid "Level 2" msgstr "Seviye 2" #: data.hpp:128 msgid "Level 3" msgstr "Seviye 3" #: data.hpp:137 cpu-x-gtk-3.12.ui:1232 msgid "Cores" msgstr "Çekirdekler" #: data.hpp:138 data.hpp:408 cpu-x-gtk-3.12.ui:1252 msgid "Threads" msgstr "İş Parçacıkları" #: data.hpp:155 msgid "Core Speed" msgstr "Çekirdek Hızı" #: data.hpp:156 msgid "Multiplier" msgstr "Katsayı" #: data.hpp:157 msgid "Bus Speed" msgstr "Veri Yolu Hızı" #: data.hpp:158 data.hpp:341 msgid "Usage" msgstr "Kullanım" #: data.hpp:188 data.hpp:265 msgid "Size" msgstr "Boyut" #: data.hpp:189 data.hpp:267 msgid "Speed" msgstr "Hız" #: data.hpp:223 data.hpp:259 msgid "Manufacturer" msgstr "Üretici" #: data.hpp:225 msgid "Revision" msgstr "Düzeltme" #: data.hpp:233 msgid "Brand" msgstr "Marka" #: data.hpp:234 msgid "Version" msgstr "Sürüm" #: data.hpp:235 msgid "Date" msgstr "Tarih" #: data.hpp:236 msgid "ROM Size" msgstr "ROM Boyutu" #: data.hpp:260 msgid "Part Number" msgstr "Parça Numarası" #: data.hpp:261 msgid "Type" msgstr "Tür" #: data.hpp:262 msgid "Type Detail" msgstr "Tür Ayrıntısı" #: data.hpp:263 msgid "Device Locator" msgstr "Aygıt Bulucu" #: data.hpp:264 msgid "Bank Locator" msgstr "Banko Bulucu" #: data.hpp:266 msgid "Rank" msgstr "Rütbe" #: data.hpp:292 msgid "Name" msgstr "Ad" #: data.hpp:293 msgid "Kernel" msgstr "Çekirdek" #: data.hpp:294 msgid "Hostname" msgstr "Ana Makine Adı" #: data.hpp:295 msgid "Uptime" msgstr "Çalışma Zamanı" #: data.hpp:303 msgid "Used" msgstr "Kullanılmış" #: data.hpp:304 msgid "Buffers" msgstr "Arabellek" #: data.hpp:305 msgid "Cached" msgstr "Önbelleğe alınmış" #: data.hpp:306 msgid "Free" msgstr "Boş" #: data.hpp:307 msgid "Swap" msgstr "Takas" #: data.hpp:333 msgid "Driver" msgstr "Sürücü" #: data.hpp:334 msgid "UMD Version" msgstr "UMD Sürümü" #: data.hpp:336 msgid "Compute Unit" msgstr "İşlem Birimi" #: data.hpp:337 msgid "Device ID" msgstr "Aygıt Kimliği" #: data.hpp:338 msgid "VBIOS Version" msgstr "VBIOS Sürümü" #. #-#-#-#-# source_ui.pot (cpu-x ) #-#-#-#-# #. Setting: "Interface" tab #: data.hpp:339 cpu-x-gtk-3.12.ui:5807 msgid "Interface" msgstr "Arayüz" #: data.hpp:340 msgid "Temperature" msgstr "Sıcaklık" #: data.hpp:342 msgid "Core Voltage" msgstr "Çekirdek Gerilimi" #: data.hpp:343 msgid "Power Avg" msgstr "Güç Ortalaması" #: data.hpp:344 msgid "Core Clock" msgstr "Çekirdek Saati" #: data.hpp:345 msgid "Memory Clock" msgstr "Bellek Saati" #: data.hpp:346 msgid "Memory Used" msgstr "Kullanılan Bellek" #: data.hpp:347 msgid "Resizable BAR" msgstr "Yeniden Boyutlandırılabilir Çubuk" #: data.hpp:348 msgid "Vulkan RT" msgstr "Vulkan RT" #: data.hpp:349 msgid "OpenGL Version" msgstr "OpenGL Sürümü" #: data.hpp:350 msgid "Vulkan Version" msgstr "Vulkan Sürümü" #: data.hpp:351 msgid "OpenCL Version" msgstr "OpenCL Sürümü" #: data.hpp:387 msgid "Score" msgstr "Puan" #: data.hpp:388 msgid "Run" msgstr "Çalıştır" #: data.hpp:407 msgid "Duration" msgstr "Süre" #: util.hpp:77 msgid "bytes" msgstr "bayt" #. TRANSLATORS: initials for kilobyte (10³): please put initials (keep it short) #: util.hpp:80 msgid "kB" msgstr "kB" #. TRANSLATORS: initials for megabyte (10⁶): please put initials (keep it short) #: util.hpp:82 msgid "MB" msgstr "MB" #. TRANSLATORS: initials for gigabyte (10⁹): please put initials (keep it short) #: util.hpp:84 msgid "GB" msgstr "GB" #. TRANSLATORS: initials for terabyte (10¹²): please put initials (keep it short) #: util.hpp:86 msgid "TB" msgstr "TB" #. TRANSLATORS: initials for kibibyte (2¹⁰): please put initials (keep it short) #: util.hpp:89 msgid "KiB" msgstr "KiB" #. TRANSLATORS: initials for mebibyte (2²⁰): please put initials (keep it short) #: util.hpp:91 msgid "MiB" msgstr "MiB" #. TRANSLATORS: initials for gibibyte (2³⁰): please put initials (keep it short) #: util.hpp:93 msgid "GiB" msgstr "GiB" #. TRANSLATORS: initials for tebibyte (2⁴⁰): please put initials (keep it short) #: util.hpp:95 msgid "TiB" msgstr "TiB" #: cpu-x-gtk-3.12.ui:1184 msgid "Cache" msgstr "Önbellek" #. Setting: refresh time for UI #: cpu-x-gtk-3.12.ui:5721 msgid "Refresh time" msgstr "Yenileme zamanı" #. Setting: GUI theme #: cpu-x-gtk-3.12.ui:5745 msgid "Text theme" msgstr "Metin teması" #. Setting: automatic GUI theme #: cpu-x-gtk-3.12.ui:5760 msgid "Automatic" msgstr "Otomatik" #. Setting: light GUI theme #: cpu-x-gtk-3.12.ui:5761 msgid "Blue for light theme" msgstr "Açık tema için mavi" #. Setting: dark GUI theme #: cpu-x-gtk-3.12.ui:5762 msgid "Yellow for dark theme" msgstr "Koyu tema için sarı" #. Setting: temperature unit #: cpu-x-gtk-3.12.ui:5775 msgid "Temperature unit" msgstr "Sıcaklık birimi" #. Setting: default tab at startup #: cpu-x-gtk-3.12.ui:5826 msgid "Default tab" msgstr "Öntanımlı sekme" #. Setting: default CPU core at startup #: cpu-x-gtk-3.12.ui:5839 msgid "Default CPU core" msgstr "Öntanımlı CPU çekirdeği" #. Setting: default cache test at startup #: cpu-x-gtk-3.12.ui:5852 msgid "Default cache test" msgstr "Öntanımlı önbellek testi" #. Setting: print CPUID values in decimal or hexadecimal #: cpu-x-gtk-3.12.ui:5895 msgid "Print CPUID values in decimal" msgstr "CPUID değerlerini ondalık olarak yazdır" #. Setting: default graphic card at startup #: cpu-x-gtk-3.12.ui:5928 msgid "Default graphic card" msgstr "Öntanımlı grafik kartı" #. Setting: default CPU core at startup #: cpu-x-gtk-3.12.ui:5952 msgid "Default core type" msgstr "Öntanımlı çekirdek türü" #. Setting: default graphic card at startup #: cpu-x-gtk-3.12.ui:5976 msgid "Default memory stick" msgstr "Öntanımlı bellek çubuğu" #. Setting: "Startup" tab #: cpu-x-gtk-3.12.ui:6004 msgid "Startup" msgstr "Başlangıç" #~ msgid "Light" #~ msgstr "Açık" #~ msgid "Dark" #~ msgstr "Koyu" #~ msgid "Calculating CPU multipliers" #~ msgstr "CPU çarpanları hesaplanıyor" #, c-format #~ msgid "Current: PCIe Gen%1dx%d / Max: Gen%1dx%d" #~ msgstr "Şu anki: PCIe Gen%1dx%d / En yüksek: Gen%1dx%d" #~ msgid "failed to retrieve GPU clocks" #~ msgstr "GPU saatleri alınamadı" #, c-format #~ msgid "Core #%i" #~ msgstr "Çekirdek #%i" #~ msgid "Setting label names" #~ msgstr "Etiket adları ayarlanıyor" #, c-format #~ msgid "Bank %i" #~ msgstr "%i Bankası" #~ msgid "Reference" #~ msgstr "Kaynak" #~ msgid "Distribution" #~ msgstr "Dağıtım" #~ msgid "Compiler" #~ msgstr "Derleyici" #~ msgid "GPU clock" #~ msgstr "GPU saati" #~ msgid "Dumping data…" #~ msgstr "Veriler dökülüyor…" #~ msgid "Freeing memory" #~ msgstr "Bellek boşaltılıyor" #~ msgid "Ignore CPU frequency reported by libcpuid" #~ msgstr "libcpuid tarafından bildirilen CPU frekansını yok say" #, c-format #~ msgid "failed to call wordexp (%i)" #~ msgstr "wordexp çağrılamadı (%i)" #~ msgid "Press 'home' key to scroll up in a page." #~ msgstr "Bir sayfada yukarı kaydırmak için 'home' tuşuna basın." #~ msgid "Press 'end' key to scroll down in a page." #~ msgstr "Bir sayfada aşağı kaydırmak için 'end' tuşuna basın." #, c-format #~ msgid "String '%s' is too long, truncating…" #~ msgstr "'%s' dizgesi çok uzun, kesiliyor…" #, c-format #~ msgid "failed to open %s directory" #~ msgstr "%s dizini açılamadı" #~ msgid "an error occurred while compiling regex" #~ msgstr "düzenli ifade derlenirken bir hata oluştu" #~ msgid "FATAL ERROR: could not allocate memory" #~ msgstr "ÖNEMLİ HATA: bellek ayrılamadı" #~ msgid "Enumerating Vulkan instance extension properties" #~ msgstr "Vulkan örneği uzantısı özellikleri numaralandırılıyor" #, c-format #~ msgid "failed to call vkEnumerateInstanceExtensionProperties (%s)" #~ msgstr "vkEnumerateInstanceExtensionProperties çağrılamadı (%s)" #, c-format #~ msgid "" #~ "failed to call vkEnumerateInstanceExtensionProperties to fill " #~ "VkExtensionProperties (%s)" #~ msgstr "" #~ "VkExtensionProperties doldurmak için " #~ "vkEnumerateInstanceExtensionProperties çağrılamadı (%s)" #~ msgid "Vulkan API is not available" #~ msgstr "Vulkan API kullanılabilir değil" #, c-format #~ msgid "%s" #~ msgstr "%s" #, c-format #~ msgid "" #~ "CPU hybrid architecture is not supported. For more details, please refer " #~ "to following issue: %s" #~ msgstr "" #~ "Hibrit CPU mimarisi desteklenmiyor. Daha fazla ayrıntı için lütfen şu " #~ "soruna bakın: %s" #~ msgid "NOT SUPPORTED" #~ msgstr "DESTEKLENMİYOR" #~ msgid "There is no device with Vulkan support" #~ msgstr "Vulkan desteğine sahip bir aygıt yok" #~ msgid "Socket(s)" #~ msgstr "Soket(ler)" #~ msgid "Thread(s)" #~ msgstr "İş Parçacık(lar)ı" #~ msgid "You can paste this backtrace by opening a new issue here:" #~ msgstr "Bu geri izlemeyi buraya yeni bir konu açarak yapıştırabilirsiniz:" #~ msgid "faild to call clGetDeviceIDs" #~ msgstr "clGetDeviceIDs çağrılamadı" #~ msgid "Exiting %s" #~ msgstr "%s çıkışı yapılıyor" #~ msgid "Skip CPU MSR opening (need to be root)" #~ msgstr "CPU MSR açılışını atla (rootlu olması gerek)" #~ msgid "failed to open CPU MSR (%s)" #~ msgstr "CPU MSR açılamadı (%s)" #~ msgid "Skip call to dmidecode (need to be root)" #~ msgstr "dmidecall çağrılmasını es geç (root olmalı)" #~ msgid "failed to allocate memory for dmidecode" #~ msgstr "dmidecode için hafıza tahsis edilemedi" #~ msgid "Finding graphic card driver" #~ msgstr "Grafik kartı sürücüsü aranıyor" #~ msgid "(%s driver)" #~ msgstr "(%s sürücüsü)" #~ msgid "Retrieving GPU temperature" #~ msgstr "GPU sıcaklığı alınıyor" #~ msgid "Off" #~ msgstr "Kapalı" #~ msgid "failed to retrieve GPU temperature" #~ msgstr "GPU sıcaklığı alınamadı" #~ msgid "Skip some GPU values (need to be root)" #~ msgstr "Bazı GPU değerlerini atla (Root izni gerek)" #~ msgid "failed to allocate memory for benchmark" #~ msgstr "Karşılaştırma için bellek ayrılamadı" #~ msgid "Root privileges are required to work properly" #~ msgstr "Düzgün çalışması için Root (kök) yetki gerekiyor" #~ msgid "Some information will not be retrievable" #~ msgstr "Bazı bilgiler geri alınamayacak" #~ msgid "Ignore" #~ msgstr "Yok say" #~ msgid "Run as root" #~ msgstr "Root (kök) olarak çalıştır" #~ msgid "A new version of %s is available!" #~ msgstr "%s için yeni bir sürüm mevcut!" #~ msgid "" #~ "Do you want to update %s to version %s after exit?\n" #~ "It will erase this binary file (%s) by the new version." #~ msgstr "" #~ "Çıktıktan sonra %s sürümünü, %s sürümüne yükseltmek ister misiniz?\n" #~ "Bu işlem ikili dosyayı (%s) yenisiyle değiştirecektir." #~ msgid "Not now" #~ msgstr "Şu anda değil" #~ msgid "Update" #~ msgstr "Güncelle" #~ msgid "Checking on Internet for a new version..." #~ msgstr "Yeni sürüm internetten denetleniyor..." #~ msgid "failed to open a Curl session" #~ msgstr "Curl oturumu açılamadı" #~ msgid "wrong write data" #~ msgstr "hatalı yazma verisi" #~ msgid "(version %s is available)" #~ msgstr "(sürüm %s mevcut)" #~ msgid "No new version available" #~ msgstr "Yeni bir sürüm yok" #~ msgid "(up-to-date)" #~ msgstr "(güncel)" #~ msgid "an error occurred while extracting %s archive (%s)" #~ msgstr "%s arşivi dışarı çıkarılırken bir hatayla karşılaşıldı (%s)" #~ msgid "" #~ "Network access is disabled by environment variable (set CPUX_NETWORK with " #~ "a positive value to enable it)" #~ msgstr "" #~ "Ağ erişimi ortam değişkeni tarafından devre dışı bırakıldı " #~ "(aktifleştirmek için CPUX_NETWORK değişkenine pozitif bir değer atayın)" #~ msgid "failed to open %s archive for writing" #~ msgstr "%s arşivi yazmak için açılamadı" #~ msgid "Downloading new version..." #~ msgstr "Yeni sürüm indiriliyor..." #~ msgid "failed to download %s archive (%s)" #~ msgstr "%s arşivi indirilemedi (%s)" #~ msgid "Extracting new version..." #~ msgstr "Yeni sürüm çıkarılıyor..." #~ msgid "Applying new version..." #~ msgstr "Yeni sürüm uygulanıyor..." #~ msgid "an error occurred while removing/renaming files" #~ msgstr "dosyalar kaldırılırken/yeniden adlandırılırken bir hata oluştu" #~ msgid "Update successful!" #~ msgstr "Güncelleme başarılı!" #~ msgid "Update portable version if a new version is available" #~ msgstr "Yeni bir sürüm varsa taşınabilir sürümü güncelle" #~ msgid "Temporarily disable network support" #~ msgstr "Ağ desteğini geçici olarak devre dışı bırak" #~ msgid "Built on %s, %s (with %s %s on %s)." #~ msgstr "%s üzerinde oluşturuldu, %s (%s ile %s %s üzerinde)." #~ msgid "" #~ "Sorry, you cannot update %s: 32-bit portable version is no more supported." #~ msgstr "" #~ "Maalesef, %s güncelleyemezsiniz: 32 bit taşınabilir sürüm artık " #~ "desteklenmiyor." #~ msgid "If you want to update, press 'u' key, or anything else to skip.\n" #~ msgstr "" #~ "Güncellemek isterseniz, 'u' tuşuna veya atlamak için başka bir şeye " #~ "basın.\n" #~ msgid "" #~ "\n" #~ "\n" #~ "%s will be updated." #~ msgstr "" #~ "\n" #~ "\n" #~ "%s güncellenecek." CPU-X-5.0.3/po/tzm.po000066400000000000000000000630021454622605200141520ustar00rootroot00000000000000# CPU-X translations template # Copyright © 2014-2024 The Tumultuous Unicorn Of Darkness # This file is distributed under the same license as the cpu-x package. # Hakim Oubouali , 2020. msgid "" msgstr "" "Project-Id-Version: cpu-x\n" "Report-Msgid-Bugs-To: https://github.com/TheTumultuousUnicornOfDarkness/CPU-" "X/issues\n" "POT-Creation-Date: 2023-12-09 13:09+0100\n" "PO-Revision-Date: 2020-10-19 21:26+0000\n" "Last-Translator: Hakim Oubouali \n" "Language-Team: Central Atlas Tamazight \n" "Language: tzm\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 >= 2 && (n < 11 || n > 99);\n" "X-Generator: Weblate 4.3.1-dev\n" #: core.cpp:135 msgid "Finding CPU technology" msgstr "" #: core.cpp:161 #, c-format msgid "" "Your CPU is not present in the database ==> %s, model: %i, ext. model: %i, " "ext. family: %i" msgstr "" #: core.cpp:189 data.cpp:150 data.cpp:342 msgid "unknown" msgstr "" #: core.cpp:230 msgid "Calling libcpuid for retrieving static data" msgstr "" #: core.cpp:245 #, c-format msgid "failed to call libcpuid (%s)" msgstr "" #: core.cpp:340 msgid "Calling libcpuid for retrieving dynamic data" msgstr "" #: core.cpp:353 msgid "Calling libcpuid for retrieving CPU MSR static values" msgstr "" #: core.cpp:380 msgid "Calling libcpuid for retrieving CPU MSR dynamic values" msgstr "" #: core.cpp:412 msgid "Calling dmidecode" msgstr "" #: core.cpp:454 core.cpp:473 #, c-format msgid "%s (configured)" msgstr "" #: core.cpp:461 core.cpp:480 #, c-format msgid "%s (max)" msgstr "" #: core.cpp:466 #, c-format msgid "%s (min)" msgstr "" #: core.cpp:496 msgid "Calculating CPU usage" msgstr "Asiḍen n asemres n CPU" #: core.cpp:546 msgid "Calling bandwidth" msgstr "Aɣuri n bandwidth" #: core.cpp:613 #, c-format msgid "" "pci_access is not properly initialized: it is a common issue when %s was " "built with a lower libpci version.\n" "Check that libpci %s library is present on your system. Otherwise, please " "rebuild %s." msgstr "" #: core.cpp:657 #, c-format msgid "No kernel driver in use for graphic card at path %s" msgstr "" #: core.cpp:693 #, c-format msgid "Your GPU kernel driver is unknown: %s" msgstr "" #: core.cpp:777 #, c-format msgid "Your GPU user mode driver is unknown for vendor %s: %s" msgstr "" #: core.cpp:781 #, c-format msgid "failed to call GLFW (%i): %s" msgstr "" #: core.cpp:914 #, fuzzy #| msgid "Version" msgid "Finding Vulkan API version" msgstr "Taleqqimt" #: core.cpp:926 #, c-format msgid "failed to call vkCreateInstance (%s)" msgstr "" #: core.cpp:929 #, c-format msgid "%s is not supported" msgstr "" #: core.cpp:937 #, c-format msgid "failed to call vkEnumeratePhysicalDevices (%s)" msgstr "" #: core.cpp:944 msgid "No available Vulkan devices" msgstr "" #: core.cpp:952 #, c-format msgid "No available physical devices (%s)" msgstr "" #: core.cpp:1015 #, c-format msgid "Failed to create Vulkan for device %u (%s)" msgstr "" #: core.cpp:1019 #, c-format msgid "%s is not supported for device %u, use only deviceID for matching" msgstr "" #: core.cpp:1051 core.cpp:1364 msgid "Enabled" msgstr "" #: core.cpp:1051 core.cpp:1364 msgid "Disabled" msgstr "" #: core.cpp:1088 #, fuzzy #| msgid "Version" msgid "Finding OpenCL API version" msgstr "Taleqqimt" #: core.cpp:1092 #, c-format msgid "There is no platform with OpenCL support (%s)" msgstr "" #: core.cpp:1102 #, c-format msgid "failed to get all OpenCL platforms (%s)" msgstr "" #: core.cpp:1115 #, c-format msgid "failed to get name for platform %u (%s)" msgstr "" #: core.cpp:1123 #, c-format msgid "failed to get version for platform %u (%s)" msgstr "" #: core.cpp:1131 #, c-format msgid "failed to find number of OpenCL devices for platform '%s %s' (%s)" msgstr "" #: core.cpp:1131 msgid "0 device" msgstr "" #: core.cpp:1140 #, c-format msgid "failed to get all of OpenCL devices for platform '%s %s' (%s)" msgstr "" #: core.cpp:1160 #, c-format msgid "failed to get name for device %u (%s)" msgstr "" #: core.cpp:1168 #, c-format msgid "failed to get version for device %u (%s)" msgstr "" #: core.cpp:1190 #, c-format msgid "OpenCL driver for '%s %s' does not support CL_DEVICE_TOPOLOGY_AMD (%s)" msgstr "" #: core.cpp:1201 #, c-format msgid "" "OpenCL driver for '%s %s' does not support CL_DEVICE_GFXIP_MAJOR_AMD (%s)" msgstr "" #: core.cpp:1209 core.cpp:1229 core.cpp:1262 #, c-format msgid "" "OpenCL driver for '%s %s' does not support CL_DEVICE_MAX_COMPUTE_UNITS (%s)" msgstr "" #: core.cpp:1250 #, c-format msgid "" "OpenCL driver for '%s %s' does not support CL_DEVICE_PCI_DOMAIN_ID_NV (%s), " "CL_DEVICE_PCI_BUS_ID_NV (%s) or CL_DEVICE_PCI_SLOT_ID_NV (%s)" msgstr "" #: core.cpp:1273 #, c-format msgid "OpenCL is not supported with your GPU vendor (0x%X)" msgstr "" #: core.cpp:1295 msgid "Finding devices" msgstr "" #: core.cpp:1307 #, c-format msgid "Skip devices search (wrong permissions on %s device)" msgstr "" #: core.cpp:1350 #, c-format msgid "Your GPU vendor is unknown: %s (0x%X)" msgstr "" #: core.cpp:1370 msgid "failed to find chipset vendor and model" msgstr "" #: core.cpp:1385 msgid "failed to find graphic card vendor and model" msgstr "" #: core.cpp:1487 msgid "Retrieving GPU clocks" msgstr "" #: core.cpp:1500 msgid "None" msgstr "Walu" #: core.cpp:1509 #, c-format msgid "DRM path for %s is unknown" msgstr "" #: core.cpp:1516 #, c-format msgid "Card number for %s is unknown" msgstr "" #: core.cpp:1541 #, c-format msgid "PCIe %s (current) / %s (max)" msgstr "" #: core.cpp:1650 #, c-format msgid "Driver for %s doesn't report frequencies" msgstr "" #: core.cpp:1671 #, c-format msgid "failed to retrieve all monitoring data for %s" msgstr "" #: core.cpp:1694 msgid "Identifying running system" msgstr "" #: core.cpp:1697 msgid "failed to identify running system" msgstr "" #: core.cpp:1749 core.cpp:1778 msgid "Calling libprocps" msgstr "" #: core.cpp:1752 msgid "unable to get system uptime" msgstr "" #: core.cpp:1758 msgid "unable to create meminfo structure" msgstr "" #: core.cpp:1804 msgid "Calling libstatgrab" msgstr "" #: core.cpp:1852 #, c-format msgid "%i days, %i hours, %i minutes, %i seconds" msgstr "" #: core.cpp:1915 msgid "Updating benchmark status" msgstr "" #: core.cpp:1918 msgid "Active" msgstr "" #: core.cpp:1921 #, c-format msgid "(%u hours left)" msgstr "" #: core.cpp:1923 #, c-format msgid "(%u minutes left)" msgstr "" #: core.cpp:1925 #, c-format msgid "(%u seconds left)" msgstr "" #: core.cpp:1929 core.cpp:1984 core.cpp:1985 msgid "Inactive" msgstr "" #: core.cpp:1932 #, c-format msgid "in %u hours" msgstr "g %u tsragin" #: core.cpp:1934 #, c-format msgid "in %u minutes" msgstr "" #: core.cpp:1936 #, c-format msgid "in %u seconds" msgstr "" #: core.cpp:1953 #, c-format msgid "Starting benchmark with %u threads" msgstr "" #: core.cpp:1976 msgid "an error occurred while starting benchmark" msgstr "" #: core.cpp:2002 msgid "Finding CPU package in fallback mode" msgstr "" #: core.cpp:2032 #, c-format msgid "Your CPU socket is not present in the database ==> %s, codename: %s" msgstr "" #: core.cpp:2052 msgid "Calculating CPU multipliers in fallback mode" msgstr "" #: core.cpp:2072 msgid "Retrieving motherboard information in fallback mode" msgstr "" #: core.cpp:2085 msgid "failed to retrieve motherboard information (fallback mode)" msgstr "" #: core.cpp:2127 msgid "Retrieving CPU temperature in fallback mode" msgstr "" #: core.cpp:2173 msgid "failed to retrieve CPU temperature (fallback mode)" msgstr "" #: core.cpp:2188 msgid "Retrieving CPU voltage in fallback mode" msgstr "" #: core.cpp:2200 msgid "failed to retrieve CPU voltage (fallback mode)" msgstr "" #: core.cpp:2214 msgid "Retrieving CPU frequency in fallback mode" msgstr "" #: core.cpp:2220 msgid "failed to retrieve CPU frequency (fallback mode)" msgstr "" #: daemon_client.cpp:65 msgid "Starting daemon in background…" msgstr "" #: daemon_client.cpp:172 msgid "pkexec: authorization could not be obtained (dialog dismissed)" msgstr "" #: daemon_client.cpp:175 msgid "pkexec: authorization could not be obtained (not authorized)" msgstr "" #: daemon_client.cpp:178 msgid "pkexec: command not found" msgstr "" #: daemon_client.cpp:181 msgid "pkexec: unexpected error code" msgstr "" #: daemon_client.cpp:211 msgid "Connecting to daemon…" msgstr "" #: daemon_server.cpp:261 #, c-format msgid "request_handler: case %i not handled" msgstr "" #: data.cpp:124 cpu-x-gtk-3.12.ui:1370 msgid "CPU" msgstr "CPU" #: data.cpp:187 msgid "P-core" msgstr "" #: data.cpp:188 msgid "E-core" msgstr "" #: data.cpp:189 data.cpp:192 #, fuzzy #| msgid "Core(s)" msgid "Core" msgstr "Ul(awn)" #: data.cpp:208 cpu-x-gtk-3.12.ui:746 msgid "Processor" msgstr "" #: data.cpp:240 data.cpp:329 cpu-x-gtk-3.12.ui:1968 msgid "Caches" msgstr "" #: data.cpp:247 #, fuzzy, c-format #| msgid "%d x %d %s, %d-way" msgid "%2d x %4d %s, %2d-way" msgstr "%d x %d%s, %d-aɣaras" #: data.cpp:249 #, c-format msgid "%d %s, %d-way" msgstr "%d%s, %d-aɣaras" #: data.cpp:263 msgid "Count" msgstr "" #: data.cpp:276 cpu-x-gtk-3.12.ui:968 msgid "Clocks" msgstr "" #: data.cpp:379 data.cpp:383 #, c-format msgid "L%u Cache" msgstr "" #: data.cpp:385 #, c-format msgid "%s associative, %d-%s line size" msgstr "%s amsmun, %d-%s s wadur" #: data.cpp:398 msgid "Test" msgstr "Turimt" #: data.cpp:409 data.cpp:423 cpu-x-gtk-3.12.ui:2146 cpu-x-gtk-3.12.ui:2517 msgid "Motherboard" msgstr "Taflut taymmat" #: data.cpp:437 cpu-x-gtk-3.12.ui:2367 msgid "BIOS" msgstr "ABIYUS" #: data.cpp:452 cpu-x-gtk-3.12.ui:2498 msgid "Chipset" msgstr "" #: data.cpp:467 data.cpp:569 cpu-x-gtk-3.12.ui:3156 cpu-x-gtk-3.12.ui:3761 msgid "Memory" msgstr "Tiktit" #: data.cpp:483 #, c-format msgid "Stick %u" msgstr "" #: data.cpp:487 cpu-x-gtk-3.12.ui:3134 msgid "Sticks" msgstr "" #: data.cpp:541 cpu-x-gtk-3.12.ui:3780 msgid "System" msgstr "Anegraw" #: data.cpp:554 cpu-x-gtk-3.12.ui:3380 msgid "Operating System" msgstr "" #: data.cpp:587 cpu-x-gtk-3.12.ui:4960 msgid "Graphics" msgstr "" #: data.cpp:621 #, c-format msgid "Card %u" msgstr "" #: data.cpp:625 cpu-x-gtk-3.12.ui:4938 msgid "Cards" msgstr "" #: data.cpp:672 cpu-x-gtk-3.12.ui:5300 msgid "Bench" msgstr "" #: data.cpp:685 msgid "Not started" msgstr "" #: data.cpp:688 cpu-x-gtk-3.12.ui:5070 msgid "Prime numbers (slow)" msgstr "" #: data.cpp:692 cpu-x-gtk-3.12.ui:5178 msgid "Prime numbers (fast)" msgstr "" #: data.cpp:696 cpu-x-gtk-3.12.ui:5281 msgid "Parameters" msgstr "" #: data.cpp:721 data.cpp:727 #, c-format msgid "%u mins" msgstr "%u sdin" #: data.cpp:734 cpu-x-gtk-3.12.ui:5444 cpu-x-gtk-3.12.ui:5552 msgid "About" msgstr "Γef" #: data.cpp:739 #, c-format msgid "" "%s is a Free software that gathers information\n" "on CPU, motherboard and more." msgstr "" #: data.cpp:744 #, fuzzy #| msgid "About" msgid "About CPU-X" msgstr "Γef" #: data.cpp:745 #, c-format msgid "Version %s" msgstr "Taleqqimt %s" #: data.cpp:746 #, c-format msgid "Author: %s" msgstr "" #: data.cpp:747 #, c-format msgid "Site: %s" msgstr "Asit: %s" #: data.cpp:751 cpu-x-gtk-3.12.ui:5533 msgid "License" msgstr "" #: data.cpp:753 #, c-format msgid "This software is distributed under the terms of %s" msgstr "" #: data.cpp:754 main.cpp:176 msgid "This program comes with ABSOLUTELY NO WARRANTY" msgstr "" #: gui_gtk.cpp:61 #, c-format msgid "Cannot find path for '%s' file" msgstr "" #: gui_gtk.cpp:400 msgid "Start daemon" msgstr "" #: gui_gtk.cpp:403 msgid "Connected to daemon" msgstr "" #: gui_gtk.cpp:406 msgid "No polkit authentication agent found" msgstr "" #: gui_gtk.cpp:411 msgid "Ask password to start daemon in background" msgstr "" #: gui_gtk.cpp:415 msgid "Settings" msgstr "" #: gui_gtk.cpp:634 #, fuzzy #| msgid "Family" msgid "BaseFamily" msgstr "Tawacunt" #: gui_gtk.cpp:635 msgid "CPU display (\"true\") family (computed as BaseFamily+ExtendedFamily)" msgstr "" #: gui_gtk.cpp:636 #, fuzzy #| msgid "Model" msgid "BaseModel" msgstr "Azurt" #: gui_gtk.cpp:637 msgid "CPU display (\"true\") model (computed as (ExtendedModel<<4)+BaseModel)" msgstr "" #: gui_gtk.cpp:847 msgid "" "Identify the physically-labeled socket or board position where the memory " "device is located" msgstr "" #: gui_gtk.cpp:848 msgid "Identify the physically labeled bank where the memory device is located" msgstr "" #: gui_gtk.cpp:1052 #, fuzzy #| msgid "Version" msgid "User Mode Driver Version" msgstr "Taleqqimt" #: gui_gtk.cpp:1066 msgid "Vulkan Ray Tracing" msgstr "" #: gui_gtk.cpp:1260 msgid "Starting GTK GUI…" msgstr "" #: gui_gtk.cpp:1272 msgid "failed to import UI in GtkBuilder" msgstr "" #: main.cpp:63 msgid "Start graphical user interface (GUI) (default)" msgstr "" #: main.cpp:64 msgid "Start text-based user interface (TUI)" msgstr "" #: main.cpp:65 msgid "Dump all data on standard output and exit" msgstr "" #: main.cpp:66 msgid "Run embedded command dmidecode and exit" msgstr "" #: main.cpp:67 msgid "Run embedded command bandwidth and exit" msgstr "" #: main.cpp:68 msgid "Set temperature unit (c[elsius]|f[ahrenheit]|k[elvin]|r[ankine])" msgstr "" #: main.cpp:69 msgid "Set custom time between two refreshes (in seconds)" msgstr "" #: main.cpp:70 msgid "Set default tab (integer)" msgstr "" #: main.cpp:71 msgid "Select core type to monitor (integer)" msgstr "" #: main.cpp:72 msgid "Select CPU core to monitor (integer)" msgstr "" #: main.cpp:73 msgid "Set custom bandwidth test for CPU caches speed (integer)" msgstr "" #: main.cpp:74 msgid "Select default memory stick (integer)" msgstr "" #: main.cpp:75 msgid "Select default graphic card (integer)" msgstr "" #: main.cpp:76 cpu-x-gtk-3.12.ui:5910 msgid "Start and connect to daemon" msgstr "" #: main.cpp:77 msgid "Verbose output" msgstr "" #: main.cpp:78 msgid "Print help and exit" msgstr "" #: main.cpp:79 msgid "Print version and exit" msgstr "" #: main.cpp:80 msgid "Print CPUID values in decimal (default is hexadeximal)" msgstr "" #: main.cpp:81 msgid "Disable colored output" msgstr "" #: main.cpp:82 msgid "Print information for debugging" msgstr "" #: main.cpp:83 msgid "Print required information to paste in an issue" msgstr "" #: main.cpp:84 msgid "Set key mapping for NCurses mode (a[rrows]|e[macs]|i[nverted-T]|v[im])" msgstr "" #: main.cpp:95 msgid "Add default command line arguments" msgstr "" #: main.cpp:96 msgid "Enforce the bus clock" msgstr "" #: main.cpp:97 msgid "" "Ignore CPU values reported by libcpuid (comma-separated values among 'temp', " "'volt' and 'freq')" msgstr "" #: main.cpp:98 msgid "Read CPUID raw data from a given file" msgstr "" #: main.cpp:99 msgid "Only print a message if CPU is not present in the database" msgstr "" #: main.cpp:126 #, c-format msgid "Usage: %s DISPLAY [OPTIONS]\n" msgstr "" #: main.cpp:127 msgid "Available DISPLAY:" msgstr "" #: main.cpp:135 msgid "Available OPTIONS:" msgstr "" #: main.cpp:144 msgid "Influenceable environment variables:" msgstr "" #: main.cpp:175 msgid "This is free software: you are free to change and redistribute it." msgstr "" #: main.cpp:177 #, c-format msgid "See the %s license: <%s>\n" msgstr "" #: main.cpp:184 #, c-format msgid "-- %-9s version: %s" msgstr "" #: main.cpp:381 #, c-format msgid "" "\n" "Oops, something was wrong! %s has received signal %d (%s) and has crashed." msgstr "" #: main.cpp:383 #, c-format msgid "" "\n" "Oops, something was wrong! %s has received signal %d (%s) and is trying to " "recover." msgstr "" #: main.cpp:407 msgid "You can open a new issue here, by filling the template as requested:" msgstr "" #: main.cpp:449 msgid "an error occurred while setting locale" msgstr "" #: options.cpp:124 #, c-format msgid "" "Selected CPU type (%u) is not a valid number (%u is the maximum for this CPU)" msgstr "" #: options.cpp:145 #, c-format msgid "" "Selected bandwidth test (%u) is not a valid number (%u is the maximum for " "this system)" msgstr "" #: options.cpp:168 #, c-format msgid "" "Selected RAM stick (%u) is not a valid number (%u is the maximum for this " "system)" msgstr "" #: options.cpp:188 #, c-format msgid "" "Selected graphic card (%u) is not a valid number (%u is the maximum for this " "system)" msgstr "" #: options.cpp:204 #, c-format msgid "failed to change CPU affinitiy to core %u" msgstr "" #: options.cpp:210 #, c-format msgid "" "Selected CPU core (%u) is not a valid number (%u is the maximum for this " "type of core)" msgstr "" #: options.cpp:284 #, c-format msgid "Selected tab (%u) is not a valid number (%u is the maximum)" msgstr "" #: tui_ncurses.cpp:111 msgid "Window is too small!" msgstr "" #: tui_ncurses.cpp:119 msgid "Press 'h' to see help." msgstr "" #: tui_ncurses.cpp:232 #, c-format msgid "Welcome in %s NCurses help!\n" msgstr "" #: tui_ncurses.cpp:233 msgid "This help describes how to use this Text-based User Interface." msgstr "" #: tui_ncurses.cpp:235 msgid "Global keys:" msgstr "" #: tui_ncurses.cpp:236 msgid "Press 'left' key or 'tab' key to switch in left tab." msgstr "" #: tui_ncurses.cpp:237 msgid "Press 'right' key or 'shift + tab' keys to switch in right tab." msgstr "" #: tui_ncurses.cpp:238 msgid "Press 'h' key to see this help." msgstr "" #: tui_ncurses.cpp:239 msgid "Press 'q' key to exit." msgstr "" #: tui_ncurses.cpp:241 msgid "CPU tab:" msgstr "" #: tui_ncurses.cpp:242 msgid "Press 'next page' key to decrease core type number to monitor." msgstr "" #: tui_ncurses.cpp:243 msgid "Press 'previous page' key to increase core type number to monitor." msgstr "" #: tui_ncurses.cpp:244 msgid "Press 'down' key to decrease CPU core number to monitor." msgstr "" #: tui_ncurses.cpp:245 msgid "Press 'up' key to increase CPU core number to monitor." msgstr "" #: tui_ncurses.cpp:247 msgid "Caches tab:" msgstr "" #: tui_ncurses.cpp:248 msgid "Press 'down' key to switch to previous test." msgstr "" #: tui_ncurses.cpp:249 msgid "Press 'up' key to switch to next test." msgstr "" #: tui_ncurses.cpp:251 msgid "Bench tab:" msgstr "" #: tui_ncurses.cpp:252 msgid "Press 'down' key to decrement benchmark duration." msgstr "" #: tui_ncurses.cpp:253 msgid "Press 'up' key to increment benchmark duration." msgstr "" #: tui_ncurses.cpp:254 msgid "Press 'next page' key to decrement number of threads to use." msgstr "" #: tui_ncurses.cpp:255 msgid "Press 'previous page' key to increment number of threads to use." msgstr "" #: tui_ncurses.cpp:256 msgid "Press 's' key to start/stop prime numbers (slow) benchmark." msgstr "" #: tui_ncurses.cpp:257 msgid "Press 'f' key to start/stop prime numbers (fast) benchmark." msgstr "" #: tui_ncurses.cpp:259 msgid "Graphics tab:" msgstr "" #: tui_ncurses.cpp:260 msgid "Press 'down' key to switch to previous graphic card." msgstr "" #: tui_ncurses.cpp:261 msgid "Press 'up' key to switch to next graphic card." msgstr "" #: tui_ncurses.cpp:263 msgid "Press any key to exit this help." msgstr "" #: tui_ncurses.cpp:640 msgid "Starting NCurses TUI…" msgstr "" #: tui_ncurses.cpp:649 msgid "" "FATAL ERROR: terminfo database could not be found (try to set TERMINFO " "environment variable)" msgstr "" #: tui_ncurses.cpp:654 #, c-format msgid "Failed to set up %s terminal (err=%i); falling back to %s" msgstr "" #: util.cpp:189 #, c-format msgid "cannot find unit in '%s' string at position %i" msgstr "" #: util.cpp:252 #, c-format msgid "an error occurred while opening file '%s'" msgstr "" #: util.cpp:297 #, c-format msgid "an error occurred while running command '%s'" msgstr "" #: util.cpp:437 msgid "set_cpu_affinity() not supported on this operating system" msgstr "" #: data.hpp:103 data.hpp:244 data.hpp:332 msgid "Vendor" msgstr "" #: data.hpp:104 msgid "Code Name" msgstr "" #: data.hpp:105 msgid "Package" msgstr "" #: data.hpp:106 msgid "Technology" msgstr "Tatikenulujit" #: data.hpp:107 data.hpp:268 msgid "Voltage" msgstr "Asevolt" #: data.hpp:108 msgid "Specification" msgstr "" #: data.hpp:109 msgid "Family" msgstr "Tawacunt" #: data.hpp:110 #, fuzzy #| msgid "Family" msgid "Disp. Family" msgstr "Tawacunt" #: data.hpp:111 data.hpp:224 data.hpp:245 data.hpp:335 msgid "Model" msgstr "Azurt" #: data.hpp:112 #, fuzzy #| msgid "Model" msgid "Disp. Model" msgstr "Azurt" #: data.hpp:113 msgid "Temp." msgstr "" #: data.hpp:114 msgid "Stepping" msgstr "" #: data.hpp:115 msgid "Instructions" msgstr "" #: data.hpp:125 msgid "L1 Data" msgstr "" #: data.hpp:126 msgid "L1 Inst." msgstr "" #: data.hpp:127 msgid "Level 2" msgstr "" #: data.hpp:128 msgid "Level 3" msgstr "" #: data.hpp:137 cpu-x-gtk-3.12.ui:1232 #, fuzzy #| msgid "Core(s)" msgid "Cores" msgstr "Ul(awn)" #: data.hpp:138 data.hpp:408 cpu-x-gtk-3.12.ui:1252 msgid "Threads" msgstr "" #: data.hpp:155 msgid "Core Speed" msgstr "" #: data.hpp:156 msgid "Multiplier" msgstr "" #: data.hpp:157 msgid "Bus Speed" msgstr "" #: data.hpp:158 data.hpp:341 msgid "Usage" msgstr "Asemres" #: data.hpp:188 data.hpp:265 msgid "Size" msgstr "Tiɣzi" #: data.hpp:189 data.hpp:267 msgid "Speed" msgstr "Tazzla" #: data.hpp:223 data.hpp:259 msgid "Manufacturer" msgstr "" #: data.hpp:225 msgid "Revision" msgstr "Azzeray" #: data.hpp:233 msgid "Brand" msgstr "Tamatart" #: data.hpp:234 msgid "Version" msgstr "Taleqqimt" #: data.hpp:235 msgid "Date" msgstr "Asakud" #: data.hpp:236 msgid "ROM Size" msgstr "" #: data.hpp:260 msgid "Part Number" msgstr "" #: data.hpp:261 #, fuzzy #| msgid "Core #%i" msgid "Type" msgstr "Ul #%i" #: data.hpp:262 #, fuzzy #| msgid "Core #%i" msgid "Type Detail" msgstr "Ul #%i" #: data.hpp:263 msgid "Device Locator" msgstr "" #: data.hpp:264 msgid "Bank Locator" msgstr "" #: data.hpp:266 msgid "Rank" msgstr "" #: data.hpp:292 msgid "Name" msgstr "" #: data.hpp:293 msgid "Kernel" msgstr "Tuẓemt" #: data.hpp:294 msgid "Hostname" msgstr "" #: data.hpp:295 msgid "Uptime" msgstr "" #: data.hpp:303 msgid "Used" msgstr "" #: data.hpp:304 msgid "Buffers" msgstr "" #: data.hpp:305 msgid "Cached" msgstr "" #: data.hpp:306 msgid "Free" msgstr "Baṭel" #: data.hpp:307 msgid "Swap" msgstr "" #: data.hpp:333 msgid "Driver" msgstr "" #: data.hpp:334 #, fuzzy #| msgid "Version" msgid "UMD Version" msgstr "Taleqqimt" #: data.hpp:336 msgid "Compute Unit" msgstr "" #: data.hpp:337 msgid "Device ID" msgstr "" #: data.hpp:338 #, fuzzy #| msgid "Version" msgid "VBIOS Version" msgstr "Taleqqimt" #. #-#-#-#-# source_ui.pot (cpu-x ) #-#-#-#-# #. Setting: "Interface" tab #: data.hpp:339 cpu-x-gtk-3.12.ui:5807 msgid "Interface" msgstr "" #: data.hpp:340 msgid "Temperature" msgstr "" #: data.hpp:342 #, fuzzy #| msgid "Voltage" msgid "Core Voltage" msgstr "Asevolt" #: data.hpp:343 msgid "Power Avg" msgstr "" #: data.hpp:344 msgid "Core Clock" msgstr "" #: data.hpp:345 #, fuzzy #| msgid "Memory" msgid "Memory Clock" msgstr "Tiktit" #: data.hpp:346 #, fuzzy #| msgid "Memory" msgid "Memory Used" msgstr "Tiktit" #: data.hpp:347 msgid "Resizable BAR" msgstr "" #: data.hpp:348 msgid "Vulkan RT" msgstr "" #: data.hpp:349 #, fuzzy #| msgid "Version" msgid "OpenGL Version" msgstr "Taleqqimt" #: data.hpp:350 #, fuzzy #| msgid "Version" msgid "Vulkan Version" msgstr "Taleqqimt" #: data.hpp:351 #, fuzzy #| msgid "Version" msgid "OpenCL Version" msgstr "Taleqqimt" #: data.hpp:387 msgid "Score" msgstr "" #: data.hpp:388 msgid "Run" msgstr "" #: data.hpp:407 msgid "Duration" msgstr "" #: util.hpp:77 msgid "bytes" msgstr "" #. TRANSLATORS: initials for kilobyte (10³): please put initials (keep it short) #: util.hpp:80 msgid "kB" msgstr "" #. TRANSLATORS: initials for megabyte (10⁶): please put initials (keep it short) #: util.hpp:82 msgid "MB" msgstr "" #. TRANSLATORS: initials for gigabyte (10⁹): please put initials (keep it short) #: util.hpp:84 msgid "GB" msgstr "" #. TRANSLATORS: initials for terabyte (10¹²): please put initials (keep it short) #: util.hpp:86 msgid "TB" msgstr "" #. TRANSLATORS: initials for kibibyte (2¹⁰): please put initials (keep it short) #: util.hpp:89 msgid "KiB" msgstr "" #. TRANSLATORS: initials for mebibyte (2²⁰): please put initials (keep it short) #: util.hpp:91 msgid "MiB" msgstr "" #. TRANSLATORS: initials for gibibyte (2³⁰): please put initials (keep it short) #: util.hpp:93 msgid "GiB" msgstr "" #. TRANSLATORS: initials for tebibyte (2⁴⁰): please put initials (keep it short) #: util.hpp:95 msgid "TiB" msgstr "" #: cpu-x-gtk-3.12.ui:1184 msgid "Cache" msgstr "" #. Setting: refresh time for UI #: cpu-x-gtk-3.12.ui:5721 msgid "Refresh time" msgstr "" #. Setting: GUI theme #: cpu-x-gtk-3.12.ui:5745 msgid "Text theme" msgstr "" #. Setting: automatic GUI theme #: cpu-x-gtk-3.12.ui:5760 msgid "Automatic" msgstr "" #. Setting: light GUI theme #: cpu-x-gtk-3.12.ui:5761 msgid "Blue for light theme" msgstr "" #. Setting: dark GUI theme #: cpu-x-gtk-3.12.ui:5762 msgid "Yellow for dark theme" msgstr "" #. Setting: temperature unit #: cpu-x-gtk-3.12.ui:5775 msgid "Temperature unit" msgstr "" #. Setting: default tab at startup #: cpu-x-gtk-3.12.ui:5826 msgid "Default tab" msgstr "" #. Setting: default CPU core at startup #: cpu-x-gtk-3.12.ui:5839 msgid "Default CPU core" msgstr "" #. Setting: default cache test at startup #: cpu-x-gtk-3.12.ui:5852 msgid "Default cache test" msgstr "" #. Setting: print CPUID values in decimal or hexadecimal #: cpu-x-gtk-3.12.ui:5895 msgid "Print CPUID values in decimal" msgstr "" #. Setting: default graphic card at startup #: cpu-x-gtk-3.12.ui:5928 msgid "Default graphic card" msgstr "" #. Setting: default CPU core at startup #: cpu-x-gtk-3.12.ui:5952 msgid "Default core type" msgstr "" #. Setting: default graphic card at startup #: cpu-x-gtk-3.12.ui:5976 msgid "Default memory stick" msgstr "" #. Setting: "Startup" tab #: cpu-x-gtk-3.12.ui:6004 msgid "Startup" msgstr "" #, c-format #~ msgid "Core #%i" #~ msgstr "Ul #%i" #~ msgid "Reference" #~ msgstr "Tasaɣult" #, c-format #~ msgid "%s" #~ msgstr "%s" CPU-X-5.0.3/po/uk.po000066400000000000000000001372571454622605200137750ustar00rootroot00000000000000# Copyright © 2014-2024 The Tumultuous Unicorn Of Darkness # This file is distributed under the same license as the CPU-X package. # Tymofij Lytvynenko , 2019, 2020. # Oleksii Melnychenko , 2020. # Allan Nordhøy , 2020. # userko , 2021, 2022. # Vladyslav Spirin , 2022. # Artem , 2022. # Mykhailo Nikiforov , 2023. # CakesTwix , 2023. # griffi-gh , 2023. msgid "" msgstr "" "Project-Id-Version: CPU-X\n" "Report-Msgid-Bugs-To: https://github.com/TheTumultuousUnicornOfDarkness/CPU-" "X/issues\n" "POT-Creation-Date: 2023-12-09 13:09+0100\n" "PO-Revision-Date: 2023-10-17 18:16+0000\n" "Last-Translator: griffi-gh \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 5.1\n" #: core.cpp:135 msgid "Finding CPU technology" msgstr "Пошук технології процесора" #: core.cpp:161 #, c-format msgid "" "Your CPU is not present in the database ==> %s, model: %i, ext. model: %i, " "ext. family: %i" msgstr "" "Ваш процесор відсутній у базі даних ==> %s, модель: %i, загальн. модель: %i, " "загальн. сімейство: %i" #: core.cpp:189 data.cpp:150 data.cpp:342 msgid "unknown" msgstr "невідомо" #: core.cpp:230 msgid "Calling libcpuid for retrieving static data" msgstr "Виклик libcpuid для отримання статичних даних" #: core.cpp:245 #, c-format msgid "failed to call libcpuid (%s)" msgstr "не вдалося викликати libcpuid (%s)" #: core.cpp:340 msgid "Calling libcpuid for retrieving dynamic data" msgstr "Виклик libcpuid для отримання динамічних даних" #: core.cpp:353 msgid "Calling libcpuid for retrieving CPU MSR static values" msgstr "" "Виклик libcpuid для отримання статичних значень моделезалежних реєстрів " "процесора" #: core.cpp:380 msgid "Calling libcpuid for retrieving CPU MSR dynamic values" msgstr "" "Виклик libcpuid для отримання динамічних значень моделезалежних реєстрів " "процесора" #: core.cpp:412 msgid "Calling dmidecode" msgstr "Виклик dmidecode" #: core.cpp:454 core.cpp:473 #, c-format msgid "%s (configured)" msgstr "%s (налаштовано)" #: core.cpp:461 core.cpp:480 #, c-format msgid "%s (max)" msgstr "%s (макс.)" #: core.cpp:466 #, c-format msgid "%s (min)" msgstr "%s (мін.)" #: core.cpp:496 msgid "Calculating CPU usage" msgstr "Розрахунок завантаження процесора" #: core.cpp:546 msgid "Calling bandwidth" msgstr "Виклик пропускної спроможності" #: core.cpp:613 #, c-format msgid "" "pci_access is not properly initialized: it is a common issue when %s was " "built with a lower libpci version.\n" "Check that libpci %s library is present on your system. Otherwise, please " "rebuild %s." msgstr "" "pci_access не ініціалізовано належним чином: це поширена проблема, коли %s " "було зібрано з нижчою версією libpci.\n" "Перевірте наявність бібліотеки libpci %s у вашій системі. В іншому випадку, " "будь ласка, перезберіть %s." #: core.cpp:657 #, c-format msgid "No kernel driver in use for graphic card at path %s" msgstr "Немає драйвера ядра для відео карти за адресою %s" #: core.cpp:693 #, c-format msgid "Your GPU kernel driver is unknown: %s" msgstr "Невідомий драйвер ядра GPU: %s" #: core.cpp:777 #, fuzzy, c-format #| msgid "Your GPU user mode driver is unknown: %s" msgid "Your GPU user mode driver is unknown for vendor %s: %s" msgstr "Невідомий драйвер GPU: %s" #: core.cpp:781 #, c-format msgid "failed to call GLFW (%i): %s" msgstr "не вдалося викликати GLFW (%i): %s" #: core.cpp:914 msgid "Finding Vulkan API version" msgstr "Визначення версії API Vulkan" #: core.cpp:926 #, c-format msgid "failed to call vkCreateInstance (%s)" msgstr "не вдалося викликати vkCreateInstance (%s)" #: core.cpp:929 #, c-format msgid "%s is not supported" msgstr "%s не підтримується" #: core.cpp:937 #, c-format msgid "failed to call vkEnumeratePhysicalDevices (%s)" msgstr "не вдалося викликати vkEnumeratePhysicalDevices (%s)" #: core.cpp:944 msgid "No available Vulkan devices" msgstr "Немає доступних пристроїв Vulkan" #: core.cpp:952 #, c-format msgid "No available physical devices (%s)" msgstr "Немає доступних фізичних пристроїв (%s)" #: core.cpp:1015 #, c-format msgid "Failed to create Vulkan for device %u (%s)" msgstr "Не вдалося створити Vulkan для пристрою %u (%s)" #: core.cpp:1019 #, c-format msgid "%s is not supported for device %u, use only deviceID for matching" msgstr "" "%s не підтримується для пристрою %u, використовуйте для зіставлення лише " "deviceID" #: core.cpp:1051 core.cpp:1364 msgid "Enabled" msgstr "Увімкнено" #: core.cpp:1051 core.cpp:1364 msgid "Disabled" msgstr "Відключено" #: core.cpp:1088 #, fuzzy #| msgid "Finding Vulkan API version" msgid "Finding OpenCL API version" msgstr "Визначення версії API Vulkan" #: core.cpp:1092 #, c-format msgid "There is no platform with OpenCL support (%s)" msgstr "Немає платформи з підтримкою OpenCL (%s)" #: core.cpp:1102 #, c-format msgid "failed to get all OpenCL platforms (%s)" msgstr "не вдалося викликати усі платформи OpenCL (%s)" #: core.cpp:1115 #, c-format msgid "failed to get name for platform %u (%s)" msgstr "не вдалося отримати для платформи %u (%s)" #: core.cpp:1123 #, c-format msgid "failed to get version for platform %u (%s)" msgstr "не вдалося отримати версію для платформи %u (%s)" #: core.cpp:1131 #, c-format msgid "failed to find number of OpenCL devices for platform '%s %s' (%s)" msgstr "" "не вдалося визначити кількість пристроїв OpenCL для платформи '%s %s' (%s)" #: core.cpp:1131 msgid "0 device" msgstr "0 пристрій" #: core.cpp:1140 #, c-format msgid "failed to get all of OpenCL devices for platform '%s %s' (%s)" msgstr "не вдалось отримати всі пристрої OpenCL для платформи '%s %s' (%s)" #: core.cpp:1160 #, c-format msgid "failed to get name for device %u (%s)" msgstr "не вдалося отримати назву для пристрою %u (%s)" #: core.cpp:1168 #, c-format msgid "failed to get version for device %u (%s)" msgstr "не вдалося отримати версію для пристрою %u (%s)" #: core.cpp:1190 #, c-format msgid "OpenCL driver for '%s %s' does not support CL_DEVICE_TOPOLOGY_AMD (%s)" msgstr "Драйвер OpenCL для '%s %s' не підтримує CL_DEVICE_TOPOLOGY_AMD (%s)" #: core.cpp:1201 #, c-format msgid "" "OpenCL driver for '%s %s' does not support CL_DEVICE_GFXIP_MAJOR_AMD (%s)" msgstr "Драйвер OpenCL для '%s %s' не підтримує CL_DEVICE_GFXIP_MAJOR_AMD (%s)" #: core.cpp:1209 core.cpp:1229 core.cpp:1262 #, c-format msgid "" "OpenCL driver for '%s %s' does not support CL_DEVICE_MAX_COMPUTE_UNITS (%s)" msgstr "" "Драйвер OpenCL для '%s %s' не підтримує CL_DEVICE_MAX_COMPUTE_UNITS (%s)" #: core.cpp:1250 #, c-format msgid "" "OpenCL driver for '%s %s' does not support CL_DEVICE_PCI_DOMAIN_ID_NV (%s), " "CL_DEVICE_PCI_BUS_ID_NV (%s) or CL_DEVICE_PCI_SLOT_ID_NV (%s)" msgstr "" "Драйвер OpenCL для '%s %s' не підтримує CL_DEVICE_PCI_DOMAIN_ID_NV (%s), " "CL_DEVICE_PCI_BUS_ID_NV (%s) чи CL_DEVICE_PCI_SLOT_ID_NV (%s)" #: core.cpp:1273 #, c-format msgid "OpenCL is not supported with your GPU vendor (0x%X)" msgstr "OpenCL не підтримується вашим виробником (0x%X)" #: core.cpp:1295 msgid "Finding devices" msgstr "Пошук пристроїв" #: core.cpp:1307 #, c-format msgid "Skip devices search (wrong permissions on %s device)" msgstr "Пропустити пошук пристроїв (невірні права на пристрої %s)" #: core.cpp:1350 #, c-format msgid "Your GPU vendor is unknown: %s (0x%X)" msgstr "Постачальник графічного процесора невідомий: %s (0x%X)" #: core.cpp:1370 msgid "failed to find chipset vendor and model" msgstr "не вдалося знайти постачальника чи модель чіпсету" #: core.cpp:1385 msgid "failed to find graphic card vendor and model" msgstr "не вдалося знайти постачальника та модель графічної карти" #: core.cpp:1487 msgid "Retrieving GPU clocks" msgstr "Отримання частоти GPU" #: core.cpp:1500 msgid "None" msgstr "Немає" #: core.cpp:1509 #, fuzzy, c-format #| msgid "DRM path for GPU %u is unknown" msgid "DRM path for %s is unknown" msgstr "Шлях DRM для GPU %u невідомий" #: core.cpp:1516 #, fuzzy, c-format #| msgid "Card number for GPU %u is unknown" msgid "Card number for %s is unknown" msgstr "Номер карти для GPU %u невідомий" #: core.cpp:1541 #, c-format msgid "PCIe %s (current) / %s (max)" msgstr "PCIe %s (поточн.) / %s (макс.)" #: core.cpp:1650 #, fuzzy, c-format #| msgid "Driver for GPU %u doesn't report frequencies" msgid "Driver for %s doesn't report frequencies" msgstr "Драйвер для GPU %u не звітує частоти" #: core.cpp:1671 #, fuzzy, c-format #| msgid "failed to get all OpenCL platforms (%s)" msgid "failed to retrieve all monitoring data for %s" msgstr "не вдалося викликати усі платформи OpenCL (%s)" #: core.cpp:1694 msgid "Identifying running system" msgstr "Виявлення запущеної системи" #: core.cpp:1697 msgid "failed to identify running system" msgstr "не вдалося визначити запущену систему" #: core.cpp:1749 core.cpp:1778 msgid "Calling libprocps" msgstr "Виклик libprocps" #: core.cpp:1752 msgid "unable to get system uptime" msgstr "не вдається отримати час безвідмовної роботи системи" #: core.cpp:1758 msgid "unable to create meminfo structure" msgstr "не вдалося створити структуру meminfo" #: core.cpp:1804 msgid "Calling libstatgrab" msgstr "Виклик libstatgrab" #: core.cpp:1852 #, c-format msgid "%i days, %i hours, %i minutes, %i seconds" msgstr "%i днів, %i годин, %i хвилин, %i секунд" #: core.cpp:1915 msgid "Updating benchmark status" msgstr "Оновлення стану тестів" #: core.cpp:1918 msgid "Active" msgstr "Активний" #: core.cpp:1921 #, c-format msgid "(%u hours left)" msgstr "(%u годин лишилось)" #: core.cpp:1923 #, c-format msgid "(%u minutes left)" msgstr "(%u хвилин лишилось)" #: core.cpp:1925 #, c-format msgid "(%u seconds left)" msgstr "(%u секунд лишилося)" #: core.cpp:1929 core.cpp:1984 core.cpp:1985 msgid "Inactive" msgstr "Неактивний" #: core.cpp:1932 #, c-format msgid "in %u hours" msgstr "за %u годин" #: core.cpp:1934 #, c-format msgid "in %u minutes" msgstr "за %u хвилин" #: core.cpp:1936 #, c-format msgid "in %u seconds" msgstr "за %u секунд" #: core.cpp:1953 #, fuzzy, c-format #| msgid "Starting benchmark" msgid "Starting benchmark with %u threads" msgstr "Запустити тестування" #: core.cpp:1976 msgid "an error occurred while starting benchmark" msgstr "помилка при запуску бенчмарку" #: core.cpp:2002 msgid "Finding CPU package in fallback mode" msgstr "Пошук моделі маркування ЦП у аварійному режимі" #: core.cpp:2032 #, c-format msgid "Your CPU socket is not present in the database ==> %s, codename: %s" msgstr "Ваш сокет процесора відсутній у базі даних ==> %s, кодове ім'я: %s" #: core.cpp:2052 msgid "Calculating CPU multipliers in fallback mode" msgstr "Підрахунок помножувачів процесора у аварійному режимі" #: core.cpp:2072 msgid "Retrieving motherboard information in fallback mode" msgstr "Отримання інформації про материнську плату в аварійному режимі" #: core.cpp:2085 msgid "failed to retrieve motherboard information (fallback mode)" msgstr "не вдалося отримати інформацію про материнську плату (аварійний режим)" #: core.cpp:2127 msgid "Retrieving CPU temperature in fallback mode" msgstr "Отримання температури процесора в аварійному режимі" #: core.cpp:2173 msgid "failed to retrieve CPU temperature (fallback mode)" msgstr "не вдалося отримати температуру процесора (аварійний режим)" #: core.cpp:2188 msgid "Retrieving CPU voltage in fallback mode" msgstr "Отримання робочої напруги процесора в аварійному режимі" #: core.cpp:2200 msgid "failed to retrieve CPU voltage (fallback mode)" msgstr "не вдалося отримати робочу напругу процесора (аварійний режим)" #: core.cpp:2214 msgid "Retrieving CPU frequency in fallback mode" msgstr "Отримання частоти процесора в аварійному режимі" #: core.cpp:2220 msgid "failed to retrieve CPU frequency (fallback mode)" msgstr "не вдалося отримати частоту процесора (аварійний режим)" #: daemon_client.cpp:65 #, fuzzy #| msgid "Ask password to start daemon in background" msgid "Starting daemon in background…" msgstr "Потрібний пароль для запуску демона в фоновому режимі" #: daemon_client.cpp:172 msgid "pkexec: authorization could not be obtained (dialog dismissed)" msgstr "pkexec: не вдається отримати авторизацію (вимкнутий діалог)" #: daemon_client.cpp:175 msgid "pkexec: authorization could not be obtained (not authorized)" msgstr "pkexec: не вдається отримати авторизацію (немає авторизації)" #: daemon_client.cpp:178 msgid "pkexec: command not found" msgstr "pkexec: команду не знайдено" #: daemon_client.cpp:181 msgid "pkexec: unexpected error code" msgstr "pkexec: неочікуваний код помилки" #: daemon_client.cpp:211 #, fuzzy #| msgid "Connected to daemon" msgid "Connecting to daemon…" msgstr "Підключення до демона" #: daemon_server.cpp:261 #, c-format msgid "request_handler: case %i not handled" msgstr "request_handler: випадок %i не опрацьовується" #: data.cpp:124 cpu-x-gtk-3.12.ui:1370 msgid "CPU" msgstr "ЦП" #: data.cpp:187 msgid "P-core" msgstr "П-core" #: data.cpp:188 msgid "E-core" msgstr "Е-core" #: data.cpp:189 data.cpp:192 msgid "Core" msgstr "Ядро" #: data.cpp:208 cpu-x-gtk-3.12.ui:746 msgid "Processor" msgstr "Процесор" #: data.cpp:240 data.cpp:329 cpu-x-gtk-3.12.ui:1968 msgid "Caches" msgstr "Кеші" #: data.cpp:247 #, fuzzy, c-format #| msgid "%d x %d %s, %d-way" msgid "%2d x %4d %s, %2d-way" msgstr "%d x %d %s, %d-канальний" #: data.cpp:249 #, c-format msgid "%d %s, %d-way" msgstr "%d %s, %d-канальний" #: data.cpp:263 msgid "Count" msgstr "Кількість" #: data.cpp:276 cpu-x-gtk-3.12.ui:968 msgid "Clocks" msgstr "Такти" #: data.cpp:379 data.cpp:383 #, fuzzy, c-format #| msgid "L%i Cache" msgid "L%u Cache" msgstr "Кеш L%i" #: data.cpp:385 #, c-format msgid "%s associative, %d-%s line size" msgstr "%s асоціативний, %d-%s розмір кеш-смуги" #: data.cpp:398 msgid "Test" msgstr "Тест" #: data.cpp:409 data.cpp:423 cpu-x-gtk-3.12.ui:2146 cpu-x-gtk-3.12.ui:2517 msgid "Motherboard" msgstr "Материнка" #: data.cpp:437 cpu-x-gtk-3.12.ui:2367 msgid "BIOS" msgstr "BIOS" #: data.cpp:452 cpu-x-gtk-3.12.ui:2498 msgid "Chipset" msgstr "Чіпсет" #: data.cpp:467 data.cpp:569 cpu-x-gtk-3.12.ui:3156 cpu-x-gtk-3.12.ui:3761 msgid "Memory" msgstr "Пам'ять" #: data.cpp:483 #, c-format msgid "Stick %u" msgstr "" #: data.cpp:487 cpu-x-gtk-3.12.ui:3134 msgid "Sticks" msgstr "" #: data.cpp:541 cpu-x-gtk-3.12.ui:3780 msgid "System" msgstr "Система" #: data.cpp:554 cpu-x-gtk-3.12.ui:3380 msgid "Operating System" msgstr "Операційна система" #: data.cpp:587 cpu-x-gtk-3.12.ui:4960 msgid "Graphics" msgstr "Графіка" #: data.cpp:621 #, fuzzy, c-format #| msgid "Card %i" msgid "Card %u" msgstr "Карта %i" #: data.cpp:625 cpu-x-gtk-3.12.ui:4938 msgid "Cards" msgstr "Карти" #: data.cpp:672 cpu-x-gtk-3.12.ui:5300 msgid "Bench" msgstr "Тест" #: data.cpp:685 msgid "Not started" msgstr "Не запущено" #: data.cpp:688 cpu-x-gtk-3.12.ui:5070 msgid "Prime numbers (slow)" msgstr "Прості числа (повільно)" #: data.cpp:692 cpu-x-gtk-3.12.ui:5178 msgid "Prime numbers (fast)" msgstr "Прості числа (швидко)" #: data.cpp:696 cpu-x-gtk-3.12.ui:5281 msgid "Parameters" msgstr "Параметри" #: data.cpp:721 data.cpp:727 #, c-format msgid "%u mins" msgstr "%u хв." #: data.cpp:734 cpu-x-gtk-3.12.ui:5444 cpu-x-gtk-3.12.ui:5552 msgid "About" msgstr "Про програму" #: data.cpp:739 #, c-format msgid "" "%s is a Free software that gathers information\n" "on CPU, motherboard and more." msgstr "" "%s — вільне програмне забезпечення, яке збирає інформацію\n" "про процесор, материнську плату, та ін." #: data.cpp:744 #, fuzzy #| msgid "About" msgid "About CPU-X" msgstr "Про програму" #: data.cpp:745 #, c-format msgid "Version %s" msgstr "Версія %s" #: data.cpp:746 #, c-format msgid "Author: %s" msgstr "Автор: %s" #: data.cpp:747 #, c-format msgid "Site: %s" msgstr "Сайт: %s" #: data.cpp:751 cpu-x-gtk-3.12.ui:5533 msgid "License" msgstr "Ліцензія" #: data.cpp:753 #, c-format msgid "This software is distributed under the terms of %s" msgstr "Дане програмне забезпечення поширюється на умовах %s" #: data.cpp:754 main.cpp:176 msgid "This program comes with ABSOLUTELY NO WARRANTY" msgstr "Дане программне забезпечення надається БЕЗ БУДЬ-ЯКИХ ГАРАНТІЙ" #: gui_gtk.cpp:61 #, c-format msgid "Cannot find path for '%s' file" msgstr "" #: gui_gtk.cpp:400 msgid "Start daemon" msgstr "Активація демона" #: gui_gtk.cpp:403 msgid "Connected to daemon" msgstr "Підключення до демона" #: gui_gtk.cpp:406 msgid "No polkit authentication agent found" msgstr "Не знайдена аутентифікація агента polkit" #: gui_gtk.cpp:411 msgid "Ask password to start daemon in background" msgstr "Потрібний пароль для запуску демона в фоновому режимі" #: gui_gtk.cpp:415 msgid "Settings" msgstr "" #: gui_gtk.cpp:634 msgid "BaseFamily" msgstr "Базова Родина" #: gui_gtk.cpp:635 msgid "CPU display (\"true\") family (computed as BaseFamily+ExtendedFamily)" msgstr "" "Сімейство процесорів (\"правда\") (вираховується як розширена родина + " "базова родина)" #: gui_gtk.cpp:636 msgid "BaseModel" msgstr "Базова Модель" #: gui_gtk.cpp:637 msgid "CPU display (\"true\") model (computed as (ExtendedModel<<4)+BaseModel)" msgstr "" "Відображена (\"дійсна\") модель процесора (вираховується як " "(РозширенаМодель<<4)+БазоваМодель)" #: gui_gtk.cpp:847 msgid "" "Identify the physically-labeled socket or board position where the memory " "device is located" msgstr "" #: gui_gtk.cpp:848 msgid "Identify the physically labeled bank where the memory device is located" msgstr "" #: gui_gtk.cpp:1052 msgid "User Mode Driver Version" msgstr "Версія драйвера користувацького режиму" #: gui_gtk.cpp:1066 msgid "Vulkan Ray Tracing" msgstr "Трасування променів Vulkan" #: gui_gtk.cpp:1260 msgid "Starting GTK GUI…" msgstr "Запуск графічного інтерфейсу GTK…" #: gui_gtk.cpp:1272 msgid "failed to import UI in GtkBuilder" msgstr "не вдалося імпортувати інтерфейс в GtkBuilder" #: main.cpp:63 msgid "Start graphical user interface (GUI) (default)" msgstr "Запустити графічний інтерфейс (GUI) (за замовчуванням)" #: main.cpp:64 msgid "Start text-based user interface (TUI)" msgstr "Запустити текстовий інтерфейс (TUI)" #: main.cpp:65 msgid "Dump all data on standard output and exit" msgstr "Скинути всі дані на стандартнe виведення (stdout) і вийти" #: main.cpp:66 msgid "Run embedded command dmidecode and exit" msgstr "Запустити вбудовану команду dmidecode і вийти" #: main.cpp:67 msgid "Run embedded command bandwidth and exit" msgstr "Запустити вбудовану команду bandwidth і вийти" #: main.cpp:68 msgid "Set temperature unit (c[elsius]|f[ahrenheit]|k[elvin]|r[ankine])" msgstr "" #: main.cpp:69 msgid "Set custom time between two refreshes (in seconds)" msgstr "Встановити час між двома оновленнями (в секундах)" #: main.cpp:70 msgid "Set default tab (integer)" msgstr "Встановити вкладку за замовчуванням (ціле число)" #: main.cpp:71 msgid "Select core type to monitor (integer)" msgstr "Обрати ядро ЦП для моніторингу (ціле число)" #: main.cpp:72 msgid "Select CPU core to monitor (integer)" msgstr "Обрати ядро ЦП для моніторингу (ціле число)" #: main.cpp:73 msgid "Set custom bandwidth test for CPU caches speed (integer)" msgstr "Встановити тест швидкості пропускної здатності кешу ЦП (ціле число)" #: main.cpp:74 #, fuzzy #| msgid "Select default graphic card (integer)" msgid "Select default memory stick (integer)" msgstr "Оберіть графічну карту за замовчуванням (ціле число)" #: main.cpp:75 msgid "Select default graphic card (integer)" msgstr "Оберіть графічну карту за замовчуванням (ціле число)" #: main.cpp:76 cpu-x-gtk-3.12.ui:5910 msgid "Start and connect to daemon" msgstr "Запуск і підключення до демону" #: main.cpp:77 msgid "Verbose output" msgstr "Розширений опис дій" #: main.cpp:78 msgid "Print help and exit" msgstr "Показати допомогу і вийти" #: main.cpp:79 msgid "Print version and exit" msgstr "Показати версію і вийти" #: main.cpp:80 msgid "Print CPUID values in decimal (default is hexadeximal)" msgstr "" "Показувати значення CPUID в десятковій системі (за замовчуванням - " "шістнадцяткова)" #: main.cpp:81 msgid "Disable colored output" msgstr "Вимкнути колірний вивід" #: main.cpp:82 msgid "Print information for debugging" msgstr "Показати інформацію для налагодження" #: main.cpp:83 msgid "Print required information to paste in an issue" msgstr "Показати інформацію, необхідну для вставки у звіт про прмилку" #: main.cpp:84 msgid "Set key mapping for NCurses mode (a[rrows]|e[macs]|i[nverted-T]|v[im])" msgstr "" "Встановити комбінації клавіш для режиму NCurses (a [rrows] | e [macs] | i " "[nverted-T] | v [im])" #: main.cpp:95 msgid "Add default command line arguments" msgstr "Додати аргументи командного рядка за замовчуванням" #: main.cpp:96 msgid "Enforce the bus clock" msgstr "Задати тактову частоту шини" #: main.cpp:97 msgid "" "Ignore CPU values reported by libcpuid (comma-separated values among 'temp', " "'volt' and 'freq')" msgstr "" #: main.cpp:98 msgid "Read CPUID raw data from a given file" msgstr "Зчитати неопрацьовані дані CPUID з файлу" #: main.cpp:99 msgid "Only print a message if CPU is not present in the database" msgstr "Вивести повідомлення, лише у випадку відсутності ЦП у базі даних" #: main.cpp:126 #, c-format msgid "Usage: %s DISPLAY [OPTIONS]\n" msgstr "Використання: %s ПОКАЗАТИ [ОПЦІЇ]\n" #: main.cpp:127 msgid "Available DISPLAY:" msgstr "Доступний ДИСПЛЕЙ:" #: main.cpp:135 msgid "Available OPTIONS:" msgstr "Доступні ОПЦІЇ:" #: main.cpp:144 msgid "Influenceable environment variables:" msgstr "Змінні середовища, які можна корегувати:" #: main.cpp:175 msgid "This is free software: you are free to change and redistribute it." msgstr "" "Це вільне програмне забезпечення: Ви можете його змінювати і поширювати." #: main.cpp:177 #, c-format msgid "See the %s license: <%s>\n" msgstr "Переглянути ліцензію %s: <%s>\n" #: main.cpp:184 #, c-format msgid "-- %-9s version: %s" msgstr "-- %-9s версія: %s" #: main.cpp:381 #, c-format msgid "" "\n" "Oops, something was wrong! %s has received signal %d (%s) and has crashed." msgstr "" "\n" "Йой, щось пішло не так! %s отримав сигнал %d (%s) і припинив роботу." #: main.cpp:383 #, c-format msgid "" "\n" "Oops, something was wrong! %s has received signal %d (%s) and is trying to " "recover." msgstr "" "\n" "Йой, щось пішло не так! %s отримав сигнал %d (%s) і намагається відновитися." #: main.cpp:407 msgid "You can open a new issue here, by filling the template as requested:" msgstr "" "Ви можете відкрити новий issue тут, заповнивши шаблон відповідно до запиту:" #: main.cpp:449 msgid "an error occurred while setting locale" msgstr "помилка при встановленні локалізації" #: options.cpp:124 #, c-format msgid "" "Selected CPU type (%u) is not a valid number (%u is the maximum for this CPU)" msgstr "" "Обраний тип процесора (%u) не є допустимим (%u є максимальним для цього " "процесора)" #: options.cpp:145 #, fuzzy, c-format #| msgid "" #| "Selected CPU type (%u) is not a valid number (%u is the maximum for this " #| "CPU)" msgid "" "Selected bandwidth test (%u) is not a valid number (%u is the maximum for " "this system)" msgstr "" "Обраний тип процесора (%u) не є допустимим (%u є максимальним для цього " "процесора)" #: options.cpp:168 #, fuzzy, c-format #| msgid "" #| "Selected CPU type (%u) is not a valid number (%u is the maximum for this " #| "CPU)" msgid "" "Selected RAM stick (%u) is not a valid number (%u is the maximum for this " "system)" msgstr "" "Обраний тип процесора (%u) не є допустимим (%u є максимальним для цього " "процесора)" #: options.cpp:188 #, fuzzy, c-format #| msgid "" #| "Selected CPU core (%u) is not a valid number (%u is the maximum for this " #| "type of core)" msgid "" "Selected graphic card (%u) is not a valid number (%u is the maximum for this " "system)" msgstr "" "Вибране ядро процесора (%u) не є дійсним числом (%u є максимальним для цього " "типу ядра)" #: options.cpp:204 #, c-format msgid "failed to change CPU affinitiy to core %u" msgstr "не вдалося змінити приналежність процесора до ядра %u" #: options.cpp:210 #, c-format msgid "" "Selected CPU core (%u) is not a valid number (%u is the maximum for this " "type of core)" msgstr "" "Вибране ядро процесора (%u) не є дійсним числом (%u є максимальним для цього " "типу ядра)" #: options.cpp:284 #, fuzzy, c-format #| msgid "" #| "Selected CPU type (%u) is not a valid number (%u is the maximum for this " #| "CPU)" msgid "Selected tab (%u) is not a valid number (%u is the maximum)" msgstr "" "Обраний тип процесора (%u) не є допустимим (%u є максимальним для цього " "процесора)" #: tui_ncurses.cpp:111 msgid "Window is too small!" msgstr "Вікно є надто малим!" #: tui_ncurses.cpp:119 msgid "Press 'h' to see help." msgstr "Натисніть 'h' для отримання допомоги." #: tui_ncurses.cpp:232 #, c-format msgid "Welcome in %s NCurses help!\n" msgstr "Ласкаво просимо до %s допомоги NCurses!\n" #: tui_ncurses.cpp:233 msgid "This help describes how to use this Text-based User Interface." msgstr "Ця справка описує використання текстового інтерфейсу корстувача." #: tui_ncurses.cpp:235 msgid "Global keys:" msgstr "Глобальні клавіші:" #: tui_ncurses.cpp:236 msgid "Press 'left' key or 'tab' key to switch in left tab." msgstr "" "Натисніть клавішу \"ліворуч\" або \"табуляція\", щоб переключитися на ліву " "вкладку." #: tui_ncurses.cpp:237 msgid "Press 'right' key or 'shift + tab' keys to switch in right tab." msgstr "" "Натисніть клавішу \"вправо\" або \"shift + табуляція\", щоб переключитися на " "праву вкладку." #: tui_ncurses.cpp:238 msgid "Press 'h' key to see this help." msgstr "Натисніть клавішу 'h' для виклику цієї допомоги." #: tui_ncurses.cpp:239 msgid "Press 'q' key to exit." msgstr "Натисніть клавішу 'q', щоб вийти." #: tui_ncurses.cpp:241 msgid "CPU tab:" msgstr "Вкладка \"ЦП\":" #: tui_ncurses.cpp:242 msgid "Press 'next page' key to decrease core type number to monitor." msgstr "" "Натисніть клавішу \"next page\", щоб зменшити номер типу ядра для " "моніторингу." #: tui_ncurses.cpp:243 msgid "Press 'previous page' key to increase core type number to monitor." msgstr "" "Натисніть клавішу \"попередня сторінка\", щоб збільшити номер типу ядра для " "моніторингу." #: tui_ncurses.cpp:244 msgid "Press 'down' key to decrease CPU core number to monitor." msgstr "" "Натисніть клавішу \"вниз\", щоб зменшити кількості ядер для моніторингу." #: tui_ncurses.cpp:245 msgid "Press 'up' key to increase CPU core number to monitor." msgstr "" "Натисніть клавішу \"вгору\", щоб збільшити кількість ядер для моніторингу." #: tui_ncurses.cpp:247 msgid "Caches tab:" msgstr "Вкладка \"Кеші\":" #: tui_ncurses.cpp:248 msgid "Press 'down' key to switch to previous test." msgstr "Натисніть клавішу \"вниз\", щоб перейти до попереднього тесту." #: tui_ncurses.cpp:249 msgid "Press 'up' key to switch to next test." msgstr "Натисніть клавішу \"вгору\", щоб перейти до наступного тесту." #: tui_ncurses.cpp:251 msgid "Bench tab:" msgstr "Вкладка \"Тест\":" #: tui_ncurses.cpp:252 msgid "Press 'down' key to decrement benchmark duration." msgstr "Натисніть клавішу \"вниз\" для змешення тривалості тесту." #: tui_ncurses.cpp:253 msgid "Press 'up' key to increment benchmark duration." msgstr "Натисніть клавішу \"вгору\" для збільшення тривалості тесту." #: tui_ncurses.cpp:254 msgid "Press 'next page' key to decrement number of threads to use." msgstr "" "Натисніть клавішу 'наступна сторінка' для зменшення кількості пов'язаних " "сторінок." #: tui_ncurses.cpp:255 msgid "Press 'previous page' key to increment number of threads to use." msgstr "" "Натисніть клавішу 'попередня сторінка' для збільшення кількості пов'язаних " "сторінок." #: tui_ncurses.cpp:256 msgid "Press 's' key to start/stop prime numbers (slow) benchmark." msgstr "" "Натисніть клавішу \"s\" щоб запустити/зупинити тест продуктивності \"прості " "числа (повільно)\"." #: tui_ncurses.cpp:257 msgid "Press 'f' key to start/stop prime numbers (fast) benchmark." msgstr "" "Натисніть клавішу \"f\" щоб запустити/зупинити тест продуктивності \"прості " "числа (швидко)\"." #: tui_ncurses.cpp:259 msgid "Graphics tab:" msgstr "Графіки:" #: tui_ncurses.cpp:260 msgid "Press 'down' key to switch to previous graphic card." msgstr "Натисніть клавішу \"вниз\", щоб перейти до попередньої відеокарти." #: tui_ncurses.cpp:261 msgid "Press 'up' key to switch to next graphic card." msgstr "Натисніть клавішу \"вгору\", щоб перейти до наступної відеокарти." #: tui_ncurses.cpp:263 msgid "Press any key to exit this help." msgstr "Натисніть будь-яку клавішу, щоб вийти з вікна допомоги." #: tui_ncurses.cpp:640 msgid "Starting NCurses TUI…" msgstr "Запуск текстового інтерфейсу NCurses…" #: tui_ncurses.cpp:649 msgid "" "FATAL ERROR: terminfo database could not be found (try to set TERMINFO " "environment variable)" msgstr "" "КРИТИЧНА ПОМИЛКА: неможливо знайти базу даних terminfo (спробуй встановити " "змінну середовища TERMINFO)" #: tui_ncurses.cpp:654 #, c-format msgid "Failed to set up %s terminal (err=%i); falling back to %s" msgstr "Неможливо встановити %s термінал (err=%i); поворот до %s" #: util.cpp:189 #, c-format msgid "cannot find unit in '%s' string at position %i" msgstr "не вдається знайти елемент в рядку '%s' на позиції %i" #: util.cpp:252 #, fuzzy, c-format #| msgid "an error occurred while opening file '%s' (%s)" msgid "an error occurred while opening file '%s'" msgstr "Помилка при відкритті файлу '%s' (%s)" #: util.cpp:297 #, fuzzy, c-format #| msgid "an error occurred while running command '%s' (%s)" msgid "an error occurred while running command '%s'" msgstr "помилка при виконанні команди '%s' (%s)" #: util.cpp:437 msgid "set_cpu_affinity() not supported on this operating system" msgstr "set_cpu_affinity() не підтримується у цій операційній системі" #: data.hpp:103 data.hpp:244 data.hpp:332 msgid "Vendor" msgstr "Виробник" #: data.hpp:104 msgid "Code Name" msgstr "Кодова назва" #: data.hpp:105 msgid "Package" msgstr "Тип корпусу" #: data.hpp:106 msgid "Technology" msgstr "Технологія" #: data.hpp:107 data.hpp:268 msgid "Voltage" msgstr "Напруга" #: data.hpp:108 msgid "Specification" msgstr "Специфікація" #: data.hpp:109 msgid "Family" msgstr "Родина" #: data.hpp:110 msgid "Disp. Family" msgstr "Відобр. родина" #: data.hpp:111 data.hpp:224 data.hpp:245 data.hpp:335 msgid "Model" msgstr "Модель" #: data.hpp:112 msgid "Disp. Model" msgstr "Відобр. модель" #: data.hpp:113 msgid "Temp." msgstr "Темп." #: data.hpp:114 msgid "Stepping" msgstr "Крок" #: data.hpp:115 msgid "Instructions" msgstr "Інструкції" #: data.hpp:125 msgid "L1 Data" msgstr "Дані рівня L1" #: data.hpp:126 msgid "L1 Inst." msgstr "L1 Інст." #: data.hpp:127 msgid "Level 2" msgstr "Рівень 2" #: data.hpp:128 msgid "Level 3" msgstr "Рівень 3" #: data.hpp:137 cpu-x-gtk-3.12.ui:1232 msgid "Cores" msgstr "Ядра" #: data.hpp:138 data.hpp:408 cpu-x-gtk-3.12.ui:1252 msgid "Threads" msgstr "Потоки" #: data.hpp:155 msgid "Core Speed" msgstr "Тактова частота ядра" #: data.hpp:156 msgid "Multiplier" msgstr "Множник" #: data.hpp:157 msgid "Bus Speed" msgstr "Швидкість шини" #: data.hpp:158 data.hpp:341 msgid "Usage" msgstr "Використання" #: data.hpp:188 data.hpp:265 msgid "Size" msgstr "Розмір" #: data.hpp:189 data.hpp:267 msgid "Speed" msgstr "Швидкість" #: data.hpp:223 data.hpp:259 msgid "Manufacturer" msgstr "Виробник" #: data.hpp:225 msgid "Revision" msgstr "Ревізія" #: data.hpp:233 msgid "Brand" msgstr "Марка" #: data.hpp:234 msgid "Version" msgstr "Версія" #: data.hpp:235 msgid "Date" msgstr "Дата" #: data.hpp:236 msgid "ROM Size" msgstr "Розмір ROM" #: data.hpp:260 msgid "Part Number" msgstr "" #: data.hpp:261 #, fuzzy #| msgid "Type #%i" msgid "Type" msgstr "Тип #%i" #: data.hpp:262 #, fuzzy #| msgid "Type #%i" msgid "Type Detail" msgstr "Тип #%i" #: data.hpp:263 msgid "Device Locator" msgstr "" #: data.hpp:264 msgid "Bank Locator" msgstr "" #: data.hpp:266 msgid "Rank" msgstr "" #: data.hpp:292 #, fuzzy #| msgid "Code Name" msgid "Name" msgstr "Кодова назва" #: data.hpp:293 msgid "Kernel" msgstr "Ядро" #: data.hpp:294 msgid "Hostname" msgstr "Ім'я хоста" #: data.hpp:295 msgid "Uptime" msgstr "Час роботи" #: data.hpp:303 msgid "Used" msgstr "Використовується" #: data.hpp:304 msgid "Buffers" msgstr "Буфери" #: data.hpp:305 msgid "Cached" msgstr "Кеш" #: data.hpp:306 msgid "Free" msgstr "Вільно" #: data.hpp:307 msgid "Swap" msgstr "Підкачка (Своп)" #: data.hpp:333 msgid "Driver" msgstr "Драйвер" #: data.hpp:334 msgid "UMD Version" msgstr "Версія UMD" #: data.hpp:336 msgid "Compute Unit" msgstr "Одиниця обчислення" #: data.hpp:337 #, fuzzy #| msgid "DeviceID" msgid "Device ID" msgstr "ID пристрою" #: data.hpp:338 msgid "VBIOS Version" msgstr "Версія VBIOS" #. #-#-#-#-# source_ui.pot (cpu-x ) #-#-#-#-# #. Setting: "Interface" tab #: data.hpp:339 cpu-x-gtk-3.12.ui:5807 msgid "Interface" msgstr "Інтерфейс" #: data.hpp:340 msgid "Temperature" msgstr "Температура" #: data.hpp:342 msgid "Core Voltage" msgstr "Напруга ядра" #: data.hpp:343 msgid "Power Avg" msgstr "Средн. потужність" #: data.hpp:344 #, fuzzy #| msgid "Memory clock" msgid "Core Clock" msgstr "Частота памяті" #: data.hpp:345 #, fuzzy #| msgid "Memory clock" msgid "Memory Clock" msgstr "Частота памяті" #: data.hpp:346 msgid "Memory Used" msgstr "Вживана пам'ять" #: data.hpp:347 msgid "Resizable BAR" msgstr "Змінюваний BAR (PCIe)" #: data.hpp:348 msgid "Vulkan RT" msgstr "Vulkan RT" #: data.hpp:349 msgid "OpenGL Version" msgstr "Версія OpenGL" #: data.hpp:350 msgid "Vulkan Version" msgstr "Версія Vulkan" #: data.hpp:351 msgid "OpenCL Version" msgstr "Версія OpenCL" #: data.hpp:387 msgid "Score" msgstr "Результат" #: data.hpp:388 msgid "Run" msgstr "Запуск" #: data.hpp:407 msgid "Duration" msgstr "Тривалість" #: util.hpp:77 msgid "bytes" msgstr "байти" #. TRANSLATORS: initials for kilobyte (10³): please put initials (keep it short) #: util.hpp:80 msgid "kB" msgstr "кБ" #. TRANSLATORS: initials for megabyte (10⁶): please put initials (keep it short) #: util.hpp:82 msgid "MB" msgstr "МБ" #. TRANSLATORS: initials for gigabyte (10⁹): please put initials (keep it short) #: util.hpp:84 msgid "GB" msgstr "ГБ" #. TRANSLATORS: initials for terabyte (10¹²): please put initials (keep it short) #: util.hpp:86 msgid "TB" msgstr "ТБ" #. TRANSLATORS: initials for kibibyte (2¹⁰): please put initials (keep it short) #: util.hpp:89 msgid "KiB" msgstr "КіБ" #. TRANSLATORS: initials for mebibyte (2²⁰): please put initials (keep it short) #: util.hpp:91 msgid "MiB" msgstr "МіБ" #. TRANSLATORS: initials for gibibyte (2³⁰): please put initials (keep it short) #: util.hpp:93 msgid "GiB" msgstr "ГіБ" #. TRANSLATORS: initials for tebibyte (2⁴⁰): please put initials (keep it short) #: util.hpp:95 msgid "TiB" msgstr "ТіБ" #: cpu-x-gtk-3.12.ui:1184 msgid "Cache" msgstr "Кеш" #. Setting: refresh time for UI #: cpu-x-gtk-3.12.ui:5721 msgid "Refresh time" msgstr "Час оновлення" #. Setting: GUI theme #: cpu-x-gtk-3.12.ui:5745 #, fuzzy #| msgid "Theme" msgid "Text theme" msgstr "Тема" #. Setting: automatic GUI theme #: cpu-x-gtk-3.12.ui:5760 msgid "Automatic" msgstr "Автоматична" #. Setting: light GUI theme #: cpu-x-gtk-3.12.ui:5761 msgid "Blue for light theme" msgstr "" #. Setting: dark GUI theme #: cpu-x-gtk-3.12.ui:5762 msgid "Yellow for dark theme" msgstr "" #. Setting: temperature unit #: cpu-x-gtk-3.12.ui:5775 #, fuzzy #| msgid "Temperature" msgid "Temperature unit" msgstr "Температура" #. Setting: default tab at startup #: cpu-x-gtk-3.12.ui:5826 msgid "Default tab" msgstr "Вкладка за замовчуванням" #. Setting: default CPU core at startup #: cpu-x-gtk-3.12.ui:5839 msgid "Default CPU core" msgstr "Ядро процесора за замовчуванням" #. Setting: default cache test at startup #: cpu-x-gtk-3.12.ui:5852 msgid "Default cache test" msgstr "Тест кешу за замовчуванням" #. Setting: print CPUID values in decimal or hexadecimal #: cpu-x-gtk-3.12.ui:5895 msgid "Print CPUID values in decimal" msgstr "Вивести значення CPUID у десятковому вигляді" #. Setting: default graphic card at startup #: cpu-x-gtk-3.12.ui:5928 msgid "Default graphic card" msgstr "Графічна карта за замовчуванням" #. Setting: default CPU core at startup #: cpu-x-gtk-3.12.ui:5952 msgid "Default core type" msgstr "Тип ядра за замовчуванням" #. Setting: default graphic card at startup #: cpu-x-gtk-3.12.ui:5976 #, fuzzy #| msgid "Default core type" msgid "Default memory stick" msgstr "Тип ядра за замовчуванням" #. Setting: "Startup" tab #: cpu-x-gtk-3.12.ui:6004 msgid "Startup" msgstr "Початова" #~ msgid "Light" #~ msgstr "Світла" #~ msgid "Dark" #~ msgstr "Темна" #~ msgid "Calculating CPU multipliers" #~ msgstr "Розрахунок множників процесора" #, c-format #~ msgid "Current: PCIe Gen%1dx%d / Max: Gen%1dx%d" #~ msgstr "Поточний: PCIe Gen%1dx%d / Max: Gen%1dx%d" #~ msgid "failed to retrieve GPU clocks" #~ msgstr "не вдалося отримати частоту GPU" #, c-format #~ msgid "Core #%i" #~ msgstr "Ядро #%i" #~ msgid "Setting label names" #~ msgstr "Встановлення назв міток" #, c-format #~ msgid "Bank %i" #~ msgstr "Банк %i" #~ msgid "Reference" #~ msgstr "Відповідник" #~ msgid "Distribution" #~ msgstr "Дистрибутив" #~ msgid "Compiler" #~ msgstr "Компілятор" #~ msgid "GPU clock" #~ msgstr "Частота ГП" #~ msgid "Dumping data…" #~ msgstr "Отримання дампу даних…" #~ msgid "Freeing memory" #~ msgstr "Вивільнення пам'яті" #~ msgid "Ignore CPU frequency reported by libcpuid" #~ msgstr "Ігнорувати частоту ЦП отриману від libcpuid" #, c-format #~ msgid "failed to call wordexp (%i)" #~ msgstr "не вдалося викликати wordexp (%i)" #~ msgid "Press 'home' key to scroll up in a page." #~ msgstr "Натисніть клавішу \"home\", щоб прокрутити сторінку вгору." #~ msgid "Press 'end' key to scroll down in a page." #~ msgstr "Натисніть клавішу \"end\", щоб прокрутити сторінку вниз." #, c-format #~ msgid "String '%s' is too long, truncating…" #~ msgstr "Рядок '%s' є надто довгим, обтинається …" #, c-format #~ msgid "failed to open %s directory" #~ msgstr "не вдалося відкрити теку %s" #~ msgid "an error occurred while compiling regex" #~ msgstr "помилка при компіляції регулярних виразів (regex)" #~ msgid "FATAL ERROR: could not allocate memory" #~ msgstr "КРИТИЧНА ПОМИЛКА: Не вдалося розподілити пам'ять" #, fuzzy, c-format #~| msgid "failed to call dmidecode" #~ msgid "failed to call vkEnumerateInstanceExtensionProperties (%s)" #~ msgstr "не вдалося викликати dmidecode" #, c-format #~ msgid "%s" #~ msgstr "%s" #, fuzzy #~| msgid "There is no platform with OpenCL support (%s)" #~ msgid "There is no device with Vulkan support" #~ msgstr "Немає платформи з підтримкою OpenCL (%s)" #~ msgid "Socket(s)" #~ msgstr "Сокет(и)" #~ msgid "Thread(s)" #~ msgstr "Потік(/и)" #~ msgid "You can paste this backtrace by opening a new issue here:" #~ msgstr "Ви можете відкрити нову тему і вставити в неї вивід помилки:" #, fuzzy #~| msgid "failed to call dmidecode" #~ msgid "faild to call clGetDeviceIDs" #~ msgstr "не вдалося викликати dmidecode" #~ msgid "Exiting %s" #~ msgstr "Вихід з %s" #~ msgid "Skip CPU MSR opening (need to be root)" #~ msgstr "" #~ "Пропустити відкриття моделезалежного реєстру процесора (потрібно мати " #~ "root)" #~ msgid "failed to open CPU MSR (%s)" #~ msgstr "не вдалося відкрити моделезалежні реєстри процесора (%s)" #~ msgid "Skip call to dmidecode (need to be root)" #~ msgstr "Пропустити виклик до dmidecode (потрібно мати root)" #~ msgid "failed to allocate memory for dmidecode" #~ msgstr "не вдалося виділити пам'ять для dmidecode" #~ msgid "Finding graphic card driver" #~ msgstr "Пошук драйвера графічної карти" #~ msgid "(%s driver)" #~ msgstr "(драйвер %s)" #~ msgid "Retrieving GPU temperature" #~ msgstr "Отримання температури GPU" #~ msgid "Off" #~ msgstr "Вимк." #~ msgid "failed to retrieve GPU temperature" #~ msgstr "не вдалося отримати температуру GPU" #~ msgid "Skip some GPU values (need to be root)" #~ msgstr "Пропустіть деякі значення GPU (потрібно мати root)" #~ msgid "failed to allocate memory for benchmark" #~ msgstr "не вдалося виділити пам'ять для тестів" CPU-X-5.0.3/po/zh.po000066400000000000000000001171151454622605200137660ustar00rootroot00000000000000# Copyright © 2014-2024 The Tumultuous Unicorn Of Darkness # This file is distributed under the same license as the CPU-X package. # Translators: # 高垚鑫, 2017-2018 # Huang Zhiyi , 2019. # chakhee <931489141@qq.com>, 2019. # Azurak , 2019. # wdggg , 2020. # Forbidden <10278743+f0rb1d@users.noreply.github.com>, 2020. # Eric , 2021. # Eric , 2022. # yangyangdaji <1504305527@qq.com>, 2022, 2023, 2024. # Eric , 2022. # Hou Qiyao , 2023. # A1ive <10670106+a1ive@users.noreply.github.com>, 2023. msgid "" msgstr "" "Project-Id-Version: CPU-X\n" "Report-Msgid-Bugs-To: https://github.com/TheTumultuousUnicornOfDarkness/" "CPU-X/issues\n" "POT-Creation-Date: 2023-12-09 13:09+0100\n" "PO-Revision-Date: 2024-01-06 01:10+0000\n" "Last-Translator: yangyangdaji <1504305527@qq.com>\n" "Language-Team: Chinese (Simplified) \n" "Language: zh\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.4-dev\n" #: core.cpp:135 msgid "Finding CPU technology" msgstr "正在查找 CPU 工艺" #: core.cpp:161 #, c-format msgid "" "Your CPU is not present in the database ==> %s, model: %i, ext. model: %i, " "ext. family: %i" msgstr "数据库中没有您的 CPU ==> %s,型号: %i,扩展型号: %i,扩展系列: %i" #: core.cpp:189 data.cpp:150 data.cpp:342 msgid "unknown" msgstr "未知" #: core.cpp:230 msgid "Calling libcpuid for retrieving static data" msgstr "正在调用 libcpuid 以检索静态数据" #: core.cpp:245 #, c-format msgid "failed to call libcpuid (%s)" msgstr "无法调用 libcpuid(%s)" #: core.cpp:340 msgid "Calling libcpuid for retrieving dynamic data" msgstr "正在调用 libcpuid 以检索动态数据" #: core.cpp:353 msgid "Calling libcpuid for retrieving CPU MSR static values" msgstr "正在调用 libcpuid 以检索 CPU MSR 静态值" #: core.cpp:380 msgid "Calling libcpuid for retrieving CPU MSR dynamic values" msgstr "正在调用 libcpuid 以检索 CPU MSR 动态值" #: core.cpp:412 msgid "Calling dmidecode" msgstr "正在调用 dmidecode" #: core.cpp:454 core.cpp:473 #, c-format msgid "%s (configured)" msgstr "%s (配置)" #: core.cpp:461 core.cpp:480 #, c-format msgid "%s (max)" msgstr "%s (最大)" #: core.cpp:466 #, c-format msgid "%s (min)" msgstr "%s (最小)" #: core.cpp:496 msgid "Calculating CPU usage" msgstr "正在计算 CPU 使用率" #: core.cpp:546 msgid "Calling bandwidth" msgstr "正在调用 bandwidth" #: core.cpp:613 #, c-format msgid "" "pci_access is not properly initialized: it is a common issue when %s was " "built with a lower libpci version.\n" "Check that libpci %s library is present on your system. Otherwise, please " "rebuild %s." msgstr "" "pci_access 未正确初始化:这一问题在 %s 由较低版本的 libpci 构建时很常见。\n" "检查你的系统中存在 libpci %s 库。否则请重新构建 %s。" #: core.cpp:657 #, c-format msgid "No kernel driver in use for graphic card at path %s" msgstr "路径 %s 中没有驱动图形卡的内核驱动程序" #: core.cpp:693 #, c-format msgid "Your GPU kernel driver is unknown: %s" msgstr "你的 GPU 内核驱动未知:%s" #: core.cpp:777 #, c-format msgid "Your GPU user mode driver is unknown for vendor %s: %s" msgstr "您的 GPU 用户模式驱动程序对于供应商 %s 是未知的: %s" #: core.cpp:781 #, c-format msgid "failed to call GLFW (%i): %s" msgstr "调用 GLFW (%i) 失败:%s" #: core.cpp:914 msgid "Finding Vulkan API version" msgstr "查找 Vulkan API 版本" #: core.cpp:926 #, c-format msgid "failed to call vkCreateInstance (%s)" msgstr "调用 vkCreateInstance 失败 (%s)" #: core.cpp:929 #, c-format msgid "%s is not supported" msgstr "不支持 %s" #: core.cpp:937 #, c-format msgid "failed to call vkEnumeratePhysicalDevices (%s)" msgstr "调用 vkEnumeratePhysicalDevices 失败 (%s)" #: core.cpp:944 msgid "No available Vulkan devices" msgstr "没有可用的 Vulkan 设备" #: core.cpp:952 #, c-format msgid "No available physical devices (%s)" msgstr "没有可用的物理设备 (%s)" #: core.cpp:1015 #, c-format msgid "Failed to create Vulkan for device %u (%s)" msgstr "无法为设备 %u (%s) 创建 Vulkan" #: core.cpp:1019 #, c-format msgid "%s is not supported for device %u, use only deviceID for matching" msgstr "%s 在设备 %u 上不受支持。仅使用 deviceID 进行匹配" #: core.cpp:1051 core.cpp:1364 msgid "Enabled" msgstr "已启用" #: core.cpp:1051 core.cpp:1364 msgid "Disabled" msgstr "已禁用" #: core.cpp:1088 msgid "Finding OpenCL API version" msgstr "查找 OpenCL API 版本" #: core.cpp:1092 #, c-format msgid "There is no platform with OpenCL support (%s)" msgstr "没有支持 OpenCL 的平台(%s)" #: core.cpp:1102 #, c-format msgid "failed to get all OpenCL platforms (%s)" msgstr "未能获得所有 OpenCL 平台(%s)" #: core.cpp:1115 #, c-format msgid "failed to get name for platform %u (%s)" msgstr "未能获得平台名称 %u(%s)" #: core.cpp:1123 #, c-format msgid "failed to get version for platform %u (%s)" msgstr "未能获得平台 %u 的版本(%s)" #: core.cpp:1131 #, c-format msgid "failed to find number of OpenCL devices for platform '%s %s' (%s)" msgstr "查找平台 '%s %s'(%s) 的 OpenCL 设备数失败" #: core.cpp:1131 msgid "0 device" msgstr "0 设备" #: core.cpp:1140 #, c-format msgid "failed to get all of OpenCL devices for platform '%s %s' (%s)" msgstr "未能获得平台 '%s %s'(%s) 所有的 OpenCL 设备" #: core.cpp:1160 #, c-format msgid "failed to get name for device %u (%s)" msgstr "未能获得设备 %u 的名称(%s)" #: core.cpp:1168 #, c-format msgid "failed to get version for device %u (%s)" msgstr "未能获得设备 %u 的版本(%s)" #: core.cpp:1190 #, c-format msgid "OpenCL driver for '%s %s' does not support CL_DEVICE_TOPOLOGY_AMD (%s)" msgstr "'%s %s' 的 OpenCL 驱动不支持 CL_DEVICE_TOPOLOGY_AMD(%s)" #: core.cpp:1201 #, c-format msgid "" "OpenCL driver for '%s %s' does not support CL_DEVICE_GFXIP_MAJOR_AMD (%s)" msgstr "'%s %s' 的 OpenCL 驱动不支持CL_DEVICE_GFXIP_MAJOR_AMD(%s)" #: core.cpp:1209 core.cpp:1229 core.cpp:1262 #, c-format msgid "" "OpenCL driver for '%s %s' does not support CL_DEVICE_MAX_COMPUTE_UNITS (%s)" msgstr "'%s %s' 的 OpenCL 驱动不支持 CL_DEVICE_MAX_COMPUTE_UNITS(%s)" #: core.cpp:1250 #, c-format msgid "" "OpenCL driver for '%s %s' does not support CL_DEVICE_PCI_DOMAIN_ID_NV (%s), " "CL_DEVICE_PCI_BUS_ID_NV (%s) or CL_DEVICE_PCI_SLOT_ID_NV (%s)" msgstr "" "'%s %s' 的 OpenCL 驱动不支持CL_DEVICE_PCI_DOMAIN_ID_NV(%s)、" "CL_DEVICE_PCI_BUS_ID_NV(%s) 或CL_DEVICE_PCI_SLOT_ID_NV(%s)" #: core.cpp:1273 #, c-format msgid "OpenCL is not supported with your GPU vendor (0x%X)" msgstr "Open 不受你的 GPU 厂商 (0x%X) 的支持" #: core.cpp:1295 msgid "Finding devices" msgstr "正在搜索设备" #: core.cpp:1307 #, c-format msgid "Skip devices search (wrong permissions on %s device)" msgstr "跳过设备搜索 (%s设备上的权限错误)" #: core.cpp:1350 #, c-format msgid "Your GPU vendor is unknown: %s (0x%X)" msgstr "您的 GPU 供应商未知:%s (0x%X)" #: core.cpp:1370 msgid "failed to find chipset vendor and model" msgstr "未找到芯片组供应商和型号" #: core.cpp:1385 msgid "failed to find graphic card vendor and model" msgstr "未找到显卡供应商和型号" #: core.cpp:1487 msgid "Retrieving GPU clocks" msgstr "正在检索 GPU 时钟" #: core.cpp:1500 msgid "None" msgstr "无" #: core.cpp:1509 #, c-format msgid "DRM path for %s is unknown" msgstr "%s 的 DRM 路径未知" #: core.cpp:1516 #, c-format msgid "Card number for %s is unknown" msgstr "%s 的卡号未知" #: core.cpp:1541 #, c-format msgid "PCIe %s (current) / %s (max)" msgstr "PCIe %s(电流) / %s (最大)" #: core.cpp:1650 #, c-format msgid "Driver for %s doesn't report frequencies" msgstr "%s 无法报告频率" #: core.cpp:1671 #, c-format msgid "failed to retrieve all monitoring data for %s" msgstr "无法检索 %s 的所有监视数据" #: core.cpp:1694 msgid "Identifying running system" msgstr "正在识别本系统" #: core.cpp:1697 msgid "failed to identify running system" msgstr "未识别本系统" #: core.cpp:1749 core.cpp:1778 msgid "Calling libprocps" msgstr "正在调用 libprocps" #: core.cpp:1752 msgid "unable to get system uptime" msgstr "无法获取系统运行时间" #: core.cpp:1758 msgid "unable to create meminfo structure" msgstr "无法创建 meminfo 结构" #: core.cpp:1804 msgid "Calling libstatgrab" msgstr "正在调用 libstatgrab" #: core.cpp:1852 #, c-format msgid "%i days, %i hours, %i minutes, %i seconds" msgstr "%i 天,%i 小时,%i 分钟,%i 秒" #: core.cpp:1915 msgid "Updating benchmark status" msgstr "正在更新基准测试状态" #: core.cpp:1918 msgid "Active" msgstr "启用" #: core.cpp:1921 #, c-format msgid "(%u hours left)" msgstr "(剩余 %u 小时)" #: core.cpp:1923 #, c-format msgid "(%u minutes left)" msgstr "(剩余 %u 分钟)" #: core.cpp:1925 #, c-format msgid "(%u seconds left)" msgstr "(剩余 %u 秒)" #: core.cpp:1929 core.cpp:1984 core.cpp:1985 msgid "Inactive" msgstr "待用" #: core.cpp:1932 #, c-format msgid "in %u hours" msgstr "%u 小时后" #: core.cpp:1934 #, c-format msgid "in %u minutes" msgstr "%u 分钟后" #: core.cpp:1936 #, c-format msgid "in %u seconds" msgstr "%u 秒后" #: core.cpp:1953 #, c-format msgid "Starting benchmark with %u threads" msgstr "使用 %u 线程启动基准测试" #: core.cpp:1976 msgid "an error occurred while starting benchmark" msgstr "启动基准测试时出错" #: core.cpp:2002 msgid "Finding CPU package in fallback mode" msgstr "正在故障预置模式下查找 CPU 封装" #: core.cpp:2032 #, c-format msgid "Your CPU socket is not present in the database ==> %s, codename: %s" msgstr "数据库中没有您的 CPU 插槽 ==> %s,架构:%s" #: core.cpp:2052 msgid "Calculating CPU multipliers in fallback mode" msgstr "正在应急模式下计算 CPU 倍频" #: core.cpp:2072 msgid "Retrieving motherboard information in fallback mode" msgstr "正在应急模式下检索主板信息" #: core.cpp:2085 msgid "failed to retrieve motherboard information (fallback mode)" msgstr "无法检索主板信息 (应急模式)" #: core.cpp:2127 msgid "Retrieving CPU temperature in fallback mode" msgstr "正在应急模式下检索 CPU 温度" #: core.cpp:2173 msgid "failed to retrieve CPU temperature (fallback mode)" msgstr "未能检索 CPU 温度 (应急模式)" #: core.cpp:2188 msgid "Retrieving CPU voltage in fallback mode" msgstr "正在应急模式下检索 CPU 电压" #: core.cpp:2200 msgid "failed to retrieve CPU voltage (fallback mode)" msgstr "未能检索 CPU 电压 (应急模式)" #: core.cpp:2214 msgid "Retrieving CPU frequency in fallback mode" msgstr "正在应急模式下检索 CPU 频率" #: core.cpp:2220 msgid "failed to retrieve CPU frequency (fallback mode)" msgstr "未能检索 CPU 频率 (应急模式)" #: daemon_client.cpp:65 msgid "Starting daemon in background…" msgstr "在背景中启动守护程序…" #: daemon_client.cpp:172 msgid "pkexec: authorization could not be obtained (dialog dismissed)" msgstr "pkexec:无法获得授权(对话框被关闭)" #: daemon_client.cpp:175 msgid "pkexec: authorization could not be obtained (not authorized)" msgstr "pkexec:无法获得授权(未被授权)" #: daemon_client.cpp:178 msgid "pkexec: command not found" msgstr "pkexec:找不到命令" #: daemon_client.cpp:181 msgid "pkexec: unexpected error code" msgstr "pkexec:意外的错误代码" #: daemon_client.cpp:211 msgid "Connecting to daemon…" msgstr "连接到守护程序…" #: daemon_server.cpp:261 #, c-format msgid "request_handler: case %i not handled" msgstr "request_handler:事件 %i 未处理" #: data.cpp:124 cpu-x-gtk-3.12.ui:1370 msgid "CPU" msgstr "CPU" #: data.cpp:187 msgid "P-core" msgstr "高性能核心" #: data.cpp:188 msgid "E-core" msgstr "高能效核心" #: data.cpp:189 data.cpp:192 msgid "Core" msgstr "核心" #: data.cpp:208 cpu-x-gtk-3.12.ui:746 msgid "Processor" msgstr "处理器" #: data.cpp:240 data.cpp:329 cpu-x-gtk-3.12.ui:1968 msgid "Caches" msgstr "缓存" #: data.cpp:247 #, c-format msgid "%2d x %4d %s, %2d-way" msgstr "%2d x %4d %s, %2d-路" #: data.cpp:249 #, c-format msgid "%d %s, %d-way" msgstr "%d %s,%d-路" #: data.cpp:263 msgid "Count" msgstr "分数" #: data.cpp:276 cpu-x-gtk-3.12.ui:968 msgid "Clocks" msgstr "时钟" #: data.cpp:379 data.cpp:383 #, c-format msgid "L%u Cache" msgstr "%u 级缓存" #: data.cpp:385 #, c-format msgid "%s associative, %d-%s line size" msgstr "%s 关联,%d-%s 最小缓存单元大小" #: data.cpp:398 msgid "Test" msgstr "测试" #: data.cpp:409 data.cpp:423 cpu-x-gtk-3.12.ui:2146 cpu-x-gtk-3.12.ui:2517 msgid "Motherboard" msgstr "主板" #: data.cpp:437 cpu-x-gtk-3.12.ui:2367 msgid "BIOS" msgstr "BIOS" #: data.cpp:452 cpu-x-gtk-3.12.ui:2498 msgid "Chipset" msgstr "芯片组" #: data.cpp:467 data.cpp:569 cpu-x-gtk-3.12.ui:3156 cpu-x-gtk-3.12.ui:3761 msgid "Memory" msgstr "内存" #: data.cpp:483 #, c-format msgid "Stick %u" msgstr "条 %u" #: data.cpp:487 cpu-x-gtk-3.12.ui:3134 msgid "Sticks" msgstr "条" #: data.cpp:541 cpu-x-gtk-3.12.ui:3780 msgid "System" msgstr "系统" #: data.cpp:554 cpu-x-gtk-3.12.ui:3380 msgid "Operating System" msgstr "操作系统" #: data.cpp:587 cpu-x-gtk-3.12.ui:4960 msgid "Graphics" msgstr "显卡" #: data.cpp:621 #, c-format msgid "Card %u" msgstr "卡 %u" #: data.cpp:625 cpu-x-gtk-3.12.ui:4938 msgid "Cards" msgstr "卡" #: data.cpp:672 cpu-x-gtk-3.12.ui:5300 msgid "Bench" msgstr "基准测试" #: data.cpp:685 msgid "Not started" msgstr "未启动" #: data.cpp:688 cpu-x-gtk-3.12.ui:5070 msgid "Prime numbers (slow)" msgstr "素数 (慢速)" #: data.cpp:692 cpu-x-gtk-3.12.ui:5178 msgid "Prime numbers (fast)" msgstr "素数 (快速)" #: data.cpp:696 cpu-x-gtk-3.12.ui:5281 msgid "Parameters" msgstr "参数" #: data.cpp:721 data.cpp:727 #, c-format msgid "%u mins" msgstr "%u 分钟" #: data.cpp:734 cpu-x-gtk-3.12.ui:5444 cpu-x-gtk-3.12.ui:5552 msgid "About" msgstr "关于" #: data.cpp:739 #, c-format msgid "" "%s is a Free software that gathers information\n" "on CPU, motherboard and more." msgstr "" "%s 是一个自由软件,收集有关\n" " CPU 和主板等的信息。" #: data.cpp:744 msgid "About CPU-X" msgstr "关于 CPU-X" #: data.cpp:745 #, c-format msgid "Version %s" msgstr "%s 版" #: data.cpp:746 #, c-format msgid "Author: %s" msgstr "作者:%s" #: data.cpp:747 #, c-format msgid "Site: %s" msgstr "网站:%s" #: data.cpp:751 cpu-x-gtk-3.12.ui:5533 msgid "License" msgstr "许可证" #: data.cpp:753 #, c-format msgid "This software is distributed under the terms of %s" msgstr "本软件依照 %s 条款分发" #: data.cpp:754 main.cpp:176 msgid "This program comes with ABSOLUTELY NO WARRANTY" msgstr "本软件不作任何保修" #: gui_gtk.cpp:61 #, c-format msgid "Cannot find path for '%s' file" msgstr "找不到 '%s' 文件的路径" #: gui_gtk.cpp:400 msgid "Start daemon" msgstr "启动守护进程" #: gui_gtk.cpp:403 msgid "Connected to daemon" msgstr "连接到守护程序" #: gui_gtk.cpp:406 msgid "No polkit authentication agent found" msgstr "找不到polkit身份验证代理" #: gui_gtk.cpp:411 msgid "Ask password to start daemon in background" msgstr "询问密码以在后台启动守护进程" #: gui_gtk.cpp:415 msgid "Settings" msgstr "设置" #: gui_gtk.cpp:634 msgid "BaseFamily" msgstr "基础系列" #: gui_gtk.cpp:635 msgid "CPU display (\"true\") family (computed as BaseFamily+ExtendedFamily)" msgstr "CPU 显示 (\"true\") 系列 (计算为 BaseFamily+ExtendedFamily)" #: gui_gtk.cpp:636 msgid "BaseModel" msgstr "基型号" #: gui_gtk.cpp:637 msgid "CPU display (\"true\") model (computed as (ExtendedModel<<4)+BaseModel)" msgstr "CPU 显示 (\"true\") 型号 (计算为 (ExtendedModel<<4)+BaseModel)" #: gui_gtk.cpp:847 msgid "" "Identify the physically-labeled socket or board position where the memory " "device is located" msgstr "确定内存设备所在的物理标记的插座或板位置" #: gui_gtk.cpp:848 msgid "Identify the physically labeled bank where the memory device is located" msgstr "确定内存设备所在的物理标记的银行" #: gui_gtk.cpp:1052 msgid "User Mode Driver Version" msgstr "用户模式驱动版本" #: gui_gtk.cpp:1066 msgid "Vulkan Ray Tracing" msgstr "Vulkan 光线追踪" #: gui_gtk.cpp:1260 msgid "Starting GTK GUI…" msgstr "正在启动 GTK 图形用户界面…" #: gui_gtk.cpp:1272 msgid "failed to import UI in GtkBuilder" msgstr "无法在 GtkBuilder 中导入用户界面" #: main.cpp:63 msgid "Start graphical user interface (GUI) (default)" msgstr "启动图形用户界面 (GUI) (默认)" #: main.cpp:64 msgid "Start text-based user interface (TUI)" msgstr "启动文本用户界面 (TUI)" #: main.cpp:65 msgid "Dump all data on standard output and exit" msgstr "将所有数据转储到标准输出并退出" #: main.cpp:66 msgid "Run embedded command dmidecode and exit" msgstr "运行嵌入式命令 dmidecode 并退出" #: main.cpp:67 msgid "Run embedded command bandwidth and exit" msgstr "运行嵌入的命令 bandwidth 并退出" #: main.cpp:68 msgid "Set temperature unit (c[elsius]|f[ahrenheit]|k[elvin]|r[ankine])" msgstr "设置温度单位 (c[摄氏度]|f[华氏度]|k[开尔文]|r[兰氏度])" #: main.cpp:69 msgid "Set custom time between two refreshes (in seconds)" msgstr "设置两次刷新之间的自定义时间 (以秒为单位)" #: main.cpp:70 msgid "Set default tab (integer)" msgstr "设置默认选项卡 (整型)" #: main.cpp:71 msgid "Select core type to monitor (integer)" msgstr "选择要监控的核心类型(整数)" #: main.cpp:72 msgid "Select CPU core to monitor (integer)" msgstr "选择要监视的 CPU 核心 (整型)" #: main.cpp:73 msgid "Set custom bandwidth test for CPU caches speed (integer)" msgstr "为 CPU 缓存速度设置自定义 bandwidth 测试 (整型)" #: main.cpp:74 msgid "Select default memory stick (integer)" msgstr "选择默认内存条 (整型)" #: main.cpp:75 msgid "Select default graphic card (integer)" msgstr "选择默认显卡 (整型)" #: main.cpp:76 cpu-x-gtk-3.12.ui:5910 msgid "Start and connect to daemon" msgstr "启动并连接到守护进程" #: main.cpp:77 msgid "Verbose output" msgstr "详细输出" #: main.cpp:78 msgid "Print help and exit" msgstr "打印帮助并退出" #: main.cpp:79 msgid "Print version and exit" msgstr "打印版本并退出" #: main.cpp:80 msgid "Print CPUID values in decimal (default is hexadeximal)" msgstr "以十进制打印 CPUID 值(默认是十六进制)" #: main.cpp:81 msgid "Disable colored output" msgstr "禁用彩色输出" #: main.cpp:82 msgid "Print information for debugging" msgstr "打印信息用于调试" #: main.cpp:83 msgid "Print required information to paste in an issue" msgstr "输出粘贴在问题反馈中的所需信息" #: main.cpp:84 msgid "Set key mapping for NCurses mode (a[rrows]|e[macs]|i[nverted-T]|v[im])" msgstr "设置 NCurses 模式的键位映射 (a[rrows]|e[macs]|i[nverted-T]|v[im])" #: main.cpp:95 msgid "Add default command line arguments" msgstr "添加默认的命令行参数" #: main.cpp:96 msgid "Enforce the bus clock" msgstr "强制执行总线计时器" #: main.cpp:97 msgid "" "Ignore CPU values reported by libcpuid (comma-separated values among 'temp', " "'volt' and 'freq')" msgstr "" "忽略 libcpuid 报告的 CPU值('temp','volt' 和 'freq' 之间的逗号分隔值)" #: main.cpp:98 msgid "Read CPUID raw data from a given file" msgstr "从指定文件中读取 CPUID 源数据" #: main.cpp:99 msgid "Only print a message if CPU is not present in the database" msgstr "仅在 CPU 不存在于数据库时打印消息" #: main.cpp:126 #, c-format msgid "Usage: %s DISPLAY [OPTIONS]\n" msgstr "用法:%s 显示 [选项]\n" #: main.cpp:127 msgid "Available DISPLAY:" msgstr "可用显示:" #: main.cpp:135 msgid "Available OPTIONS:" msgstr "可用选项:" #: main.cpp:144 msgid "Influenceable environment variables:" msgstr "可影响的环境变量:" #: main.cpp:175 msgid "This is free software: you are free to change and redistribute it." msgstr "这是一个自由软件:您可以自由更改和重新分发。" #: main.cpp:177 #, c-format msgid "See the %s license: <%s>\n" msgstr "查看 %s 许可协议:<%s>\n" #: main.cpp:184 #, c-format msgid "-- %-9s version: %s" msgstr "-- %-9s 版本:%s" #: main.cpp:381 #, c-format msgid "" "\n" "Oops, something was wrong! %s has received signal %d (%s) and has crashed." msgstr "" "\n" "遇到了错误! %s 获得信号 %d(%s) 并崩溃。" #: main.cpp:383 #, c-format msgid "" "\n" "Oops, something was wrong! %s has received signal %d (%s) and is trying to " "recover." msgstr "" "\n" "哦,出错了! %s 已收到信号 %d(%s) 并在尝试恢复。" #: main.cpp:407 msgid "You can open a new issue here, by filling the template as requested:" msgstr "你可以按要求填写模板,在此新开一个 issue:" #: main.cpp:449 msgid "an error occurred while setting locale" msgstr "本地化设置时出错" #: options.cpp:124 #, c-format msgid "" "Selected CPU type (%u) is not a valid number (%u is the maximum for this CPU)" msgstr "所选 CPU 类型 (%u) 不是有效数字(%u 是此 CPU 的最大值)" #: options.cpp:145 #, c-format msgid "" "Selected bandwidth test (%u) is not a valid number (%u is the maximum for " "this system)" msgstr "所选带宽测试 (%u) 不是有效数字(%u 是此 系统的最大值)" #: options.cpp:168 #, c-format msgid "" "Selected RAM stick (%u) is not a valid number (%u is the maximum for this " "system)" msgstr "所选 RAM 内存条 (%u) 不是有效数字(%u 是此系统的最大值)" #: options.cpp:188 #, c-format msgid "" "Selected graphic card (%u) is not a valid number (%u is the maximum for this " "system)" msgstr "所选 CPU 内核 (%u) 不是有效数字(%u 是此系统的最大值)" #: options.cpp:204 #, c-format msgid "failed to change CPU affinitiy to core %u" msgstr "未能将 CPU 关联性更改为核心 %u" #: options.cpp:210 #, c-format msgid "" "Selected CPU core (%u) is not a valid number (%u is the maximum for this " "type of core)" msgstr "所选 CPU 内核 (%u) 不是有效数字(%u 是此类内核的最大值)" #: options.cpp:284 #, c-format msgid "Selected tab (%u) is not a valid number (%u is the maximum)" msgstr "所选标签页 (%u) 不是有效数字(%u 是最大值)" #: tui_ncurses.cpp:111 msgid "Window is too small!" msgstr "窗口太小了!" #: tui_ncurses.cpp:119 msgid "Press 'h' to see help." msgstr "按 'h' 键查看帮助。" #: tui_ncurses.cpp:232 #, c-format msgid "Welcome in %s NCurses help!\n" msgstr "欢迎来到 %s NCurses 帮助!\n" #: tui_ncurses.cpp:233 msgid "This help describes how to use this Text-based User Interface." msgstr "此帮助介绍如何使用该基于文本的用户界面。" #: tui_ncurses.cpp:235 msgid "Global keys:" msgstr "全局按键:" #: tui_ncurses.cpp:236 msgid "Press 'left' key or 'tab' key to switch in left tab." msgstr "按“左”键或“tab”键切换到左标签。" #: tui_ncurses.cpp:237 msgid "Press 'right' key or 'shift + tab' keys to switch in right tab." msgstr "按“右”键或“Shift + Tab”键切换到右标签。" #: tui_ncurses.cpp:238 msgid "Press 'h' key to see this help." msgstr "按 'h' 键查看此帮助。" #: tui_ncurses.cpp:239 msgid "Press 'q' key to exit." msgstr "按 'q' 键退出。" #: tui_ncurses.cpp:241 msgid "CPU tab:" msgstr "CPU 选项卡:" #: tui_ncurses.cpp:242 msgid "Press 'next page' key to decrease core type number to monitor." msgstr "按“next page”键减少要监控的核心类型编号。" #: tui_ncurses.cpp:243 msgid "Press 'previous page' key to increase core type number to monitor." msgstr "按“previous page”键增加要监控的核心类型编号。" #: tui_ncurses.cpp:244 msgid "Press 'down' key to decrease CPU core number to monitor." msgstr "按 “向下” 键减少要监控的 CPU 核心数。" #: tui_ncurses.cpp:245 msgid "Press 'up' key to increase CPU core number to monitor." msgstr "按 “向上” 键增加要监控的 CPU 核心数。" #: tui_ncurses.cpp:247 msgid "Caches tab:" msgstr "缓存选项卡:" #: tui_ncurses.cpp:248 msgid "Press 'down' key to switch to previous test." msgstr "按 'down' 键切换至上一项测试。" #: tui_ncurses.cpp:249 msgid "Press 'up' key to switch to next test." msgstr "按 “向上” 键切换到下一个测试。" #: tui_ncurses.cpp:251 msgid "Bench tab:" msgstr "基准测试选项卡:" #: tui_ncurses.cpp:252 msgid "Press 'down' key to decrement benchmark duration." msgstr "按 'down' 键减少基准测试持续时间。" #: tui_ncurses.cpp:253 msgid "Press 'up' key to increment benchmark duration." msgstr "按 'up' 键增加基准测试持续时间。" #: tui_ncurses.cpp:254 msgid "Press 'next page' key to decrement number of threads to use." msgstr "按 'next page' 键减少要使用的线程数。" #: tui_ncurses.cpp:255 msgid "Press 'previous page' key to increment number of threads to use." msgstr "按 'previous page' 键增加要使用的线程数。" #: tui_ncurses.cpp:256 msgid "Press 's' key to start/stop prime numbers (slow) benchmark." msgstr "按 's' 键开始/停止素数 (慢速) 基准测试。" #: tui_ncurses.cpp:257 msgid "Press 'f' key to start/stop prime numbers (fast) benchmark." msgstr "按 'f' 键开始/停止素数 (快速) 基准测试。" #: tui_ncurses.cpp:259 msgid "Graphics tab:" msgstr "显卡选项卡:" #: tui_ncurses.cpp:260 msgid "Press 'down' key to switch to previous graphic card." msgstr "按 'down' 键切换至上一张显卡。" #: tui_ncurses.cpp:261 msgid "Press 'up' key to switch to next graphic card." msgstr "按 'up' 键切换至下一张显卡。" #: tui_ncurses.cpp:263 msgid "Press any key to exit this help." msgstr "按任意键退出帮助。" #: tui_ncurses.cpp:640 msgid "Starting NCurses TUI…" msgstr "正在启动 NCurses TU…" #: tui_ncurses.cpp:649 msgid "" "FATAL ERROR: terminfo database could not be found (try to set TERMINFO " "environment variable)" msgstr "严重错误:找不到terminfo数据库(请尝试将TERMINFO设置为环境变量)" #: tui_ncurses.cpp:654 #, c-format msgid "Failed to set up %s terminal (err=%i); falling back to %s" msgstr "无法设置%s终端(err = %i);退回至%s" #: util.cpp:189 #, c-format msgid "cannot find unit in '%s' string at position %i" msgstr "在字符串 '%s' 的位置%i找不到单元" #: util.cpp:252 #, c-format msgid "an error occurred while opening file '%s'" msgstr "打开文件 '%s' 时发生错误" #: util.cpp:297 #, c-format msgid "an error occurred while running command '%s'" msgstr "运行命令 '%s' 时发生错误" #: util.cpp:437 msgid "set_cpu_affinity() not supported on this operating system" msgstr "此操作系统不支持 set_cpu_affinity()" #: data.hpp:103 data.hpp:244 data.hpp:332 msgid "Vendor" msgstr "制造商" #: data.hpp:104 msgid "Code Name" msgstr "架构" #: data.hpp:105 msgid "Package" msgstr "接口" #: data.hpp:106 msgid "Technology" msgstr "工艺" #: data.hpp:107 data.hpp:268 msgid "Voltage" msgstr "电压" #: data.hpp:108 msgid "Specification" msgstr "规格" #: data.hpp:109 msgid "Family" msgstr "系列" #: data.hpp:110 msgid "Disp. Family" msgstr "Disp。系列" #: data.hpp:111 data.hpp:224 data.hpp:245 data.hpp:335 msgid "Model" msgstr "型号" #: data.hpp:112 msgid "Disp. Model" msgstr "Disp。型号" #: data.hpp:113 msgid "Temp." msgstr "温度。" #: data.hpp:114 msgid "Stepping" msgstr "步进" #: data.hpp:115 msgid "Instructions" msgstr "指令集" #: data.hpp:125 msgid "L1 Data" msgstr "一级数据缓存" #: data.hpp:126 msgid "L1 Inst." msgstr "一级指令缓存." #: data.hpp:127 msgid "Level 2" msgstr "二级缓存" #: data.hpp:128 msgid "Level 3" msgstr "三级缓存" #: data.hpp:137 cpu-x-gtk-3.12.ui:1232 msgid "Cores" msgstr "核心" #: data.hpp:138 data.hpp:408 cpu-x-gtk-3.12.ui:1252 msgid "Threads" msgstr "线程" #: data.hpp:155 msgid "Core Speed" msgstr "核心速度" #: data.hpp:156 msgid "Multiplier" msgstr "倍频" #: data.hpp:157 msgid "Bus Speed" msgstr "总线速度" #: data.hpp:158 data.hpp:341 msgid "Usage" msgstr "使用率" #: data.hpp:188 data.hpp:265 msgid "Size" msgstr "大小" #: data.hpp:189 data.hpp:267 msgid "Speed" msgstr "速度" #: data.hpp:223 data.hpp:259 msgid "Manufacturer" msgstr "制造商" #: data.hpp:225 msgid "Revision" msgstr "版本修订" #: data.hpp:233 msgid "Brand" msgstr "品牌" #: data.hpp:234 msgid "Version" msgstr "版本" #: data.hpp:235 msgid "Date" msgstr "日期" #: data.hpp:236 msgid "ROM Size" msgstr "ROM 大小" #: data.hpp:260 msgid "Part Number" msgstr "零件号" #: data.hpp:261 msgid "Type" msgstr "类型" #: data.hpp:262 msgid "Type Detail" msgstr "类型详情" #: data.hpp:263 msgid "Device Locator" msgstr "设备定位器" #: data.hpp:264 msgid "Bank Locator" msgstr "Bank 定位器" #: data.hpp:266 msgid "Rank" msgstr "排列" #: data.hpp:292 msgid "Name" msgstr "名称" #: data.hpp:293 msgid "Kernel" msgstr "内核" #: data.hpp:294 msgid "Hostname" msgstr "主机名" #: data.hpp:295 msgid "Uptime" msgstr "运行时间" #: data.hpp:303 msgid "Used" msgstr "已用" #: data.hpp:304 msgid "Buffers" msgstr "缓冲" #: data.hpp:305 msgid "Cached" msgstr "缓存" #: data.hpp:306 msgid "Free" msgstr "可用" #: data.hpp:307 msgid "Swap" msgstr "交换" #: data.hpp:333 msgid "Driver" msgstr "驱动" #: data.hpp:334 msgid "UMD Version" msgstr "UMD 版本" #: data.hpp:336 msgid "Compute Unit" msgstr "计算单元" #: data.hpp:337 msgid "Device ID" msgstr "设备 ID" #: data.hpp:338 msgid "VBIOS Version" msgstr "VBIOS 版本" #. #-#-#-#-# source_ui.pot (cpu-x ) #-#-#-#-# #. Setting: "Interface" tab #: data.hpp:339 cpu-x-gtk-3.12.ui:5807 msgid "Interface" msgstr "界面" #: data.hpp:340 msgid "Temperature" msgstr "温度" #: data.hpp:342 msgid "Core Voltage" msgstr "核心电压" #: data.hpp:343 msgid "Power Avg" msgstr "平均功率" #: data.hpp:344 msgid "Core Clock" msgstr "核心时钟" #: data.hpp:345 msgid "Memory Clock" msgstr "内存时钟" #: data.hpp:346 msgid "Memory Used" msgstr "所用内存" #: data.hpp:347 msgid "Resizable BAR" msgstr "可调整大小的 BAR" #: data.hpp:348 msgid "Vulkan RT" msgstr "Vulkan RT" #: data.hpp:349 msgid "OpenGL Version" msgstr "OpenGL 版本" #: data.hpp:350 msgid "Vulkan Version" msgstr "Vulkan 版本" #: data.hpp:351 msgid "OpenCL Version" msgstr "OpenCL 版本" #: data.hpp:387 msgid "Score" msgstr "分数" #: data.hpp:388 msgid "Run" msgstr "运行" #: data.hpp:407 msgid "Duration" msgstr "持续时间" #: util.hpp:77 msgid "bytes" msgstr "字节" #. TRANSLATORS: initials for kilobyte (10³): please put initials (keep it short) #: util.hpp:80 msgid "kB" msgstr "kB" #. TRANSLATORS: initials for megabyte (10⁶): please put initials (keep it short) #: util.hpp:82 msgid "MB" msgstr "MB" #. TRANSLATORS: initials for gigabyte (10⁹): please put initials (keep it short) #: util.hpp:84 msgid "GB" msgstr "GB" #. TRANSLATORS: initials for terabyte (10¹²): please put initials (keep it short) #: util.hpp:86 msgid "TB" msgstr "TB" #. TRANSLATORS: initials for kibibyte (2¹⁰): please put initials (keep it short) #: util.hpp:89 msgid "KiB" msgstr "KiB" #. TRANSLATORS: initials for mebibyte (2²⁰): please put initials (keep it short) #: util.hpp:91 msgid "MiB" msgstr "MiB" #. TRANSLATORS: initials for gibibyte (2³⁰): please put initials (keep it short) #: util.hpp:93 msgid "GiB" msgstr "GiB" #. TRANSLATORS: initials for tebibyte (2⁴⁰): please put initials (keep it short) #: util.hpp:95 msgid "TiB" msgstr "TiB" #: cpu-x-gtk-3.12.ui:1184 msgid "Cache" msgstr "缓存" #. Setting: refresh time for UI #: cpu-x-gtk-3.12.ui:5721 msgid "Refresh time" msgstr "刷新时间" #. Setting: GUI theme #: cpu-x-gtk-3.12.ui:5745 msgid "Text theme" msgstr "文本主题" #. Setting: automatic GUI theme #: cpu-x-gtk-3.12.ui:5760 msgid "Automatic" msgstr "自动" #. Setting: light GUI theme #: cpu-x-gtk-3.12.ui:5761 msgid "Blue for light theme" msgstr "蓝色为亮色主题" #. Setting: dark GUI theme #: cpu-x-gtk-3.12.ui:5762 msgid "Yellow for dark theme" msgstr "黄色代表暗色主题" #. Setting: temperature unit #: cpu-x-gtk-3.12.ui:5775 msgid "Temperature unit" msgstr "温度单位" #. Setting: default tab at startup #: cpu-x-gtk-3.12.ui:5826 msgid "Default tab" msgstr "默认标签页" #. Setting: default CPU core at startup #: cpu-x-gtk-3.12.ui:5839 msgid "Default CPU core" msgstr "默认 CPU 核心" #. Setting: default cache test at startup #: cpu-x-gtk-3.12.ui:5852 msgid "Default cache test" msgstr "默认缓存测试" #. Setting: print CPUID values in decimal or hexadecimal #: cpu-x-gtk-3.12.ui:5895 msgid "Print CPUID values in decimal" msgstr "以十进制打印 CPUID 值" #. Setting: default graphic card at startup #: cpu-x-gtk-3.12.ui:5928 msgid "Default graphic card" msgstr "默认显卡" #. Setting: default CPU core at startup #: cpu-x-gtk-3.12.ui:5952 msgid "Default core type" msgstr "默认核心类型" #. Setting: default graphic card at startup #: cpu-x-gtk-3.12.ui:5976 msgid "Default memory stick" msgstr "默认内存条" #. Setting: "Startup" tab #: cpu-x-gtk-3.12.ui:6004 msgid "Startup" msgstr "启动" #~ msgid "Light" #~ msgstr "浅色" #~ msgid "Dark" #~ msgstr "深色" #~ msgid "Calculating CPU multipliers" #~ msgstr "正在计算 CPU 倍频" #, c-format #~ msgid "Current: PCIe Gen%1dx%d / Max: Gen%1dx%d" #~ msgstr "当前:PCIe Gen%1dx%d / 最高:Gen%1dx%d" #~ msgid "failed to retrieve GPU clocks" #~ msgstr "无法检索 GPU 时钟" #, c-format #~ msgid "Core #%i" #~ msgstr "核心 #%i" #~ msgid "Setting label names" #~ msgstr "正在设置标签名称" #, c-format #~ msgid "Bank %i" #~ msgstr "插槽 %i" #~ msgid "Reference" #~ msgstr "引用" #~ msgid "Distribution" #~ msgstr "发行版" #~ msgid "Compiler" #~ msgstr "编译器" #~ msgid "GPU clock" #~ msgstr "GPU 时钟" #~ msgid "Dumping data…" #~ msgstr "正在转储数据…" #~ msgid "Freeing memory" #~ msgstr "正在释放内存" #~ msgid "Ignore CPU frequency reported by libcpuid" #~ msgstr "忽略 libcpuid 报告的 CPU 频率" #, c-format #~ msgid "failed to call wordexp (%i)" #~ msgstr "调用 wordexp (%i) 失败" #~ msgid "Press 'home' key to scroll up in a page." #~ msgstr "按“home”键向上滚动页面。" #~ msgid "Press 'end' key to scroll down in a page." #~ msgstr "按“end”键向下滚动页面。" #, c-format #~ msgid "String '%s' is too long, truncating…" #~ msgstr "字符串 '%s' 太长,截断中…" #, c-format #~ msgid "failed to open %s directory" #~ msgstr "无法打开 %s 目录" #~ msgid "an error occurred while compiling regex" #~ msgstr "编译正则表达式时出错" #~ msgid "FATAL ERROR: could not allocate memory" #~ msgstr "严重错误:无法分配内存" #~ msgid "Enumerating Vulkan instance extension properties" #~ msgstr "枚举 Vulkan 实例扩展属性" #, c-format #~ msgid "failed to call vkEnumerateInstanceExtensionProperties (%s)" #~ msgstr "未能调用 vkEnumerateInstanceExtensionProperties (%s)" #, c-format #~ msgid "" #~ "failed to call vkEnumerateInstanceExtensionProperties to fill " #~ "VkExtensionProperties (%s)" #~ msgstr "" #~ "未能调用 vkEnumerateInstanceExtensionProperties 来填充 " #~ "VkExtensionProperties (%s)" #~ msgid "Vulkan API is not available" #~ msgstr "Vulkan API 不可用" #, c-format #~ msgid "%s" #~ msgstr "%s" #, c-format #~ msgid "" #~ "CPU hybrid architecture is not supported. For more details, please refer " #~ "to following issue: %s" #~ msgstr "不支持 CPU 混合架构。详情请参阅以下问题:%s" #~ msgid "NOT SUPPORTED" #~ msgstr "不支持" #~ msgid "There is no device with Vulkan support" #~ msgstr "没有支持 Vulkan 的设备" #~ msgid "Socket(s)" #~ msgstr "插槽" #~ msgid "Thread(s)" #~ msgstr "线程" #~ msgid "You can paste this backtrace by opening a new issue here:" #~ msgstr "您可以在这里打开一个新的问题来粘贴该回馈:" #~ msgid "faild to call clGetDeviceIDs" #~ msgstr "调用 clGetDeviceIDs失败" #~ msgid "Exiting %s" #~ msgstr "正在退出 %s" #~ msgid "Skip CPU MSR opening (need to be root)" #~ msgstr "跳过启用 CPU MSR (需要 root)" #~ msgid "failed to open CPU MSR (%s)" #~ msgstr "无法启用 CPU MSR (%s)" #~ msgid "Skip call to dmidecode (need to be root)" #~ msgstr "跳过调用 dmidecode (需要 root)" #~ msgid "failed to allocate memory for dmidecode" #~ msgstr "无法为 dmidecode 分配内存" #~ msgid "Finding graphic card driver" #~ msgstr "正在查找显卡驱动程序" #~ msgid "(%s driver)" #~ msgstr "(%s 驱动)" #~ msgid "Retrieving GPU temperature" #~ msgstr "正在检索 GPU 温度" #~ msgid "Off" #~ msgstr "关" #~ msgid "failed to retrieve GPU temperature" #~ msgstr "无法检索 GPU 温度" #~ msgid "Skip some GPU values (need to be root)" #~ msgstr "跳过某些 GPU 值 (需要 root)" #~ msgid "failed to allocate memory for benchmark" #~ msgstr "无法为基准测试分配内存" #~ msgid "Root privileges are required to work properly" #~ msgstr "需要 root 权限以正常工作" #~ msgid "Some information will not be retrievable" #~ msgstr "某些信息无法检索" #~ msgid "Ignore" #~ msgstr "忽略" #~ msgid "Run as root" #~ msgstr "以 root 权限运行" #~ msgid "A new version of %s is available!" #~ msgstr "新版本 %s 可用!" #~ msgid "" #~ "Do you want to update %s to version %s after exit?\n" #~ "It will erase this binary file (%s) by the new version." #~ msgstr "" #~ "您想在退出后将版本 %s 更新至版本 %s 吗?\n" #~ "将会用新版本替换该二进制文件 (%s) 。" #~ msgid "Not now" #~ msgstr "现在不要" #~ msgid "Update" #~ msgstr "更新" #~ msgid "Checking on Internet for a new version..." #~ msgstr "正在联网检查新版本..." #~ msgid "failed to open a Curl session" #~ msgstr "无法启用 Curl 模块" #~ msgid "wrong write data" #~ msgstr "写入数据出错" #~ msgid "(version %s is available)" #~ msgstr "(%s 版目前可用)" #~ msgid "No new version available" #~ msgstr "没有新版本可用" #~ msgid "(up-to-date)" #~ msgstr "(最新)" #~ msgid "an error occurred while extracting %s archive (%s)" #~ msgstr "提取 %s 存档时出错 (%s)" #~ msgid "" #~ "Network access is disabled by environment variable (set CPUX_NETWORK with " #~ "a positive value to enable it)" #~ msgstr "网络访问被环境变量禁用 (将 CPUX_NETWORK 设置为正值以启用)" #~ msgid "failed to open %s archive for writing" #~ msgstr "无法写入 %s 存档" #~ msgid "Downloading new version..." #~ msgstr "正在下载新版本..." #~ msgid "failed to download %s archive (%s)" #~ msgstr "无法下载 %s 存档 (%s)" #~ msgid "Extracting new version..." #~ msgstr "正在提取新版本..." #~ msgid "Applying new version..." #~ msgstr "正在应用新版本..." #~ msgid "an error occurred while removing/renaming files" #~ msgstr "移动/重命名文件时出错" #~ msgid "Update successful!" #~ msgstr "更新成功!" #~ msgid "Update portable version if a new version is available" #~ msgstr "新版本可用时,更新便携式版本" #~ msgid "Temporarily disable network support" #~ msgstr "暂时禁用网络支持" #~ msgid "Built on %s, %s (with %s %s on %s)." #~ msgstr "基于 %s,%s (使用 %s %s 在 %s 上)." #~ msgid "" #~ "Sorry, you cannot update %s: 32-bit portable version is no more supported." #~ msgstr "很抱歉,无法更新 %s :不再支持32位可移植版本。" #~ msgid "If you want to update, press 'u' key, or anything else to skip.\n" #~ msgstr "如果您想要更新,请按 'u' 键,否则请按其他按键跳过更新。\n" #~ msgid "" #~ "\n" #~ "\n" #~ "%s will be updated." #~ msgstr "" #~ "\n" #~ "\n" #~ "%s 将会被更新。" CPU-X-5.0.3/po/zh_Hant.po000066400000000000000000001051071454622605200147360ustar00rootroot00000000000000# Copyright © 2014-2024 The Tumultuous Unicorn Of Darkness # This file is distributed under the same license as the CPU-X package. # Louies , 2019. # byStarTW , 2019. # Jeff Huang , 2019. # mingjieWu , 2020. # Hung, Chi-Heng , 2020. # crlambda , 2020. # 快乐的老鼠宝宝 , 2022. # Jackie C. L. Liu , 2022. # Hugel , 2022. # yangyangdaji <1504305527@qq.com>, 2022. # Hou Qiyao , 2023. # Codefoxy Ch , 2024. msgid "" msgstr "" "Project-Id-Version: CPU-X\n" "Report-Msgid-Bugs-To: https://github.com/TheTumultuousUnicornOfDarkness/" "CPU-X/issues\n" "POT-Creation-Date: 2023-12-09 13:09+0100\n" "PO-Revision-Date: 2024-01-06 01:10+0000\n" "Last-Translator: Codefoxy Ch \n" "Language-Team: Chinese (Traditional) \n" "Language: zh_Hant\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.4-dev\n" #: core.cpp:135 msgid "Finding CPU technology" msgstr "正在尋找 CPU 技術" #: core.cpp:161 #, c-format msgid "" "Your CPU is not present in the database ==> %s, model: %i, ext. model: %i, " "ext. family: %i" msgstr "您的 CPU 不在資料庫中 ==>> %s,型號:%i,延伸型號:%i,擴充系列:%i" #: core.cpp:189 data.cpp:150 data.cpp:342 msgid "unknown" msgstr "未知" #: core.cpp:230 msgid "Calling libcpuid for retrieving static data" msgstr "正在呼叫 libcpuid 以取得靜態資料" #: core.cpp:245 #, c-format msgid "failed to call libcpuid (%s)" msgstr "呼叫 libcpuid 失敗 (%s)" #: core.cpp:340 msgid "Calling libcpuid for retrieving dynamic data" msgstr "正在呼叫 libcpuid 以取得動態資料" #: core.cpp:353 msgid "Calling libcpuid for retrieving CPU MSR static values" msgstr "正在呼叫 libcpuid 以取得 CPU MSR 靜態值" #: core.cpp:380 msgid "Calling libcpuid for retrieving CPU MSR dynamic values" msgstr "正在呼叫 libcpuid 以取得 CPU MSR 動態值" #: core.cpp:412 msgid "Calling dmidecode" msgstr "調用dmidecode" #: core.cpp:454 core.cpp:473 #, c-format msgid "%s (configured)" msgstr "%s(已配置)" #: core.cpp:461 core.cpp:480 #, c-format msgid "%s (max)" msgstr "%s(最大)" #: core.cpp:466 #, c-format msgid "%s (min)" msgstr "%s(最少)" #: core.cpp:496 msgid "Calculating CPU usage" msgstr "正在計算 CPU 使用率" #: core.cpp:546 msgid "Calling bandwidth" msgstr "調用帶寬" #: core.cpp:613 #, c-format msgid "" "pci_access is not properly initialized: it is a common issue when %s was " "built with a lower libpci version.\n" "Check that libpci %s library is present on your system. Otherwise, please " "rebuild %s." msgstr "" "pci_access 未正確初始化:這是使用較低 libpci 版本建立 %s 時的常見問題。\n" "檢查您的系統上是否存在 libpci %s 版本函式庫。否則,請重建 %s。" #: core.cpp:657 #, c-format msgid "No kernel driver in use for graphic card at path %s" msgstr "路徑 %s 沒有顯示卡核心驅動程式正在使用" #: core.cpp:693 #, c-format msgid "Your GPU kernel driver is unknown: %s" msgstr "無法得知您的 GPU 核心驅動程式:%s" #: core.cpp:777 #, c-format msgid "Your GPU user mode driver is unknown for vendor %s: %s" msgstr "供應商 %s 未知您的 GPU 使用者模式驅動程式:%s" #: core.cpp:781 #, c-format msgid "failed to call GLFW (%i): %s" msgstr "呼叫 GLFW 失敗 (%i):(%s)" #: core.cpp:914 msgid "Finding Vulkan API version" msgstr "查找 Vulkan API 版本" #: core.cpp:926 #, c-format msgid "failed to call vkCreateInstance (%s)" msgstr "呼叫 vkCreateInstance 失敗 (%s)" #: core.cpp:929 #, c-format msgid "%s is not supported" msgstr "不支援 %s" #: core.cpp:937 #, c-format msgid "failed to call vkEnumeratePhysicalDevices (%s)" msgstr "呼叫 vkEnumeratePhysicalDevices 失敗 (%s)" #: core.cpp:944 msgid "No available Vulkan devices" msgstr "沒有可用的 Vulkan 設備" #: core.cpp:952 #, c-format msgid "No available physical devices (%s)" msgstr "沒有可用的物理設備(%s)" #: core.cpp:1015 #, c-format msgid "Failed to create Vulkan for device %u (%s)" msgstr "無法為設備 %u (%s) 創建 Vulkan" #: core.cpp:1019 #, c-format msgid "%s is not supported for device %u, use only deviceID for matching" msgstr "%s不支援 在裝置 %u,僅使用 deviceID 進行匹配" #: core.cpp:1051 core.cpp:1364 msgid "Enabled" msgstr "啟用" #: core.cpp:1051 core.cpp:1364 msgid "Disabled" msgstr "關閉" #: core.cpp:1088 msgid "Finding OpenCL API version" msgstr "查找 OpenCL API 版本" #: core.cpp:1092 #, c-format msgid "There is no platform with OpenCL support (%s)" msgstr "沒有受 OpenCL 支援的平台 (%s)" #: core.cpp:1102 #, c-format msgid "failed to get all OpenCL platforms (%s)" msgstr "擷取全部 OpenCL 平台時失敗 (%s)" #: core.cpp:1115 #, c-format msgid "failed to get name for platform %u (%s)" msgstr "擷取平台名稱時失敗 %u (%s)" #: core.cpp:1123 #, c-format msgid "failed to get version for platform %u (%s)" msgstr "擷取平台版本號數時失敗 %u (%s)" #: core.cpp:1131 #, c-format msgid "failed to find number of OpenCL devices for platform '%s %s' (%s)" msgstr "尋找平台上 OpenCL 裝置號碼時失敗 '%s %s' (%s)" #: core.cpp:1131 msgid "0 device" msgstr "正在尋找裝置" #: core.cpp:1140 #, c-format msgid "failed to get all of OpenCL devices for platform '%s %s' (%s)" msgstr "擷取平台上全部 OpenCL 裝置時失敗 '%s %s' (%s)" #: core.cpp:1160 #, c-format msgid "failed to get name for device %u (%s)" msgstr "擷取裝置名稱時失敗 %u (%s)" #: core.cpp:1168 #, c-format msgid "failed to get version for device %u (%s)" msgstr "取得裝置版本資訊時失敗%u (%s)" #: core.cpp:1190 #, c-format msgid "OpenCL driver for '%s %s' does not support CL_DEVICE_TOPOLOGY_AMD (%s)" msgstr "提供給 '%s %s' 之 OpenCL 驅動程式不支援 CL_DEVICE_TOPOLOGY_AMD (%s)" #: core.cpp:1201 #, c-format msgid "" "OpenCL driver for '%s %s' does not support CL_DEVICE_GFXIP_MAJOR_AMD (%s)" msgstr "提供給 '%s %s' 之 OpenCL 驅動程式不支援 CL_DEVICE_GFXIP_MAJOR_AMD (%s)" #: core.cpp:1209 core.cpp:1229 core.cpp:1262 #, c-format msgid "" "OpenCL driver for '%s %s' does not support CL_DEVICE_MAX_COMPUTE_UNITS (%s)" msgstr "「%s %s」的 OpenCL 驅動程式並不支援 CL_DEVICE_MAX_COMPUTE_UNITS (%s)" #: core.cpp:1250 #, c-format msgid "" "OpenCL driver for '%s %s' does not support CL_DEVICE_PCI_DOMAIN_ID_NV (%s), " "CL_DEVICE_PCI_BUS_ID_NV (%s) or CL_DEVICE_PCI_SLOT_ID_NV (%s)" msgstr "" "提供給 '%s %s' 之 OpenCL 驅動程式不支援 CL_DEVICE_PCI_DOMAIN_ID_NV (%s), " "CL_DEVICE_PCI_BUS_ID_NV (%s) 或是 CL_DEVICE_PCI_SLOT_ID_NV (%s)" #: core.cpp:1273 #, c-format msgid "OpenCL is not supported with your GPU vendor (0x%X)" msgstr "您的顯示卡供應商 (0x%X) 不支援 OpenCL" #: core.cpp:1295 msgid "Finding devices" msgstr "正在尋找裝置" #: core.cpp:1307 #, c-format msgid "Skip devices search (wrong permissions on %s device)" msgstr "略過搜尋裝置 ( %s 裝置不允許權限)" #: core.cpp:1350 #, c-format msgid "Your GPU vendor is unknown: %s (0x%X)" msgstr "無法得知您的 GPU 供應商:%s (0x%X)" #: core.cpp:1370 msgid "failed to find chipset vendor and model" msgstr "找不到晶片組供應商及型號" #: core.cpp:1385 msgid "failed to find graphic card vendor and model" msgstr "找不到顯示卡供應商及型號" #: core.cpp:1487 msgid "Retrieving GPU clocks" msgstr "正在取得 GPU 時脈" #: core.cpp:1500 msgid "None" msgstr "無" #: core.cpp:1509 #, c-format msgid "DRM path for %s is unknown" msgstr "%s 的 DRM 路徑未知" #: core.cpp:1516 #, c-format, fuzzy msgid "Card number for %s is unknown" msgstr "%s 的卡號未知" #: core.cpp:1541 #, c-format msgid "PCIe %s (current) / %s (max)" msgstr "PCIe %s(目前)/%s(最大值)" #: core.cpp:1650 #, fuzzy, c-format #| msgid "Driver for GPU %u doesn't report frequencies" msgid "Driver for %s doesn't report frequencies" msgstr "GPU驅動程式 %u 未回報頻率" #: core.cpp:1671 #, fuzzy, c-format #| msgid "failed to get all OpenCL platforms (%s)" msgid "failed to retrieve all monitoring data for %s" msgstr "擷取全部 OpenCL 平台時失敗 (%s)" #: core.cpp:1694 msgid "Identifying running system" msgstr "正在辨識作業環境系統" #: core.cpp:1697 msgid "failed to identify running system" msgstr "辨識作業環境系統失敗" #: core.cpp:1749 core.cpp:1778 msgid "Calling libprocps" msgstr "正在呼叫 libprocps" #: core.cpp:1752 msgid "unable to get system uptime" msgstr "" #: core.cpp:1758 msgid "unable to create meminfo structure" msgstr "" #: core.cpp:1804 msgid "Calling libstatgrab" msgstr "正在呼叫 libstatgrab" #: core.cpp:1852 #, c-format msgid "%i days, %i hours, %i minutes, %i seconds" msgstr "%i 天, %i 小時, %i 分鐘, %i 秒" #: core.cpp:1915 msgid "Updating benchmark status" msgstr "正在更新benchmark狀態" #: core.cpp:1918 msgid "Active" msgstr "活動中" #: core.cpp:1921 #, c-format msgid "(%u hours left)" msgstr "(剩下 %u 小時)" #: core.cpp:1923 #, c-format msgid "(%u minutes left)" msgstr "(剩下 %u 分鐘)" #: core.cpp:1925 #, c-format msgid "(%u seconds left)" msgstr "(剩下 %u 秒鐘)" #: core.cpp:1929 core.cpp:1984 core.cpp:1985 msgid "Inactive" msgstr "未啟動" #: core.cpp:1932 #, c-format msgid "in %u hours" msgstr "在 %u 小時內" #: core.cpp:1934 #, c-format msgid "in %u minutes" msgstr "在 %u 分鐘內" #: core.cpp:1936 #, c-format msgid "in %u seconds" msgstr "在 %u 秒鐘內" #: core.cpp:1953 #, fuzzy, c-format #| msgid "Starting benchmark" msgid "Starting benchmark with %u threads" msgstr "正在開始效能測試" #: core.cpp:1976 msgid "an error occurred while starting benchmark" msgstr "開始效能測試時有錯誤發生" #: core.cpp:2002 msgid "Finding CPU package in fallback mode" msgstr "" #: core.cpp:2032 #, c-format msgid "Your CPU socket is not present in the database ==> %s, codename: %s" msgstr "您的中央處理器插槽型式不在資料庫中 ==> %s,代號: %s" #: core.cpp:2052 msgid "Calculating CPU multipliers in fallback mode" msgstr "" #: core.cpp:2072 msgid "Retrieving motherboard information in fallback mode" msgstr "" #: core.cpp:2085 msgid "failed to retrieve motherboard information (fallback mode)" msgstr "" #: core.cpp:2127 msgid "Retrieving CPU temperature in fallback mode" msgstr "" #: core.cpp:2173 msgid "failed to retrieve CPU temperature (fallback mode)" msgstr "" #: core.cpp:2188 msgid "Retrieving CPU voltage in fallback mode" msgstr "" #: core.cpp:2200 msgid "failed to retrieve CPU voltage (fallback mode)" msgstr "" #: core.cpp:2214 msgid "Retrieving CPU frequency in fallback mode" msgstr "" #: core.cpp:2220 msgid "failed to retrieve CPU frequency (fallback mode)" msgstr "" #: daemon_client.cpp:65 msgid "Starting daemon in background…" msgstr "" #: daemon_client.cpp:172 msgid "pkexec: authorization could not be obtained (dialog dismissed)" msgstr "" #: daemon_client.cpp:175 msgid "pkexec: authorization could not be obtained (not authorized)" msgstr "" #: daemon_client.cpp:178 msgid "pkexec: command not found" msgstr "" #: daemon_client.cpp:181 msgid "pkexec: unexpected error code" msgstr "" #: daemon_client.cpp:211 msgid "Connecting to daemon…" msgstr "" #: daemon_server.cpp:261 #, c-format msgid "request_handler: case %i not handled" msgstr "" #: data.cpp:124 cpu-x-gtk-3.12.ui:1370 msgid "CPU" msgstr "CPU" #: data.cpp:187 #, fuzzy #| msgid "Score" msgid "P-core" msgstr "分數" #: data.cpp:188 #, fuzzy #| msgid "Score" msgid "E-core" msgstr "分數" #: data.cpp:189 data.cpp:192 #, fuzzy #| msgid "Core(s)" msgid "Core" msgstr "核心" #: data.cpp:208 cpu-x-gtk-3.12.ui:746 msgid "Processor" msgstr "處理器" #: data.cpp:240 data.cpp:329 cpu-x-gtk-3.12.ui:1968 msgid "Caches" msgstr "快取" #: data.cpp:247 #, fuzzy, c-format #| msgid "%d x %d %s, %d-way" msgid "%2d x %4d %s, %2d-way" msgstr "%d x %d %s, %d 路" #: data.cpp:249 #, c-format msgid "%d %s, %d-way" msgstr "%d %s, %d 路" #: data.cpp:263 msgid "Count" msgstr "" #: data.cpp:276 cpu-x-gtk-3.12.ui:968 msgid "Clocks" msgstr "時脈" #: data.cpp:379 data.cpp:383 #, fuzzy, c-format #| msgid "L%i Cache" msgid "L%u Cache" msgstr "L%i 快取" #: data.cpp:385 #, c-format msgid "%s associative, %d-%s line size" msgstr "%s 組合,%d-%s 行大小" #: data.cpp:398 msgid "Test" msgstr "測試" #: data.cpp:409 data.cpp:423 cpu-x-gtk-3.12.ui:2146 cpu-x-gtk-3.12.ui:2517 msgid "Motherboard" msgstr "主機板" #: data.cpp:437 cpu-x-gtk-3.12.ui:2367 msgid "BIOS" msgstr "BIOS" #: data.cpp:452 cpu-x-gtk-3.12.ui:2498 msgid "Chipset" msgstr "晶片組" #: data.cpp:467 data.cpp:569 cpu-x-gtk-3.12.ui:3156 cpu-x-gtk-3.12.ui:3761 msgid "Memory" msgstr "記憶體" #: data.cpp:483 #, c-format msgid "Stick %u" msgstr "" #: data.cpp:487 cpu-x-gtk-3.12.ui:3134 msgid "Sticks" msgstr "" #: data.cpp:541 cpu-x-gtk-3.12.ui:3780 msgid "System" msgstr "系統" #: data.cpp:554 cpu-x-gtk-3.12.ui:3380 msgid "Operating System" msgstr "作業系統" #: data.cpp:587 cpu-x-gtk-3.12.ui:4960 msgid "Graphics" msgstr "" #: data.cpp:621 #, c-format msgid "Card %u" msgstr "" #: data.cpp:625 cpu-x-gtk-3.12.ui:4938 msgid "Cards" msgstr "" #: data.cpp:672 cpu-x-gtk-3.12.ui:5300 msgid "Bench" msgstr "效能測試" #: data.cpp:685 msgid "Not started" msgstr "未開始" #: data.cpp:688 cpu-x-gtk-3.12.ui:5070 msgid "Prime numbers (slow)" msgstr "" #: data.cpp:692 cpu-x-gtk-3.12.ui:5178 msgid "Prime numbers (fast)" msgstr "" #: data.cpp:696 cpu-x-gtk-3.12.ui:5281 msgid "Parameters" msgstr "參數" #: data.cpp:721 data.cpp:727 #, c-format msgid "%u mins" msgstr "%u 分鐘" #: data.cpp:734 cpu-x-gtk-3.12.ui:5444 cpu-x-gtk-3.12.ui:5552 msgid "About" msgstr "關於" #: data.cpp:739 #, c-format msgid "" "%s is a Free software that gathers information\n" "on CPU, motherboard and more." msgstr "" "%s 是一款蒐集CPU、主機板等資訊\n" "的自由軟體。" #: data.cpp:744 #, fuzzy #| msgid "About" msgid "About CPU-X" msgstr "關於" #: data.cpp:745 #, c-format msgid "Version %s" msgstr "%s 版" #: data.cpp:746 #, c-format msgid "Author: %s" msgstr "作者:%s" #: data.cpp:747 #, c-format msgid "Site: %s" msgstr "網站:%s" #: data.cpp:751 cpu-x-gtk-3.12.ui:5533 msgid "License" msgstr "授權條款" #: data.cpp:753 #, c-format msgid "This software is distributed under the terms of %s" msgstr "" #: data.cpp:754 main.cpp:176 msgid "This program comes with ABSOLUTELY NO WARRANTY" msgstr "" #: gui_gtk.cpp:61 #, c-format msgid "Cannot find path for '%s' file" msgstr "" #: gui_gtk.cpp:400 msgid "Start daemon" msgstr "" #: gui_gtk.cpp:403 msgid "Connected to daemon" msgstr "" #: gui_gtk.cpp:406 msgid "No polkit authentication agent found" msgstr "" #: gui_gtk.cpp:411 msgid "Ask password to start daemon in background" msgstr "" #: gui_gtk.cpp:415 msgid "Settings" msgstr "" #: gui_gtk.cpp:634 #, fuzzy #| msgid "Family" msgid "BaseFamily" msgstr "系列" #: gui_gtk.cpp:635 msgid "CPU display (\"true\") family (computed as BaseFamily+ExtendedFamily)" msgstr "" #: gui_gtk.cpp:636 #, fuzzy #| msgid "Model" msgid "BaseModel" msgstr "型號" #: gui_gtk.cpp:637 msgid "CPU display (\"true\") model (computed as (ExtendedModel<<4)+BaseModel)" msgstr "" #: gui_gtk.cpp:847 msgid "" "Identify the physically-labeled socket or board position where the memory " "device is located" msgstr "" #: gui_gtk.cpp:848 msgid "Identify the physically labeled bank where the memory device is located" msgstr "" #: gui_gtk.cpp:1052 msgid "User Mode Driver Version" msgstr "用戶模式驅動程序版本" #: gui_gtk.cpp:1066 msgid "Vulkan Ray Tracing" msgstr "" #: gui_gtk.cpp:1260 msgid "Starting GTK GUI…" msgstr "正在啟動GTK圖形使用者介面…" #: gui_gtk.cpp:1272 msgid "failed to import UI in GtkBuilder" msgstr "" #: main.cpp:63 msgid "Start graphical user interface (GUI) (default)" msgstr "開啓圖形使用者界面(預設)" #: main.cpp:64 msgid "Start text-based user interface (TUI)" msgstr "開啓文字使用者介面" #: main.cpp:65 msgid "Dump all data on standard output and exit" msgstr "" #: main.cpp:66 msgid "Run embedded command dmidecode and exit" msgstr "" #: main.cpp:67 msgid "Run embedded command bandwidth and exit" msgstr "" #: main.cpp:68 msgid "Set temperature unit (c[elsius]|f[ahrenheit]|k[elvin]|r[ankine])" msgstr "" #: main.cpp:69 msgid "Set custom time between two refreshes (in seconds)" msgstr "" #: main.cpp:70 msgid "Set default tab (integer)" msgstr "設定預設分頁(整數)" #: main.cpp:71 msgid "Select core type to monitor (integer)" msgstr "" #: main.cpp:72 msgid "Select CPU core to monitor (integer)" msgstr "" #: main.cpp:73 msgid "Set custom bandwidth test for CPU caches speed (integer)" msgstr "" #: main.cpp:74 #, fuzzy #| msgid "Set default tab (integer)" msgid "Select default memory stick (integer)" msgstr "設定預設分頁(整數)" #: main.cpp:75 #, fuzzy #| msgid "Set default tab (integer)" msgid "Select default graphic card (integer)" msgstr "設定預設分頁(整數)" #: main.cpp:76 cpu-x-gtk-3.12.ui:5910 msgid "Start and connect to daemon" msgstr "" #: main.cpp:77 msgid "Verbose output" msgstr "" #: main.cpp:78 msgid "Print help and exit" msgstr "" #: main.cpp:79 msgid "Print version and exit" msgstr "" #: main.cpp:80 msgid "Print CPUID values in decimal (default is hexadeximal)" msgstr "" #: main.cpp:81 msgid "Disable colored output" msgstr "" #: main.cpp:82 msgid "Print information for debugging" msgstr "" #: main.cpp:83 msgid "Print required information to paste in an issue" msgstr "" #: main.cpp:84 msgid "Set key mapping for NCurses mode (a[rrows]|e[macs]|i[nverted-T]|v[im])" msgstr "" #: main.cpp:95 msgid "Add default command line arguments" msgstr "" #: main.cpp:96 msgid "Enforce the bus clock" msgstr "" #: main.cpp:97 msgid "" "Ignore CPU values reported by libcpuid (comma-separated values among 'temp', " "'volt' and 'freq')" msgstr "" #: main.cpp:98 msgid "Read CPUID raw data from a given file" msgstr "" #: main.cpp:99 msgid "Only print a message if CPU is not present in the database" msgstr "" #: main.cpp:126 #, c-format msgid "Usage: %s DISPLAY [OPTIONS]\n" msgstr "" #: main.cpp:127 msgid "Available DISPLAY:" msgstr "" #: main.cpp:135 msgid "Available OPTIONS:" msgstr "" #: main.cpp:144 msgid "Influenceable environment variables:" msgstr "" #: main.cpp:175 msgid "This is free software: you are free to change and redistribute it." msgstr "" #: main.cpp:177 #, c-format msgid "See the %s license: <%s>\n" msgstr "" #: main.cpp:184 #, c-format msgid "-- %-9s version: %s" msgstr "" #: main.cpp:381 #, c-format msgid "" "\n" "Oops, something was wrong! %s has received signal %d (%s) and has crashed." msgstr "" #: main.cpp:383 #, c-format msgid "" "\n" "Oops, something was wrong! %s has received signal %d (%s) and is trying to " "recover." msgstr "" #: main.cpp:407 msgid "You can open a new issue here, by filling the template as requested:" msgstr "" #: main.cpp:449 msgid "an error occurred while setting locale" msgstr "" #: options.cpp:124 #, c-format msgid "" "Selected CPU type (%u) is not a valid number (%u is the maximum for this CPU)" msgstr "所選 CPU 類型 (%u) 不是有效數字(%u 是此 CPU 的最大值)" #: options.cpp:145 #, fuzzy, c-format #| msgid "" #| "Selected CPU type (%u) is not a valid number (%u is the maximum for this " #| "CPU)" msgid "" "Selected bandwidth test (%u) is not a valid number (%u is the maximum for " "this system)" msgstr "所選 CPU 類型 (%u) 不是有效數字(%u 是此 CPU 的最大值)" #: options.cpp:168 #, fuzzy, c-format #| msgid "" #| "Selected CPU type (%u) is not a valid number (%u is the maximum for this " #| "CPU)" msgid "" "Selected RAM stick (%u) is not a valid number (%u is the maximum for this " "system)" msgstr "所選 CPU 類型 (%u) 不是有效數字(%u 是此 CPU 的最大值)" #: options.cpp:188 #, fuzzy, c-format #| msgid "" #| "Selected CPU core (%u) is not a valid number (%u is the maximum for this " #| "type of core)" msgid "" "Selected graphic card (%u) is not a valid number (%u is the maximum for this " "system)" msgstr "所選 CPU 核心 (%u) 不是有效數字(%u 是此類核心的最大值)" #: options.cpp:204 #, c-format msgid "failed to change CPU affinitiy to core %u" msgstr "" #: options.cpp:210 #, c-format msgid "" "Selected CPU core (%u) is not a valid number (%u is the maximum for this " "type of core)" msgstr "所選 CPU 核心 (%u) 不是有效數字(%u 是此類核心的最大值)" #: options.cpp:284 #, fuzzy, c-format #| msgid "" #| "Selected CPU type (%u) is not a valid number (%u is the maximum for this " #| "CPU)" msgid "Selected tab (%u) is not a valid number (%u is the maximum)" msgstr "所選 CPU 類型 (%u) 不是有效數字(%u 是此 CPU 的最大值)" #: tui_ncurses.cpp:111 msgid "Window is too small!" msgstr "" #: tui_ncurses.cpp:119 msgid "Press 'h' to see help." msgstr "按「h」查看幫助。" #: tui_ncurses.cpp:232 #, c-format msgid "Welcome in %s NCurses help!\n" msgstr "" #: tui_ncurses.cpp:233 msgid "This help describes how to use this Text-based User Interface." msgstr "" #: tui_ncurses.cpp:235 msgid "Global keys:" msgstr "" #: tui_ncurses.cpp:236 #, fuzzy #| msgid "\tPress 'left' key to switch in left tab.\n" msgid "Press 'left' key or 'tab' key to switch in left tab." msgstr "\t按「左」鍵切換至左邊的分頁。\n" #: tui_ncurses.cpp:237 #, fuzzy #| msgid "\tPress 'right' key to switch in right tab.\n" msgid "Press 'right' key or 'shift + tab' keys to switch in right tab." msgstr "\t按「右」鍵切換至右邊的分頁。\n" #: tui_ncurses.cpp:238 #, fuzzy #| msgid "\tPress 'h' key to see this help.\n" msgid "Press 'h' key to see this help." msgstr "\t按「h」鍵查看此幫助。\n" #: tui_ncurses.cpp:239 #, fuzzy #| msgid "\tPress 'q' key to exit.\n" msgid "Press 'q' key to exit." msgstr "\t按「q」鍵退出。\n" #: tui_ncurses.cpp:241 msgid "CPU tab:" msgstr "CPU分頁:" #: tui_ncurses.cpp:242 #, fuzzy #| msgid "\tPress 'down' key to decrease core number to monitor.\n" msgid "Press 'next page' key to decrease core type number to monitor." msgstr "\t按「下」鍵減少要監視的核心數。\n" #: tui_ncurses.cpp:243 #, fuzzy #| msgid "\tPress 'up' key to increase core number to monitor.\n" msgid "Press 'previous page' key to increase core type number to monitor." msgstr "\t按「上」鍵增加要監視的核心數。\n" #: tui_ncurses.cpp:244 #, fuzzy #| msgid "\tPress 'down' key to decrease core number to monitor.\n" msgid "Press 'down' key to decrease CPU core number to monitor." msgstr "\t按「下」鍵減少要監視的核心數。\n" #: tui_ncurses.cpp:245 #, fuzzy #| msgid "\tPress 'up' key to increase core number to monitor.\n" msgid "Press 'up' key to increase CPU core number to monitor." msgstr "\t按「上」鍵增加要監視的核心數。\n" #: tui_ncurses.cpp:247 msgid "Caches tab:" msgstr "快取分頁:" #: tui_ncurses.cpp:248 #, fuzzy #| msgid "\tPress 'down' key to switch to previous test.\n" msgid "Press 'down' key to switch to previous test." msgstr "\t按「下」鍵切換至上一項測試。\n" #: tui_ncurses.cpp:249 #, fuzzy #| msgid "\tPress 'up' key' to switch to next test.\n" msgid "Press 'up' key to switch to next test." msgstr "\t按「上」鍵切換至下一項測試。\n" #: tui_ncurses.cpp:251 msgid "Bench tab:" msgstr "效能測試分頁:" #: tui_ncurses.cpp:252 #, fuzzy #| msgid "\tPress 'down' key to decrement benchmark duration.\n" msgid "Press 'down' key to decrement benchmark duration." msgstr "\t按「下」鍵減少效能測試持續的時間。\n" #: tui_ncurses.cpp:253 #, fuzzy #| msgid "\tPress 'up' key to increment benchmark duration.\n" msgid "Press 'up' key to increment benchmark duration." msgstr "\t按「上」鍵增加效能測試持續的時間。\n" #: tui_ncurses.cpp:254 #, fuzzy #| msgid "\tPress 'next page' key to decrement number of threads to use.\n" msgid "Press 'next page' key to decrement number of threads to use." msgstr "\t按「下一頁」鍵減少要使用的線程數。\n" #: tui_ncurses.cpp:255 #, fuzzy #| msgid "\tPress 'previous page' key to increment number of threads to use.\n" msgid "Press 'previous page' key to increment number of threads to use." msgstr "\t按「上一頁」鍵增加要使用的線程數。\n" #: tui_ncurses.cpp:256 #, fuzzy #| msgid "\tPress 'up' key to increase core number to monitor.\n" msgid "Press 's' key to start/stop prime numbers (slow) benchmark." msgstr "\t按「上」鍵增加要監視的核心數。\n" #: tui_ncurses.cpp:257 #, fuzzy #| msgid "\tPress 'up' key to increase core number to monitor.\n" msgid "Press 'f' key to start/stop prime numbers (fast) benchmark." msgstr "\t按「上」鍵增加要監視的核心數。\n" #: tui_ncurses.cpp:259 msgid "Graphics tab:" msgstr "圖形分頁:" #: tui_ncurses.cpp:260 #, fuzzy #| msgid "\tPress 'down' key to switch to previous test.\n" msgid "Press 'down' key to switch to previous graphic card." msgstr "\t按「下」鍵切換至上一項測試。\n" #: tui_ncurses.cpp:261 #, fuzzy #| msgid "\tPress 'up' key' to switch to next test.\n" msgid "Press 'up' key to switch to next graphic card." msgstr "\t按「上」鍵切換至下一項測試。\n" #: tui_ncurses.cpp:263 msgid "Press any key to exit this help." msgstr "按任意鍵退出幫助。" #: tui_ncurses.cpp:640 msgid "Starting NCurses TUI…" msgstr "" #: tui_ncurses.cpp:649 msgid "" "FATAL ERROR: terminfo database could not be found (try to set TERMINFO " "environment variable)" msgstr "" #: tui_ncurses.cpp:654 #, c-format msgid "Failed to set up %s terminal (err=%i); falling back to %s" msgstr "" #: util.cpp:189 #, c-format msgid "cannot find unit in '%s' string at position %i" msgstr "" #: util.cpp:252 #, fuzzy, c-format #| msgid "an error occurred while compiling regex" msgid "an error occurred while opening file '%s'" msgstr "編譯正則表達式時出錯" #: util.cpp:297 #, fuzzy, c-format #| msgid "an error occurred while starting benchmark" msgid "an error occurred while running command '%s'" msgstr "開始效能測試時有錯誤發生" #: util.cpp:437 msgid "set_cpu_affinity() not supported on this operating system" msgstr "" #: data.hpp:103 data.hpp:244 data.hpp:332 msgid "Vendor" msgstr "供應商" #: data.hpp:104 msgid "Code Name" msgstr "代號" #: data.hpp:105 msgid "Package" msgstr "封裝" #: data.hpp:106 msgid "Technology" msgstr "製程" #: data.hpp:107 data.hpp:268 msgid "Voltage" msgstr "電壓" #: data.hpp:108 msgid "Specification" msgstr "規格" #: data.hpp:109 msgid "Family" msgstr "系列" #: data.hpp:110 #, fuzzy #| msgid "Ext. Family" msgid "Disp. Family" msgstr "延伸系列" #: data.hpp:111 data.hpp:224 data.hpp:245 data.hpp:335 msgid "Model" msgstr "型號" #: data.hpp:112 #, fuzzy #| msgid "Ext. Model" msgid "Disp. Model" msgstr "延伸型號" #: data.hpp:113 msgid "Temp." msgstr "溫度" #: data.hpp:114 msgid "Stepping" msgstr "步進" #: data.hpp:115 msgid "Instructions" msgstr "指令集" #: data.hpp:125 msgid "L1 Data" msgstr "L1 資料" #: data.hpp:126 msgid "L1 Inst." msgstr "L1 指令" #: data.hpp:127 msgid "Level 2" msgstr "L2 快取" #: data.hpp:128 msgid "Level 3" msgstr "L3 快取" #: data.hpp:137 cpu-x-gtk-3.12.ui:1232 #, fuzzy #| msgid "Core(s)" msgid "Cores" msgstr "核心" #: data.hpp:138 data.hpp:408 cpu-x-gtk-3.12.ui:1252 msgid "Threads" msgstr "線程" #: data.hpp:155 msgid "Core Speed" msgstr "核心速度" #: data.hpp:156 msgid "Multiplier" msgstr "倍頻" #: data.hpp:157 msgid "Bus Speed" msgstr "匯流排速度" #: data.hpp:158 data.hpp:341 msgid "Usage" msgstr "用量" #: data.hpp:188 data.hpp:265 msgid "Size" msgstr "" #: data.hpp:189 data.hpp:267 msgid "Speed" msgstr "速度" #: data.hpp:223 data.hpp:259 msgid "Manufacturer" msgstr "製造商" #: data.hpp:225 msgid "Revision" msgstr "修訂" #: data.hpp:233 msgid "Brand" msgstr "廠牌" #: data.hpp:234 msgid "Version" msgstr "版本" #: data.hpp:235 msgid "Date" msgstr "日期" #: data.hpp:236 msgid "ROM Size" msgstr "唯讀記憶體容量" #: data.hpp:260 msgid "Part Number" msgstr "" #: data.hpp:261 #, fuzzy #| msgid "Type #%i" msgid "Type" msgstr "類型 #%i" #: data.hpp:262 #, fuzzy #| msgid "Type #%i" msgid "Type Detail" msgstr "類型 #%i" #: data.hpp:263 msgid "Device Locator" msgstr "" #: data.hpp:264 msgid "Bank Locator" msgstr "" #: data.hpp:266 msgid "Rank" msgstr "" #: data.hpp:292 #, fuzzy #| msgid "Code Name" msgid "Name" msgstr "代號" #: data.hpp:293 msgid "Kernel" msgstr "核心" #: data.hpp:294 msgid "Hostname" msgstr "主機名稱" #: data.hpp:295 msgid "Uptime" msgstr "上線時間" #: data.hpp:303 msgid "Used" msgstr "" #: data.hpp:304 msgid "Buffers" msgstr "緩衝" #: data.hpp:305 msgid "Cached" msgstr "快取" #: data.hpp:306 msgid "Free" msgstr "" #: data.hpp:307 msgid "Swap" msgstr "" #: data.hpp:333 msgid "Driver" msgstr "驅動" #: data.hpp:334 #, fuzzy #| msgid "Version" msgid "UMD Version" msgstr "版本" #: data.hpp:336 msgid "Compute Unit" msgstr "" #: data.hpp:337 msgid "Device ID" msgstr "" #: data.hpp:338 #, fuzzy #| msgid "Version" msgid "VBIOS Version" msgstr "版本" #. #-#-#-#-# source_ui.pot (cpu-x ) #-#-#-#-# #. Setting: "Interface" tab #: data.hpp:339 cpu-x-gtk-3.12.ui:5807 msgid "Interface" msgstr "" #: data.hpp:340 msgid "Temperature" msgstr "溫度" #: data.hpp:342 #, fuzzy #| msgid "Voltage" msgid "Core Voltage" msgstr "電壓" #: data.hpp:343 msgid "Power Avg" msgstr "" #: data.hpp:344 #, fuzzy #| msgid "Memory clock" msgid "Core Clock" msgstr "記憶體時脈" #: data.hpp:345 #, fuzzy #| msgid "Memory clock" msgid "Memory Clock" msgstr "記憶體時脈" #: data.hpp:346 #, fuzzy #| msgid "Memory" msgid "Memory Used" msgstr "記憶體" #: data.hpp:347 msgid "Resizable BAR" msgstr "" #: data.hpp:348 msgid "Vulkan RT" msgstr "" #: data.hpp:349 #, fuzzy #| msgid "Version" msgid "OpenGL Version" msgstr "版本" #: data.hpp:350 #, fuzzy #| msgid "Version" msgid "Vulkan Version" msgstr "版本" #: data.hpp:351 #, fuzzy #| msgid "Version" msgid "OpenCL Version" msgstr "版本" #: data.hpp:387 msgid "Score" msgstr "分數" #: data.hpp:388 msgid "Run" msgstr "執行" #: data.hpp:407 msgid "Duration" msgstr "持續時間" #: util.hpp:77 msgid "bytes" msgstr "位元組" #. TRANSLATORS: initials for kilobyte (10³): please put initials (keep it short) #: util.hpp:80 msgid "kB" msgstr "kB" #. TRANSLATORS: initials for megabyte (10⁶): please put initials (keep it short) #: util.hpp:82 msgid "MB" msgstr "MB" #. TRANSLATORS: initials for gigabyte (10⁹): please put initials (keep it short) #: util.hpp:84 msgid "GB" msgstr "GB" #. TRANSLATORS: initials for terabyte (10¹²): please put initials (keep it short) #: util.hpp:86 msgid "TB" msgstr "TB" #. TRANSLATORS: initials for kibibyte (2¹⁰): please put initials (keep it short) #: util.hpp:89 msgid "KiB" msgstr "" #. TRANSLATORS: initials for mebibyte (2²⁰): please put initials (keep it short) #: util.hpp:91 #, fuzzy #| msgid "MB" msgid "MiB" msgstr "MB" #. TRANSLATORS: initials for gibibyte (2³⁰): please put initials (keep it short) #: util.hpp:93 #, fuzzy #| msgid "GB" msgid "GiB" msgstr "GB" #. TRANSLATORS: initials for tebibyte (2⁴⁰): please put initials (keep it short) #: util.hpp:95 #, fuzzy #| msgid "TB" msgid "TiB" msgstr "TB" #: cpu-x-gtk-3.12.ui:1184 msgid "Cache" msgstr "快取" #. Setting: refresh time for UI #: cpu-x-gtk-3.12.ui:5721 msgid "Refresh time" msgstr "" #. Setting: GUI theme #: cpu-x-gtk-3.12.ui:5745 msgid "Text theme" msgstr "" #. Setting: automatic GUI theme #: cpu-x-gtk-3.12.ui:5760 msgid "Automatic" msgstr "" #. Setting: light GUI theme #: cpu-x-gtk-3.12.ui:5761 msgid "Blue for light theme" msgstr "" #. Setting: dark GUI theme #: cpu-x-gtk-3.12.ui:5762 msgid "Yellow for dark theme" msgstr "" #. Setting: temperature unit #: cpu-x-gtk-3.12.ui:5775 #, fuzzy #| msgid "Temperature" msgid "Temperature unit" msgstr "溫度" #. Setting: default tab at startup #: cpu-x-gtk-3.12.ui:5826 msgid "Default tab" msgstr "" #. Setting: default CPU core at startup #: cpu-x-gtk-3.12.ui:5839 msgid "Default CPU core" msgstr "" #. Setting: default cache test at startup #: cpu-x-gtk-3.12.ui:5852 msgid "Default cache test" msgstr "" #. Setting: print CPUID values in decimal or hexadecimal #: cpu-x-gtk-3.12.ui:5895 msgid "Print CPUID values in decimal" msgstr "" #. Setting: default graphic card at startup #: cpu-x-gtk-3.12.ui:5928 #, fuzzy #| msgid "Set default tab (integer)" msgid "Default graphic card" msgstr "設定預設分頁(整數)" #. Setting: default CPU core at startup #: cpu-x-gtk-3.12.ui:5952 msgid "Default core type" msgstr "" #. Setting: default graphic card at startup #: cpu-x-gtk-3.12.ui:5976 msgid "Default memory stick" msgstr "" #. Setting: "Startup" tab #: cpu-x-gtk-3.12.ui:6004 msgid "Startup" msgstr "" #~ msgid "Calculating CPU multipliers" #~ msgstr "正在計算 CPU 倍頻" #, c-format #~ msgid "Current: PCIe Gen%1dx%d / Max: Gen%1dx%d" #~ msgstr "現行的:PCIe Gen %1dx%d / 最高:Gen %1dx%d" #~ msgid "failed to retrieve GPU clocks" #~ msgstr "取得 GPU 時脈頻率時失敗" #, c-format #~ msgid "Core #%i" #~ msgstr "核心 #%i" #~ msgid "Distribution" #~ msgstr "發行版" #~ msgid "Compiler" #~ msgstr "編譯器" #~ msgid "GPU clock" #~ msgstr "GPU 時脈" #, fuzzy, c-format #~| msgid "failed to call libcpuid (%s)" #~ msgid "failed to call wordexp (%i)" #~ msgstr "呼叫 libcpuid 失敗 (%s)" #, fuzzy #~| msgid "\tPress 'left' key to switch in left tab.\n" #~ msgid "Press 'home' key to scroll up in a page." #~ msgstr "\t按「左」鍵切換至左邊的分頁。\n" #, fuzzy #~| msgid "\tPress 'left' key to switch in left tab.\n" #~ msgid "Press 'end' key to scroll down in a page." #~ msgstr "\t按「左」鍵切換至左邊的分頁。\n" #~ msgid "FATAL ERROR: could not allocate memory" #~ msgstr "致命錯誤:無法配置記憶體" #, fuzzy, c-format #~| msgid "failed to call libcpuid (%s)" #~ msgid "failed to call vkEnumerateInstanceExtensionProperties (%s)" #~ msgstr "呼叫 libcpuid 失敗 (%s)" #, c-format #~ msgid "%s" #~ msgstr "%s" #~ msgid "NOT SUPPORTED" #~ msgstr "不支援" #, fuzzy #~| msgid "There is no platform with OpenCL support (%s)" #~ msgid "There is no device with Vulkan support" #~ msgstr "沒有受 OpenCL 支援的平台 (%s)" #~ msgid "Socket(s)" #~ msgstr "插槽" #~ msgid "Thread(s)" #~ msgstr "線程" #, fuzzy #~| msgid "failed to call libcpuid (%s)" #~ msgid "faild to call clGetDeviceIDs" #~ msgstr "呼叫 libcpuid 失敗 (%s)" #~ msgid "Exiting %s" #~ msgstr "退出 %s" #~ msgid "Skip CPU MSR opening (need to be root)" #~ msgstr "跳過 CPU MSR 開啟(必須為 root)" #~ msgid "(%s driver)" #~ msgstr "(%s 驅動)" CPU-X-5.0.3/scripts/000077500000000000000000000000001454622605200140505ustar00rootroot00000000000000CPU-X-5.0.3/scripts/build_appimage.sh000077500000000000000000000036121454622605200173530ustar00rootroot00000000000000#!/bin/bash set -eo pipefail # Functions die() { echo "[FATAL] $*" exit 1 } runCmd() { if ! "$@"; then die "command failed: '$*'" fi } # Constant variables if [[ $# -lt 2 ]]; then echo "$0: WORKSPACE APPDIR" exit 1 fi WORKSPACE="$1" APPDIR="$2" WGET_ARGS=(--continue --no-verbose) # Reset arguments set -- # Download linuxdeploy and plugins BUNDLER="$WORKSPACE/linuxdeploy.AppImage" runCmd wget "${WGET_ARGS[@]}" "https://github.com/linuxdeploy/linuxdeploy/releases/download/continuous/linuxdeploy-x86_64.AppImage" --output-document="$BUNDLER" \ && set -- "$@" --output appimage runCmd wget "${WGET_ARGS[@]}" "https://raw.githubusercontent.com/linuxdeploy/linuxdeploy-plugin-gtk/master/linuxdeploy-plugin-gtk.sh" \ && set -- "$@" --plugin gtk runCmd wget "${WGET_ARGS[@]}" "https://raw.githubusercontent.com/linuxdeploy/linuxdeploy-plugin-ncurses/master/linuxdeploy-plugin-ncurses.sh" \ && set -- "$@" --plugin ncurses runCmd wget "${WGET_ARGS[@]}" "https://raw.githubusercontent.com/linuxdeploy/misc-plugins/master/gettext/linuxdeploy-plugin-gettext.sh" \ && set -- "$@" --plugin gettext #if [[ -z "$VERSION" ]]; then # export LINUXDEPLOY_PLUGIN_GDB_SRC="$WORKSPACE/src" # runCmd wget "${WGET_ARGS[@]}" "https://raw.githubusercontent.com/linuxdeploy/misc-plugins/master/gdb/linuxdeploy-plugin-gdb.sh" \ # && set -- "$@" --plugin gdb #fi runCmd chmod --verbose a+x ./*.AppImage ./*.sh # Set useful variables for linuxdeploy export ARCH=x86_64 export UPDATE_INFORMATION="gh-releases-zsync|${GITHUB_REPOSITORY//\//|}|${VERSION:-"continuous"}|CPU-X-*$ARCH.AppImage.zsync" export VERBOSE=1 #export DEBUG=1 export DISABLE_COPYRIGHT_FILES_DEPLOYMENT=1 # Run linuxdeploy runCmd mkdir --parents --verbose "$WORKSPACE/AppImage" && runCmd cd "$_" runCmd "$BUNDLER" \ --appdir="$APPDIR" \ --desktop-file="$APPDIR/usr/share/applications/io.github.thetumultuousunicornofdarkness.cpu-x.desktop" \ --verbosity=1 \ "$@" CPU-X-5.0.3/scripts/build_libcpuid.sh000077500000000000000000000013041454622605200173570ustar00rootroot00000000000000#!/bin/bash set -euo pipefail source /etc/os-release if [[ $# -lt 1 ]]; then echo "$0: BUILD_TYPE" exit 1 fi if [[ "$ID" != "ubuntu" ]]; then echo "$0: this script must be run on a Ubuntu system" exit 1 fi BUILD_TYPE="$1" BUILD_PATH="/tmp/libcpuid" echo "Install packages" sudo apt-get install -y -qq \ cmake \ ninja-build \ git \ g++ echo "Clone libcpuid Git repository" git clone https://github.com/anrieff/libcpuid.git "$BUILD_PATH" cd "$BUILD_PATH" echo "Run CMake" cmake -B build \ -GNinja \ -DCMAKE_BUILD_TYPE="$BUILD_TYPE" \ -DCMAKE_INSTALL_PREFIX=/usr \ -DBUILD_SHARED_LIBS=OFF echo "Build libcpuid" cmake --build build echo "Install CPU-X on system" sudo ninja -C build install CPU-X-5.0.3/scripts/build_ubuntu.sh000077500000000000000000000035761454622605200171230ustar00rootroot00000000000000#!/bin/bash set -euo pipefail source /etc/os-release if [[ $# -lt 2 ]]; then echo "$0: BUILD_TYPE SOURCE_DIRECTORY [INSTALL_DIRECTORY]" exit 1 fi if [[ "$ID" != "ubuntu" ]]; then echo "$0: this script must be run on a Ubuntu system" exit 1 fi BUILD_TYPE="$1" SRC_DIR="$2" if [[ $# -ge 3 ]]; then # AppImage build DST_DIR="$3" CMAKE_EXTRA_OPTIONS="" else # Standard build DST_DIR="" CMAKE_EXTRA_OPTIONS="-DWITH_OPENCL=1" fi case "$VERSION_ID" in "20.04") # Focal Fossa PACKAGES=('libncurses-dev' 'libncursesw6' 'libpci3' 'libprocps8' 'libglfw3-dev' 'libglfw3' 'libglvnd-dev' 'libvulkan-dev' 'ocl-icd-opencl-dev') ;; "22.04") # Jammy Jellyfish PACKAGES=('libncurses-dev' 'libncursesw6' 'libpci3' 'libprocps8' 'libglfw3-dev' 'libglfw3' 'libglvnd-dev' 'libvulkan-dev' 'ocl-icd-opencl-dev') ;; *) echo "Unsupported Ubuntu version: $VERSION_ID" ; exit 1 ;; esac echo "Install packages" sudo apt-get update -y -qq sudo apt-get install -y -qq \ gcc-10 \ g++-10 \ cmake \ ninja-build \ nasm \ gettext \ adwaita-icon-theme \ "${PACKAGES[@]}" \ libgtkmm-3.0-1v5 \ libgtkmm-3.0-dev \ libpci-dev \ opencl-headers \ ocl-icd-libopencl1 \ ocl-icd-opencl-dev \ libprocps-dev \ dpkg-dev \ gawk \ mawk sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-9 9 sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-10 10 sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-9 9 sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-10 10 echo "Run CMake" cmake -S "$SRC_DIR" \ -B build \ -GNinja \ -DCMAKE_BUILD_TYPE="$BUILD_TYPE" \ -DCMAKE_INSTALL_PREFIX=/usr \ -DCMAKE_INSTALL_LIBEXECDIR=/usr/bin \ $CMAKE_EXTRA_OPTIONS echo "Build CPU-X" cmake --build build if [[ -z "$DST_DIR" ]]; then echo "Install CPU-X on system" sudo ninja -C build install else echo "Install CPU-X in AppDir" DESTDIR="$DST_DIR" ninja -C build install fi CPU-X-5.0.3/scripts/check_new_strings.sh000077500000000000000000000016111454622605200201050ustar00rootroot00000000000000#!/bin/bash # This script is used to check if there are new strings in source files set -euo pipefail GIT_DIR="$(git rev-parse --show-toplevel)" SHA=${GITHUB_SHA:-HEAD~0} cd "$GIT_DIR" || exit 1 if [[ "$(git show -s --format='%ce' "$SHA")" == "hosted@weblate.org" ]]; then echo "Commit by Weblate, nothing to do." > /dev/stderr echo "NO_CHANGE" exit 0 fi for file in $(git show --pretty="" --name-only "$SHA"); do if [[ "$file" =~ \.(c|h|cpp|hpp)$ ]]; then if git show --unified=0 "$SHA" "$file" | grep -E -qw '_\(|N_\('; then git --no-pager show "$SHA" "$file" > /dev/stderr echo "REGEN" exit 0 fi elif [[ "$file" =~ \.(ui)$ ]]; then if git show --unified=0 "$SHA" "$file" | grep -E -qw 'translatable="yes"'; then git --no-pager show "$SHA" "$file" > /dev/stderr echo "REGEN" exit 0 fi fi done echo "No commit with translation change." > /dev/stderr echo "NO_CHANGE" CPU-X-5.0.3/scripts/patch_dmidecode.sh000077500000000000000000000017321454622605200175060ustar00rootroot00000000000000#!/bin/bash set -euo pipefail CPUX_DIR="$(git rev-parse --show-toplevel)/src/dmidecode" DMIDECODE_DIR="/tmp/dmidecode" HASH_FILE="$CPUX_DIR/.hash" OLD_HASH=$(cat "$HASH_FILE") OLD_HASH_SHORT=${OLD_HASH:0:7} # Get dmidecode source code git clone https://git.savannah.gnu.org/git/dmidecode.git "$DMIDECODE_DIR" cd "$DMIDECODE_DIR" || exit 255 # Retrieve informations about repo VER=$(git describe --abbrev=0 | sed 's/^dmidecode-//;s/-/./') DATE=$(git show -s --format=%cd --date=format:%Y%m%d) NEW_HASH=$(git rev-parse HEAD) NEW_HASH_SHORT=$(git rev-parse --short HEAD) git diff "$OLD_HASH" master > "dmidecode.patch" # Patch to the new version cd "$CPUX_DIR" || exit 255 echo "$NEW_HASH" > "$HASH_FILE" sed -i "s/$OLD_HASH/$NEW_HASH/" "README.md" sed -i "s/$OLD_HASH_SHORT/$NEW_HASH_SHORT/" "README.md" sed -i "s/VERSION \"[^ ]*\"/VERSION \"$VER.$DATE\"/" "CMakeLists.txt" patch --batch --no-backup-if-mismatch --input="$DMIDECODE_DIR/dmidecode.patch" CPU-X-5.0.3/scripts/run_libcpuid_tests.sh000077500000000000000000000025041454622605200203110ustar00rootroot00000000000000#!/bin/bash # This script is used to test the CPU Technology database set -euo pipefail CR="\033[0m" # Color reset CB="\033[1m" # Color bold CBR="\033[1;31m" # Color bold red CBG="\033[1;32m" # Color bold green if [[ $# -lt 1 ]]; then echo "$0: you must provide the libcpuid 'tests' directory." exit 1 else TESTS_DIR="$1" fi count=0 while IFS= read -r -d '' file; do if [[ ! "$file" =~ "amd" ]] && [[ ! "$file" =~ "intel" ]]; then # Only AMD and Intel CPUs are supported continue fi # Cut test file after delimiter (dash line) tmp_file="/tmp/$(basename "$file")" while read -r line; do if [[ "$line" == "--------------------------------------------------------------------------------" ]]; then break fi echo "$line" >> "$tmp_file" done < "$file" # Run with CPU-X and display test status printf "Test file ${CB}%-32s${CR}: " "$(basename "$file")" if output=$(LC_ALL=C CPUX_CPUID_RAW="$tmp_file" CPUX_DEBUG_DATABASE=1 cpu-x --dump --nocolor 2> /dev/null); then echo -en "${CBG}OK${CR}\n" else echo -en "${CBR}${output#*"==> "}${CR}\n" ((count++)) fi rm "$tmp_file" done < <(find "$TESTS_DIR" -name '*.test' -print0) echo -en "\nDone: " if [[ $count -eq 0 ]]; then echo -e "${CBG}all test files passed with success!${CR}" else echo -e "${CBR}$count test files failed to pass.${CR}" fi exit "$count" CPU-X-5.0.3/src/000077500000000000000000000000001454622605200131505ustar00rootroot00000000000000CPU-X-5.0.3/src/CMakeLists.txt000066400000000000000000000204211454622605200157070ustar00rootroot00000000000000### FIND NEEDED LIBRAIRIES # GTK3+ if(WITH_GTK) set(MINIMUM_GTK_VERSION 3.12.0) pkg_check_modules(GTK3 gtkmm-3.0>=${MINIMUM_GTK_VERSION}) if(GTK3_FOUND) include_directories(${GTK3_INCLUDE_DIRS}) link_directories(${GTK3_LIBRARY_DIRS}) add_definitions(${GTK3_CFLAGS_OTHER}) add_library(gui_gtk STATIC gui_gtk.cpp gui_gtk.hpp ${GRESOURCES} ) set(GTK3_LIBRARIES "gui_gtk" ${GTK3_LIBRARIES}) else(GTK3_FOUND) message("${BoldYellow}GTK3+ GUI will not be build:${ColourReset} ${Yellow}GTK ${MINIMUM_GTK_VERSION} or higher is needed.${ColourReset}") message("${Yellow}Set ${BoldYellow}PKG_CONFIG_PATH${ColourReset}${Yellow} environment variable if development files are installed.${ColourReset}") endif(GTK3_FOUND) endif(WITH_GTK) # NCurses if(WITH_NCURSES) # Assume ncurses from the base on FreeBSD if(${CMAKE_SYSTEM_NAME} MATCHES "FreeBSD") set(NCURSES_FOUND 1) set(NCURSES_LIBRARIES "-l:libncursesw.so") else() pkg_check_modules(NCURSES ncursesw) endif() if(NCURSES_FOUND) include_directories(${NCURSES_INCLUDE_DIRS}) link_directories(${NCURSES_LIBRARY_DIRS}) add_library(tui_ncurses STATIC tui_ncurses.cpp tui_ncurses.hpp ) set(NCURSES_LIBRARIES "tui_ncurses" ${NCURSES_LIBRARIES}) endif(NCURSES_FOUND) endif(WITH_NCURSES) # Gettext if(Intl_FOUND) include_directories(${Intl_INCLUDE_DIRS}) endif(Intl_FOUND) # Libcpuid if(WITH_LIBCPUID) pkg_check_modules(LIBCPUID libcpuid>=0.6.0) if(LIBCPUID_FOUND) include_directories(${LIBCPUID_INCLUDE_DIRS}) link_directories(${LIBCPUID_LIBRARY_DIRS}) add_definitions(${LIBCPUID_CFLAGS_OTHER}) set(CMAKE_REQUIRED_LIBRARIES ${LIBCPUID_LIBRARIES}) endif(LIBCPUID_FOUND) endif(WITH_LIBCPUID) # Libpci if(WITH_LIBPCI) pkg_check_modules(LIBPCI libpci) if(LIBPCI_FOUND) include_directories(${LIBPCI_INCLUDE_DIRS}) link_directories(${LIBPCI_LIBRARY_DIRS}) add_definitions(${LIBPCI_CFLAGS_OTHER}) endif(LIBPCI_FOUND) endif(WITH_LIBPCI) # Libglfw if(WITH_LIBGLFW) pkg_check_modules(LIBGL gl) pkg_check_modules(LIBGLFW glfw3>=3.3) if(LIBGL_FOUND AND LIBGLFW_FOUND) include_directories(${LIBGL_INCLUDE_DIRS} ${LIBGLFW_INCLUDE_DIRS}) link_directories(${LIBGL_LIBRARY_DIRS} ${LIBGLFW_LIBRARY_DIRS}) add_definitions(${LIBGL_CFLAGS_OTHER} ${LIBGLFW_CFLAGS_OTHER}) endif(LIBGL_FOUND AND LIBGLFW_FOUND) endif(WITH_LIBGLFW) # Vulkan if(WITH_VULKAN) pkg_check_modules(VULKAN vulkan) if(VULKAN_FOUND) include_directories(${VULKAN_INCLUDE_DIRS}) link_directories(${VULKAN_LIBRARY_DIRS}) add_definitions(${VULKAN_CFLAGS_OTHER}) endif(VULKAN_FOUND) endif(WITH_VULKAN) # OpenCL if(WITH_OPENCL) pkg_check_modules(OPENCL OpenCL) if(OPENCL_FOUND) include_directories(${LIBOPENCL_INCLUDE_DIRS} ${OpenCL_INCLUDE_DIRS}) link_directories(${LIBOPENCL_LIBRARY_DIRS} ${OpenCL_LIBRARY_DIRS}) add_definitions(${LIBOPENCL_CFLAGS_OTHER} ${OpenCL_CFLAGS_OTHER}) endif(OPENCL_FOUND) endif(WITH_OPENCL) # Libprocps set(LIBSYSTEM 0) set(LIBPROC2 -1) if(WITH_LIBPROCPS AND ${CMAKE_SYSTEM_NAME} MATCHES "Linux" AND NOT FORCE_LIBSTATGRAB) pkg_check_modules(LIBPROC2 libproc2) if(LIBPROC2_FOUND) include_directories(${LIBPROC2_INCLUDE_DIRS}) link_directories(${LIBPROC2_LIBRARY_DIRS}) add_definitions(${LIBPROC2_CFLAGS_OTHER}) set(LIBSYSTEM 1) set(LIBPROC2 1) else() pkg_check_modules(LIBPROCPS libprocps) set(LIBPROC2 0) endif() if(LIBPROCPS_FOUND) include_directories(${LIBPROCPS_INCLUDE_DIRS}) link_directories(${LIBPROCPS_LIBRARY_DIRS}) add_definitions(${LIBPROCPS_CFLAGS_OTHER}) set(LIBSYSTEM 1) endif(LIBPROCPS_FOUND) endif(WITH_LIBPROCPS AND ${CMAKE_SYSTEM_NAME} MATCHES "Linux" AND NOT FORCE_LIBSTATGRAB) # Libstatgrab if(WITH_LIBSTATGRAB AND (NOT ${CMAKE_SYSTEM_NAME} MATCHES "Linux" OR FORCE_LIBSTATGRAB)) pkg_check_modules(LIBSTATGRAB libstatgrab) if(LIBSTATGRAB_FOUND) include_directories(${LIBSTATGRAB_INCLUDE_DIRS}) link_directories(${LIBSTATGRAB_LIBRARY_DIRS}) add_definitions(${LIBSTATGRAB_CFLAGS_OTHER}) set(LIBSYSTEM 2) endif(LIBSTATGRAB_FOUND) endif(WITH_LIBSTATGRAB AND (NOT ${CMAKE_SYSTEM_NAME} MATCHES "Linux" OR FORCE_LIBSTATGRAB)) # Dmidecode if(WITH_DMIDECODE) add_subdirectory(dmidecode) include_directories(dmidecode) set(DMIDECODE_LIBRARIES "dmidecode") endif(WITH_DMIDECODE) # Bandwidth if(WITH_BANDWIDTH) add_subdirectory(bandwidth) if(BANDWIDTH_FOUND) include_directories(bandwidth) set(BANDWIDTH_LIBRARIES "bandwidth") endif(BANDWIDTH_FOUND) endif(WITH_BANDWIDTH) ### FINAL CONFIG message("${BoldCyan}** ${CMAKE_PROJECT_NAME} ${PROJECT_VERSION} configuration **${ColourReset}") # UI libraries print_config("GTK" "${GTK3_VERSION}" GTK3_FOUND WITH_GTK) print_config("NCURSES" "${NCURSES_VERSION}" NCURSES_FOUND WITH_NCURSES) # Other libraries print_config("GETTEXT" 0 GETTEXT_FOUND WITH_GETTEXT) print_config("LIBCPUID" "${LIBCPUID_VERSION}" LIBCPUID_FOUND WITH_LIBCPUID) print_config("LIBPCI" "${LIBPCI_VERSION}" LIBPCI_FOUND WITH_LIBPCI) print_config("LIBGLFW" "${LIBGLFW_VERSION}" LIBGLFW_FOUND WITH_LIBGLFW) print_config("Vulkan" "${VULKAN_VERSION}" VULKAN_FOUND WITH_VULKAN) print_config("OpenCL" "${OPENCL_VERSION}" OPENCL_FOUND WITH_OPENCL) if(${CMAKE_SYSTEM_NAME} MATCHES "Linux" AND NOT FORCE_LIBSTATGRAB) if(${LIBPROC2} EQUAL 1) print_config("LIBPROC2" "${LIBPROC2_VERSION}" LIBPROC2_FOUND WITH_LIBPROCPS) else() print_config("LIBPROCPS" "${LIBPROCPS_VERSION}" LIBPROCPS_FOUND WITH_LIBPROCPS) endif() else() print_config("LIBSTATGRAB" "${LIBSTATGRAB_VERSION}" LIBSTATGRAB_FOUND WITH_LIBSTATGRAB) endif() # Subprojects print_config("DMIDECODE" "${DMIDECODE_VERSION}" 1 WITH_DMIDECODE) print_config("BANDWIDTH" "${BANDWIDTH_VERSION}" BANDWIDTH_FOUND WITH_BANDWIDTH) ### MAIN BINARY # Executable add_executable(${APP_EXEC} core.cpp core.hpp daemon_client.cpp daemon_client.hpp daemon.h data.cpp data.hpp logger.cpp logger.hpp main.cpp options.cpp options.hpp util.cpp util.hpp ) add_executable(${DAEMON_EXEC} daemon_server.cpp daemon_server.hpp daemon.h logger.cpp logger.hpp options.cpp options.hpp util.cpp util.hpp ) # Libsystem extra-definitions if(${LIBSYSTEM} EQUAL 0 OR ${LIBSYSTEM} EQUAL 1) # When Libprocps is used add_definitions(-DHAS_LIBSTATGRAB=0 -DLIBSTATGRAB_VERSION=NULL) if(${LIBPROC2} EQUAL 1) add_definitions(-DHAS_LIBPROCPS=0 -DLIBPROCPS_VERSION=NULL) else(${LIBPROC2} EQUAL 0) add_definitions(-DHAS_LIBPROC2=0 -DLIBPROC2_VERSION=NULL) endif() endif() if(${LIBSYSTEM} EQUAL 0 OR ${LIBSYSTEM} EQUAL 2) # When Libstatgrab is used add_definitions(-DHAS_LIBPROC2=0 -DLIBPROC2_VERSION=NULL) add_definitions(-DHAS_LIBPROCPS=0 -DLIBPROCPS_VERSION=NULL) endif() # Flatpak workarounds if(FLATPAK) add_definitions(-DFLATPAK) set(DAEMON_SOCKET cpu-x.sock) if(LIBCPUID_FOUND) # flatpak-spawn command will not be able to find libcpuid.so when starting cpu-x-daemon set(LIBCPUID_LIBRARIES "-l:libcpuid.a") endif(LIBCPUID_FOUND) endif(FLATPAK) # Various definitions add_definitions(-DPRGVER="${PROJECT_VERSION}" -DGITREV="${GIT_REVISION}" -DSYSTEM_NAME="${CMAKE_SYSTEM_NAME}" -DSYSTEM_PROCESSOR="${CMAKE_SYSTEM_PROCESSOR}" -DC_COMPILER_ID="${CMAKE_C_COMPILER_ID}" -DHAS_LIBSYSTEM=${LIBSYSTEM} -DGETTEXT_PACKAGE="${CMAKE_PROJECT_NAME}" -DLOCALEDIR="${CMAKE_INSTALL_FULL_LOCALEDIR}" -DTERMINFODIR="/lib/terminfo" -DDAEMON_EXEC="${DAEMON_EXEC}" -DDAEMON_TMP_EXEC="/tmp/${DAEMON_EXEC}" -DDAEMON_PATH="${DAEMON_PATH}" -DSOCKET_NAME="${DAEMON_SOCKET}" ) # Link libraries target_link_libraries(${APP_EXEC} ${Intl_LIBRARIES} ${CMAKE_THREAD_LIBS_INIT} ${Backtrace_LIBRARIES} std::filesystem ${GTK3_LIBRARIES} ${NCURSES_LIBRARIES} ${LIBCPUID_LIBRARIES} ${LIBPCI_LIBRARIES} ${LIBGL_LIBRARIES} ${LIBGLFW_LIBRARIES} ${VULKAN_LIBRARIES} ${OPENCL_LIBRARIES} ${LIBPROC2_LIBRARIES} ${LIBPROCPS_LIBRARIES} ${LIBSTATGRAB_LIBRARIES} ${DMIDECODE_LIBRARIES} ${BANDWIDTH_LIBRARIES} ${OTHER_LIBRARIES} ) target_link_libraries(${DAEMON_EXEC} ${DAEMON_FLAGS} ${Intl_LIBRARIES} ${CMAKE_THREAD_LIBS_INIT} std::filesystem ${LIBCPUID_LIBRARIES} ${DMIDECODE_LIBRARIES} ) ### INSTALLATION install(TARGETS ${APP_EXEC} DESTINATION ${CMAKE_INSTALL_FULL_BINDIR}/) install(TARGETS ${DAEMON_EXEC} DESTINATION ${CMAKE_INSTALL_FULL_LIBEXECDIR}/) CPU-X-5.0.3/src/bandwidth/000077500000000000000000000000001454622605200151145ustar00rootroot00000000000000CPU-X-5.0.3/src/bandwidth/BMP.c000066400000000000000000000362751454622605200157130ustar00rootroot00000000000000 /*============================================================================= bmplib, a simple library to create, modify, and write BMP image files. Copyright (C) 2009-2014 by Zack T Smith. 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., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA The author may be reached at 1@zsmith.co. *============================================================================*/ //-------------------------------------------------- // Change Log // 0.8 ZS Added larger font of my own design. // 0.9 ZS Removed attempt at anti-aliasing. //-------------------------------------------------- #include #include #include #include "BMP.h" #include "font.h" #include "minifont.h" // Narrowest possible numbers. static char* narrow_nums [] = { " # ", "# #", "# #", "# #", "# #", "# #", " # ", " #", "##", " #", " #", " #", " #", " #", " # ", "# #", " #", " ##", "# ", "# ", "###", "###", " #", " # ", "## ", " #", "# #", " # ", "# #", "# #", "# #", "###", " #", " #", " #", "###", "# ", "## ", " #", " #", "# #", " # ", " # ", "# ", "# ", "## ", "# #", "# #", " # ", "###", " #", " #", " # ", " # ", " # ", " # ", " # ", "# #", "# #", " # ", "# #", "# #", " # ", " # ", "# #", "# #", " ##", " #", " # ", "# ", " ", "", "", " ", "", "", "#", }; /*--------------------------------------------------------------------------- * Name: BMP_new * Purpose: Creates new image. *-------------------------------------------------------------------------*/ BMP* BMP_new (int w, int h) { unsigned long size; BMP* nu; if (w<1 || h<1) return NULL; //---------- if (w & 3) w += 4 - (w & 3); if (h & 3) h += 4 - (h & 3); nu = (BMP*) malloc (sizeof (BMP)); if (!nu) return NULL; memset (nu, 0, sizeof (BMP)); nu->width = w; nu->height = h; size = w * h * sizeof (long); nu->pixels = (RGB*) malloc (size); if (!nu->pixels) { free (nu); return NULL; } memset (nu->pixels, 0, size); return nu; } /*--------------------------------------------------------------------------- * Name: BMP_destroy * Purpose: Deallocates image. *-------------------------------------------------------------------------*/ void BMP_destroy (BMP* bmp) { if (!bmp) return; //---------- if (bmp->pixels) free (bmp->pixels); free (bmp); } /*--------------------------------------------------------------------------- * Name: BMP_point * Purpose: Writes pixel into image. *-------------------------------------------------------------------------*/ void BMP_point (BMP *bmp, int x, int y, RGB rgb) { if (!bmp || x<0 || y<0) return; if (x >= bmp->width || y >= bmp->height) return; if (!bmp->pixels) return; //---------- bmp->pixels[y*bmp->width + x] = rgb; } /*--------------------------------------------------------------------------- * Name: BMP_line_core * Purpose: Draws a line in a BMP image. *-------------------------------------------------------------------------*/ void BMP_line_core (BMP *bmp, int x0, int y0, int x1, int y1, RGB rgb, int dashed) { if ((rgb >> 24) == 0xff) return; int dot_counter = 0; if (!dashed && x0 == x1 && y0 == y1) BMP_point (bmp, x0, y0, rgb); else if (!dashed && x0 == x1) BMP_vline (bmp, x0, y0, y1, rgb); else if (!dashed && y0 == y1) BMP_hline (bmp, x0, x1, y0, rgb); else { int j, x, y, dx, dy, e, xchange, s1, s2; // DDA, copied from my FramebufferUI project. x = x0; y = y0; s1 = 1; s2 = 1; dx = x1 - x0; if (dx < 0) { dx = -dx; s1 = -1; } dy = y1 - y0; if (dy < 0) { dy = -dy; s2 = -1; } xchange = 0; if (dy > dx) { int tmp = dx; dx = dy; dy = tmp; xchange = 1; } e = (dy<<1) - dx; j = 0; while (j <= dx) { j++; int draw = 1; if (dashed && (1 & (dot_counter >> 2))) draw = 0; if (draw) BMP_point (bmp, x, y, rgb); dot_counter++; if (e >= 0) { if (xchange) x += s1; else y += s2; e -= (dx << 1); } if (xchange) y += s2; else x += s1; e += (dy << 1); } } } /*--------------------------------------------------------------------------- * Name: BMP_line * Purpose: Draws a line in a BMP image. *-------------------------------------------------------------------------*/ void BMP_line (BMP *bmp, int x0, int y0, int x1, int y1, RGB rgb) { BMP_line_core (bmp, x0, y0, x1, y1, rgb, 0); } /*--------------------------------------------------------------------------- * Name: BMP_line_dashed * Purpose: Draws a dashed line in a BMP image. *-------------------------------------------------------------------------*/ void BMP_line_dashed (BMP *bmp, int x0, int y0, int x1, int y1, RGB rgb) { BMP_line_core (bmp, x0, y0, x1, y1, rgb, 1); } /*--------------------------------------------------------------------------- * Name: BMP_rect * Purpose: Fills a rectangle with a color. *-------------------------------------------------------------------------*/ void BMP_rect (BMP *bmp, int x, int y, int w, int h, RGB rgb) { BMP_hline (bmp, x, x+w-1, y, rgb); BMP_hline (bmp, x, x+w-1, y+h-1, rgb); BMP_vline (bmp, x, y, y+h-1, rgb); BMP_vline (bmp, x+w-1, y, y+h-1, rgb); } /*--------------------------------------------------------------------------- * Name: BMP_fillrect * Purpose: Fills a rectangle with a color. *-------------------------------------------------------------------------*/ void BMP_fillrect (BMP *bmp, int x, int y, int w, int h, RGB rgb) { while (h > 0) { BMP_hline (bmp, x, x+w-1, y, rgb); h--; y++; } } /*--------------------------------------------------------------------------- * Name: BMP_clear * Purpose: Sets all pixels to specified color. *-------------------------------------------------------------------------*/ void BMP_clear (BMP *bmp, RGB rgb) { BMP_fillrect (bmp, 0, 0, bmp->width, bmp->height, rgb); } /*--------------------------------------------------------------------------- * Name: BMP_hline * Purpose: Draws horizontal line. *-------------------------------------------------------------------------*/ void BMP_hline (BMP *bmp, int x0, int x1, int y, RGB rgb) { if (x0 > x1) { int tmp=x1; x1=x0; x0=tmp; } while (x0 <= x1) { BMP_point (bmp, x0++, y, rgb); } } /*--------------------------------------------------------------------------- * Name: BMP_vline * Purpose: Draws vertical line. *-------------------------------------------------------------------------*/ void BMP_vline (BMP *bmp, int x, int y0, int y1, RGB rgb) { if (y0 > y1) { int tmp=y1; y1=y0; y0=tmp; } while (y0 <= y1) { BMP_point (bmp, x, y0++, rgb); } } /*--------------------------------------------------------------------------- * Name: BMP_draw_string * Purpose: Draws ature 5x8 characters into the image. *-------------------------------------------------------------------------*/ int BMP_draw_string (BMP *bmp, const char *string, int x, int y, RGB color) { char ch; const char *s; if (!bmp || !string) return 0; if (x >= bmp->width || y >= bmp->height || !*string) return 0; //---------- #if 0 RGB r,g,b; RGB light; RGB dark; r = 0xff & (color >> 16); g = 0xff & (color >> 8); b = 0xff & color; r += 3*0xff; b += 3*0xff; g += 3*0xff; r /= 4; g /= 4; b /= 4; light = b | (g << 8) | (r << 16); r = 0xff & (color >> 16); g = 0xff & (color >> 8); b = 0xff & color; r += 0xff; b += 0xff; g += 0xff; r /= 2; g /= 2; b /= 2; dark = b | (g << 8) | (r << 16); #endif const char **chars = get_font_chars (); s = string; while ((ch = *s++)) { int ix = -1; if (ch == ' ') { x += 10; continue; } if (ch > 'z') continue; if (ch > ' ' && ch <= 'z') ix = FONT_HEIGHT * (ch - 33); if (ix >= 0) { int i; int width = 0; for (i=0; i 'z') continue; if (ch > ' ' && ch <= 'z') ix = FONT_HEIGHT * (ch - 33); if (ix >= 0) { int j; int max_w = 0; for (j = 0; j < FONT_HEIGHT; j++) { const char *ptr = _chars [j+ix]; int w = ptr ? strlen (ptr) : 0; if (max_w < w) max_w = w; } width += max_w + 2/* kerning */; } } return width; } /*--------------------------------------------------------------------------- * Name: BMP_draw_mini_string * Purpose: Draws miniature 5x8 characters into the image. *-------------------------------------------------------------------------*/ int BMP_draw_mini_string (BMP *bmp, const char *string, int x, int y, RGB color) { char ch; const char *s; if (!bmp || !string) return 0; if (x >= bmp->width || y >= bmp->height || !*string) return 0; //---------- #if 0 unsigned long r,g,b; unsigned long light, dark; r = 0xff & (color >> 16); g = 0xff & (color >> 8); b = 0xff & color; r += 3*0xff; b += 3*0xff; g += 3*0xff; r /= 4; g /= 4; b /= 4; light = b | (g << 8) | (r << 16); r = 0xff & (color >> 16); g = 0xff & (color >> 8); b = 0xff & color; r += 0xff; b += 0xff; g += 0xff; r /= 2; g /= 2; b /= 2; dark = b | (g << 8) | (r << 16); #endif const char **mini_chars = get_minifont_chars (); #define MINI_HEIGHT (8) s = string; while ((ch = *s++)) { int ix = -1; if (ch == ' ') { x += 5; continue; } if (ch > 'z') continue; if (ch > ' ' && ch <= 'z') ix = MINI_HEIGHT * (ch - 33); if (ix >= 0) { int i; int width = 0; for (i=0; i 'z') continue; if (ch > ' ' && ch <= 'z') ix = MINI_HEIGHT * (ch - 33); if (ix >= 0) { int max_w = 0; int j; for (j = 0; j < MINI_HEIGHT; j++) { const char *ptr = mini_chars [j+ix]; int w = ptr ? strlen (ptr) : 0; if (max_w < w) max_w = w; } width += max_w + 1/*kerning*/; } } return width; } /*--------------------------------------------------------------------------- * Name: BMP_narrow_numbers * Purpose: Draws miniature 4x7 characters into the image. *-------------------------------------------------------------------------*/ int BMP_draw_narrow_numbers (BMP *bmp, const char *string, int x, int y, RGB color) { char ch; const char *s; if (!bmp || !string) return 0; if (x >= bmp->width || y >= bmp->height || !*string) return 0; //---------- #define NARROW_HEIGHT (7) s = string; while ((ch = *s++)) { int ix = -1; if (ch == ' ') { x += 3; continue; } if (ch >= '0' && ch <= '9') ix = ch - '0'; else if (ch == '.') ix = 10; ix *= NARROW_HEIGHT; if (ix >= 0) { int i; int width = strlen (narrow_nums [ix]); for (i=0; i= bmp->width || y >= bmp->height) return 0; if (!bmp->pixels) return 0; //---------- return bmp->pixels[y*bmp->width + x]; } /*--------------------------------------------------------------------------- * Name: BMP_write * Purpose: Writes image to BMP file. *-------------------------------------------------------------------------*/ int BMP_write (const BMP* bmp, const char *path) { FILE *f; #define HDRLEN (54) unsigned char h[HDRLEN]; unsigned long len; int i, j; if (!bmp || !path) return -1; //---------- memset (h, 0, HDRLEN); //-------------------- // Create the file. // f = fopen (path, "wb"); if (!f) return 0; //-------------------- // Prepare header // len = HDRLEN + 3 * bmp->width * bmp->height; h[0] = 'B'; h[1] = 'M'; h[2] = len & 0xff; h[3] = (len >> 8) & 0xff; h[4] = (len >> 16) & 0xff; h[5] = (len >> 24) & 0xff; h[10] = HDRLEN; h[14] = 40; h[18] = bmp->width & 0xff; h[19] = (bmp->width >> 8) & 0xff; h[20] = (bmp->width >> 16) & 0xff; h[22] = bmp->height & 0xff; h[23] = (bmp->height >> 8) & 0xff; h[24] = (bmp->height >> 16) & 0xff; h[26] = 1; h[28] = 24; h[34] = 16; h[36] = 0x13; // 2835 pixels/meter h[37] = 0x0b; h[42] = 0x13; // 2835 pixels/meter h[43] = 0x0b; //-------------------- // Write header. // if (HDRLEN != fwrite (h, 1, HDRLEN, f)) { fclose (f); return 0; } //---------------------------------------- // Write pixels. // Note that BMP has lower rows first. // for (j=bmp->height-1; j >= 0; j--) { for (i=0; i < bmp->width; i++) { unsigned char rgb[3]; int ix = i + j * bmp->width; unsigned long pixel = bmp->pixels[ix]; rgb[0] = pixel & 0xff; rgb[1] = (pixel >> 8) & 0xff; rgb[2] = (pixel >> 16) & 0xff; if (3 != fwrite (rgb, 1, 3, f)) { fclose (f); return 0; } } } fclose (f); return 1; } CPU-X-5.0.3/src/bandwidth/BMP.h000066400000000000000000000062321454622605200157060ustar00rootroot00000000000000 /*============================================================================= bmplib, a simple library to create, modify, and write BMP image files. Copyright (C) 2009-2014 by Zack T Smith. 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., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA The author may be reached at 1@zsmith.co. *============================================================================*/ #ifndef _BMP_H #define _BMP_H #include #define BMPLIB_RELEASE "0.9" #define BMPLIB_RELEASE_MAJOR 0 #define BMPLIB_RELEASE_MINOR 9 typedef uint32_t RGB; typedef uint32_t RGBA; typedef struct { int width, height; RGB *pixels; } BMP; #define FONT_HEIGHT (17) #define MINIFONT_HEIGHT (8) extern BMP* BMP_new (int, int); extern void BMP_destroy (BMP*); extern void BMP_clear (BMP*, RGB); extern int BMP_write (const BMP*, const char *path); extern void BMP_point (BMP*, int, int, RGB); extern void BMP_line (BMP *, int x0, int y0, int x1, int y1, RGB); extern void BMP_line_dashed (BMP *, int x0, int y0, int x1, int y1, RGB); extern void BMP_hline (BMP *, int x0, int x1, int y, RGB); extern void BMP_vline (BMP *, int x, int y0, int y1, RGB); extern void BMP_rect (BMP *, int x, int y, int w, int h, RGB); extern void BMP_fillrect (BMP *, int x, int y, int w, int h, RGB); extern RGB BMP_getpixel (BMP*, int, int); extern int BMP_draw_string (BMP *, const char *, int x, int y, RGB); extern int BMP_string_width (const char *); extern int BMP_draw_mini_string (BMP *, const char *, int x, int y, RGB); extern int BMP_mini_string_width (const char *); #define RGB_BLACK (0) #define RGB_BLUE (0xff) #define RGB_BRASS (0xc3a368) #define RGB_BROWN (0x8b4513) #define RGB_CADETBLUE (0x5f9ea0) #define RGB_CHARTREUSE (0x7fff00) #define RGB_CORAL (0xff7f50) #define RGB_CYAN (0xffff) #define RGB_DARKGREEN (0x6400) #define RGB_DARKKHAKI (0xbdb76b) #define RGB_DARKOLIVEGREEN (0x556b2f) #define RGB_DARKORANGE (0xff8c00) #define RGB_DODGERBLUE (0x1e90ff) #define RGB_GOLDENROD (0xdaa520) #define RGB_GRAY (0xc0c0c0) #define RGB_GREEN (0xff00) #define RGB_KHAKI (0xf0e68c) #define RGB_LEMONYELLOW (0xfde910) #define RGB_MAGENTA (0xff00ff) #define RGB_MAROON (0x800000) #define RGB_NAVYBLUE (0x80) #define RGB_ORANGE (0xffa500) #define RGB_PINK (0xf77fbe) #define RGB_PURPLE (0xa020f0) #define RGB_RED (0xff0000) #define RGB_ROYALBLUE (0x4169e1) #define RGB_SALMON (0xfa8072) #define RGB_TURQUOISE (0x40e0d0) #define RGB_VIOLET (0xee82ee) #define RGB_WHITE (0xffffff) #define RGB_YELLOW (0xffff00) #define RGB_GRAY6 (0x606060) #define RGB_GRAY8 (0x808080) #define RGB_GRAY10 (0xa0a0a0) #define RGB_GRAY12 (0xc0c0c0) #define RGB_GRAY14 (0xe0e0e0) #endif CPU-X-5.0.3/src/bandwidth/BMPGraphing.c000066400000000000000000000307211454622605200173610ustar00rootroot00000000000000/*============================================================================ BMPGraphing, a library for graphing. Copyright (C) 2005-2017 by Zack T Smith. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA The author may be reached at 1@zsmith.co. *===========================================================================*/ #include #include #include #include #include "BMP.h" #include "BMPGraphing.h" //---------------------------------------------------------------------------- // Name: BMPGraphing_draw_labels_log2 // Purpose: Draw the labels and ticks. //---------------------------------------------------------------------------- void BMPGraphing_draw_labels_log2 (BMPGraph* graph) { if (!graph || !graph->image) return; //---------------------------------------- // Horizontal // // Establish min & max x values. // int i = 0; Value min_x = 0x4000000000000000; Value max_x = 0; for (i = 0; i < graph->data_index; i += 2) { Value type = graph->data[i]; Value value = graph->data[i+1]; if (type == DATUM_X) { if (value < min_x) min_x = value; if (value > max_x) max_x = value; } } graph->min_x = (long long) log2 (min_x); graph->max_x = (long long) ceil (log2 (max_x)); for (i = graph->min_x; i <= graph->max_x; i++) { char str [200]; int x = graph->left_margin + ((i-graph->min_x) * graph->x_span) / (graph->max_x - graph->min_x); int y = graph->height - graph->margin + 10; unsigned long y2 = 1 << i; if (y2 < 1536) snprintf (str, 199, "%ld B", y2); else if (y2 < (1<<20)) { snprintf (str, 199, "%ld kB", y2 >> 10); } else { Value j = y2 >> 20; switch ((y2 >> 18) & 3) { case 0: snprintf (str, 199, "%lld MB", (unsigned long long) j); break; case 1: snprintf (str, 199, "%lld.25 MB", (unsigned long long) j); break; case 2: snprintf (str, 199, "%lld.5 MB", (unsigned long long) j); break; case 3: snprintf (str, 199, "%lld.75 MB", (unsigned long long) j); break; } } BMP_vline (graph->image, x, y, y - 10, RGB_BLACK); BMP_draw_mini_string (graph->image, str, x - 10, y + 8, RGB_BLACK); } //---------------------------------------- // Vertical // // Establish min & max y values. // Value min_y = 0x4000000000000000; Value max_y = 0; for (i = 0; i < graph->data_index; i += 2) { Value type = graph->data[i]; Value value = graph->data[i+1]; if (type == DATUM_Y) { if (value < min_y) min_y = value; if (value > max_y) max_y = value; } } graph->min_y = min_y; graph->max_y = max_y; int font_height = 10; int available_height = graph->y_span; int max_labels = available_height / font_height; int preferred_n_labels = graph->max_y/10000; int actual_n_labels; float multiplier = 1; if (preferred_n_labels < max_labels) { actual_n_labels = preferred_n_labels; } else { actual_n_labels = max_labels; multiplier = preferred_n_labels / (float) actual_n_labels; } for (i = 0; i <= actual_n_labels; i++) { char str [200]; int x = graph->left_margin - 10; int y = graph->height - graph->margin - (i * graph->y_span) / (float)actual_n_labels; BMP_hline (graph->image, x, x+10, y, RGB_BLACK); int value = (int) (i * multiplier); snprintf (str, 199, "%d GB/s", value); BMP_draw_mini_string (graph->image, str, x - 40, y - MINIFONT_HEIGHT/2, RGB_BLACK); } } BMPGraph * BMPGraphing_new (int w, int h, int x_axis_mode) { if (x_axis_mode != MODE_X_AXIS_LINEAR && x_axis_mode != MODE_X_AXIS_LOG2) return NULL; BMPGraph *graph = (BMPGraph*) malloc (sizeof(BMPGraph)); if (!graph) return NULL; bzero (graph, sizeof(BMPGraph)); graph->x_axis_mode = x_axis_mode; if (w <= 0 || h <= 0) { w = 1920; h = 1080; } graph->width = w; graph->height = h; graph->image = BMP_new (w, h); graph->margin = 40; graph->left_margin = 80; BMP_clear (graph->image, RGB_WHITE); BMP_hline (graph->image, graph->left_margin, graph->width - graph->margin, graph->height - graph->margin, RGB_BLACK); BMP_vline (graph->image, graph->left_margin, graph->margin, graph->height - graph->margin, RGB_BLACK); graph->x_span = graph->width - (graph->margin + graph->left_margin); graph->y_span = graph->height - 2 * graph->margin; graph->legend_y = graph->margin; return graph; } void BMPGraphing_set_title (BMPGraph* graph, const char *title) { if (!graph || !title) return; if (graph->title) free (graph->title); graph->title = strdup (title); BMP_draw_string (graph->image, graph->title, graph->left_margin, graph->margin/2, RGB_BLACK); } void BMPGraphing_new_line (BMPGraph *graph, const char *str, RGB color) { if (!graph || !graph->image) return; BMP_draw_string (graph->image, str, graph->width - graph->margin - 370, graph->legend_y, 0xffffff & color); graph->legend_y += 17; graph->fg = 0; graph->last_x = graph->last_y = -1; if (graph->data_index >= MAX_GRAPH_DATA-2) return; // error ("Too many graph data."); graph->data [graph->data_index++] = DATUM_COLOR; graph->data [graph->data_index++] = color; } //---------------------------------------------------------------------------- // Name: BMPGraphing_add_point // Purpose: Adds a point to this list to be drawn. //---------------------------------------------------------------------------- void BMPGraphing_add_point (BMPGraph *graph, Value x, Value y) { if (!graph || !graph->image) return; if (graph->data_index >= MAX_GRAPH_DATA-4) return; // error ("Too many graph data."); graph->data [graph->data_index++] = DATUM_X; graph->data [graph->data_index++] = x; graph->data [graph->data_index++] = DATUM_Y; graph->data [graph->data_index++] = y; } //---------------------------------------------------------------------------- // Name: BMPGraphing_plot_log2 // Purpose: Plots a point on the current graph. //---------------------------------------------------------------------------- void BMPGraphing_plot_log2 (BMPGraph *graph, Value x, Value y) { if (!graph || !graph->image) return; //---------------------------------------- // Plot the point. The x axis is // logarithmic, base 2. // double tmp = log2 (x); tmp -= (double) graph->min_x; tmp *= (double) graph->x_span; tmp /= (double) (graph->max_x - graph->min_x); int x2 = graph->left_margin + (int) tmp; int y2 = graph->height - graph->margin - (y * graph->y_span) / graph->max_y; if (graph->last_x != -1 && graph->last_y != -1) { if (graph->fg & DASHED) BMP_line_dashed (graph->image, graph->last_x, graph->last_y, x2, y2, graph->fg & 0xffffff); else BMP_line (graph->image, graph->last_x, graph->last_y, x2, y2, graph->fg); } graph->last_x = x2; graph->last_y = y2; } //---------------------------------------------------------------------------- // Name: BMPGraphing_plot_linear // Purpose: Plots a point on the current graph. //---------------------------------------------------------------------------- void BMPGraphing_plot_linear (BMPGraph *graph, Value x, Value y, Value max_y) { if (!graph || !graph->image) return; //---------------------------------------- // Plot the point. The x axis is // logarithmic, base 2. The units of the // y value is kB. // double tmp = 10. + log2 (x); tmp -= (double) XVALUE_MIN; tmp *= (double) graph->x_span; tmp /= (double) (XVALUE_MAX - XVALUE_MIN); int x2 = graph->left_margin + (int) tmp; int y2 = graph->height - graph->margin - (y * graph->y_span) / max_y; //printf ("\tx=%d, y=%d\n",x,y); fflush(stdout); if (graph->last_x != -1 && graph->last_y != -1) { if (graph->fg & DASHED) BMP_line_dashed (graph->image, graph->last_x, graph->last_y, x2, y2, graph->fg & 0xffffff); else BMP_line (graph->image, graph->last_x, graph->last_y, x2, y2, graph->fg); } graph->last_x = x2; graph->last_y = y2; } //---------------------------------------------------------------------------- // Name: BMPGraphing_make_log2 // Purpose: Plots all lines. //---------------------------------------------------------------------------- static void BMPGraphing_make_log2 (BMPGraph *graph) { if (!graph || !graph->image) return; BMPGraphing_draw_labels_log2 (graph); //---------------------------------------- // OK, now draw the lines. // int i; int x = -1, y = -1; for (i = 0; i < graph->data_index; i += 2) { Value type = graph->data[i]; Value value = graph->data[i+1]; switch (type) { case DATUM_Y: y = value; break; case DATUM_X: x = value; break; case DATUM_COLOR: graph->fg = (unsigned long) value; graph->last_x = -1; graph->last_y = -1; break; } if (x != -1 && y != -1) { BMPGraphing_plot_log2 (graph, x, y); x = y = -1; } } } //---------------------------------------------------------------------------- // Name: BMPGraphing_make_linear // Purpose: Plots all lines for the network test graph. //---------------------------------------------------------------------------- static void BMPGraphing_make_linear (BMPGraph *graph) { if (!graph || !graph->image) return; int i; // No data if (!graph->data_index) return; //---------------------------------------- // Get the maximum bandwidth in order to // properly scale the graph vertically. // int max_y = 0; for (i = 0; i < graph->data_index; i += 2) { if (graph->data[i] == DATUM_Y) { int y = graph->data [i+1]; if (y > max_y) max_y = y; } } int range = max_y > 10000 ? 2 : (max_y > 1000 ? 1 : 0); int y_spacing = 1; switch (range) { case 2: // Round up to the next 100.00 MB/sec. (=10000). y_spacing = 10000; break; case 1: // Round up to the next 10.00 MB/sec. y_spacing = 1000; break; case 0: // Round up to the next 1.00 MB/sec. y_spacing = 100; break; } max_y /= y_spacing; max_y *= y_spacing; max_y += y_spacing; //---------------------------------------- // Draw the axes, ticks & labels. // // X axis: if (XVALUE_MIN < 10) return; // error ("Minimum y is too small."); for (i = XVALUE_MIN; i <= XVALUE_MAX; i++) { char str[200]; unsigned long y2 = 1 << (i-10); // XX XVALUE_MIN>=10 if (y2 < 1024) snprintf (str, 199, "%u kB", (unsigned int) y2); else snprintf (str, 199, "%lu MB", (unsigned long) (y2 >> 10)); int x = graph->left_margin + ((i - XVALUE_MIN) * graph->x_span) / (XVALUE_MAX - XVALUE_MIN); int y = graph->height - graph->margin + 10; BMP_vline (graph->image, x, y, y-10, RGB_BLACK); BMP_draw_mini_string (graph->image, str, x - 10, y+8, RGB_BLACK); } //---------- // Y axis: // Decide what the tick spacing will be. for (i = 0; i <= max_y; i += y_spacing) { char str[200]; unsigned long whole = i / 100; unsigned long frac = i % 100; snprintf (str, 199, "%lu.%02lu MB/s", whole, frac); int x = graph->left_margin - 10; int y = graph->height - graph->margin - (i * graph->y_span) / max_y; BMP_hline (graph->image, x, x+10, y, RGB_BLACK); BMP_draw_mini_string (graph->image, str, x - 60, y - MINIFONT_HEIGHT/2, RGB_BLACK); } //---------------------------------------- // Draw the data lines. // int x = -1, y = -1; graph->last_x = -1; graph->last_y = -1; for (i = 0; i < graph->data_index; i += 2) { int type = graph->data[i]; long value = graph->data[i+1]; switch (type) { case DATUM_Y: y = value; break; case DATUM_X: x = value; break; case DATUM_COLOR: graph->fg = (unsigned long) value; graph->last_x = -1; graph->last_y = -1; break; } if (x != -1 && y != -1) { BMPGraphing_plot_linear (graph, x, y, max_y); x = y = -1; } } } void BMPGraphing_make (BMPGraph *graph) { if (!graph) return; // XX silent error switch (graph->x_axis_mode) { case MODE_X_AXIS_LOG2: BMPGraphing_make_log2 (graph); break; case MODE_X_AXIS_LINEAR: BMPGraphing_make_linear (graph); break; default: fprintf (stderr, "Invalid graph mode %d.\n", graph->x_axis_mode); break; } } void BMPGraphing_destroy (BMPGraph *graph) { if (!graph) return; if (graph->title) { free (graph->title); graph->title = NULL; } if (graph->image) { BMP_destroy (graph->image); graph->image = NULL; } free (graph); } CPU-X-5.0.3/src/bandwidth/BMPGraphing.h000066400000000000000000000047221454622605200173700ustar00rootroot00000000000000/*============================================================================ BMPGraphing, a library for graphing. Copyright (C) 2005-2017 by Zack T Smith. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA The author may be reached at 1@zsmith.co. *===========================================================================*/ #ifndef _BMPGRAPHING_H #define _BMPGRAPHING_H #ifdef __WIN32__ typedef char bool; enum { true=1, false=0 }; #else #include #endif #include #define BMPGRAPHING_RELEASE "0.3" #define XVALUE_MIN (15) #define XVALUE_MAX (28) enum { DATUM_X=0, DATUM_Y=1, DATUM_COLOR=2, }; typedef uint32_t Coordinate; typedef uint64_t Value; enum { MODE_X_AXIS_LINEAR = 0, MODE_X_AXIS_LOG2 = 1, }; //--------------- // Graphing data. // typedef struct { BMP *image; char *title; unsigned char x_axis_mode; Coordinate width; Coordinate height; Coordinate left_margin; Coordinate margin; Coordinate last_x; Coordinate last_y; Coordinate x_span; Coordinate y_span; Coordinate legend_y; RGB fg; #define MAX_GRAPH_DATA 50000 Value data [MAX_GRAPH_DATA]; int data_index; #define DASHED 0x1000000 // dashed line flag Value max_y; Value min_y; Value min_x; Value max_x; } BMPGraph; extern void BMPGraphing_set_title (BMPGraph*, const char *); extern void BMPGraphing_draw_labels_log2 (BMPGraph*); extern BMPGraph *BMPGraphing_new (int w, int h, int x_axis_mode); extern void BMPGraphing_new_line (BMPGraph *, const char *str, RGB color); extern void BMPGraphing_add_point (BMPGraph *, Value x, Value y); extern void BMPGraphing_plot_log2 (BMPGraph *, Value x, Value y); extern void BMPGraphing_plot_linear (BMPGraph *, Value x, Value y, Value max_amt); extern void BMPGraphing_make (BMPGraph*); extern BMP *BMPGraphing_get_graph (BMPGraph*); extern void BMPGraphing_destroy (BMPGraph*); #endif CPU-X-5.0.3/src/bandwidth/CMakeLists.txt000066400000000000000000000033771454622605200176660ustar00rootroot00000000000000project(bandwidth VERSION "1.5.1" LANGUAGES C ) # Config (bandwidth) set(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -Wno-strict-prototypes -Wno-sign-compare") find_program(NASM_FOUND nasm) if(NASM_FOUND) enable_language(ASM_NASM) endif(NASM_FOUND) if(CMAKE_BUILD_TYPE STREQUAL "Debug" OR CMAKE_BUILD_TYPE STREQUAL "RelWithDebInfo") set(NASM_FLAGS_DEBUG "-gdwarf") endif(CMAKE_BUILD_TYPE STREQUAL "Debug" OR CMAKE_BUILD_TYPE STREQUAL "RelWithDebInfo") # Build (bandwidth) if(CMAKE_ASM_NASM_INFOMATION_LOADED) set(BANDWIDTH_FOUND ON PARENT_SCOPE) message(STATUS "Using built-in ${PROJECT_NAME}, version ${PROJECT_VERSION}") if(BITNESS EQUAL 32) set(ROUTINES "routines-x86-32bit") add_custom_command(OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/${ROUTINES}.o COMMAND ${CMAKE_ASM_NASM_COMPILER} ${NASM_FLAGS_DEBUG} -f elf ${ROUTINES}.asm -o ${CMAKE_CURRENT_BINARY_DIR}/${ROUTINES}.o WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} ) elseif(BITNESS EQUAL 64) set(ROUTINES "routines-x86-64bit") add_custom_command(OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/${ROUTINES}.o COMMAND ${CMAKE_ASM_NASM_COMPILER} ${NASM_FLAGS_DEBUG} -f elf64 ${ROUTINES}.asm -o ${CMAKE_CURRENT_BINARY_DIR}/${ROUTINES}.o WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} ) endif() if(LIBCPUID_FOUND AND WITH_LIBCPUID) add_definitions(-DHAS_LIBCPUID=1) else(LIBCPUID_FOUND AND WITH_LIBCPUID) add_definitions(-DHAS_LIBCPUID=0) endif(LIBCPUID_FOUND AND WITH_LIBCPUID) add_library(bandwidth STATIC BMP.c BMPGraphing.c font.c main.c minifont.c libbandwidth.h ${ROUTINES}.o ) target_link_libraries(bandwidth) set(BANDWIDTH_VERSION ${PROJECT_VERSION} PARENT_SCOPE) else(CMAKE_ASM_NASM_INFOMATION_LOADED) set(BANDWIDTH_FOUND OFF PARENT_SCOPE) endif(CMAKE_ASM_NASM_INFOMATION_LOADED) CPU-X-5.0.3/src/bandwidth/COPYING.txt000066400000000000000000000431331454622605200167710ustar00rootroot00000000000000 GNU GENERAL PUBLIC LICENSE Version 2, June 1991 Copyright (C) 1989, 1991 Free Software Foundation, Inc. 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Library General Public License instead.) You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things. To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it. For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software. Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations. Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all. The precise terms and conditions for copying, distribution and modification follow. GNU GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you". Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does. 1. You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change. b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License. c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program. In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following: a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.) The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code. 4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it. 6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License. 7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 9. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation. 10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Also add information on how to contact you by electronic and paper mail. If the program is interactive, make it output a short notice like this when it starts in an interactive mode: Gnomovision version 69, Copyright (C) year name of author Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, the commands you use may be called something other than `show w' and `show c'; they could even be mouse-clicks or menu items--whatever suits your program. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the program, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the program `Gnomovision' (which makes passes at compilers) written by James Hacker. , 1 April 1989 Ty Coon, President of Vice This General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Library General Public License instead of this License. CPU-X-5.0.3/src/bandwidth/README.md000066400000000000000000000013641454622605200163770ustar00rootroot00000000000000# Bandwidth: a memory bandwidth benchmark Distributed under the terms of the [GNU GPL v2](https://raw.githubusercontent.com/TheTumultuousUnicornOfDarkness/CPU-X/master/src/bandwidth/COPYING.txt). ### CPU-X NOTE This sofware has been patched to be used within CPU-X. You can find the official web page of this project here: https://zsmith.co/bandwidth.html This is based on bandwidth [1.5.1](https://zsmith.co/archives/bandwidth-1.5.1.tar.gz). This software is used to retrieve following data: * Caches tab * L1 cache speed * L2 cache speed * L3 cache speed * L4 cache speed You can reproduce the output of `bandwidth` command by using `cpu-x --bandwidth`. It will produce a graph named `bandwidth.bmp` in the current working directory. CPU-X-5.0.3/src/bandwidth/README.txt000066400000000000000000000127561454622605200166250ustar00rootroot00000000000000 This is the README file for my program, "bandwidth". Bandwidth is a benchmark that attempts to measure memory bandwidth. In December 2010 (and as of release 0.24), I extended 'bandwidth' to measure network bandwidth as well. Bandwidth is useful because both memory bandwidth and network bandwidth need to be measured to give you a clear idea of what your computer(s) can do. Merely relying on specs does not give a full picture and indeed specs can be misleading. -------------------------------------------------- MEMORY BANDWIDTH My program bandwidth performs sequential and random reads and writes of varying sizes. This permits you to infer from the graph how each type of memory is performing. So for instance when bandwidth writes a 256-byte chunk, you know that because caches are normally write-back, this chunk will reside entirely in the L1 cache. Whereas a 512 kB chunk will mainly reside in L2. You could run a non-artificial benchmark and observe that a general performance number is lower on one machine or higher on anotehr, but that may conceal the cause. So the purpose of this program is to help you pinpoint the cause of a performance problem, or to affirm a general impression about a memory- intensive program. It also tells you the best-case scenario e.g. the maximum bandwidth achieved using sequential, 128-bit memory accesses. Release 1.5: - Fixed AVX bug. Added --nice mode and CPU temperature monitoring (OS/X only). Release 1.4: - Added randomized 256-bit AVX reader & writer tests (Intel64 only). Release 1.3: - Added CSV output. Updated ARM code for Raspberry π 3. Release 1.2: - Added ARM code back in. Release 1.1: - Added larger font. Release 1.0: - Moved graphing into BMPGraphing module. - Finally added LODS benchmarking, which proves how badly lodsb/lodsw/lodsd/lodsq perform. - Added switches --faster and --fastest. Release 0.32: - Improved AVX support. Release 0.31: - Adds cache detection for Intel 32-bit CPUs - Adds a little AVX support. - Fixes vector-to/from-main transfer bugs. Release 0.30 adds cache detection for Intel 64-bit CPUs. Release 0.29 improved graph granularity with more 128-byte tests and removes ARM support. Release 0.28 added a proper test of CPU features e.g. SSE 4.1. Release 0.27 added finer-granularity 128-byte tests. Release 0.26 fixed an issue with AMD processors. Release 0.25 maked network bandwidth bidirectional. Release 0.24 added network bandwidth testing. Release 0.23 added: - Mac OS/X 64-bit support. - Vector-to-vector register transfer test. - Main register to/from vector register transfer test. - Main register byte/word/dword/qword to/from vector register test (pinsr*, pextr* instructions). - Memory copy test using SSE2. - Automatic checks under Linux for SSE2 & SSE4. Release 0.22 added: - Register-to-register transfer test. - Register-to/from-stack transfer tests. Release 0.21 added: - Standardized memory chunks to always be a multiple of 256-byte mini-chunks. - Random memory accesses, in which each 256-byte mini-chunk accessed is accessed in a random order, but also, inside each mini-chunk the 32/64/128 data are accessed pseudo-randomly as well. - Now 'bandwidth' includes chunk sizes that are not powers of 2, which increases data points around the key chunk sizes corresponding to common L1 and L2 cache sizes. - Command-line options: --fast for 0.25 seconds per test. --slow for 20 seconds per test. --title for adding a graph title. Release 0.20 added graphing, with the graph stored in a BMP image file. It also adds the --slow option for more precise runs. Release 0.19 added a second 128-bit SSE writer routine that bypasses the caches, in addition to the one that doesn't. Release 0.18 was my Grand Unified bandwidth benchmark that brought together support for four operating systems: - Linux - Windows Mobile - 32-bit Windows - Mac OS/X 64-bit and two processor architectures: - x86 - Intel64 I've written custom assembly routines for each architecture. Total run time for the default speed, which has 5 seconds per test, is about 35 minutes. -------------------------------------------------- NETWORK BANDWIDTH (beginning with release 0.24) [Update: This feature may no longer be working.] In mid-December 2010, I extended bandwidth to measure network bandwidth, which is useful for testing your home or workplace network setup, and in theory could be used to test machines across the Internet. Release 0.25 adds: - Bidirectional network bandwidth testing. - Specifiable port# (default is 49000). In the graph: - Sent data appears as a solid line. - Received data appears as a dashed line. The network test is pretty simple. It sends chunks of data of varying sizes to whatever computers (nodes) that you specify. Each of those must be running 'bandwidth' in transponder mode. The chunks of data range of 32 kB up to 32 MB. These are actually send as a stream of 1 or more 32 kB sub-chunks. Sample output: output/Network-Linux2.6-Celeron-2.8GHz-32bit-loopback.bmp output/Network-MacOSX32-Corei5-2.4GHz-64bit-loopback.bmp output/Network-Mac64-Linux32.bmp How to start a transponder: ./bandwidth-mac64 --transponder Example invocation of the test leader: ./bandwidth64 --network 192.168.1.104 I've tested network mode on: Linux 32-bit Mac OS/X 32- and 64-bit Win/Cygwin 32-bit. -------------------------------------------------- This program is provided without any warranty and AS-IS. See the file COPYING for details. Zack Smith 1@zsmith.co March 2013 CPU-X-5.0.3/src/bandwidth/defs.h000066400000000000000000000160541454622605200162140ustar00rootroot00000000000000/*============================================================================ bandwidth, a benchmark to estimate memory transfer bandwidth. Copyright (C) 2005-2017 by Zack T Smith. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA The author may be reached at 1@zsmith.co. *===========================================================================*/ //--------------------------------------------------------------------------- // Change log // 0.18 Grand unified version supports x86/intel64/arm, linux/win32/winmo. // 0.19 Now have 128-bit writer that goes to cache AND one that bypasses. // 0.20 Added my bmplib and graphing of output. Also added --slow option. // 0.21 Adds random testing. Min chunk size = 256 B. Allows non-2^n chunks. // 0.22 Adds register-to-register and register-to/from-stack transfers. // 0.23 Adds vector-to-vector and register-to-vector transfers, & Mac support. // 0.24 Adds network bandwidth tests from this PC to specified others. // 0.25 Made network tests bidirectional to test asymmetric networks. // 0.26 Fixes to prevent certain vector instructions being used w/AMD chips. // 0.27 Added 128-byte tests for greater precision. // 0.28 Added use of CPUID. // 0.29 Added more 128-byte tests. // 0.30 Adds cache identification for Intel CPUs in 64-bit mode. // 0.31 Adds cache identification for Intel CPUs in 32-bit mode. // 0.32 Added AVX support. // 1.0 Moved graphing logic into BMPGraphing. Added LODS support. // 1.1 Switched to larger font in graphing module. // 1.2 Re-added ARM 32 support. // 1.3 Added CSV output support. Added 32-bit Raspberry π 3 support. // 1.4 Added 256-bit routines RandomReaderAVX, RandomWriterAVX. // 1.4.1 Added --limit parameter. // 1.4.2 Fixed compiler warnings. // 1.5 Fixed AVX writer bug that gave inaccurate results. Added nice mode. // 1.5.1 Fixed crashing bug. //--------------------------------------------------------------------------- #ifndef _DEFS_H #define _DEFS_H #define RELEASE "1.5.1" #ifdef __WIN32__ typedef char bool; enum { true=1, false=0 }; #else #include #endif #define NETWORK_DEFAULT_PORTNUM (49000) #define NETSIZE_MIN (15) #define NETSIZE_MAX (28) #define NETWORK_CHUNK_SIZE (1< #include "BMP.h" // Mini characters, 8 pixels high. static const char *font_chars_ [] = { "##", "##", "##", "##", "##", "##", "##", "##", "##", "##", " ", " ", "##", "##", "", "", "", "## ##", "## ##", "## ##", " # #", "", "", "", "", "", "", "", "", "", "", "", "", "", " ## ## ", " ## ## ", " ## ## ", " ## ## ", " ##########", " ##########", " ## ## ", " ## ## ", " ##########", " ##########", " ## ## ", " ## ## ", " ## ## ", " ## ## ", "", "", "", " ## ", " ## ", " ########", "## ##", "## ## ", "## ## ", " ###### ", " ## ##", " ## ##", " ## ##", " ## ##", "########", " ## ", " ## ", "", "", "", " ## ##", " # # ##", " ## ##", " ##", " ##", " ##", " ##", " ##", " ##", " ##", " ##", "## ## ", "## # #", "## ## ", "", "", "", " #####", "## ##", "## ##", "## ##", "## ##", "## ## ", " ## ## ##", " #### ##", "## ## ##", "## ####", "## ##", "## ##", " ## ## ##", " ##### ##", "", "", "", "###", "###", " ##", " #", " #", "", "", "", "", "", "", "", "", "", "", "", "", " ##", " ##", " ##", " ##", " ##", "##", "##", "##", "##", "##", "##", " ##", " ##", " ##", " ##", " ##", "", "## ", " ## ", " ##", " ##", " ##", " ##", " ##", " ##", " ##", " ##", " ##", " ##", " ##", " ##", " ##", "##", "", " ", "", "", " ##", "## ## ##", " ## ## ##", " ######", " ####", " ######", " ## ## ##", "## ## ##", " ##", "", "", "", "", "", "", "", "", " ##", " ##", " ##", " ##", "##########", " ##", " ##", " ##", " ##", "", "", "", "", "", " ", " ", "", "", "", "", "", "", "", "", "", "", "###", "###", " ##", " #", " #", " ", "", "", "", "", "", "", "#######", "", "", "", "", "", "", "", "", "", " ", " ", "", "", "", "", "", "", "", "", "", "", "###", "###", "", "", "", " ", " ##", " ##", " ##", " ##", " ##", " ##", " ##", " ##", " ##", " ##", " ##", "##", "##", "", "", "", " ##### ", " ## ##", "## ##", "## ##", "## ##", "## ##", "## ##", "## ##", "## ##", "## ##", "## ##", "## ##", " ## ##", " ##### ", "", "", "", " ##", " ##", " ###", "#####", " ##", " ##", " ##", " ##", " ##", " ##", " ##", " ##", " ##", " ## ", "", "", "", " #### ", " ## ##", "## ##", " ##", " ##", " ##", " ##", " ##", " ##", " ## ", "## ", "## ", "## ", "########", "", "", "", "########", " ##", " ##", " ##", " ## ", " ## ", " #### ", " ##", " ##", " ##", " ##", "## ##", " ## ##", " #### ", "", "", "", " ##", " ###", " ####", " ## ##", " ## ##", "## ##", "#########", " ##", " ##", " ##", " ##", " ##", " ##", " ##", "", "", "", "########", "## ", "## ", "## ", "## ", "###", " ######", " ##", " ##", " ##", " ##", "## ##", " ## ##", " #### ", "", "", "", " ##### ", " ## #", "##", "##", "##", "##", "#######", "## ## ", "## ##", "## ##", "## ##", "## ##", " ## ##", " ##### ", "", "", "", "########", " ##", " ##", " ##", " ##", " ##", " ##", " ##", " ##", " ##", " ##", " ##", " ##", " ##", "", "", "", " ##### ", " ## ##", "## ##", "## ##", "## ##", " ## ##", " ##### ", " ## ##", "## ##", "## ##", "## ##", "## ##", " ## ##", " ##### ", "", "", "", " ##### ", " ## ##", "## ##", "## ##", "## ##", " ## ##", " #######", " ##", " ##", " ##", " ##", " ##", " ##", " ##", "", "", "", " ", " ", "", "", "", "###", "###", "", "", "", "", "###", "###", "", "", "", "", " ", "", "", "", "", "###", "###", "", "", "", "", "###", "###", " ##", " ##", "#", "", " ##", " ##", " ##", " ##", " ##", " ##", "##", "##", " ##", " ##", " ##", " ##", " ##", " ##", "", "", "", " ", "", "", "", "", "", "############", "############", " ", " ", "############", "############", "", "", "", "", "", "##", " ##", " ##", " ##", " ##", " ##", " ##", " ##", " ##", " ##", " ##", " ##", " ##", "##", "", "", "", " ###### ", " ## ##", "## ##", "## ##", " ##", " ##", " ### ", " ##", " ##", " ##", "", "", " ##", " ##", "", "", "", " ###### ", " ## ##", "## ##", "## ##", "## ####", "## ## ##", "## ## ##", "## ## ##", "## ## ##", "## ####", "## ", "## ", " ## ##", " #######", "", "", "", " ##", " ####", " ####", " ## ##", " ## ##", " ## ##", " ## ##", " ## ##", " ########", " ## ##", " ## ##", "## ##", "## ##", "## ##", "", "", "", "#######", "## ##", "## ##", "## ##", "## ##", "## ##", "#######", "## ##", "## ##", "## ##", "## ##", "## ##", "## ##", "#######", "", "", "", " ###### ", " ## ##", "## ##", "## ##", "## ", "## ", "## ", "## ", "## ", "## ", "## ##", "## ##", " ## ##", " ######", "", "", "", "########", "## ##", "## ##", "## ##", "## ##", "## ##", "## ##", "## ##", "## ##", "## ##", "## ##", "## ##", "## ## ", "########", "", "", "", "##########", "##", "##", "##", "##", "##", "########", "##", "##", "##", "##", "##", "##", "##########", "", "", "", "##########", "##", "##", "##", "##", "##", "########", "##", "##", "##", "##", "##", "##", "##", "", "", "", " ###### ", " ## ##", "## ##", "## ##", "## ", "## ", "## ####", "## ##", "## ##", "## ##", "## ##", "## ##", " ## ###", " ###### #", "", "", "", "## ##", "## ##", "## ##", "## ##", "## ##", "## ##", "##########", "## ##", "## ##", "## ##", "## ##", "## ##", "## ##", "## ##", "", "", "", " ## ", " ##", " ##", " ##", " ##", " ##", " ##", " ##", " ##", " ##", " ##", " ##", " ##", " ##", "", "", "", " ##", " ##", " ##", " ##", " ##", " ##", " ##", " ##", " ##", " ##", "## ##", "## ##", " ## ##", " ####", "", "", "", "## ##", "## ##", "## ##", "## ##", "## ##", "## ##", "####", "####", "## ##", "## ##", "## ##", "## ##", "## ##", "## ##", "", "", "", "##", "##", "##", "##", "##", "##", "##", "##", "##", "##", "##", "##", "##", "########", "", "", "", "## ##", "### ###", "#### ####", "## ## ## ##", "## ## ## ##", "## ### ##", "## # ##", "## ##", "## ##", "## ##", "## ##", "## ##", "## ##", "## ##", "", "", "", "## ##", "### ##", "#### ##", "#### ##", "## ## ##", "## ## ##", "## ## ##", "## ## ##", "## ## ##", "## ## ##", "## ####", "## ####", "## ###", "## ##", "", "", "", " ###### ", " ## ##", "## ##", "## ##", "## ##", "## ##", "## ##", "## ##", "## ##", "## ##", "## ##", "## ##", " ## ##", " ######", "", "", "", "########", "## ##", "## ##", "## ##", "## ##", "## ##", "########", "##", "##", "##", "##", "##", "##", "##", "", "", "", " ######", " ## ##", "## ##", "## ##", "## ##", "## ##", "## ##", "## ##", "## ## ##", "## ## ##", "## ## ##", "## ###", " ## ##", " ##### ##", "", "", "", "########", "## ##", "## ##", "## ##", "## ##", "## ##", "########", "####", "## ##", "## ##", "## ##", "## ##", "## ##", "## ##", "", "", "", " ######", " ## ##", "## ##", "## ##", "##", " ###", " #####", " ##", " ##", " ##", "## ##", "## ##", " ## ##", " ######", "", "", "", "##########", " ##", " ##", " ##", " ##", " ##", " ##", " ##", " ##", " ##", " ##", " ##", " ##", " ##", "", "", "", "## ##", "## ##", "## ##", "## ##", "## ##", "## ##", "## ##", "## ##", "## ##", "## ##", "## ##", "## ##", " ## ##", " ######", "", "", "", "## ##", "## ##", " ## ##", " ## ##", " ## ##", " ## ## ", " ## ## ", " ## ## ", " ## ## ", " ## ## ", " ## ## ", " ### ", " ### ", " # ", "", "", "", "## ## ##", "## ## ##", "## ## ##", " ## #### ##", " ## #### ##", " ## ## ## ##", " ## ## ## ##", " ## ## ## ##", " ## ## ## ##", " ## ## ## ##", " ## ## ## ##", " # # # #", " ### ###", " ### ###", "", "", "", "## ##", "## ##", " ## ##", " ## ##", " ## ##", " ## ##", " ##", " ##", " ## ##", " ## ##", " ## ##", " ## ##", "## ##", "## ##", "", "", "", "## ##", "## ##", " ## ##", " ## ##", " ## ##", " ## ##", " ####", " ##", " ##", " ##", " ##", " ##", " ##", " ##", "", "", "", "#########", " ##", " ##", " ##", " ##", " ##", " ##", " ##", " ##", " ##", " ##", " ##", " ##", "#########", "", "", "", "#####", "##", "##", "##", "##", "##", "##", "##", "##", "##", "##", "##", "##", "##", "##", "#####", "", "##", "##", "##", "##", " ##", " ##", " ##", " ##", " ##", " ##", " ##", " ##", " ##", " ##", "", "", "", "#####", " ##", " ##", " ##", " ##", " ##", " ##", " ##", " ##", " ##", " ##", " ##", " ##", " ##", " ##", "#####", "", " ##", " ####", " ## ##", " ## ##", "## ##", "## ##", "", "", "", "", "", "", "", "", "", "", "", " ", "", "", "", "", "", "", "", "", "", "", "", "", "########", "", "", "", "####", "####", "##", " ##", " #", "", "", "", "", "", "", "", "", "", "", "", "", " ", "", "", "", " ######", " ## ##", " ##", " ##", " ######", " ## ##", "## ##", "## ##", " ## ##", " ##### ##", "", "", "", "##", "##", "##", "##", "## ####", "### ##", "## ##", "## ##", "## ##", "## ##", "## ##", "## ##", "### ##", "## ####", "", "", "", " ", "", "", "", " #####", " ## ##", "## ", "## ", "## ", "## ", "## ", "## ", " ## ##", " #####", "", "", "", " ##", " ##", " ##", " ##", " #### ##", " ## ###", "## ##", "## ##", "## ##", "## ##", "## ##", "## ##", " ## ###", " #### ##", "", "", "", " ", "", "", "", " #####", " ## ##", "## ##", "## ##", "#########", "##", "##", "##", " ## ##", " ######", "", "", "", " #####", " ##", " ## ", " ## ", "#####", " ## ", " ## ", " ## ", " ## ", " ## ", " ## ", " ## ", " ## ", " ## ", "", "", "", " ", "", "", "", " ##### #", " ## ##", "## ##", "## ##", "## ##", "## ##", "## ##", "## ##", " ## ##", " #######", " ##", "## ##", " ######", "##", "##", "##", "##", "## ####", "### ##", "## ##", "## ##", "## ##", "## ##", "## ##", "## ##", "## ##", "## ##", "", "", "", "##", "##", "", "", "##", "##", "##", "##", "##", "##", "##", "##", "##", "##", "", "", "", " ##", " ##", " ", " ", " ##", " ##", " ##", " ##", " ##", " ##", " ##", " ##", " ##", " ##", " ##", " ##", "###", "##", "##", "##", "##", "## ##", "## ##", "## ## ", "## ## ", "#### ", "#### ", "## ## ", "## ## ", "## ##", "## ##", "", "", "", "##", "##", "##", "##", "##", "##", "##", "##", "##", "##", "##", "##", "##", "##", "", "", "", " ", "", "", "", "## ### ####", "### ## ##", "## ## ##", "## ## ##", "## ## ##", "## ## ##", "## ## ##", "## ## ##", "## ## ##", "## ## ##", "", "", "", " ", "", "", "", "## ####", "### ##", "## ##", "## ##", "## ##", "## ##", "## ##", "## ##", "## ##", "## ##", "", "", "", " ", "", "", "", " #####", " ## ## ", "## ##", "## ##", "## ##", "## ##", "## ##", "## ##", " ## ## ", " ##### ", "", "", "", " ", "", "", "", "## ####", "### ##", "## ##", "## ##", "## ##", "## ##", "## ##", "## ##", "## ##", "#######", "##", "##", "##", " ", "", "", "", " #### ##", " ## ###", "## ##", "## ##", "## ##", "## ##", "## ##", "## ##", " ## ##", " #######", " ##", " ##", " ##", " ", "", "", "", "## ####", "#### ##", "###", "##", "##", "##", "##", "##", "##", "##", "", "", "", " ", "", "", "", " ######", "## ##", "##", "##", " ###", " ###", " ##", " ##", "## ##", " ######", "", "", "", " ##", " ##", " ##", " ##", "######", " ##", " ##", " ##", " ##", " ##", " ##", " ##", " ##", " ####", "", "", "", " ", "", "", "", "## ##", "## ##", "## ##", "## ##", "## ##", "## ##", "## ##", "## ##", " ## ##", " ##### #", "", "", "", " ", "", "", "", "## ##", "## ##", "## ##", " ## ##", " ## ##", " ## ##", " ## ##", " ## ##", " #####", " ###", "", "", "", " ", "", "", "", "## ## ##", "## ## ##", "## ## ##", " ## #### ##", " ## #### ##", " ## #### ##", " ## ## ## ##", " ## ## ## ##", " ##### #####", " ### ###", "", "", "", " ", "", "", "", "## ##", "## ##", " ## ##", " ## ##", " ##", " ##", " ## ##", " ## ##", "## ##", "## ##", "", "", "", " ", "", "", "", " ## ##", " ## ##", " ## ##", " ## ##", " ## ##", " ## ##", " ## ##", " ## ##", " ####", " ###", " ##", " ##", "###", " ", "", "", "", "#########", " ##", " ##", " ##", " ##", " ##", " ## ", " ## ", "## ", "#########", "", "", "", }; const char **get_font_chars () { return font_chars_; } CPU-X-5.0.3/src/bandwidth/font.h000066400000000000000000000020261454622605200162330ustar00rootroot00000000000000 /*============================================================================= bmplib, a simple library to create, modify, and write BMP image files. Copyright (C) 2009-2014 by Zack T Smith. 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., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA The author may be reached at 1@zsmith.co. *============================================================================*/ #ifndef _FONT_H #define _FONT_H extern const char **get_font_chars (void); #endif CPU-X-5.0.3/src/bandwidth/libbandwidth.h000066400000000000000000000040671454622605200177270ustar00rootroot00000000000000/**************************************************************************** * Copyright © 2014-2024 The Tumultuous Unicorn Of Darkness * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * ****************************************************************************/ /* * PROJECT CPU-X * FILE libbandwidth.h */ #ifndef _LIBBANDWIDTH_H_ #define _LIBBANDWIDTH_H_ #include #ifdef __cplusplus extern "C" { #endif #define BANDWIDTH_MAX_CACHE_LEVEL 4 enum EnTests { SEQ_128_R, SEQ_256_R, RAND_128_R, SEQ_128_CACHE_W, SEQ_256_CACHE_W, RAND_128_CACHE_W, SEQ_128_BYPASS_R, RAND_128_BYPASS_R, SEQ_128_BYPASS_W, SEQ_256_BYPASS_W, RAND_128_BYPASS_W, SEQ_128_C, SEQ_256_C, SEQ_32_LR, SEQ_16_LR, SEQ_8_LR, #ifdef __x86_64__ SEQ_64_R, RAND_64_R, SEQ_64_W, RAND_64_W, SEQ_64_LR, RAND_256_R, RAND_256_W, #else SEQ_32_R, RAND_32_R, SEQ_32_W, RAND_32_W, #endif BANDWIDTH_LAST_TEST }; struct Tests { enum EnTests test; char *name; uint32_t color; bool need_flag; bool need_mask; int (*func_ptr)(unsigned long, int, bool); int mode; bool random; }; struct BandwidthData { bool is_amd_cpu; uint8_t selected_test; uint32_t cache_size[BANDWIDTH_MAX_CACHE_LEVEL]; uint32_t cache_speed[BANDWIDTH_MAX_CACHE_LEVEL]; char **test_name; pthread_mutex_t mutex; }; int bandwidth_main(int argc, const char **argv); int bandwidth_cpux(struct BandwidthData *bwd); #ifdef __cplusplus } /* extern "C" */ #endif #endif CPU-X-5.0.3/src/bandwidth/main.c000066400000000000000000002151241454622605200162110ustar00rootroot00000000000000/*============================================================================ bandwidth, a benchmark to estimate memory transfer bandwidth. Copyright (C) 2005-2018 by Zack T Smith. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA The author may be reached at 1@zsmith.co. *===========================================================================*/ #define _GNU_SOURCE #include #include #include #include #include #include #include #include #include #include #include #include #include // gethostbyname #include #include #include #define GRAPH_WIDTH 1440 #define GRAPH_HEIGHT 900 #include "defs.h" #include "BMP.h" #include "BMPGraphing.h" #define VREGISTER_COUNT 3333 #ifndef __arm__ #define x86 #endif #define TITLE_MEMORY_NET "Network benchmark results from bandwidth " RELEASE " by Zack Smith, http://zsmith.co" #define TITLE_MEMORY_GRAPH "Memory benchmark results from bandwidth " RELEASE " by Zack Smith, http://zsmith.co" #ifdef __WIN32__ // #include #endif #ifdef __linux__ #include #include #include #endif /* Needed by CPU-X */ #include #include "libbandwidth.h" #if HAS_LIBCPUID # include #endif #if HAS_GETTEXT # define _(msg) gettext(msg) #else # define _(msg) msg #endif /* HAS_GETTEXT */ #define N_(msg) msg static bool do_print = true; #ifdef __x86_64__ #define IS_64BIT #endif static enum { OUTPUT_MODE_GRAPH=1, OUTPUT_MODE_CSV=2, } outputMode; // Mode to be nice and to keep CPU temperature low. static bool nice_mode = false; #define NICE_DURATION (2) #define MAX_CPU_TEMP (50) static int network_port = NETWORK_DEFAULT_PORTNUM; enum { NO_SSE2, // x86 SSE2, SSE2_BYPASS, AVX, AVX_BYPASS, LODSQ, LODSD, LODSW, LODSB, // ARM NEON_64BIT, NEON_128BIT, }; static BMPGraph *graph = NULL; #ifndef __arm__ static bool use_sse2 = true; static bool use_sse4 = true; #else static bool use_sse2 = false; static bool use_sse4 = false; #endif static bool is_intel = false; static bool is_amd = false; static bool limit_below_100MB = false; static FILE *csv_output_file = NULL; static char *csv_file_path = NULL; static uint32_t cpu_has_mmx = 0; static uint32_t cpu_has_sse = 0; static uint32_t cpu_has_sse2 = 0; static uint32_t cpu_has_sse3 = 0; static uint32_t cpu_has_ssse3 = 0; static uint32_t cpu_has_sse4a = 0; static uint32_t cpu_has_sse41 = 0; static uint32_t cpu_has_sse42 = 0; static uint32_t cpu_has_aes = 0; static uint32_t cpu_has_avx = 0; static uint32_t cpu_has_avx2 = 0; static uint32_t cpu_has_64bit = 0; static uint32_t cpu_has_xd = 0; //---------------------------------------- // Parameters for the tests. // static long usec_per_test = 5000000; // 5 seconds per memory test. static int chunk_sizes[] = { #ifdef x86 128, #endif 256, #ifdef x86 384, #endif 512, #ifdef x86 640, #endif 768, #ifdef x86 896, #endif 1024, 1280, 2048, 3072, 4096, 6144, 8192, // Some processors' L1 data caches are only 8kB. 12288, 16384, 20480, 24576, 28672, 32768, // Common L1 data cache size. 34*1024, 36*1024, 40960, 49152, 65536, 131072, // Old L2 cache size. 192 * 1024, 256 * 1024, // Old L2 cache size. 320 * 1024, 384 * 1024, 512 * 1024, // Old L2 cache size. 768 * 1024, 1 << 20, // 1 MB = common L2 cache size. (1024 + 256) * 1024, // 1.25 (1024 + 512) * 1024, // 1.5 (1024 + 768) * 1024, // 1.75 1 << 21, // 2 MB = common L2 cache size. (2048 + 256) * 1024, // 2.25 (2048 + 512) * 1024, // 2.5 (2048 + 768) * 1024, // 2.75 3072 * 1024, // 3 MB = common L2 cache size. 3407872, // 3.25 MB 3 * 1024 * 1024 + 1024 * 512, // 3.5 MB 1 << 22, // 4 MB 5242880, // 5 megs 6291456, // 6 megs (common L2 cache size) 7 * 1024 * 1024, 8 * 1024 * 1024, // Xeon E3's often has 8MB L3 #ifndef __arm__ 9 * 1024 * 1024, 10 * 1024 * 1024, // Xeon E5-2609 has 10MB L3 12 * 1024 * 1024, 14 * 1024 * 1024, 15 * 1024 * 1024, // Xeon E6-2630 has 15MB L3 16 * 1024 * 1024, 20 * 1024 * 1024, // Xeon E5-2690 has 20MB L3 21 * 1024 * 1024, 32 * 1024 * 1024, 48 * 1024 * 1024, 64 * 1024 * 1024, 72 * 1024 * 1024, 96 * 1024 * 1024, 128 * 1024 * 1024, #define TEST_L4 #ifdef TEST_L4 160 * 1024 * 1024, 192 * 1024 * 1024, 224 * 1024 * 1024, 256 * 1024 * 1024, 320 * 1024 * 1024, 512 * 1024 * 1024, #endif #endif 0 }; static double chunk_sizes_log2 [sizeof(chunk_sizes)/sizeof(int)]; //---------------------------------------------------------------------------- // Name: internal // Purpose: Complain and exit. //---------------------------------------------------------------------------- void internal (char *s) { fprintf (stderr, "Internal error: %s\n", s); exit (2); } //---------------------------------------------------------------------------- // Name: error // Purpose: Complain and exit. //---------------------------------------------------------------------------- void error (char *s) { #ifndef __WIN32__ fprintf (stderr, "Error: %s\n", s); exit (1); #else wchar_t tmp [200]; int i; for (i = 0; s[i]; i++) tmp[i] = s[i]; tmp[i] = 0; MessageBoxW (0, tmp, L"Error", 0); ExitProcess (0); #endif } //============================================================================ // Output multiplexor. //============================================================================ void dataBegins (char *title) { if (!outputMode) { internal ("Bad output mode."); } //========== if (outputMode & OUTPUT_MODE_GRAPH) { if (graph) internal ("Graphing already initialized."); graph = BMPGraphing_new (GRAPH_WIDTH, GRAPH_HEIGHT, MODE_X_AXIS_LOG2); BMPGraphing_set_title (graph, title? title : TITLE_MEMORY_GRAPH); } if (outputMode & OUTPUT_MODE_CSV) { if (csv_output_file) internal ("CSV file already initialized."); csv_output_file = fopen (csv_file_path, "wb"); if (!csv_output_file) { error ("Cannot open CSV output file."); } if (title) fprintf (csv_output_file, "%s\n", title); } } void dataBeginSection (const char *name, uint32_t parameter) { if (!outputMode) { internal ("Bad output mode."); } if (!name) { internal ("dataBeginSection: NULL name."); } //========== if (nice_mode) { sleep (NICE_DURATION); #ifdef __APPLE__ #define POPEN_BUFSIZE (256) // Keep CPU temperature below 50 C. // int cpu_temperature = 0; bool done = true; do { FILE *f = popen ("sysctl machdep.xcpm.cpu_thermal_level | sed '\''s/machdep.xcpm.cpu_thermal_level/CPU temperature/'\''", "r"); if (f) { char buffer [POPEN_BUFSIZE] = {0}; if (0 < fread (buffer, 1, POPEN_BUFSIZE-1, f)) { int i; for (i=0; i < POPEN_BUFSIZE && buffer[i]; i++) { if (isdigit (buffer[i])) break; } if (i < POPEN_BUFSIZE) { cpu_temperature = atoi (buffer + i); printf ("CPU temperature is %d C.\n", cpu_temperature); } else { break; } } pclose (f); } else { break; } done = (cpu_temperature < MAX_CPU_TEMP); if (!done) sleep (10); } while (!done); #endif } if (outputMode & OUTPUT_MODE_GRAPH) { if (!graph) internal ("Graphing not initialized."); BMPGraphing_new_line (graph, name, parameter); } if (outputMode & OUTPUT_MODE_CSV) { if (!csv_output_file) internal ("CSV output not initialized."); fprintf (csv_output_file, "%s\n", name); } } void dataEnds (const char *parameter) { if (!outputMode) { internal ("Bad output mode."); } //========== if (outputMode & OUTPUT_MODE_GRAPH) { if (!graph) internal ("Graphing not initialized."); if (!parameter) internal ("dataEnds: NULL name."); BMPGraphing_make (graph); BMP_write (graph->image, parameter); BMPGraphing_destroy (graph); graph= NULL; puts ("Wrote graph to: bandwidth.bmp"); } if (outputMode & OUTPUT_MODE_CSV) { if (!csv_output_file) internal ("CSV output not initialized."); fclose (csv_output_file); printf ("Wrote %s.\n", csv_file_path); } } void dataAddDatum (Value x, Value y) { if (!outputMode) { internal ("Bad output mode."); } //========== if (outputMode & OUTPUT_MODE_GRAPH) { if (!graph) internal ("Graphing not initialized."); BMPGraphing_add_point (graph, x, y); } if (outputMode & OUTPUT_MODE_CSV) { if (!csv_output_file) internal ("CSV output not initialized."); fprintf (csv_output_file, "%lld, %.1Lf\n", (long long)x, (long double)y/10.); fflush (csv_output_file); } } //============================================================================ // Output buffer logic. //============================================================================ void print (const char *s) { if(do_print) printf ("%s",s); } void newline () { if(do_print) puts (""); } void println (char *s) { print (s); newline (); } void print_int (int d) { if(do_print) printf ("%d", d); } void print_uint (unsigned long d) { if(do_print) printf ("%lu", d); } void println_int (int d) { print_int (d); newline (); } void print_result (long double result) { if(do_print) printf ("%.1Lf MB/s", result); } void flush () { fflush (stdout); } void print_size (unsigned long size) { if (size < 1536) { print_int (size); print (" B"); } else if (size < (1<<20)) { print_int (size >> 10); print (" kB"); } else { print_int (size >> 20); switch ((size >> 18) & 3) { case 1: print (".25"); break; case 2: print (".5"); break; case 3: print (".75"); break; } print (" MB"); } } //============================================================================ // Timing logic. //============================================================================ //---------------------------------------------------------------------------- // Name: mytime // Purpose: Reports time in microseconds. //---------------------------------------------------------------------------- unsigned long mytime () { #ifndef __WIN32__ struct timeval tv; struct timezone tz; memset (&tz, 0, sizeof(struct timezone)); gettimeofday (&tv, &tz); return 1000000 * tv.tv_sec + tv.tv_usec; #else return 1000 * GetTickCount (); // accurate enough. #endif } //---------------------------------------------------------------------------- // Name: calculate_result // Purpose: Calculates and prints a result. // Returns: 10 times the number of megabytes per second. //---------------------------------------------------------------------------- int calculate_result (unsigned long chunk_size, long long total_loops, long diff) { if (!diff) error ("Zero time difference."); // printf ("\nIn calculate_result, chunk_size=%ld, total_loops=%lld, diff=%ld\n", chunk_size, total_loops, diff); long double result = (long double) chunk_size; result *= (long double) total_loops; result *= 1000000.; // Convert to microseconds. result /= 1048576.; result /= (long double) diff; print_result (result); return (long) (10.0 * result); } //============================================================================ // Tests. //============================================================================ //---------------------------------------------------------------------------- // Name: do_write // Purpose: Performs write on chunk of memory of specified size. //---------------------------------------------------------------------------- int do_write (unsigned long size, int mode, bool random) { unsigned char *chunk; unsigned char *chunk0; unsigned long loops; unsigned long long total_count=0; #ifdef IS_64BIT unsigned long value = 0x1234567689abcdef; #else unsigned long value = 0x12345678; #endif unsigned long diff=0, t0; unsigned long tmp; unsigned long **chunk_ptrs = NULL; #ifdef x86 if (size & 127) error ("do_write(): chunk size is not multiple of 128."); #else if (size & 255) error ("do_write(): chunk size is not multiple of 256."); #endif //------------------------------------------------- chunk0 = malloc (size+64); chunk = chunk0; if (!chunk) error ("Out of memory"); tmp = (unsigned long) chunk; if (tmp & 31) { tmp -= (tmp & 31); tmp += 32; chunk = (unsigned char*) tmp; } //---------------------------------------- // Set up random pointers to chunks. // if (random) { tmp = size/256; chunk_ptrs = (unsigned long**) malloc (sizeof (unsigned long*) * tmp); if (!chunk_ptrs) error ("Out of memory."); //---------------------------------------- // Store pointers to all chunks into array. // int i; for (i = 0; i < tmp; i++) { chunk_ptrs [i] = (unsigned long*) (chunk + 256 * i); } //---------------------------------------- // Randomize the array of chunk pointers. // int k = 200; while (k--) { for (i = 0; i < tmp; i++) { int j = rand() % tmp; if (i != j) { unsigned long *ptr = chunk_ptrs [i]; chunk_ptrs [i] = chunk_ptrs [j]; chunk_ptrs [j] = ptr; } } } } //------------------------------------------------- if (random) print ("Random write "); else print ("Sequential write "); switch (mode) { case NEON_64BIT: print ("(64-bit), size = "); break; case NEON_128BIT: print ("(128-bit), size = "); break; case SSE2: print ("(128-bit), size = "); break; case AVX: print ("(256-bit), size = "); break; case AVX_BYPASS: print ("bypassing cache (256-bit), size = "); break; case SSE2_BYPASS: print ("bypassing cache (128-bit), size = "); break; default: #ifdef IS_64BIT print ("(64-bit), size = "); #else print ("(32-bit), size = "); #endif } print_size (size); print (", "); loops = (1 << 26) / size;// XX need to adjust for CPU MHz if (loops < 1) loops = 1; t0 = mytime (); while (diff < usec_per_test) { total_count += loops; switch (mode) { #ifdef __arm__ case NEON_64BIT: if (random) RandomWriterVector (chunk_ptrs, size/256, loops, value); break; case NEON_128BIT: if (!random) WriterVector (chunk, size, loops, value); break; #endif #ifdef x86 case SSE2: if (random) RandomWriterSSE2 (chunk_ptrs, size/256, loops, value); else { if (size & 128) WriterSSE2_128bytes (chunk, size, loops, value); else WriterSSE2 (chunk, size, loops, value); } break; case SSE2_BYPASS: if (random) RandomWriterSSE2_bypass (chunk_ptrs, size/256, loops, value); else { if (size & 128) WriterSSE2_128bytes_bypass (chunk, size, loops, value); else WriterSSE2_bypass (chunk, size, loops, value); } break; case AVX: if (!random) { WriterAVX (chunk, size, loops, value); } else { #ifdef IS_64BIT RandomWriterAVX (chunk_ptrs, size/256, loops, value); #endif } break; case AVX_BYPASS: if (!random) { WriterAVX_bypass (chunk, size, loops, value); } break; #endif default: if (random) RandomWriter (chunk_ptrs, size/256, loops, value); else { #ifdef x86 if (size & 128) Writer_128bytes (chunk, size, loops, value); else #endif Writer (chunk, size, loops, value); } } diff = mytime () - t0; } print ("loops = "); print_uint (total_count); print (", "); flush (); int result = calculate_result (size, total_count, diff); newline (); flush (); free ((void*)chunk0); if (chunk_ptrs) free (chunk_ptrs); return result; } //---------------------------------------------------------------------------- // Name: do_read // Purpose: Performs sequential read on chunk of memory of specified size. //---------------------------------------------------------------------------- int do_read (unsigned long size, int mode, bool random) { unsigned long loops; unsigned long long total_count = 0; unsigned long t0, diff=0; unsigned char *chunk; unsigned char *chunk0; unsigned long tmp; unsigned long **chunk_ptrs = NULL; if (size & 127) error ("do_read(): chunk size is not multiple of 128."); //------------------------------------------------- chunk0 = chunk = malloc (size+64); if (!chunk) error ("Out of memory"); memset (chunk, 0, size); tmp = (unsigned long) chunk; if (tmp & 31) { tmp -= (tmp & 31); tmp += 32; chunk = (unsigned char*) tmp; } //---------------------------------------- // Set up random pointers to chunks. // if (random) { int tmp = size/256; chunk_ptrs = (unsigned long**) malloc (sizeof (unsigned long*) * tmp); if (!chunk_ptrs) error ("Out of memory."); //---------------------------------------- // Store pointers to all chunks into array. // int i; for (i = 0; i < tmp; i++) { chunk_ptrs [i] = (unsigned long*) (chunk + 256 * i); } //---------------------------------------- // Randomize the array of chunk pointers. // int k = 200; while (k--) { for (i = 0; i < tmp; i++) { int j = rand() % tmp; if (i != j) { unsigned long *ptr = chunk_ptrs [i]; chunk_ptrs [i] = chunk_ptrs [j]; chunk_ptrs [j] = ptr; } } } } //------------------------------------------------- if (random) print ("Random read "); else print ("Sequential read "); switch (mode) { #ifdef __arm__ case NEON_64BIT: print ("(64-bit), size = "); break; case NEON_128BIT: print ("(128-bit), size = "); break; #endif #ifdef x86 case SSE2: print ("(128-bit), size = "); break; case LODSB: print ("(8-bit LODSB), size = "); break; case LODSW: print ("(16-bit LODSW), size = "); break; case LODSD: print ("(32-bit LODSD), size = "); break; case LODSQ: print ("(64-bit LODSQ), size = "); break; case AVX: print ("(256-bit), size = "); break; case AVX_BYPASS: print ("bypassing cache (256-bit), size = "); break; case SSE2_BYPASS: print ("bypassing cache (128-bit), size = "); break; #endif default: #ifdef IS_64BIT print ("(64-bit), size = "); #else print ("(32-bit), size = "); #endif } print_size (size); print (", "); flush (); loops = (1 << 26) / size; // XX need to adjust for CPU MHz if (loops < 1) loops = 1; t0 = mytime (); while (diff < usec_per_test) { total_count += loops; switch (mode) { #ifdef __arm__ case NEON_64BIT: if (random) RandomReaderVector (chunk_ptrs, size/256, loops); break; case NEON_128BIT: if (!random) ReaderVector (chunk, size, loops); break; #endif #ifdef x86 case SSE2: if (random) RandomReaderSSE2 (chunk_ptrs, size/256, loops); else { if (size & 128) ReaderSSE2_128bytes (chunk, size, loops); else ReaderSSE2 (chunk, size, loops); } break; case SSE2_BYPASS: // No random reader for bypass. // if (random) RandomReaderSSE2_bypass (chunk_ptrs, size/256, loops); else { if (size & 128) ReaderSSE2_128bytes_bypass (chunk, size, loops); else ReaderSSE2_bypass (chunk, size, loops); } break; case AVX: if (!random) { ReaderAVX (chunk, size, loops); } else { #ifdef IS_64BIT RandomReaderAVX (chunk_ptrs, size/256, loops); #endif } break; case LODSB: if (!random) { ReaderLODSB (chunk, size, loops); } break; case LODSW: if (!random) { ReaderLODSW (chunk, size, loops); } break; case LODSD: if (!random) { ReaderLODSD (chunk, size, loops); } break; case LODSQ: if (!random) { ReaderLODSQ (chunk, size, loops); } break; #endif default: if (random) { RandomReader (chunk_ptrs, size/256, loops); } else { #ifdef x86 if (size & 128) Reader_128bytes (chunk, size, loops); else #endif Reader (chunk, size, loops); } } diff = mytime () - t0; } print ("loops = "); print_uint (total_count); print (", "); int result = calculate_result (size, total_count, diff); newline (); flush (); free (chunk0); if (chunk_ptrs) free (chunk_ptrs); return result; } //---------------------------------------------------------------------------- // Name: do_copy // Purpose: Performs sequential memory copy. //---------------------------------------------------------------------------- int do_copy (unsigned long size, int mode) { #ifdef x86 unsigned long loops; unsigned long long total_count = 0; unsigned long t0, diff=0; unsigned char *chunk_src; unsigned char *chunk_dest; unsigned char *chunk_src0; unsigned char *chunk_dest0; unsigned long tmp; if (size & 127) error ("do_copy(): chunk size is not multiple of 128."); //------------------------------------------------- chunk_src0 = chunk_src = malloc (size+64); if (!chunk_src) error ("Out of memory"); chunk_dest0 = chunk_dest = malloc (size+64); if (!chunk_dest) error ("Out of memory"); memset (chunk_src, 100, size); memset (chunk_dest, 200, size); tmp = (unsigned long) chunk_src; if (tmp & 31) { tmp -= (tmp & 31); tmp += 32; chunk_src = (unsigned char*) tmp; } tmp = (unsigned long) chunk_dest; if (tmp & 31) { tmp -= (tmp & 31); tmp += 32; chunk_dest = (unsigned char*) tmp; } //------------------------------------------------- print ("Sequential copy "); if (mode == SSE2) { print ("(128-bit), size = "); } else if (mode == AVX) { print ("(256-bit), size = "); } else { #ifdef IS_64BIT print ("(64-bit), size = "); #else print ("(32-bit), size = "); #endif } print_size (size); print (", "); flush (); loops = (1 << 26) / size; // XX need to adjust for CPU MHz if (loops < 1) loops = 1; t0 = mytime (); while (diff < usec_per_test) { total_count += loops; if (mode == SSE2) { #ifdef IS_64BIT if (size & 128) CopySSE_128bytes (chunk_dest, chunk_src, size, loops); else CopySSE (chunk_dest, chunk_src, size, loops); #else CopySSE (chunk_dest, chunk_src, size, loops); #endif } else if (mode == AVX) { if (!(size & 128)) CopyAVX (chunk_dest, chunk_src, size, loops); } diff = mytime () - t0; } print ("loops = "); print_uint (total_count); print (", "); int result = calculate_result (size, total_count, diff); newline (); flush (); free (chunk_src0); free (chunk_dest0); return result; #else return 0; #endif } int do_copy2 (unsigned long size, int mode, bool unused __attribute__((unused))) { return do_copy(size, mode); } //---------------------------------------------------------------------------- // Name: fb_readwrite // Purpose: Performs sequential read & write tests on framebuffer memory. //---------------------------------------------------------------------------- #if defined(__linux__) && defined(FBIOGET_FSCREENINFO) void fb_readwrite (bool use_sse2) { unsigned long total_count; unsigned long length; unsigned long diff, t0; static struct fb_fix_screeninfo fi; static struct fb_var_screeninfo vi; unsigned long *fb = NULL; int fd; #ifdef IS_64BIT unsigned long value = 0x1234567689abcdef; #else unsigned long value = 0x12345678; #endif //------------------------------------------------- fd = open ("/dev/fb0", O_RDWR); if (fd < 0) fd = open ("/dev/fb/0", O_RDWR); if (fd < 0) { println ("Cannot open framebuffer device."); return; } if (ioctl (fd, FBIOGET_FSCREENINFO, &fi)) { close (fd); println ("Cannot get framebuffer info"); return; } else if (ioctl (fd, FBIOGET_VSCREENINFO, &vi)) { close (fd); println ("Cannot get framebuffer info"); return; } else { if (fi.visual != FB_VISUAL_TRUECOLOR && fi.visual != FB_VISUAL_DIRECTCOLOR ) { close (fd); println ("Need direct/truecolor framebuffer device."); return; } else { unsigned long fblen; print ("Framebuffer resolution: "); print_int (vi.xres); print ("x"); print_int (vi.yres); print (", "); print_int (vi.bits_per_pixel); println (" bpp\n"); fb = (unsigned long*) fi.smem_start; fblen = fi.smem_len; fb = mmap (fb, fblen, PROT_WRITE | PROT_READ, MAP_SHARED, fd, 0); if (fb == MAP_FAILED) { close (fd); println ("Cannot access framebuffer memory."); return; } } } //------------------- // Use only the upper half of the display. // length = FB_SIZE; //------------------- // READ // print ("Framebuffer memory sequential read "); flush (); t0 = mytime (); total_count = FBLOOPS_R; #ifdef x86 if (use_sse2) ReaderSSE2 (fb, length, FBLOOPS_R); else #endif Reader (fb, length, FBLOOPS_R); diff = mytime () - t0; calculate_result (length, total_count, diff); newline (); //------------------- // WRITE // print ("Framebuffer memory sequential write "); flush (); t0 = mytime (); total_count = FBLOOPS_W; #ifdef x86 if (use_sse2) WriterSSE2_bypass (fb, length, FBLOOPS_W, value); else #endif Writer (fb, length, FBLOOPS_W, value); diff = mytime () - t0; calculate_result (length, total_count, diff); newline (); } #endif //---------------------------------------------------------------------------- // Name: register_test // Purpose: Determines bandwidth of register-to-register transfers. //---------------------------------------------------------------------------- void register_test () { long long total_count = 0; unsigned long t0; unsigned long diff = 0; //-------------------------------------- #ifdef IS_64BIT print ("Main register to main register transfers (64-bit) "); #else print ("Main register to main register transfers (32-bit) "); #endif flush (); #define REGISTER_COUNT 10000 t0 = mytime (); while (diff < usec_per_test) { RegisterToRegister (REGISTER_COUNT); total_count += REGISTER_COUNT; diff = mytime () - t0; } calculate_result (256, total_count, diff); newline (); flush (); //-------------------------------------- #ifdef x86 #ifdef IS_64BIT print ("Main register to vector register transfers (64-bit) "); #else print ("Main register to vector register transfers (32-bit) "); #endif flush (); t0 = mytime (); diff = 0; total_count = 0; while (diff < usec_per_test) { RegisterToVector (VREGISTER_COUNT); total_count += VREGISTER_COUNT; diff = mytime () - t0; } calculate_result (256, total_count, diff); newline (); flush (); //-------------------------------------- #ifdef IS_64BIT print ("Vector register to main register transfers (64-bit) "); #else print ("Vector register to main register transfers (32-bit) "); #endif flush (); t0 = mytime (); diff = 0; total_count = 0; while (diff < usec_per_test) { VectorToRegister (VREGISTER_COUNT); total_count += VREGISTER_COUNT; diff = mytime () - t0; } calculate_result (256, total_count, diff); newline (); flush (); #endif //-------------------------------------- print ("Vector register to vector register transfers (128-bit) "); flush (); t0 = mytime (); diff = 0; total_count = 0; while (diff < usec_per_test) { VectorToVector (VREGISTER_COUNT); total_count += VREGISTER_COUNT; diff = mytime () - t0; } calculate_result (256, total_count, diff); newline (); flush (); #ifdef x86 //-------------------------------------- if (cpu_has_avx) { print ("Vector register to vector register transfers (256-bit) "); flush (); t0 = mytime (); diff = 0; total_count = 0; while (diff < usec_per_test) { VectorToVectorAVX (VREGISTER_COUNT); total_count += VREGISTER_COUNT; diff = mytime () - t0; } calculate_result (256, total_count, diff); newline (); flush (); } //-------------------------------------- if (use_sse4) { print ("Vector 8-bit datum to main register transfers "); flush (); t0 = mytime (); diff = 0; total_count = 0; while (diff < usec_per_test) { Vector8ToRegister (VREGISTER_COUNT); total_count += VREGISTER_COUNT; diff = mytime () - t0; } calculate_result (64, total_count, diff); newline (); flush (); } //-------------------------------------- print ("Vector 16-bit datum to main register transfers "); flush (); t0 = mytime (); diff = 0; total_count = 0; while (diff < usec_per_test) { Vector16ToRegister (VREGISTER_COUNT); total_count += VREGISTER_COUNT; diff = mytime () - t0; } calculate_result (128, total_count, diff); newline (); flush (); //-------------------------------------- if (use_sse4) { print ("Vector 32-bit datum to main register transfers "); flush (); t0 = mytime (); diff = 0; total_count = 0; while (diff < usec_per_test) { Vector32ToRegister (VREGISTER_COUNT); total_count += VREGISTER_COUNT; diff = mytime () - t0; } calculate_result (256, total_count, diff); newline (); flush (); } //-------------------------------------- if (use_sse4) { print ("Vector 64-bit datum to main register transfers "); flush (); t0 = mytime (); diff = 0; total_count = 0; while (diff < usec_per_test) { Vector64ToRegister (VREGISTER_COUNT); total_count += VREGISTER_COUNT; diff = mytime () - t0; } calculate_result (256, total_count, diff); newline (); flush (); } //-------------------------------------- if (use_sse4) { print ("Main register 8-bit datum to vector register transfers "); flush (); t0 = mytime (); diff = 0; total_count = 0; while (diff < usec_per_test) { Register8ToVector (VREGISTER_COUNT); total_count += VREGISTER_COUNT; diff = mytime () - t0; } calculate_result (64, total_count, diff); newline (); flush (); } //-------------------------------------- print ("Main register 16-bit datum to vector register transfers "); flush (); t0 = mytime (); diff = 0; total_count = 0; while (diff < usec_per_test) { Register16ToVector (VREGISTER_COUNT); total_count += VREGISTER_COUNT; diff = mytime () - t0; } calculate_result (128, total_count, diff); newline (); flush (); //-------------------------------------- if (use_sse4) { print ("Main register 32-bit datum to vector register transfers "); flush (); t0 = mytime (); diff = 0; total_count = 0; while (diff < usec_per_test) { Register32ToVector (VREGISTER_COUNT); total_count += VREGISTER_COUNT; diff = mytime () - t0; } calculate_result (256, total_count, diff); newline (); flush (); } //-------------------------------------- if (use_sse4) { print ("Main register 64-bit datum to vector register transfers "); flush (); t0 = mytime (); diff = 0; total_count = 0; while (diff < usec_per_test) { Register64ToVector (VREGISTER_COUNT); total_count += VREGISTER_COUNT; diff = mytime () - t0; } calculate_result (256, total_count, diff); newline (); flush (); } #endif } //---------------------------------------------------------------------------- // Name: stack_test // Purpose: Determines bandwidth of stack-to/from-register transfers. //---------------------------------------------------------------------------- void stack_test () { long long total_count = 0; unsigned long t0; unsigned long diff = 0; #ifdef IS_64BIT print ("Stack-to-register transfers (64-bit) "); #else print ("Stack-to-register transfers (32-bit) "); #endif flush (); //-------------------------------------- diff = 0; total_count = 0; t0 = mytime (); while (diff < usec_per_test) { StackReader (REGISTER_COUNT); total_count += REGISTER_COUNT; diff = mytime () - t0; } calculate_result (256, total_count, diff); newline (); flush (); #ifdef IS_64BIT print ("Register-to-stack transfers (64-bit) "); #else print ("Register-to-stack transfers (32-bit) "); #endif flush (); //-------------------------------------- diff = 0; total_count = 0; t0 = mytime (); while (diff < usec_per_test) { StackWriter (REGISTER_COUNT); total_count += REGISTER_COUNT; diff = mytime () - t0; } calculate_result (256, total_count, diff); newline (); flush (); } //---------------------------------------------------------------------------- // Name: library_test // Purpose: Performs C library tests (memset, memcpy). //---------------------------------------------------------------------------- void library_test () { char *a1, *a2; unsigned long t, t0; int i; #define NT_SIZE (64*1024*1024) #define NT_SIZE2 (100) a1 = malloc (NT_SIZE); if (!a1) error ("Out of memory"); a2 = malloc (NT_SIZE); if (!a2) error ("Out of memory"); //-------------------------------------- t0 = mytime (); for (i=0; ih_addr_list); int sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); struct sockaddr_in addr; addr.sin_family = AF_INET; addr.sin_addr.s_addr = inet_addr(host_ip); addr.sin_port = htons(network_port); if (connect (sock, (struct sockaddr*) &addr, sizeof (struct sockaddr))) { // perror ("connect"); close (sock); return false; } //------------------------------------ // Start stopwatch just before the send. // It will be stopped on receipt of // the response. // unsigned long t0 = mytime (); //------------------------------------ // Put # of chunks in the chunk. // Send all of our data. // sprintf (chunk, "%lu\n", n_chunks); int i; for (i = 0; i < n_chunks; i++) send (sock, chunk, chunk_size, 0); #if 0 //------------------------------------ // Set nonblocking mode. // int opt = 1; ioctl (sock, FIONBIO, &opt); #endif unsigned long t1 = mytime (); //------------------------------------ // Read the response. // int amount = recv (sock, chunk, chunk_size, 0); if (amount < 16) { close (sock); return false; } unsigned long duration_send = mytime() - t0; //------------------------------------ // Validate the response, which // contains the transponder's // perceived read duration. This value // may be as little as half our number. // unsigned long duration2 = -1; if (strncmp ("OK: ", chunk, 4)) { close (sock); return false; } if (1 != sscanf (4+chunk, "%lu", &duration2)) { close (sock); return false; } unsigned long remaining = chunk_size * n_chunks - amount; while (remaining > 0) { int amount = recv (sock, chunk, chunk_size, 0); if (amount <= 0) { perror ("recv"); close (sock); return false; } remaining -= amount; } unsigned long duration_recv = mytime () - t1; *duration_send_return = duration_send; *duration_recv_return = duration_recv; close (sock); return true; } //---------------------------------------------------------------------------- // Name: ip_to_str //---------------------------------------------------------------------------- void ip_to_str (unsigned long addr, char *str) { if (!str) return; unsigned short a = 0xff & addr; unsigned short b = 0xff & (addr >> 8); unsigned short c = 0xff & (addr >> 16); unsigned short d = 0xff & (addr >> 24); sprintf (str, "%u.%u.%u.%u", a,b,c,d); } //---------------------------------------------------------------------------- // Name: network_transponder // Purpose: Act as a transponder, receiving chunks of data and sending // back an acknowledgement once the enture chunk is read. // Returns: False if a problem occurs setting up the network socket. //---------------------------------------------------------------------------- bool network_transponder () { struct sockaddr_in sin, from; //------------------------------ // Get listening socket for port. // Then listen on given port#. // sin.sin_family = AF_INET; sin.sin_addr.s_addr = htonl(INADDR_ANY); sin.sin_port = htons(network_port); int listensock; if ((listensock = socket (AF_INET, SOCK_STREAM, 0)) < 0) { perror ("socket"); return false; } if (bind (listensock, (struct sockaddr*) &sin, sizeof(sin)) < 0) { perror ("bind"); close (listensock); return false; } if (listen (listensock, 500) < 0) { perror ("listen"); close (listensock); return false; } bool done = false; while (!done) { //---------------------------------------- // Wait for a client to contact us. // socklen_t len = sizeof (struct sockaddr); int sock = accept (listensock, (struct sockaddr*) &from, &len); if (sock < 0) { perror ("accept"); close (listensock); return false; } //---------------------------------------- // Clockwatch starts when we accept the // connection. // unsigned long t0 = mytime (); if (len != sizeof (struct sockaddr_in)) { close (sock); close (listensock); return false; } #if 0 unsigned long ipaddr = from.sin_addr.s_addr; char ipstring[30]; ip_to_str (ipaddr, ipstring); fprintf (stderr, "Incoming connection from %s\n", ipstring); #endif //---------------------------------------- // Read the first chunk only, in order to // get the # of bytes that will be sent. // char chunk [NETWORK_CHUNK_SIZE+1]; long n_chunks = 0; int amount_read = read (sock, chunk, NETWORK_CHUNK_SIZE); chunk [amount_read] = 0; if (1 != sscanf (chunk, "%ld", &n_chunks)) { close (sock); close (listensock); return false; } //---------------------------------------- // If the leader sends us a chunk count of // -99, this indicates that we should exit. // if (n_chunks == -99) { close (sock); close (listensock); return true; } // printf ("Reading %lu chunks of %d bytes...\n", n_chunks, NETWORK_CHUNK_SIZE); unsigned long long remaining = n_chunks; remaining *= NETWORK_CHUNK_SIZE; // printf ("remaining="); dump_hex64(remaining); puts(""); remaining -= amount_read; while (remaining > 0) { amount_read = read (sock, chunk, NETWORK_CHUNK_SIZE); remaining -= amount_read; if (amount_read < 0) { perror ("read"); break; } else if (!amount_read) break; } unsigned long duration = mytime() - t0; //------------------------------------ // Send response of same size. // sprintf (chunk, "OK: %lu\n", duration); chunk[14] = '\n'; //------------------------------------ // Send all of our data. // int i; for (i = 0; i < n_chunks; i++) send (sock, chunk, NETWORK_CHUNK_SIZE, 0); close (sock); } return true; } //---------------------------------------------------------------------------- // Name: network_test //---------------------------------------------------------------------------- bool network_test (char **destinations, int n_destinations) { int i; //---------------------------------------- // The memory chunk starts with a 12-byte // length of the overall send size. // The memory chunk will have a list of // the destinations in it. // In future, there will be a mechanism // for testing bandwidth between all nodes, // not just the leader & each of the // transponders. // char chunk [NETWORK_CHUNK_SIZE]; memset (chunk, 0, NETWORK_CHUNK_SIZE); sprintf (chunk, "000000000000\n%d\n", n_destinations); for (i = 0; i < n_destinations; i++) { char *s = destinations [i]; int chunk_len = strlen (chunk); int len = strlen (s); if (len + chunk_len < NETWORK_CHUNK_SIZE-1) { //---------------------------------------- // "transp" indicates that the given node // has not yet been a leader. // In future, "done" will indicate it has. // sprintf (chunk + chunk_len, "%s %s\n", s, "transp"); } } static unsigned long colors [] = { RGB_RED, RGB_GREEN, RGB_BLUE, RGB_ORANGE, RGB_PURPLE, RGB_BLACK, RGB_CORAL, RGB_CYAN, RGB_NAVYBLUE, RGB_BRASS, RGB_DARKORANGE, RGB_DARKGREEN, RGB_SALMON, RGB_MAGENTA, RGB_LEMONYELLOW, RGB_ROYALBLUE, RGB_DODGERBLUE, RGB_TURQUOISE, RGB_CADETBLUE, RGB_CHARTREUSE, RGB_DARKOLIVEGREEN, RGB_VIOLET, RGB_KHAKI, RGB_DARKKHAKI, RGB_GOLDENROD }; #define NCOLORS (sizeof(colors)/sizeof(unsigned long)) //---------------------------------------- // For each destination, run the test. // for (i = 0; i < n_destinations; i++) { bool problem = false; char *hostname = destinations[i]; printf ("Bandwidth sending to %s:\n", hostname); char title [PATH_MAX]; sprintf (title, "%s send (solid)", hostname); BMPGraphing_new_line (graph, title, i < NCOLORS? colors[i] : RGB_GRAY); //---------------------------------------- // Cache the receive durations for later. // unsigned long recv_rates [NETSIZE_MAX]; int recv_ix = 0; //---------------------------------------- // Send data of increasing sizes. // int j = NETSIZE_MIN; int n_runs = 64; while (!problem && j <= NETSIZE_MAX) { unsigned long chunk_count = 1 << (j-NETSIZE_MIN); unsigned long long amt_to_send = chunk_count; amt_to_send *= NETWORK_CHUNK_SIZE; if (!amt_to_send) // unlikely break; //---------------------------------------- // Send the data; do this n_runs times. // unsigned long long total_duration_send = 0; unsigned long long total_duration_recv = 0; int k = n_runs; while (k--) { long duration_send, duration_recv; if (! network_test_core (hostname, chunk, NETWORK_CHUNK_SIZE, chunk_count, &duration_send, &duration_recv)) { problem = true; fprintf (stderr, "\nCan't connect to %s\n", hostname); break; } total_duration_send += duration_send; total_duration_recv += duration_recv; } if (problem) break; total_duration_send += n_runs/2; // Round up total_duration_send /= n_runs; // Get average long duration = (long) total_duration_send; total_duration_recv += n_runs/2; // Round up total_duration_recv /= n_runs; // Get average unsigned long amt_in_kb = amt_to_send / 1024; unsigned long amt_in_mb = amt_to_send / 1048576; if (!amt_in_mb) { printf ("\r\tChunk %lu kB x %d: \t", amt_in_kb, n_runs); } else { printf ("\r\tChunk %lu MB x %d: \t", amt_in_mb, n_runs); } //------------------------------ // Calculate send rate in MB/sec. // // Get total # bytes. unsigned long long tmp = NETWORK_CHUNK_SIZE; tmp *= chunk_count; // Get total bytes per second. tmp *= 1000000; tmp /= duration; // Bytes to megabytes. tmp /= 1000; tmp /= 10; unsigned long whole = tmp / 100; unsigned long frac = tmp % 100; printf ("%lu.%02lu MB/s (sent)\t", whole, frac); fflush (stdout); dataAddDatum (amt_in_kb, tmp); //------------------------------ // Calculate recv rate in MB/sec. // // Get total # bytes. tmp = NETWORK_CHUNK_SIZE; tmp *= chunk_count; // Get total bytes per second. tmp *= 1000000; tmp /= total_duration_recv; // Bytes to megabytes. tmp /= 1000; tmp /= 10; whole = tmp / 100; frac = tmp % 100; printf ("%lu.%02lu MB/s (received)\n", whole, frac); recv_rates [recv_ix++] = tmp; j++; n_runs >>= 1; if (!n_runs) n_runs = 1; } //---------------------------------------- // Now add the line for the receive rates. // sprintf (title, "%s receive (dashed)", hostname); BMPGraphing_new_line (graph, title, DASHED | (i < NCOLORS? colors[i] : RGB_GRAY)); for (j = NETSIZE_MIN; j <= NETSIZE_MAX; j++) { unsigned long chunk_count = 1 << (j-NETSIZE_MIN); unsigned long long amt_to_send = chunk_count; amt_to_send *= NETWORK_CHUNK_SIZE; unsigned long amt_in_kb = amt_to_send / 1024; // printf ("amt_in_kb=%ld\n",amt_in_kb); dataAddDatum (amt_in_kb, recv_rates[j-NETSIZE_MIN]); } newline (); } return true; } //---------------------------------------------------------------------------- // Name: usage //---------------------------------------------------------------------------- void usage () { printf ("Usage: bandwidth [--slow] [--fast] [--faster] [--fastest] [--limit] [--title string] [--csv file] [--nice]\n"); //printf ("Usage for starting network tests: bandwidth --network []\n"); //printf ("Usage for receiving network tests: bandwidth --transponder [--port ]\n"); exit (0); } //---------------------------------------------------------------------------- // Name: main //---------------------------------------------------------------------------- int bandwidth_main (int argc, const char **argv) { int i, chunk_size; outputMode = OUTPUT_MODE_GRAPH; --argc; ++argv; bool network_mode = false; bool network_leader = false; // false => transponder // int network_destinations_size = 0; int n_network_destinations = 0; char **network_destinations = NULL; char graph_title [512] = {0}; i = 0; while (i < argc) { const char *s = argv [i++]; #if NETWORK_MODE // unsure if it still works if (!strcmp ("--network", s)) { network_mode = true; network_leader = true; network_destinations_size = 20; network_destinations = (char**) malloc (network_destinations_size * sizeof (char*)); } else if (!strcmp ("--transponder", s)) { network_mode = true; } else if (!strcmp ("--port", s)) { if (i != argc) network_port = atoi (argv[i++]); } else #endif if (!strcmp ("--nice", s)) { nice_mode = true; } else if (!strcmp ("--slow", s)) { usec_per_test=20000000; // 20 seconds per test. } else if (!strcmp ("--limit", s)) { limit_below_100MB= true; } else if (!strcmp ("--fast", s)) { usec_per_test = 500000; // 0.5 seconds per test. } else if (!strcmp ("--faster", s)) { usec_per_test = 50000; // 0.05 seconds per test. } else if (!strcmp ("--fastest", s)) { usec_per_test = 5000; // 0.005 seconds per test. } else if (!strcmp ("--nosse2", s)) { use_sse2 = false; use_sse4 = false; } else if (!strcmp ("--nosse4", s)) { use_sse4 = false; } else if (!strcmp ("--help", s)) { usage (); } else if (!strcmp ("--nograph", s)) { outputMode &= ~OUTPUT_MODE_GRAPH; } else if (!strcmp ("--csv", s) && i != argc) { outputMode |= OUTPUT_MODE_CSV; if (i < argc) csv_file_path = strdup (argv[i++]); else usage (); } else if (!strcmp ("--title", s) && i != argc) { snprintf (graph_title, 511, "%s", argv[i++]); } else { if ('-' == *s) usage (); } } for (i = 0; chunk_sizes[i] && i < sizeof(chunk_sizes)/sizeof(int); i++) { chunk_sizes_log2[i] = log2 (chunk_sizes[i]); } printf ("This is bandwidth version %s.\n", RELEASE); printf ("Copyright (C) 2005-2017 by Zack T Smith.\n\n"); printf ("This software is covered by the GNU General Public License.\n"); printf ("It is provided AS-IS, use at your own risk.\n"); printf ("See the file COPYING for more information.\n\n"); fflush (stdout); //---------------------------------------- // If network mode selected, enter it now. // Currently cannot combine memory tests // & network tests. // if (network_mode) { if (network_leader) { graph = BMPGraphing_new (GRAPH_WIDTH, GRAPH_HEIGHT, MODE_X_AXIS_LINEAR); strcpy (graph_title, TITLE_MEMORY_NET); BMPGraphing_set_title (graph, graph_title); network_test (network_destinations, n_network_destinations); BMPGraphing_make (graph); BMP_write (graph->image, "network_bandwidth.bmp"); #if defined(__linux__) || defined(__CYGWIN__) || defined(__APPLE__) puts ("Wrote graph to network_bandwidth.bmp."); newline (); puts ("Done."); #endif BMPGraphing_destroy (graph); } else { network_transponder (); } return 0; } #ifdef x86 uint32_t ecx = get_cpuid1_ecx (); uint32_t edx = get_cpuid1_edx (); cpu_has_mmx = edx & CPUID_EDX_MMX; cpu_has_sse = edx & CPUID_EDX_SSE; cpu_has_sse2 = edx & CPUID_EDX_SSE2; cpu_has_sse3 = ecx & CPUID_ECX_SSE3; cpu_has_ssse3 = ecx & CPUID_ECX_SSSE3; cpu_has_sse41 = ecx & CPUID_ECX_SSE41; cpu_has_sse42 = ecx & CPUID_ECX_SSE42; cpu_has_aes = ecx & CPUID_ECX_AES; cpu_has_avx = ecx & CPUID_ECX_AVX; cpu_has_avx2 = 0; if (cpu_has_avx) { cpu_has_avx2 = get_cpuid7_ebx (); cpu_has_avx2 &= CPUID_EBX_AVX2; } use_sse2 = true; use_sse4 = true; cpu_has_sse4a = 0; cpu_has_64bit = 0; cpu_has_xd = 0; static char family [17]; get_cpuid_family (family); family [16] = 0; printf ("CPU family: %s\n", family); uint32_t ecx2 = get_cpuid_80000001_ecx (); uint32_t edx2 = get_cpuid_80000001_edx (); if (!strcmp ("AuthenticAMD", family)) { is_amd = true; cpu_has_sse4a = ecx2 & CPUID_ECX_SSE4A; } else if (!strcmp ("GenuineIntel", family)) { is_intel = true; } cpu_has_xd = edx2 & CPUID_EDX_XD; cpu_has_64bit = edx2 & CPUID_EDX_INTEL64; printf ("CPU features: "); if (cpu_has_mmx) printf ("MMX "); if (cpu_has_sse) printf ("SSE "); if (cpu_has_sse2) printf ("SSE2 "); if (cpu_has_sse3) printf ("SSE3 "); if (cpu_has_ssse3) printf ("SSSE3 "); if (cpu_has_sse4a) printf ("SSE4A "); if (cpu_has_sse41) printf ("SSE4.1 "); if (cpu_has_sse42) printf ("SSE4.2 "); if (cpu_has_aes) printf ("AES "); if (cpu_has_avx) printf ("AVX "); if (cpu_has_avx2) printf ("AVX2 "); if (cpu_has_xd) printf ("XD "); if (cpu_has_64bit) { if (!is_amd) printf ("Intel64 "); else printf ("LongMode "); } puts ("\n"); if (is_intel) { uint32_t cache_info[4]; i = 0; while (1) { get_cpuid_cache_info (cache_info, i); if (!(cache_info[0] & 31)) break; #if 0 printf ("Cache info %d = 0x%08x, 0x%08x, 0x%08x, 0x%08x\n", i, cache_info [0], cache_info [1], cache_info [2], cache_info [3]); #endif printf ("Cache %d: ", i); switch ((cache_info[0] >> 5) & 7) { case 1: printf ("L1 "); break; case 2: printf ("L2 "); break; case 3: printf ("L3 "); break; } switch (cache_info[0] & 31) { case 1: printf ("data cache, "); break; case 2: printf ("instruction cache, "); break; case 3: printf ("unified cache, "); break; } uint32_t n_ways = 1 + (cache_info[1] >> 22); uint32_t line_size = 1 + (cache_info[1] & 2047); uint32_t n_sets = 1 + cache_info[2]; printf ("line size %d, ", line_size); printf ("%2d-way%s, ", n_ways, n_ways>1 ? "s" : ""); printf ("%5d sets, ", n_sets); unsigned size = (n_ways * line_size * n_sets) >> 10; printf ("size %dk ", size); newline (); i++; } } if (!cpu_has_sse41) use_sse4 = false; if (!cpu_has_sse2) use_sse2 = false; newline (); #endif println ("Notation: B = byte, kB = 1024 B, MB = 1048576 B."); flush (); //------------------------------------------------------------ // Attempt to obtain information about the CPU. // #ifdef __linux__ struct stat st; if (!stat ("/proc/cpuinfo", &st)) { #define TMPFILE "/tmp/bandw_tmp" unlink (TMPFILE); if (-1 == system ("grep MHz /proc/cpuinfo | uniq | sed \"s/[\\t\\n: a-zA-Z]//g\" > "TMPFILE)) perror ("system"); FILE *f = fopen (TMPFILE, "r"); if (f) { float cpu_speed = 0.0; if (1 == fscanf (f, "%g", &cpu_speed)) { newline (); printf ("CPU speed is %g MHz.\n", cpu_speed); } fclose (f); } } else { printf ("CPU information is not available (/proc/cpuinfo).\n"); } fflush (stdout); #endif unsigned long chunk_limit = limit_below_100MB ? 100 << 20 : 1<<31; dataBegins (graph_title); //------------------------------------------------------------ // Sequential non-vector reads. // newline (); #ifdef IS_64BIT dataBeginSection ( "Sequential 64-bit reads", RGB_BLUE); #else dataBeginSection ( "Sequential 32-bit reads", RGB_BLUE); #endif i = 0; while ((chunk_size = chunk_sizes [i++]) && chunk_size < chunk_limit) { int amount = do_read (chunk_size, NO_SSE2, false); dataAddDatum (chunk_size, amount); } //------------------------------------------------------------ // Random non-vector reads. // newline (); #ifdef IS_64BIT dataBeginSection ( "Random 64-bit reads", RGB_CYAN); #else dataBeginSection ( "Random 32-bit reads", RGB_CYAN); #endif srand (time (NULL)); i = 0; while ((chunk_size = chunk_sizes [i++]) && chunk_size < chunk_limit) { if (!(chunk_size & 128)) { int amount = do_read (chunk_size, NO_SSE2, true); dataAddDatum (chunk_size, amount); } } //------------------------------------------------------------ // Sequential non-vector writes. // #ifdef IS_64BIT dataBeginSection ( "Sequential 64-bit writes", RGB_DARKGREEN); #else dataBeginSection ( "Sequential 32-bit writes", RGB_DARKGREEN); #endif newline (); i = 0; while ((chunk_size = chunk_sizes [i++]) && chunk_size < chunk_limit) { int amount = do_write (chunk_size, NO_SSE2, false); dataAddDatum (chunk_size, amount); } //------------------------------------------------------------ // Random non-vector writes. // #ifdef IS_64BIT dataBeginSection ( "Random 64-bit writes", RGB_GREEN); #else dataBeginSection ( "Random 32-bit writes", RGB_GREEN); #endif newline (); srand (time (NULL)); i = 0; while ((chunk_size = chunk_sizes [i++]) && chunk_size < chunk_limit) { if (!(chunk_size & 128)) { int amount = do_write (chunk_size, NO_SSE2, true); dataAddDatum (chunk_size, amount); } } #ifdef __arm__ //------------------------------------------------------------ // NEON 128 bit sequential reads. // dataBeginSection ("Sequential 128-bit reads", RGB_RED); newline (); i = 0; while ((chunk_size = chunk_sizes [i++]) && chunk_size < chunk_limit) { int amount = do_read (chunk_size, NEON_128BIT, false); dataAddDatum (chunk_size, amount); } //------------------------------------------------------------ // NEON 128 bit sequential writes. // dataBeginSection ("Sequential 128-bit writes", 0xA04040); newline (); i = 0; while ((chunk_size = chunk_sizes [i++]) && chunk_size < chunk_limit) { int amount = do_write (chunk_size, NEON_128BIT, false); dataAddDatum (chunk_size, amount); } //------------------------------------------------------------ // NEON 64bit random writes. // dataBeginSection ( "Random 64-bit writes", RGB_NAVYBLUE); newline (); srand (time (NULL)); i = 0; while ((chunk_size = chunk_sizes [i++]) && chunk_size < chunk_limit) { int amount = do_write (chunk_size, NEON_64BIT, true); dataAddDatum (chunk_size, amount); } //------------------------------------------------------------ // NEON 64bit random reads. // dataBeginSection ( "Random 64-bit reads", RGB_MAROON); newline (); srand (time (NULL)); i = 0; while ((chunk_size = chunk_sizes [i++]) && chunk_size < chunk_limit) { int amount = do_read (chunk_size, NEON_64BIT, true); dataAddDatum (chunk_size, amount); } #endif #ifdef x86 //------------------------------------------------------------ // SSE2 sequential reads. // if (use_sse2) { dataBeginSection ("Sequential 128-bit reads", RGB_RED); newline (); i = 0; while ((chunk_size = chunk_sizes [i++]) && chunk_size < chunk_limit) { int amount = do_read (chunk_size, SSE2, false); dataAddDatum (chunk_size, amount); } } //------------------------------------------------------------ // AVX sequential reads. // if (cpu_has_avx) { dataBeginSection ( "Sequential 256-bit reads", RGB_TURQUOISE); newline (); i = 0; while ((chunk_size = chunk_sizes [i++]) && chunk_size < chunk_limit) { if (!(chunk_size & 128)) { int amount = do_read (chunk_size, AVX, false); dataAddDatum (chunk_size, amount); } } } //------------------------------------------------------------ // AVX random reads. // #ifdef IS_64BIT if (cpu_has_avx) { dataBeginSection ( "Random 256-bit reads", RGB_BROWN ); newline (); i = 0; while ((chunk_size = chunk_sizes [i++]) && chunk_size < chunk_limit) { if (!(chunk_size & 128)) { int amount = do_read (chunk_size, AVX, true); dataAddDatum (chunk_size, amount); } } } #endif //------------------------------------------------------------ // SSE2 random reads. // if (use_sse2) { dataBeginSection ( "Random 128-bit reads", RGB_MAROON); newline (); srand (time (NULL)); i = 0; while ((chunk_size = chunk_sizes [i++]) && chunk_size < chunk_limit) { if (!(chunk_size & 128)) { int amount = do_read (chunk_size, SSE2, true); dataAddDatum (chunk_size, amount); } } } //------------------------------------------------------------ // SSE2 sequential writes that do not bypass the caches. // if (use_sse2) { dataBeginSection ( "Sequential 128-bit cache writes", RGB_PURPLE); newline (); i = 0; while ((chunk_size = chunk_sizes [i++]) && chunk_size < chunk_limit) { int amount = do_write (chunk_size, SSE2, false); dataAddDatum (chunk_size, amount); } } //------------------------------------------------------------ // AVX sequential writes that do not bypass the caches. // if (cpu_has_avx) { dataBeginSection ( "Sequential 256-bit cache writes", RGB_PINK); newline (); i = 0; while ((chunk_size = chunk_sizes [i++]) && chunk_size < chunk_limit) { if (!(chunk_size & 128)) { int amount = do_write (chunk_size, AVX, false); dataAddDatum (chunk_size, amount); } } } //------------------------------------------------------------ // AVX randomized writes that do not bypass the caches. // #ifdef IS_64BIT if (cpu_has_avx) { dataBeginSection ( "Random 256-bit cache writes", RGB_RED); newline (); i = 0; while ((chunk_size = chunk_sizes [i++]) && chunk_size < chunk_limit) { if (!(chunk_size & 128)) { int amount = do_write (chunk_size, AVX, true); dataAddDatum (chunk_size, amount); } } } #endif //------------------------------------------------------------ // SSE2 random writes that do not bypass the caches. // if (use_sse2) { dataBeginSection ( "Random 128-bit cache writes", RGB_NAVYBLUE); newline (); srand (time (NULL)); i = 0; while ((chunk_size = chunk_sizes [i++]) && chunk_size < chunk_limit) { if (!(chunk_size & 128)) { int amount = do_write (chunk_size, SSE2, true); dataAddDatum (chunk_size, amount); } } } //------------------------------------------------------------ // SSE4 sequential reads that do bypass the caches. // if (use_sse4) { dataBeginSection ( "Sequential 128-bit non-temporal reads", 0xA04040); newline (); i = 0; while ((chunk_size = chunk_sizes [i++]) && chunk_size < chunk_limit) { int amount = do_read (chunk_size, SSE2_BYPASS, false); dataAddDatum (chunk_size, amount); } } //------------------------------------------------------------ // SSE4 random reads that do bypass the caches. // if (use_sse4) { dataBeginSection ( "Random 128-bit non-temporal reads", 0x301934 /* dark purple */); newline (); i = 0; while ((chunk_size = chunk_sizes [i++]) && chunk_size < chunk_limit) { if (!(chunk_size & 128)) { int amount = do_read (chunk_size, SSE2_BYPASS, true); dataAddDatum (chunk_size, amount); } } } //------------------------------------------------------------ // SSE4 sequential writes that do bypass the caches. // if (use_sse4) { dataBeginSection ( "Sequential 128-bit non-temporal writes", RGB_DARKORANGE); newline (); i = 0; while ((chunk_size = chunk_sizes [i++]) && chunk_size < chunk_limit) { int amount = do_write (chunk_size, SSE2_BYPASS, false); dataAddDatum (chunk_size, amount); } } //------------------------------------------------------------ // AVX sequential writes that do bypass the caches. // if (cpu_has_avx) { dataBeginSection ( "Sequential 256-bit non-temporal writes", RGB_DARKOLIVEGREEN); newline (); i = 0; while ((chunk_size = chunk_sizes [i++]) && chunk_size < chunk_limit) { if (!(chunk_size & 128)) { int amount = do_write (chunk_size, AVX_BYPASS, false); dataAddDatum (chunk_size, amount); } } } //------------------------------------------------------------ // SSE4 random writes that bypass the caches. // if (use_sse4) { dataBeginSection ( "Random 128-bit non-temporal writes", RGB_LEMONYELLOW); newline (); srand (time (NULL)); i = 0; while ((chunk_size = chunk_sizes [i++]) && chunk_size < chunk_limit) { if (!(chunk_size & 128)) { int amount = do_write (chunk_size, SSE2_BYPASS, true); dataAddDatum (chunk_size, amount); } } } //------------------------------------------------------------ // SSE2 sequential copy. // if (use_sse2) { dataBeginSection ( "Sequential 128-bit copy", 0x8f8844); newline (); i = 0; while ((chunk_size = chunk_sizes [i++]) && chunk_size < chunk_limit) { int amount = do_copy (chunk_size, SSE2); dataAddDatum (chunk_size, amount); } } //------------------------------------------------------------ // AVX sequential copy. // if (cpu_has_avx) { dataBeginSection ( "Sequential 256-bit copy", RGB_CHARTREUSE); newline (); i = 0; while ((chunk_size = chunk_sizes [i++]) && chunk_size < chunk_limit) { if (!(chunk_size & 128)) { int amount = do_copy (chunk_size, AVX); dataAddDatum (chunk_size, amount); } } } #ifdef DOING_LODS #ifdef IS_64BIT //------------------------------------------------------------ // LODSQ 64-bit sequential reads. // dataBeginSection ( "Sequential 64-bit LODSQ reads", RGB_GRAY6); newline (); i = 0; while ((chunk_size = chunk_sizes [i++]) && chunk_size < chunk_limit) { int amount = do_read (chunk_size, LODSQ, false); dataAddDatum (chunk_size, amount); } #endif //------------------------------------------------------------ // LODSD 32-bit sequential reads. // dataBeginSection ( "Sequential 32-bit LODSD reads", RGB_GRAY8); newline (); i = 0; while ((chunk_size = chunk_sizes [i++]) && chunk_size < chunk_limit) { int amount = do_read (chunk_size, LODSD, false); dataAddDatum (chunk_size, amount); } //------------------------------------------------------------ // LODSW 16-bit sequential reads. // dataBeginSection ( "Sequential 16-bit LODSW reads", RGB_GRAY10); newline (); i = 0; while ((chunk_size = chunk_sizes [i++]) && chunk_size < chunk_limit) { int amount = do_read (chunk_size, LODSW, false); dataAddDatum (chunk_size, amount); } //------------------------------------------------------------ // LODSB 64-bit sequential reads. // dataBeginSection ( "Sequential 8-bit LODSB reads", RGB_GRAY12); newline (); i = 0; while ((chunk_size = chunk_sizes [i++]) && chunk_size < chunk_limit) { int amount = do_read (chunk_size, LODSB, false); dataAddDatum (chunk_size, amount); } #endif // lods #endif // x86 //------------------------------------------------------------ // Register to register. // newline (); register_test (); //------------------------------------------------------------ // Stack to/from register. // newline (); stack_test (); #ifndef __arm__ //------------------------------------------------------------ // Register vs stack. // newline (); time_t t0 = mytime (); #ifdef IS_64BIT #define N_INC_OUTER_LOOPS 65537L #define N_INC_INNER_LOOPS 32767L #else #define N_INC_OUTER_LOOPS 9997L #define N_INC_INNER_LOOPS 3337L #endif for (i=0; i 0) { long double d = N_INC_OUTER_LOOPS * 32; d *= N_INC_INNER_LOOPS; d /= diff; d *= 1000000; // usec->sec d /= 1000000000; // billions/sec #ifdef IS_64BIT printf ("64-bit register increments per second: %.2Lf billion\n", d); #else printf ("32-bit register increments per second: %.2Lf billion\n", d); #endif } t0 = mytime (); for (i=0; i < N_INC_INNER_LOOPS; i++) { IncrementStack (N_INC_INNER_LOOPS); } diff = mytime () - t0; if (diff > 0) { long double d = N_INC_OUTER_LOOPS * 32; d *= N_INC_INNER_LOOPS; d /= diff; d *= 1000000; // usec->sec d /= 1000000000; // billions/sec #ifdef IS_64BIT printf ("64-bit stack value increments per second: %.2Lf billion\n", d); #else printf ("32-bit stack value increments per second: %.2Lf billion\n", d); #endif } #endif //------------------------------------------------------------ // C library performance. // newline (); library_test (); //------------------------------------------------------------ // Framebuffer read & write. // #if defined(__linux__) && defined(FBIOGET_FSCREENINFO) newline (); fb_readwrite (true); #endif flush (); newline (); dataEnds ("bandwidth.bmp"); newline (); puts ("Done."); return 0; } int bandwidth_cpux(struct BandwidthData *bwd) { int i, chunk_size; outputMode = OUTPUT_MODE_GRAPH; usec_per_test = 5000; do_print = false; /* Needed by CPU-X */ int count = 0; uint8_t cache_level = 0; double total_amount = 0; pthread_mutex_lock(&bwd->mutex); for (i = 0; chunk_sizes[i] && i < sizeof(chunk_sizes)/sizeof(int); i++) { chunk_sizes_log2[i] = log2 (chunk_sizes[i]); } uint32_t ecx = get_cpuid1_ecx (); uint32_t edx = get_cpuid1_edx (); uint32_t ecx2 = get_cpuid_80000001_ecx (); uint32_t edx2 = get_cpuid_80000001_edx (); cpu_has_mmx = edx & CPUID_EDX_MMX; cpu_has_sse = edx & CPUID_EDX_SSE; cpu_has_sse2 = edx & CPUID_EDX_SSE2; cpu_has_sse3 = ecx & CPUID_ECX_SSE3; cpu_has_ssse3 = ecx & CPUID_ECX_SSSE3; cpu_has_sse41 = ecx & CPUID_ECX_SSE41; cpu_has_sse42 = ecx & CPUID_ECX_SSE42; cpu_has_aes = ecx & CPUID_ECX_AES; cpu_has_avx = ecx & CPUID_ECX_AVX; cpu_has_avx2 = 0; cpu_has_xd = edx2 & CPUID_EDX_XD; cpu_has_64bit = edx2 & CPUID_EDX_INTEL64; cpu_has_sse4a = bwd->is_amd_cpu ? ecx2 & CPUID_ECX_SSE4A : 0; if (cpu_has_avx) { cpu_has_avx2 = get_cpuid7_ebx (); cpu_has_avx2 &= CPUID_EBX_AVX2; } /* Needed by CPU-X */ if (!cpu_has_sse41) use_sse4 = false; if (!cpu_has_sse2) use_sse2 = false; const struct Tests tests[] = { /* Test Name Color Flag Mask Func Mode Rand */ { SEQ_128_R, "Sequential 128-bit reads", RGB_RED, use_sse2, false, do_read, SSE2, false }, { SEQ_256_R, "Sequential 256-bit reads", RGB_TURQUOISE, cpu_has_avx, true, do_read, AVX, false }, { RAND_128_R, "Random 128-bit reads", RGB_MAROON, use_sse2, true, do_read, SSE2, true }, { SEQ_128_CACHE_W, "Sequential 128-bit cache writes", RGB_PURPLE, use_sse2, false, do_write, SSE2, false }, { SEQ_256_CACHE_W, "Sequential 256-bit cache writes", RGB_PINK, cpu_has_avx, true, do_write, AVX, false }, { RAND_128_CACHE_W, "Random 128-bit cache writes", RGB_NAVYBLUE, use_sse2, true, do_write, SSE2, true }, { SEQ_128_BYPASS_R, "Sequential 128-bit non-temporal reads", 0xA04040, use_sse4, false, do_read, SSE2_BYPASS, false }, { RAND_128_BYPASS_R, "Random 128-bit non-temporal reads", 0x301934, use_sse4, true, do_read, SSE2_BYPASS, true }, { SEQ_128_BYPASS_W, "Sequential 128-bit non-temporal writes", RGB_DARKORANGE, use_sse4, false, do_write, SSE2_BYPASS, false }, { SEQ_256_BYPASS_W, "Sequential 256-bit non-temporal writes", RGB_DARKOLIVEGREEN, cpu_has_avx, true, do_write, AVX_BYPASS, false }, { RAND_128_BYPASS_W, "Random 128-bit non-temporal writes", RGB_LEMONYELLOW, use_sse4, true, do_write, SSE2_BYPASS, true }, { SEQ_128_C, "Sequential 128-bit copy", 0x8f8844, use_sse2, false, do_copy2, SSE2, false }, { SEQ_256_C, "Sequential 256-bit copy", RGB_CHARTREUSE, cpu_has_avx, true, do_copy2, AVX, false }, { SEQ_32_LR, "Sequential 32-bit LODSD reads", RGB_GRAY8, true, false, do_read, LODSD, false }, { SEQ_16_LR, "Sequential 16-bit LODSW reads", RGB_GRAY10, true, false, do_read, LODSW, false }, { SEQ_8_LR, "Sequential 8-bit LODSB reads", RGB_GRAY12, true, false, do_read, LODSB, false }, #ifdef __x86_64__ { SEQ_64_LR, "Sequential 64-bit LODSQ reads", RGB_GRAY6, true, false, do_read, LODSQ, false }, { SEQ_64_R, "Sequential 64-bit reads", RGB_BLUE, true, false, do_read, NO_SSE2, false }, { RAND_64_R, "Random 64-bit reads", RGB_CYAN, true, true, do_read, NO_SSE2, true }, { SEQ_64_W, "Sequential 64-bit writes", RGB_DARKGREEN, true, false, do_write, NO_SSE2, false }, { RAND_64_W, "Random 64-bit writes", RGB_GREEN, true, true, do_write, NO_SSE2, true }, { RAND_256_R, "Random 256-bit reads", RGB_BROWN, cpu_has_avx, true, do_read, AVX, true }, { RAND_256_W, "Random 256-bit cache writes", RGB_RED, cpu_has_avx, true, do_write, AVX, true }, #else { SEQ_32_R, "Sequential 32-bit reads", RGB_BLUE, true, false, do_read, NO_SSE2, false }, { RAND_32_R, "Random 32-bit reads", RGB_CYAN, true, true, do_read, NO_SSE2, true }, { SEQ_32_W, "Sequential 32-bit writes", RGB_DARKGREEN, true, false, do_write, NO_SSE2, false }, { RAND_32_W, "Random 32-bit writes", RGB_GREEN, true, true, do_write, NO_SSE2, true }, #endif { -1, NULL, 0x0, false, false, NULL, 0, false } }; /* Set test names */ if(bwd->test_name == NULL) { bwd->test_name = malloc(BANDWIDTH_LAST_TEST * sizeof(char *)); for(i = 0; i < BANDWIDTH_LAST_TEST; i++) { bwd->test_name[i] = NULL; asprintf(&bwd->test_name[i], "#%2i: %s %s", i, tests[i].name, tests[i].need_flag ? "" : _("(unavailable)")); } } if(tests[bwd->selected_test].need_flag) { if(tests[bwd->selected_test].random) srand(time (NULL)); i = 0; while((chunk_size = chunk_sizes [i++])) { if(!tests[bwd->selected_test].need_mask || (tests[bwd->selected_test].need_mask && !(chunk_size & 128))) { if(chunk_size > bwd->cache_size[cache_level] * 1024) { bwd->cache_speed[cache_level] = total_amount / count; count = 0; total_amount = 0; cache_level++; if(bwd->cache_size[cache_level] == 0) goto clean; } int amount = (*tests[bwd->selected_test].func_ptr)(chunk_size, tests[bwd->selected_test].mode, tests[bwd->selected_test].random); total_amount += amount; count++; } } } else { for(i = 0; i < BANDWIDTH_MAX_CACHE_LEVEL; i++) bwd->cache_speed[i] = 0; } clean: pthread_mutex_unlock(&bwd->mutex); return 0; } CPU-X-5.0.3/src/bandwidth/minifont.c000066400000000000000000000155561454622605200171170ustar00rootroot00000000000000 /*============================================================================= bmplib, a simple library to create, modify, and write BMP image files. Copyright (C) 2009-2014 by Zack T Smith. 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., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA The author may be reached at 1@zsmith.co. *============================================================================*/ #include #include "BMP.h" // Mini characters, 8 pixels high. static const char *mini_chars_ [] = { "#", "#", "#", "#", "#", " ", "#", "", "## ##", " # #", "# #", " ", " ", " ", " ", "", " # # ", " # # ", "#####", " # # ", "#####", " # # ", " # # ", "", " # ", " ####", "# # ", " ### ", " # #", "####", " # ", "", "## #", " #", " #", " #", " #", "#", "# ##", "", " # ", "# # ", "## ", " ## #", "# ## ", "# # ", " ## #", "", "##", " #", "#", "", "", "", "", "", " #", "#", "#", "#", "#", "#", "#", " #", "# ", " #", " #", " #", " #", " #", " #", "#", " ", "# # #", " ###", " #", " ###", "# # #", "", "", " ", " #", " #", "#####", " #", " #", "", "", " ", "", "", "", "", "##", " #", "#", " ", "", "", "#####", "", "", "", "", " ", "", "", "", "", "", "#", "", " #", " #", " #", " #", " #", "#", "#", "", " ## ", "# #", "# #", "# #", "# #", "# #", " ## ", "", " #", "##", " #", " #", " #", " #", " #", "", " ## ", "# #", " #", " ###", "# ", "# ", "####", "", "####", " #", " # ", " ## ", " #", "# #", " ## ", "", "# # ", "# #", "# #", "####", " #", " #", " #", "", "####", "# ", "### ", " #", " #", "# #", " ## ", "", " ## ", "# ", "# ", "### ", "# #", "# #", " ## ", "", "####", " #", " #", " # ", " # ", " # ", " # ", "", " ## ", "# #", "# #", " ## ", "# #", "# #", " ## ", "", " ## ", "# #", "# #", " ###", " #", " # ", " # ", "", " ", "", "", "#", "", "#", "", "", " ", "", " ", "##", " ", "##", " #", "#", " #", " #", " #", "#", " #", " #", " #", "", " ", "", "", "#####", " ", "#####", "", "", "# ", " #", " #", " #", " #", " #", "#", "", " ### ", "# #", " #", " ## ", " #", "", " #", "", " ### ", "# #", "# ##", "# # #", "# ##", "# ", " ###", "", " # ", " # # ", "# #", "# #", "#####", "# #", "# #", "", "### ", "# #", "# #", "### ", "# #", "# #", "###", "", " ### ", "# #", "# ", "# ", "# ", "# #", " ###", "", "#### ", "# #", "# #", "# #", "# #", "# #", "####", "", "#####", "#", "#", "###", "#", "#", "#####", "", "#####", "# ", "# ", "###", "# ", "# ", "#", "", " ### ", "# #", "# ", "# ##", "# #", "# #", " ####", "", "# #", "# #", "# #", "#####", "# #", "# #", "# #", "", "###", " #", " #", " #", " #", " #", "###", "", " ###", " #", " #", " #", " #", "# #", " ##", "", "# #", "# #", "# #", "##", "# #", "# #", "# #", "", "# ", "#", "#", "#", "#", "#", "#####", "", "# #", "## ##", "# # #", "# #", "# #", "# #", "# #", "", "# #", "## #", "# # #", "# ##", "# #", "# #", "# #", "", " ### ", "# #", "# #", "# #", "# #", "# #", " ###", "", "#### ", "# #", "# #", "#### ", "# ", "# ", "# ", "", " ### ", "# #", "# #", "# #", "# # #", "# # ", " ## #", "", "#### ", "# #", "# #", "#### ", "# # ", "# # ", "# #", "", " ### ", "# #", "# ", " ### ", " #", "# #", " ###", "", "#####", " #", " #", " #", " #", " #", " #", "", "# #", "# #", "# #", "# #", "# #", "# #", " ###", "", "# #", "# #", "# #", "# #", "# #", " # # ", " #", "", "# #", "# #", "# #", "# # #", "# # #", "## ##", "# #", "", "# #", "# #", " # #", " #", " # #", "# #", "# #", "", "# #", "# #", "# #", " # #", " #", " #", " #", "", "#####", " #", " #", " #", " #", "#", "#####", "", "##", "#", "#", "#", "#", "#", "#", "##", "#", "#", " #", " #", " #", " #", " #", "", "##", " #", " #", " #", " #", " #", " #", "##", " # ", " # #", "# #", "", "", "", "", "", " ", "", "", "", "", "", "", "####", "##", "#", " #", "", "", "", "", "", " ", " ", " ## ", " #", " ###", "# #", " ###", "", "# ", "# ", "### ", "# #", "# #", "# #", "### ", "", " ", " ", " ###", "# ", "# ", "# ", " ###", "", " #", " #", " ###", "# #", "# #", "# #", " ###", "", " ", " ", " ## ", "# #", "####", "# ", " ###", "", " ##", " # ", "### ", " # ", " # ", " # ", "### ", "", " ", " ", " ###", "# #", "# #", " ###", " #", "### ", "# ", "# ", "### ", "# #", "# #", "# #", "# #", "", " # ", " ", "## ", " # ", " # ", " # ", "###", "", " #", " ", " ##", " #", " #", " #", " #", "## ", "# ", "# ", "# #", "# # ", "## ", "# # ", "# #", "", "## ", " # ", " # ", " # ", " # ", " # ", "###", "", " ", "", "####", "# # #", "# # #", "# # #", "# # #", "", " ", " ", "###", "# #", "# #", "# #", "# #", "", " ", " ", " ## ", "# #", "# #", "# #", " ## ", "", " ", "", "###", "# #", "# #", "###", "#", "#", " ", "", " ###", "# #", "# #", " ###", " #", " # ", " ", " ", "# ##", "## ", "# ", "# ", "# ", "", " ", " ", " ###", "# ", " ##", " #", "### ", "", " # ", " #", "###", " #", " #", " #", " ##", "", " ", "", "# #", "# #", "# #", "# #", " ###", "", " ", "", "# #", "# #", "# #", " # #", " #", "", " ", "", "# # #", "# # #", "# # #", "# # #", " # #", "", " ", "", "# #", " # #", " #", " # #", "# #", "", " ", " ", "# #", "# #", "# #", " ###", " #", "### ", " ", "", "#####", " #", " #", " # ", "#####", "", }; const char **get_minifont_chars () { return mini_chars_; } CPU-X-5.0.3/src/bandwidth/minifont.h000066400000000000000000000020421454622605200171060ustar00rootroot00000000000000 /*============================================================================= bmplib, a simple library to create, modify, and write BMP image files. Copyright (C) 2009-2014 by Zack T Smith. 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., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA The author may be reached at 1@zsmith.co. *============================================================================*/ #ifndef _MINIFONT_H #define _MINIFONT_H extern const char **get_minifont_chars (void); #endif CPU-X-5.0.3/src/bandwidth/routines-x86-32bit.asm000066400000000000000000001654511454622605200210460ustar00rootroot00000000000000;============================================================================ ; bandwidth, a benchmark to estimate memory transfer bandwidth. ; Copyright (C) 2005-2015 by Zack T Smith. ; ; This program is free software; you can redistribute it and/or modify ; it under the terms of the GNU General Public License as published by ; the Free Software Foundation; either version 2 of the License, or ; (at your option) any later version. ; ; This program is distributed in the hope that it will be useful, ; but WITHOUT ANY WARRANTY; without even the implied warranty of ; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ; GNU General Public License for more details. ; ; You should have received a copy of the GNU General Public License ; along with this program; if not, write to the Free Software ; Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA ; ; The author may be reached at veritas@comcast.net. ;============================================================================= bits 32 cpu ia64 global IncrementRegisters global _IncrementRegisters global IncrementStack global _IncrementStack global ReaderLODSQ global _ReaderLODSQ global ReaderLODSD global _ReaderLODSD global ReaderLODSW global _ReaderLODSW global ReaderLODSB global _ReaderLODSB ; Cygwin requires the underbar-prefixed symbols. global _WriterSSE2 global WriterSSE2 global _WriterAVX global WriterAVX global _WriterSSE2_128bytes global WriterSSE2_128bytes global _ReaderAVX global ReaderAVX global _ReaderSSE2 global ReaderSSE2 global ReaderSSE2_bypass global _ReaderSSE2_bypass global _ReaderSSE2_128bytes global ReaderSSE2_128bytes global ReaderSSE2_128bytes_bypass global _ReaderSSE2_128bytes_bypass global _RandomReaderSSE2 global RandomReaderSSE2 global _RandomReaderSSE2_bypass global RandomReaderSSE2_bypass global WriterAVX_bypass global _WriterAVX_bypass global _WriterSSE2_bypass global WriterSSE2_bypass global _WriterSSE2_128bytes_bypass global WriterSSE2_128bytes_bypass global _RandomWriterSSE2_bypass global RandomWriterSSE2_bypass global Reader global _Reader global Writer global _Writer global Reader_128bytes global _Reader_128bytes global Writer_128bytes global _Writer_128bytes global RandomReader global _RandomReader global RandomWriter global _RandomWriter global RandomWriterSSE2 global _RandomWriterSSE2 global get_cpuid_family global _get_cpuid_family global get_cpuid_cache_info global _get_cpuid_cache_info global get_cpuid1_ecx global _get_cpuid1_ecx global get_cpuid1_edx global _get_cpuid1_edx global get_cpuid7_ebx global _get_cpuid7_ebx global get_cpuid_80000001_ecx global _get_cpuid_80000001_ecx global get_cpuid_80000001_edx global _get_cpuid_80000001_edx global CopySSE global _CopySSE global CopyAVX global _CopyAVX global CopySSE_128bytes global _CopySSE_128bytes global RegisterToRegister global _RegisterToRegister global VectorToVector global _VectorToVector global VectorToVectorAVX global _VectorToVectorAVX global RegisterToVector global _RegisterToVector global VectorToRegister global _VectorToRegister global Register8ToVector global Register16ToVector global Register32ToVector global Register64ToVector global Vector8ToRegister global Vector16ToRegister global Vector32ToRegister global Vector64ToRegister global _Register8ToVector global _Register16ToVector global _Register32ToVector global _Register64ToVector global _Vector8ToRegister global _Vector16ToRegister global _Vector32ToRegister global _Vector64ToRegister global StackReader global _StackReader global StackWriter global _StackWriter section .text ;------------------------------------------------------------------------------ ; Name: ReaderLODSQ ; Purpose: Reads 64-bit values sequentially from an area of memory ; using LODSQ instruction. ; Params: rdi = ptr to memory area ; rsi = length in bytes ; rdx = loops ;------------------------------------------------------------------------------ align 32 ReaderLODSQ: _ReaderLODSQ: ; N/A ret ;------------------------------------------------------------------------------ ; Name: ReaderLODSD ; Purpose: Reads 32-bit values sequentially from an area of memory ; using LODSD instruction. ; Params: ; [esp+4] = ptr to memory area ; [esp+8] = length in bytes ; [esp+12] = loops ;------------------------------------------------------------------------------ align 32 ReaderLODSD: _ReaderLODSD: shr dword [esp+8], 2 ; length in double words rounded down. push ebx push ecx ; REP counter push edx mov edx, [esp+12+12] .L1: mov esi, [esp+4+12] mov ecx, [esp+8+12] rep lodsd dec edx jnz .L1 pop edx pop ecx pop ebx ret ;------------------------------------------------------------------------------ ; Name: ReaderLODSW ; Purpose: Reads 16-bit values sequentially from an area of memory ; using LODSW instruction. ; Params: ; [esp+4] = ptr to memory area ; [esp+8] = length in bytes ; [esp+12] = loops ;------------------------------------------------------------------------------ align 32 ReaderLODSW: _ReaderLODSW: shr dword [esp+8], 1 ; length in words rounded down. push ebx push ecx ; REP counter push edx mov edx, [esp+12+12] .L1: mov esi, [esp+4+12] mov ecx, [esp+8+12] rep lodsw dec edx jnz .L1 pop edx pop ecx pop ebx ret ;------------------------------------------------------------------------------ ; Name: ReaderLODSB ; Purpose: Reads 8-bit values sequentially from an area of memory ; using LODSB instruction. ; Params: ; [esp+4] = ptr to memory area ; [esp+8] = length in bytes ; [esp+12] = loops ;------------------------------------------------------------------------------ align 32 ReaderLODSB: _ReaderLODSB: push ebx push ecx ; REP counter push edx mov edx, [esp+12+12] .L1: mov esi, [esp+4+12] mov ecx, [esp+8+12] rep lodsb dec edx jnz .L1 pop edx pop ecx pop ebx ret ;------------------------------------------------------------------------------ ; Name: Reader ; Purpose: Reads 32-bit values sequentially from an area of memory. ; Params: ; [esp+4] = ptr to memory area ; [esp+8] = length in bytes ; [esp+12] = loops ;------------------------------------------------------------------------------ align 64 Reader: _Reader: push ebx push ecx push edx mov ecx, [esp+12+12] ; loops to do. mov edx, [esp+4+12] ; ptr to memory chunk. mov ebx, edx ; ebx = limit in memory add ebx, [esp+8+12] .L1: mov edx, [esp+4+12] .L2: mov eax, [edx] mov eax, [4+edx] mov eax, [8+edx] mov eax, [12+edx] mov eax, [16+edx] mov eax, [20+edx] mov eax, [24+edx] mov eax, [28+edx] mov eax, [32+edx] mov eax, [36+edx] mov eax, [40+edx] mov eax, [44+edx] mov eax, [48+edx] mov eax, [52+edx] mov eax, [56+edx] mov eax, [60+edx] mov eax, [64+edx] mov eax, [68+edx] mov eax, [72+edx] mov eax, [76+edx] mov eax, [80+edx] mov eax, [84+edx] mov eax, [88+edx] mov eax, [92+edx] mov eax, [96+edx] mov eax, [100+edx] mov eax, [104+edx] mov eax, [108+edx] mov eax, [112+edx] mov eax, [116+edx] mov eax, [120+edx] mov eax, [124+edx] mov eax, [edx+128] mov eax, [edx+132] mov eax, [edx+136] mov eax, [edx+140] mov eax, [edx+144] mov eax, [edx+148] mov eax, [edx+152] mov eax, [edx+156] mov eax, [edx+160] mov eax, [edx+164] mov eax, [edx+168] mov eax, [edx+172] mov eax, [edx+176] mov eax, [edx+180] mov eax, [edx+184] mov eax, [edx+188] mov eax, [edx+192] mov eax, [edx+196] mov eax, [edx+200] mov eax, [edx+204] mov eax, [edx+208] mov eax, [edx+212] mov eax, [edx+216] mov eax, [edx+220] mov eax, [edx+224] mov eax, [edx+228] mov eax, [edx+232] mov eax, [edx+236] mov eax, [edx+240] mov eax, [edx+244] mov eax, [edx+248] mov eax, [edx+252] add edx, 256 cmp edx, ebx jb .L2 sub ecx, 1 jnz .L1 pop edx pop ecx pop ebx ret ;------------------------------------------------------------------------------ ; Name: Writer ; Purpose: Writes 32-bit value sequentially to an area of memory. ; Params: ; [esp+4] = ptr to memory area ; [esp+8] = length in bytes ; [esp+12] = loops ; [esp+16] = long to write ;------------------------------------------------------------------------------ align 64 Writer: _Writer: push ebx push ecx push edx mov ecx, [esp+12+12] mov eax, [esp+16+12] mov edx, [esp+4+12] ; edx = ptr to chunk mov ebx, edx add ebx, [esp+8+12] ; ebx = limit in memory .L1: mov edx, [esp+4+12] .L2: mov [edx], eax mov [4+edx], eax mov [8+edx], eax mov [12+edx], eax mov [16+edx], eax mov [20+edx], eax mov [24+edx], eax mov [28+edx], eax mov [32+edx], eax mov [36+edx], eax mov [40+edx], eax mov [44+edx], eax mov [48+edx], eax mov [52+edx], eax mov [56+edx], eax mov [60+edx], eax mov [64+edx], eax mov [68+edx], eax mov [72+edx], eax mov [76+edx], eax mov [80+edx], eax mov [84+edx], eax mov [88+edx], eax mov [92+edx], eax mov [96+edx], eax mov [100+edx], eax mov [104+edx], eax mov [108+edx], eax mov [112+edx], eax mov [116+edx], eax mov [120+edx], eax mov [124+edx], eax mov [edx+128], eax mov [edx+132], eax mov [edx+136], eax mov [edx+140], eax mov [edx+144], eax mov [edx+148], eax mov [edx+152], eax mov [edx+156], eax mov [edx+160], eax mov [edx+164], eax mov [edx+168], eax mov [edx+172], eax mov [edx+176], eax mov [edx+180], eax mov [edx+184], eax mov [edx+188], eax mov [edx+192], eax mov [edx+196], eax mov [edx+200], eax mov [edx+204], eax mov [edx+208], eax mov [edx+212], eax mov [edx+216], eax mov [edx+220], eax mov [edx+224], eax mov [edx+228], eax mov [edx+232], eax mov [edx+236], eax mov [edx+240], eax mov [edx+244], eax mov [edx+248], eax mov [edx+252], eax add edx, 256 cmp edx, ebx jb .L2 sub ecx, 1 jnz .L1 pop edx pop ecx pop ebx ret ;------------------------------------------------------------------------------ ; Name: Reader_128bytes ; Purpose: Reads 32-bit values sequentially from an area of memory. ; Params: ; [esp+4] = ptr to memory area ; [esp+8] = length in bytes ; [esp+12] = loops ;------------------------------------------------------------------------------ align 64 Reader_128bytes: _Reader_128bytes: push ebx push ecx push edx mov ecx, [esp+12+12] ; loops to do. mov edx, [esp+4+12] ; ptr to memory chunk. mov ebx, edx ; ebx = limit in memory add ebx, [esp+8+12] .L1: mov edx, [esp+4+12] .L2: mov eax, [edx] mov eax, [4+edx] mov eax, [8+edx] mov eax, [12+edx] mov eax, [16+edx] mov eax, [20+edx] mov eax, [24+edx] mov eax, [28+edx] mov eax, [32+edx] mov eax, [36+edx] mov eax, [40+edx] mov eax, [44+edx] mov eax, [48+edx] mov eax, [52+edx] mov eax, [56+edx] mov eax, [60+edx] mov eax, [64+edx] mov eax, [68+edx] mov eax, [72+edx] mov eax, [76+edx] mov eax, [80+edx] mov eax, [84+edx] mov eax, [88+edx] mov eax, [92+edx] mov eax, [96+edx] mov eax, [100+edx] mov eax, [104+edx] mov eax, [108+edx] mov eax, [112+edx] mov eax, [116+edx] mov eax, [120+edx] mov eax, [124+edx] add edx, 128 cmp edx, ebx jb .L2 sub ecx, 1 jnz .L1 pop edx pop ecx pop ebx ret ;------------------------------------------------------------------------------ ; Name: Writer_128bytes ; Purpose: Writes 32-bit value sequentially to an area of memory. ; Params: ; [esp+4] = ptr to memory area ; [esp+8] = length in bytes ; [esp+12] = loops ; [esp+16] = long to write ;------------------------------------------------------------------------------ align 64 Writer_128bytes: _Writer_128bytes: push ebx push ecx push edx mov ecx, [esp+12+12] mov eax, [esp+16+12] mov edx, [esp+4+12] ; edx = ptr to chunk mov ebx, edx add ebx, [esp+8+12] ; ebx = limit in memory .L1: mov edx, [esp+4+12] .L2: mov [edx], eax mov [4+edx], eax mov [8+edx], eax mov [12+edx], eax mov [16+edx], eax mov [20+edx], eax mov [24+edx], eax mov [28+edx], eax mov [32+edx], eax mov [36+edx], eax mov [40+edx], eax mov [44+edx], eax mov [48+edx], eax mov [52+edx], eax mov [56+edx], eax mov [60+edx], eax mov [64+edx], eax mov [68+edx], eax mov [72+edx], eax mov [76+edx], eax mov [80+edx], eax mov [84+edx], eax mov [88+edx], eax mov [92+edx], eax mov [96+edx], eax mov [100+edx], eax mov [104+edx], eax mov [108+edx], eax mov [112+edx], eax mov [116+edx], eax mov [120+edx], eax mov [124+edx], eax add edx, 128 cmp edx, ebx jb .L2 sub ecx, 1 jnz .L1 pop edx pop ecx pop ebx ret ;------------------------------------------------------------------------------ ; Name: get_cpuid_cache_info ; get_cpuid_cache_info: _get_cpuid_cache_info: push ebp push ebx push ecx push edx mov eax, 4 mov ecx, [esp + 16 + 4 + 4] cpuid mov ebp, eax mov eax, [esp + 16 + 4] mov [eax], ebp mov [eax+4], ebx mov [eax+8], ecx mov [eax+12], edx pop edx pop ecx pop ebx pop ebp ret ;------------------------------------------------------------------------------ ; Name: get_cpuid_family ; get_cpuid_family: _get_cpuid_family: push ebx push ecx push edx xor eax, eax cpuid mov eax, [esp + 12 + 4] mov [eax], ebx mov [eax+4], edx mov [eax+8], ecx mov byte [eax+12], 0 pop edx pop ecx pop ebx ret ;------------------------------------------------------------------------------ ; Name: get_cpuid1_ecx ; get_cpuid1_ecx: _get_cpuid1_ecx: push ebx push ecx push edx mov eax, 1 cpuid mov eax, ecx pop edx pop ecx pop ebx ret ;------------------------------------------------------------------------------ ; Name: get_cpuid7_ebx ; get_cpuid7_ebx: _get_cpuid7_ebx: push ebx push ecx push edx mov eax, 7 xor ecx, ecx cpuid mov eax, ebx pop edx pop ecx pop ebx ret ;------------------------------------------------------------------------------ ; Name: get_cpuid_80000001_ecx ; get_cpuid_80000001_ecx: _get_cpuid_80000001_ecx: push ebx push ecx push edx mov eax, 0x80000001 cpuid mov eax, ecx pop edx pop ecx pop ebx ret ;------------------------------------------------------------------------------ ; Name: get_cpuid_80000001_edx ; get_cpuid_80000001_edx: _get_cpuid_80000001_edx: push ebx push ecx push edx mov eax, 0x80000001 cpuid mov eax, edx pop edx pop ecx pop ebx ret ;------------------------------------------------------------------------------ ; Name: get_cpuid1_edx ; get_cpuid1_edx: _get_cpuid1_edx: push ebx push ecx push edx mov eax, 1 cpuid mov eax, edx pop edx pop ecx pop ebx ret ;------------------------------------------------------------------------------ ; Name: ReaderAVX ; Purpose: Reads 128-bit values sequentially from an area of memory. ; Params: [esp+4] = ptr to memory area ; [esp+8] = length in bytes ; [esp+12] = loops ;------------------------------------------------------------------------------ align 64 ReaderAVX: _ReaderAVX: vzeroupper push ebx push ecx mov ecx, [esp+12+8] mov eax, [esp+4+8] mov ebx, eax add ebx, [esp+8+8] ; ebx points to end. .L1: mov eax, [esp+4+8] .L2: vmovdqa ymm0, [eax] ; Read aligned @ 16-byte boundary. vmovdqa ymm0, [32+eax] vmovdqa ymm0, [64+eax] vmovdqa ymm0, [96+eax] vmovdqa ymm0, [128+eax] vmovdqa ymm0, [160+eax] vmovdqa ymm0, [192+eax] vmovdqa ymm0, [224+eax] add eax, 256 cmp eax, ebx jb .L2 sub ecx, 1 jnz .L1 pop ecx pop ebx ret ;------------------------------------------------------------------------------ ; Name: ReaderSSE2 ; Purpose: Reads 128-bit values sequentially from an area of memory. ; Params: [esp+4] = ptr to memory area ; [esp+8] = length in bytes ; [esp+12] = loops ;------------------------------------------------------------------------------ align 64 ReaderSSE2: _ReaderSSE2: push ebx push ecx mov ecx, [esp+12+8] mov eax, [esp+4+8] mov ebx, eax add ebx, [esp+8+8] ; ebx points to end. .L1: mov eax, [esp+4+8] .L2: movdqa xmm0, [eax] ; Read aligned @ 16-byte boundary. movdqa xmm0, [16+eax] movdqa xmm0, [32+eax] movdqa xmm0, [48+eax] movdqa xmm0, [64+eax] movdqa xmm0, [80+eax] movdqa xmm0, [96+eax] movdqa xmm0, [112+eax] movdqa xmm0, [128+eax] movdqa xmm0, [144+eax] movdqa xmm0, [160+eax] movdqa xmm0, [176+eax] movdqa xmm0, [192+eax] movdqa xmm0, [208+eax] movdqa xmm0, [224+eax] movdqa xmm0, [240+eax] add eax, 256 cmp eax, ebx jb .L2 sub ecx, 1 jnz .L1 pop ecx pop ebx ret ;------------------------------------------------------------------------------ ; Name: ReaderSSE2_bypass ; Purpose: Reads 128-bit values sequentially from an area of memory. ; Params: [esp+4] = ptr to memory area ; [esp+8] = length in bytes ; [esp+12] = loops ;------------------------------------------------------------------------------ align 64 ReaderSSE2_bypass: _ReaderSSE2_bypass: push ebx push ecx mov ecx, [esp+12+8] mov eax, [esp+4+8] mov ebx, eax add ebx, [esp+8+8] ; ebx points to end. .L1: mov eax, [esp+4+8] .L2: prefetchnta [eax] movntdqa xmm0, [eax] ; Read aligned @ 16-byte boundary. movntdqa xmm0, [16+eax] movntdqa xmm0, [32+eax] movntdqa xmm0, [48+eax] prefetchnta [eax+64] movntdqa xmm0, [64+eax] movntdqa xmm0, [80+eax] movntdqa xmm0, [96+eax] movntdqa xmm0, [112+eax] prefetchnta [eax+128] movntdqa xmm0, [128+eax] movntdqa xmm0, [144+eax] movntdqa xmm0, [160+eax] movntdqa xmm0, [176+eax] prefetchnta [eax+192] movntdqa xmm0, [192+eax] movntdqa xmm0, [208+eax] movntdqa xmm0, [224+eax] movntdqa xmm0, [240+eax] add eax, 256 cmp eax, ebx jb .L2 sub ecx, 1 jnz .L1 pop ecx pop ebx ret ;------------------------------------------------------------------------------ ; Name: ReaderSSE2_128bytes_bypass ; Purpose: Reads 128-bit values sequentially from an area of memory. ; Params: [esp+4] = ptr to memory area ; [esp+8] = length in bytes ; [esp+12] = loops ;------------------------------------------------------------------------------ align 64 ReaderSSE2_128bytes_bypass: _ReaderSSE2_128bytes_bypass: push ebx push ecx mov ecx, [esp+12+8] mov eax, [esp+4+8] mov ebx, eax add ebx, [esp+8+8] ; ebx points to end. .L1: mov eax, [esp+4+8] .L2: prefetchnta [eax] movntdqa xmm0, [eax] ; Read aligned @ 16-byte boundary. movntdqa xmm0, [16+eax] movntdqa xmm0, [32+eax] movntdqa xmm0, [48+eax] prefetchnta [eax+64] movntdqa xmm0, [64+eax] movntdqa xmm0, [80+eax] movntdqa xmm0, [96+eax] movntdqa xmm0, [112+eax] add eax, 128 cmp eax, ebx jb .L2 sub ecx, 1 jnz .L1 pop ecx pop ebx ret ;------------------------------------------------------------------------------ ; Name: ReaderSSE2_128bytes ; Purpose: Reads 128-bit values sequentially from an area of memory. ; Params: [esp+4] = ptr to memory area ; [esp+8] = length in bytes ; [esp+12] = loops ;------------------------------------------------------------------------------ align 64 ReaderSSE2_128bytes: _ReaderSSE2_128bytes: push ebx push ecx mov ecx, [esp+12+8] mov eax, [esp+4+8] mov ebx, eax add ebx, [esp+8+8] ; ebx points to end. .L1: mov eax, [esp+4+8] .L2: movdqa xmm0, [eax] ; Read aligned @ 16-byte boundary. movdqa xmm0, [16+eax] movdqa xmm0, [32+eax] movdqa xmm0, [48+eax] movdqa xmm0, [64+eax] movdqa xmm0, [80+eax] movdqa xmm0, [96+eax] movdqa xmm0, [112+eax] add eax, 128 cmp eax, ebx jb .L2 sub ecx, 1 jnz .L1 pop ecx pop ebx ret ;------------------------------------------------------------------------------ ; Name: WriterAVX ; Purpose: Write 256-bit values sequentially from an area of memory. ; Params: [esp+4] = ptr to memory area ; [esp+8] = length in bytes ; [esp+12] = loops ; [esp+16] = value (ignored) ;------------------------------------------------------------------------------ align 64 WriterAVX: _WriterAVX: vzeroupper push ebx push ecx mov eax, [esp+16+8] movd xmm0, eax ; Create a 128-bit replication of the 32-bit movd xmm1, eax ; value that was provided. movd xmm2, eax movd xmm3, eax pslldq xmm1, 32 pslldq xmm2, 64 pslldq xmm3, 96 por xmm0, xmm1 por xmm0, xmm2 por xmm0, xmm3 mov ecx, [esp+12+8] mov eax, [esp+4+8] mov ebx, eax add ebx, [esp+8+8] ; ebx points to end. .L1: mov eax, [esp+4+8] .L2: vmovdqa [eax], ymm0 vmovdqa [32+eax], ymm0 vmovdqa [64+eax], ymm0 vmovdqa [96+eax], ymm0 vmovdqa [128+eax], ymm0 vmovdqa [160+eax], ymm0 vmovdqa [192+eax], ymm0 vmovdqa [224+eax], ymm0 add eax, 256 cmp eax, ebx jb .L2 sub ecx, 1 jnz .L1 pop ecx pop ebx ret ;------------------------------------------------------------------------------ ; Name: WriterSSE2 ; Purpose: Write 128-bit values sequentially from an area of memory. ; Params: [esp+4] = ptr to memory area ; [esp+8] = length in bytes ; [esp+12] = loops ; [esp+16] = value (ignored) ;------------------------------------------------------------------------------ align 64 WriterSSE2: _WriterSSE2: push ebx push ecx mov eax, [esp+16+8] movd xmm0, eax ; Create a 128-bit replication of the 32-bit movd xmm1, eax ; value that was provided. movd xmm2, eax movd xmm3, eax pslldq xmm1, 32 pslldq xmm2, 64 pslldq xmm3, 96 por xmm0, xmm1 por xmm0, xmm2 por xmm0, xmm3 mov ecx, [esp+12+8] mov eax, [esp+4+8] mov ebx, eax add ebx, [esp+8+8] ; ebx points to end. .L1: mov eax, [esp+4+8] .L2: movdqa [eax], xmm0 movdqa [16+eax], xmm0 movdqa [32+eax], xmm0 movdqa [48+eax], xmm0 movdqa [64+eax], xmm0 movdqa [80+eax], xmm0 movdqa [96+eax], xmm0 movdqa [112+eax], xmm0 movdqa [128+eax], xmm0 movdqa [144+eax], xmm0 movdqa [160+eax], xmm0 movdqa [176+eax], xmm0 movdqa [192+eax], xmm0 movdqa [208+eax], xmm0 movdqa [224+eax], xmm0 movdqa [240+eax], xmm0 add eax, 256 cmp eax, ebx jb .L2 sub ecx, 1 jnz .L1 pop ecx pop ebx ret ;------------------------------------------------------------------------------ ; Name: WriterSSE2 ; Purpose: Write 128-bit values sequentially from an area of memory. ; Params: [esp+4] = ptr to memory area ; [esp+8] = length in bytes ; [esp+12] = loops ; [esp+16] = value (ignored) ;------------------------------------------------------------------------------ align 64 WriterSSE2_128bytes: _WriterSSE2_128bytes: push ebx push ecx mov eax, [esp+16+8] movd xmm0, eax ; Create a 128-bit replication of the 32-bit movd xmm1, eax ; value that was provided. movd xmm2, eax movd xmm3, eax pslldq xmm1, 32 pslldq xmm2, 64 pslldq xmm3, 96 por xmm0, xmm1 por xmm0, xmm2 por xmm0, xmm3 mov ecx, [esp+12+8] mov eax, [esp+4+8] mov ebx, eax add ebx, [esp+8+8] ; ebx points to end. .L1: mov eax, [esp+4+8] .L2: movdqa [eax], xmm0 movdqa [16+eax], xmm0 movdqa [32+eax], xmm0 movdqa [48+eax], xmm0 movdqa [64+eax], xmm0 movdqa [80+eax], xmm0 movdqa [96+eax], xmm0 movdqa [112+eax], xmm0 add eax, 128 cmp eax, ebx jb .L2 sub ecx, 1 jnz .L1 pop ecx pop ebx ret ;------------------------------------------------------------------------------ ; Name: WriterAVX_bypass ; Purpose: Write 256-bit values sequentially from an area of memory, ; bypassing the cache. ; Params: [esp+4] = ptr to memory area ; [esp+8] = length in bytes ; [esp+12] = loops ; [esp+16] = value (ignored) ;------------------------------------------------------------------------------ align 64 WriterAVX_bypass: _WriterAVX_bypass: vzeroupper push ebx push ecx mov eax, [esp+16+8] movd xmm0, eax ; Create a 128-bit replication of the 32-bit movd xmm1, eax ; value that was provided. movd xmm2, eax movd xmm3, eax pslldq xmm1, 32 pslldq xmm2, 64 pslldq xmm3, 96 por xmm0, xmm1 por xmm0, xmm2 por xmm0, xmm3 mov ecx, [esp+12+8] mov eax, [esp+4+8] mov ebx, eax add ebx, [esp+8+8] ; ebx points to end. .L1: mov eax, [esp+4+8] .L2: vmovntdq [eax], ymm0 ; Write bypassing cache. vmovntdq [32+eax], ymm0 vmovntdq [64+eax], ymm0 vmovntdq [96+eax], ymm0 vmovntdq [128+eax], ymm0 vmovntdq [160+eax], ymm0 vmovntdq [192+eax], ymm0 vmovntdq [224+eax], ymm0 add eax, 256 cmp eax, ebx jb .L2 sub ecx, 1 jnz .L1 pop ecx pop ebx ret ;------------------------------------------------------------------------------ ; Name: WriterSSE2_bypass ; Purpose: Write 128-bit values sequentially from an area of memory, ; bypassing the cache. ; Params: [esp+4] = ptr to memory area ; [esp+8] = length in bytes ; [esp+12] = loops ; [esp+16] = value (ignored) ;------------------------------------------------------------------------------ align 64 WriterSSE2_bypass: _WriterSSE2_bypass: push ebx push ecx mov eax, [esp+16+8] movd xmm0, eax ; Create a 128-bit replication of the 32-bit movd xmm1, eax ; value that was provided. movd xmm2, eax movd xmm3, eax pslldq xmm1, 32 pslldq xmm2, 64 pslldq xmm3, 96 por xmm0, xmm1 por xmm0, xmm2 por xmm0, xmm3 mov ecx, [esp+12+8] mov eax, [esp+4+8] mov ebx, eax add ebx, [esp+8+8] ; ebx points to end. .L1: mov eax, [esp+4+8] .L2: movntdq [eax], xmm0 ; Write bypassing cache. movntdq [16+eax], xmm0 movntdq [32+eax], xmm0 movntdq [48+eax], xmm0 movntdq [64+eax], xmm0 movntdq [80+eax], xmm0 movntdq [96+eax], xmm0 movntdq [112+eax], xmm0 movntdq [128+eax], xmm0 movntdq [144+eax], xmm0 movntdq [160+eax], xmm0 movntdq [176+eax], xmm0 movntdq [192+eax], xmm0 movntdq [208+eax], xmm0 movntdq [224+eax], xmm0 movntdq [240+eax], xmm0 add eax, 256 cmp eax, ebx jb .L2 sub ecx, 1 jnz .L1 pop ecx pop ebx ret ;------------------------------------------------------------------------------ ; Name: WriterSSE2_128bytes_bypass ; Purpose: Write 128-bit values sequentially from an area of memory, ; bypassing the cache. ; Params: [esp+4] = ptr to memory area ; [esp+8] = length in bytes ; [esp+12] = loops ; [esp+16] = value (ignored) ;------------------------------------------------------------------------------ align 64 WriterSSE2_128bytes_bypass: _WriterSSE2_128bytes_bypass: push ebx push ecx mov eax, [esp+16+8] movd xmm0, eax ; Create a 128-bit replication of the 32-bit movd xmm1, eax ; value that was provided. movd xmm2, eax movd xmm3, eax pslldq xmm1, 32 pslldq xmm2, 64 pslldq xmm3, 96 por xmm0, xmm1 por xmm0, xmm2 por xmm0, xmm3 mov ecx, [esp+12+8] mov eax, [esp+4+8] mov ebx, eax add ebx, [esp+8+8] ; ebx points to end. .L1: mov eax, [esp+4+8] .L2: movntdq [eax], xmm0 ; Write bypassing cache. movntdq [16+eax], xmm0 movntdq [32+eax], xmm0 movntdq [48+eax], xmm0 movntdq [64+eax], xmm0 movntdq [80+eax], xmm0 movntdq [96+eax], xmm0 movntdq [112+eax], xmm0 add eax, 128 cmp eax, ebx jb .L2 sub ecx, 1 jnz .L1 pop ecx pop ebx ret ;------------------------------------------------------------------------------ ; Name: RandomReader ; Purpose: Reads 32-bit values randomly from an area of memory. ; Params: ; [esp+4] = ptr to array of chunk pointers ; [esp+8] = # of 128-byte chunks ; [esp+12] = loops ;------------------------------------------------------------------------------ align 64 RandomReader: _RandomReader: push ebx push ecx push edx mov ecx, [esp+12+12] ; loops to do. .L0: mov ebx, [esp+8+12] ; # chunks to do .L1: sub ebx, 1 jc .L2 mov edx, [esp+4+12] ; get ptr to memory chunk. mov edx, [edx + 4*ebx] mov eax, [edx+160] mov eax, [edx+232] mov eax, [edx+224] mov eax, [96+edx] mov eax, [edx+164] mov eax, [76+edx] mov eax, [100+edx] mov eax, [edx+220] mov eax, [edx+248] mov eax, [104+edx] mov eax, [4+edx] mov eax, [edx+136] mov eax, [112+edx] mov eax, [edx+200] mov eax, [12+edx] mov eax, [edx+128] mov eax, [edx+148] mov eax, [edx+196] mov eax, [edx+216] mov eax, [edx] mov eax, [84+edx] mov eax, [edx+140] mov eax, [edx+204] mov eax, [edx+184] mov eax, [124+edx] mov eax, [48+edx] mov eax, [64+edx] mov eax, [edx+212] mov eax, [edx+240] mov eax, [edx+236] mov eax, [24+edx] mov eax, [edx+252] mov eax, [68+edx] mov eax, [20+edx] mov eax, [72+edx] mov eax, [32+edx] mov eax, [28+edx] mov eax, [52+edx] mov eax, [edx+244] mov eax, [edx+180] mov eax, [80+edx] mov eax, [60+edx] mov eax, [8+edx] mov eax, [56+edx] mov eax, [edx+208] mov eax, [edx+228] mov eax, [40+edx] mov eax, [edx+172] mov eax, [120+edx] mov eax, [edx+176] mov eax, [108+edx] mov eax, [edx+132] mov eax, [16+edx] mov eax, [44+edx] mov eax, [92+edx] mov eax, [edx+168] mov eax, [edx+152] mov eax, [edx+156] mov eax, [edx+188] mov eax, [36+edx] mov eax, [88+edx] mov eax, [116+edx] mov eax, [edx+192] mov eax, [edx+144] jmp .L1 .L2: sub ecx, 1 jnz .L0 pop edx pop ecx pop ebx ret ;------------------------------------------------------------------------------ ; Name: RandomReaderSSE2 ; Purpose: Reads 128-bit values sequentially from an area of memory. ; Params: ; [esp+4] = ptr to array of chunk pointers ; [esp+8] = # of 128-byte chunks ; [esp+12] = loops ;------------------------------------------------------------------------------ align 64 RandomReaderSSE2: _RandomReaderSSE2: push ebx push ecx push edx mov ecx, [esp+12+12] ; loops to do. .L0: mov ebx, [esp+8+12] ; # chunks to do .L1: sub ebx, 1 jc .L2 mov edx, [esp+4+12] ; get ptr to memory chunk. mov edx, [edx + 4*ebx] ; Read aligned @ 16-byte boundary. movdqa xmm0, [240+edx] movdqa xmm0, [128+edx] movdqa xmm0, [64+edx] movdqa xmm0, [208+edx] movdqa xmm0, [112+edx] movdqa xmm0, [176+edx] movdqa xmm0, [144+edx] movdqa xmm0, [edx] movdqa xmm0, [96+edx] movdqa xmm0, [16+edx] movdqa xmm0, [192+edx] movdqa xmm0, [160+edx] movdqa xmm0, [32+edx] movdqa xmm0, [48+edx] movdqa xmm0, [224+edx] movdqa xmm0, [80+edx] jmp .L1 .L2: sub ecx, 1 jnz .L0 pop edx pop ecx pop ebx ret ;------------------------------------------------------------------------------ ; Name: RandomReaderSSE2_bypass ; Purpose: Reads 128-bit values sequentially from an area of memory. ; Params: ; [esp+4] = ptr to array of chunk pointers ; [esp+8] = # of 128-byte chunks ; [esp+12] = loops ;------------------------------------------------------------------------------ align 64 RandomReaderSSE2_bypass: _RandomReaderSSE2_bypass: push ebx push ecx push edx mov ecx, [esp+12+12] ; loops to do. .L0: mov ebx, [esp+8+12] ; # chunks to do .L1: sub ebx, 1 jc .L2 mov edx, [esp+4+12] ; get ptr to memory chunk. mov edx, [edx + 4*ebx] ; Read aligned @ 16-byte boundary. prefetchnta [edx+192] movntdqa xmm0, [240+edx] prefetchnta [edx] movntdqa xmm0, [edx] prefetchnta [edx+128] movntdqa xmm0, [128+edx] prefetchnta [edx+64] movntdqa xmm0, [64+edx] movntdqa xmm0, [208+edx] movntdqa xmm0, [112+edx] movntdqa xmm0, [32+edx] movntdqa xmm0, [176+edx] movntdqa xmm0, [144+edx] movntdqa xmm0, [96+edx] movntdqa xmm0, [16+edx] movntdqa xmm0, [160+edx] movntdqa xmm0, [192+edx] movntdqa xmm0, [48+edx] movntdqa xmm0, [224+edx] movntdqa xmm0, [80+edx] jmp .L1 .L2: sub ecx, 1 jnz .L0 pop edx pop ecx pop ebx ret ;------------------------------------------------------------------------------ ; Name: RandomWriter ; Purpose: Writes 32-bit value sequentially to an area of memory. ; Params: ; [esp+4] = ptr to memory area ; [esp+8] = length in bytes ; [esp+12] = loops ; [esp+16] = long to write ;------------------------------------------------------------------------------ align 64 RandomWriter: _RandomWriter: push ebx push ecx push edx mov eax, [esp+16+12] ; get datum. mov ecx, [esp+12+12] ; loops to do. .L0: mov ebx, [esp+8+12] ; # chunks to do .L1: sub ebx, 1 jc .L2 mov edx, [esp+4+12] ; get ptr to memory chunk. mov edx, [edx + 4*ebx] mov [edx+212], eax mov [edx+156], eax mov [edx+132], eax mov [20+edx], eax mov [edx+172], eax mov [edx+196], eax mov [edx+248], eax mov [edx], eax mov [edx+136], eax mov [edx+228], eax mov [edx+160], eax mov [80+edx], eax mov [76+edx], eax mov [32+edx], eax mov [64+edx], eax mov [68+edx], eax mov [120+edx], eax mov [edx+216], eax mov [124+edx], eax mov [28+edx], eax mov [edx+152], eax mov [36+edx], eax mov [edx+220], eax mov [edx+188], eax mov [48+edx], eax mov [104+edx], eax mov [72+edx], eax mov [96+edx], eax mov [edx+184], eax mov [112+edx], eax mov [edx+236], eax mov [edx+224], eax mov [edx+252], eax mov [88+edx], eax mov [edx+180], eax mov [60+edx], eax mov [24+edx], eax mov [edx+192], eax mov [edx+164], eax mov [edx+204], eax mov [44+edx], eax mov [edx+168], eax mov [92+edx], eax mov [edx+208], eax mov [8+edx], eax mov [edx+144], eax mov [edx+148], eax mov [edx+128], eax mov [52+edx], eax mov [4+edx], eax mov [108+edx], eax mov [12+edx], eax mov [56+edx], eax mov [edx+200], eax mov [edx+232], eax mov [16+edx], eax mov [edx+244], eax mov [40+edx], eax mov [edx+140], eax mov [84+edx], eax mov [100+edx], eax mov [116+edx], eax mov [edx+176], eax mov [edx+240], eax jmp .L1 .L2: sub ecx, 1 jnz .L0 pop edx pop ecx pop ebx ret ;------------------------------------------------------------------------------ ; Name: RandomWriterSSE2 ; Purpose: Writes 128-bit value randomly to an area of memory. ; Params: ; [esp+4] = ptr to memory area ; [esp+8] = length in bytes ; [esp+12] = loops ; [esp+16] = long to write ;------------------------------------------------------------------------------ align 64 RandomWriterSSE2: _RandomWriterSSE2: push ebx push ecx push edx mov eax, [esp+16+8] movd xmm0, eax ; Create a 128-bit replication of the 32-bit movd xmm1, eax ; value that was provided. movd xmm2, eax movd xmm3, eax pslldq xmm1, 32 pslldq xmm2, 64 pslldq xmm3, 96 por xmm0, xmm1 por xmm0, xmm2 por xmm0, xmm3 mov ecx, [esp+12+12] ; loops to do. .L0: mov ebx, [esp+8+12] ; # chunks to do .L1: sub ebx, 1 jc .L2 mov edx, [esp+4+12] ; get ptr to memory chunk. mov edx, [edx + 4*ebx] movdqa [64+edx], xmm0 movdqa [208+edx], xmm0 movdqa [128+edx], xmm0 movdqa [112+edx], xmm0 movdqa [176+edx], xmm0 movdqa [144+edx], xmm0 movdqa [edx], xmm0 movdqa [96+edx], xmm0 movdqa [48+edx], xmm0 movdqa [16+edx], xmm0 movdqa [192+edx], xmm0 movdqa [160+edx], xmm0 movdqa [32+edx], xmm0 movdqa [240+edx], xmm0 movdqa [224+edx], xmm0 movdqa [80+edx], xmm0 jmp .L1 .L2: sub ecx, 1 jnz .L0 pop edx pop ecx pop ebx ret ;------------------------------------------------------------------------------ ; Name: RandomWriterSSE2_bypass ; Purpose: Writes 128-bit value randomly into memory, bypassing caches. ; Params: ; [esp+4] = ptr to memory area ; [esp+8] = length in bytes ; [esp+12] = loops ; [esp+16] = long to write ;------------------------------------------------------------------------------ align 64 RandomWriterSSE2_bypass: _RandomWriterSSE2_bypass: push ebx push ecx push edx mov eax, [esp+16+8] movd xmm0, eax ; Create a 128-bit replication of the 32-bit movd xmm1, eax ; value that was provided. movd xmm2, eax movd xmm3, eax pslldq xmm1, 32 pslldq xmm2, 64 pslldq xmm3, 96 por xmm0, xmm1 por xmm0, xmm2 por xmm0, xmm3 mov ecx, [esp+12+12] ; loops to do. .L0: mov ebx, [esp+8+12] ; # chunks to do .L1: sub ebx, 1 jc .L2 mov edx, [esp+4+12] ; get ptr to memory chunk. mov edx, [edx + 4*ebx] movntdq [128+edx], xmm0 movntdq [240+edx], xmm0 movntdq [112+edx], xmm0 movntdq [64+edx], xmm0 movntdq [176+edx], xmm0 movntdq [144+edx], xmm0 movntdq [edx], xmm0 movntdq [208+edx], xmm0 movntdq [80+edx], xmm0 movntdq [96+edx], xmm0 movntdq [48+edx], xmm0 movntdq [16+edx], xmm0 movntdq [192+edx], xmm0 movntdq [160+edx], xmm0 movntdq [224+edx], xmm0 movntdq [32+edx], xmm0 jmp .L1 .L2: sub ecx, 1 jnz .L0 pop edx pop ecx pop ebx ret ;------------------------------------------------------------------------------ ; Name: RegisterToRegister ; Purpose: Reads/writes 32-bit values between registers of ; the main register set. ; Params: ; dword [esp+4] = loops ;------------------------------------------------------------------------------ align 64 RegisterToRegister: _RegisterToRegister: push ebx push ecx mov ecx, [esp+4+8] ; loops to do. .L1: mov eax, ebx ; 64 transfers by 4 bytes = 256 bytes mov eax, ecx mov eax, edx mov eax, esi mov eax, edi mov eax, ebp mov eax, esp mov eax, ebx mov eax, ebx mov eax, ecx mov eax, edx mov eax, esi mov eax, edi mov eax, ebp mov eax, esp mov eax, ebx mov eax, ebx mov eax, ecx mov eax, edx mov eax, esi mov eax, edi mov eax, ebp mov eax, esp mov eax, ebx mov eax, ebx mov eax, ecx mov eax, edx mov eax, esi mov eax, edi mov eax, ebp mov eax, esp mov eax, ebx mov ebx, eax mov ebx, ecx mov ebx, edx mov ebx, esi mov ebx, edi mov ebx, ebp mov ebx, esp mov ebx, eax mov ebx, eax mov ebx, ecx mov ebx, edx mov ebx, esi mov ebx, edi mov ebx, ebp mov ebx, esp mov ebx, eax mov ebx, eax mov ebx, ecx mov ebx, edx mov ebx, esi mov ebx, edi mov ebx, ebp mov ebx, esp mov ebx, eax mov ebx, eax mov ebx, ecx mov ebx, edx mov ebx, esi mov ebx, edi mov ebx, ebp mov ebx, esp mov ebx, eax dec ecx jnz .L1 pop ecx pop ebx ret ;------------------------------------------------------------------------------ ; Name: VectorToVectorAVX ; Purpose: Reads/writes 256-bit values between registers of ; the vector register set, in this case YMM. ; Params: rdi = loops ;------------------------------------------------------------------------------ align 64 VectorToVectorAVX: _VectorToVectorAVX: vzeroupper mov eax, [esp + 4] .L1: vmovdqa ymm0, ymm1 ; Each move moves 32 bytes, so we need 8 vmovdqa ymm0, ymm2 ; moves to transfer a 256 byte chunk. vmovdqa ymm0, ymm3 vmovdqa ymm2, ymm0 vmovdqa ymm1, ymm2 vmovdqa ymm2, ymm1 vmovdqa ymm0, ymm3 vmovdqa ymm3, ymm1 dec eax jnz .L1 ret ;------------------------------------------------------------------------------ ; Name: VectorToVector ; Purpose: Reads/writes 128-bit values between registers of ; the vector register set, in this case XMM. ; Params: dword [esp + 4] = count. ;------------------------------------------------------------------------------ align 64 VectorToVector: _VectorToVector: mov eax, [esp + 4] .L1: movdqa xmm0, xmm1 movdqa xmm0, xmm2 movdqa xmm0, xmm3 movdqa xmm2, xmm0 movdqa xmm1, xmm2 movdqa xmm2, xmm1 movdqa xmm0, xmm3 movdqa xmm3, xmm1 movdqa xmm3, xmm2 movdqa xmm1, xmm3 movdqa xmm2, xmm1 movdqa xmm0, xmm1 movdqa xmm1, xmm2 movdqa xmm0, xmm1 movdqa xmm0, xmm3 movdqa xmm3, xmm0 dec eax jnz .L1 ret ;------------------------------------------------------------------------------ ; Name: RegisterToVector ; Purpose: Writes 32-bit main register values into 128-bit vector register ; clearing the upper unused bits. ; Params: dword [esp + 4] = count. ;------------------------------------------------------------------------------ align 64 RegisterToVector: _RegisterToVector: mov eax, [esp + 4] add eax, eax ; Double # of loops. .L1: movd xmm1, eax ; 32 transfers of 4 bytes = 128 bytes movd xmm2, eax movd xmm3, eax movd xmm0, eax movd xmm1, eax movd xmm2, eax movd xmm3, eax movd xmm0, eax movd xmm1, eax movd xmm3, eax movd xmm2, eax movd xmm0, eax movd xmm1, eax movd xmm2, eax movd xmm3, eax movd xmm0, eax movd xmm0, eax movd xmm2, eax movd xmm0, eax movd xmm3, eax movd xmm1, eax movd xmm3, eax movd xmm2, eax movd xmm0, eax movd xmm0, eax movd xmm3, eax movd xmm1, eax movd xmm2, eax movd xmm0, eax movd xmm2, eax movd xmm3, eax movd xmm0, eax dec eax jnz .L1 ret ;------------------------------------------------------------------------------ ; Name: VectorToRegister ; Purpose: Writes lowest 32 bits of vector registers into 32-bit main ; register. ; Params: dword [esp + 4] = count. ;------------------------------------------------------------------------------ align 64 VectorToRegister: _VectorToRegister: mov eax, [esp + 4] add eax, eax ; Double # of loops. push ebx .L1: movd ebx, xmm1 ; 4 bytes per transfer therefore need 64 movd ebx, xmm2 ; to transfer 256 bytes. movd ebx, xmm3 movd ebx, xmm0 movd ebx, xmm1 movd ebx, xmm2 movd ebx, xmm3 movd ebx, xmm0 movd ebx, xmm1 movd ebx, xmm3 movd ebx, xmm2 movd ebx, xmm0 movd ebx, xmm1 movd ebx, xmm2 movd ebx, xmm3 movd ebx, xmm0 movd ebx, xmm0 movd ebx, xmm2 movd ebx, xmm0 movd ebx, xmm3 movd ebx, xmm1 movd ebx, xmm3 movd ebx, xmm2 movd ebx, xmm0 movd ebx, xmm0 movd ebx, xmm3 movd ebx, xmm1 movd ebx, xmm2 movd ebx, xmm0 movd ebx, xmm2 movd ebx, xmm3 movd ebx, xmm0 dec eax jnz .L1 pop ebx ret ;------------------------------------------------------------------------------ ; Name: StackReader ; Purpose: Reads 32-bit values off the stack into registers of ; the main register set, effectively testing L1 cache access ; *and* effective-address calculation speed. ; Params: ; dword [esp+4] = loops ;------------------------------------------------------------------------------ align 64 StackReader: _StackReader: push ebx push ecx mov ecx, [esp+4+8] ; loops to do. push dword 7000 ; [esp+24] push dword 6000 ; [esp+20] push dword 5000 ; [esp+16] push dword 4000 ; [esp+12] push dword 3000 ; [esp+8] push dword 2000 ; [esp+4] push dword 1000 ; [esp] .L1: mov eax, [esp] mov eax, [esp+8] mov eax, [esp+12] mov eax, [esp+16] mov eax, [esp+20] mov eax, [esp+4] mov eax, [esp+24] mov eax, [esp] mov eax, [esp] mov eax, [esp+8] mov eax, [esp+12] mov eax, [esp+16] mov eax, [esp+20] mov eax, [esp+4] mov eax, [esp+24] mov eax, [esp] mov eax, [esp] mov eax, [esp+8] mov eax, [esp+12] mov eax, [esp+16] mov eax, [esp+20] mov eax, [esp+4] mov eax, [esp+24] mov eax, [esp+4] mov eax, [esp+4] mov eax, [esp+8] mov eax, [esp+12] mov eax, [esp+16] mov eax, [esp+20] mov eax, [esp+4] mov eax, [esp+24] mov eax, [esp+4] mov ebx, [esp] mov ebx, [esp+8] mov ebx, [esp+12] mov ebx, [esp+16] mov ebx, [esp+20] mov ebx, [esp+4] mov ebx, [esp+24] mov ebx, [esp] mov ebx, [esp] mov ebx, [esp+8] mov ebx, [esp+12] mov ebx, [esp+16] mov ebx, [esp+20] mov ebx, [esp+4] mov ebx, [esp+24] mov ebx, [esp] mov ebx, [esp] mov ebx, [esp+8] mov ebx, [esp+12] mov ebx, [esp+16] mov ebx, [esp+20] mov ebx, [esp+4] mov ebx, [esp+24] mov ebx, [esp+4] mov ebx, [esp+4] mov ebx, [esp+8] mov ebx, [esp+12] mov ebx, [esp+16] mov ebx, [esp+20] mov ebx, [esp+4] mov ebx, [esp+24] mov ebx, [esp+4] dec ecx jnz .L1 add esp, 28 pop ecx pop ebx ret ;------------------------------------------------------------------------------ ; Name: StackWriter ; Purpose: Writes 32-bit values into the stack from registers of ; the main register set, effectively testing L1 cache access ; *and* effective-address calculation speed. ; Params: ; dword [esp+4] = loops ;------------------------------------------------------------------------------ align 64 StackWriter: _StackWriter: push ebx push ecx mov ecx, [esp+4+8] ; loops to do. push dword 7000 ; [esp+24] push dword 6000 ; [esp+20] push dword 5000 ; [esp+16] push dword 4000 ; [esp+12] push dword 3000 ; [esp+8] push dword 2000 ; [esp+4] push dword 1000 ; [esp] xor eax, eax mov ebx, 0xffffffff .L1: mov [esp], eax mov [esp+8], eax mov [esp+12], eax mov [esp+16], eax mov [esp+20], eax mov [esp+4], eax mov [esp+24], eax mov [esp], eax mov [esp], eax mov [esp+8], eax mov [esp+12], eax mov [esp+16], eax mov [esp+20], eax mov [esp+4], eax mov [esp+24], eax mov [esp], eax mov [esp], eax mov [esp+8], eax mov [esp+12], eax mov [esp+16], eax mov [esp+20], eax mov [esp+4], eax mov [esp+24], eax mov [esp+4], eax mov [esp+4], eax mov [esp+8], eax mov [esp+12], eax mov [esp+16], eax mov [esp+20], eax mov [esp+4], eax mov [esp+24], eax mov [esp+4], eax mov [esp], ebx mov [esp+8], ebx mov [esp+12], ebx mov [esp+16], ebx mov [esp+20], ebx mov [esp+4], ebx mov [esp+24], ebx mov [esp], ebx mov [esp], ebx mov [esp+8], ebx mov [esp+12], ebx mov [esp+16], ebx mov [esp+20], ebx mov [esp+4], ebx mov [esp+24], ebx mov [esp], ebx mov [esp], ebx mov [esp+8], ebx mov [esp+12], ebx mov [esp+16], ebx mov [esp+20], ebx mov [esp+4], ebx mov [esp+24], ebx mov [esp+4], ebx mov [esp+4], ebx mov [esp+8], ebx mov [esp+12], ebx mov [esp+16], ebx mov [esp+20], ebx mov [esp+4], ebx mov [esp+24], ebx mov [esp+4], ebx sub ecx, 1 jnz .L1 add esp, 28 pop ecx pop ebx ret ;------------------------------------------------------------------------------ ; Name: Register8ToVector ; Purpose: Writes 8-bit main register values into 128-bit vector register ; without clearing the unused bits. ; Params: dword [esp + 4] ;------------------------------------------------------------------------------ align 64 Register8ToVector: _Register8ToVector: mov eax, [esp + 4] sal eax, 4 ; Force some repetition. .L1: pinsrb xmm1, al, 0 ; 64 transfers x 1 byte = 64 bytes pinsrb xmm2, bl, 1 pinsrb xmm3, cl, 2 pinsrb xmm1, dl, 3 pinsrb xmm2, sil, 4 pinsrb xmm3, dil, 5 pinsrb xmm0, bpl, 6 pinsrb xmm0, spl, 7 pinsrb xmm0, al, 0 pinsrb xmm1, bl, 1 pinsrb xmm2, cl, 2 pinsrb xmm3, dl, 3 pinsrb xmm3, al, 4 pinsrb xmm2, bl, 5 pinsrb xmm1, bpl, 6 pinsrb xmm0, spl, 7 pinsrb xmm1, al, 0 pinsrb xmm2, al, 1 pinsrb xmm3, al, 2 pinsrb xmm1, al, 3 pinsrb xmm2, al, 4 pinsrb xmm3, al, 5 pinsrb xmm0, cl, 6 pinsrb xmm0, bl, 7 pinsrb xmm0, al, 0 pinsrb xmm0, al, 1 pinsrb xmm0, al, 2 pinsrb xmm0, al, 3 pinsrb xmm0, al, 4 pinsrb xmm0, al, 5 pinsrb xmm0, cl, 6 pinsrb xmm0, bl, 7 pinsrb xmm1, al, 0 pinsrb xmm2, bl, 1 pinsrb xmm3, cl, 2 pinsrb xmm1, dl, 3 pinsrb xmm2, sil, 4 pinsrb xmm3, dil, 5 pinsrb xmm0, bpl, 6 pinsrb xmm0, spl, 7 pinsrb xmm0, al, 10 pinsrb xmm1, bl, 11 pinsrb xmm2, cl, 12 pinsrb xmm3, dl, 13 pinsrb xmm3, dil, 14 pinsrb xmm2, cl, 15 pinsrb xmm1, al, 6 pinsrb xmm0, bpl, 7 pinsrb xmm1, al, 10 pinsrb xmm2, al, 11 pinsrb xmm3, al, 12 pinsrb xmm1, al, 13 pinsrb xmm2, al, 14 pinsrb xmm3, al, 15 pinsrb xmm0, cl, 6 pinsrb xmm0, bl, 7 pinsrb xmm0, al, 9 pinsrb xmm0, al, 8 pinsrb xmm0, al, 11 pinsrb xmm0, al, 3 pinsrb xmm0, al, 4 pinsrb xmm0, al, 5 pinsrb xmm0, cl, 6 pinsrb xmm0, bl, 7 dec eax jnz .L1 ret ;------------------------------------------------------------------------------ ; Name: Register16ToVector ; Purpose: Writes 16-bit main register values into 128-bit vector register ; without clearing the unused bits. ; Params: rdi = loops ;------------------------------------------------------------------------------ align 64 Register16ToVector: _Register16ToVector: mov eax, [esp + 4] sal eax, 3 ; Force some repetition. .L1: pinsrw xmm1, ax, 0 ; 64 transfers x 2 bytes = 128 bytes pinsrw xmm2, bx, 1 pinsrw xmm3, cx, 2 pinsrw xmm1, dx, 3 pinsrw xmm2, si, 4 pinsrw xmm3, di, 5 pinsrw xmm0, bp, 6 pinsrw xmm0, sp, 7 pinsrw xmm0, ax, 0 pinsrw xmm1, bx, 1 pinsrw xmm2, cx, 2 pinsrw xmm3, dx, 3 pinsrw xmm3, si, 4 pinsrw xmm2, di, 5 pinsrw xmm1, bp, 6 pinsrw xmm0, sp, 7 pinsrw xmm1, ax, 0 pinsrw xmm2, ax, 1 pinsrw xmm3, ax, 2 pinsrw xmm1, ax, 3 pinsrw xmm2, ax, 4 pinsrw xmm3, ax, 5 pinsrw xmm0, bp, 6 pinsrw xmm0, bx, 7 pinsrw xmm0, ax, 0 pinsrw xmm0, ax, 1 pinsrw xmm0, ax, 2 pinsrw xmm0, ax, 3 pinsrw xmm0, ax, 4 pinsrw xmm0, ax, 5 pinsrw xmm0, bp, 6 pinsrw xmm0, bx, 7 pinsrw xmm1, ax, 0 pinsrw xmm2, bx, 1 pinsrw xmm3, cx, 2 pinsrw xmm1, dx, 3 pinsrw xmm2, si, 4 pinsrw xmm3, di, 5 pinsrw xmm0, bp, 6 pinsrw xmm0, sp, 7 pinsrw xmm0, ax, 0 pinsrw xmm1, bx, 1 pinsrw xmm2, cx, 2 pinsrw xmm3, dx, 3 pinsrw xmm3, si, 4 pinsrw xmm2, di, 5 pinsrw xmm1, bp, 6 pinsrw xmm0, sp, 7 pinsrw xmm1, ax, 0 pinsrw xmm2, ax, 1 pinsrw xmm3, ax, 2 pinsrw xmm1, ax, 3 pinsrw xmm2, ax, 4 pinsrw xmm3, ax, 5 pinsrw xmm0, bp, 6 pinsrw xmm0, bx, 7 pinsrw xmm0, ax, 0 pinsrw xmm0, ax, 1 pinsrw xmm0, ax, 2 pinsrw xmm0, ax, 3 pinsrw xmm0, ax, 4 pinsrw xmm0, ax, 5 pinsrw xmm0, bp, 6 pinsrw xmm0, bx, 7 dec eax jnz .L1 ret ;------------------------------------------------------------------------------ ; Name: Register32ToVector ; Purpose: Writes 32-bit main register values into 128-bit vector register ; without clearing the unused bits. ; Params: rdi = loops ;------------------------------------------------------------------------------ align 64 Register32ToVector: _Register32ToVector: mov eax, [esp + 4] sal eax, 2 ; Force some repetition. .L1: pinsrd xmm1, eax, 0 ; Each xfer moves 4 bytes so to move 256 bytes pinsrd xmm2, ebx, 1 ; we need 64 transfers. pinsrd xmm3, ecx, 2 pinsrd xmm1, edx, 3 pinsrd xmm2, esi, 0 pinsrd xmm3, edi, 1 pinsrd xmm0, ebp, 2 pinsrd xmm0, esp, 3 pinsrd xmm0, eax, 0 pinsrd xmm1, ebx, 1 pinsrd xmm2, ecx, 2 pinsrd xmm3, edx, 3 pinsrd xmm3, esi, 3 pinsrd xmm2, edi, 2 pinsrd xmm1, ebp, 1 pinsrd xmm0, esp, 0 pinsrd xmm1, eax, 0 pinsrd xmm2, eax, 1 pinsrd xmm3, eax, 2 pinsrd xmm1, eax, 3 pinsrd xmm2, eax, 0 pinsrd xmm3, eax, 1 pinsrd xmm0, ebp, 2 pinsrd xmm0, ebx, 3 pinsrd xmm0, eax, 0 pinsrd xmm0, eax, 1 pinsrd xmm0, eax, 2 pinsrd xmm0, eax, 3 pinsrd xmm0, eax, 0 pinsrd xmm0, eax, 0 pinsrd xmm0, ebp, 0 pinsrd xmm0, ebx, 0 pinsrd xmm1, eax, 0 pinsrd xmm2, ebx, 1 pinsrd xmm3, ecx, 2 pinsrd xmm1, edx, 3 pinsrd xmm2, esi, 0 pinsrd xmm3, edi, 1 pinsrd xmm0, ebp, 2 pinsrd xmm0, esp, 3 pinsrd xmm0, eax, 0 pinsrd xmm1, ebx, 1 pinsrd xmm2, ecx, 2 pinsrd xmm3, edx, 3 pinsrd xmm3, esi, 3 pinsrd xmm2, edi, 2 pinsrd xmm1, ebp, 1 pinsrd xmm0, esp, 0 pinsrd xmm1, eax, 0 pinsrd xmm2, eax, 1 pinsrd xmm3, eax, 2 pinsrd xmm1, eax, 3 pinsrd xmm2, eax, 0 pinsrd xmm3, eax, 1 pinsrd xmm0, ebp, 2 pinsrd xmm0, ebx, 3 pinsrd xmm0, eax, 0 pinsrd xmm0, eax, 1 pinsrd xmm0, eax, 2 pinsrd xmm0, eax, 3 pinsrd xmm0, eax, 0 pinsrd xmm0, eax, 0 pinsrd xmm0, ebp, 0 pinsrd xmm0, ebx, 0 pinsrd xmm0, esp, 0 dec eax jnz .L1 ret ;------------------------------------------------------------------------------ ; Name: Register64ToVector ; Purpose: Writes 64-bit main register values into 128-bit vector register ; without clearing the unused bits. ; Params: rdi = loops ;------------------------------------------------------------------------------ Register64ToVector: _Register64ToVector: ret ;------------------------------------------------------------------------------ ; Name: Vector8ToRegister ; Purpose: Writes 8-bit vector register values into main register. ; Params: rdi = loops ;------------------------------------------------------------------------------ align 64 Vector8ToRegister: _Vector8ToRegister: mov eax, [esp + 4] sal eax, 4 ; Force some repetition. push ebx .L1: pextrb ebx, xmm1, 0 pextrb ebx, xmm2, 1 pextrb ebx, xmm3, 2 pextrb ebx, xmm1, 3 pextrb ebx, xmm2, 4 pextrb ebx, xmm3, 5 pextrb ebx, xmm0, 6 pextrb ebx, xmm0, 7 pextrb ebx, xmm0, 0 pextrb ebx, xmm1, 1 pextrb ebx, xmm2, 2 pextrb ebx, xmm3, 3 pextrb ebx, xmm3, 4 pextrb ebx, xmm2, 15 pextrb ebx, xmm1, 6 pextrb ebx, xmm0, 7 pextrb ebx, xmm1, 0 pextrb ebx, xmm2, 1 pextrb ebx, xmm3, 2 pextrb ebx, xmm1, 3 pextrb ebx, xmm2, 4 pextrb ebx, xmm3, 5 pextrb ebx, xmm0, 6 pextrb ebx, xmm0, 7 pextrb ebx, xmm0, 0 pextrb ebx, xmm1, 1 pextrb ebx, xmm2, 2 pextrb ebx, xmm3, 3 pextrb ebx, xmm3, 4 pextrb ebx, xmm2, 5 pextrb ebx, xmm1, 6 pextrb ebx, xmm0, 7 pextrb ebx, xmm1, 0 pextrb ebx, xmm2, 1 pextrb ebx, xmm3, 2 pextrb ebx, xmm1, 13 pextrb ebx, xmm2, 14 pextrb ebx, xmm3, 15 pextrb ebx, xmm0, 6 pextrb ebx, xmm0, 7 pextrb ebx, xmm0, 10 pextrb ebx, xmm1, 11 pextrb ebx, xmm2, 12 pextrb ebx, xmm3, 13 pextrb ebx, xmm3, 14 pextrb ebx, xmm2, 15 pextrb ebx, xmm1, 6 pextrb ebx, xmm0, 7 pextrb ebx, xmm1, 0 pextrb ebx, xmm2, 1 pextrb ebx, xmm3, 2 pextrb ebx, xmm1, 3 pextrb ebx, xmm2, 4 pextrb ebx, xmm3, 5 pextrb ebx, xmm0, 6 pextrb ebx, xmm0, 7 pextrb ebx, xmm0, 0 pextrb ebx, xmm1, 1 pextrb ebx, xmm2, 2 pextrb ebx, xmm3, 3 pextrb ebx, xmm3, 4 pextrb ebx, xmm2, 5 pextrb ebx, xmm1, 6 pextrb ebx, xmm0, 7 dec eax jnz .L1 pop ebx ret ;------------------------------------------------------------------------------ ; Name: Vector16ToRegister ; Purpose: Writes 16-bit vector register values into main register. ; Params: rdi = loops ;------------------------------------------------------------------------------ align 64 Vector16ToRegister: _Vector16ToRegister: mov eax, [esp + 4] sal eax, 3 ; Force some repetition. push ebx .L1: pextrw ebx, xmm1, 0 pextrw ebx, xmm2, 1 pextrw ebx, xmm3, 2 pextrw ebx, xmm1, 3 pextrw ebx, xmm2, 4 pextrw ebx, xmm3, 5 pextrw ebx, xmm0, 6 pextrw ebx, xmm0, 7 pextrw ebx, xmm0, 0 pextrw ebx, xmm1, 1 pextrw ebx, xmm2, 2 pextrw ebx, xmm3, 3 pextrw ebx, xmm3, 4 pextrw ebx, xmm2, 5 pextrw ebx, xmm1, 6 pextrw ebx, xmm0, 7 pextrw ebx, xmm1, 0 pextrw ebx, xmm2, 1 pextrw ebx, xmm3, 2 pextrw ebx, xmm1, 3 pextrw ebx, xmm2, 4 pextrw ebx, xmm3, 5 pextrw ebx, xmm0, 6 pextrw ebx, xmm0, 7 pextrw ebx, xmm0, 0 pextrw ebx, xmm1, 1 pextrw ebx, xmm2, 2 pextrw ebx, xmm3, 3 pextrw ebx, xmm3, 4 pextrw ebx, xmm2, 5 pextrw ebx, xmm1, 6 pextrw ebx, xmm0, 7 pextrw ebx, xmm1, 0 pextrw ebx, xmm2, 1 pextrw ebx, xmm3, 2 pextrw ebx, xmm1, 3 pextrw ebx, xmm2, 4 pextrw ebx, xmm3, 5 pextrw ebx, xmm0, 6 pextrw ebx, xmm0, 7 pextrw ebx, xmm0, 0 pextrw ebx, xmm1, 1 pextrw ebx, xmm2, 2 pextrw ebx, xmm3, 3 pextrw ebx, xmm3, 4 pextrw ebx, xmm2, 5 pextrw ebx, xmm1, 6 pextrw ebx, xmm0, 7 pextrw ebx, xmm1, 0 pextrw ebx, xmm2, 1 pextrw ebx, xmm3, 2 pextrw ebx, xmm1, 3 pextrw ebx, xmm2, 4 pextrw ebx, xmm3, 5 pextrw ebx, xmm0, 6 pextrw ebx, xmm0, 7 pextrw ebx, xmm0, 0 pextrw ebx, xmm1, 1 pextrw ebx, xmm2, 2 pextrw ebx, xmm3, 3 pextrw ebx, xmm3, 4 pextrw ebx, xmm2, 5 pextrw ebx, xmm1, 6 pextrw ebx, xmm0, 7 dec eax jnz .L1 pop ebx ret ;------------------------------------------------------------------------------ ; Name: Vector32ToRegister ; Purpose: Writes 32-bit vector register values into main register. ; Params: rdi = loops ;------------------------------------------------------------------------------ align 64 Vector32ToRegister: _Vector32ToRegister: mov eax, [esp + 4] sal eax, 2 ; Force some repetition. push ebx .L1: pextrd ebx, xmm1, 0 pextrd ebx, xmm2, 1 pextrd ebx, xmm3, 2 pextrd ebx, xmm1, 3 pextrd ebx, xmm2, 0 pextrd ebx, xmm3, 1 pextrd ebx, xmm0, 2 pextrd ebx, xmm0, 3 pextrd ebx, xmm0, 0 pextrd ebx, xmm1, 1 pextrd ebx, xmm2, 2 pextrd ebx, xmm3, 3 pextrd ebx, xmm3, 3 pextrd ebx, xmm2, 2 pextrd ebx, xmm1, 1 pextrd ebx, xmm0, 0 pextrd ebx, xmm1, 0 pextrd ebx, xmm2, 1 pextrd ebx, xmm3, 2 pextrd ebx, xmm1, 3 pextrd ebx, xmm2, 0 pextrd ebx, xmm3, 1 pextrd ebx, xmm0, 2 pextrd ebx, xmm0, 3 pextrd ebx, xmm0, 0 pextrd ebx, xmm1, 1 pextrd ebx, xmm2, 2 pextrd ebx, xmm3, 3 pextrd ebx, xmm3, 3 pextrd ebx, xmm2, 2 pextrd ebx, xmm1, 1 pextrd ebx, xmm0, 0 dec eax jnz .L1 pop ebx ret ;------------------------------------------------------------------------------ ; Name: Vector64ToRegister ; Purpose: Writes 64-bit vector register values into main register. ; Params: rdi = loops ;------------------------------------------------------------------------------ Vector64ToRegister: _Vector64ToRegister: ret ;------------------------------------------------------------------------------ ; Name: CopyAVX ; Purpose: Copies memory chunks that are 32-byte aligned. ; Params: [esp + 4] = ptr to destination memory area ; [esp + 8] = ptr to source memory area ; [esp + 12] = length in bytes ; [esp + 16] = loops ;------------------------------------------------------------------------------ align 64 CopyAVX: _CopyAVX: vzeroupper ; Register usage: ; esi = source ; edi = dest ; ecx = loops ; edx = length push esi push edi push ecx push edx mov edi, [esp + 4 + 16] mov esi, [esp + 8 + 16] mov edx, [esp + 12 + 16] mov ecx, [esp + 16 + 16] shr edx, 8 ; Ensure length is multiple of 256. shl edx, 8 .L1: mov eax, edx .L2: vmovdqa ymm0, [esi] vmovdqa ymm1, [32+esi] vmovdqa ymm2, [64+esi] vmovdqa ymm3, [96+esi] vmovdqa [edi], ymm0 vmovdqa [32+edi], ymm1 vmovdqa [64+edi], ymm2 vmovdqa [96+edi], ymm3 vmovdqa ymm0, [128+esi] vmovdqa ymm1, [128+32+esi] vmovdqa ymm2, [128+64+esi] vmovdqa ymm3, [128+96+esi] vmovdqa [128+edi], ymm0 vmovdqa [128+32+edi], ymm1 vmovdqa [128+64+edi], ymm2 vmovdqa [128+96+edi], ymm3 add esi, 256 add edi, 256 sub eax, 256 jnz .L2 sub esi, edx ; rsi now points to start. sub edi, edx ; rdi now points to start. dec ecx jnz .L1 pop edx pop ecx pop edi pop esi ret ;------------------------------------------------------------------------------ ; Name: CopySSE ; Purpose: Copies memory chunks that are 16-byte aligned. ; Params: [esp + 4] = ptr to destination memory area ; [esp + 8] = ptr to source memory area ; [esp + 12] = length in bytes ; [esp + 16] = loops ;------------------------------------------------------------------------------ align 64 CopySSE: _CopySSE: ; Register usage: ; esi = source ; edi = dest ; ecx = loops ; edx = length push esi push edi push ecx push edx mov edi, [esp + 4 + 16] mov esi, [esp + 8 + 16] mov edx, [esp + 12 + 16] mov ecx, [esp + 16 + 16] shr edx, 7 ; Ensure length is multiple of 128. shl edx, 7 ; Save our non-parameter XMM registers. sub esp, 64 movdqu [esp], xmm4 movdqu [16+esp], xmm5 movdqu [32+esp], xmm6 movdqu [48+esp], xmm7 .L1: mov eax, edx .L2: movdqa xmm0, [esi] movdqa xmm1, [16+esi] movdqa xmm2, [32+esi] movdqa xmm3, [48+esi] movdqa xmm4, [64+esi] movdqa xmm5, [80+esi] movdqa xmm6, [96+esi] movdqa xmm7, [112+esi] ; 32-bit lacks xmm8 - xmm15. movdqa [edi], xmm0 movdqa [16+edi], xmm1 movdqa [32+edi], xmm2 movdqa [48+edi], xmm3 movdqa [64+edi], xmm4 movdqa [80+edi], xmm5 movdqa [96+edi], xmm6 movdqa [112+edi], xmm7 add esi, 128 add edi, 128 sub eax, 128 jnz .L2 sub esi, edx ; rsi now points to start. sub edi, edx ; rdi now points to start. dec ecx jnz .L1 movdqu xmm4, [0+esp] movdqu xmm5, [16+esp] movdqu xmm6, [32+esp] movdqu xmm7, [48+esp] add esp, 64 pop edx pop ecx pop edi pop esi ret ;------------------------------------------------------------------------------ ; Name: CopySSE_128bytes ; Purpose: Copies memory chunks that are 16-byte aligned. ; Params: [esp + 4] = ptr to destination memory area ; [esp + 8] = ptr to source memory area ; [esp + 12] = length in bytes ; [esp + 16] = loops ;------------------------------------------------------------------------------ align 64 CopySSE_128bytes: _CopySSE_128bytes: jmp CopySSE ;------------------------------------------------------------------------------ ; Name: IncrementRegisters ; Purpose: Increments 32-bit values in registers. ; Params: [esp + 4] = loops ;------------------------------------------------------------------------------ align 64 IncrementRegisters: _IncrementRegisters: push ebp mov ebp, [esp+4] .L1: inc eax inc ebx inc ecx inc edx inc esi inc edi inc ebp inc esp dec eax dec ebx dec ecx dec edx dec esi dec edi dec ebp dec esp inc eax inc ebx inc ecx inc edx inc esi inc edi inc ebp inc esp dec eax dec ebx dec ecx dec edx dec esi dec edi dec ebp dec esp dec ebp jnz .L1 pop ebp ret ;------------------------------------------------------------------------------ ; Name: IncrementStack ; Purpose: Increments 32-bit values on stack. ; Params: [esp + 4] = loops ;------------------------------------------------------------------------------ align 64 IncrementStack: _IncrementStack: push ebp mov ebp, [esp+4] sub esp, 64 .L1: inc dword [esp] inc dword [esp+4] inc dword [esp+8] inc dword [esp+12] inc dword [esp+16] inc dword [esp+20] inc dword [esp+24] inc dword [esp+28] inc dword [esp+32] inc dword [esp+36] inc dword [esp+40] inc dword [esp+44] inc dword [esp+48] inc dword [esp+52] inc dword [esp+56] inc dword [esp+60] inc dword [esp] inc dword [esp+4] inc dword [esp+8] inc dword [esp+12] inc dword [esp+16] inc dword [esp+20] inc dword [esp+24] inc dword [esp+28] inc dword [esp+32] inc dword [esp+36] inc dword [esp+40] inc dword [esp+44] inc dword [esp+48] inc dword [esp+52] inc dword [esp+56] inc dword [esp+60] dec ebp jnz .L1 add esp, 64 pop ebp ret CPU-X-5.0.3/src/bandwidth/routines-x86-64bit.asm000066400000000000000000001555121454622605200210500ustar00rootroot00000000000000;============================================================================ ; bandwidth, a benchmark to estimate memory transfer bandwidth. ; Copyright (C) 2005-2017 by Zack T Smith. ; ; This program is free software; you can redistribute it and/or modify ; it under the terms of the GNU General Public License as published by ; the Free Software Foundation; either version 2 of the License, or ; (at your option) any later version. ; ; This program is distributed in the hope that it will be useful, ; but WITHOUT ANY WARRANTY; without even the implied warranty of ; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ; GNU General Public License for more details. ; ; You should have received a copy of the GNU General Public License ; along with this program; if not, write to the Free Software ; Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA ; ; The author may be reached at veritas@comcast.net. ;============================================================================= bits 64 cpu ia64 global CopySSE global CopySSE_128bytes global CopyAVX global _CopyAVX global ReaderLODSQ global _ReaderLODSQ global ReaderLODSD global _ReaderLODSD global ReaderLODSW global _ReaderLODSW global ReaderLODSB global _ReaderLODSB global IncrementRegisters global _IncrementRegisters global IncrementStack global _IncrementStack global RandomReader global RandomReaderSSE2 global RandomReaderSSE2_bypass global RandomWriter global RandomWriterSSE2 global RandomWriterSSE2_bypass global Reader global Reader_128bytes global ReaderAVX global RandomReaderAVX global ReaderSSE2 global ReaderSSE2_128bytes global ReaderSSE2_bypass global ReaderSSE2_128bytes_bypass global Register16ToVector global Register32ToVector global Register64ToVector global Register8ToVector global RegisterToRegister global RegisterToVector global StackReader global StackWriter global Vector16ToRegister global Vector32ToRegister global Vector64ToRegister global Vector8ToRegister global VectorToRegister global VectorToVector global VectorToVectorAVX global Writer global Writer_128bytes global WriterAVX global RandomWriterAVX global WriterSSE2 global WriterSSE2_128bytes global WriterSSE2_bypass global WriterSSE2_128bytes_bypass global WriterAVX_bypass global _WriterAVX_bypass global _CopySSE global _CopySSE_128bytes global _RandomReader global _RandomReaderSSE2 global _RandomReaderSSE2_bypass global _RandomWriter global _RandomWriterSSE2 global _RandomWriterSSE2_bypass global _Reader global _ReaderAVX global _RandomReaderAVX global _Reader_128bytes global _ReaderSSE2 global _ReaderSSE2_bypass global _ReaderSSE2_128bytes global _ReaderSSE2_128bytes_bypass global _Register16ToVector global _Register32ToVector global _Register64ToVector global _Register8ToVector global _RegisterToRegister global _RegisterToVector global _StackReader global _StackWriter global _Vector16ToRegister global _Vector32ToRegister global _Vector64ToRegister global _Vector8ToRegister global _VectorToRegister global _VectorToVector global _VectorToVectorAVX global _Writer global _Writer_128bytes global _WriterSSE2 global _WriterAVX global _RandomWriterAVX global _WriterSSE2_128bytes global _WriterSSE2_bypass global _WriterSSE2_128bytes_bypass global get_cpuid_cache_info global _get_cpuid_cache_info global get_cpuid_family global _get_cpuid_family global get_cpuid1_ecx global _get_cpuid1_ecx global get_cpuid1_edx global _get_cpuid1_edx global get_cpuid7_ebx global _get_cpuid7_ebx global get_cpuid_80000001_ecx global _get_cpuid_80000001_ecx global get_cpuid_80000001_edx global _get_cpuid_80000001_edx ; Note: ; Unix ABI says integer param are put in these registers in this order: ; rdi, rsi, rdx, rcx, r8, r9 section .text ;------------------------------------------------------------------------------ ; Name: get_cpuid_cache_info ; get_cpuid_cache_info: _get_cpuid_cache_info: push rbx push rcx push rdx mov rax, 4 mov rcx, rsi cpuid mov [rdi], eax mov [rdi+4], ebx mov [rdi+8], ecx mov [rdi+12], edx pop rdx pop rcx pop rbx ret ;------------------------------------------------------------------------------ ; Name: get_cpuid_family ; get_cpuid_family: _get_cpuid_family: push rbx push rcx push rdx xor rax, rax cpuid mov [rdi], ebx mov [rdi+4], edx mov [rdi+8], ecx mov byte [rdi+12], 0 pop rdx pop rcx pop rbx ret ;------------------------------------------------------------------------------ ; Name: get_cpuid1_ecx ; get_cpuid1_ecx: _get_cpuid1_ecx: push rbx push rcx push rdx mov rax, 1 cpuid mov rax, rcx pop rdx pop rcx pop rbx ret ;------------------------------------------------------------------------------ ; Name: get_cpuid7_ebx ; get_cpuid7_ebx: _get_cpuid7_ebx: push rbx push rcx push rdx mov rax, 7 xor rcx, rcx cpuid mov rax, rbx pop rdx pop rcx pop rbx ret ;------------------------------------------------------------------------------ ; Name: get_cpuid1_edx ; get_cpuid1_edx: _get_cpuid1_edx: push rbx push rcx push rdx mov rax, 1 cpuid mov rax, rdx pop rdx pop rcx pop rbx ret ;------------------------------------------------------------------------------ ; Name: get_cpuid_80000001_ecx ; get_cpuid_80000001_ecx: _get_cpuid_80000001_ecx: push rbx push rcx push rdx mov rax, 0x80000001 cpuid mov rax, rcx pop rdx pop rcx pop rbx ret ;------------------------------------------------------------------------------ ; Name: get_cpuid_80000001_edx ; get_cpuid_80000001_edx: _get_cpuid_80000001_edx: push rbx push rcx push rdx mov rax, 0x80000001 cpuid mov rax, rdx pop rdx pop rcx pop rbx ret ;------------------------------------------------------------------------------ ; Name: ReaderLODSQ ; Purpose: Reads 64-bit values sequentially from an area of memory ; using LODSQ instruction. ; Params: rdi = ptr to memory area ; rsi = length in bytes ; rdx = loops ;------------------------------------------------------------------------------ align 32 ReaderLODSQ: _ReaderLODSQ: push rcx ; REP counter push r10 push r11 mov r10, rdi mov r11, rsi shr r11, 3 ; length in quadwords rounded down. .L1: mov rsi, r10 ; buffer start mov rcx, r11 ; # of quadwords rep lodsq dec rdx jnz .L1 pop r11 pop r10 pop rcx ret ;------------------------------------------------------------------------------ ; Name: ReaderLODSD ; Purpose: Reads 32-bit values sequentially from an area of memory ; using LODSD instruction. ; Params: rdi = ptr to memory area ; rsi = length in bytes ; rdx = loops ;------------------------------------------------------------------------------ align 32 ReaderLODSD: _ReaderLODSD: push rcx ; REP counter push r10 push r11 mov r10, rdi mov r11, rsi shr r11, 2 ; length in double words rounded down. .L1: mov rsi, r10 ; buffer start mov rcx, r11 ; # of double words rep lodsd dec rdx jnz .L1 pop r11 pop r10 pop rcx ret ;------------------------------------------------------------------------------ ; Name: ReaderLODSW ; Purpose: Reads 16-bit values sequentially from an area of memory ; using LODSW instruction. ; Params: rdi = ptr to memory area ; rsi = length in bytes ; rdx = loops ;------------------------------------------------------------------------------ align 32 ReaderLODSW: _ReaderLODSW: push rcx ; REP counter push r10 push r11 mov r10, rdi mov r11, rsi shr r11, 1 ; length in words rounded down. .L1: mov rsi, r10 ; buffer start mov rcx, r11 ; # of words rep lodsw dec rdx jnz .L1 pop r11 pop r10 pop rcx ret ;------------------------------------------------------------------------------ ; Name: ReaderLODSB ; Purpose: Reads 8-bit values sequentially from an area of memory ; using LODSB instruction. ; Params: rdi = ptr to memory area ; rsi = length in bytes ; rdx = loops ;------------------------------------------------------------------------------ align 32 ReaderLODSB: _ReaderLODSB: push rcx ; REP counter push r10 push r11 mov r10, rdi mov r11, rsi .L1: mov rsi, r10 ; buffer start mov rcx, r11 ; # of bytes rep lodsb dec rdx jnz .L1 pop r11 pop r10 pop rcx ret ;------------------------------------------------------------------------------ ; Name: Reader ; Purpose: Reads 64-bit values sequentially from an area of memory. ; Params: rdi = ptr to memory area ; rsi = length in bytes ; rdx = loops ;------------------------------------------------------------------------------ align 64 Reader: _Reader: push r10 add rsi, rdi ; rsi now points to end. .L1: mov r10, rdi .L2: mov rax, [r10] mov rax, [8+r10] mov rax, [16+r10] mov rax, [24+r10] mov rax, [32+r10] mov rax, [40+r10] mov rax, [48+r10] mov rax, [56+r10] mov rax, [64+r10] mov rax, [72+r10] mov rax, [80+r10] mov rax, [88+r10] mov rax, [96+r10] mov rax, [104+r10] mov rax, [112+r10] mov rax, [120+r10] mov rax, [128+r10] mov rax, [136+r10] mov rax, [144+r10] mov rax, [152+r10] mov rax, [160+r10] mov rax, [168+r10] mov rax, [176+r10] mov rax, [184+r10] mov rax, [192+r10] mov rax, [200+r10] mov rax, [208+r10] mov rax, [216+r10] mov rax, [224+r10] mov rax, [232+r10] mov rax, [240+r10] mov rax, [248+r10] add r10, 256 cmp r10, rsi jb .L2 dec rdx jnz .L1 pop r10 ret ;------------------------------------------------------------------------------ ; Name: Reader_128bytes ; Purpose: Reads 64-bit values sequentially from an area of memory. ; Params: rdi = ptr to memory area ; rsi = length in bytes ; rdx = loops ;------------------------------------------------------------------------------ align 64 Reader_128bytes: _Reader_128bytes: push r10 add rsi, rdi ; rdi now points to end. .L1: mov r10, rdi .L2: mov rax, [r10] mov rax, [8+r10] mov rax, [16+r10] mov rax, [24+r10] mov rax, [32+r10] mov rax, [40+r10] mov rax, [48+r10] mov rax, [56+r10] mov rax, [64+r10] mov rax, [72+r10] mov rax, [80+r10] mov rax, [88+r10] mov rax, [96+r10] mov rax, [104+r10] mov rax, [112+r10] mov rax, [120+r10] add r10, 128 cmp r10, rsi jb .L2 dec rdx jnz .L1 pop r10 ret ;------------------------------------------------------------------------------ ; Name: RandomReader ; Purpose: Reads 64-bit values randomly from an area of memory. ; Params: rdi = ptr to array of chunk pointers ; rsi = # of chunks ; rdx = loops ;------------------------------------------------------------------------------ align 64 RandomReader: _RandomReader: push r10 push r11 .L1: xor r11, r11 .L2: mov r10, [rdi + 8*r11] ; Note, 64-bit pointers. mov rax, [96+r10] mov rax, [r10] mov rax, [120+r10] mov rax, [184+r10] mov rax, [160+r10] mov rax, [176+r10] mov rax, [112+r10] mov rax, [80+r10] mov rax, [32+r10] mov rax, [128+r10] mov rax, [88+r10] mov rax, [40+r10] mov rax, [48+r10] mov rax, [72+r10] mov rax, [200+r10] mov rax, [24+r10] mov rax, [152+r10] mov rax, [16+r10] mov rax, [248+r10] mov rax, [56+r10] mov rax, [240+r10] mov rax, [208+r10] mov rax, [104+r10] mov rax, [216+r10] mov rax, [136+r10] mov rax, [232+r10] mov rax, [64+r10] mov rax, [224+r10] mov rax, [144+r10] mov rax, [192+r10] mov rax, [8+r10] mov rax, [168+r10] inc r11 cmp r11, rsi jb .L2 dec rdx jnz .L1 pop r11 pop r10 ret ;------------------------------------------------------------------------------ ; Name: RandomReaderSSE2 ; Purpose: Reads 128-bit values randomly from an area of memory. ; Params: rdi = ptr to array of chunk pointers ; rsi = # of chunks ; rdx = loops ;------------------------------------------------------------------------------ align 64 RandomReaderSSE2: _RandomReaderSSE2: push r10 push r11 .L1: xor r11, r11 .L2: mov r10, [rdi + 8*r11] movdqa xmm0, [240+r10] movdqa xmm0, [128+r10] movdqa xmm0, [64+r10] movdqa xmm0, [208+r10] movdqa xmm0, [112+r10] movdqa xmm0, [176+r10] movdqa xmm0, [144+r10] movdqa xmm0, [r10] movdqa xmm0, [96+r10] movdqa xmm0, [16+r10] movdqa xmm0, [192+r10] movdqa xmm0, [160+r10] movdqa xmm0, [32+r10] movdqa xmm0, [48+r10] movdqa xmm0, [224+r10] movdqa xmm0, [80+r10] inc r11 cmp r11, rsi jb .L2 dec rdx jnz .L1 pop r11 pop r10 ret ;------------------------------------------------------------------------------ ; Name: RandomReaderSSE2_bypass ; Purpose: Reads 128-bit values randomly from an area of memory. ; Params: rdi = ptr to array of chunk pointers ; rsi = # of chunks ; rdx = loops ;------------------------------------------------------------------------------ align 64 RandomReaderSSE2_bypass: _RandomReaderSSE2_bypass: push r10 push r11 .L1: xor r11, r11 .L2: mov r10, [rdi + 8*r11] ; SSE 4.1 required prefetchnta [r10+192] movntdqa xmm0, [240+r10] prefetchnta [r10] movntdqa xmm0, [r10] prefetchnta [r10+128] movntdqa xmm0, [128+r10] prefetchnta [r10+64] movntdqa xmm0, [64+r10] movntdqa xmm0, [208+r10] movntdqa xmm0, [112+r10] movntdqa xmm0, [48+r10] movntdqa xmm0, [176+r10] movntdqa xmm0, [144+r10] movntdqa xmm0, [96+r10] movntdqa xmm0, [16+r10] movntdqa xmm0, [160+r10] movntdqa xmm0, [32+r10] movntdqa xmm0, [224+r10] movntdqa xmm0, [80+r10] movntdqa xmm0, [192+r10] inc r11 cmp r11, rsi jb .L2 dec rdx jnz .L1 pop r11 pop r10 ret ;------------------------------------------------------------------------------ ; Name: RandomWriter ; Purpose: Writes 64-bit values randomly to an area of memory. ; Params: rdi = ptr to array of chunk pointers ; rsi = # of chunks ; rdx = loops ; rcx = datum to write ;------------------------------------------------------------------------------ align 64 RandomWriter: _RandomWriter: push r10 push r11 .L1: xor r11, r11 .L2: mov r10, [rdi + 8*r11] ; Note, 64-bit pointers. mov [96+r10], rcx mov [r10], rcx mov [120+r10], rcx mov [184+r10], rcx mov [160+r10], rcx mov [176+r10], rcx mov [112+r10], rcx mov [80+r10], rcx mov [32+r10], rcx mov [128+r10], rcx mov [88+r10], rcx mov [40+r10], rcx mov [48+r10], rcx mov [72+r10], rcx mov [200+r10], rcx mov [24+r10], rcx mov [152+r10], rcx mov [16+r10], rcx mov [248+r10], rcx mov [56+r10], rcx mov [240+r10], rcx mov [208+r10], rcx mov [104+r10], rcx mov [216+r10], rcx mov [136+r10], rcx mov [232+r10], rcx mov [64+r10], rcx mov [224+r10], rcx mov [144+r10], rcx mov [192+r10], rcx mov [8+r10], rcx mov [168+r10], rcx inc r11 cmp r11, rsi jb .L2 dec rdx jnz .L1 pop r11 pop r10 ret ;------------------------------------------------------------------------------ ; Name: RandomWriterSSE2 ; Purpose: Writes 128-bit values randomly to an area of memory. ; Params: rdi = ptr to array of chunk pointers ; rsi = # of chunks ; rdx = loops ; rcx = datum to write ;------------------------------------------------------------------------------ align 64 RandomWriterSSE2: _RandomWriterSSE2: push r10 push r11 movq xmm0, rcx ; Create duplicated 128-bit datum movq xmm1, rcx pslldq xmm1, 64 por xmm0, xmm1 .L1: xor r11, r11 .L2: mov r10, [rdi + 8*r11] ; Note, 64-bit pointers. movdqa [240+r10], xmm0 movdqa [128+r10], xmm0 movdqa [208+r10], xmm0 movdqa [112+r10], xmm0 movdqa [64+r10], xmm0 movdqa [176+r10], xmm0 movdqa [144+r10], xmm0 movdqa [r10], xmm0 movdqa [96+r10], xmm0 movdqa [16+r10], xmm0 movdqa [192+r10], xmm0 movdqa [160+r10], xmm0 movdqa [32+r10], xmm0 movdqa [48+r10], xmm0 movdqa [224+r10], xmm0 movdqa [80+r10], xmm0 inc r11 cmp r11, rsi jb .L2 dec rdx jnz .L1 pop r11 pop r10 ret ;------------------------------------------------------------------------------ ; Name: RandomWriterSSE2_bypass ; Purpose: Writes 128-bit values randomly into memory, bypassing caches. ; Params: rdi = ptr to array of chunk pointers ; rsi = # of chunks ; rdx = loops ; rcx = datum to write ;------------------------------------------------------------------------------ align 64 RandomWriterSSE2_bypass: _RandomWriterSSE2_bypass: push r10 push r11 movq xmm0, rcx ; Create duplicated 128-bit datum movq xmm1, rcx pslldq xmm1, 64 por xmm0, xmm1 .L1: xor r11, r11 .L2: mov r10, [rdi + 8*r11] ; Note, 64-bit pointers. movntdq [240+r10], xmm0 movntdq [128+r10], xmm0 movntdq [208+r10], xmm0 movntdq [112+r10], xmm0 movntdq [64+r10], xmm0 movntdq [176+r10], xmm0 movntdq [144+r10], xmm0 movntdq [r10], xmm0 movntdq [96+r10], xmm0 movntdq [16+r10], xmm0 movntdq [192+r10], xmm0 movntdq [160+r10], xmm0 movntdq [32+r10], xmm0 movntdq [48+r10], xmm0 movntdq [224+r10], xmm0 movntdq [80+r10], xmm0 inc r11 cmp r11, rsi jb .L2 dec rdx jnz .L1 pop r11 pop r10 ret ;------------------------------------------------------------------------------ ; Name: ReaderSSE2_128bytes ; Purpose: Reads 128-bit values sequentially from an area of memory. ; Params: rdi = ptr to memory area ; rsi = length in bytes ; rdx = loops ;------------------------------------------------------------------------------ align 64 ReaderSSE2_128bytes: _ReaderSSE2_128bytes: push r10 add rsi, rdi ; rsi now points to end. .L1: mov r10, rdi .L2: movdqa xmm0, [r10] ; Read aligned to 16-byte boundary. movdqa xmm0, [16+r10] movdqa xmm0, [32+r10] movdqa xmm0, [48+r10] movdqa xmm0, [64+r10] movdqa xmm0, [80+r10] movdqa xmm0, [96+r10] movdqa xmm0, [112+r10] add r10, 128 cmp r10, rsi jb .L2 dec rdx jnz .L1 pop r10 ret ;------------------------------------------------------------------------------ ; Name: ReaderSSE2 ; Purpose: Reads 128-bit values sequentially from an area of memory. ; Params: rdi = ptr to memory area ; rsi = length in bytes ; rdx = loops ;------------------------------------------------------------------------------ align 64 ReaderSSE2: _ReaderSSE2: push r10 add rsi, rdi ; rsi now points to end. .L1: mov r10, rdi .L2: movdqa xmm0, [r10] ; Read aligned to 16-byte boundary. movdqa xmm0, [16+r10] movdqa xmm0, [32+r10] movdqa xmm0, [48+r10] movdqa xmm0, [64+r10] movdqa xmm0, [80+r10] movdqa xmm0, [96+r10] movdqa xmm0, [112+r10] movdqa xmm0, [128+r10] movdqa xmm0, [144+r10] movdqa xmm0, [160+r10] movdqa xmm0, [176+r10] movdqa xmm0, [192+r10] movdqa xmm0, [208+r10] movdqa xmm0, [224+r10] movdqa xmm0, [240+r10] add r10, 256 cmp r10, rsi jb .L2 dec rdx jnz .L1 pop r10 ret ;------------------------------------------------------------------------------ ; Name: ReaderAVX ; Purpose: Reads 256-bit values sequentially from an area of memory. ; Params: rdi = ptr to memory area ; rsi = length in bytes ; rdx = loops ;------------------------------------------------------------------------------ align 64 ReaderAVX: _ReaderAVX: ; vzeroupper sub rsp, 32 vmovdqu [rsp], ymm0 sub rsp, 32 vmovdqu [rsp], ymm1 sub rsp, 32 vmovdqu [rsp], ymm2 sub rsp, 32 vmovdqu [rsp], ymm3 push r10 add rsi, rdi ; rsi now points to end. .L1: mov r10, rdi .L2: vmovdqa ymm0, [r10] ; Read aligned to 32-byte boundary. vmovdqa ymm1, [32+r10] vmovdqa ymm2, [64+r10] vmovdqa ymm3, [96+r10] vmovdqa ymm0, [128+r10] vmovdqa ymm1, [160+r10] vmovdqa ymm2, [192+r10] vmovdqa ymm3, [224+r10] add r10, 256 cmp r10, rsi jb .L2 dec rdx jnz .L1 pop r10 vmovdqu ymm3, [rsp] add rsp, 32 vmovdqu ymm2, [rsp] add rsp, 32 vmovdqu ymm1, [rsp] add rsp, 32 vmovdqu ymm0, [rsp] add rsp, 32 ret ;------------------------------------------------------------------------------ ; Name: RandomReaderAVX ; Purpose: Reads 256-bit values in somewhat random order from RAM. ; Params: rdi = ptr to chunk pointers ; rsi = # chunks ; rdx = loops ;------------------------------------------------------------------------------ align 64 RandomReaderAVX: _RandomReaderAVX: sub rsp, 32 vmovdqu [rsp], ymm0 sub rsp, 32 vmovdqu [rsp], ymm1 sub rsp, 32 vmovdqu [rsp], ymm2 sub rsp, 32 vmovdqu [rsp], ymm3 push r10 push r11 .L1: xor r11, r11 .L2: mov r10, [rdi + 8*r11] ; Read aligned to 32-byte boundary. vmovdqa ymm0, [96+r10] vmovdqa ymm1, [192+r10] vmovdqa ymm2, [64+r10] vmovdqa ymm3, [224+r10] vmovdqa ymm0, [r10] vmovdqa ymm1, [160+r10] vmovdqa ymm2, [128+r10] vmovdqa ymm3, [32+r10] inc r11 cmp r11, rsi jb .L2 dec rdx jnz .L1 pop r11 pop r10 vmovdqu ymm3, [rsp] add rsp, 32 vmovdqu ymm2, [rsp] add rsp, 32 vmovdqu ymm1, [rsp] add rsp, 32 vmovdqu ymm0, [rsp] add rsp, 32 ret ;------------------------------------------------------------------------------ ; Name: ReaderSSE2_bypass ; Purpose: Reads 128-bit values sequentially from an area of memory. ; Params: rdi = ptr to memory area ; rsi = length in bytes ; rdx = loops ;------------------------------------------------------------------------------ align 64 ReaderSSE2_bypass: _ReaderSSE2_bypass: push r10 add rsi, rdi ; rsi now points to end. .L1: mov r10, rdi .L2: prefetchnta [r10] prefetchnta [r10+64] movntdqa xmm0, [r10] ; Read aligned to 16-byte boundary. movntdqa xmm0, [16+r10] movntdqa xmm0, [32+r10] movntdqa xmm0, [48+r10] movntdqa xmm0, [64+r10] movntdqa xmm0, [80+r10] movntdqa xmm0, [96+r10] movntdqa xmm0, [112+r10] prefetchnta [r10+128] prefetchnta [r10+192] movntdqa xmm0, [128+r10] movntdqa xmm0, [144+r10] movntdqa xmm0, [160+r10] movntdqa xmm0, [176+r10] movntdqa xmm0, [192+r10] movntdqa xmm0, [208+r10] movntdqa xmm0, [224+r10] movntdqa xmm0, [240+r10] add r10, 256 cmp r10, rsi jb .L2 dec rdx jnz .L1 pop r10 ret ;------------------------------------------------------------------------------ ; Name: ReaderSSE2_128bytes_bypass ; Purpose: Reads 128-bit values sequentially from an area of memory. ; Params: rdi = ptr to memory area ; rsi = length in bytes ; rdx = loops ;------------------------------------------------------------------------------ align 64 ReaderSSE2_128bytes_bypass: _ReaderSSE2_128bytes_bypass: push r10 add rsi, rdi ; rsi now points to end. .L1: mov r10, rdi .L2: prefetchnta [r10] movntdqa xmm0, [r10] ; Read aligned to 16-byte boundary. movntdqa xmm0, [16+r10] movntdqa xmm0, [32+r10] movntdqa xmm0, [48+r10] prefetchnta [r10+64] movntdqa xmm0, [64+r10] movntdqa xmm0, [80+r10] movntdqa xmm0, [96+r10] movntdqa xmm0, [112+r10] add r10, 128 cmp r10, rsi jb .L2 dec rdx jnz .L1 pop r10 ret ;------------------------------------------------------------------------------ ; Name: Writer ; Purpose: Writes 64-bit value sequentially to an area of memory. ; Params: rdi = ptr to memory area ; rsi = length in bytes ; rdx = loops ; rcx = quad to write ;------------------------------------------------------------------------------ align 64 Writer: _Writer: push r10 add rsi, rdi ; rsi now points to end. .L1: mov r10, rdi .L2: mov [r10], rcx mov [8+r10], rcx mov [16+r10], rcx mov [24+r10], rcx mov [32+r10], rcx mov [40+r10], rcx mov [48+r10], rcx mov [56+r10], rcx mov [64+r10], rcx mov [72+r10], rcx mov [80+r10], rcx mov [88+r10], rcx mov [96+r10], rcx mov [104+r10], rcx mov [112+r10], rcx mov [120+r10], rcx mov [128+r10], rcx mov [136+r10], rcx mov [144+r10], rcx mov [152+r10], rcx mov [160+r10], rcx mov [168+r10], rcx mov [176+r10], rcx mov [184+r10], rcx mov [192+r10], rcx mov [200+r10], rcx mov [208+r10], rcx mov [216+r10], rcx mov [224+r10], rcx mov [232+r10], rcx mov [240+r10], rcx mov [248+r10], rcx add r10, 256 cmp r10, rsi jb .L2 dec rdx jnz .L1 pop r10 ret ;------------------------------------------------------------------------------ ; Name: Writer_128bytes ; Purpose: Writes 64-bit value sequentially to an area of memory. ; Params: rdi = ptr to memory area ; rsi = length in bytes ; rdx = loops ; rcx = quad to write ;------------------------------------------------------------------------------ align 64 Writer_128bytes: _Writer_128bytes: push r10 add rsi, rdi ; rsi now points to end. .L1: mov r10, rdi .L2: mov [r10], rcx mov [8+r10], rcx mov [16+r10], rcx mov [24+r10], rcx mov [32+r10], rcx mov [40+r10], rcx mov [48+r10], rcx mov [56+r10], rcx mov [64+r10], rcx mov [72+r10], rcx mov [80+r10], rcx mov [88+r10], rcx mov [96+r10], rcx mov [104+r10], rcx mov [112+r10], rcx mov [120+r10], rcx add r10, 128 cmp r10, rsi jb .L2 dec rdx jnz .L1 pop r10 ret ;------------------------------------------------------------------------------ ; Name: WriterSSE2 ; Purpose: Writes 128-bit value sequentially to an area of memory. ; Params: rdi = ptr to memory area ; rsi = length in bytes ; rdx = loops ; rcx = quad to write ;------------------------------------------------------------------------------ align 64 WriterSSE2: _WriterSSE2: push r10 add rsi, rdi ; rsi now points to end. movq xmm0, rcx .L1: mov r10, rdi .L2: movdqa [r10], xmm0 movdqa [16+r10], xmm0 movdqa [32+r10], xmm0 movdqa [48+r10], xmm0 movdqa [64+r10], xmm0 movdqa [80+r10], xmm0 movdqa [96+r10], xmm0 movdqa [112+r10], xmm0 movdqa [128+r10], xmm0 movdqa [144+r10], xmm0 movdqa [160+r10], xmm0 movdqa [176+r10], xmm0 movdqa [192+r10], xmm0 movdqa [208+r10], xmm0 movdqa [224+r10], xmm0 movdqa [240+r10], xmm0 add r10, 256 cmp r10, rsi jb .L2 dec rdx jnz .L1 pop r10 ret ;------------------------------------------------------------------------------ ; Name: WriterAVX ; Purpose: Writes 256-bit value sequentially to an area of memory. ; Params: rdi = ptr to memory area ; rsi = length in bytes ; rdx = loops ; rcx = quad to write ;------------------------------------------------------------------------------ align 64 WriterAVX: _WriterAVX: vzeroupper push r10 add rsi, rdi ; rsi now points to end. pinsrq xmm0, rcx, 0 pinsrq xmm0, rcx, 1 .L1: mov r10, rdi .L2: vmovdqa [r10], ymm0 vmovdqa [32+r10], ymm0 vmovdqa [64+r10], ymm0 vmovdqa [96+r10], ymm0 vmovdqa [128+r10], ymm0 vmovdqa [160+r10], ymm0 vmovdqa [192+r10], ymm0 vmovdqa [224+r10], ymm0 add r10, 256 cmp r10, rsi jb .L2 dec rdx jnz .L1 pop r10 vzeroall ret ;------------------------------------------------------------------------------ ; Name: RandomWriterAVX ; Purpose: Writes 256-bit value in somewhat random order to RAM. ; Params: rdi = ptr to array of chunk pointers ; rsi = # of chunks ; rdx = loops ; rcx = datum to write ;------------------------------------------------------------------------------ align 64 RandomWriterAVX: _RandomWriterAVX: push r10 push r11 sub rsp, 32 mov [rsp], rcx mov [rsp+8], rcx mov [rsp+16], rcx mov [rsp+24], rcx vmovdqu ymm0, [rsp] add rsp, 32 .L1: xor r11, r11 .L2: mov r10, [rdi + 8*r11] ; Note, 64-bit pointers. vmovdqa [192+r10], ymm0 vmovdqa [224+r10], ymm0 vmovdqa [64+r10], ymm0 vmovdqa [128+r10], ymm0 vmovdqa [r10], ymm0 vmovdqa [96+r10], ymm0 vmovdqa [160+r10], ymm0 vmovdqa [32+r10], ymm0 inc r11 cmp r11, rsi jb .L2 dec rdx jnz .L1 pop r11 pop r10 vzeroall ret ;------------------------------------------------------------------------------ ; Name: WriterSSE2_128bytes ; Purpose: Writes 128-bit value sequentially to an area of memory, ; chunks are 128 bytes rather than 256. ; Params: rdi = ptr to memory area ; rsi = length in bytes ; rdx = loops ; rcx = quad to write ;------------------------------------------------------------------------------ align 64 WriterSSE2_128bytes: _WriterSSE2_128bytes: push r10 add rsi, rdi ; rsi now points to end. movq xmm0, rcx .L1: mov r10, rdi .L2: movdqa [r10], xmm0 movdqa [16+r10], xmm0 movdqa [32+r10], xmm0 movdqa [48+r10], xmm0 movdqa [64+r10], xmm0 movdqa [80+r10], xmm0 movdqa [96+r10], xmm0 movdqa [112+r10], xmm0 add r10, 128 cmp r10, rsi jb .L2 dec rdx jnz .L1 pop r10 ret ;------------------------------------------------------------------------------ ; Name: WriterSSE2_bypass ; Purpose: Writes 128-bit value sequentially to an area of memory. ; Params: rdi = ptr to memory area ; rsi = length in bytes ; rdx = loops ; rcx = quad to write ;------------------------------------------------------------------------------ align 64 WriterSSE2_bypass: _WriterSSE2_bypass: push r10 add rsi, rdi ; rsi now points to end. movq xmm0, rcx .L1: mov r10, rdi .L2: movntdq [r10], xmm0 ; Write bypassing cache. movntdq [16+r10], xmm0 movntdq [32+r10], xmm0 movntdq [48+r10], xmm0 movntdq [64+r10], xmm0 movntdq [80+r10], xmm0 movntdq [96+r10], xmm0 movntdq [112+r10], xmm0 movntdq [128+r10], xmm0 movntdq [144+r10], xmm0 movntdq [160+r10], xmm0 movntdq [176+r10], xmm0 movntdq [192+r10], xmm0 movntdq [208+r10], xmm0 movntdq [224+r10], xmm0 movntdq [240+r10], xmm0 add r10, 256 cmp r10, rsi jb .L2 dec rdx jnz .L1 pop r10 ret ;------------------------------------------------------------------------------ ; Name: WriterAVX_bypass ; Purpose: Writes 256-bit value sequentially to an area of memory. ; Params: rdi = ptr to memory area ; rsi = length in bytes ; rdx = loops ; rcx = quad to write ;------------------------------------------------------------------------------ align 64 WriterAVX_bypass: _WriterAVX_bypass: vzeroupper push r10 add rsi, rdi ; rsi now points to end. movq xmm0, rcx .L1: mov r10, rdi .L2: vmovntdq [r10], ymm0 ; Write bypassing cache. vmovntdq [32+r10], ymm0 vmovntdq [64+r10], ymm0 vmovntdq [96+r10], ymm0 vmovntdq [128+r10], ymm0 vmovntdq [160+r10], ymm0 vmovntdq [192+r10], ymm0 vmovntdq [224+r10], ymm0 add r10, 256 cmp r10, rsi jb .L2 dec rdx jnz .L1 pop r10 vzeroall ret ;------------------------------------------------------------------------------ ; Name: WriterSSE2_128bytes_bypass ; Purpose: Writes 128-bit value sequentially to an area of memory. ; Params: rdi = ptr to memory area ; rsi = length in bytes ; rdx = loops ; rcx = quad to write ;------------------------------------------------------------------------------ align 64 WriterSSE2_128bytes_bypass: _WriterSSE2_128bytes_bypass: push r10 add rsi, rdi ; rsi now points to end. movq xmm0, rcx .L1: mov r10, rdi .L2: movntdq [r10], xmm0 ; Write bypassing cache. movntdq [16+r10], xmm0 movntdq [32+r10], xmm0 movntdq [48+r10], xmm0 movntdq [64+r10], xmm0 movntdq [80+r10], xmm0 movntdq [96+r10], xmm0 movntdq [112+r10], xmm0 add r10, 128 cmp r10, rsi jb .L2 dec rdx jnz .L1 pop r10 ret ;------------------------------------------------------------------------------ ; Name: StackReader ; Purpose: Reads 64-bit values off the stack into registers of ; the main register set, effectively testing L1 cache access ; *and* effective-address calculation speed. ; Params: rdi = loops ;------------------------------------------------------------------------------ align 64 StackReader: _StackReader: push qword 7000 ; [rsp+48] push qword 6000 ; [rsp+40] push qword 5000 ; [rsp+32] push qword 4000 ; [rsp+24] push qword 3000 ; [rsp+16] push qword 2000 ; [rsp+8] push qword 1000 ; [rsp] .L1: mov rax, [rsp] mov rax, [rsp+16] mov rax, [rsp+24] mov rax, [rsp+32] mov rax, [rsp+40] mov rax, [rsp+8] mov rax, [rsp+48] mov rax, [rsp] mov rax, [rsp] mov rax, [rsp+16] mov rax, [rsp+24] mov rax, [rsp+32] mov rax, [rsp+40] mov rax, [rsp+8] mov rax, [rsp+48] mov rax, [rsp] mov rax, [rsp] mov rax, [rsp+16] mov rax, [rsp+24] mov rax, [rsp+32] mov rax, [rsp+40] mov rax, [rsp+8] mov rax, [rsp+48] mov rax, [rsp+8] mov rax, [rsp+8] mov rax, [rsp+16] mov rax, [rsp+24] mov rax, [rsp+32] mov rax, [rsp+40] mov rax, [rsp+8] mov rax, [rsp+48] mov rax, [rsp+8] sub rdi, 1 jnz .L1 add rsp, 56 ret ;------------------------------------------------------------------------------ ; Name: StackWriter ; Purpose: Writes 64-bit values into the stack from registers of ; the main register set, effectively testing L1 cache access ; *and* effective-address calculation speed. ; Params: rdi = loops ;------------------------------------------------------------------------------ align 64 StackWriter: _StackWriter: push qword 7000 ; [rsp+48] push qword 6000 ; [rsp+40] push qword 5000 ; [rsp+32] push qword 4000 ; [rsp+24] push qword 3000 ; [rsp+16] push qword 2000 ; [rsp+8] push qword 1000 ; [rsp] xor rax, rax .L1: mov [rsp], rax mov [rsp+16], rax mov [rsp+24], rax mov [rsp+32], rax mov [rsp+40], rax mov [rsp+8], rax mov [rsp+48], rax mov [rsp], rax mov [rsp], rax mov [rsp+16], rax mov [rsp+24], rax mov [rsp+32], rax mov [rsp+40], rax mov [rsp+8], rax mov [rsp+48], rax mov [rsp], rax mov [rsp], rax mov [rsp+16], rax mov [rsp+24], rax mov [rsp+32], rax mov [rsp+40], rax mov [rsp+8], rax mov [rsp+48], rax mov [rsp+8], rax mov [rsp+8], rax mov [rsp+16], rax mov [rsp+24], rax mov [rsp+32], rax mov [rsp+40], rax mov [rsp+8], rax mov [rsp+48], rax mov [rsp+8], rax sub rdi, 1 jnz .L1 add rsp, 56 ret ;------------------------------------------------------------------------------ ; Name: RegisterToRegister ; Purpose: Reads/writes 64-bit values between registers of ; the main register set. ; Params: rdi = loops ;------------------------------------------------------------------------------ align 64 RegisterToRegister: _RegisterToRegister: .L1: mov rax, rbx mov rax, rcx mov rax, rdx mov rax, rsi mov rax, rdi mov rax, rbp mov rax, rsp mov rax, rbx mov rax, rbx mov rax, rcx mov rax, rdx mov rax, rsi mov rax, rdi mov rax, rbp mov rax, rsp mov rax, rbx mov rax, rbx mov rax, rcx mov rax, rdx mov rax, rsi mov rax, rdi mov rax, rbp mov rax, rsp mov rax, rbx mov rax, rbx mov rax, rcx mov rax, rdx mov rax, rsi mov rax, rdi mov rax, rbp mov rax, rsp mov rax, rbx sub rdi, 1 jnz .L1 ret ;------------------------------------------------------------------------------ ; Name: VectorToVector ; Purpose: Reads/writes 128-bit values between registers of ; the vector register set, in this case XMM. ; Params: rdi = loops ;------------------------------------------------------------------------------ align 64 VectorToVector: _VectorToVector: .L1: movq xmm0, xmm1 ; Each move moves 16 bytes, so we need 16 movq xmm14, xmm2 ; moves to transfer a 256 byte chunk. movq xmm0, xmm4 movq xmm9, xmm0 movq xmm1, xmm12 movq xmm7, xmm1 movq xmm8, xmm3 movq xmm3, xmm1 movq xmm13, xmm2 movq xmm11, xmm3 movq xmm2, xmm10 movq xmm6, xmm1 movq xmm1, xmm2 movq xmm15, xmm1 movq xmm0, xmm3 movq xmm3, xmm14 sub rdi, 1 jnz .L1 ret ;------------------------------------------------------------------------------ ; Name: VectorToVectorAVX ; Purpose: Reads/writes 256-bit values between registers of ; the vector register set, in this case YMM. ; Params: rdi = loops ;------------------------------------------------------------------------------ align 64 VectorToVectorAVX: _VectorToVectorAVX: vzeroupper .L1: vmovdqa ymm0, ymm1 ; Each move moves 32 bytes, so we need 8 vmovdqa ymm0, ymm2 ; moves to transfer a 256 byte chunk. vmovdqa ymm0, ymm3 vmovdqa ymm2, ymm0 vmovdqa ymm1, ymm2 vmovdqa ymm2, ymm1 vmovdqa ymm0, ymm3 vmovdqa ymm3, ymm1 sub rdi, 1 jnz .L1 vzeroall ret ;------------------------------------------------------------------------------ ; Name: RegisterToVector ; Purpose: Writes 64-bit main register values into 128-bit vector register ; clearing the upper unused bits. ; Params: rdi = loops ;------------------------------------------------------------------------------ align 64 RegisterToVector: _RegisterToVector: .L1: movq xmm1, rax ; Each movq transfers 8 bytes, so we need movq xmm2, rsi ; 32 transfers to move a 256-byte chunk. movq xmm3, rbx movq xmm1, rcx movq xmm2, rsi movq xmm3, rsp movq xmm0, rdi movq xmm0, rdx movq xmm0, rax movq xmm1, rsi movq xmm2, rbx movq xmm3, rcx movq xmm0, rsi movq xmm3, rsp movq xmm2, rdi movq xmm1, rdx movq xmm0, rax movq xmm1, rsi movq xmm2, rbx movq xmm3, rcx movq xmm0, rsi movq xmm3, rsp movq xmm2, rdi movq xmm1, rdx movq xmm0, rax movq xmm1, rsi movq xmm2, rbx movq xmm3, rcx movq xmm0, rsi movq xmm3, rsp movq xmm2, rdi movq xmm1, rdx dec rdi jnz .L1 ret ;------------------------------------------------------------------------------ ; Name: VectorToRegister ; Purpose: Writes lower 64 bits of vector register into 64-bit main ; register. ; Params: rdi = loops ;------------------------------------------------------------------------------ align 64 VectorToRegister: _VectorToRegister: .L1: movq rax, xmm1 movq rax, xmm2 movq rax, xmm3 movq rax, xmm1 movq rax, xmm2 movq rax, xmm3 movq rax, xmm0 movq rax, xmm0 movq rax, xmm0 movq rax, xmm1 movq rax, xmm2 movq rax, xmm3 movq rax, xmm0 movq rax, xmm3 movq rax, xmm2 movq rax, xmm1 movq rax, xmm0 movq rax, xmm1 movq rax, xmm2 movq rax, xmm3 movq rax, xmm0 movq rax, xmm3 movq rax, xmm2 movq rax, xmm1 movq rax, xmm0 movq rax, xmm1 movq rax, xmm2 movq rax, xmm3 movq rax, xmm0 movq rax, xmm3 movq rax, xmm2 movq rax, xmm1 dec rdi jnz .L1 ret ;------------------------------------------------------------------------------ ; Name: Register8ToVector ; Purpose: Writes 8-bit main register values into 128-bit vector register ; without clearing the unused bits. ; Params: rdi = loops ;------------------------------------------------------------------------------ align 64 Register8ToVector: _Register8ToVector: sal rdi, 2 ; Force some repetition. .L1: pinsrb xmm1, al, 0 ; 64 transfers x 1 byte = 64 bytes pinsrb xmm2, bl, 1 pinsrb xmm3, cl, 2 pinsrb xmm1, dl, 3 pinsrb xmm2, sil, 4 pinsrb xmm3, dil, 5 pinsrb xmm0, bpl, 6 pinsrb xmm0, spl, 7 pinsrb xmm0, al, 0 pinsrb xmm1, bl, 1 pinsrb xmm2, cl, 2 pinsrb xmm3, dl, 3 pinsrb xmm3, al, 4 pinsrb xmm2, bl, 5 pinsrb xmm1, bpl, 6 pinsrb xmm0, spl, 7 pinsrb xmm1, r8b, 0 pinsrb xmm2, r9b, 1 pinsrb xmm3, r10b, 2 pinsrb xmm1, r11b, 3 pinsrb xmm2, r12b, 4 pinsrb xmm3, al, 5 pinsrb xmm0, cl, 6 pinsrb xmm0, bl, 7 pinsrb xmm0, r8b, 0 pinsrb xmm0, r9b, 1 pinsrb xmm0, r10b, 2 pinsrb xmm0, r11b, 3 pinsrb xmm0, r12b, 4 pinsrb xmm0, al, 5 pinsrb xmm0, cl, 6 pinsrb xmm0, bl, 7 pinsrb xmm1, al, 0 pinsrb xmm2, bl, 1 pinsrb xmm3, cl, 2 pinsrb xmm1, dl, 3 pinsrb xmm2, sil, 4 pinsrb xmm3, dil, 5 pinsrb xmm0, bpl, 6 pinsrb xmm0, spl, 7 pinsrb xmm0, al, 10 pinsrb xmm1, bl, 11 pinsrb xmm2, cl, 12 pinsrb xmm3, dl, 13 pinsrb xmm3, dil, 14 pinsrb xmm2, cl, 15 pinsrb xmm1, al, 6 pinsrb xmm0, bpl, 7 pinsrb xmm1, r8b, 10 pinsrb xmm2, r9b, 11 pinsrb xmm3, r10b, 12 pinsrb xmm1, r11b, 13 pinsrb xmm2, r12b, 14 pinsrb xmm3, al, 15 pinsrb xmm0, cl, 6 pinsrb xmm0, bl, 7 pinsrb xmm0, r8b, 9 pinsrb xmm0, r9b, 8 pinsrb xmm0, r10b, 11 pinsrb xmm0, r11b, 3 pinsrb xmm0, r12b, 4 pinsrb xmm0, al, 5 pinsrb xmm0, cl, 6 pinsrb xmm0, bl, 7 dec rdi jnz .L1 ret ;------------------------------------------------------------------------------ ; Name: Register16ToVector ; Purpose: Writes 16-bit main register values into 128-bit vector register ; without clearing the unused bits. ; Params: rdi = loops ;------------------------------------------------------------------------------ align 64 Register16ToVector: _Register16ToVector: sal rdi, 1 ; Force some repetition. .L1: pinsrw xmm1, ax, 0 ; 64 transfers x 2 bytes = 128 bytes pinsrw xmm2, bx, 1 pinsrw xmm3, cx, 2 pinsrw xmm1, dx, 3 pinsrw xmm2, si, 4 pinsrw xmm3, di, 5 pinsrw xmm0, bp, 6 pinsrw xmm0, sp, 7 pinsrw xmm0, ax, 0 pinsrw xmm1, bx, 1 pinsrw xmm2, cx, 2 pinsrw xmm3, dx, 3 pinsrw xmm3, si, 4 pinsrw xmm2, di, 5 pinsrw xmm1, bp, 6 pinsrw xmm0, sp, 7 pinsrw xmm1, r8w, 0 pinsrw xmm2, r9w, 1 pinsrw xmm3, r10w, 2 pinsrw xmm1, r11w, 3 pinsrw xmm2, r12w, 4 pinsrw xmm3, ax, 5 pinsrw xmm0, bp, 6 pinsrw xmm0, bx, 7 pinsrw xmm0, r8w, 0 pinsrw xmm0, r9w, 1 pinsrw xmm0, r10w, 2 pinsrw xmm0, r11w, 3 pinsrw xmm0, r12w, 4 pinsrw xmm0, ax, 5 pinsrw xmm0, bp, 6 pinsrw xmm0, bx, 7 pinsrw xmm1, ax, 0 pinsrw xmm2, bx, 1 pinsrw xmm3, cx, 2 pinsrw xmm1, dx, 3 pinsrw xmm2, si, 4 pinsrw xmm3, di, 5 pinsrw xmm0, bp, 6 pinsrw xmm0, sp, 7 pinsrw xmm0, ax, 0 pinsrw xmm1, bx, 1 pinsrw xmm2, cx, 2 pinsrw xmm3, dx, 3 pinsrw xmm3, si, 4 pinsrw xmm2, di, 5 pinsrw xmm1, bp, 6 pinsrw xmm0, sp, 7 pinsrw xmm1, r8w, 0 pinsrw xmm2, r9w, 1 pinsrw xmm3, r10w, 2 pinsrw xmm1, r11w, 3 pinsrw xmm2, r12w, 4 pinsrw xmm3, ax, 5 pinsrw xmm0, bp, 6 pinsrw xmm0, bx, 7 pinsrw xmm0, r8w, 0 pinsrw xmm0, r9w, 1 pinsrw xmm0, r10w, 2 pinsrw xmm0, r11w, 3 pinsrw xmm0, r12w, 4 pinsrw xmm0, ax, 5 pinsrw xmm0, bp, 6 pinsrw xmm0, bx, 7 dec rdi jnz .L1 ret ;------------------------------------------------------------------------------ ; Name: Register32ToVector ; Purpose: Writes 32-bit main register values into 128-bit vector register ; without clearing the unused bits. ; Params: rdi = loops ;------------------------------------------------------------------------------ align 64 Register32ToVector: _Register32ToVector: .L1: pinsrd xmm1, eax, 0 ; Each xfer moves 4 bytes so to move 256 bytes pinsrd xmm2, ebx, 1 ; we need 64 transfers. pinsrd xmm3, ecx, 2 pinsrd xmm1, edx, 3 pinsrd xmm2, esi, 0 pinsrd xmm3, edi, 1 pinsrd xmm0, ebp, 2 pinsrd xmm0, esp, 3 pinsrd xmm0, eax, 0 pinsrd xmm1, ebx, 1 pinsrd xmm2, ecx, 2 pinsrd xmm3, edx, 3 pinsrd xmm3, esi, 3 pinsrd xmm2, edi, 2 pinsrd xmm1, ebp, 1 pinsrd xmm0, esp, 0 pinsrd xmm1, r8d, 0 pinsrd xmm2, r9d, 1 pinsrd xmm3, r10d, 2 pinsrd xmm1, r11d, 3 pinsrd xmm2, r12d, 0 pinsrd xmm3, eax, 1 pinsrd xmm0, ebp, 2 pinsrd xmm0, ebx, 3 pinsrd xmm0, r8d, 0 pinsrd xmm0, r9d, 1 pinsrd xmm0, r10d, 2 pinsrd xmm0, r11d, 3 pinsrd xmm0, r12d, 0 pinsrd xmm0, eax, 0 pinsrd xmm0, ebp, 0 pinsrd xmm0, ebx, 0 pinsrd xmm1, eax, 0 pinsrd xmm2, ebx, 1 pinsrd xmm3, ecx, 2 pinsrd xmm1, edx, 3 pinsrd xmm2, esi, 0 pinsrd xmm3, edi, 1 pinsrd xmm0, ebp, 2 pinsrd xmm0, esp, 3 pinsrd xmm0, eax, 0 pinsrd xmm1, ebx, 1 pinsrd xmm2, ecx, 2 pinsrd xmm3, edx, 3 pinsrd xmm3, esi, 3 pinsrd xmm2, edi, 2 pinsrd xmm1, ebp, 1 pinsrd xmm0, esp, 0 pinsrd xmm1, r8d, 0 pinsrd xmm2, r9d, 1 pinsrd xmm3, r10d, 2 pinsrd xmm1, r11d, 3 pinsrd xmm2, r12d, 0 pinsrd xmm3, eax, 1 pinsrd xmm0, ebp, 2 pinsrd xmm0, ebx, 3 pinsrd xmm0, r8d, 0 pinsrd xmm0, r9d, 1 pinsrd xmm0, r10d, 2 pinsrd xmm0, r11d, 3 pinsrd xmm0, r12d, 0 pinsrd xmm0, eax, 0 pinsrd xmm0, ebp, 0 pinsrd xmm0, ebx, 0 dec rdi jnz .L1 ret ;------------------------------------------------------------------------------ ; Name: Register64ToVector ; Purpose: Writes 64-bit main register values into 128-bit vector register ; without clearing the unused bits. ; Params: rdi = loops ;------------------------------------------------------------------------------ align 64 Register64ToVector: _Register64ToVector: add rdi, rdi .L1: pinsrq xmm1, r8, 0 ; Each xfer moves 8 bytes, therefore to do pinsrq xmm2, r9, 1 ; 256 bytes we need 32 transfers. pinsrq xmm3, r10, 0 pinsrq xmm1, r11, 1 pinsrq xmm2, r12, 0 pinsrq xmm3, rax, 1 pinsrq xmm0, rbp, 0 pinsrq xmm0, rbx, 1 pinsrq xmm0, r8, 0 pinsrq xmm0, r9, 1 pinsrq xmm0, r10, 1 pinsrq xmm0, r11, 1 pinsrq xmm0, r12, 0 pinsrq xmm0, rax, 0 pinsrq xmm0, rbp, 0 pinsrq xmm0, rbx, 0 pinsrq xmm0, r8, 0 pinsrq xmm0, r9, 1 pinsrq xmm0, r10, 1 pinsrq xmm0, r11, 1 pinsrq xmm0, r12, 0 pinsrq xmm0, rax, 0 pinsrq xmm0, rbp, 0 pinsrq xmm0, rbx, 0 pinsrq xmm0, r8, 0 pinsrq xmm0, r9, 1 pinsrq xmm0, r10, 1 pinsrq xmm0, r11, 1 pinsrq xmm0, r12, 0 pinsrq xmm0, rax, 0 pinsrq xmm0, rbp, 0 pinsrq xmm0, rbx, 0 dec rdi jnz .L1 ret ;------------------------------------------------------------------------------ ; Name: Vector8ToRegister ; Purpose: Writes 8-bit vector register values into main register. ; Params: rdi = loops ;------------------------------------------------------------------------------ align 64 Vector8ToRegister: _Vector8ToRegister: sal rdi, 3 ; Force some repetition. .L1: pextrb eax, xmm1, 0 ; 64 transfers x 1 bytes = 64 bytes pextrb eax, xmm2, 1 pextrb eax, xmm3, 2 pextrb eax, xmm1, 3 pextrb eax, xmm2, 4 pextrb eax, xmm3, 5 pextrb eax, xmm0, 6 pextrb eax, xmm0, 7 pextrb eax, xmm0, 0 pextrb eax, xmm1, 1 pextrb eax, xmm2, 2 pextrb eax, xmm3, 3 pextrb eax, xmm3, 4 pextrb eax, xmm2, 5 pextrb eax, xmm1, 6 pextrb eax, xmm0, 7 pextrb eax, xmm1, 0 pextrb eax, xmm2, 1 pextrb eax, xmm3, 2 pextrb eax, xmm1, 3 pextrb eax, xmm2, 4 pextrb eax, xmm3, 5 pextrb eax, xmm0, 6 pextrb eax, xmm0, 7 pextrb eax, xmm0, 0 pextrb eax, xmm0, 1 pextrb eax, xmm0, 2 pextrb eax, xmm0, 3 pextrb eax, xmm0, 4 pextrb eax, xmm0, 5 pextrb eax, xmm0, 6 pextrb eax, xmm0, 7 pextrb eax, xmm1, 0 pextrb eax, xmm2, 1 pextrb eax, xmm3, 2 pextrb eax, xmm1, 3 pextrb eax, xmm2, 4 pextrb eax, xmm3, 5 pextrb eax, xmm0, 6 pextrb eax, xmm0, 7 pextrb eax, xmm0, 0 pextrb eax, xmm1, 1 pextrb eax, xmm2, 2 pextrb eax, xmm3, 3 pextrb eax, xmm3, 4 pextrb eax, xmm2, 5 pextrb eax, xmm1, 6 pextrb eax, xmm0, 7 pextrb eax, xmm1, 0 pextrb eax, xmm2, 1 pextrb eax, xmm3, 2 pextrb eax, xmm1, 3 pextrb eax, xmm2, 4 pextrb eax, xmm3, 5 pextrb eax, xmm0, 6 pextrb eax, xmm0, 7 pextrb eax, xmm0, 0 pextrb eax, xmm0, 1 pextrb eax, xmm0, 2 pextrb eax, xmm0, 3 pextrb eax, xmm0, 4 pextrb eax, xmm0, 5 pextrb eax, xmm0, 6 pextrb eax, xmm0, 7 dec rdi jnz .L1 ret ;------------------------------------------------------------------------------ ; Name: Vector16ToRegister ; Purpose: Writes 16-bit vector register values into main register. ; Params: rdi = loops ;------------------------------------------------------------------------------ align 64 Vector16ToRegister: _Vector16ToRegister: sal rdi, 2 ; Force some repetition. .L1: pextrw eax, xmm1, 0 ; 64 transfers x 2 bytes = 128 bytes pextrw eax, xmm2, 1 pextrw eax, xmm3, 2 pextrw eax, xmm1, 3 pextrw eax, xmm2, 4 pextrw eax, xmm3, 5 pextrw eax, xmm0, 6 pextrw eax, xmm0, 7 pextrw eax, xmm0, 0 pextrw eax, xmm1, 1 pextrw eax, xmm2, 2 pextrw eax, xmm3, 3 pextrw eax, xmm3, 4 pextrw eax, xmm2, 5 pextrw eax, xmm1, 6 pextrw eax, xmm0, 7 pextrw eax, xmm1, 0 pextrw eax, xmm2, 1 pextrw eax, xmm3, 2 pextrw eax, xmm1, 3 pextrw eax, xmm2, 4 pextrw eax, xmm3, 5 pextrw eax, xmm0, 6 pextrw eax, xmm0, 7 pextrw eax, xmm0, 0 pextrw eax, xmm0, 1 pextrw eax, xmm0, 2 pextrw eax, xmm0, 3 pextrw eax, xmm0, 4 pextrw eax, xmm0, 5 pextrw eax, xmm0, 6 pextrw eax, xmm0, 7 pextrw eax, xmm1, 0 pextrw eax, xmm2, 1 pextrw eax, xmm3, 2 pextrw eax, xmm1, 3 pextrw eax, xmm2, 4 pextrw eax, xmm3, 5 pextrw eax, xmm0, 6 pextrw eax, xmm0, 7 pextrw eax, xmm0, 0 pextrw eax, xmm1, 1 pextrw eax, xmm2, 2 pextrw eax, xmm3, 3 pextrw eax, xmm3, 4 pextrw eax, xmm2, 5 pextrw eax, xmm1, 6 pextrw eax, xmm0, 7 pextrw eax, xmm1, 0 pextrw eax, xmm2, 1 pextrw eax, xmm3, 2 pextrw eax, xmm1, 3 pextrw eax, xmm2, 4 pextrw eax, xmm3, 5 pextrw eax, xmm0, 6 pextrw eax, xmm0, 7 pextrw eax, xmm0, 0 pextrw eax, xmm0, 1 pextrw eax, xmm0, 2 pextrw eax, xmm0, 3 pextrw eax, xmm0, 4 pextrw eax, xmm0, 5 pextrw eax, xmm0, 6 pextrw eax, xmm0, 7 dec rdi jnz .L1 ret ;------------------------------------------------------------------------------ ; Name: Vector32ToRegister ; Purpose: Writes 32-bit vector register values into main register. ; Params: rdi = loops ;------------------------------------------------------------------------------ align 64 Vector32ToRegister: _Vector32ToRegister: add rdi, rdi .L1: pextrd eax, xmm1, 0 ; 64 xfers x 4 bytes = 256 bytes pextrd eax, xmm2, 1 pextrd eax, xmm3, 2 pextrd eax, xmm1, 3 pextrd eax, xmm2, 0 pextrd eax, xmm3, 1 pextrd eax, xmm0, 2 pextrd eax, xmm0, 3 pextrd eax, xmm0, 0 pextrd eax, xmm1, 1 pextrd eax, xmm2, 2 pextrd eax, xmm3, 3 pextrd eax, xmm3, 3 pextrd eax, xmm2, 2 pextrd eax, xmm1, 1 pextrd eax, xmm0, 0 pextrd eax, xmm1, 0 pextrd eax, xmm2, 1 pextrd eax, xmm3, 2 pextrd eax, xmm1, 3 pextrd eax, xmm2, 0 pextrd eax, xmm3, 1 pextrd eax, xmm0, 2 pextrd eax, xmm0, 3 pextrd eax, xmm0, 0 pextrd eax, xmm0, 1 pextrd eax, xmm0, 2 pextrd eax, xmm0, 3 pextrd eax, xmm0, 0 pextrd eax, xmm0, 0 pextrd eax, xmm0, 0 pextrd eax, xmm0, 0 pextrd eax, xmm1, 0 pextrd eax, xmm2, 1 pextrd eax, xmm3, 2 pextrd eax, xmm1, 3 pextrd eax, xmm2, 0 pextrd eax, xmm3, 1 pextrd eax, xmm0, 2 pextrd eax, xmm0, 3 pextrd eax, xmm0, 0 pextrd eax, xmm1, 1 pextrd eax, xmm2, 2 pextrd eax, xmm3, 3 pextrd eax, xmm3, 3 pextrd eax, xmm2, 2 pextrd eax, xmm1, 1 pextrd eax, xmm0, 0 pextrd eax, xmm1, 0 pextrd eax, xmm2, 1 pextrd eax, xmm3, 2 pextrd eax, xmm1, 3 pextrd eax, xmm2, 0 pextrd eax, xmm3, 1 pextrd eax, xmm0, 2 pextrd eax, xmm0, 3 pextrd eax, xmm0, 0 pextrd eax, xmm0, 1 pextrd eax, xmm0, 2 pextrd eax, xmm0, 3 pextrd eax, xmm0, 0 pextrd eax, xmm0, 1 pextrd eax, xmm0, 2 pextrd eax, xmm0, 3 dec rdi jnz .L1 ret ;------------------------------------------------------------------------------ ; Name: Vector64ToRegister ; Purpose: Writes 64-bit vector register values into main register. ; Params: rdi = loops ;------------------------------------------------------------------------------ align 64 Vector64ToRegister: _Vector64ToRegister: add rdi, rdi .L1: pextrq rax, xmm1, 0 ; 32 transfers by 8 bytes = 256 bytes pextrq rax, xmm2, 1 pextrq rax, xmm3, 0 pextrq rax, xmm1, 1 pextrq rax, xmm2, 0 pextrq rax, xmm3, 1 pextrq rax, xmm0, 0 pextrq rax, xmm0, 1 pextrq rax, xmm0, 0 pextrq rax, xmm0, 1 pextrq rax, xmm0, 0 pextrq rax, xmm0, 1 pextrq rax, xmm0, 0 pextrq rax, xmm0, 1 pextrq rax, xmm0, 0 pextrq rax, xmm0, 1 pextrq rax, xmm1, 0 pextrq rax, xmm2, 1 pextrq rax, xmm3, 0 pextrq rax, xmm1, 1 pextrq rax, xmm2, 0 pextrq rax, xmm3, 1 pextrq rax, xmm0, 0 pextrq rax, xmm0, 1 pextrq rax, xmm0, 0 pextrq rax, xmm0, 1 pextrq rax, xmm0, 0 pextrq rax, xmm0, 1 pextrq rax, xmm0, 0 pextrq rax, xmm0, 1 pextrq rax, xmm0, 0 pextrq rax, xmm0, 1 dec rdi jnz .L1 ret ;------------------------------------------------------------------------------ ; Name: CopyAVX ; Purpose: Copies memory chunks that are 32-byte aligned. ; Params: rdi = ptr to destination memory area ; rsi = ptr to source memory area ; rdx = length in bytes ; rcx = loops ;------------------------------------------------------------------------------ align 64 CopyAVX: _CopyAVX: vzeroupper push r10 shr rdx, 8 ; Ensure length is multiple of 256. shl rdx, 8 prefetcht0 [rsi] .L1: mov r10, rdx .L2: vmovdqa ymm0, [rsi] vmovdqa ymm1, [32+rsi] vmovdqa ymm2, [64+rsi] vmovdqa ymm3, [96+rsi] vmovdqa [rdi], ymm0 vmovdqa [32+rdi], ymm1 vmovdqa [64+rdi], ymm2 vmovdqa [96+rdi], ymm3 vmovdqa ymm0, [128+rsi] vmovdqa ymm1, [128+32+rsi] vmovdqa ymm2, [128+64+rsi] vmovdqa ymm3, [128+96+rsi] vmovdqa [128+rdi], ymm0 vmovdqa [128+32+rdi], ymm1 vmovdqa [128+64+rdi], ymm2 vmovdqa [128+96+rdi], ymm3 add rsi, 256 add rdi, 256 sub r10, 256 jnz .L2 sub rsi, rdx ; rsi now points to start. sub rdi, rdx ; rdi now points to start. dec rcx jnz .L1 pop r10 vzeroall ret ;------------------------------------------------------------------------------ ; Name: CopySSE ; Purpose: Copies memory chunks that are 16-byte aligned. ; Params: rdi = ptr to destination memory area ; rsi = ptr to source memory area ; rdx = length in bytes ; rcx = loops ;------------------------------------------------------------------------------ align 64 CopySSE: _CopySSE: push r10 shr rdx, 8 ; Ensure length is multiple of 256. shl rdx, 8 prefetcht0 [rsi] ; Save our non-parameter XMM registers. sub rsp, 192 movdqu [rsp], xmm4 movdqu [16+rsp], xmm5 movdqu [32+rsp], xmm6 movdqu [48+rsp], xmm7 movdqu [64+rsp], xmm8 movdqu [80+rsp], xmm9 movdqu [96+rsp], xmm10 movdqu [112+rsp], xmm11 movdqu [128+rsp], xmm12 movdqu [144+rsp], xmm13 movdqu [160+rsp], xmm14 movdqu [176+rsp], xmm15 .L1: mov r10, rdx .L2: movdqa xmm0, [rsi] movdqa xmm1, [16+rsi] movdqa xmm2, [32+rsi] movdqa xmm3, [48+rsi] movdqa [rdi], xmm0 movdqa [16+rdi], xmm1 movdqa [32+rdi], xmm2 movdqa [48+rdi], xmm3 movdqa xmm4, [64+rsi] movdqa xmm5, [80+rsi] movdqa xmm6, [96+rsi] movdqa xmm7, [112+rsi] movdqa [64+rdi], xmm4 movdqa [80+rdi], xmm5 movdqa [96+rdi], xmm6 movdqa [112+rdi], xmm7 movdqa xmm8, [128+rsi] movdqa xmm9, [144+rsi] movdqa xmm10, [160+rsi] movdqa xmm11, [176+rsi] movdqa [128+rdi], xmm8 movdqa [144+rdi], xmm9 movdqa [160+rdi], xmm10 movdqa [176+rdi], xmm11 movdqa xmm12, [192+rsi] movdqa xmm13, [208+rsi] movdqa xmm14, [224+rsi] movdqa xmm15, [240+rsi] movdqa [192+rdi], xmm12 movdqa [208+rdi], xmm13 movdqa [224+rdi], xmm14 movdqa [240+rdi], xmm15 add rsi, 256 add rdi, 256 sub r10, 256 jnz .L2 sub rsi, rdx ; rsi now points to start. sub rdi, rdx ; rdi now points to start. dec rcx jnz .L1 movdqu xmm4, [rsp] movdqu xmm5, [16+rsp] movdqu xmm6, [32+rsp] movdqu xmm7, [48+rsp] movdqu xmm8, [64+rsp] movdqu xmm9, [80+rsp] movdqu xmm10, [96+rsp] movdqu xmm11, [112+rsp] movdqu xmm12, [128+rsp] movdqu xmm13, [144+rsp] movdqu xmm14, [160+rsp] movdqu xmm15, [176+rsp] add rsp, 192 pop r10 ret ;------------------------------------------------------------------------------ ; Name: CopySSE_128bytes ; Purpose: Copies memory chunks that are 16-byte aligned. ; Params: rdi = ptr to destination memory area ; rsi = ptr to source memory area ; rdx = length in bytes ; rcx = loops ;------------------------------------------------------------------------------ align 64 CopySSE_128bytes: _CopySSE_128bytes: push r10 shr rdx, 7 ; Ensure length is multiple of 128. shl rdx, 7 prefetcht0 [rsi] ; Save our non-parameter XMM registers. sub rsp, 64 movdqu [rsp], xmm4 movdqu [16+rsp], xmm5 movdqu [32+rsp], xmm6 movdqu [48+rsp], xmm7 .L1: mov r10, rdx .L2: movdqa xmm0, [rsi] movdqa xmm1, [16+rsi] movdqa xmm2, [32+rsi] movdqa xmm3, [48+rsi] movdqa [rdi], xmm0 movdqa [16+rdi], xmm1 movdqa [32+rdi], xmm2 movdqa [48+rdi], xmm3 movdqa xmm4, [64+rsi] movdqa xmm5, [80+rsi] movdqa xmm6, [96+rsi] movdqa xmm7, [112+rsi] movdqa [64+rdi], xmm4 movdqa [80+rdi], xmm5 movdqa [96+rdi], xmm6 movdqa [112+rdi], xmm7 add rsi, 128 add rdi, 128 sub r10, 128 jnz .L2 sub rsi, rdx ; rsi now points to start. sub rdi, rdx ; rdi now points to start. dec rcx jnz .L1 movdqu xmm4, [rsp] movdqu xmm5, [16+rsp] movdqu xmm6, [32+rsp] movdqu xmm7, [48+rsp] add rsp, 64 pop r10 ret ;------------------------------------------------------------------------------ ; Name: IncrementRegisters ; Purpose: Increments 64-bit values in registers. ; Params: rdi = loops ;------------------------------------------------------------------------------ align 64 IncrementRegisters: _IncrementRegisters: .L1: inc rax inc rbx inc rcx inc rdx inc rsi inc rdi inc rbp inc rsp inc r8 inc r9 inc r10 inc r11 inc r12 inc r13 inc r14 inc r15 dec rax dec rbx dec rcx dec rdx dec rsi dec rdi dec rbp dec rsp dec r8 dec r9 dec r10 dec r11 dec r12 dec r13 dec r14 dec r15 dec rdi jnz .L1 ret ;------------------------------------------------------------------------------ ; Name: IncrementStack ; Purpose: Increments 64-bit values on stack. ; Params: rdi = loops ;------------------------------------------------------------------------------ align 64 IncrementStack: _IncrementStack: sub rsp, 128 .L1: inc qword [rsp] inc qword [rsp+8] inc qword [rsp+16] inc qword [rsp+24] inc qword [rsp+32] inc qword [rsp+40] inc qword [rsp+48] inc qword [rsp+56] inc qword [rsp+64] inc qword [rsp+72] inc qword [rsp+80] inc qword [rsp+88] inc qword [rsp+96] inc qword [rsp+104] inc qword [rsp+112] inc qword [rsp+120] dec qword [rsp] dec qword [rsp+8] dec qword [rsp+16] dec qword [rsp+24] dec qword [rsp+32] dec qword [rsp+40] dec qword [rsp+48] dec qword [rsp+56] dec qword [rsp+64] dec qword [rsp+72] dec qword [rsp+80] dec qword [rsp+88] dec qword [rsp+96] dec qword [rsp+104] dec qword [rsp+112] dec qword [rsp+120] dec rdi jnz .L1 add rsp, 128 ret CPU-X-5.0.3/src/core.cpp000066400000000000000000002507641454622605200146220ustar00rootroot00000000000000/**************************************************************************** * Copyright © 2014-2024 The Tumultuous Unicorn Of Darkness * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * ****************************************************************************/ /* * PROJECT CPU-X * FILE core.cpp */ #include #include #include #include #include #include #include #include #include #include #include #include "options.hpp" #include "util.hpp" #include "data.hpp" #include "core.hpp" #include "daemon.h" #ifndef __linux__ # include # include # include #endif #if HAS_LIBCPUID # include # include "databases.h" #endif #if HAS_DMIDECODE # include "dmidecode/libdmidecode.h" #endif #if HAS_BANDWIDTH # include "bandwidth/libbandwidth.h" #endif #if HAS_LIBPCI extern "C" { # include } #endif #if HAS_LIBPROC2 # include # include #endif #if HAS_LIBPROCPS # include #endif #if HAS_LIBSTATGRAB # include #endif #if HAS_LIBGLFW # include # include #endif #if HAS_Vulkan # include #endif #if HAS_OpenCL # define CL_TARGET_OPENCL_VERSION 120 # include # include "opencl_ext.h" #endif namespace fs = std::filesystem; using GpuDrv = Data::Graphics::Card::GpuDrv; extern bool __sigabrt_received; /************************* Private functions *************************/ /* Avoid to re-run a function if an error was occurred in previous call */ static int err_func(int (*func)(Data &), Data &data) { static std::unordered_map registered; MSG_DEBUG("err_func: func=%p ==> ret=%i", func, registered[func]); if(registered[func] == 0) registered[func] = func(data); return registered[func]; } #if HAS_LIBCPUID /* MSRs static values provided by libcpuid */ static int call_libcpuid_msr_debug(Data &data, uint16_t all_cpu_count) { const DaemonCommand cmd = LIBCPUID_MSR_DEBUG; SEND_DATA(&data.socket_fd, &cmd, sizeof(DaemonCommand)); SEND_DATA(&data.socket_fd, &all_cpu_count, sizeof(uint16_t)); return 0; } #define RETURN_OR_EXIT(e) { if(Options::get_debug_database()) exit(e); else return e; } /* Get CPU technology node */ static int cpu_technology(Data::Cpu::CpuType::Processor &processor, cpu_id_t *cpu_id) { int i = -1; const Technology_DB *db; if(cpu_id->vendor < 0 || cpu_id->model < 0 || cpu_id->ext_model < 0 || cpu_id->ext_family < 0) RETURN_OR_EXIT(1); MSG_VERBOSE("%s", _("Finding CPU technology")); switch(cpu_id->vendor) { case VENDOR_AMD: db = technology_amd; break; case VENDOR_INTEL: db = technology_intel; break; default: db = technology_unknown; break; } MSG_DEBUG("cpu_technology: model %3i, ext. model %3i, ext. family %3i => values to find", cpu_id->model, cpu_id->ext_model, cpu_id->ext_family); while(db[++i].cpu_model != -2) { if(((db[i].cpu_model < 0) || (db[i].cpu_model == cpu_id->model)) && ((db[i].cpu_ext_model < 0) || (db[i].cpu_ext_model == cpu_id->ext_model)) && ((db[i].cpu_ext_family < 0) || (db[i].cpu_ext_family == cpu_id->ext_family))) { processor.technology.value = db[i].process; MSG_DEBUG("cpu_technology: model %3i, ext. model %3i, ext. family %3i => entry #%03i matches", db[i].cpu_model, db[i].cpu_ext_model, db[i].cpu_ext_family, i); RETURN_OR_EXIT(0); } else MSG_DEBUG("cpu_technology: model %3i, ext. model %3i, ext. family %3i => entry #%03i does not match", db[i].cpu_model, db[i].cpu_ext_model, db[i].cpu_ext_family, i); } MSG_WARNING(_("Your CPU is not present in the database ==> %s, model: %i, ext. model: %i, ext. family: %i"), processor.specification.value.c_str(), cpu_id->model, cpu_id->ext_model, cpu_id->ext_family); RETURN_OR_EXIT(2); } #undef RETURN_OR_EXIT /* Static elements provided by libcpuid */ static int call_libcpuid_static(Data &data) { int err = 0; uint16_t core_id_offset = 0; const char *cpu_purpose = NULL; struct cpu_id_t *cpu_id = NULL; struct cpu_raw_data_array_t raw_data; struct system_id_t system_id; const std::unordered_map cpuvendors = { { VENDOR_INTEL, "Intel" }, { VENDOR_AMD, "AMD" }, { VENDOR_CYRIX, "Cyrix" }, { VENDOR_NEXGEN, "NexGen" }, { VENDOR_TRANSMETA, "Transmeta" }, { VENDOR_UMC, "UMC" }, { VENDOR_CENTAUR, "Centaur" }, { VENDOR_RISE, "Rise" }, { VENDOR_SIS, "SiS" }, { VENDOR_NSC, "National Semiconductor" }, { VENDOR_UNKNOWN, _("unknown") } }; const struct { const cpu_feature_t flag; const char *str; } cpu_flags[] = { /* SIMD x86 */ { CPU_FEATURE_MMX, "MMX" }, { CPU_FEATURE_MMXEXT, "(+)" }, { CPU_FEATURE_3DNOW, "3DNOW!" }, { CPU_FEATURE_3DNOWEXT, "(+)" }, { CPU_FEATURE_SSE, "SSE(1" }, { CPU_FEATURE_SSE2, "2" }, { CPU_FEATURE_PNI, "3" }, { CPU_FEATURE_SSSE3, "3S" }, { CPU_FEATURE_SSE4_1, "4.1" }, { CPU_FEATURE_SSE4_2, "4.2" }, { CPU_FEATURE_SSE4A, "4A" }, { CPU_FEATURE_SSE, ")" }, { CPU_FEATURE_XOP, "XOP" }, { CPU_FEATURE_AVX, "AVX(1" }, { CPU_FEATURE_AVX2, "2" }, { CPU_FEATURE_AVX512F, "512" }, { CPU_FEATURE_AVX, ")" }, { CPU_FEATURE_FMA3, "FMA(3" }, { CPU_FEATURE_FMA4, "4" }, { CPU_FEATURE_FMA3, ")" }, /* Security and Cryptography */ { CPU_FEATURE_AES, "AES" }, { CPU_FEATURE_PCLMUL, "CLMUL" }, { CPU_FEATURE_RDRAND, "RdRand" }, { CPU_FEATURE_SHA_NI, "SHA" }, { CPU_FEATURE_SGX, "SGX" }, /* Virtualization */ { CPU_FEATURE_VMX, "VT-x" }, { CPU_FEATURE_SVM, "AMD-V" }, /* Other */ { CPU_FEATURE_LM, "x86-64" }, { NUM_CPU_FEATURES, NULL } }; /* Call libcpuid */ MSG_VERBOSE("%s", _("Calling libcpuid for retrieving static data")); if(Options::get_issue()) cpuid_set_verbosiness_level(2); if(data.cpu.cpuid_raw_file == NULL) err = cpuid_get_all_raw_data(&raw_data); else err = cpuid_deserialize_all_raw_data(&raw_data, data.cpu.cpuid_raw_file); if(Options::get_issue()) { cpuid_serialize_all_raw_data(&raw_data, ""); if(DAEMON_UP) call_libcpuid_msr_debug(data, raw_data.num_raw); } if(err || cpu_identify_all(&raw_data, &system_id)) { MSG_ERROR(_("failed to call libcpuid (%s)"), cpuid_error()); return 1; } cpuid_free_raw_data_array(&raw_data); /* Basically fill CPU tab */ for(uint8_t cpu_type = 0; cpu_type < system_id.num_cpu_types; cpu_type++) { cpu_id = &system_id.cpu_types[cpu_type]; cpu_purpose = cpu_purpose_str(cpu_id->purpose); data.cpu.grow_cpu_types_vector(cpu_type, cpu_purpose); data.caches.grow_cpu_types_vector(cpu_type, cpu_purpose); /* Trivial assignments */ data.cpu.vendor = cpu_id->vendor; data.cpu.ext_family = cpu_id->ext_family; data.cpu.cpu_types[cpu_type].purpose = cpu_id->purpose; data.cpu.cpu_types[cpu_type].processor.vendor.value = cpuvendors.at(cpu_id->vendor); data.cpu.cpu_types[cpu_type].processor.codename.value = cpu_id->cpu_codename; data.cpu.cpu_types[cpu_type].processor.specification.value = cpu_id->brand_str; data.cpu.cpu_types[cpu_type].processor.family.value = Data::Cpu::CpuType::Processor::format_cpuid_value(cpu_id->family); data.cpu.cpu_types[cpu_type].processor.dispfamily.value = Data::Cpu::CpuType::Processor::format_cpuid_value(cpu_id->ext_family); data.cpu.cpu_types[cpu_type].processor.model.value = Data::Cpu::CpuType::Processor::format_cpuid_value(cpu_id->model); data.cpu.cpu_types[cpu_type].processor.dispmodel.value = Data::Cpu::CpuType::Processor::format_cpuid_value(cpu_id->ext_model); data.cpu.cpu_types[cpu_type].processor.stepping.value = std::to_string(cpu_id->stepping); data.cpu.cpu_types[cpu_type].footer.cores.value = std::to_string(cpu_id->num_cores); data.cpu.cpu_types[cpu_type].footer.threads.value = std::to_string(cpu_id->num_logical_cpus); data.cpu.cpu_types[cpu_type].footer.num_threads = cpu_id->num_logical_cpus; string_trim(data.cpu.cpu_types[cpu_type].processor.specification.value); /* Add core offset */ data.cpu.cpu_types[cpu_type].footer.core_id_offset = core_id_offset; core_id_offset = cpu_id->num_logical_cpus; /* Search in DB for CPU technology (depends on CPU vendor) */ err += cpu_technology(data.cpu.cpu_types[cpu_type].processor, cpu_id); /* Cache level 1 (instruction) */ if(cpu_id->l1_instruction_cache > 0) data.cpu.cpu_types[cpu_type].caches.level1i.value = Data::Cpu::CpuType::Caches::format_cache_level(cpu_id->l1_instruction_instances, cpu_id->l1_instruction_cache, UNIT_KB, cpu_id->l1_instruction_assoc); /* Cache level 1 (data) */ if(cpu_id->l1_data_cache > 0) { data.cpu.cpu_types[cpu_type].caches.level1d.value = Data::Cpu::CpuType::Caches::format_cache_level(cpu_id->l1_data_instances, cpu_id->l1_data_cache, UNIT_KB, cpu_id->l1_data_assoc); data.caches.cpu_types[cpu_type].grow_caches_vector_with_cache_size(1, cpu_id->l1_data_cache, data.cpu.cpu_types[cpu_type].caches.level1d.value.c_str(), cpu_id->l1_data_cacheline, UNIT_B); } /* Cache level 2 */ if(cpu_id->l2_cache > 0) { data.cpu.cpu_types[cpu_type].caches.level2.value = Data::Cpu::CpuType::Caches::format_cache_level(cpu_id->l2_instances, cpu_id->l2_cache, UNIT_KB, cpu_id->l2_assoc); data.caches.cpu_types[cpu_type].grow_caches_vector_with_cache_size(2, cpu_id->l2_cache, data.cpu.cpu_types[cpu_type].caches.level2.value.c_str(), cpu_id->l2_cacheline, UNIT_B); } /* Cache level 3 */ if(cpu_id->l3_cache > 0) { data.cpu.cpu_types[cpu_type].caches.level3.value = Data::Cpu::CpuType::Caches::format_cache_level(cpu_id->l3_instances, cpu_id->l3_cache >> 10, UNIT_MB, cpu_id->l3_assoc); data.caches.cpu_types[cpu_type].grow_caches_vector_with_cache_size(3, cpu_id->l3_cache, data.cpu.cpu_types[cpu_type].caches.level3.value.c_str(), cpu_id->l3_cacheline, UNIT_B); } /* Cache level 4 */ if(cpu_id->l4_cache > 0) { std::string l4size_str = Data::Cpu::CpuType::Caches::format_cache_level(cpu_id->l4_instances, cpu_id->l4_cache >> 10, UNIT_MB, cpu_id->l4_assoc); data.caches.cpu_types[cpu_type].grow_caches_vector_with_cache_size(4, cpu_id->l4_cache, l4size_str.c_str(), cpu_id->l4_cacheline, UNIT_B); } /* Add string "HT" in CPU Intructions label (if enabled) */ if(cpu_id->num_cores < cpu_id->num_logical_cpus) data.cpu.cpu_types[cpu_type].processor.instructions.value = (cpu_id->vendor == VENDOR_INTEL) ? "HT" : "SMT"; /* Fill CPU Intructions label */ for(uint16_t i = 0; cpu_flags[i].flag != NUM_CPU_FEATURES; i++) { if(!cpu_id->flags[cpu_flags[i].flag]) continue; if((data.cpu.cpu_types[cpu_type].processor.instructions.value.length() > 0) && (cpu_flags[i].str[0] != '(') && (cpu_flags[i].str[0] != ')')) data.cpu.cpu_types[cpu_type].processor.instructions.value += ", "; data.cpu.cpu_types[cpu_type].processor.instructions.value += cpu_flags[i].str; } } Options::set_selected_type(Options::get_selected_type(), system_id.num_cpu_types); Options::set_selected_core(Options::get_selected_core(), data.cpu.get_selected_cpu_type().footer.num_threads); cpuid_free_system_id(&system_id); return err; } /* Dynamic elements provided by libcpuid */ static int call_libcpuid_dynamic(Data &data) { /* CPU frequency */ MSG_VERBOSE("%s", _("Calling libcpuid for retrieving dynamic data")); data.cpu.clocks.set_cpu_freq(cpu_clock()); return (data.cpu.clocks.cpu_freq <= 0); } /* MSRs static values provided by libcpuid */ static int call_libcpuid_msr_static(Data &data) { const DaemonCommand cmd = LIBCPUID_MSR_STATIC; const uint16_t current_core_id = data.cpu.get_selected_core_id(); MsrStaticData msg; MSG_VERBOSE("%s", _("Calling libcpuid for retrieving CPU MSR static values")); SEND_DATA(&data.socket_fd, &cmd, sizeof(DaemonCommand)); SEND_DATA(&data.socket_fd, ¤t_core_id, sizeof(current_core_id)); RECEIVE_DATA(&data.socket_fd, &msg, sizeof(MsrStaticData)); /* CPU Multipliers (minimum & maximum) */ if((msg.min_mult != CPU_INVALID_VALUE) && (msg.max_mult != CPU_INVALID_VALUE)) { data.cpu.clocks.cpu_min_mult = double(msg.min_mult) / 100.0; data.cpu.clocks.cpu_max_mult = double(msg.max_mult) / 100.0; } /* Base clock */ if((msg.bclk != CPU_INVALID_VALUE) && (data.cpu.clocks.bus_freq == 0.0)) data.cpu.clocks.set_bus_freq(double(msg.bclk) / 100.0); return 0; } /* MSRs dynamic values provided by libcpuid */ static int call_libcpuid_msr_dynamic(Data &data) { auto& cpu_type = data.cpu.get_selected_cpu_type(); const uint16_t current_core_id = data.cpu.get_selected_core_id(); const DaemonCommand cmd = LIBCPUID_MSR_DYNAMIC; MsrDynamicData msg; MSG_VERBOSE("%s", _("Calling libcpuid for retrieving CPU MSR dynamic values")); SEND_DATA(&data.socket_fd, &cmd, sizeof(DaemonCommand)); SEND_DATA(&data.socket_fd, ¤t_core_id, sizeof(current_core_id)); RECEIVE_DATA(&data.socket_fd, &msg, sizeof(MsrDynamicData)); /* CPU Voltage */ if(msg.voltage != CPU_INVALID_VALUE) cpu_type.processor.voltage.value = string_format("%.3f V", double(msg.voltage) / 100.0); /* CPU Temperature */ if(msg.temp != CPU_INVALID_VALUE) cpu_type.processor.temperature.value = string_with_temperature_unit(double(msg.temp)); return 0; } #endif /* HAS_LIBCPUID */ #if HAS_DMIDECODE /* Call Dmidecode through CPU-X but do nothing else */ int run_dmidecode(void) { return dmidecode(Logger::get_verbosity() > LOG_VERBOSE, NULL); } /* Elements provided by dmidecode */ static int call_dmidecode(Data &data) { const DaemonCommand cmd = DMIDECODE; DmidecodeData msg; DmidecodeMemoryData msg_memory; bool need_sep = false; MSG_VERBOSE("%s", _("Calling dmidecode")); SEND_DATA(&data.socket_fd, &cmd, sizeof(DaemonCommand)); RECEIVE_DATA(&data.socket_fd, &msg.ret, sizeof(int)); if(msg.ret) return 1; /* Tab CPU */ RECEIVE_DATA(&data.socket_fd, &msg.processor, sizeof(DmidecodeCPUData)); for(auto& cpu_type : data.cpu.cpu_types) cpu_type.processor.package.value = msg.processor.cpu_package; if(data.cpu.clocks.bus_freq == 0.0) data.cpu.clocks.set_bus_freq(double(msg.processor.bus_freq)); /* Tab Motherboard */ RECEIVE_DATA(&data.socket_fd, &msg.mb, sizeof(DmidecodeMBData)); data.motherboard.board.manufacturer.value = msg.mb.manufacturer; data.motherboard.board.model.value = msg.mb.model; data.motherboard.board.revision.value = msg.mb.revision; RECEIVE_DATA(&data.socket_fd, &msg.bios, sizeof(DmidecodeBiosData)); data.motherboard.bios.brand.value = msg.bios.brand; data.motherboard.bios.version.value = msg.bios.version; data.motherboard.bios.date.value = msg.bios.date; data.motherboard.bios.romsize.value = string_set_size_unit(msg.bios.romsize); /* Tab RAM */ RECEIVE_DATA(&data.socket_fd, &msg.stick_count, sizeof(uint8_t)); for(uint8_t i = 0; i < msg.stick_count; i++) { RECEIVE_DATA(&data.socket_fd, &msg_memory, sizeof(DmidecodeMemoryData)); data.memory.grow_sticks_vector(); data.memory.sticks[i].manufacturer.value = msg_memory.manufacturer; data.memory.sticks[i].part_number.value = msg_memory.part_number; data.memory.sticks[i].type.value = msg_memory.type; data.memory.sticks[i].type_detail.value = msg_memory.type_detail; data.memory.sticks[i].device_locator.value = msg_memory.device_locator; data.memory.sticks[i].bank_locator.value = msg_memory.bank_locator; data.memory.sticks[i].size.value = string_set_size_unit(msg_memory.size); data.memory.sticks[i].rank.value = msg_memory.rank; need_sep = false; if(std::strlen(msg_memory.speed_configured) > 0) { data.memory.sticks[i].speed.value = string_format(_("%s (configured)"), msg_memory.speed_configured); need_sep = true; } if(std::strlen(msg_memory.speed_maximum) > 0) { if(need_sep) data.memory.sticks[i].speed.value += " / "; data.memory.sticks[i].speed.value += string_format(_("%s (max)"), msg_memory.speed_maximum); } need_sep = false; if(std::strlen(msg_memory.voltage_minimum) > 0) { data.memory.sticks[i].voltage.value = string_format(_("%s (min)"), msg_memory.voltage_minimum); need_sep = true; } if(std::strlen(msg_memory.voltage_configured) > 0) { if(need_sep) data.memory.sticks[i].voltage.value += " / "; data.memory.sticks[i].voltage.value += string_format(_("%s (configured)"), msg_memory.voltage_configured); need_sep = true; } if(std::strlen(msg_memory.voltage_maximum) > 0) { if(need_sep) data.memory.sticks[i].voltage.value += " / "; data.memory.sticks[i].voltage.value += string_format(_("%s (max)"), msg_memory.voltage_maximum); } } return 0; } #endif /* HAS_DMIDECODE */ /* Calculate total CPU usage */ #define BEFORE data.cpu.clocks.cpu_time_stat static int cpu_usage(Data &data) { double loadavg; enum StatType { USER, NICE, SYSTEM, INTR, IDLE, LASTSTAT }; std::vector after(LASTSTAT); MSG_VERBOSE("%s", _("Calculating CPU usage")); BEFORE.resize(LASTSTAT); #ifdef __linux__ FILE *fp; if((fp = fopen("/proc/stat","r")) == NULL) return 1; fscanf(fp,"%*s %li %li %li %li %*s %*s %*s %*s %*s %*s", &after[USER], &after[NICE], &after[SYSTEM], &after[IDLE]); fclose(fp); #else /* __linux__ */ size_t len = sizeof(long) * after.size(); if(sysctlbyname("kern.cp_time", after.data(), &len, NULL, 0)) return 1; #endif /* __linux__ */ loadavg = double((after[USER] + after[NICE] + after[SYSTEM] + after[INTR]) - (BEFORE[USER] + BEFORE[NICE] + BEFORE[SYSTEM] + BEFORE[INTR])) / double((after[USER] + after[NICE] + after[SYSTEM] + after[INTR] + after[IDLE]) - (BEFORE[USER] + BEFORE[NICE] + BEFORE[SYSTEM] + BEFORE[INTR] + BEFORE[IDLE])); data.cpu.clocks.usage.value = string_format("%6.2f %%", loadavg * 100); BEFORE.swap(after); return 0; } #undef BEFORE #if HAS_BANDWIDTH /* Call Bandwidth through CPU-X but do nothing else */ int run_bandwidth(void) { const char *argv[] = { NULL, "--fastest", NULL }; return bandwidth_main(2, argv); } /* Compute CPU cache speed */ static int call_bandwidth([[maybe_unused]] Data &data) { int err = 0; #if HAS_LIBCPUID static bool first = true; static struct BandwidthData bwd{}; if(data.caches.get_selected_cpu_type().caches.size() == 0) return 1; for(std::size_t i = 0; i < data.caches.get_selected_cpu_type().caches.size(); i++) bwd.cache_size[i] = data.caches.get_selected_cpu_type().caches[i].size_i; MSG_VERBOSE("%s", _("Calling bandwidth")); if(first) { /* Init BandwidthData */ bwd.is_amd_cpu = (data.cpu.vendor == VENDOR_AMD), bwd.selected_test = Options::get_selected_test(), bwd.test_name = NULL, pthread_mutex_init(&bwd.mutex, NULL); /* Call bandwidth */ err = bandwidth_cpux(&bwd); first = false; /* Copy test names */ for(uint8_t i = 0; i < BANDWIDTH_LAST_TEST; i++) { data.caches.test.names.push_back(bwd.test_name[i]); free(bwd.test_name[i]); } free(bwd.test_name); } else { /* Run bandwidth in a separated thread if not running */ if(pthread_mutex_trylock(&bwd.mutex) != EBUSY) { pthread_mutex_unlock(&bwd.mutex); std::thread bwt(bandwidth_cpux, &bwd); MSG_DEBUG("%s", "call_bandwidth: created new thread"); bwt.detach(); } else MSG_DEBUG("%s", "call_bandwidth: a previous thread is still running"); } /* Speed labels */ for(std::size_t i = 0; i < data.caches.get_selected_cpu_type().caches.size(); i++) data.caches.get_selected_cpu_type().caches[i].speed.value = string_format("%.2f %s/s", double(bwd.cache_speed[i]) / 10.0, UNIT_MB); #endif /* HAS_LIBCPUID */ return err; } #endif /* HAS_BANDWIDTH */ #if HAS_LIBPCI /* Check is GPU is enabled */ static bool gpu_is_on([[maybe_unused]] std::string device_path) { bool ret = true; #ifdef __linux__ ret = std::filesystem::is_directory(device_path); #endif /* __linux__ */ MSG_DEBUG("gpu_is_on: ret=%s", ret ? "true" : "false"); return ret; } /* Find driver name for a device */ static std::string get_gpu_device_path(struct pci_dev *dev) { int err = -1; std::string device_path; #ifdef __linux__ /* Adapted from http://git.kernel.org/cgit/utils/pciutils/pciutils.git/tree/ls-kernel.c */ char *base = NULL; if(dev->access == NULL) { MSG_ERROR(_("pci_access is not properly initialized: it is a common issue when %s was built with a lower libpci version.\n" "Check that libpci %s library is present on your system. Otherwise, please rebuild %s."), PRGNAME, LIBPCI_VERSION, PRGNAME); return std::string(); } if(dev->access->method != PCI_ACCESS_SYS_BUS_PCI) { MSG_ERROR("dev->access->method=%u", dev->access->method); return std::string(); } if((base = pci_get_param(dev->access, const_cast("sysfs.path"))) == NULL) { MSG_ERROR("%s", "pci_get_param (sysfs.path)"); return std::string(); } device_path = string_format("%s/devices/%04x:%02x:%02x.%d", base, dev->domain, dev->bus, dev->dev, dev->func); err = !fs::is_directory(device_path); #else /* __linux__ */ err = popen_to_str(device_path, "sysctl hw.dri | grep busid | grep %04x:%02x:%02x.%d | cut -d. -f1-3", dev->domain, dev->bus, dev->dev, dev->func); #endif /* __linux__ */ MSG_DEBUG("find_gpu_device_path: ret=%s", device_path.c_str()); return (err == 0) ? device_path : std::string(); } static int set_gpu_kernel_driver(Data::Graphics::Card &card) { std::string cmd; std::unordered_map gpu_drivers = { { "fglrx", GpuDrv::GPUDRV_FGLRX }, { "radeon", GpuDrv::GPUDRV_RADEON }, { "amdgpu", GpuDrv::GPUDRV_AMDGPU }, { "i915", GpuDrv::GPUDRV_INTEL }, { "nvidia", GpuDrv::GPUDRV_NVIDIA }, { "nouveau", GpuDrv::GPUDRV_NOUVEAU }, { "vfio-pci", GpuDrv::GPUDRV_VFIO }, }; /* Check GPU state */ if(!gpu_is_on(card.device_path)) { MSG_WARNING(_("No kernel driver in use for graphic card at path %s"), card.device_path.c_str()); return 1; } #ifdef __linux__ fs::path driver_path; std::error_code fs_code; driver_path = fs::read_symlink(fs::path(card.device_path) / "driver", fs_code); if(fs_code) { MSG_ERROR("set_gpu_kernel_driver(%s): read_symlink: value=%i message=%s", card.device_path.c_str(), fs_code.value(), fs_code.message().c_str()); return 1; } card.kernel_driver.value = driver_path.filename(); #else /* __linux__ */ size_t len = MAXSTR; char driver_name[MAXSTR] = ""; const std::string sysctl_name = card.device_path + ".name"; if(sysctlbyname(sysctl_name.c_str(), driver_name, &len, NULL, 0) != 0) { MSG_ERRNO("set_gpu_kernel_driver(%s): sysctlbyname: sysctl_name=%s", card.device_path.c_str(), sysctl_name.c_str()); return 1; } card.kernel_driver.value = driver_name; card.kernel_driver.value.erase(0, card.kernel_driver.value.find(" ") + 1); #endif /* __linux__ */ /* Find GPU driver in gpu_drivers */ auto it = std::find_if(gpu_drivers.begin(), gpu_drivers.end(), [card](const std::pair gpu_driver) { return (gpu_driver.first.find(card.kernel_driver.value) != std::string::npos); }); if(it == gpu_drivers.end()) { MSG_WARNING(_("Your GPU kernel driver is unknown: %s"), card.kernel_driver.value.c_str()); return 1; } card.driver = it->second; MSG_DEBUG("set_gpu_kernel_driver: driver '%s' is index %i", card.kernel_driver.value.c_str(), card.driver); /* Check for discrete GPU */ switch(card.driver) { case GpuDrv::GPUDRV_NVIDIA: if(command_exists("optirun") && !popen_to_str(cmd, "optirun --status") && (cmd.find("Bumblebee status: Ready") != std::string::npos)) card.driver = GpuDrv::GPUDRV_NVIDIA_BUMBLEBEE; break; case GpuDrv::GPUDRV_NOUVEAU: if(command_exists("optirun") && !popen_to_str(cmd, "optirun --status") && (cmd.find("Bumblebee status: Ready") != std::string::npos)) card.driver = GpuDrv::GPUDRV_NOUVEAU_BUMBLEBEE; break; default: break; } return 0; } static int set_gpu_user_mode_driver([[maybe_unused]] Data::Graphics::Card &card) { int err = 0; #if HAS_LIBGLFW const char *description; size_t umd_index = std::string::npos; std::string gl_ver, glsl_ver; GLFWwindow *win = NULL; if(glfwInit() == GLFW_FALSE) { err = glfwGetError(&description); goto clean; } glfwWindowHint(GLFW_VISIBLE, GLFW_FALSE); if((err = glfwGetError(&description)) != GLFW_NO_ERROR) goto clean; win = glfwCreateWindow(640, 480, "", NULL, NULL); if((err = glfwGetError(&description)) != GLFW_NO_ERROR) goto clean; glfwMakeContextCurrent(win); if((err = glfwGetError(&description)) != GLFW_NO_ERROR) goto clean; gl_ver = reinterpret_cast(glGetString(GL_VERSION)); glsl_ver = reinterpret_cast(glGetString(GL_SHADING_LANGUAGE_VERSION)); if(gl_ver.empty() || glsl_ver.empty()) { err = glGetError() != GL_NO_ERROR ? static_cast(glGetError()) : -1; description = "glGetString"; goto clean; } switch(card.driver) { case GpuDrv::GPUDRV_AMDGPU: case GpuDrv::GPUDRV_INTEL: case GpuDrv::GPUDRV_RADEON: case GpuDrv::GPUDRV_NOUVEAU: case GpuDrv::GPUDRV_NOUVEAU_BUMBLEBEE: umd_index = gl_ver.find("Mesa"); break; case GpuDrv::GPUDRV_NVIDIA: umd_index = gl_ver.find("NVIDIA"); break; default: break; } if(umd_index != std::string::npos) { card.user_mode_driver.value = gl_ver.substr(umd_index); card.opengl_version.value = glsl_ver; } else MSG_WARNING(_("Your GPU user mode driver is unknown for vendor %s: %s"), reinterpret_cast(glGetString(GL_VENDOR)), gl_ver.c_str()); clean: if(err) MSG_ERROR(_("failed to call GLFW (%i): %s"), err, description); if(win != NULL) glfwDestroyWindow(win); #endif /* HAS_LIBGLFW */ return err; } #if HAS_Vulkan static inline const char* string_VkResult(VkResult input_value) { switch(input_value) { /*case VK_ERROR_COMPRESSION_EXHAUSTED_EXT: return "VK_ERROR_COMPRESSION_EXHAUSTED_EXT";*/ case VK_ERROR_DEVICE_LOST: return "VK_ERROR_DEVICE_LOST"; case VK_ERROR_EXTENSION_NOT_PRESENT: return "VK_ERROR_EXTENSION_NOT_PRESENT"; case VK_ERROR_FEATURE_NOT_PRESENT: return "VK_ERROR_FEATURE_NOT_PRESENT"; case VK_ERROR_FORMAT_NOT_SUPPORTED: return "VK_ERROR_FORMAT_NOT_SUPPORTED"; #if (VK_HEADER_VERSION >150) case VK_ERROR_FRAGMENTATION: return "VK_ERROR_FRAGMENTATION"; case VK_ERROR_FULL_SCREEN_EXCLUSIVE_MODE_LOST_EXT: return "VK_ERROR_FULL_SCREEN_EXCLUSIVE_MODE_LOST_EXT"; case VK_ERROR_INVALID_OPAQUE_CAPTURE_ADDRESS: return "VK_ERROR_INVALID_OPAQUE_CAPTURE_ADDRESS"; case VK_ERROR_UNKNOWN: return "VK_ERROR_UNKNOWN"; #endif case VK_ERROR_FRAGMENTED_POOL: return "VK_ERROR_FRAGMENTED_POOL"; #ifdef VK_ENABLE_BETA_EXTENSIONS case VK_ERROR_IMAGE_USAGE_NOT_SUPPORTED_KHR: return "VK_ERROR_IMAGE_USAGE_NOT_SUPPORTED_KHR"; #endif /* VK_ENABLE_BETA_EXTENSIONS */ case VK_ERROR_INCOMPATIBLE_DISPLAY_KHR: return "VK_ERROR_INCOMPATIBLE_DISPLAY_KHR"; case VK_ERROR_INCOMPATIBLE_DRIVER: return "VK_ERROR_INCOMPATIBLE_DRIVER"; case VK_ERROR_INITIALIZATION_FAILED: return "VK_ERROR_INITIALIZATION_FAILED"; case VK_ERROR_INVALID_DRM_FORMAT_MODIFIER_PLANE_LAYOUT_EXT: return "VK_ERROR_INVALID_DRM_FORMAT_MODIFIER_PLANE_LAYOUT_EXT"; case VK_ERROR_INVALID_EXTERNAL_HANDLE: return "VK_ERROR_INVALID_EXTERNAL_HANDLE"; case VK_ERROR_INVALID_SHADER_NV: return "VK_ERROR_INVALID_SHADER_NV"; case VK_ERROR_LAYER_NOT_PRESENT: return "VK_ERROR_LAYER_NOT_PRESENT"; case VK_ERROR_MEMORY_MAP_FAILED: return "VK_ERROR_MEMORY_MAP_FAILED"; case VK_ERROR_NATIVE_WINDOW_IN_USE_KHR: return "VK_ERROR_NATIVE_WINDOW_IN_USE_KHR"; /*case VK_ERROR_NOT_PERMITTED_KHR: return "VK_ERROR_NOT_PERMITTED_KHR";*/ case VK_ERROR_OUT_OF_DATE_KHR: return "VK_ERROR_OUT_OF_DATE_KHR"; case VK_ERROR_OUT_OF_DEVICE_MEMORY: return "VK_ERROR_OUT_OF_DEVICE_MEMORY"; case VK_ERROR_OUT_OF_HOST_MEMORY: return "VK_ERROR_OUT_OF_HOST_MEMORY"; case VK_ERROR_OUT_OF_POOL_MEMORY: return "VK_ERROR_OUT_OF_POOL_MEMORY"; case VK_ERROR_SURFACE_LOST_KHR: return "VK_ERROR_SURFACE_LOST_KHR"; case VK_ERROR_TOO_MANY_OBJECTS: return "VK_ERROR_TOO_MANY_OBJECTS"; case VK_ERROR_VALIDATION_FAILED_EXT: return "VK_ERROR_VALIDATION_FAILED_EXT"; #ifdef VK_ENABLE_BETA_EXTENSIONS case VK_ERROR_VIDEO_PICTURE_LAYOUT_NOT_SUPPORTED_KHR: return "VK_ERROR_VIDEO_PICTURE_LAYOUT_NOT_SUPPORTED_KHR"; #endif /* VK_ENABLE_BETA_EXTENSIONS */ #ifdef VK_ENABLE_BETA_EXTENSIONS case VK_ERROR_VIDEO_PROFILE_CODEC_NOT_SUPPORTED_KHR: return "VK_ERROR_VIDEO_PROFILE_CODEC_NOT_SUPPORTED_KHR"; #endif /* VK_ENABLE_BETA_EXTENSIONS */ #ifdef VK_ENABLE_BETA_EXTENSIONS case VK_ERROR_VIDEO_PROFILE_FORMAT_NOT_SUPPORTED_KHR: return "VK_ERROR_VIDEO_PROFILE_FORMAT_NOT_SUPPORTED_KHR"; #endif /* VK_ENABLE_BETA_EXTENSIONS */ #ifdef VK_ENABLE_BETA_EXTENSIONS case VK_ERROR_VIDEO_PROFILE_OPERATION_NOT_SUPPORTED_KHR: return "VK_ERROR_VIDEO_PROFILE_OPERATION_NOT_SUPPORTED_KHR"; #endif /* VK_ENABLE_BETA_EXTENSIONS */ #ifdef VK_ENABLE_BETA_EXTENSIONS case VK_ERROR_VIDEO_STD_VERSION_NOT_SUPPORTED_KHR: return "VK_ERROR_VIDEO_STD_VERSION_NOT_SUPPORTED_KHR"; #endif /* VK_ENABLE_BETA_EXTENSIONS */ case VK_EVENT_RESET: return "VK_EVENT_RESET"; case VK_EVENT_SET: return "VK_EVENT_SET"; case VK_INCOMPLETE: return "VK_INCOMPLETE"; case VK_NOT_READY: return "VK_NOT_READY"; /*case VK_OPERATION_DEFERRED_KHR: return "VK_OPERATION_DEFERRED_KHR"; case VK_OPERATION_NOT_DEFERRED_KHR: return "VK_OPERATION_NOT_DEFERRED_KHR"; case VK_PIPELINE_COMPILE_REQUIRED: return "VK_PIPELINE_COMPILE_REQUIRED";*/ case VK_SUBOPTIMAL_KHR: return "VK_SUBOPTIMAL_KHR"; case VK_SUCCESS: return "VK_SUCCESS"; /*case VK_THREAD_DONE_KHR: return "VK_THREAD_DONE_KHR"; case VK_THREAD_IDLE_KHR: return "VK_THREAD_IDLE_KHR";*/ case VK_TIMEOUT: return "VK_TIMEOUT"; default: return "Unhandled VkResult"; } } #endif /* HAS_Vulkan */ static int set_gpu_vulkan_version([[maybe_unused]] Data::Graphics::Card &card, [[maybe_unused]] struct pci_dev *dev) { #if HAS_Vulkan uint32_t device_count = 0; bool gpu_found = false; bool use_device_id = false; VkResult vk_err; VkInstance instance{}; std::vector devices; MSG_VERBOSE("%s", _("Finding Vulkan API version")); std::vector ext_create_info; ext_create_info.emplace_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME); VkInstanceCreateInfo createInfo{}; createInfo.sType = VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO; createInfo.pNext = NULL; createInfo.flags = 0; createInfo.enabledExtensionCount = (uint32_t) ext_create_info.size(); createInfo.ppEnabledExtensionNames = ext_create_info.data(); if((vk_err = vkCreateInstance(&createInfo, NULL, &instance)) != VK_SUCCESS) { MSG_ERROR(_("failed to call vkCreateInstance (%s)"), string_VkResult(vk_err)); if(vk_err == VK_ERROR_EXTENSION_NOT_PRESENT) MSG_ERROR(_("%s is not supported"), VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME); return 1; } /* Get number of devices */ if((vk_err = vkEnumeratePhysicalDevices(instance, &device_count, NULL)) != VK_SUCCESS) { MSG_ERROR(_("failed to call vkEnumeratePhysicalDevices (%s)"), string_VkResult(vk_err)); return 2; } MSG_DEBUG("Vulkan devices count: %u", device_count); if(device_count == 0) { MSG_WARNING("%s", _("No available Vulkan devices")); return 3; } /* Get all device handles */ devices.resize(device_count); if((vk_err = vkEnumeratePhysicalDevices(instance, &device_count, devices.data())) != VK_SUCCESS) { MSG_WARNING(_("No available physical devices (%s)"), string_VkResult(vk_err)); return 4; } const float queue_priorities[] = { 1.0f }; VkDeviceQueueCreateInfo queue_create_info{}; queue_create_info.sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO; queue_create_info.pNext = NULL; queue_create_info.flags = 0; queue_create_info.queueFamilyIndex = 0; queue_create_info.queueCount = 1; queue_create_info.pQueuePriorities = queue_priorities; # ifdef VK_EXT_PCI_BUS_INFO_EXTENSION_NAME std::vector ext_pci_bus_info; ext_pci_bus_info.emplace_back(VK_EXT_PCI_BUS_INFO_EXTENSION_NAME); VkDeviceCreateInfo check_pci_bus_info{}; check_pci_bus_info.sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO; check_pci_bus_info.pNext = NULL; check_pci_bus_info.flags = 0; check_pci_bus_info.queueCreateInfoCount = 1; check_pci_bus_info.pQueueCreateInfos = &queue_create_info; check_pci_bus_info.enabledLayerCount = 0; check_pci_bus_info.ppEnabledLayerNames = NULL; check_pci_bus_info.enabledExtensionCount = (uint32_t) ext_pci_bus_info.size(); check_pci_bus_info.ppEnabledExtensionNames = ext_pci_bus_info.data(); check_pci_bus_info.pEnabledFeatures = NULL; # endif /* VK_EXT_PCI_BUS_INFO_EXTENSION_NAME */ # ifdef VK_KHR_ACCELERATION_STRUCTURE_EXTENSION_NAME std::vector ext_rt; ext_rt.emplace_back(VK_KHR_ACCELERATION_STRUCTURE_EXTENSION_NAME); VkDeviceCreateInfo check_rt{}; check_rt.sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO; check_rt.pNext = NULL; check_rt.flags = 0; check_rt.queueCreateInfoCount = 1; check_rt.pQueueCreateInfos = &queue_create_info; check_rt.enabledLayerCount = 0; check_rt.ppEnabledLayerNames = NULL; check_rt.enabledExtensionCount = (uint32_t) ext_rt.size(); check_rt.ppEnabledExtensionNames = ext_rt.data(); check_rt.pEnabledFeatures = NULL; # endif /* VK_KHR_ACCELERATION_STRUCTURE_EXTENSION_NAME */ VkPhysicalDeviceMemoryProperties2 heap_info{}; heap_info.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MEMORY_PROPERTIES_2; heap_info.pNext = NULL; VkPhysicalDevicePCIBusInfoPropertiesEXT bus_info{}; bus_info.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PCI_BUS_INFO_PROPERTIES_EXT; bus_info.pNext = NULL; VkPhysicalDeviceProperties2 prop2{}; prop2.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROPERTIES_2; prop2.pNext = &bus_info; for(uint32_t i = 0; (i < device_count) && !gpu_found; i++) { MSG_DEBUG("Looping into Vulkan device %lu", i); # ifdef VK_EXT_PCI_BUS_INFO_EXTENSION_NAME VkDevice vk_dev_bus_info{}; if((vk_err = vkCreateDevice(devices[i], &check_pci_bus_info, NULL, &vk_dev_bus_info)) != VK_SUCCESS) { MSG_WARNING(_("Failed to create Vulkan for device %u (%s)"), i, string_VkResult(vk_err)); if(vk_err == VK_ERROR_EXTENSION_NOT_PRESENT) { MSG_WARNING(_("%s is not supported for device %u, use only deviceID for matching"), VK_EXT_PCI_BUS_INFO_EXTENSION_NAME, i); use_device_id = true; } } vkDestroyDevice(vk_dev_bus_info, NULL); # else use_device_id = true; # endif /* VK_EXT_PCI_BUS_INFO_EXTENSION_NAME */ vkGetPhysicalDeviceProperties2(devices[i], &prop2); if(use_device_id && ((uint32_t) dev->device_id != prop2.properties.deviceID)) { MSG_DEBUG("Vulkan device %lu: use only deviceID but device %u does not match device %lu", i, dev->device_id, prop2.properties.deviceID); continue; } else if(!use_device_id && (uint32_t(dev->domain) != bus_info.pciDomain || dev->bus != bus_info.pciBus || dev->dev != bus_info.pciDevice || dev->func != bus_info.pciFunction)) { MSG_DEBUG("Vulkan device %lu: device does not match with VkPhysicalDevicePCIBusInfoPropertiesEXT", i); continue; } else MSG_DEBUG("Vulkan device %lu: device matches with pci_dev", i); vkGetPhysicalDeviceMemoryProperties2(devices[i], &heap_info); for(uint32_t heap = 0; heap < heap_info.memoryProperties.memoryHeapCount; heap++) if(VK_MEMORY_HEAP_DEVICE_LOCAL_BIT == heap_info.memoryProperties.memoryHeaps[heap].flags) card.vram_size = heap_info.memoryProperties.memoryHeaps[heap].size; # ifdef VK_KHR_ACCELERATION_STRUCTURE_EXTENSION_NAME VkDevice vk_dev_rt{}; card.vulkan_rt.value = (vkCreateDevice(devices[i], &check_rt, NULL, &vk_dev_rt) == VK_SUCCESS) ? _("Enabled") : _("Disabled"); MSG_DEBUG("Vulkan device %lu: Ray Tracing support is %s", i, card.vulkan_rt.value.c_str()); vkDestroyDevice(vk_dev_rt, NULL); # endif /* VK_KHR_ACCELERATION_STRUCTURE_EXTENSION_NAME */ card.vulkan_version.value = string_format("%d.%d.%d", # if(VK_API_VERSION_MAJOR && VK_API_VERSION_MINOR && VK_API_VERSION_PATCH) VK_API_VERSION_MAJOR(prop2.properties.apiVersion), VK_API_VERSION_MINOR(prop2.properties.apiVersion), VK_API_VERSION_PATCH(prop2.properties.apiVersion) # else VK_VERSION_MAJOR(prop2.properties.apiVersion), VK_VERSION_MINOR(prop2.properties.apiVersion), VK_VERSION_PATCH(prop2.properties.apiVersion) # endif /* (VK_API_VERSION_MAJOR && VK_API_VERSION_MINOR && VK_API_VERSION_PATCH) */ ); MSG_DEBUG("Vulkan device %lu: version is '%s'", i, card.vulkan_version.value.c_str()); gpu_found = true; } vkDestroyInstance(instance, NULL); #endif /* HAS_Vulkan */ return 0; } #define CLINFO(dev_id, PARAM, prop) \ clGetDeviceInfo(dev_id, PARAM, sizeof(prop), &prop, NULL) static int set_gpu_compute_unit([[maybe_unused]] Data::Graphics::Card &card, [[maybe_unused]] struct pci_dev *dev) { int ret_cl = 0; #if HAS_OpenCL bool gpu_found = false; size_t size_ret; char platform_name[MAXSTR] = "", platform_version[MAXSTR] = ""; cl_uint num_pf = 0; MSG_VERBOSE("%s", _("Finding OpenCL API version")); ret_cl = clGetPlatformIDs(0, NULL, &num_pf); // get number of platform if(__sigabrt_received || (ret_cl != CL_SUCCESS) || (num_pf == 0)) { MSG_WARNING(_("There is no platform with OpenCL support (%s)"), __sigabrt_received ? "SIGABRT" : opencl_error(ret_cl)); __sigabrt_received = false; return ret_cl; } MSG_DEBUG("Number of OpenCL platforms: %u", num_pf); std::vector platforms(num_pf); ret_cl = clGetPlatformIDs(num_pf, platforms.data(), NULL); // get all platforms if(__sigabrt_received || (ret_cl != CL_SUCCESS)) { MSG_ERROR(_("failed to get all OpenCL platforms (%s)"), __sigabrt_received ? "SIGABRT" : opencl_error(ret_cl)); __sigabrt_received = false; return ret_cl; } for(cl_uint i = 0; (i < num_pf) && !gpu_found; i++) // find GPU devices { cl_uint num_ocl_dev = 0; MSG_DEBUG("Looping into OpenCL platform %u", i); ret_cl = clGetPlatformInfo(platforms[i], CL_PLATFORM_NAME, sizeof(platform_name), platform_name, &size_ret); // get platform name if((ret_cl != CL_SUCCESS) || (size_ret == 0)) { MSG_ERROR(_("failed to get name for platform %u (%s)"), i, opencl_error(ret_cl)); continue; } MSG_DEBUG("OpenCL platform %u: name is '%s'", i, platform_name); ret_cl = clGetPlatformInfo(platforms[i], CL_PLATFORM_VERSION, sizeof(platform_version), platform_version, &size_ret); // get platform version if((ret_cl != CL_SUCCESS) || (size_ret == 0)) { MSG_ERROR(_("failed to get version for platform %u (%s)"), i, opencl_error(ret_cl)); continue; } MSG_DEBUG("OpenCL platform %u: version is '%s'", i, platform_version); ret_cl = clGetDeviceIDs(platforms[i], CL_DEVICE_TYPE_ALL, 0, NULL, &num_ocl_dev); // get number of device if((ret_cl != CL_SUCCESS) || (num_ocl_dev == 0)) { MSG_ERROR(_("failed to find number of OpenCL devices for platform '%s %s' (%s)"), platform_name, platform_version, (num_ocl_dev == 0) ? _("0 device") : opencl_error(ret_cl)); continue; } MSG_DEBUG("OpenCL platform %u: found %u devices", i, num_ocl_dev); std::vector devices(num_ocl_dev); ret_cl = clGetDeviceIDs(platforms[i], CL_DEVICE_TYPE_ALL, num_ocl_dev, devices.data(), NULL); // get all devices if(ret_cl != CL_SUCCESS) { MSG_ERROR(_("failed to get all of OpenCL devices for platform '%s %s' (%s)"), platform_name, platform_version, opencl_error(ret_cl)); continue; } for(cl_uint j = 0; (j < num_ocl_dev) && !gpu_found; j++) { cl_uint ocl_vendor; uint32_t comp_unit = 0; std::string comp_unit_type; char device_name[MAXSTR] = "", device_version[MAXSTR] = ""; MSG_DEBUG("Looping into OpenCL platform %u, device %u", i, j); CLINFO(devices[j], CL_DEVICE_VENDOR_ID, ocl_vendor); if(dev->vendor_id != ocl_vendor) continue; MSG_DEBUG("OpenCL platform %u, device %u: found vendor 0x%X", i, j, ocl_vendor); ret_cl = clGetDeviceInfo(devices[j], CL_DEVICE_NAME, sizeof(device_name), device_name, &size_ret); if((ret_cl != CL_SUCCESS) || (size_ret == 0)) { MSG_ERROR(_("failed to get name for device %u (%s)"), j, opencl_error(ret_cl)); continue; } MSG_DEBUG("OpenCL platform %u, device %u: name is '%s'", i, j, device_name); ret_cl = clGetDeviceInfo(devices[j], CL_DEVICE_VERSION, sizeof(device_version), device_version, &size_ret); if((ret_cl != CL_SUCCESS) || (size_ret == 0)) { MSG_ERROR(_("failed to get version for device %u (%s)"), j, opencl_error(ret_cl)); continue; } MSG_DEBUG("OpenCL platform %u, device %u: version is '%s'", i, j, device_version); /* Set OpenCL version */ const std::string cl_version = device_version; const size_t cl_index = cl_version.find_last_of("OpenCL"); card.opencl_version.value = (cl_index != std::string::npos) ? cl_version.substr(cl_index + 2) : cl_version; /* Get compute units depending on vendor */ switch (ocl_vendor) { case DEV_VENDOR_ID_AMD: { cl_uint amd_gfx_major = 0; cl_device_topology_amd topo_amd; MSG_DEBUG("OpenCL platform %u, device %u: vendor is AMD", i, j); ret_cl = CLINFO(devices[j], CL_DEVICE_TOPOLOGY_AMD, topo_amd); if(ret_cl != CL_SUCCESS) { MSG_WARNING(_("OpenCL driver for '%s %s' does not support CL_DEVICE_TOPOLOGY_AMD (%s)"), device_name, device_version, opencl_error(ret_cl)); continue; } if((dev->bus == topo_amd.pcie.bus) && (dev->dev == topo_amd.pcie.device) && (dev->func == topo_amd.pcie.function)) { ret_cl = CLINFO(devices[j], CL_DEVICE_GFXIP_MAJOR_AMD, amd_gfx_major); if(ret_cl != CL_SUCCESS) { MSG_WARNING(_("OpenCL driver for '%s %s' does not support CL_DEVICE_GFXIP_MAJOR_AMD (%s)"), device_name, device_version, opencl_error(ret_cl)); amd_gfx_major = 0; } MSG_DEBUG("OpenCL platform %u, device %u: CL_DEVICE_GFXIP_MAJOR_AMD is %u", i, j, amd_gfx_major); ret_cl = CLINFO(devices[j], CL_DEVICE_MAX_COMPUTE_UNITS, comp_unit); if(ret_cl != CL_SUCCESS) { MSG_ERROR(_("OpenCL driver for '%s %s' does not support CL_DEVICE_MAX_COMPUTE_UNITS (%s)"), device_name, device_version, opencl_error(ret_cl)); continue; } /* Set unit type: - Compute Unit (CU): GCN - Workgroup Processor (WGP): RDNA, i.e. GFX10+ */ comp_unit_type = (amd_gfx_major < 10) ? "CU" : "WGP"; MSG_DEBUG("OpenCL platform %u, device %u: found %lu %s", i, j, comp_unit, comp_unit_type.c_str()); card.comp_unit.value = std::to_string(comp_unit) + " " + comp_unit_type; gpu_found = true; } break; } case DEV_VENDOR_ID_INTEL: { MSG_DEBUG("OpenCL platform %u, device %u: vendor is Intel", i, j); ret_cl = CLINFO(devices[j], CL_DEVICE_MAX_COMPUTE_UNITS, comp_unit); if(ret_cl != CL_SUCCESS) { MSG_ERROR(_("OpenCL driver for '%s %s' does not support CL_DEVICE_MAX_COMPUTE_UNITS (%s)"), device_name, device_version, opencl_error(ret_cl)); continue; } comp_unit_type = "EU"; // Execution Unit MSG_DEBUG("OpenCL platform %u, device %u: found %lu %s", i, j, comp_unit, comp_unit_type.c_str()); card.comp_unit.value = std::to_string(comp_unit) + " " + comp_unit_type; gpu_found = true; break; } case DEV_VENDOR_ID_NVIDIA: { cl_uint ocl_domain_nv, ocl_bus_nv, ocl_dev_nv; uint8_t ret_domain_nv = 0, ret_bus_nv = 0, ret_dev_nv = 0; MSG_DEBUG("OpenCL platform %u, device %u: vendor is NVIDIA", i, j); ret_domain_nv = CLINFO(devices[j], CL_DEVICE_PCI_DOMAIN_ID_NV, ocl_domain_nv); ret_bus_nv = CLINFO(devices[j], CL_DEVICE_PCI_BUS_ID_NV, ocl_bus_nv); ret_dev_nv = CLINFO(devices[j], CL_DEVICE_PCI_SLOT_ID_NV, ocl_dev_nv); // Slot == Device if((ret_domain_nv != CL_SUCCESS) || (ret_bus_nv != CL_SUCCESS) || (ret_dev_nv != CL_SUCCESS)) { MSG_WARNING(_("OpenCL driver for '%s %s' does not support CL_DEVICE_PCI_DOMAIN_ID_NV (%s), CL_DEVICE_PCI_BUS_ID_NV (%s) or CL_DEVICE_PCI_SLOT_ID_NV (%s)"), device_name, device_version, opencl_error(ret_domain_nv), opencl_error(ret_bus_nv), opencl_error(ret_dev_nv)); continue; } if((dev->domain == static_cast(ocl_domain_nv)) && (dev->bus == ocl_bus_nv) && (dev->dev == ocl_dev_nv)) { ret_cl = CLINFO(devices[j], CL_DEVICE_MAX_COMPUTE_UNITS, comp_unit); if(ret_cl != CL_SUCCESS) { MSG_ERROR(_("OpenCL driver for '%s %s' does not support CL_DEVICE_MAX_COMPUTE_UNITS (%s)"), device_name, device_version, opencl_error(ret_cl)); continue; } comp_unit_type = "SM"; // Streaming Multiprocessor MSG_DEBUG("OpenCL platform %u, device %u: found %lu %s", i, j, comp_unit, comp_unit_type.c_str()); card.comp_unit.value = std::to_string(comp_unit) + " " + comp_unit_type; gpu_found = true; } break; } default: MSG_WARNING(_("OpenCL is not supported with your GPU vendor (0x%X)"), ocl_vendor); break; } /* end switch (vendor_id) */ } /* end num_ocl_dev */ } /* end num_pf */ #endif /* HAS_OpenCL */ return ret_cl; } #define DEVICE_VENDOR_STR(d) pci_lookup_name(pacc, buff, MAXSTR, PCI_LOOKUP_VENDOR, d->vendor_id, d->device_id) #define DEVICE_PRODUCT_STR(d) pci_lookup_name(pacc, buff, MAXSTR, PCI_LOOKUP_DEVICE, d->vendor_id, d->device_id) /* Find some PCI devices, like chipset and GPU */ static int find_devices(Data &data) { /* Adapted from http://git.kernel.org/cgit/utils/pciutils/pciutils.git/tree/example.c */ bool chipset_found = false; std::string gpu_vendor; char buff[MAXSTR] = ""; struct pci_access *pacc; struct pci_dev *dev; MSG_VERBOSE("%s", _("Finding devices")); pacc = pci_alloc(); /* Get the pci_access structure */ #ifdef __FreeBSD__ int ret = -1; const DaemonCommand cmd = ACCESS_DEV_PCI; if(DAEMON_UP && access(DEV_PCI, W_OK)) { SEND_DATA(&data.socket_fd, &cmd, sizeof(DaemonCommand)); RECEIVE_DATA(&data.socket_fd, &ret, sizeof(int)); } if(ret && access(DEV_PCI, W_OK)) { MSG_WARNING(_("Skip devices search (wrong permissions on %s device)"), DEV_PCI); return 1; } #endif /* __FreeBSD__ */ pci_init(pacc); /* Initialize the PCI library */ pci_scan_bus(pacc); /* We want to get the list of devices */ /* Iterate over all devices */ for(dev = pacc->devices; dev != NULL; dev = dev->next) { pci_fill_info(dev, PCI_FILL_IDENT | PCI_FILL_BASES | PCI_FILL_CLASS); /* Looking for chipset */ if(!chipset_found && (dev->device_class == PCI_CLASS_BRIDGE_ISA)) { chipset_found = true; data.motherboard.chipset.vendor.value = DEVICE_VENDOR_STR(dev); data.motherboard.chipset.model.value = DEVICE_PRODUCT_STR(dev); } /* Looking for GPU */ if((dev->device_class >> 8) == PCI_BASE_CLASS_DISPLAY) { uint64_t bar_size = 0; const uint8_t card_index = data.graphics.cards.size(); data.graphics.grow_cards_vector(); switch(dev->vendor_id) { case DEV_VENDOR_ID_AMD: gpu_vendor = "AMD"; bar_size = dev->size[0]; break; case DEV_VENDOR_ID_INTEL: gpu_vendor = "Intel"; bar_size = dev->size[2]; break; case DEV_VENDOR_ID_NVIDIA: gpu_vendor = "NVIDIA"; bar_size = dev->size[1]; break; default: gpu_vendor = DEVICE_VENDOR_STR(dev); MSG_WARNING(_("Your GPU vendor is unknown: %s (0x%X)"), gpu_vendor.c_str(), dev->vendor_id); } data.graphics.cards[card_index].device_path = get_gpu_device_path(dev); data.graphics.cards[card_index].vendor.value = gpu_vendor; data.graphics.cards[card_index].model.value = DEVICE_PRODUCT_STR(dev); data.graphics.cards[card_index].device_id.value = string_format("0x%04X:0x%04X", dev->vendor_id, dev->device_id); set_gpu_kernel_driver(data.graphics.cards[card_index]); set_gpu_user_mode_driver(data.graphics.cards[card_index]); set_gpu_vulkan_version(data.graphics.cards[card_index], dev); set_gpu_compute_unit(data.graphics.cards[card_index], dev); if(data.graphics.cards[card_index].vram_size > 0) data.graphics.cards[card_index].mem_used.value = string_format("??? / %lu %s", (data.graphics.cards[card_index].vram_size >> 20), UNIT_MIB); if((data.graphics.cards[card_index].vram_size > 0) && (bar_size > 0)) data.graphics.cards[card_index].resizable_bar.value = ((data.graphics.cards[card_index].vram_size * 9 / 10) < bar_size) ? _("Enabled") : _("Disabled"); } } pci_cleanup(pacc); if(!chipset_found) MSG_ERROR("%s", _("failed to find chipset vendor and model")); #if 0 // For testing purposes while(data.graphics.cards.size() < 8) { const uint8_t card_index = data.graphics.cards.size(); data.graphics.grow_cards_vector(); data.graphics.cards[card_index].vendor.value = string_format("Vendor %u", card_index); data.graphics.cards[card_index].kernel_driver.value = string_format("Driver %u", card_index); data.graphics.cards[card_index].user_mode_driver.value = string_format("UMB %u", card_index); data.graphics.cards[card_index].model.value = string_format("Model %u", card_index); } #endif /* 0 */ if(data.graphics.cards.size() == 0) MSG_ERROR("%s", _("failed to find graphic card vendor and model")); else Options::set_selected_gpu(Options::get_selected_gpu(), data.graphics.cards.size()); return (chipset_found == false) + (data.graphics.cards.size() == 0); } #undef DEVICE_VENDOR_STR #undef DEVICE_PRODUCT_STR #ifdef __linux__ /* Check access on /sys/kernel/debug/dri */ static bool can_access_sys_debug_dri(Data &data) { static int ret = 1; const DaemonCommand cmd = ACCESS_SYS_DEBUG; if(ret == 1) { if(!access(SYS_DEBUG_DRI, X_OK)) ret = 0; else if(DAEMON_UP) { SEND_DATA(&data.socket_fd, &cmd, sizeof(DaemonCommand)); RECEIVE_DATA(&data.socket_fd, &ret, sizeof(int)); } else ret = -2; } MSG_DEBUG("can_access_sys_debug_dri() ==> %i", ret); return !ret; } /* Get PCIe interface speed and width */ static std::string get_gpu_interface_info(std::string drm_path, std::string type) { int pcie_width = 0; uint8_t pcie_gen = 0; std::string pcie_speed_raw, pcie_width_raw; // Linux 4.13+ (3 September 2017) const std::string link_speed_file = drm_path + "/device/" + type + "_link_speed"; const std::string link_width_file = drm_path + "/device/" + type + "_link_width"; if(!file_exists(link_speed_file) || !file_exists(link_width_file)) return std::string(); if(fopen_to_str(pcie_speed_raw, "%s", link_speed_file.c_str()) || fopen_to_str(pcie_width_raw, "%s", link_width_file.c_str())) return std::string(); try { /* Speed */ switch(std::stoi(pcie_speed_raw)) { case 2: pcie_gen = 1; break; // 2.5 GT/s case 5: pcie_gen = 2; break; case 8: pcie_gen = 3; break; case 16: pcie_gen = 4; break; case 32: pcie_gen = 5; break; case 64: pcie_gen = 6; break; default: pcie_gen = 0; break; } /* Width */ pcie_width = std::stoi(pcie_width_raw); } catch(const std::exception& e) { return std::string(); } return string_format("Gen%1dx%d", pcie_gen, pcie_width); } #endif /* __linux__ */ #define FOPEN_TO_ITEM(item, ...) item.ret = fopen_to_str(item.value, ##__VA_ARGS__) #define POPEN_TO_ITEM(item, ...) item.ret = popen_to_str(item.value, ##__VA_ARGS__) #define POPEN_DRI_TO_ITEM(item, ...) item.ret = can_access_sys_debug_dri(data) ? popen_to_str(item.value, ##__VA_ARGS__) : -1 #define SET_LABEL_VALUE_NO_CONV(item, fmt, ...) item_count++; \ if(!item.ret) card.item.value = string_format(fmt, ##__VA_ARGS__); \ else error_count++ #define SET_LABEL_VALUE_CONV(item, fmt, ...) item_count++; \ if(!item.ret && is_unsigned_integer(item.value)) card.item.value = string_format(fmt, ##__VA_ARGS__); \ else error_count++ #define SET_LABEL_VALUE_CONV2(item1, item2, fmt, ...) item_count++; \ if(!item1.ret && !item2.ret && is_unsigned_integer(item1.value) && is_unsigned_integer(item2.value)) card.item1.value = string_format(fmt, ##__VA_ARGS__); \ else error_count++ /* Retrieve GPU temperature and clocks */ static int gpu_monitoring([[maybe_unused]] Data &data) { int ret = 0; struct Item { int ret = - 1; long double divisor = 1.0; std::string value; }; #ifdef __linux__ static bool init_done = false; uint8_t failed_count = 0, fglrx_count = 0, nvidia_count = 0; MSG_VERBOSE("%s", _("Retrieving GPU clocks")); for(auto& card : data.graphics.cards) { int item_count = 0, error_count = 0; Item vbios_version, interface, temperature, usage, core_voltage, power_avg, core_clock, mem_clock, mem_used, mem_total; /* Set kernel driver name in case of changed state for GPU */ const bool gpu_ok = gpu_is_on(card.device_path); if(gpu_ok && (card.driver == GpuDrv::GPUDRV_UNKNOWN)) set_gpu_kernel_driver(card); else if(!gpu_ok) { card.driver = GpuDrv::GPUDRV_UNKNOWN; card.kernel_driver.value = _("None"); continue; } /* Get DRM path and card number */ if(!init_done) { card.drm_path = get_device_path_drm(card.device_path); if(card.drm_path.empty()) MSG_WARNING(_("DRM path for %s is unknown"), card.name.c_str()); else { const std::size_t pos = card.drm_path.find_last_of("card"); if(pos != std::string::npos) card.drm_card_number = std::stoi(card.drm_path.substr(pos + 1)); else MSG_WARNING(_("Card number for %s is unknown"), card.name.c_str()); } } /* Get HWmon path */ switch(card.driver) { case GpuDrv::GPUDRV_AMDGPU: case GpuDrv::GPUDRV_RADEON: case GpuDrv::GPUDRV_NOUVEAU: case GpuDrv::GPUDRV_NOUVEAU_BUMBLEBEE: temperature.divisor = 1e3; if(!init_done) card.hwmon_path = get_device_path_hwmon(card.device_path); if(!card.hwmon_path.empty()) FOPEN_TO_ITEM(temperature, "%s/temp1_input", card.hwmon_path.c_str()); break; default: break; } /* PCIe interface information */ std::string pcie_current_interface = get_gpu_interface_info(card.drm_path, "current"); std::string pcie_max_interface = get_gpu_interface_info(card.drm_path, "max"); if(!pcie_current_interface.empty() && !pcie_max_interface.empty()) card.interface.value = string_format(_("PCIe %s (current) / %s (max)"), pcie_current_interface.c_str(), pcie_max_interface.c_str()); /* GPU kernel driver dependent variables */ switch(card.driver) { case GpuDrv::GPUDRV_AMDGPU: { const std::string amdgpu_gpu_busy_file = (!card.drm_path.empty()) ? card.drm_path + "/device/gpu_busy_percent" : std::string(); const std::string amdgpu_mem_clock = card.hwmon_path + "/freq2_input"; const std::string amdgpu_power1_average = card.hwmon_path + "/power1_average"; const std::string amdgpu_power1_input = card.hwmon_path + "/power1_input"; MSG_DEBUG("gpu_monitoring: amdgpu: amdgpu_gpu_busy_file=%s", amdgpu_gpu_busy_file.c_str()); FOPEN_TO_ITEM(vbios_version, "%s/device/vbios_version", card.drm_path.c_str()); // temperature obtained above FOPEN_TO_ITEM(usage, "%s", amdgpu_gpu_busy_file.c_str()); // Linux 4.19+ (22 October 2018) FOPEN_TO_ITEM(core_voltage, "%s/in0_input", card.hwmon_path.c_str()); if(file_exists(amdgpu_power1_input)) FOPEN_TO_ITEM(power_avg, "%s", amdgpu_power1_input.c_str()); else if(file_exists(amdgpu_power1_average)) // still in Linux 6.6 pre-release FOPEN_TO_ITEM(power_avg, "%s", amdgpu_power1_average.c_str()); FOPEN_TO_ITEM(core_clock, "%s/freq1_input", card.hwmon_path.c_str()); if(file_exists(amdgpu_mem_clock)) // there is no memory frequency for iGPU FOPEN_TO_ITEM(mem_clock, "%s", amdgpu_mem_clock.c_str()); FOPEN_TO_ITEM(mem_used, "%s/device/mem_info_vram_used", card.drm_path.c_str()); FOPEN_TO_ITEM(mem_total, "%s/device/mem_info_vram_total", card.drm_path.c_str()); core_voltage.divisor = 1e3; power_avg.divisor = 1e6; core_clock.divisor = 1e6; mem_clock.divisor = 1e6; mem_used.divisor = mem_total.divisor = 1 << 20; break; } case GpuDrv::GPUDRV_FGLRX: { // vbios_version not available POPEN_TO_ITEM(temperature, "aticonfig --adapter=%1u --odgt | awk '/Sensor/ { print $5 }'", fglrx_count); POPEN_TO_ITEM(usage, "aticonfig --adapter=%1u --odgc | awk '/GPU load/ { sub(\"%\",\"\",$4); print $4 }'", fglrx_count); // core_voltage not available // power_avg not available POPEN_TO_ITEM(core_clock, "aticonfig --adapter=%1u --odgc | awk '/Current Clocks/ { print $4 }'", fglrx_count); POPEN_TO_ITEM(mem_clock, "aticonfig --adapter=%1u --odgc | awk '/Current Clocks/ { print $5 }'", fglrx_count); // mem_used not available // mem_total not available fglrx_count++; break; } case GpuDrv::GPUDRV_INTEL: { // vbios_version not available // temperature not available // usage not available // core_voltage not available // power_avg not available FOPEN_TO_ITEM(core_clock, "%s/gt_cur_freq_mhz", card.drm_path.c_str()); // mem_clock not available // mem_used not available // mem_total not available break; } case GpuDrv::GPUDRV_RADEON: { // vbios_version not available // temperature obtained above // usage not available POPEN_DRI_TO_ITEM(core_voltage, "awk -F '(vddc: | vddci:)' 'NR==2 { print $2 }' %s/%u/radeon_pm_info", SYS_DEBUG_DRI, card.drm_card_number); // power_avg not available POPEN_DRI_TO_ITEM(core_clock, "awk -F '(sclk: | mclk:)' 'NR==2 { print $2 }' %s/%u/radeon_pm_info", SYS_DEBUG_DRI, card.drm_card_number); POPEN_DRI_TO_ITEM(mem_clock, "awk -F '(mclk: | vddc:)' 'NR==2 { print $2 }' %s/%u/radeon_pm_info", SYS_DEBUG_DRI, card.drm_card_number); // mem_used not available // mem_total not available core_voltage.divisor = 1e3; core_clock.divisor = 100.0; mem_clock.divisor = 100.0; break; } case GpuDrv::GPUDRV_NVIDIA: case GpuDrv::GPUDRV_NVIDIA_BUMBLEBEE: { /* Doc: https://nvidia.custhelp.com/app/answers/detail/a_id/3751/~/useful-nvidia-smi-queries https://briot-jerome.developpez.com/fichiers/blog/nvidia-smi/list.txt */ const std::string nvidia_cmd_base = (card.driver == GpuDrv::GPUDRV_NVIDIA_BUMBLEBEE) ? "optirun -b none nvidia-smi -c :8" : "nvidia-smi"; const std::string nvidia_cmd_args = nvidia_cmd_base + " --format=csv,noheader,nounits --id=" + std::to_string(nvidia_count); MSG_DEBUG("gpu_monitoring: nvidia: nvidia_cmd_args=%s", nvidia_cmd_args.c_str()); POPEN_TO_ITEM(vbios_version, "%s --query-gpu=vbios_version", nvidia_cmd_args.c_str()); POPEN_TO_ITEM(temperature, "%s --query-gpu=temperature.gpu", nvidia_cmd_args.c_str()); POPEN_TO_ITEM(usage, "%s --query-gpu=utilization.gpu", nvidia_cmd_args.c_str()); // core_voltage not available POPEN_TO_ITEM(power_avg, "%s --query-gpu=power.draw", nvidia_cmd_args.c_str()); POPEN_TO_ITEM(core_clock, "%s --query-gpu=clocks.gr", nvidia_cmd_args.c_str()); POPEN_TO_ITEM(mem_clock, "%s --query-gpu=clocks.mem", nvidia_cmd_args.c_str()); POPEN_TO_ITEM(mem_used, "%s --query-gpu=memory.used", nvidia_cmd_args.c_str()); POPEN_TO_ITEM(mem_total, "%s --query-gpu=memory.total", nvidia_cmd_args.c_str()); nvidia_count++; break; } case GpuDrv::GPUDRV_NOUVEAU: case GpuDrv::GPUDRV_NOUVEAU_BUMBLEBEE: { std::string pstate; if(popen_to_str(pstate, "grep '*' %1$s/%2$u/pstate || sed -n 1p %1$s/%2$u/pstate ", SYS_DEBUG_DRI, card.drm_card_number)) break; MSG_DEBUG("gpu_monitoring: nouveau: pstate=%s", pstate.c_str()); // vbios_version not available // temperature obtained above // usage not available // core_voltage not available // power_avg not available POPEN_DRI_TO_ITEM(core_clock, "echo %s | grep -oP '(?<=core )[^ ]*' | cut -d- -f2", pstate.c_str()); POPEN_DRI_TO_ITEM(mem_clock, "echo %s | grep -oP '(?<=memory )[^ ]*'", pstate.c_str()); // mem_used not available // mem_total not available break; } default: if(!init_done) MSG_WARNING(_("Driver for %s doesn't report frequencies"), card.name.c_str()); continue; } /* Set labels value */ SET_LABEL_VALUE_NO_CONV(vbios_version, "%s", vbios_version.value.c_str()); SET_LABEL_VALUE_CONV(temperature, "%s", string_with_temperature_unit(std::stoull(temperature.value) / temperature.divisor).c_str()); SET_LABEL_VALUE_NO_CONV(usage, "%s%%", usage.value.c_str()); SET_LABEL_VALUE_CONV(core_voltage, "%.2Lf V", std::stoull(core_voltage.value) / core_voltage.divisor); SET_LABEL_VALUE_CONV(power_avg, "%.2Lf W", std::stoull(power_avg.value) / power_avg.divisor); if(!core_clock.ret && is_unsigned_integer(core_clock.value) && (std::stoull(core_clock.value) > 0)) // sometimes core_clock.value is 0 (#301) { SET_LABEL_VALUE_CONV(core_clock, "%.0Lf MHz", std::stoull(core_clock.value) / core_clock.divisor); } SET_LABEL_VALUE_CONV(mem_clock, "%.0Lf MHz", std::stoull(mem_clock.value) / mem_clock.divisor); SET_LABEL_VALUE_CONV2(mem_used, mem_total, "%.0Lf %s / %.0Lf %s", std::stoull(mem_used.value) / mem_used.divisor, UNIT_MIB, std::stoull(mem_total.value) / mem_total.divisor, UNIT_MIB); if(!init_done && (item_count == error_count)) { failed_count++; MSG_ERROR(_("failed to retrieve all monitoring data for %s"), card.name.c_str()); } } init_done = true; ret = (failed_count == data.graphics.cards.size()); #endif /* __linux__ */ return ret; } #undef FOPEN_TO_ITEM #undef POPEN_TO_ITEM #undef POPEN_DRI_TO_ITEM #undef SET_LABEL_VALUE_NO_CONV #undef SET_LABEL_VALUE_CONV #undef SET_LABEL_VALUE_CONV2 #endif /* HAS_LIBPCI */ /* Satic elements for System tab, OS specific */ static int system_static(Data &data) { int err = 0; struct utsname name; MSG_VERBOSE("%s", _("Identifying running system")); err = uname(&name); if(err) MSG_ERRNO("%s", _("failed to identify running system")); else data.system.os.hostname.value = Options::get_issue() ? "sensitive data" : name.nodename; /* Hostname label */ #ifdef __linux__ /* Name label */ std::string line; std::ifstream stream("/etc/os-release"); std::regex regex("^PRETTY_NAME=\"(.*?)\"$"); std::smatch match; while(std::getline(stream, line)) { if(std::regex_search(line, match, regex)) { data.system.os.name.value = match[1].str(); break; } } /* Kernel label */ if(!err) data.system.os.kernel.value = string_format("%s %s", name.sysname, name.release); #else /* __linux__ */ if(!err) { /* Name label */ data.system.os.kernel.value = string_format("%s %s", name.sysname, name.release); /* Kernel label */ data.system.os.kernel.value = string_format("%s", name.version); } #endif /* __linux__ */ return err; } #if HAS_LIBSYSTEM /* Dynamic elements for System tab, provided by libprocps/libstatgrab */ static int system_dynamic(Data &data) { int err = 0; time_t uptime_s = 0; struct tm *tm; static PrefixUnit pu_mem, pu_swap; #if HAS_LIBPROC2 double up_secs; struct meminfo_info *mem_info = NULL; MSG_VERBOSE("%s", _("Calling libprocps")); /* System uptime */ if(procps_uptime(&up_secs, NULL) < 0) MSG_ERRNO("%s", _("unable to get system uptime")); else uptime_s = (time_t) up_secs; /* Memory variables */ if(procps_meminfo_new(&mem_info) < 0) MSG_ERRNO("%s", _("unable to create meminfo structure")); else { if(!pu_mem.init || !pu_swap.init) { pu_mem.find_best_binary_prefix(MEMINFO_GET(mem_info, MEMINFO_MEM_TOTAL, ul_int), PrefixUnit::Multipliers::MULT_K); pu_swap.find_best_binary_prefix(MEMINFO_GET(mem_info, MEMINFO_SWAP_TOTAL, ul_int), PrefixUnit::Multipliers::MULT_K); } data.system.memory.mem_used = MEMINFO_GET(mem_info, MEMINFO_MEM_USED, ul_int) / (long double) pu_mem.divisor; data.system.memory.mem_buffers = MEMINFO_GET(mem_info, MEMINFO_MEM_BUFFERS, ul_int) / (long double) pu_mem.divisor; data.system.memory.mem_cached = MEMINFO_GET(mem_info, MEMINFO_MEM_CACHED_ALL, ul_int) / (long double) pu_mem.divisor; data.system.memory.mem_free = MEMINFO_GET(mem_info, MEMINFO_MEM_FREE, ul_int) / (long double) pu_mem.divisor; data.system.memory.mem_total = MEMINFO_GET(mem_info, MEMINFO_MEM_TOTAL, ul_int) / (long double) pu_mem.divisor; data.system.memory.swap_used = MEMINFO_GET(mem_info, MEMINFO_SWAP_USED, ul_int) / (long double) pu_swap.divisor; data.system.memory.swap_total = MEMINFO_GET(mem_info, MEMINFO_SWAP_TOTAL, ul_int) / (long double) pu_swap.divisor; procps_meminfo_unref(&mem_info); } #endif /* HAS_LIBPROC2 */ #if HAS_LIBPROCPS MSG_VERBOSE("%s", _("Calling libprocps")); /* System uptime */ uptime_s = (time_t) uptime(NULL, NULL); /* Memory variables */ meminfo(); if(!pu_mem.init || !pu_swap.init) { pu_mem.find_best_binary_prefix(kb_main_total, PrefixUnit::Multipliers::MULT_K); pu_swap.find_best_binary_prefix(kb_swap_total, PrefixUnit::Multipliers::MULT_K); } data.system.memory.mem_used = kb_main_used / (long double) pu_mem.divisor; data.system.memory.mem_buffers = kb_main_buffers / (long double) pu_mem.divisor; data.system.memory.mem_cached = kb_main_cached / (long double) pu_mem.divisor; data.system.memory.mem_free = kb_main_free / (long double) pu_mem.divisor; data.system.memory.mem_total = kb_main_total / (long double) pu_mem.divisor; data.system.memory.swap_used = kb_swap_used / (long double) pu_swap.divisor; data.system.memory.swap_total = kb_swap_total / (long double) pu_swap.divisor; #endif /* HAS_LIBPROCPS */ #if HAS_LIBSTATGRAB static bool called = false; sg_mem_stats *mem; /* Memory labels */ sg_swap_stats *swap; sg_host_info *info; MSG_VERBOSE("%s", _("Calling libstatgrab")); /* Libstatgrab initialization */ if(!called) { err += sg_init(0); called = true; } mem = sg_get_mem_stats(NULL); swap = sg_get_swap_stats(NULL); info = sg_get_host_info(NULL); /* System uptime */ uptime_s = info->uptime; /* Memory variables */ if(!pu_mem.init || !pu_swap.init) { pu_mem.find_best_binary_prefix(mem->total, PrefixUnit::Multipliers::MULT_NONE); pu_swap.find_best_binary_prefix(swap->total, PrefixUnit::Multipliers::MULT_NONE); } data.system.memory.mem_used = mem->used / (long double) pu_mem.divisor; data.system.memory.mem_buffers = 0; data.system.memory.mem_cached = mem->cache / (long double) pu_mem.divisor; data.system.memory.mem_free = mem->free / (long double) pu_mem.divisor; data.system.memory.mem_total = mem->total / (long double) pu_mem.divisor; data.system.memory.swap_used = swap->used / (long double) pu_swap.divisor; data.system.memory.swap_total = swap->total / (long double) pu_swap.divisor; #endif /* HAS_LIBSTATGRAB */ /* Memory labels */ if(data.system.memory.mem_total > 0) { const int int_digits = std::log10(data.system.memory.mem_total) + 4; data.system.memory.used.value = string_format("%*.2Lf %s / %*.2Lf %s", int_digits, data.system.memory.mem_used, pu_mem.prefix, int_digits, data.system.memory.mem_total, pu_mem.prefix); data.system.memory.buffers.value = string_format("%*.2Lf %s / %*.2Lf %s", int_digits, data.system.memory.mem_buffers, pu_mem.prefix, int_digits, data.system.memory.mem_total, pu_mem.prefix); data.system.memory.cached.value = string_format("%*.2Lf %s / %*.2Lf %s", int_digits, data.system.memory.mem_cached, pu_mem.prefix, int_digits, data.system.memory.mem_total, pu_mem.prefix); data.system.memory.free.value = string_format("%*.2Lf %s / %*.2Lf %s", int_digits, data.system.memory.mem_free, pu_mem.prefix, int_digits, data.system.memory.mem_total, pu_mem.prefix); } if(data.system.memory.swap_total > 0) { const int int_digits = std::log10(data.system.memory.swap_total) + 4; data.system.memory.swap.value = string_format("%*.2Lf %s / %*.2Lf %s", int_digits, data.system.memory.swap_used, pu_swap.prefix, int_digits, data.system.memory.swap_total, pu_swap.prefix); } /* Uptime label */ if(uptime_s > 0) { tm = gmtime(&uptime_s); data.system.os.uptime.value = string_format(_("%i days, %i hours, %i minutes, %i seconds"), tm->tm_yday, tm->tm_hour, tm->tm_min, tm->tm_sec); } return err; } #endif /* HAS_LIBSYSTEM */ /* Compute all prime numbers in 'duration' seconds */ static void primes_bench(Data *data) { uint_fast64_t i, number; Data::Bench::PrimeNumbers *bench = data->bench.fast_mode ? static_cast(&data->bench.prime_fast) : static_cast(&data->bench.prime_slow); while(data->bench.is_running) { /* data->bench.number is shared by all threads */ number = (++bench->number); /* Slow mode: loop from i to number, prime if number == i Fast mode: loop from i to sqrt(number), prime if number mod i != 0 */ const uint_fast64_t sup = data->bench.fast_mode ? sqrt(number) : number; for(i = 2; (i < sup) && (number % i != 0); i++); if((data->bench.fast_mode && number % i) || (!data->bench.fast_mode && number == i)) bench->primes++; } } /* Stop all threads running benchmark */ static void stop_benchmarks(Data *data) { std::time_t start, end; /* Wait until the time is up or until user stops benchmark */ std::time(&start); while((data->bench.parameters.elapsed_i < (data->bench.parameters.duration_i * 60)) && data->bench.is_running) { std::this_thread::sleep_for(std::chrono::milliseconds(100)); std::time(&end); data->bench.parameters.elapsed_i = end - start; } if(data->bench.parameters.elapsed_i >= (data->bench.parameters.duration_i * 60)) data->bench.is_completed = true; /* Exit all threads */ data->bench.is_running = false; for(uint_fast16_t i = 0; i < data->bench.compute_threads.size(); i++) { data->bench.compute_threads[i].join(); MSG_DEBUG("stop_benchmarks: stopped thread #%u", i); } data->bench.compute_threads.clear(); } /* Report score of benchmarks */ static int benchmark_status(Data &data) { if(!data.bench.did_run) return 0; Data::Bench::PrimeNumbers *bench = data.bench.fast_mode ? static_cast(&data.bench.prime_fast) : static_cast(&data.bench.prime_slow); MSG_VERBOSE("%s", _("Updating benchmark status")); if(data.bench.is_running) { bench->state.value = _("Active"); bench->score.value = std::to_string(bench->primes) + " "; if(data.bench.parameters.duration_i * 60 - data.bench.parameters.elapsed_i > 60 * 59) bench->score.value += string_format(_("(%u hours left)"), (data.bench.parameters.duration_i - data.bench.parameters.elapsed_i / 60) / 60); else if(data.bench.parameters.duration_i * 60 - data.bench.parameters.elapsed_i >= 60) bench->score.value += string_format(_("(%u minutes left)"), data.bench.parameters.duration_i - data.bench.parameters.elapsed_i / 60); else bench->score.value += string_format(_("(%u seconds left)"), data.bench.parameters.duration_i * 60 - data.bench.parameters.elapsed_i); } else { bench->state.value = _("Inactive"); bench->score.value = std::to_string(bench->primes) + " "; if(data.bench.parameters.elapsed_i >= 60 * 60) bench->score.value += string_format(_("in %u hours"), data.bench.parameters.elapsed_i / 60 / 60); else if(data.bench.parameters.elapsed_i >= 60) bench->score.value += string_format(_("in %u minutes"), data.bench.parameters.elapsed_i / 60); else bench->score.value += string_format(_("in %u seconds"), data.bench.parameters.elapsed_i); } return 0; } /* Perform a multithreaded benchmark (compute prime numbers) */ void start_benchmarks(Data &data) { int err = 0; Data::Bench::PrimeNumbers *bench = data.bench.fast_mode ? static_cast(&data.bench.prime_fast) : static_cast(&data.bench.prime_slow); #ifdef __FreeBSD__ cpuset_t cpu_set; #else cpu_set_t cpu_set; #endif /* __FreeBSD__ */ MSG_VERBOSE(_("Starting benchmark with %u threads"), data.bench.parameters.threads_i); data.bench.did_run = true; data.bench.is_running = true; data.bench.is_completed = false; data.bench.parameters.elapsed_i = 0; bench->number = 2; bench->primes = 1; /* Start one thread per logical CPU */ for(uint_fast16_t i = 0; i < data.bench.parameters.threads_i; i++) { CPU_ZERO(&cpu_set); CPU_SET(i, &cpu_set); std::thread bench_thread(primes_bench, &data); MSG_DEBUG("start_benchmarks: started thread #%u", i); err += pthread_setaffinity_np(bench_thread.native_handle(), sizeof(cpu_set), &cpu_set); data.bench.compute_threads.push_back(std::move(bench_thread)); } std::thread timer_thread(stop_benchmarks, &data); timer_thread.detach(); if(err) MSG_ERROR("%s", _("an error occurred while starting benchmark")); } /* Set initial values for benchmarks */ static void init_benchmarks(Data &data) { data.bench.parameters.set_threads(data.bench.parameters.threads_i); data.bench.parameters.set_duration(data.bench.parameters.duration_i); data.bench.prime_slow.state.value = _("Inactive"); data.bench.prime_fast.state.value = _("Inactive"); } /************************* Fallback functions (static) *************************/ #if HAS_LIBCPUID /* If dmidecode fails to find CPU package, check in database */ static int cputab_package_fallback(Data &data) { int i = -1; const Package_DB *db; const auto& cpu_type = data.cpu.get_selected_cpu_type(); if(cpu_type.processor.codename.value.empty() || cpu_type.processor.specification.value.empty()) return 2; MSG_VERBOSE("%s", _("Finding CPU package in fallback mode")); switch(data.cpu.vendor) { case VENDOR_AMD: db = package_amd; break; case VENDOR_INTEL: db = package_intel; break; default: db = package_unknown; break; } MSG_DEBUG("cputab_package_fallback: codename %26s, specification %36s => values to find", cpu_type.processor.codename.value.c_str(), cpu_type.processor.specification.value.c_str()); while(db[++i].socket != NULL) { const bool codename_defined = (db[i].codename != NULL); const bool model_defined = (db[i].model != NULL); const bool codename_matchs = codename_defined && (cpu_type.processor.codename.value.find(db[i].codename) != std::string::npos); const bool model_matchs = model_defined && (cpu_type.processor.specification.value.find(db[i].model) != std::string::npos); if((codename_matchs && model_matchs) || (codename_matchs && !model_defined) || (!codename_defined && model_matchs)) { for(auto& cpu_type : data.cpu.cpu_types) cpu_type.processor.package.value = db[i].socket; MSG_DEBUG("cputab_package_fallback: codename %26s, specification %36s => entry #%03i matches", db[i].codename, db[i].model, i); return 0; } else MSG_DEBUG("cputab_package_fallback: codename %26s, specification %36s => entry #%03i does not match", db[i].codename, db[i].model, i); } MSG_WARNING(_("Your CPU socket is not present in the database ==> %s, codename: %s"), cpu_type.processor.specification.value.c_str(), cpu_type.processor.codename.value.c_str()); for(auto& cpu_type : data.cpu.cpu_types) cpu_type.processor.package.value.clear(); return 2; } #endif /* HAS_LIBCPUID */ /* Get minimum and maximum CPU multipliers */ static int cputab_multipliers_fallback(Data &data) noexcept { int err = 0; if(data.cpu.clocks.bus_freq <= 0.0) return 1; #ifdef __linux__ std::string min_freq_str, max_freq_str; const uint16_t current_core_id = data.cpu.get_selected_core_id(); MSG_VERBOSE("%s", _("Calculating CPU multipliers in fallback mode")); /* Minimum multiplier */ if(!(err = fopen_to_str(min_freq_str, "%s%i/cpufreq/cpuinfo_min_freq", SYS_CPU, current_core_id))) data.cpu.clocks.cpu_min_mult = (std::stod(min_freq_str) / 1e3) / data.cpu.clocks.bus_freq; /* Maximum multiplier */ if(!(err = fopen_to_str(max_freq_str, "%s%i/cpufreq/cpuinfo_max_freq", SYS_CPU, current_core_id))) data.cpu.clocks.cpu_max_mult = (std::stod(max_freq_str) / 1e3) / data.cpu.clocks.bus_freq; #endif /* __linux__ */ return err; } /* Retrieve missing Motherboard data if run as regular user */ static int motherboardtab_fallback([[maybe_unused]] Data &data) { int err = 0; #ifdef __linux__ MSG_VERBOSE("%s", _("Retrieving motherboard information in fallback mode")); /* Frame Board */ err += fopen_to_str(data.motherboard.board.manufacturer.value, "%s/%s", SYS_DMI, "board_vendor"); err += fopen_to_str(data.motherboard.board.model.value, "%s/%s", SYS_DMI, "board_name"); err += fopen_to_str(data.motherboard.board.revision.value, "%s/%s", SYS_DMI, "board_version"); /* Frame Bios */ err += fopen_to_str(data.motherboard.bios.brand.value, "%s/%s", SYS_DMI, "bios_vendor"); err += fopen_to_str(data.motherboard.bios.version.value, "%s/%s", SYS_DMI, "bios_version"); err += fopen_to_str(data.motherboard.bios.date.value, "%s/%s", SYS_DMI, "bios_date"); #endif /* __linux__ */ if(err) MSG_ERROR("%s", _("failed to retrieve motherboard information (fallback mode)")); return err; } /* Retrieve static data if other functions failed */ static int fallback_mode_static(Data &data) { int err = 0; #if HAS_LIBCPUID const auto& cpu_type = data.cpu.get_selected_cpu_type(); if((cpu_type.processor.package.value.empty() || (cpu_type.processor.package.value.find("CPU") != std::string::npos) || (cpu_type.processor.package.value.find("Microprocessor") != std::string::npos))) err += cputab_package_fallback(data); #endif /* HAS_LIBCPUID */ if((data.cpu.clocks.cpu_min_mult <= 0.0) || (data.cpu.clocks.cpu_max_mult <= 0.0)) err += cputab_multipliers_fallback(data); if(data.motherboard.board.manufacturer.value.empty() || data.motherboard.board.model.value.empty() || data.motherboard.board.revision.value.empty() || data.motherboard.bios.brand.value.empty() || data.motherboard.bios.version.value.empty() || data.motherboard.bios.date.value.empty()) err += motherboardtab_fallback(data); return err; } /************************* Fallback functions (dynamic) *************************/ /* Retrieve CPU temperature if run as regular user */ static int cputab_temp_fallback(Data &data) { int err = 0; auto& cpu_type = data.cpu.get_selected_cpu_type(); const uint16_t current_core_id = data.cpu.get_selected_core_id(); MSG_VERBOSE("%s", _("Retrieving CPU temperature in fallback mode")); #ifdef __linux__ std::string temperature; # if HAS_LIBCPUID static bool module_loaded = false; /* Load kernel modules */ if(!module_loaded) { if(data.cpu.vendor == VENDOR_INTEL) module_loaded = !load_module("coretemp", &data.socket_fd); else if((data.cpu.vendor == VENDOR_AMD) && (data.cpu.ext_family <= 0x8)) module_loaded = !load_module("k8temp", &data.socket_fd); else if((data.cpu.vendor== VENDOR_AMD) && (data.cpu.ext_family >= 0x10)) module_loaded = !load_module("k10temp", &data.socket_fd); } # endif /* HAS_LIBCPUID */ /* Get sensor path */ if(cpu_type.processor.path_cpu_temperature.empty()) cpu_type.processor.path_cpu_temperature = get_sensor_path_cpu_temperature_driver(current_core_id); if(cpu_type.processor.path_cpu_temperature.empty()) cpu_type.processor.path_cpu_temperature = get_sensor_path_cpu_temperature_generic(); /* Get temperature */ if(!cpu_type.processor.path_cpu_temperature.empty()) { if(!(err = fopen_to_str(temperature, "%s", cpu_type.processor.path_cpu_temperature.c_str()))) { const double tmp = std::stod(temperature); if(tmp > 0.0) cpu_type.processor.temperature.value = string_with_temperature_unit(tmp / 1e3); } } #else /* __linux__ */ /* Tested on FreeBSD 12: https://github.com/TheTumultuousUnicornOfDarkness/CPU-X/issues/121#issuecomment-575985765 */ int temperature; size_t len = sizeof(temperature); char name[MAXSTR]; snprintf(name, MAXSTR, "dev.cpu.%i.temperature", current_core_id); if(!(err = sysctlbyname(name, &temperature, &len, NULL, 0))) cpu_type.processor.temperature.value = string_with_temperature_unit(double(temperature - 2731) / 10.0); // decikelvins #endif /* __linux__ */ if(err) MSG_ERROR("%s", _("failed to retrieve CPU temperature (fallback mode)")); return err; } /* Retrieve CPU voltage if run as regular user */ static int cputab_volt_fallback([[maybe_unused]] Data &data) { int err = 0; #ifdef __linux__ std::string voltage; auto& cpu_type = data.cpu.get_selected_cpu_type(); const uint16_t current_core_id = data.cpu.get_selected_core_id(); MSG_VERBOSE("%s", _("Retrieving CPU voltage in fallback mode")); /* Get sensor path */ if(cpu_type.processor.path_cpu_voltage.empty()) cpu_type.processor.path_cpu_voltage = get_sensor_path_cpu_voltage(current_core_id); /* Get voltage */ if(!cpu_type.processor.path_cpu_voltage.empty()) if(!(err = fopen_to_str(voltage, "%s", cpu_type.processor.path_cpu_voltage.c_str()))) cpu_type.processor.voltage.value = string_format("%.3f V", std::stod(voltage) / 1e3); #endif /* __linux__ */ if(err) MSG_ERROR("%s", _("failed to retrieve CPU voltage (fallback mode)")); return err; } /* Retrieve CPU frequency if Libcpuid is missing */ static int cputab_freq_fallback([[maybe_unused]] Data &data) { int err = 0; #ifdef __linux__ std::string freq; const uint16_t current_core_id = data.cpu.get_selected_core_id(); MSG_VERBOSE("%s", _("Retrieving CPU frequency in fallback mode")); if(!(err = fopen_to_str(freq, "%s%i/cpufreq/scaling_cur_freq", SYS_CPU, current_core_id))) data.cpu.clocks.set_cpu_freq(std::round(std::stod(freq) / 1e3)); #endif /* __linux__ */ if(err) MSG_ERROR("%s", _("failed to retrieve CPU frequency (fallback mode)")); return err; } /* Retrieve dynamic data if other functions failed */ static int fallback_mode_dynamic(Data &data) { int err = 0; auto& cpu_type = data.cpu.get_selected_cpu_type(); /* CPU temperature */ static bool use_fallback_temp = Options::get_fallback_cpu_temp(); if((cpu_type.processor.temperature.value.empty()) || use_fallback_temp) { use_fallback_temp = true; err += err_func(cputab_temp_fallback, data); } /* CPU voltage */ static bool use_fallback_volt = Options::get_fallback_cpu_volt(); if((cpu_type.processor.voltage.value.empty()) || use_fallback_volt) { use_fallback_volt = true; err += err_func(cputab_volt_fallback, data); } /* CPU speed */ static bool use_fallback_freq = Options::get_fallback_cpu_freq(); if(data.cpu.clocks.core_speed.value.empty() || use_fallback_freq) { use_fallback_freq = true; err += err_func(cputab_freq_fallback, data); } return err; } /************************* Public functions *************************/ /* Fill labels by calling below functions */ int fill_labels(Data &data) { int err = 0; #if HAS_LIBCPUID err += call_libcpuid_static(data); if(DAEMON_UP) err += call_libcpuid_msr_static(data); #endif #if HAS_DMIDECODE if(DAEMON_UP) err += call_dmidecode(data); #endif #if HAS_LIBPCI err += find_devices(data); #endif err += system_static (data); err += fallback_mode_static(data); init_benchmarks(data); /* Call do_refresh() once to get dynamic values */ for(TabNumber tab_number = TAB_CPU; tab_number < TAB_ABOUT; tab_number = TabNumber(tab_number + 1)) err += do_refresh(data, tab_number); return err; } /* Refresh some labels */ int do_refresh(Data &data, TabNumber tab_number) { int err = 0; switch(tab_number) { case TAB_CPU: #if HAS_LIBCPUID err += err_func(call_libcpuid_dynamic, data); if(DAEMON_UP) err += err_func(call_libcpuid_msr_dynamic, data); #endif /* HAS_LIBCPUID */ err += err_func(cpu_usage, data); err += fallback_mode_dynamic(data); err += data.cpu.clocks.set_cpu_multiplier(); break; case TAB_CACHES: #if HAS_BANDWIDTH err += err_func(call_bandwidth, data); #endif /* HAS_BANDWIDTH */ break; case TAB_SYSTEM: #if HAS_LIBSYSTEM err += err_func(system_dynamic, data); #endif /* HAS_LIBSYSTEM */ break; case TAB_GRAPHICS: #if HAS_LIBPCI err += err_func(gpu_monitoring, data); #endif /* HAS_LIBPCI */ break; case TAB_BENCH: err += err_func(benchmark_status, data); break; default: break; } return err; } CPU-X-5.0.3/src/core.hpp000066400000000000000000000033701454622605200146140ustar00rootroot00000000000000/**************************************************************************** * Copyright © 2014-2024 The Tumultuous Unicorn Of Darkness * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * ****************************************************************************/ /* * PROJECT CPU-X * FILE core.hpp */ #ifndef _CORE_HPP_ #define _CORE_HPP_ #include "data.hpp" /***************************** External headers *****************************/ /* Load and apply settings from GSettings */ void load_settings(void); /* Start CPU-X in GTK mode */ int start_gui_gtk(Data &data); /* Start CPU-X in NCurses mode */ void start_tui_ncurses(Data &data); /************************* Public functions *************************/ /* Fill labels by calling core functions */ int fill_labels(Data &data); /* Refresh some labels */ int do_refresh(Data &data, TabNumber tab_number); /* Call Dmidecode through CPU-X but do nothing else */ int run_dmidecode(void); /* Call Bandwidth through CPU-X but do nothing else */ int run_bandwidth(void); /* Perform a multithreaded benchmark (compute prime numbers) */ void start_benchmarks(Data &data); #endif /* _CORE_HPP_ */ CPU-X-5.0.3/src/daemon.h000066400000000000000000000063101454622605200145640ustar00rootroot00000000000000/**************************************************************************** * Copyright © 2014-2024 The Tumultuous Unicorn Of Darkness * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * ****************************************************************************/ /* * PROJECT CPU-X * FILE daemon.h */ #ifndef _DAEMON_H_ #define _DAEMON_H_ #define DAEMON_UP (data.socket_fd >= 0) #ifndef MAXSTR # define MAXSTR 80 /* Max string */ #endif #define SEND_DATA(pfd, pdata, size) \ if(write(*pfd, pdata, size) == size) \ { \ MSG_DEBUG("daemon: writing %luB", size); \ } \ else \ { \ MSG_ERRNO("%s", "daemon: write error"); \ close(*pfd); \ *pfd = -1; \ return 1; \ } #define RECEIVE_DATA(pfd, pdata, size) \ if(read(*pfd, pdata, size) == size) \ { \ MSG_DEBUG("daemon: reading %luB", size); \ } \ else \ { \ MSG_ERRNO("%s", "daemon: read error"); \ close(*pfd); \ *pfd = -1; \ return 1; \ } typedef enum { LIBCPUID_MSR_DEBUG, LIBCPUID_MSR_STATIC, LIBCPUID_MSR_DYNAMIC, DMIDECODE, ACCESS_DEV_PCI, ACCESS_SYS_DEBUG, LOAD_MODULE, } DaemonCommand; typedef struct { int min_mult, max_mult, bclk; } MsrStaticData; typedef struct { int voltage, temp; } MsrDynamicData; typedef struct { char brand[MAXSTR], version[MAXSTR], date[MAXSTR], romsize[MAXSTR]; } DmidecodeBiosData; typedef struct { char manufacturer[MAXSTR], model[MAXSTR], revision[MAXSTR]; } DmidecodeMBData; typedef struct { double bus_freq; char cpu_package[MAXSTR]; } DmidecodeCPUData; typedef struct { char manufacturer[MAXSTR]; char part_number[MAXSTR]; char type[MAXSTR]; char type_detail[MAXSTR]; char device_locator[MAXSTR]; char bank_locator[MAXSTR]; char size[MAXSTR]; char rank[MAXSTR]; char speed_maximum[MAXSTR]; char speed_configured[MAXSTR]; char voltage_minimum[MAXSTR]; char voltage_maximum[MAXSTR]; char voltage_configured[MAXSTR]; } DmidecodeMemoryData; typedef struct { int ret; uint8_t stick_count; DmidecodeBiosData bios; DmidecodeMBData mb; DmidecodeCPUData processor; DmidecodeMemoryData *memory; } DmidecodeData; #endif /* _DAEMON_H_ */ CPU-X-5.0.3/src/daemon_client.cpp000066400000000000000000000137531454622605200164660ustar00rootroot00000000000000/**************************************************************************** * Copyright © 2014-2024 The Tumultuous Unicorn Of Darkness * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * ****************************************************************************/ /* * PROJECT CPU-X * FILE daemon_client.cpp */ #include #include #include #include #include #include #include #include #include #include "util.hpp" #include "daemon.h" #include "daemon_client.hpp" namespace fs = std::filesystem; static char *get_daemon_socket() { static char *socket = NULL; if(socket == NULL) { #ifdef FLATPAK asprintf(&socket, "%s/app/%s/%s", std::getenv("XDG_RUNTIME_DIR"), std::getenv("FLATPAK_ID"), SOCKET_NAME); #else asprintf(&socket, "%s", SOCKET_NAME); #endif /* FLATPAK */ } MSG_DEBUG("get_daemon_socket: socket_path=%s", socket); return socket; } /* Start daemon in background */ const char *start_daemon(bool graphical) { int wstatus = -1; pid_t pid; char const *msg = NULL; char const *daemon_args = get_daemon_socket(); MSG_VERBOSE("%s", _("Starting daemon in background…")); #ifdef FLATPAK std::string line, app_path, ld_library_path, ld_linux_path; std::ifstream stream("/.flatpak-info"); std::regex app_path_regex("^app-path=(.*?)$"); std::regex runtime_path_regex("^runtime-path=(.*?)$"); std::smatch match; while(std::getline(stream, line)) { if(std::regex_search(line, match, app_path_regex)) app_path = match[1].str() + "/lib/" + PRGNAME_LOW + "/" + DAEMON_EXEC; else if(std::regex_search(line, match, runtime_path_regex)) { std::string runtime_path = match[1].str() + "/lib/x86_64-linux-gnu"; ld_library_path = "LD_LIBRARY_PATH=" + runtime_path; ld_linux_path = runtime_path + "/ld-linux-x86-64.so.2"; } } char const *daemon_exec = app_path.c_str(); #else char const *appdir = std::getenv("APPDIR"); char const *daemon_exec = (appdir == NULL) ? DAEMON_PATH : DAEMON_TMP_EXEC; /* Hack to allow pkexec to run daemon (when running from AppImage) */ if(appdir != NULL) { const std::string appdir_daemon_path = std::string(appdir) + std::string(DAEMON_PATH); MSG_DEBUG("start_daemon: copy '%s' to '%s'", appdir_daemon_path.c_str(), daemon_exec); fs::copy(appdir_daemon_path, daemon_exec, fs::copy_options::overwrite_existing); } #endif /* FLATPAK */ pid = fork(); if(pid < 0) MSG_ERRNO("%s", "fork"); else if(pid == 0) { if(graphical) { const char* const args[] = { #ifdef FLATPAK "flatpak-spawn", "--host", #endif /* FLATPAK */ "pkexec", "--disable-internal-agent", #ifdef FLATPAK "env", // Add LD_LIBRARY_PATH environment variable ld_library_path.c_str(), // libraries in Flatpak runtime ld_linux_path.c_str(), // ld-linux in Flatpak runtime #endif /* FLATPAK */ daemon_exec, daemon_args, nullptr }; execvp_cpp(args[0], args); } else if(IS_ROOT) { const char* const args[] = { #ifdef FLATPAK "flatpak-spawn", "--host", "env", // Add LD_LIBRARY_PATH environment variable ld_library_path.c_str(), // libraries in Flatpak runtime ld_linux_path.c_str(), // ld-linux in Flatpak runtime #endif /* FLATPAK */ daemon_exec, daemon_args, nullptr }; execvp_cpp(args[0], args); } else { const char* const args[] = { #ifdef FLATPAK "flatpak-spawn", "--host", #endif /* FLATPAK */ "pkexec", #ifdef FLATPAK "env", // Add LD_LIBRARY_PATH environment variable ld_library_path.c_str(), // libraries in Flatpak runtime ld_linux_path.c_str(), // ld-linux in Flatpak runtime #endif /* FLATPAK */ daemon_exec, daemon_args, nullptr }; execvp_cpp(args[0], args); } } else waitpid(pid, &wstatus, 0); switch(WEXITSTATUS(wstatus)) { case 0: msg = NULL; // Normal status code break; case 126: msg = N_("pkexec: authorization could not be obtained (dialog dismissed)"); break; case 127: msg = N_("pkexec: authorization could not be obtained (not authorized)"); break; case 255: msg = N_("pkexec: command not found"); break; default: msg = N_("pkexec: unexpected error code"); break; } if(msg != NULL) MSG_WARNING("%s", _(msg)); return msg; } /* Check if daemon is running */ bool daemon_is_alive() { const fs::file_status status = fs::status(get_daemon_socket()); const fs::perms perms = status.permissions(); const bool is_socket = fs::is_socket(status); const bool perms_all = (perms == fs::perms::all); const bool is_alive = is_socket && perms_all; MSG_DEBUG("daemon_is_alive: is_socket=%i, perms_all=%i ==> ret=%i", is_socket, perms_all, is_alive); return is_alive; } /* Establish connection to daemon */ int connect_to_daemon(int &socket_fd) { std::string error_str; struct sockaddr_un addr; MSG_VERBOSE("%s", _("Connecting to daemon…")); /* Create local socket */ if((socket_fd = socket(AF_UNIX, SOCK_SEQPACKET, 0)) < 0) GOTO_ERROR("socket"); /* Connect socket to socket address */ memset(&addr, 0, sizeof(struct sockaddr_un)); addr.sun_family = AF_UNIX; strncpy(addr.sun_path, get_daemon_socket(), sizeof(addr.sun_path) - 1); if(connect(socket_fd, (const struct sockaddr*) &addr, sizeof(struct sockaddr_un)) < 0) GOTO_ERROR("connect"); return 0; error: MSG_ERRNO("failed to connect to daemon: %s", error_str.c_str()); if(socket_fd >= 0) close(socket_fd); return 1; } CPU-X-5.0.3/src/daemon_client.hpp000066400000000000000000000023331454622605200164630ustar00rootroot00000000000000/**************************************************************************** * Copyright © 2014-2024 The Tumultuous Unicorn Of Darkness * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * ****************************************************************************/ /* * PROJECT CPU-X * FILE daemon_client.hpp */ #ifndef _DAEMON_CLIENT_HPP_ #define _DAEMON_CLIENT_HPP_ /* Start daemon in background */ const char *start_daemon(bool graphical); /* Check if daemon is running */ bool daemon_is_alive(void); /* Establish connection to daemon */ int connect_to_daemon(int &socket_fd); #endif /* _DAEMON_CLIENT_HPP_ */ CPU-X-5.0.3/src/daemon_server.cpp000066400000000000000000000231771454622605200165170ustar00rootroot00000000000000/**************************************************************************** * Copyright © 2014-2024 The Tumultuous Unicorn Of Darkness * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * ****************************************************************************/ /* * PROJECT CPU-X * FILE daemon_server.cpp */ #include #include #include #include #include #include #include #include #include "util.hpp" #include "daemon.h" #include "daemon_server.hpp" #ifdef __linux__ # include #endif #if HAS_LIBCPUID # include #endif #if HAS_DMIDECODE # include "dmidecode/libdmidecode.h" #endif namespace fs = std::filesystem; static bool quit_loop = false; static ThreadsInfo ti; #if HAS_LIBCPUID /* Try to open a CPU MSR */ static int libcpuid_init_msr(int *fd, struct msr_driver_t **msr) { uint16_t current_core_id = 0; MSG_DEBUG("%s: fd=%i", __func__, *fd); read(*fd, ¤t_core_id, sizeof(uint16_t)); // Core 0 on failure if((*msr = cpu_msr_driver_open_core(current_core_id)) == NULL) { MSG_ERROR("cpu_msr_driver_open_core(%u) (%s)", current_core_id, cpuid_error()); return 2; } return 0; } static int __call_libcpuid_msr_debug(int *fd) { uint16_t current_core_id, all_cpu_count = 0; struct msr_driver_t *msr; MSG_DEBUG("%s: fd=%i", __func__, *fd); MSG_STDOUT("libcpuid version %s", cpuid_lib_version()); read(*fd, &all_cpu_count, sizeof(uint16_t)); // CPU count 0 on failure for(current_core_id = 0; current_core_id < all_cpu_count; current_core_id++) { MSG_STDOUT("______________ MSR CPU #%i ______________", current_core_id); if((msr = cpu_msr_driver_open_core(current_core_id)) == NULL) MSG_ERROR("cpu_msr_driver_open_core(%u) (%s)", current_core_id, cpuid_error()); else { msr_serialize_raw_data(msr, NULL); cpu_msr_driver_close(msr); } } return 0; } static int __call_libcpuid_msr_static(int *fd) { struct msr_driver_t *msr = NULL; MsrStaticData msg{}; msg.min_mult = CPU_INVALID_VALUE; msg.max_mult = CPU_INVALID_VALUE; msg.bclk = CPU_INVALID_VALUE; MSG_DEBUG("%s: fd=%i", __func__, *fd); if(!libcpuid_init_msr(fd, &msr)) { msg.min_mult = cpu_msrinfo(msr, INFO_MIN_MULTIPLIER); msg.max_mult = cpu_msrinfo(msr, INFO_MAX_MULTIPLIER); msg.bclk = cpu_msrinfo(msr, INFO_BCLK); cpu_msr_driver_close(msr); } SEND_DATA(fd, &msg, sizeof(MsrStaticData)); return 0; } static int __call_libcpuid_msr_dynamic(int *fd) { struct msr_driver_t *msr = NULL; MsrDynamicData msg{}; msg.voltage = CPU_INVALID_VALUE; msg.temp = CPU_INVALID_VALUE; MSG_DEBUG("%s: fd=%i", __func__, *fd); if(!libcpuid_init_msr(fd, &msr)) { msg.voltage = cpu_msrinfo(msr, INFO_VOLTAGE); msg.temp = cpu_msrinfo(msr, INFO_TEMPERATURE); cpu_msr_driver_close(msr); } SEND_DATA(fd, &msg, sizeof(MsrDynamicData)); return 0; } #endif /* HAS_LIBCPUID */ #if HAS_DMIDECODE static int __call_dmidecode(int *fd) { DmidecodeData msg{}; msg.ret = -1; msg.stick_count = 0; msg.processor.bus_freq = 0.0; msg.memory = NULL; MSG_DEBUG("%s: fd=%i", __func__, *fd); msg.ret = dmidecode(1, &msg); SEND_DATA(fd, &msg.ret, sizeof(int)); SEND_DATA(fd, &msg.processor, sizeof(DmidecodeCPUData)); SEND_DATA(fd, &msg.mb, sizeof(DmidecodeMBData)); SEND_DATA(fd, &msg.bios, sizeof(DmidecodeBiosData)); SEND_DATA(fd, &msg.stick_count, sizeof(uint8_t)); for(uint8_t i = 0; i < msg.stick_count; i++) SEND_DATA(fd, &msg.memory[i], sizeof(DmidecodeMemoryData)); return msg.ret; } #endif /* HAS_DMIDECODE */ #if HAS_LIBPCI static int __find_devices(int *fd) { int ret = -1; MSG_DEBUG("%s: fd=%i", __func__, *fd); #ifdef __FreeBSD__ std::error_code fs_code; fs::permissions(DEV_PCI, fs::perms::owner_read | fs::perms::owner_write | fs::perms::group_read | fs::perms::group_write | fs::perms::others_read | fs::perms::others_write, fs::perm_options::add, fs_code); // 0666 if(fs_code) ret = 1; #endif /* __FreeBSD__ */ SEND_DATA(fd, &ret, sizeof(int)); return ret; } #endif /* HAS_LIBPCI */ static int __can_access_sys_debug_dri(int *fd) { int ret = -1; MSG_DEBUG("%s: fd=%i", __func__, *fd); #ifdef __linux__ std::error_code fs_code; if(!fs::is_directory(SYS_DEBUG_DRI)) { fs::create_directory(SYS_DEBUG); mount("none", SYS_DEBUG, "debugfs", MS_NOSUID|MS_NODEV|MS_NOEXEC, ""); } fs::permissions(SYS_DEBUG, fs::perms::owner_all | fs::perms::group_exec | fs::perms::others_exec, fs::perm_options::add, fs_code); // 0711 if(fs_code) ret = 1; #endif /* __linux__ */ SEND_DATA(fd, &ret, sizeof(int)); return ret; } /* Load a kernel module */ static int __load_module(int *fd) { int ret = -1; ssize_t len; char *module = NULL; MSG_DEBUG("%s: fd=%i", __func__, *fd); RECEIVE_DATA(fd, &len, sizeof(ssize_t)); module = new char[len]; RECEIVE_DATA(fd, module, len); #if defined (__linux__) ret = run_command("modprobe %s 2> /dev/null", module); #elif defined (__DragonFly__) || defined (__FreeBSD__) || defined (__NetBSD__) || defined (__OpenBSD__) ret = run_command("kldload -n %s 2> /dev/null", module); #else # error "Unsupported operating system" #endif delete[] module; SEND_DATA(fd, &ret, sizeof(int)); return 0; } static void cleanup_thread(int fd) { ti.mutex.lock(); close(fd); ti.running_threads--; MSG_DEBUG("%s: fd=%i, %u clients are still alive", __func__, fd, ti.running_threads); ti.mutex.unlock(); } static void request_handler(int fd) { DaemonCommand cmd; MSG_DEBUG("%s: fd=%i", __func__, fd); while(42) { if(read(fd, &cmd, sizeof(DaemonCommand)) != sizeof(DaemonCommand)) break; switch(cmd) { #if HAS_LIBCPUID case LIBCPUID_MSR_DEBUG: __call_libcpuid_msr_debug(&fd); break; case LIBCPUID_MSR_STATIC: __call_libcpuid_msr_static(&fd); break; case LIBCPUID_MSR_DYNAMIC: __call_libcpuid_msr_dynamic(&fd); break; #endif /* HAS_LIBCPUID */ #if HAS_DMIDECODE case DMIDECODE: __call_dmidecode(&fd); break; #endif /* HAS_DMIDECODE */ #if HAS_LIBPCI case ACCESS_DEV_PCI: __find_devices(&fd); break; #endif /* HAS_LIBPCI */ case ACCESS_SYS_DEBUG: __can_access_sys_debug_dri(&fd); break; case LOAD_MODULE: __load_module(&fd); break; default: MSG_WARNING(_("request_handler: case %i not handled"), cmd); } } cleanup_thread(fd); } static void sighandler([[maybe_unused]] int __signum) { quit_loop = true; } int main(int argc, char *argv[]) { bool background = true; int listen_socket, data_socket, ret, err = EXIT_SUCCESS; pid_t pid; std::string error_str = "unknown"; struct sockaddr_un name; struct pollfd fds[NFDS]; if(argc < 2) { MSG_ERROR("%s requires socket path as argument.", argv[0]); return 1; } if(!IS_ROOT) { MSG_ERROR("%s cannot be executed as regular user.", argv[0]); return 1; } /* Check if daemon must run in foreground */ if(std::getenv("CPUX_DAEMON_BG")) background = ((std::atoi(std::getenv("CPUX_DAEMON_BG"))) > 0); if(std::getenv("CPUX_DAEMON_DEBUG")) if((std::atoi(std::getenv("CPUX_DAEMON_DEBUG"))) > 0) Logger::set_verbosity(LOG_DEBUG); /* Pre-initialization */ umask(0); fs::remove(argv[1]); std::signal(SIGINT, sighandler); std::signal(SIGTERM, sighandler); /* Logs */ if(background) { std::freopen(LOG_FILE, "w", stdout); std::setvbuf(stdout, NULL, _IONBF, 0); dup2(STDOUT_FILENO, STDERR_FILENO); } PRGINFO(stdout); /* Create local socket. */ if((listen_socket = socket(AF_UNIX, SOCK_SEQPACKET, 0)) < 0) GOTO_ERROR("socket"); /* Bind socket to socket name. */ memset(&name, 0, sizeof(struct sockaddr_un)); name.sun_family = AF_UNIX; std::strncpy(name.sun_path, argv[1], sizeof(name.sun_path) - 1); if(bind(listen_socket, (const struct sockaddr*) &name, sizeof(struct sockaddr_un)) < 0) GOTO_ERROR("bind"); /* Prepare for accepting connections. */ if(listen(listen_socket, SOMAXCONN) < 0) GOTO_ERROR("listen"); /* Initialize pollfd */ memset(fds, 0 , sizeof(fds)); fds[0].fd = listen_socket; fds[0].events = POLLIN; /* Fork daemon in background */ if(background) { pid = fork(); if(pid > 0) return 0; else if(pid < 0) GOTO_ERROR("fork"); } /* This is the main loop for handling connections */ while(!quit_loop) { /* Wait for incoming connection */ ret = poll(fds, NFDS, background ? POLL_TIMEOUT : -1); if(ret < 0) MSG_ERRNO("%s", "poll"); else if(ret == 0) // Timeout quit_loop = ti.running_threads == 0; else if(fds[0].revents & POLLIN) { if((data_socket = accept(listen_socket, NULL, NULL)) < 0) MSG_ERRNO("%s", "accept"); else { MSG_DEBUG("%s: fd=%i, %u clients", __func__, data_socket, ti.running_threads + 1); ti.mutex.lock(); std::thread thread(request_handler, data_socket); thread.detach(); ti.running_threads++; ti.threads.push_back(std::move(thread)); ti.mutex.unlock(); } } } goto clean; error: MSG_ERRNO("%s", error_str.c_str()); err = EXIT_FAILURE; clean: std::fclose(stdout); fs::remove(argv[1]); close(listen_socket); if(std::getenv("APPDIR") != NULL) fs::remove(DAEMON_TMP_EXEC); return err; } CPU-X-5.0.3/src/daemon_server.hpp000066400000000000000000000024351454622605200165160ustar00rootroot00000000000000/**************************************************************************** * Copyright © 2014-2024 The Tumultuous Unicorn Of Darkness * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * ****************************************************************************/ /* * PROJECT CPU-X * FILE daemon_server.hpp */ #ifndef _DAEMON_SERVER_HPP_ #define _DAEMON_SERVER_HPP_ #include #include #include #define POLL_TIMEOUT (5 * 1000) // 5 seconds #define NFDS 1 #define LOG_FILE "/tmp/cpu-x-daemon.log" struct ThreadsInfo { uint16_t running_threads = 0; std::mutex mutex; std::vector threads {}; }; #endif /* _DAEMON_SERVER_HPP_ */ CPU-X-5.0.3/src/data.cpp000066400000000000000000000503511454622605200145710ustar00rootroot00000000000000/**************************************************************************** * Copyright © 2014-2024 The Tumultuous Unicorn Of Darkness * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * ****************************************************************************/ /* * PROJECT CPU-X * FILE data.cpp */ #include #include #include #include "options.hpp" #include "util.hpp" #include "data.hpp" /* struct Tab */ Tab::Tab(std::string name) : name(name) { } void Tab::extend(Object *ext) { this->ext = ext; } std::ostream& operator<<(std::ostream& os, const Tab& tab) { const char *col_start = Options::get_color() ? BOLD_BLUE : ""; const char *col_end = Options::get_color() ? DEFAULT : ""; os << " " << col_start << ">>>>>>>>>> " << tab.name.c_str() << " <<<<<<<<<<" << col_end << std::endl << std::endl; return os; } /* struct Frame */ Frame::Frame() { } Frame::Frame(std::string name) : name(name) { } void Frame::extend(Object *ext) { this->ext = ext; } std::ostream& operator<<(std::ostream& os, const Frame& frame) { const char *col_start = Options::get_color() ? BOLD_BLUE : ""; const char *col_end = Options::get_color() ? DEFAULT : ""; os << "\t" << col_start << "***** " << frame.name.c_str() << " *****" << col_end << std::endl; return os; } /* struct MetaFrame */ MetaFrame::MetaFrame(std::string name) : Frame(name) { } std::ostream& operator<<(std::ostream& os, const MetaFrame& metaframe) { const char *col_start = Options::get_color() ? BOLD_BLUE : ""; const char *col_end = Options::get_color() ? DEFAULT : ""; os << " " << col_start << "####### " << metaframe.name.c_str() << " #######" << col_end << std::endl; return os; } /* struct Label */ Label::Label(std::string name) : name(name), value("") { } void Label::extend(Object *ext) { this->ext = ext; } std::ostream& operator<<(std::ostream& os, const Label& label) { os << std::setw(16) << label.name.c_str() << ": " << label.value << std::endl; return os; } /* struct Data */ std::ostream& operator<<(std::ostream& os, const Data& data) { os << static_cast(data.cpu); os << static_cast(data.caches); os << static_cast(data.motherboard); os << static_cast(data.memory); os << static_cast(data.system); os << static_cast(data.graphics); return os; } /* Data::Cpu */ Data::Cpu::Cpu() : Tab(_("CPU")) { } void Data::Cpu::grow_cpu_types_vector(uint8_t index, const char *purpose) { this->cpu_types.push_back({index, purpose}); } uint16_t Data::Cpu::get_selected_core_id() { return this->get_selected_cpu_type().footer.core_id_offset + Options::get_selected_core(); } uint16_t Data::Cpu::get_first_core_id_for_type(uint8_t cpu_type) { if(cpu_type < this->cpu_types.size()) return this->cpu_types.at(cpu_type).footer.core_id_offset; else return 0; } Data::Cpu::CpuType& Data::Cpu::get_selected_cpu_type() { /* Check that vector is not empty */ if(this->cpu_types.size() == 0) this->grow_cpu_types_vector(0, _("unknown")); return this->cpu_types.at(Options::get_selected_type()); } const std::string Data::Cpu::get_selected_cpu_type_formatted() { return this->get_selected_cpu_type().name; } const std::string Data::Cpu::get_selected_cpu_core_formatted() { return this->get_selected_cpu_type().get_core_formatted(Options::get_selected_core()); } std::ostream& operator<<(std::ostream& os, const Data::Cpu& cpu) { os << static_cast(cpu); os << static_cast(cpu.clocks); for(auto& cpu_type : cpu.cpu_types) { os << static_cast(cpu_type); os << static_cast(cpu_type); } os << std::endl; return os; } Data::Cpu::CpuType::CpuType(uint8_t index, const char *purpose) : MetaFrame(string_format(("#%u %s"), index, purpose)) { } const std::string Data::Cpu::CpuType::get_core_type_name() { #if HAS_LIBCPUID switch(this->purpose) { case PURPOSE_PERFORMANCE: return _("P-core"); case PURPOSE_EFFICIENCY: return _("E-core"); default: return _("Core"); } #endif /* HAS_LIBCPUID */ return _("Core"); } const std::string Data::Cpu::CpuType::get_core_formatted(uint16_t core) { return this->get_core_type_name() + " #" + std::to_string(core); } std::ostream& operator<<(std::ostream& os, const Data::Cpu::CpuType& cpu_type) { os << static_cast(cpu_type.processor); os << static_cast(cpu_type.caches); os << static_cast(cpu_type.footer); return os; } Data::Cpu::CpuType::Processor::Processor() : Frame(_("Processor")) { } std::string Data::Cpu::CpuType::Processor::format_cpuid_value(int32_t value) { if(Options::get_cpuid_decimal()) return string_format("%i", value); else return string_format("0x%X", value); } std::ostream& operator<<(std::ostream& os, const Data::Cpu::CpuType::Processor& processor) { os << static_cast(processor); os << static_cast(processor.vendor); os << static_cast(processor.codename); os << static_cast(processor.package); os << static_cast(processor.technology); os << static_cast(processor.voltage); os << static_cast(processor.specification); os << static_cast(processor.family); os << static_cast(processor.dispfamily); os << static_cast(processor.model); os << static_cast(processor.dispmodel); os << static_cast(processor.temperature); os << static_cast(processor.stepping); os << static_cast(processor.instructions); os << std::endl; return os; } Data::Cpu::CpuType::Caches::Caches() : Frame(_("Caches")) { } std::string Data::Cpu::CpuType::Caches::format_cache_level(int32_t instance_count, int32_t cache_size, char *unit, int32_t cache_assoc) { if(instance_count > 1) return string_format(_("%2d x %4d %s, %2d-way"), instance_count, cache_size, unit, cache_assoc); else return string_format(_("%d %s, %d-way"), cache_size, unit, cache_assoc); } std::ostream& operator<<(std::ostream& os, const Data::Cpu::CpuType::Caches& caches) { os << static_cast(caches); os << static_cast(caches.level1d); os << static_cast(caches.level1i); os << static_cast(caches.level2); os << static_cast(caches.level3); os << std::endl; return os; } Data::Cpu::CpuType::Footer::Footer() : Frame(_("Count")) { } std::ostream& operator<<(std::ostream& os, const Data::Cpu::CpuType::Footer& footer) { os << static_cast(footer); os << static_cast(footer.cores); os << static_cast(footer.threads); os << std::endl; return os; } Data::Cpu::Clocks::Clocks() : Frame(_("Clocks")) { } void Data::Cpu::Clocks::set_cpu_freq(int cpu_freq) { this->cpu_freq = cpu_freq; this->core_speed.value = string_format("%4i MHz", this->cpu_freq); } void Data::Cpu::Clocks::set_bus_freq(double bus_freq) { this->bus_freq = bus_freq; this->bus_speed.value = string_format("%.2f MHz", this->bus_freq); } int Data::Cpu::Clocks::set_cpu_multiplier() { if((this->cpu_freq <= 0) || (this->bus_freq <= 0.0)) return 1; const int fmt_min = (this->cpu_min_mult < 10) ? 1 : 0; const int fmt_max = (this->cpu_max_mult < 10) ? 1 : 0; const double cur_mult = double(this->cpu_freq) / this->bus_freq; if((this->cpu_min_mult <= 0.0) && (this->cpu_max_mult <= 0.0)) this->multiplier.value = string_format("x %.2f", cur_mult); else { this->multiplier.value = string_format("x%4.1f", cur_mult); this->multiplier.value += " ("; this->multiplier.value += (this->cpu_min_mult <= 0.0) ? "?" : string_format("%.*f", fmt_min, this->cpu_min_mult); this->multiplier.value += "-"; this->multiplier.value += (this->cpu_max_mult <= 0.0) ? "?" : string_format("%.*f", fmt_max, this->cpu_max_mult); this->multiplier.value += ")"; } return 0; } std::ostream& operator<<(std::ostream& os, const Data::Cpu::Clocks& clocks) { os << static_cast(clocks); os << static_cast(clocks.core_speed); os << static_cast(clocks.multiplier); os << static_cast(clocks.bus_speed); os << static_cast(clocks.usage); os << std::endl; return os; } /* Data::Caches */ Data::Caches::Caches() : Tab(_("Caches")) { } void Data::Caches::grow_cpu_types_vector(uint8_t index, const char *purpose) { this->cpu_types.push_back({index, purpose}); } Data::Caches::CpuType& Data::Caches::get_selected_cpu_type() { /* Check that vector is not empty */ if(this->cpu_types.size() == 0) this->grow_cpu_types_vector(0, _("unknown")); return this->cpu_types.at(Options::get_selected_type()); } std::ostream& operator<<(std::ostream& os, const Data::Caches& caches) { if(caches.cpu_types.size() > 0) { os << static_cast(caches); for(auto& cpu_type : caches.cpu_types) { os << static_cast(cpu_type); os << static_cast(cpu_type); } os << std::endl; } return os; } Data::Caches::CpuType::CpuType(uint8_t index, const char *purpose) : MetaFrame(string_format(("#%u %s"), index, purpose)) { } void Data::Caches::CpuType::grow_caches_vector_with_cache_size(uint8_t level, uint32_t size_i, const char *cache_size, int32_t cache_line, char *unit) { this->caches.push_back({level, size_i, cache_size, cache_line, unit}); } std::ostream& operator<<(std::ostream& os, const Data::Caches::CpuType& cpu_type) { if(cpu_type.caches.size() > 0) for(auto& cache : cpu_type.caches) os << static_cast(cache); return os; } Data::Caches::CpuType::Cache::Cache(uint8_t level) : Frame(string_format(_("L%u Cache"), level)) { } Data::Caches::CpuType::Cache::Cache(uint8_t level, uint32_t size_i, const char *cache_size, int32_t cache_line, char *unit) : Frame(string_format(_("L%u Cache"), level)) { this->size.value = string_format(_("%s associative, %d-%s line size"), cache_size, cache_line, unit); this->size_i = size_i; } std::ostream& operator<<(std::ostream& os, const Data::Caches::CpuType::Cache& cache) { os << static_cast(cache); os << static_cast(cache.size); os << static_cast(cache.speed); os << std::endl; return os; } Data::Caches::Test::Test() : Frame(_("Test")) { } const std::string Data::Caches::Test::get_selected_test_formatted() { return this->names.at(Options::get_selected_test()); } /* Data::Motherboard */ Data::Motherboard::Motherboard() : Tab(_("Motherboard")) { } std::ostream& operator<<(std::ostream& os, const Data::Motherboard& motherboard) { os << static_cast(motherboard); os << static_cast(motherboard.board); os << static_cast(motherboard.bios); os << static_cast(motherboard.chipset); os << std::endl; return os; } Data::Motherboard::Board::Board() : Frame(_("Motherboard")) { } std::ostream& operator<<(std::ostream& os, const Data::Motherboard::Board& board) { os << static_cast(board); os << static_cast(board.manufacturer); os << static_cast(board.model); os << static_cast(board.revision); os << std::endl; return os; } Data::Motherboard::Bios::Bios() : Frame(_("BIOS")) { } std::ostream& operator<<(std::ostream& os, const Data::Motherboard::Bios& bios) { os << static_cast(bios); os << static_cast(bios.brand); os << static_cast(bios.version); os << static_cast(bios.date); os << static_cast(bios.romsize); os << std::endl; return os; } Data::Motherboard::Chipset::Chipset() : Frame(_("Chipset")) { } std::ostream& operator<<(std::ostream& os, const Data::Motherboard::Chipset& chipset) { os << static_cast(chipset); os << static_cast(chipset.vendor); os << static_cast(chipset.model); os << std::endl; return os; } /* Data::Memory */ Data::Memory::Memory() : Tab(_("Memory")) { } std::ostream& operator<<(std::ostream& os, const Data::Memory& memory) { if(memory.sticks.size() > 0) { os << static_cast(memory); for(auto& stick : memory.sticks) os << static_cast(stick); os << std::endl; } return os; } Data::Memory::Stick::Stick(uint8_t number) : Frame(string_format(_("Stick %u"), number)) { } Data::Memory::Footer::Footer() : Frame(_("Sticks")) { } void Data::Memory::grow_sticks_vector() { const auto len = this->sticks.size(); this->sticks.push_back(len); } Data::Memory::Stick& Data::Memory::get_selected_stick() { /* Check selected stick is a valid index */ Options::set_selected_stick(Options::get_selected_stick(), this->sticks.size()); /* Check that vector is not empty */ if(this->sticks.size() == 0) this->grow_sticks_vector(); return this->sticks.at(Options::get_selected_stick()); } const std::string Data::Memory::get_stick_formatted(uint8_t stick) { if(stick < this->sticks.size()) return "#" + std::to_string(stick) + ": " + this->sticks.at(stick).manufacturer.value + " " + this->sticks.at(stick).part_number.value; else return std::string(); } const std::string Data::Memory::get_selected_stick_formatted() { return this->get_stick_formatted(Options::get_selected_stick()); } std::ostream& operator<<(std::ostream& os, const Data::Memory::Stick& stick) { os << static_cast(stick); os << static_cast(stick.manufacturer); os << static_cast(stick.part_number); os << static_cast(stick.type); os << static_cast(stick.type_detail); os << static_cast(stick.device_locator); os << static_cast(stick.bank_locator); os << static_cast(stick.rank); os << static_cast(stick.size); os << static_cast(stick.speed); os << static_cast(stick.voltage); os << std::endl; return os; } /* Data::System */ Data::System::System() : Tab(_("System")) { } std::ostream& operator<<(std::ostream& os, const Data::System& system) { os << static_cast(system); os << static_cast(system.os); os << static_cast(system.memory); os << std::endl; return os; } Data::System::OperatingSystem::OperatingSystem() : Frame(_("Operating System")) { } std::ostream& operator<<(std::ostream& os, const Data::System::OperatingSystem& operatingsystem) { os << static_cast(operatingsystem); os << static_cast(operatingsystem.name); os << static_cast(operatingsystem.kernel); os << static_cast(operatingsystem.hostname); os << static_cast(operatingsystem.uptime); os << std::endl; return os; } Data::System::Memory::Memory() : Frame(_("Memory")) { } std::ostream& operator<<(std::ostream& os, const Data::System::Memory& memory) { os << static_cast(memory); os << static_cast(memory.used); os << static_cast(memory.buffers); os << static_cast(memory.cached); os << static_cast(memory.free); os << static_cast(memory.swap); os << std::endl; return os; } /* Data::Graphics */ Data::Graphics::Graphics() : Tab(_("Graphics")) { } void Data::Graphics::grow_cards_vector() { const auto len = this->cards.size(); this->cards.push_back(len); } Data::Graphics::Card& Data::Graphics::get_selected_card() { /* Check selected card is a valid index */ Options::set_selected_gpu(Options::get_selected_gpu(), this->cards.size()); /* Check that vector is not empty */ if(this->cards.size() == 0) this->grow_cards_vector(); return this->cards.at(Options::get_selected_gpu()); } std::ostream& operator<<(std::ostream& os, const Data::Graphics& graphics) { if(graphics.cards.size() > 0) { os << static_cast(graphics); for(auto& card : graphics.cards) os << static_cast(card); os << std::endl; } return os; } Data::Graphics::Card::Card(uint8_t number) : Frame(string_format(_("Card %u"), number)) { } Data::Graphics::Footer::Footer() : Frame(_("Cards")) { } const std::string Data::Graphics::get_card_formatted(uint8_t card) { if(card < this->cards.size()) return "#" + std::to_string(card) + ": " + this->cards.at(card).model.value; else return std::string(); } const std::string Data::Graphics::get_selected_card_formatted() { return this->get_card_formatted(Options::get_selected_gpu()); } std::ostream& operator<<(std::ostream& os, const Data::Graphics::Card& card) { os << static_cast(card); os << static_cast(card.vendor); os << static_cast(card.kernel_driver); os << static_cast(card.user_mode_driver); os << static_cast(card.model); os << static_cast(card.comp_unit); os << static_cast(card.device_id); os << static_cast(card.vbios_version); os << static_cast(card.interface); os << static_cast(card.temperature); os << static_cast(card.usage); os << static_cast(card.core_voltage); os << static_cast(card.power_avg); os << static_cast(card.core_clock); os << static_cast(card.mem_clock); os << static_cast(card.mem_used); os << static_cast(card.resizable_bar); os << static_cast(card.vulkan_rt); os << static_cast(card.opengl_version); os << static_cast(card.vulkan_version); os << static_cast(card.opencl_version); os << std::endl; return os; } /* Data::Bench */ Data::Bench::Bench() : Tab(_("Bench")) { } Data::Bench::~Bench() { /* Cleanup done by stop_benchmarks() */ if(this->is_running) this->is_running = false; } Data::Bench::PrimeNumbers::PrimeNumbers(std::string name) : Frame(name) { this->score.value = _("Not started"); } Data::Bench::PrimeSlow::PrimeSlow() : PrimeNumbers(_("Prime numbers (slow)")) { } Data::Bench::PrimeFast::PrimeFast() : PrimeNumbers(_("Prime numbers (fast)")) { } Data::Bench::Parameters::Parameters() : Frame(_("Parameters")) { } bool Data::Bench::Parameters::set_threads(uint_fast16_t threads) { if((threads > 0) && (threads <= std::thread::hardware_concurrency())) { this->threads_i = threads; this->threads.value = std::to_string(this->threads_i); return true; } else { this->threads_i = 1; this->threads.value = std::to_string(this->threads_i); return false; } } bool Data::Bench::Parameters::set_duration(uint_fast32_t duration) { if((duration > 0) && (duration < 60 * 24)) { this->duration_i = duration; this->duration.value = string_format(_("%u mins"), this->duration_i); return true; } else { this->duration_i = 1; this->duration.value = string_format(_("%u mins"), this->duration_i); return false; } } /* Data::About */ Data::About::About() : Tab(_("About")) { } Data::About::Description::Description() : text(string_format(_("%s is a Free software that gathers information\n" "on CPU, motherboard and more."), PRGNAME)) { } Data::About::AboutCpuX::AboutCpuX() : Frame(_("About CPU-X")), version(string_format(_("Version %s"), PRGVER)), author(string_format(_("Author: %s"), PRGAUTH)), website(string_format(_("Site: %s"), PRGURL)) { } Data::About::License::License() : Frame(_("License")), copyright(PRGCPRGHT), name(string_format(_("This software is distributed under the terms of %s"), PRGLCNS)), warranty(_("This program comes with ABSOLUTELY NO WARRANTY")) { } CPU-X-5.0.3/src/data.hpp000066400000000000000000000277101454622605200146010ustar00rootroot00000000000000/**************************************************************************** * Copyright © 2014-2024 The Tumultuous Unicorn Of Darkness * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * ****************************************************************************/ /* * PROJECT CPU-X * FILE data.hpp */ #ifndef _DATA_HPP_ #define _DATA_HPP_ #include #include #include #include #include #include #include "util.hpp" #if HAS_LIBCPUID # include #endif /* HAS_LIBCPUID */ class Object { }; struct Tab { const std::string name; Object *ext; Tab(std::string name); void extend(Object *ext); friend std::ostream& operator<<(std::ostream& os, const Tab& t); }; struct Frame { const std::string name; Object *ext; Frame(); Frame(std::string name); void extend(Object *ext); friend std::ostream& operator<<(std::ostream& os, const Frame& frame); }; struct MetaFrame : public Frame { MetaFrame(std::string name); friend std::ostream& operator<<(std::ostream& os, const MetaFrame& metaframe); }; struct Label { const std::string name; std::string value; Object *ext; Label(std::string name); void extend(Object *ext); friend std::ostream& operator<<(std::ostream& os, const Label& label); }; struct Data { int socket_fd = -1; bool reload = false; struct Cpu : public Tab { char *cpuid_raw_file = NULL; #if HAS_LIBCPUID cpu_vendor_t vendor; int32_t ext_family; #endif /* HAS_LIBCPUID */ struct CpuType : public MetaFrame { #if HAS_LIBCPUID cpu_purpose_t purpose; #endif /* HAS_LIBCPUID */ struct Processor : public Frame { Label vendor {_("Vendor")}; Label codename {_("Code Name")}; Label package {_("Package")}; Label technology {_("Technology")}; Label voltage {_("Voltage")}; Label specification {_("Specification")}; Label family {_("Family")}; Label dispfamily {_("Disp. Family")}; Label model {_("Model")}; Label dispmodel {_("Disp. Model")}; Label temperature {_("Temp.")}; Label stepping {_("Stepping")}; Label instructions {_("Instructions")}; std::string path_cpu_temperature {}; std::string path_cpu_voltage {}; Processor(); static std::string format_cpuid_value(int32_t value); friend std::ostream& operator<<(std::ostream& os, const Processor& processor); } processor; struct Caches : public Frame { Label level1d {_("L1 Data")}; Label level1i {_("L1 Inst.")}; Label level2 {_("Level 2")}; Label level3 {_("Level 3")}; Caches(); static std::string format_cache_level(int32_t instance_count, int32_t cache_size, char *unit, int32_t cache_assoc); friend std::ostream& operator<<(std::ostream& os, const Caches& caches); } caches; struct Footer : public Frame { Label cores {_("Cores")}; Label threads {_("Threads")}; uint16_t num_threads = 0; uint16_t core_id_offset = 0; Footer(); friend std::ostream& operator<<(std::ostream& os, const Footer& footer); } footer; CpuType(uint8_t index, const char *purpose); const std::string get_core_type_name(); const std::string get_core_formatted(uint16_t core); friend std::ostream& operator<<(std::ostream& os, const CpuType& cpu_type); }; std::vector cpu_types {}; struct Clocks : public Frame { Label core_speed {_("Core Speed")}; Label multiplier {_("Multiplier")}; Label bus_speed {_("Bus Speed")}; Label usage {_("Usage")}; int cpu_freq = 0; double bus_freq = 0.0; double cpu_min_mult = 0.0; double cpu_max_mult = 0.0; std::vector cpu_time_stat; Clocks(); void set_cpu_freq(int cpu_freq); void set_bus_freq(double bus_freq); int set_cpu_multiplier(); friend std::ostream& operator<<(std::ostream& os, const Clocks& clocks); } clocks; Cpu(); void grow_cpu_types_vector(uint8_t index, const char *purpose); uint16_t get_selected_core_id(); uint16_t get_first_core_id_for_type(uint8_t cpu_type); CpuType& get_selected_cpu_type(); const std::string get_selected_cpu_type_formatted(); const std::string get_selected_cpu_core_formatted(); friend std::ostream& operator<<(std::ostream& os, const Cpu& cpu); } cpu; struct Caches : public Tab { struct CpuType : public MetaFrame { struct Cache : public Frame { Label size {_("Size")}; Label speed {_("Speed")}; uint32_t size_i, speed_i; Cache(uint8_t level); Cache(uint8_t level, uint32_t size_i, const char *cache_size, int32_t cache_line, char *unit); friend std::ostream& operator<<(std::ostream& os, const Cache& cache); }; enum CacheLevels { L1, L2, L3, L4 }; std::vector caches {}; CpuType(uint8_t index, const char *purpose); void grow_caches_vector_with_cache_size(uint8_t level, uint32_t size_i, const char *cache_size, int32_t cache_line, char *unit); friend std::ostream& operator<<(std::ostream& os, const CpuType& cpu_type); }; std::vector cpu_types {}; struct Test : public Frame { std::vector names {}; Test(); const std::string get_selected_test_formatted(); } test; Caches(); void grow_cpu_types_vector(uint8_t index, const char *purpose); CpuType& get_selected_cpu_type(); friend std::ostream& operator<<(std::ostream& os, const Caches& caches); } caches; struct Motherboard : public Tab { struct Board : public Frame { Label manufacturer {_("Manufacturer")}; Label model {_("Model")}; Label revision {_("Revision")}; Board(); friend std::ostream& operator<<(std::ostream& os, const Board& board); } board; struct Bios : public Frame { Label brand {_("Brand")}; Label version {_("Version")}; Label date {_("Date")}; Label romsize {_("ROM Size")}; Bios(); friend std::ostream& operator<<(std::ostream& os, const Bios& bios); } bios; struct Chipset : public Frame { Label vendor {_("Vendor")}; Label model {_("Model")}; Chipset(); friend std::ostream& operator<<(std::ostream& os, const Chipset& chipset); } chipset; Motherboard(); friend std::ostream& operator<<(std::ostream& os, const Motherboard& motherboard); } motherboard; struct Memory : public Tab { struct Stick : public Frame { Label manufacturer {_("Manufacturer")}; Label part_number {_("Part Number")}; Label type {_("Type")}; Label type_detail {_("Type Detail")}; Label device_locator {_("Device Locator")}; Label bank_locator {_("Bank Locator")}; Label size {_("Size")}; Label rank {_("Rank")}; Label speed {_("Speed")}; Label voltage {_("Voltage")}; Stick(uint8_t number); friend std::ostream& operator<<(std::ostream& os, const Stick& stick); }; std::vector sticks {}; struct Footer : public Frame { Footer(); } footer; Memory(); void grow_sticks_vector(); Data::Memory::Stick& get_selected_stick(); const std::string get_stick_formatted(uint8_t stick); const std::string get_selected_stick_formatted(); friend std::ostream& operator<<(std::ostream& os, const Memory& memory); } memory; struct System : public Tab { struct OperatingSystem : public Frame { Label name {_("Name")}; Label kernel {_("Kernel")}; Label hostname {_("Hostname")}; Label uptime {_("Uptime")}; OperatingSystem(); friend std::ostream& operator<<(std::ostream& os, const OperatingSystem& operatingsystem); } os; struct Memory : public Frame { Label used {_("Used")}; Label buffers {_("Buffers")}; Label cached {_("Cached")}; Label free {_("Free")}; Label swap {_("Swap")}; long double mem_used, mem_buffers, mem_cached, mem_free, mem_total; long double swap_used, swap_total; Memory(); friend std::ostream& operator<<(std::ostream& os, const Memory& memory); } memory; System(); friend std::ostream& operator<<(std::ostream& os, const System& system); } system; struct Graphics : public Tab { struct Card : public Frame { enum GpuDrv { GPUDRV_FGLRX, GPUDRV_AMDGPU, GPUDRV_RADEON, // AMD GPUDRV_INTEL, // Intel GPUDRV_NVIDIA, GPUDRV_NVIDIA_BUMBLEBEE, GPUDRV_NOUVEAU, GPUDRV_NOUVEAU_BUMBLEBEE, // NVIDIA GPUDRV_VFIO, GPUDRV_UNKNOWN }; Label vendor {_("Vendor")}; Label kernel_driver {_("Driver")}; Label user_mode_driver {_("UMD Version")}; Label model {_("Model")}; Label comp_unit {_("Compute Unit")}; Label device_id {_("Device ID")}; Label vbios_version {_("VBIOS Version")}; Label interface {_("Interface")}; Label temperature {_("Temperature")}; Label usage {_("Usage")}; Label core_voltage {_("Core Voltage")}; Label power_avg {_("Power Avg")}; Label core_clock {_("Core Clock")}; Label mem_clock {_("Memory Clock")}; Label mem_used {_("Memory Used")}; Label resizable_bar {_("Resizable BAR")}; Label vulkan_rt {_("Vulkan RT")}; Label opengl_version {_("OpenGL Version")}; Label vulkan_version {_("Vulkan Version")}; Label opencl_version {_("OpenCL Version")}; int drm_card_number = -1; uint64_t vram_size = 0; std::string device_path{}; std::string drm_path {}; std::string hwmon_path {}; GpuDrv driver {GPUDRV_UNKNOWN}; Card(uint8_t number); friend std::ostream& operator<<(std::ostream& os, const Card& card); }; std::vector cards {}; struct Footer : public Frame { Footer(); } footer; Graphics(); void grow_cards_vector(); Card& get_selected_card(); const std::string get_card_formatted(uint8_t card); const std::string get_selected_card_formatted(); friend std::ostream& operator<<(std::ostream& os, const Graphics& graphics); } graphics; struct Bench : public Tab { bool did_run = false; bool is_running = false; bool is_completed = false; bool fast_mode = false; std::vector compute_threads {}; struct PrimeNumbers : public Frame { Label score {_("Score")}; Label state {_("Run")}; std::atomic_uint_fast32_t primes = 0; std::atomic_uint_fast64_t number = 0; PrimeNumbers(std::string name); }; struct PrimeSlow : public PrimeNumbers { PrimeSlow(); } prime_slow; struct PrimeFast : public PrimeNumbers { PrimeFast(); } prime_fast; struct Parameters : public Frame { Label duration{_("Duration")}; Label threads {_("Threads")}; uint_fast16_t threads_i = 1; uint_fast32_t elapsed_i = 0; uint_fast32_t duration_i = 1; Parameters(); bool set_threads(uint_fast16_t threads); bool set_duration(uint_fast32_t duration); } parameters; Bench(); ~Bench(); } bench; struct About : public Tab { struct Description : public Frame { const std::string text; Description(); } description; struct AboutCpuX : public Frame { const std::string version; const std::string author; const std::string website; AboutCpuX(); } about; struct License : public Frame { const std::string copyright; const std::string name; const std::string warranty; License(); } license; About(); } about; friend std::ostream& operator<<(std::ostream& os, const Data& data); }; #endif /* _DATA_HPP_ */ CPU-X-5.0.3/src/databases.h000066400000000000000000000445341454622605200152620ustar00rootroot00000000000000/**************************************************************************** * Copyright © 2014-2024 The Tumultuous Unicorn Of Darkness * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * ****************************************************************************/ /* * PROJECT CPU-X * FILE databases.h */ #ifndef _DATABASES_H_ #define _DATABASES_H_ /****************************** CPU Technology ******************************/ typedef struct { const int32_t cpu_model; const int32_t cpu_ext_model; const int32_t cpu_ext_family; const char *process; } Technology_DB; const Technology_DB technology_unknown[] = { { -2, -2, -2, NULL } }; const Technology_DB technology_intel[] = { //Model E. Model E. Family Process { 0, 0, -1, "0.18 µm" }, // P4 Willamette { 1, 1, 6, "0.35 µm" }, // Pentium Pro { 1, 1, 15, "0.18 µm" }, // P4 Willamette { 2, 2, -1, "0.13 µm" }, // P4 Northwood / Gallatin { 3, 3, 5, "0.35 µm" }, // PII Overdrive { 3, 3, 6, "0.35 µm" }, // PII Klamath { 3, 3, 15, "90 nm" }, // P4 Prescott { 4, 4, -1, "90 nm" }, // P4 Prescott/Irwindale / PD Smithfield { 5, 5, 6, "0.25 µm" }, // PII Deschutes / Tonga / Xeon Drake / Celeron Covington { 5, 37, -1, "32 nm" }, // Westmere { 5, 53, -1, "32 nm" }, // Atom Cloverview { 5, 69, -1, "22 nm" }, // Haswell { 5, 85, -1, "14 nm" }, // Skylake-X / Skylake-W / Skylake-DE / Skylake-SP / Cascade Lake-X / Cascade Lake-W / Cascade Lake-SP { 5, 165, 6, "14 nm" }, // Comet Lake { 6, 6, 6, "0.25 µm" }, // PII Dixon / Celeron Mendocino { 6, 6, 15, "65 nm" }, // P4 Cedar Mill / PD Presler { 6, 22, -1, "65 nm" }, // C2 Conroe-L { 6, 54, -1, "32 nm" }, // Atom Cedarview { 6, 70, -1, "22 nm" }, // Haswell (Crystalwell, L4 cache) { 6, 102, -1, "10 nm" }, // Cannon Lake { 6, 150, -1, "10 nm" }, // Tremont (Elkhart Lake) { 7, 7, -1, "0.25 µm" }, // PIII Katmai { 7, 23, -1, "45 nm" }, // C2 Wolfdale / Yorkfield / Penryn { 7, 55, -1, "22 nm" }, // Atom Bay Trail { 7, 71, -1, "14 nm" }, // Broadwell { 7, 151, -1, "Intel 7" }, // Alder Lake-S / Alder Lake-HX { 7, 167, -1, "14 nm" }, // Rocket Lake { 7, 183, -1, "Intel 7" }, // Raptor Lake-S / Raptor Lake-HX { 8, 0, 0, "0.18 µm" }, // PIII Coppermine-T { 8, 8, -1, "0.18 µm" }, // PIII Coppermine { 9, 9, -1, "0.13 µm" }, // Pentium M Banias { 10, 26, -1, "45 nm" }, // Nehalem { 10, 30, -1, "45 nm" }, // Nehalem { 10, 42, -1, "32 nm" }, // Sandy Bridge { 10, 58, -1, "22 nm" }, // Ivy Bridge { 10, 106, -1, "10 nm" }, // Ice Lake-D / Ice Lake-W / Ice Lake-SP { 10, 122, -1, "14 nm" }, // Gemini Lake { 10, 138, -1, "10 nm" }, // Tremont (Lakefield) { 10, 154, -1, "Intel 7" }, // Alder Lake-P / Alder Lake-H { 10, 186, -1, "Intel 7" }, // Raptor Lake-P / Raptor Lake-U / Raptor Lake-H { 11, 11, -1, "0.13 µm" }, // PIII Tualatine { 12, 28, -1, "45 nm" }, // Atom Diamondville / Pineview / Silverthorne { 12, 44, -1, "32 nm" }, // Westmere { 12, 60, -1, "22 nm" }, // Haswell { 12, 76, -1, "14 nm" }, // Atom Cherry Trail { 12, 92, -1, "14 nm" }, // Apollo Lake { 12, 108, -1, "10 nm" }, // Ice Lake { 12, 140, -1, "10SF" }, // Tiger Lake { 12, 156, -1, "10 nm" }, // Tremont (Jasper Lake) { 13, 13, -1, "90 nm" }, // Pentium M Dothan { 13, 45, -1, "32 nm" }, // Sandy Bridge-E { 13, 61, -1, "14 nm" }, // Broadwell-U { 14, 14, -1, "65 nm" }, // Yonah (Core Solo) { 14, 30, -1, "45 nm" }, // Nehalem (Lynnfield) { 14, 62, -1, "22 nm" }, // Ivy Bridge-E { 14, 78, -1, "14 nm" }, // Skylake { 14, 94, -1, "14 nm" }, // Skylake { 14, 126, -1, "10 nm" }, // Ice Lake { 14, 142, -1, "14 nm" }, // Kaby Lake / Coffee Lake / Comet Lake-U { 14, 158, -1, "14 nm" }, // Kaby Lake / Coffee Lake { 14, 165, -1, "14 nm" }, // Comet Lake { 14, 190, -1, "Intel 7" }, // Alder Lake-N { 15, 15, -1, "65 nm" }, // C2 Conroe / Allendale / Kentsfield / Merom { 15, 63, -1, "22 nm" }, // Haswell-E { 15, 79, -1, "14 nm" }, // Broadwell-E { 15, 143, -1, "Intel 7" }, // Sapphire Rapids-WS / Sapphire Rapids-SP { 15, 191, -1, "Intel 7" }, // Raptor Lake-S ("Golden Cove" cores) { -2, -2, -2, NULL } //Model E. Model E. Family Process }; const Technology_DB technology_amd[] = { //Model E. Model E. Family Process { 0, 16, 21, "32 nm" }, // Bulldozer (Piledriver: Trinity) { 0, 48, 21, "28 nm" }, // Bulldozer (Steamroller: Kaveri) { 0, 112, 21, "28 nm" }, // Bulldozer (Excavator: Stoney Ridge) { 0, -1, 22, "28 nm" }, // Jaguar (Kabini/Mullins) { 1, -1, 18, "32 nm" }, // K10 (Llano) { 1, -1, 20, "40 nm" }, // Bobcat (Brazos Zacate) { 1, 1, 21, "32 nm" }, // Bulldozer { 1, 96, 21, "28 nm" }, // Bulldozer (Excavator: Carrizo) { 2, -1, 16, "65 nm" }, // K10 (Kuma/Agena) { 2, -1, 20, "40 nm" }, // Bobcat (Brazos Desna/Ontario) { 2, -1, 21, "32 nm" }, // Bulldozer (Piledriver: Vishera) { 3, -1, 15, "90 nm" }, // K8 (Toledo) { 3, -1, 21, "32 nm" }, // Bulldozer (Piledriver: Richland) { 4, -1, 15, "90 nm" }, // K8 (Lancaster) { 4, -1, 16, "45 nm" }, // K10 (Deneb/Heka) { 5, -1, 16, "45 nm" }, // K10 (Propus) { 5, -1, 21, "28 nm" }, // Bulldozer (Excavator: Bristol Ridge) { 6, -1, 16, "45 nm" }, // K10 (Champlain/Sargas/Regor) { 8, -1, 6, "0.13 µm" }, // K7 (Thoroughbred/Applebred) { 8, -1, 15, "65 nm" }, // K8 (Tyler) { 8, -1, 21, "28 nm" }, // Bulldozer (Steamroller: Godavari) { 9, -1, 16, "45 nm" }, // Magny-Cours (Opteron) { 10, -1, 6, "0.13 µm" }, // K7 (Barton) { 10, -1, 16, "45 nm" }, // K10 (Thuban) { 11, -1, 15, "65 nm" }, // K8 (Brisbane) { 12, 124, 15, "65 nm" }, // K8 (Sherman) { 12, -1, 15, "90 nm" }, // K8 (Venice/Sonora) { 15, 79, 15, "90 nm" }, // K8 (Manila) { 15, 127, 15, "65 nm" }, // K8 (Sparta) { -1, 1, 23, "14 nm" }, // Zen (Summit Ridge/Whitehaven/Naples) { -1, 17, 23, "14 nm" }, // Zen (Raven Ridge) { -1, 8, 23, "12 nm" }, // Zen+ (Pinnacle Ridge/Colfax) { -1, 32, 23, "14 nm" }, // Zen (Dali) { -1, 24, 23, "12 nm" }, // Zen+ (Picasso) { -1, 49, 23, "7 nm" }, // Zen 2 (Rome/Castle Peak) { -1, 71, 23, "7 nm" }, // Zen 2 (4700S Desktop Kit) { -1, 96, 23, "7 nm" }, // Zen 2 (Renoir) { -1, 104, 23, "7 nm" }, // Zen 2 (Lucienne) { -1, 113, 23, "7 nm" }, // Zen 2 (Matisse) { -1, 132, 23, "7 nm" }, // Zen 2 (4800S Desktop Kit) { -1, 144, 23, "7 nm" }, // Zen 2 (Custom APU for Steam Deck) { -1, 160, 23, "6 nm" }, // Zen 2 (Mendocino) { -1, 33, 25, "7 nm" }, // Zen 3 (Vermeer) { -1, 80, 25, "7 nm" }, // Zen 3 (Cezanne) { -1, 1, 25, "7 nm" }, // Zen 3 (Milan) { -1, 68, 25, "7 nm" }, // Zen 3 (Rembrandt) { -1, 8, 25, "7 nm" }, // Zen 3 (Chagall) { -1, 24, 25, "5 nm" }, // Zen 4 (Storm Peak) { -1, 97, 25, "5 nm" }, // Zen 4 (Raphael/Dragon Range) { -1, 17, 25, "5 nm" }, // Zen 4 (Genoa) { -1, 116, 25, "5 nm" }, // Zen 4 (Phoenix) { -1, 120, 25, "4 nm" }, // Zen 4 (Z1) { -2, -2, -2, NULL } //Model E. Model E. Family Process }; /****************************** CPU Package ******************************/ typedef struct { const char *codename; const char *model; const char *socket; } Package_DB; const Package_DB package_unknown[] = { { NULL, NULL, NULL } }; const Package_DB package_intel[] = { //Codename Model Socket { "Atom (Diamondville)", NULL, "BGA 437" }, { "Pentium D (SmithField)", NULL, "LGA 775" }, { "Pentium D (Presler)", NULL, "LGA 775" }, { "Bloomfield", NULL, "LGA 1366" }, { NULL, "Intel(R) Core(TM)2 Duo CPU E7400", "LGA 775" }, { NULL, "Intel(R) Core(TM)2 Quad CPU Q6600","LGA 775" }, { NULL, "Intel(R) Core(TM) i5-2520M CPU", "rPGA 988B" }, { NULL, "Intel(R) Xeon(R) CPU E31275", "LGA 1155" }, { NULL, "Intel(R) Core(TM) i7-2860QM CPU", "rPGA 988B" }, { NULL, "Intel(R) Core(TM) i7-3740QM CPU", "rPGA 988B" }, { NULL, "Intel(R) Core(TM) i5-4300U CPU", "FCBGA 1168" }, { NULL, "Intel(R) Core(TM) i7-4600U CPU", "FCBGA 1168" }, { NULL, "Intel(R) Core(TM) i7-4790 CPU", "LGA 1150" }, { NULL, "Intel(R) Core(TM) i7-5775C CPU", "LGA 1150" }, { NULL, "Intel(R) Core(TM) i7-6560U CPU", "FCBGA 1356" }, { NULL, "Intel(R) Core(TM) i5-6400 CPU", "LGA 1151" }, { NULL, "Intel(R) Core(TM) i7-7300U CPU", "FCBGA 1356" }, { NULL, "Intel(R) Core(TM) i7-7820HQ CPU", "FCBGA 1440" }, { NULL, "Intel(R) Core(TM) i7-8250U CPU", "FCBGA 1356" }, { NULL, "Intel(R) Core(TM) i7-8350U CPU", "FCBGA 1356" }, { NULL, "Intel(R) Core(TM) i7-8550U CPU", "FCBGA 1356" }, { NULL, "Intel(R) Core(TM) i7-8650U CPU", "FCBGA 1356" }, { NULL, "Intel(R) Core(TM) i5-9300H CPU", "FCBGA 1440" }, { NULL, "Intel(R) Core(TM) i9-9900K CPU", "LGA 1151" }, { NULL, "Intel(R) Core(TM) i5-10500 CPU", "LGA 1200" }, { NULL, "Intel(R) Core(TM) i5-1135G7", "FCBGA 1449" }, { NULL, "Intel(R) Core(TM) i7-1165G7", "FCBGA 1449" }, { NULL, "Intel(R) Core(TM) i7-11700K", "LGA 1200" }, { NULL, "Intel(R) Core(TM) i3-1220P", "FCBGA 1744" }, { NULL, "Intel(R) Core(TM) i5-12400", "LGA 1700" }, { NULL, "Intel(R) Core(TM) i7-12700H", "FCBGA 1744" }, { NULL, "Intel(R) Core(TM) i7-12700KF", "LGA 1700" }, { NULL, "Intel(R) Core(TM) i9-12900K", "LGA 1700" }, { NULL, "Intel(R) Core(TM) i9-12900HK", "FCBGA 1744" }, { NULL, "Intel(R) Core(TM) i5-13600K", "LGA 1700" }, { NULL, "Intel(R) Core(TM) i7-13700K", "LGA 1700" }, { NULL, "Intel(R) Core(TM) i9-13900K", "LGA 1700" }, { NULL, "Intel(R) Celeron(R) CPU N2930", "FCBGA 1170" }, { NULL, "Intel(R) Celeron(R) CPU N3350", "FCBGA 1296" }, { NULL, "Intel(R) Celeron(R) N4000", "FCBGA 1090" }, { NULL, "Intel(R) Core(TM) i5-3470 CPU", "LGA 1155" }, { NULL, "Intel(R) Core(TM) i7-4770 CPU", "LGA 1155" }, { NULL, "Intel(R) Core(TM) i3-4350 CPU", "LGA 1150" }, { NULL, "Intel(R) Xeon(R) Gold 5220 CPU", "LGA 3647" }, { NULL, "Intel(R) Xeon(R) CPU E5-2689", "LGA 2011" }, { NULL, "Intel(R) Xeon(R) CPU E5-2690 ", "LGA 2011" }, { NULL, "Intel(R) Xeon(R) CPU E5-2690 v2", "LGA 2011" }, { NULL, "Intel(R) Xeon(R) CPU E5-2690 v3", "LGA 2011-3" }, { NULL, "Intel(R) Xeon(R) CPU E5-2690 v4", "LGA 2011-3" }, { NULL, NULL, NULL } //Codename Model Socket }; const Package_DB package_amd[] = { //Codename Model Socket { "Athlon 64 FX X2 (Toledo)", NULL, "939 (PGA-ZIF)" }, { "Kabini X4", "Athlon", "AM1 (PGA-ZIF)" }, { "Kabini X4", "Sempron", "AM1 (PGA-ZIF)" }, { "Trinity X4", NULL, "FM2 (PGA-ZIF)" }, { "Turion X2", "TL", "S1g1 (PGA-ZIF)" }, { "Turion X2", "TK", "S1g1 (PGA-ZIF)" }, { "Deneb", "AMD Phenom(tm) II X4 945", "AM3 (PGA-938)" }, { "Athlon II X4 (Propus)", NULL, "AM3 (PGA-938)" }, { "Zambezi", NULL, "AM3+ (PGA-942)" }, { "Vishera", NULL, "AM3+ (PGA-942)" }, /* Zen */ { "Naples", NULL, "SP3 (LGA-4094)" }, { "Whitehaven", NULL, "SP3r2 (LGA-4094)" }, { "Summit Ridge", NULL, "AM4 (PGA-1331)" }, { "Raven Ridge", NULL, "FP5 (BGA-1140)" }, { "Dali", NULL, "FP5 (BGA-1140)" }, /* Zen+ */ { "Colfax", NULL, "SP3r2 (LGA-4094)" }, { "Pinnacle Ridge", NULL, "AM4 (PGA-1331)" }, { "Picasso", NULL, "FP5 (BGA-1140)" }, /* Zen 2 */ { "Rome", NULL, "SP3 (LGA-4094)" }, { "Castle Peak", NULL, "SP3r2 (LGA-4094)" }, { "Matisse", NULL, "AM4 (PGA-1331)" }, { "Renoir", NULL, "FP6 (BGA-1140)" }, { "Lucienne", NULL, "FP6 (BGA-1140)" }, { "Mendocino", NULL, "FT6 (BGA)" }, /* Zen 3 */ { "Milan", NULL, "SP3 (LGA-4094)" }, { "Chagall", NULL, "sWRX8 (LGA-4094)" }, { "Vermeer", NULL, "AM4 (PGA-1331)" }, { "Cezanne", NULL, "FP6 (BGA-1140)" }, /* Zen 3+ */ { "Rembrandt", NULL, "FP7 (BGA-1140)" }, /* Zen 4 */ { "Genoa", NULL, "SP5 (LGA-6096)" }, { "Storm Peak", NULL, "sTR5 (LGA-4844)" }, { "Raphael", NULL, "AM5 (LGA-1718)" }, { "Dragon Range", NULL, "FL1 (BGA)" }, { "Phoenix", NULL, "FP7/FP8" }, { NULL, NULL, NULL } //Codename Model Socket }; #endif /* _DATABASES_H_ */ CPU-X-5.0.3/src/dmidecode/000077500000000000000000000000001454622605200150655ustar00rootroot00000000000000CPU-X-5.0.3/src/dmidecode/.hash000066400000000000000000000000511454622605200160050ustar00rootroot00000000000000484f8935b0fc768841f43fa388b191196b5e12fd CPU-X-5.0.3/src/dmidecode/AUTHORS000066400000000000000000000035211454622605200161360ustar00rootroot00000000000000DEVELOPER AND MAINTAINER Jean Delvare ORIGINAL AUTHORS Alan Cox Jean Delvare CODE CONTRIBUTORS (IN CHRONOLOGICAL ORDER) Matt Domsch Arjan van de Ven Mark D. Studebaker Larry Lile Dave Johnson Petter Reinholdtsen Roberto Nibali John Cagle Jens Elkner Jarod Wilson Anton Arapov Roy Franz Tyler Bell Xie XiuQi Petr Oros Prabhakar Pujeri Erwan Velu Jerry Hoemann MANY THANKS TO (IN CHRONOLOGICAL ORDER) Werner Heuser Alexandre Duret-Lutz Xavier Roche Pamela Huntley Gael Stephan Sebastian Henschel Richard Sharpe David Wilson Glen Foster Chad Smith Joshua Goldenhar Luc Van de Velde Mario Lang Hugues Lepesant Sergey Leonovich Mike Cooper Marc Rieffel Jeff Moyer Josef Moellers Zing Zing Shishak Rafael Avila de Espindola Roger Koot Martin Pool Doug Brenner Alex Williamson Durval Menezes Raphael Raimbault Raul Nunez de Arenas Coronado Francois Revol Dominik Klein Erwan Velu Don Howard Frans Pop Tomek Mateja Myke Olson Torsten Seemann Garry Belka Klaus Muth Antoine Fuselier Matthew Garrett Landry Breuil Luke Suchocki Attila Nagy Alex Iribarren Sebastien Douche William Lallemand Olivier Guerrier Pascal Terjan Stuart Hayes Sofian Brabez Vincent Pelletier Andreas Gruenbacher Lin Li Thomas Hiller Paul Flo Williams Olof Johansson Alexandre Lissy Michal Svec Vojtech Pavlik Murlin Wenzel Harald Mueller-Ney Lars Mueller Thomas Mingarelli Andrey Matveyev Stefan Tauner Naga Chumbalkar Jens Rosenboom Lianbo Jiang Tianjia Zhang Ivan Tkachenko CPU-X-5.0.3/src/dmidecode/CMakeLists.txt000066400000000000000000000011071454622605200176240ustar00rootroot00000000000000project(dmidecode VERSION "3.5.20230314" LANGUAGES C ) # Config (dmidecode) set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS}") set(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -Wno-shift-count-overflow") message(STATUS "Using built-in ${PROJECT_NAME}, version ${PROJECT_VERSION}") # Build (dmidecode) add_definitions(-DVERSION="${PROJECT_VERSION}") add_library(dmidecode STATIC types.h util.c util.h dmiopt.h dmiopt.c dmioem.c dmioem.h dmidecode.c dmidecode.h dmioutput.c dmioutput.h ) target_link_libraries(dmidecode) set(DMIDECODE_VERSION ${PROJECT_VERSION} PARENT_SCOPE) CPU-X-5.0.3/src/dmidecode/LICENSE000066400000000000000000000432541454622605200161020ustar00rootroot00000000000000 GNU GENERAL PUBLIC LICENSE Version 2, June 1991 Copyright (C) 1989, 1991 Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Lesser General Public License instead.) You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things. To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it. For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software. Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations. Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all. The precise terms and conditions for copying, distribution and modification follow. GNU GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you". Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does. 1. You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change. b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License. c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program. In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following: a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.) The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code. 4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it. 6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License. 7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 9. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation. 10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Also add information on how to contact you by electronic and paper mail. If the program is interactive, make it output a short notice like this when it starts in an interactive mode: Gnomovision version 69, Copyright (C) year name of author Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, the commands you use may be called something other than `show w' and `show c'; they could even be mouse-clicks or menu items--whatever suits your program. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the program, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the program `Gnomovision' (which makes passes at compilers) written by James Hacker. , 1 April 1989 Ty Coon, President of Vice This General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. CPU-X-5.0.3/src/dmidecode/NEWS000066400000000000000000000204631454622605200155710ustar00rootroot00000000000000Version 3.5 (Tue Mar 14 2023) - Decode HPE OEM records 216, 224, 230, 238 and 242. - Fortify entry point length checks. - Add a --no-quirks option. - Drop the CPUID exception list. - Do not let --dump-bin overwrite an existing file. - Ensure /dev/mem is a character device file. - Bug fixes: Fix segmentation fault in HPE OEM record 240 - Minor improvements: Typo fixes Write the whole dump file at once Fix a build warning when USE_MMAP isn't set Version 3.4 (Mon Jun 27 2022) - Support for SMBIOS 3.4.0. This includes new memory device types, new processor upgrades, new slot types and characteristics, decoding of memory module extended speed, new system slot types, new processor characteristics and new format of Processor ID. - Support for SMBIOS 3.5.0. This includes new processor upgrades, BIOS characteristics, new slot characteristics, new on-board device types, new pointing device interface types, and a new record type (type 45 - Firmware Inventory Information). - Decode HPE OEM records 194, 199, 203, 236, 237, 238 and 240. - Bug fixes: Fix OEM vendor name matching Fix ASCII filtering of strings Fix crash with option -u - Minor improvements: Skip details of uninstalled memory modules Don't display the raw CPU ID in quiet mode Improve the formatting of the manual pages Version 3.3 (Wed Oct 14 2020) - [BUILD] Allow overriding build settings from the environment. - [COMPATIBILITY] Document how the UUID fields are interpreted. - [PORTABILITY] Don't use memcpy on /dev/mem on arm64. - [PORTABILITY] Only scan /dev/mem for entry point on x86. - Support for SMBIOS 3.3.0. This includes new processor names, new port connector types, and new memory device form factors, types and technologies. - Add bios-revision, firmware-revision and system-sku-number to -s option. - Use the most appropriate unit for cache size. - Decode system slot base bus width and peers. - Important bug fixes: Fix Redfish Hostname print length Fix formatting of TPM table output Fix System Slot Information for PCIe SSD Don't choke on invalid processor voltage - Use the most appropriate unit for cache size. Version 3.2 (Wed Sep 14 2018) - [COMPATIBILITY] The UUID is now displayed using lowercase letters, per RFC 4122 (#53569). You must ensure that any code parsing it is case-insensitive. - Support for SMBIOS 3.2.0. This includes new processor names, new socket and port connector types, new system slot state and property, and support for non-volatile memory (NVDIMM). - Support for Redfish management controllers. - A new command line option to query a specific structure by its handle. - A new command line option to query the system family string. - Support for 3 ThinkPad-specific structures (patch #9642). - Support for HPE's new company name. - Support UEFI on FreeBSD. - Important bug fixes: Fix firmware version of TPM device Fix the HPE UEFI feature flag check - (biosdecode) A new command line option to fully decode PIR information (support request #109339). Version 3.1 (Tue May 23 2017) - Support for SMBIOS 3.1.0 and 3.1.1. This includes new chassis types, new processor family names, new processor family upgrade names, and new slot types, as well as support of larger BIOS ROM sizes and cache sizes, and a new structure type (43, TPM Device.) - A new command line option to query OEM strings. - All error messages are now printed on stderr (#47274, #48158.) - Several bug fixes related to 64-bit entry points (#50037 and more.) - Important bug fixes: #46176 (Unexpected end of file error) #46066 (Crash with SIGBUS) - Various minor fixes, improvements and cleanups. Version 3.0 (Thu Sep 03 2015) - Support for SMBIOS 3.0. This includes new chassis types, new processor family names, new processor family upgrade names, new slot types, and new memory device types. - Support for the new 64-bit entry point (_SM3_) defined in SMBIOS 3.0. - Support for the new kernel interface (as of Linux v4.2) as an alternative to relying /dev/mem to access the entry point and DMI table. - Decoding of Acer-specific DMI type 170. - Decoding of HP-specific DMI types 212, 219 and 233. - Various minor fixes and output format cleanups. Version 2.12 (Wed Apr 17 2013) - Support of the SMBIOS 2.8.0 specification. Version 2.11 (Wed Jan 19 2011) - Support of the SMBIOS 2.7.0 specification: - UEFI support - Virtual machine flags in BIOS characteristics - Limited support for the Management Controller Host Interface - Various fixes that address stability. Version 2.10 (Sun Nov 23 2008) - Support for Solaris (x86 only, of course). - Possibility to dump the SMBIOS/DMI table to a small binary file (option --dump-bin). - Possibility to read the SMBIOS/DMI table from such binary files (option --from-dump). - Support for SMBIOS 2.6. This includes new chassis types, new processor family names, new processor family upgrade names, bus address for system slots, and a new entry type for on-board devices, amongst many other minor changes. - Support for DMI entry type 31 (Boot integrity services). - Many processor family names taken from the CIM Schema document. - (vpddecode) No longer ask users to report broken records. - (vpddecode) Fix --quiet option. Version 2.9 (Mon Feb 26 2007) - Support of the SMBIOS 2.5 specification. It adds many enumerated values for recent hardware, as well as CPU core and thread count reporting. - Decoding of 3 HP-specific entries. More vendor-specific entries can be supported later if vendors contribute code or documentation. - Run-time detection of EFI, so that a single binary can support Intel-based Macintosh machines and regular x86 machines. - Better IA-64 support. - Fixes to the decoding of individual fields, including the CPU signature of recent CPU models. - (biosdecode) Support of the FJKEYINF entry point type (for Fujitsu laptops). - (vpddecode) The product name look-up table was dropped. It was unreliable and a burden to maintain. - biosdecode, ownership and vpddecode are no longer built on IA-64. Version 2.8 (Sat Feb 04 2006) - Option --string has four additional keywords available: system-uuid, chassis-type, processor-family and processor-frequency. These needed additional work because, technically speaking, they are not DMI strings. - IPMI interface type SSIF was added. This is a new interface type defined by IPMI 2.0. - (vpddecode) New --string option, much similar in spirit to dmidecode's. Available keywords are bios-build-id, box-serial-number, motherboard-serial-number, machine-type-model and bios-release-date. - (vpddecode) 9 product names were added to the lookup table. - A few bug fixes, cleanups and minor improvements all around the place. Version 2.7 (Thu Aug 04 2005) - New command line interface. For example, it is now possible to limit the output of dmidecode to a given DMI type, or to extract a single string from the DMI table. The documentation has been updated accordingly. - The default output of dmidecode was slightly modified to be more easily readable by humans. This might break tools parsing its output. Such tools may benefit from the new command line interface, although this interface shouldn't be considered stable until version 2.8. - (vpddecode) New command line interface. - (vpddecode) 6 product names were added. Version 2.6 (Mon Feb 28 2005) - Fixes a 2 GB memory limit regression. - Basic command-line handling. - BeOS and Cygwin support. Version 2.5 (Thu Nov 11 2004) - Code cleanups. - Compatibility fixes. - Documentation updates. Version 2.4 (Fri Mar 19 2004) - Manual pages added. - (vpddecode) Many improvements. - A few fixes and minor improvements. Version 2.3 (Sun Oct 19 2003) - Support of x86_64 systems. - Support of systems with 2 GB and more memory. - Loads of bug fixes and corrections. - New tool "vpddecode" added. Version 2.2 (Fri Aug 08 2003) - Support of IA-64 systems. - Support of IBM and Fujitsu-Siemens laptops. - Many minor bug fixes. - New tool "ownership" added. Version 2.1 (Tue Jun 10 2003) - Support of the SMBIOS 2.3.4 specification. - Better support of IPMI. - Minor bugs fixed. - Documentation added. CPU-X-5.0.3/src/dmidecode/README000066400000000000000000000110521454622605200157440ustar00rootroot00000000000000** INTRODUCTION ** Dmidecode reports information about your system's hardware as described in your system BIOS according to the SMBIOS/DMI standard. This information typically includes system manufacturer, model name, serial number, BIOS version, asset tag as well as a lot of other details of varying level of interest and reliability depending on the manufacturer. This will often include usage status for the CPU sockets, expansion slots (e.g. AGP, PCI, ISA) and memory module slots, and the list of I/O ports (e.g. serial, parallel, USB). DMI data can be used to enable or disable specific portions of kernel code depending on the specific hardware. Thus, one use of dmidecode is for kernel developers to detect system "signatures" and add them to the kernel source code when needed. Beware that DMI data have proven to be too unreliable to be blindly trusted. Dmidecode does not scan your hardware, it only reports what the BIOS told it to. ** INSTALLATION ** The home web page for dmidecode is hosted on Savannah: http://www.nongnu.org/dmidecode/ You will find the latest version (including CVS) there, as well as fresh news and other interesting material, such as a list of related projects and articles. This program was first written for Linux, and has since been reported to work on FreeBSD, NetBSD, OpenBSD, BeOS and Solaris as well. There's no configure script, so simply run "make" to build dmidecode, and "make install" to install it. You also can use "make uninstall" to remove all the files you installed. By default, files are installed in /usr/local but you can change this behavior by editing the Makefile file and setting prefix to wherever you want. You may change the C compiler and the compilation flags as well. Optionally, you can run "make strip" prior to "make install" if you want smaller binaries. However, be aware that this will prevent any further attempt to debug the programs. Two parameters can be set in the Makefile file to make dmidecode work on non-i386 systems. They should be used if your system uses the big endian byte ordering (Motorola) or doesn't support unaligned memory accesses, respectively. For example, compiling for a SPARC processor would require both (but I am not aware of SPARC-based systems implementing SMBIOS). Compiling for an IA64 processor requires the memory alignment workaround, and it is enabled automatically. ** DOCUMENTATION ** Each tool has a manual page, found in the "man" subdirectory. Manual pages are installed by "make install". See these manual pages for command line interface details and tool specific information. For an history of the changes made to dmidecode, see the NEWS file. If you need help, your best chances are to visit the web page (see the INSTALLATION section above) or to get in touch with the developers directly. Have a look at the AUTHORS file and contact one of the maintainers. If you want to help with the development of dmidecode, please consider joining the dmidecode-devel discussion list: http://lists.nongnu.org/mailman/listinfo/dmidecode-devel ** COMMON PROBLEMS ** IA-64 Non-Linux systems are not yet supported. MMAP Note that mmap() is now used by default wherever possible, since this seems to solve a number of problems. This default behavior can be changed in config.h. Just to make sure this is clear, mmap() is not used for performance reasons but to increase the number of systems on which dmidecode can be successfully run. CYGWIN Dmidecode used to work under Cygwin. However the /dev/mem interface was removed at some point in time so it no longer works. ** MISCELLANEOUS TOOLS ** Three other tools come along with dmidecode: biosdecode, ownership and vpddecode. These tools are only useful on systems with a BIOS, so they are not built on IA-64 by default. BIOSDECODE This one prints all BIOS related information it can find in /dev/mem. It used to be part of dmidecode itself, but as dmidecode was growing, we felt that the non-DMI part had to be moved to a separate tool. OWNERSHIP This tool was written on a request by Luc Van de Velde for use with Novell tools in his company. It retrieves the "ownership tag" that can be set on most Compaq computers. Since it uses the same mechanisms dmidecode and biosdecode use, and could be of some use for other people as well, we decided to make it part of the project. VPDDECODE This tool prints the contents of the "vital product data" structure as found in most IBM and Lenovo computers. It used to have a lookup table for the machine name, but it was unreliable and hard to maintain so it was ultimately dropped. It has a command line interface. CPU-X-5.0.3/src/dmidecode/README.md000066400000000000000000000017541454622605200163530ustar00rootroot00000000000000# Dmidecode: Desktop Management Interface table related utilities Distributed under the terms of the [GNU GPL v2](https://github.com/TheTumultuousUnicornOfDarkness/CPU-X/blob/master/src/dmidecode/LICENSE). ### CPU-X NOTE This sofware has been patched to be used within CPU-X. You can find the official web page of this project here: https://savannah.nongnu.org/projects/dmidecode/ This is based on dmidecode 3.5+[484f893](https://git.savannah.gnu.org/cgit/dmidecode.git/commit/?id=484f8935b0fc768841f43fa388b191196b5e12fd). This software is used to retrieve following data: - CPU tab - Package - Bus speed (fallback) - Motherboard tab - Motherboard manufacturer - Motherboard model - Motherboard revision - BIOS brand - BIOS version - BIOS date - BIOS ROM size You can reproduce the output of `dmidecode` command by using `cpu-x --dmidecode`. It will dump all DMI data on standard output. Note: you can increase dmidecode verbosity by using `cpu-x --verbose --dmidecode`. CPU-X-5.0.3/src/dmidecode/config.h000066400000000000000000000010451454622605200165030ustar00rootroot00000000000000/* * Configuration */ #ifndef CONFIG_H #define CONFIG_H /* Default memory device file */ #if defined(__BEOS__) || defined(__HAIKU__) #define DEFAULT_MEM_DEV "/dev/misc/mem" #else #ifdef __sun #define DEFAULT_MEM_DEV "/dev/xsvc" #else #define DEFAULT_MEM_DEV "/dev/mem" #endif #endif /* Use mmap or not */ #ifndef __BEOS__ #define USE_MMAP #endif /* Use memory alignment workaround or not */ #ifdef __ia64__ #define ALIGNMENT_WORKAROUND #endif /* Avoid unaligned memcpy on /dev/mem */ #ifdef __aarch64__ #define USE_SLOW_MEMCPY #endif #endif CPU-X-5.0.3/src/dmidecode/dmidecode.c000066400000000000000000004622571454622605200171660ustar00rootroot00000000000000/* * DMI Decode * * Copyright (C) 2000-2002 Alan Cox * Copyright (C) 2002-2020 Jean Delvare * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * For the avoidance of doubt the "preferred form" of this code is one which * is in an open unpatent encumbered format. Where cryptographic key signing * forms part of the process of creating an executable the information * including keys needed to generate an equivalently functional executable * are deemed to be part of the source code. * * Unless specified otherwise, all references are aimed at the "System * Management BIOS Reference Specification, Version 3.2.0" document, * available from http://www.dmtf.org/standards/smbios. * * Note to contributors: * Please reference every value you add or modify, especially if the * information does not come from the above mentioned specification. * * Additional references: * - Intel AP-485 revision 36 * "Intel Processor Identification and the CPUID Instruction" * http://www.intel.com/support/processors/sb/cs-009861.htm * - DMTF Common Information Model * CIM Schema version 2.19.1 * http://www.dmtf.org/standards/cim/ * - IPMI 2.0 revision 1.0 * "Intelligent Platform Management Interface Specification" * http://developer.intel.com/design/servers/ipmi/spec.htm * - AMD publication #25481 revision 2.28 * "CPUID Specification" * http://www.amd.com/us-en/assets/content_type/white_papers_and_tech_docs/25481.pdf * - BIOS Integrity Services Application Programming Interface version 1.0 * http://www.intel.com/design/archives/wfm/downloads/bisspec.htm * - DMTF DSP0239 version 1.1.0 * "Management Component Transport Protocol (MCTP) IDs and Codes" * http://www.dmtf.org/standards/pmci * - "TPM Main, Part 2 TPM Structures" * Specification version 1.2, level 2, revision 116 * https://trustedcomputinggroup.org/tpm-main-specification/ * - "PC Client Platform TPM Profile (PTP) Specification" * Family "2.0", Level 00, Revision 00.43, January 26, 2015 * https://trustedcomputinggroup.org/pc-client-platform-tpm-profile-ptp-specification/ * - "RedFish Host Interface Specification" (DMTF DSP0270) * https://www.dmtf.org/sites/default/files/DSP0270_1.0.1.pdf */ #include #include #include #include #include #include #include #include #ifdef __FreeBSD__ #include #include #endif #include "config.h" #include "types.h" #include "util.h" #include "dmidecode.h" #include "dmiopt.h" #include "dmioem.h" #include "dmioutput.h" /* CPU-X */ #include "../daemon.h" #if HAS_GETTEXT # define _(msg) gettext(msg) #else # define _(msg) msg #endif /* HAS_GETTEXT */ #define N_(msg) msg DmidecodeData *cpux_data; #define STR_LEN 24 #define out_of_spec "" static const char *bad_index = ""; enum cpuid_type cpuid_type = cpuid_none; #define SUPPORTED_SMBIOS_VER 0x030500 #define FLAG_NO_FILE_OFFSET (1 << 0) #define FLAG_STOP_AT_EOT (1 << 1) #define SYS_FIRMWARE_DIR "/sys/firmware/dmi/tables" #define SYS_ENTRY_FILE SYS_FIRMWARE_DIR "/smbios_entry_point" #define SYS_TABLE_FILE SYS_FIRMWARE_DIR "/DMI" /* * Type-independant Stuff */ /* Returns 1 if the buffer contains only printable ASCII characters */ int is_printable(const u8 *data, int len) { int i; for (i = 0; i < len; i++) if (data[i] < 32 || data[i] >= 127) return 0; return 1; } /* Replace non-ASCII characters with dots */ static void ascii_filter(char *bp, size_t len) { size_t i; for (i = 0; i < len; i++) if (bp[i] < 32 || bp[i] >= 127) bp[i] = '.'; } static char *_dmi_string(const struct dmi_header *dm, u8 s, int filter) { char *bp = (char *)dm->data; bp += dm->length; while (s > 1 && *bp) { bp += strlen(bp); bp++; s--; } if (!*bp) return NULL; if (filter) ascii_filter(bp, strlen(bp)); return bp; } const char *dmi_string(const struct dmi_header *dm, u8 s) { char *bp; if (s == 0) return "Not Specified"; bp = _dmi_string(dm, s, 1); if (bp == NULL) return bad_index; return bp; } static const char *dmi_smbios_structure_type(u8 code) { static const char *type[] = { "BIOS", /* 0 */ "System", "Base Board", "Chassis", "Processor", "Memory Controller", "Memory Module", "Cache", "Port Connector", "System Slots", "On Board Devices", "OEM Strings", "System Configuration Options", "BIOS Language", "Group Associations", "System Event Log", "Physical Memory Array", "Memory Device", "32-bit Memory Error", "Memory Array Mapped Address", "Memory Device Mapped Address", "Built-in Pointing Device", "Portable Battery", "System Reset", "Hardware Security", "System Power Controls", "Voltage Probe", "Cooling Device", "Temperature Probe", "Electrical Current Probe", "Out-of-band Remote Access", "Boot Integrity Services", "System Boot", "64-bit Memory Error", "Management Device", "Management Device Component", "Management Device Threshold Data", "Memory Channel", "IPMI Device", "Power Supply", "Additional Information", "Onboard Device", "Management Controller Host Interface", "TPM Device", "Processor", "Firmware", "String Property" /* 46 */ }; if (code >= 128) return "OEM-specific"; if (code <= 46) return type[code]; return out_of_spec; } static int dmi_bcd_range(u8 value, u8 low, u8 high) { if (value > 0x99 || (value & 0x0F) > 0x09) return 0; if (value < low || value > high) return 0; return 1; } static void dmi_dump(const struct dmi_header *h) { static char raw_data[48]; int row, i; unsigned int off; char *s; pr_list_start("Header and Data", NULL); for (row = 0; row < ((h->length - 1) >> 4) + 1; row++) { off = 0; for (i = 0; i < 16 && i < h->length - (row << 4); i++) off += sprintf(raw_data + off, i ? " %02X" : "%02X", (h->data)[(row << 4) + i]); pr_list_item(raw_data); } pr_list_end(); if ((h->data)[h->length] || (h->data)[h->length + 1]) { pr_list_start("Strings", NULL); i = 1; while ((s = _dmi_string(h, i++, !(opt.flags & FLAG_DUMP)))) { if (opt.flags & FLAG_DUMP) { int j, l = strlen(s) + 1; for (row = 0; row < ((l - 1) >> 4) + 1; row++) { off = 0; for (j = 0; j < 16 && j < l - (row << 4); j++) off += sprintf(raw_data + off, j ? " %02X" : "%02X", (unsigned char)s[(row << 4) + j]); pr_list_item(raw_data); } /* String isn't filtered yet so do it now */ ascii_filter(s, l - 1); } pr_list_item("%s", s); } pr_list_end(); } } /* shift is 0 if the value is in bytes, 1 if it is in kilobytes */ void dmi_print_memory_size(const char *attr, u64 code, int shift) { unsigned long capacity; u16 split[7]; static const char *unit[8] = { "bytes", "kB", "MB", "GB", "TB", "PB", "EB", "ZB" }; int i; /* * We split the overall size in powers of thousand: EB, PB, TB, GB, * MB, kB and B. In practice, it is expected that only one or two * (consecutive) of these will be non-zero. */ split[0] = code.l & 0x3FFUL; split[1] = (code.l >> 10) & 0x3FFUL; split[2] = (code.l >> 20) & 0x3FFUL; split[3] = ((code.h << 2) & 0x3FCUL) | (code.l >> 30); split[4] = (code.h >> 8) & 0x3FFUL; split[5] = (code.h >> 18) & 0x3FFUL; split[6] = code.h >> 28; /* * Now we find the highest unit with a non-zero value. If the following * is also non-zero, we use that as our base. If the following is zero, * we simply display the highest unit. */ for (i = 6; i > 0; i--) { if (split[i]) break; } if (i > 0 && split[i - 1]) { i--; capacity = split[i] + (split[i + 1] << 10); } else capacity = split[i]; pr_attr(attr, "%lu %s", capacity, unit[i + shift]); } void dmi_print_memory_size_str(char *str_size, size_t str_len, u64 code, int shift) { unsigned long capacity; u16 split[7]; static const char *unit[8] = { "@0B@", "@KB@", "@MB@", "@GB@", "@TB@", "PB", "EB", "ZB" }; int i; /* * We split the overall size in powers of thousand: EB, PB, TB, GB, * MB, kB and B. In practice, it is expected that only one or two * (consecutive) of these will be non-zero. */ split[0] = code.l & 0x3FFUL; split[1] = (code.l >> 10) & 0x3FFUL; split[2] = (code.l >> 20) & 0x3FFUL; split[3] = ((code.h << 2) & 0x3FCUL) | (code.l >> 30); split[4] = (code.h >> 8) & 0x3FFUL; split[5] = (code.h >> 18) & 0x3FFUL; split[6] = code.h >> 28; /* * Now we find the highest unit with a non-zero value. If the following * is also non-zero, we use that as our base. If the following is zero, * we simply display the highest unit. */ for (i = 6; i > 0; i--) { if (split[i]) break; } if (i > 0 && split[i - 1]) { i--; capacity = split[i] + (split[i + 1] << 10); } else capacity = split[i]; snprintf(str_size, str_len, "%lu %s", capacity, unit[i + shift]); } /* * 7.1 BIOS Information (Type 0) */ static void dmi_bios_runtime_size(u32 code) { const char *format; if (code & 0x000003FF) { format = "%u bytes"; } else { format = "%u kB"; code >>= 10; } pr_attr("Runtime Size", format, code); } static char *dmi_bios_runtime_size_str(u32 code) { static char size[STR_LEN] = ""; if (code & 0x000003FF) snprintf(size, STR_LEN, "%u @0B@", code); else snprintf(size, STR_LEN, "%u @KB@", code >> 10); return size; } static void dmi_bios_rom_size(u8 code1, u16 code2) { static const char *unit[4] = { "MB", "GB", out_of_spec, out_of_spec }; if (code1 != 0xFF) { u64 s = { .l = (code1 + 1) << 6 }; dmi_print_memory_size("ROM Size", s, 1); } else pr_attr("ROM Size", "%u %s", code2 & 0x3FFF, unit[code2 >> 14]); } static char *dmi_bios_rom_size_str(u8 code1, u16 code2) { static char size[STR_LEN] = ""; static const char *unit[4] = { "@MB@", "@GB@", "?B", "?B" }; if (code1 != 0xFF) snprintf(size, STR_LEN, "%u @KB@", (code1 + 1) << 6); else snprintf(size, STR_LEN, "%u %s", code2 & 0x3FFF, unit[code2 >> 14]); return size; } static void dmi_bios_characteristics(u64 code) { /* 7.1.1 */ static const char *characteristics[] = { "BIOS characteristics not supported", /* 3 */ "ISA is supported", "MCA is supported", "EISA is supported", "PCI is supported", "PC Card (PCMCIA) is supported", "PNP is supported", "APM is supported", "BIOS is upgradeable", "BIOS shadowing is allowed", "VLB is supported", "ESCD support is available", "Boot from CD is supported", "Selectable boot is supported", "BIOS ROM is socketed", "Boot from PC Card (PCMCIA) is supported", "EDD is supported", "Japanese floppy for NEC 9800 1.2 MB is supported (int 13h)", "Japanese floppy for Toshiba 1.2 MB is supported (int 13h)", "5.25\"/360 kB floppy services are supported (int 13h)", "5.25\"/1.2 MB floppy services are supported (int 13h)", "3.5\"/720 kB floppy services are supported (int 13h)", "3.5\"/2.88 MB floppy services are supported (int 13h)", "Print screen service is supported (int 5h)", "8042 keyboard services are supported (int 9h)", "Serial services are supported (int 14h)", "Printer services are supported (int 17h)", "CGA/mono video services are supported (int 10h)", "NEC PC-98" /* 31 */ }; int i; /* * This isn't very clear what this bit is supposed to mean */ if (code.l & (1 << 3)) { pr_list_item("%s", characteristics[0]); return; } for (i = 4; i <= 31; i++) if (code.l & (1 << i)) pr_list_item("%s", characteristics[i - 3]); } static void dmi_bios_characteristics_x1(u8 code) { /* 7.1.2.1 */ static const char *characteristics[] = { "ACPI is supported", /* 0 */ "USB legacy is supported", "AGP is supported", "I2O boot is supported", "LS-120 boot is supported", "ATAPI Zip drive boot is supported", "IEEE 1394 boot is supported", "Smart battery is supported" /* 7 */ }; int i; for (i = 0; i <= 7; i++) if (code & (1 << i)) pr_list_item("%s", characteristics[i]); } static void dmi_bios_characteristics_x2(u8 code) { /* 37.1.2.2 */ static const char *characteristics[] = { "BIOS boot specification is supported", /* 0 */ "Function key-initiated network boot is supported", "Targeted content distribution is supported", "UEFI is supported", "System is a virtual machine", "Manufacturing mode is supported", "Manufacturing mode is enabled" /* 6 */ }; int i; for (i = 0; i <= 6; i++) if (code & (1 << i)) pr_list_item("%s", characteristics[i]); } /* * 7.2 System Information (Type 1) */ static void dmi_system_uuid(void (*print_cb)(const char *name, const char *format, ...), const char *attr, const u8 *p, u16 ver) { int only0xFF = 1, only0x00 = 1; int i; for (i = 0; i < 16 && (only0x00 || only0xFF); i++) { if (p[i] != 0x00) only0x00 = 0; if (p[i] != 0xFF) only0xFF = 0; } if (only0xFF) { if (print_cb) print_cb(attr, "Not Present"); else printf("Not Present\n"); return; } if (only0x00) { if (print_cb) print_cb(attr, "Not Settable"); else printf("Not Settable\n"); return; } /* * As of version 2.6 of the SMBIOS specification, the first 3 * fields of the UUID are supposed to be encoded on little-endian. * The specification says that this is the defacto standard, * however I've seen systems following RFC 4122 instead and use * network byte order, so I am reluctant to apply the byte-swapping * for older versions. */ if (ver >= 0x0206) { if (print_cb) print_cb(attr, "%02x%02x%02x%02x-%02x%02x-%02x%02x-%02x%02x-%02x%02x%02x%02x%02x%02x", p[3], p[2], p[1], p[0], p[5], p[4], p[7], p[6], p[8], p[9], p[10], p[11], p[12], p[13], p[14], p[15]); else printf("%02x%02x%02x%02x-%02x%02x-%02x%02x-%02x%02x-%02x%02x%02x%02x%02x%02x\n", p[3], p[2], p[1], p[0], p[5], p[4], p[7], p[6], p[8], p[9], p[10], p[11], p[12], p[13], p[14], p[15]); } else { if (print_cb) print_cb(attr, "%02x%02x%02x%02x-%02x%02x-%02x%02x-%02x%02x-%02x%02x%02x%02x%02x%02x", p[0], p[1], p[2], p[3], p[4], p[5], p[6], p[7], p[8], p[9], p[10], p[11], p[12], p[13], p[14], p[15]); else printf("%02x%02x%02x%02x-%02x%02x-%02x%02x-%02x%02x-%02x%02x%02x%02x%02x%02x\n", p[0], p[1], p[2], p[3], p[4], p[5], p[6], p[7], p[8], p[9], p[10], p[11], p[12], p[13], p[14], p[15]); } } static const char *dmi_system_wake_up_type(u8 code) { /* 7.2.2 */ static const char *type[] = { "Reserved", /* 0x00 */ "Other", "Unknown", "APM Timer", "Modem Ring", "LAN Remote", "Power Switch", "PCI PME#", "AC Power Restored" /* 0x08 */ }; if (code <= 0x08) return type[code]; return out_of_spec; } /* * 7.3 Base Board Information (Type 2) */ static void dmi_base_board_features(u8 code) { /* 7.3.1 */ static const char *features[] = { "Board is a hosting board", /* 0 */ "Board requires at least one daughter board", "Board is removable", "Board is replaceable", "Board is hot swappable" /* 4 */ }; if ((code & 0x1F) == 0) pr_list_start("Features", "%s", "None"); else { int i; pr_list_start("Features", NULL); for (i = 0; i <= 4; i++) if (code & (1 << i)) pr_list_item("%s", features[i]); } pr_list_end(); } static const char *dmi_base_board_type(u8 code) { /* 7.3.2 */ static const char *type[] = { "Unknown", /* 0x01 */ "Other", "Server Blade", "Connectivity Switch", "System Management Module", "Processor Module", "I/O Module", "Memory Module", "Daughter Board", "Motherboard", "Processor+Memory Module", "Processor+I/O Module", "Interconnect Board" /* 0x0D */ }; if (code >= 0x01 && code <= 0x0D) return type[code - 0x01]; return out_of_spec; } static void dmi_base_board_handles(u8 count, const u8 *p) { int i; pr_list_start("Contained Object Handles", "%u", count); for (i = 0; i < count; i++) pr_list_item("0x%04X", WORD(p + sizeof(u16) * i)); pr_list_end(); } /* * 7.4 Chassis Information (Type 3) */ static const char *dmi_chassis_type(u8 code) { /* 7.4.1 */ static const char *type[] = { "Other", /* 0x01 */ "Unknown", "Desktop", "Low Profile Desktop", "Pizza Box", "Mini Tower", "Tower", "Portable", "Laptop", "Notebook", "Hand Held", "Docking Station", "All In One", "Sub Notebook", "Space-saving", "Lunch Box", "Main Server Chassis", /* CIM_Chassis.ChassisPackageType says "Main System Chassis" */ "Expansion Chassis", "Sub Chassis", "Bus Expansion Chassis", "Peripheral Chassis", "RAID Chassis", "Rack Mount Chassis", "Sealed-case PC", "Multi-system", "CompactPCI", "AdvancedTCA", "Blade", "Blade Enclosing", "Tablet", "Convertible", "Detachable", "IoT Gateway", "Embedded PC", "Mini PC", "Stick PC" /* 0x24 */ }; code &= 0x7F; /* bits 6:0 are chassis type, 7th bit is the lock bit */ if (code >= 0x01 && code <= 0x24) return type[code - 0x01]; return out_of_spec; } static const char *dmi_chassis_lock(u8 code) { static const char *lock[] = { "Not Present", /* 0x00 */ "Present" /* 0x01 */ }; return lock[code]; } static const char *dmi_chassis_state(u8 code) { /* 7.4.2 */ static const char *state[] = { "Other", /* 0x01 */ "Unknown", "Safe", "Warning", "Critical", "Non-recoverable" /* 0x06 */ }; if (code >= 0x01 && code <= 0x06) return state[code - 0x01]; return out_of_spec; } static const char *dmi_chassis_security_status(u8 code) { /* 7.4.3 */ static const char *status[] = { "Other", /* 0x01 */ "Unknown", "None", "External Interface Locked Out", "External Interface Enabled" /* 0x05 */ }; if (code >= 0x01 && code <= 0x05) return status[code - 0x01]; return out_of_spec; } static void dmi_chassis_height(u8 code) { if (code == 0x00) pr_attr("Height", "Unspecified"); else pr_attr("Height", "%u U", code); } static void dmi_chassis_power_cords(u8 code) { if (code == 0x00) pr_attr("Number Of Power Cords", "Unspecified"); else pr_attr("Number Of Power Cords", "%u", code); } static void dmi_chassis_elements(u8 count, u8 len, const u8 *p) { int i; pr_list_start("Contained Elements", "%u", count); for (i = 0; i < count; i++) { if (len >= 0x03) { const char *type; type = (p[i * len] & 0x80) ? dmi_smbios_structure_type(p[i * len] & 0x7F) : dmi_base_board_type(p[i * len] & 0x7F); if (p[1 + i * len] == p[2 + i * len]) pr_list_item("%s (%u)", type, p[1 + i * len]); else pr_list_item("%s (%u-%u)", type, p[1 + i * len], p[2 + i * len]); } } pr_list_end(); } /* * 7.5 Processor Information (Type 4) */ static const char *dmi_processor_type(u8 code) { /* 7.5.1 */ static const char *type[] = { "Other", /* 0x01 */ "Unknown", "Central Processor", "Math Processor", "DSP Processor", "Video Processor" /* 0x06 */ }; if (code >= 0x01 && code <= 0x06) return type[code - 0x01]; return out_of_spec; } static const char *dmi_processor_family(const struct dmi_header *h, u16 ver) { const u8 *data = h->data; unsigned int i, low, high; u16 code; /* 7.5.2 */ static struct { int value; const char *name; } family2[] = { { 0x01, "Other" }, { 0x02, "Unknown" }, { 0x03, "8086" }, { 0x04, "80286" }, { 0x05, "80386" }, { 0x06, "80486" }, { 0x07, "8087" }, { 0x08, "80287" }, { 0x09, "80387" }, { 0x0A, "80487" }, { 0x0B, "Pentium" }, { 0x0C, "Pentium Pro" }, { 0x0D, "Pentium II" }, { 0x0E, "Pentium MMX" }, { 0x0F, "Celeron" }, { 0x10, "Pentium II Xeon" }, { 0x11, "Pentium III" }, { 0x12, "M1" }, { 0x13, "M2" }, { 0x14, "Celeron M" }, { 0x15, "Pentium 4 HT" }, { 0x18, "Duron" }, { 0x19, "K5" }, { 0x1A, "K6" }, { 0x1B, "K6-2" }, { 0x1C, "K6-3" }, { 0x1D, "Athlon" }, { 0x1E, "AMD29000" }, { 0x1F, "K6-2+" }, { 0x20, "Power PC" }, { 0x21, "Power PC 601" }, { 0x22, "Power PC 603" }, { 0x23, "Power PC 603+" }, { 0x24, "Power PC 604" }, { 0x25, "Power PC 620" }, { 0x26, "Power PC x704" }, { 0x27, "Power PC 750" }, { 0x28, "Core Duo" }, { 0x29, "Core Duo Mobile" }, { 0x2A, "Core Solo Mobile" }, { 0x2B, "Atom" }, { 0x2C, "Core M" }, { 0x2D, "Core m3" }, { 0x2E, "Core m5" }, { 0x2F, "Core m7" }, { 0x30, "Alpha" }, { 0x31, "Alpha 21064" }, { 0x32, "Alpha 21066" }, { 0x33, "Alpha 21164" }, { 0x34, "Alpha 21164PC" }, { 0x35, "Alpha 21164a" }, { 0x36, "Alpha 21264" }, { 0x37, "Alpha 21364" }, { 0x38, "Turion II Ultra Dual-Core Mobile M" }, { 0x39, "Turion II Dual-Core Mobile M" }, { 0x3A, "Athlon II Dual-Core M" }, { 0x3B, "Opteron 6100" }, { 0x3C, "Opteron 4100" }, { 0x3D, "Opteron 6200" }, { 0x3E, "Opteron 4200" }, { 0x3F, "FX" }, { 0x40, "MIPS" }, { 0x41, "MIPS R4000" }, { 0x42, "MIPS R4200" }, { 0x43, "MIPS R4400" }, { 0x44, "MIPS R4600" }, { 0x45, "MIPS R10000" }, { 0x46, "C-Series" }, { 0x47, "E-Series" }, { 0x48, "A-Series" }, { 0x49, "G-Series" }, { 0x4A, "Z-Series" }, { 0x4B, "R-Series" }, { 0x4C, "Opteron 4300" }, { 0x4D, "Opteron 6300" }, { 0x4E, "Opteron 3300" }, { 0x4F, "FirePro" }, { 0x50, "SPARC" }, { 0x51, "SuperSPARC" }, { 0x52, "MicroSPARC II" }, { 0x53, "MicroSPARC IIep" }, { 0x54, "UltraSPARC" }, { 0x55, "UltraSPARC II" }, { 0x56, "UltraSPARC IIi" }, { 0x57, "UltraSPARC III" }, { 0x58, "UltraSPARC IIIi" }, { 0x60, "68040" }, { 0x61, "68xxx" }, { 0x62, "68000" }, { 0x63, "68010" }, { 0x64, "68020" }, { 0x65, "68030" }, { 0x66, "Athlon X4" }, { 0x67, "Opteron X1000" }, { 0x68, "Opteron X2000" }, { 0x69, "Opteron A-Series" }, { 0x6A, "Opteron X3000" }, { 0x6B, "Zen" }, { 0x70, "Hobbit" }, { 0x78, "Crusoe TM5000" }, { 0x79, "Crusoe TM3000" }, { 0x7A, "Efficeon TM8000" }, { 0x80, "Weitek" }, { 0x82, "Itanium" }, { 0x83, "Athlon 64" }, { 0x84, "Opteron" }, { 0x85, "Sempron" }, { 0x86, "Turion 64" }, { 0x87, "Dual-Core Opteron" }, { 0x88, "Athlon 64 X2" }, { 0x89, "Turion 64 X2" }, { 0x8A, "Quad-Core Opteron" }, { 0x8B, "Third-Generation Opteron" }, { 0x8C, "Phenom FX" }, { 0x8D, "Phenom X4" }, { 0x8E, "Phenom X2" }, { 0x8F, "Athlon X2" }, { 0x90, "PA-RISC" }, { 0x91, "PA-RISC 8500" }, { 0x92, "PA-RISC 8000" }, { 0x93, "PA-RISC 7300LC" }, { 0x94, "PA-RISC 7200" }, { 0x95, "PA-RISC 7100LC" }, { 0x96, "PA-RISC 7100" }, { 0xA0, "V30" }, { 0xA1, "Quad-Core Xeon 3200" }, { 0xA2, "Dual-Core Xeon 3000" }, { 0xA3, "Quad-Core Xeon 5300" }, { 0xA4, "Dual-Core Xeon 5100" }, { 0xA5, "Dual-Core Xeon 5000" }, { 0xA6, "Dual-Core Xeon LV" }, { 0xA7, "Dual-Core Xeon ULV" }, { 0xA8, "Dual-Core Xeon 7100" }, { 0xA9, "Quad-Core Xeon 5400" }, { 0xAA, "Quad-Core Xeon" }, { 0xAB, "Dual-Core Xeon 5200" }, { 0xAC, "Dual-Core Xeon 7200" }, { 0xAD, "Quad-Core Xeon 7300" }, { 0xAE, "Quad-Core Xeon 7400" }, { 0xAF, "Multi-Core Xeon 7400" }, { 0xB0, "Pentium III Xeon" }, { 0xB1, "Pentium III Speedstep" }, { 0xB2, "Pentium 4" }, { 0xB3, "Xeon" }, { 0xB4, "AS400" }, { 0xB5, "Xeon MP" }, { 0xB6, "Athlon XP" }, { 0xB7, "Athlon MP" }, { 0xB8, "Itanium 2" }, { 0xB9, "Pentium M" }, { 0xBA, "Celeron D" }, { 0xBB, "Pentium D" }, { 0xBC, "Pentium EE" }, { 0xBD, "Core Solo" }, /* 0xBE handled as a special case */ { 0xBF, "Core 2 Duo" }, { 0xC0, "Core 2 Solo" }, { 0xC1, "Core 2 Extreme" }, { 0xC2, "Core 2 Quad" }, { 0xC3, "Core 2 Extreme Mobile" }, { 0xC4, "Core 2 Duo Mobile" }, { 0xC5, "Core 2 Solo Mobile" }, { 0xC6, "Core i7" }, { 0xC7, "Dual-Core Celeron" }, { 0xC8, "IBM390" }, { 0xC9, "G4" }, { 0xCA, "G5" }, { 0xCB, "ESA/390 G6" }, { 0xCC, "z/Architecture" }, { 0xCD, "Core i5" }, { 0xCE, "Core i3" }, { 0xCF, "Core i9" }, { 0xD2, "C7-M" }, { 0xD3, "C7-D" }, { 0xD4, "C7" }, { 0xD5, "Eden" }, { 0xD6, "Multi-Core Xeon" }, { 0xD7, "Dual-Core Xeon 3xxx" }, { 0xD8, "Quad-Core Xeon 3xxx" }, { 0xD9, "Nano" }, { 0xDA, "Dual-Core Xeon 5xxx" }, { 0xDB, "Quad-Core Xeon 5xxx" }, { 0xDD, "Dual-Core Xeon 7xxx" }, { 0xDE, "Quad-Core Xeon 7xxx" }, { 0xDF, "Multi-Core Xeon 7xxx" }, { 0xE0, "Multi-Core Xeon 3400" }, { 0xE4, "Opteron 3000" }, { 0xE5, "Sempron II" }, { 0xE6, "Embedded Opteron Quad-Core" }, { 0xE7, "Phenom Triple-Core" }, { 0xE8, "Turion Ultra Dual-Core Mobile" }, { 0xE9, "Turion Dual-Core Mobile" }, { 0xEA, "Athlon Dual-Core" }, { 0xEB, "Sempron SI" }, { 0xEC, "Phenom II" }, { 0xED, "Athlon II" }, { 0xEE, "Six-Core Opteron" }, { 0xEF, "Sempron M" }, { 0xFA, "i860" }, { 0xFB, "i960" }, { 0x100, "ARMv7" }, { 0x101, "ARMv8" }, { 0x104, "SH-3" }, { 0x105, "SH-4" }, { 0x118, "ARM" }, { 0x119, "StrongARM" }, { 0x12C, "6x86" }, { 0x12D, "MediaGX" }, { 0x12E, "MII" }, { 0x140, "WinChip" }, { 0x15E, "DSP" }, { 0x1F4, "Video Processor" }, { 0x200, "RV32" }, { 0x201, "RV64" }, { 0x202, "RV128" }, }; /* * Note to developers: when adding entries to this list, check if * function dmi_processor_id below needs updating too. */ /* Special case for ambiguous value 0x30 (SMBIOS 2.0 only) */ if (ver == 0x0200 && data[0x06] == 0x30 && h->length >= 0x08) { const char *manufacturer = dmi_string(h, data[0x07]); if (strstr(manufacturer, "Intel") != NULL || strncasecmp(manufacturer, "Intel", 5) == 0) return "Pentium Pro"; } code = (data[0x06] == 0xFE && h->length >= 0x2A) ? WORD(data + 0x28) : data[0x06]; /* Special case for ambiguous value 0xBE */ if (code == 0xBE) { if (h->length >= 0x08) { const char *manufacturer = dmi_string(h, data[0x07]); /* Best bet based on manufacturer string */ if (strstr(manufacturer, "Intel") != NULL || strncasecmp(manufacturer, "Intel", 5) == 0) return "Core 2"; if (strstr(manufacturer, "AMD") != NULL || strncasecmp(manufacturer, "AMD", 3) == 0) return "K7"; } return "Core 2 or K7"; } /* Perform a binary search */ low = 0; high = ARRAY_SIZE(family2) - 1; while (1) { i = (low + high) / 2; if (family2[i].value == code) return family2[i].name; if (low == high) /* Not found */ return out_of_spec; if (code < family2[i].value) high = i; else low = i + 1; } } static enum cpuid_type dmi_get_cpuid_type(const struct dmi_header *h) { const u8 *data = h->data; const u8 *p = data + 0x08; u16 type; type = (data[0x06] == 0xFE && h->length >= 0x2A) ? WORD(data + 0x28) : data[0x06]; if (type == 0x05) /* 80386 */ { return cpuid_80386; } else if (type == 0x06) /* 80486 */ { u16 dx = WORD(p); /* * Not all 80486 CPU support the CPUID instruction, we have to find * whether the one we have here does or not. Note that this trick * works only because we know that 80486 must be little-endian. */ if ((dx & 0x0F00) == 0x0400 && ((dx & 0x00F0) == 0x0040 || (dx & 0x00F0) >= 0x0070) && ((dx & 0x000F) >= 0x0003)) return cpuid_x86_intel; else return cpuid_80486; } else if ((type >= 0x100 && type <= 0x101) /* ARM */ || (type >= 0x118 && type <= 0x119)) /* ARM */ { /* * The field's format depends on the processor's support of * the SMCCC_ARCH_SOC_ID architectural call. Software can determine * the support for SoC ID by examining the Processor Characteristics field * for "Arm64 SoC ID" bit. */ if (h->length >= 0x28 && (WORD(data + 0x26) & (1 << 9))) return cpuid_arm_soc_id; else return cpuid_arm_legacy; } else if ((type >= 0x0B && type <= 0x15) /* Intel, Cyrix */ || (type >= 0x28 && type <= 0x2F) /* Intel */ || (type >= 0xA1 && type <= 0xB3) /* Intel */ || type == 0xB5 /* Intel */ || (type >= 0xB9 && type <= 0xC7) /* Intel */ || (type >= 0xCD && type <= 0xCF) /* Intel */ || (type >= 0xD2 && type <= 0xDB) /* VIA, Intel */ || (type >= 0xDD && type <= 0xE0)) /* Intel */ return cpuid_x86_intel; else if ((type >= 0x18 && type <= 0x1D) /* AMD */ || type == 0x1F /* AMD */ || (type >= 0x38 && type <= 0x3F) /* AMD */ || (type >= 0x46 && type <= 0x4F) /* AMD */ || (type >= 0x66 && type <= 0x6B) /* AMD */ || (type >= 0x83 && type <= 0x8F) /* AMD */ || (type >= 0xB6 && type <= 0xB7) /* AMD */ || (type >= 0xE4 && type <= 0xEF)) /* AMD */ return cpuid_x86_amd; /* neither X86 nor ARM */ return cpuid_none; } void dmi_print_cpuid(void (*print_cb)(const char *name, const char *format, ...), const char *label, enum cpuid_type sig, const u8 *p) { u32 eax, midr, jep106, soc_revision; u16 dx; switch (sig) { case cpuid_80386: dx = WORD(p); /* * 80386 have a different signature. */ print_cb(label, "Type %u, Family %u, Major Stepping %u, Minor Stepping %u", dx >> 12, (dx >> 8) & 0xF, (dx >> 4) & 0xF, dx & 0xF); return; case cpuid_80486: dx = WORD(p); print_cb(label, "Type %u, Family %u, Model %u, Stepping %u", (dx >> 12) & 0x3, (dx >> 8) & 0xF, (dx >> 4) & 0xF, dx & 0xF); return; case cpuid_arm_legacy: /* ARM before SOC ID */ midr = DWORD(p); /* * The format of this field was not defined for ARM processors * before version 3.1.0 of the SMBIOS specification, so we * silently skip it if it reads all zeroes. */ if (midr == 0) return; print_cb(label, "Implementor 0x%02x, Variant 0x%x, Architecture %u, Part 0x%03x, Revision %u", midr >> 24, (midr >> 20) & 0xF, (midr >> 16) & 0xF, (midr >> 4) & 0xFFF, midr & 0xF); return; case cpuid_arm_soc_id: /* ARM with SOC ID */ /* * If Soc ID is supported, the first DWORD is the JEP-106 code; * the second DWORD is the SoC revision value. */ jep106 = DWORD(p); soc_revision = DWORD(p + 4); /* * According to SMC Calling Convention (SMCCC) v1.3 specification * (https://developer.arm.com/documentation/den0028/d/), the format * of the values returned by the SMCCC_ARCH_SOC_ID call is as follows: * * JEP-106 code for the SiP (SoC_ID_type == 0) * Bit[31] must be zero * Bits[30:24] JEP-106 bank index for the SiP * Bits[23:16] JEP-106 identification code with parity bit for the SiP * Bits[15:0] Implementation defined SoC ID * * SoC revision (SoC_ID_type == 1) * Bit[31] must be zero * Bits[30:0] SoC revision */ pr_attr("Signature", "JEP-106 Bank 0x%02x Manufacturer 0x%02x, SoC ID 0x%04x, SoC Revision 0x%08x", (jep106 >> 24) & 0x7F, (jep106 >> 16) & 0x7F, jep106 & 0xFFFF, soc_revision); return; case cpuid_x86_intel: /* Intel */ eax = DWORD(p); /* * Extra flags are now returned in the ECX register when * one calls the CPUID instruction. Their meaning is * explained in table 3-5, but DMI doesn't support this * yet. */ print_cb(label, "Type %u, Family %u, Model %u, Stepping %u", (eax >> 12) & 0x3, ((eax >> 20) & 0xFF) + ((eax >> 8) & 0x0F), ((eax >> 12) & 0xF0) + ((eax >> 4) & 0x0F), eax & 0xF); break; case cpuid_x86_amd: /* AMD, publication #25481 revision 2.28 */ eax = DWORD(p); print_cb(label, "Family %u, Model %u, Stepping %u", ((eax >> 8) & 0xF) + (((eax >> 8) & 0xF) == 0xF ? (eax >> 20) & 0xFF : 0), ((eax >> 4) & 0xF) | (((eax >> 8) & 0xF) == 0xF ? (eax >> 12) & 0xF0 : 0), eax & 0xF); break; default: return; } } static void dmi_processor_id(const struct dmi_header *h) { /* Intel AP-485 revision 36, table 2-4 */ static const char *flags[32] = { "FPU (Floating-point unit on-chip)", /* 0 */ "VME (Virtual mode extension)", "DE (Debugging extension)", "PSE (Page size extension)", "TSC (Time stamp counter)", "MSR (Model specific registers)", "PAE (Physical address extension)", "MCE (Machine check exception)", "CX8 (CMPXCHG8 instruction supported)", "APIC (On-chip APIC hardware supported)", NULL, /* 10 */ "SEP (Fast system call)", "MTRR (Memory type range registers)", "PGE (Page global enable)", "MCA (Machine check architecture)", "CMOV (Conditional move instruction supported)", "PAT (Page attribute table)", "PSE-36 (36-bit page size extension)", "PSN (Processor serial number present and enabled)", "CLFSH (CLFLUSH instruction supported)", NULL, /* 20 */ "DS (Debug store)", "ACPI (ACPI supported)", "MMX (MMX technology supported)", "FXSR (FXSAVE and FXSTOR instructions supported)", "SSE (Streaming SIMD extensions)", "SSE2 (Streaming SIMD extensions 2)", "SS (Self-snoop)", "HTT (Multi-threading)", "TM (Thermal monitor supported)", NULL, /* 30 */ "PBE (Pending break enabled)" /* 31 */ }; const u8 *data = h->data; const u8 *p = data + 0x08; enum cpuid_type sig = dmi_get_cpuid_type(h); u32 edx; /* * This might help learn about new processors supporting the * CPUID instruction or another form of identification. */ if (!(opt.flags & FLAG_QUIET)) pr_attr("ID", "%02X %02X %02X %02X %02X %02X %02X %02X", p[0], p[1], p[2], p[3], p[4], p[5], p[6], p[7]); dmi_print_cpuid(pr_attr, "Signature", sig, p); if (sig != cpuid_x86_intel && sig != cpuid_x86_amd) return; edx = DWORD(p + 4); if ((edx & 0xBFEFFBFF) == 0) pr_list_start("Flags", "None"); else { int i; pr_list_start("Flags", NULL); for (i = 0; i <= 31; i++) if (flags[i] != NULL && edx & (1 << i)) pr_list_item("%s", flags[i]); } pr_list_end(); } static void dmi_processor_voltage(const char *attr, u8 code) { /* 7.5.4 */ static const char *voltage[] = { "5.0 V", /* 0 */ "3.3 V", "2.9 V" /* 2 */ }; int i; if (code & 0x80) pr_attr(attr, "%.1f V", (float)(code & 0x7f) / 10); else if ((code & 0x07) == 0x00) pr_attr(attr, "Unknown"); else { char voltage_str[18]; int off = 0; for (i = 0; i <= 2; i++) { if (code & (1 << i)) { /* Insert space if not the first value */ off += sprintf(voltage_str + off, off ? " %s" :"%s", voltage[i]); } } if (off) pr_attr(attr, voltage_str); } } static void dmi_processor_frequency(const char *attr, const u8 *p) { u16 code = WORD(p); if (code) { if (attr) pr_attr(attr, "%u MHz", code); else printf("%u MHz\n", code); } else { if (attr) pr_attr(attr, "Unknown"); else printf("Unknown\n"); } } /* code is assumed to be a 3-bit value */ static const char *dmi_processor_status(u8 code) { static const char *status[] = { "Unknown", /* 0x00 */ "Enabled", "Disabled By User", "Disabled By BIOS", "Idle", /* 0x04 */ out_of_spec, out_of_spec, "Other" /* 0x07 */ }; return status[code]; } static const char *dmi_processor_upgrade(u8 code) { /* 7.5.5 */ static const char *upgrade[] = { "Other", /* 0x01 */ "Unknown", "Daughter Board", "ZIF Socket", "Replaceable Piggy Back", "None", "LIF Socket", "Slot 1", "Slot 2", "370-pin Socket", "Slot A", "Slot M", "Socket 423", "Socket A (Socket 462)", "Socket 478", "Socket 754", "Socket 940", "Socket 939", "Socket mPGA604", "Socket LGA771", "Socket LGA775", "Socket S1", "Socket AM2", "Socket F (1207)", "Socket LGA1366", "Socket G34", "Socket AM3", "Socket C32", "Socket LGA1156", "Socket LGA1567", "Socket PGA988A", "Socket BGA1288", "Socket rPGA988B", "Socket BGA1023", "Socket BGA1224", "Socket BGA1155", "Socket LGA1356", "Socket LGA2011", "Socket FS1", "Socket FS2", "Socket FM1", "Socket FM2", "Socket LGA2011-3", "Socket LGA1356-3", "Socket LGA1150", "Socket BGA1168", "Socket BGA1234", "Socket BGA1364", "Socket AM4", "Socket LGA1151", "Socket BGA1356", "Socket BGA1440", "Socket BGA1515", "Socket LGA3647-1", "Socket SP3", "Socket SP3r2", "Socket LGA2066", "Socket BGA1392", "Socket BGA1510", "Socket BGA1528", "Socket LGA4189", "Socket LGA1200", "Socket LGA4677" /* 0x3F */ }; if (code >= 0x01 && code <= 0x3F) return upgrade[code - 0x01]; return out_of_spec; } static void dmi_processor_cache(const char *attr, u16 code, const char *level, u16 ver) { if (code == 0xFFFF) { if (ver >= 0x0203) pr_attr(attr, "Not Provided"); else pr_attr(attr, "No %s Cache", level); } else pr_attr(attr, "0x%04X", code); } static void dmi_processor_characteristics(const char *attr, u16 code) { /* 7.5.9 */ static const char *characteristics[] = { "64-bit capable", /* 2 */ "Multi-Core", "Hardware Thread", "Execute Protection", "Enhanced Virtualization", "Power/Performance Control", "128-bit Capable", "Arm64 SoC ID" /* 9 */ }; if ((code & 0x00FC) == 0) pr_attr(attr, "None"); else { int i; pr_list_start(attr, NULL); for (i = 2; i <= 9; i++) if (code & (1 << i)) pr_list_item("%s", characteristics[i - 2]); pr_list_end(); } } /* * 7.6 Memory Controller Information (Type 5) */ static const char *dmi_memory_controller_ed_method(u8 code) { /* 7.6.1 */ static const char *method[] = { "Other", /* 0x01 */ "Unknown", "None", "8-bit Parity", "32-bit ECC", "64-bit ECC", "128-bit ECC", "CRC" /* 0x08 */ }; if (code >= 0x01 && code <= 0x08) return method[code - 0x01]; return out_of_spec; } static void dmi_memory_controller_ec_capabilities(const char *attr, u8 code) { /* 7.6.2 */ static const char *capabilities[] = { "Other", /* 0 */ "Unknown", "None", "Single-bit Error Correcting", "Double-bit Error Correcting", "Error Scrubbing" /* 5 */ }; if ((code & 0x3F) == 0) pr_attr(attr, "None"); else { int i; pr_list_start(attr, NULL); for (i = 0; i <= 5; i++) if (code & (1 << i)) pr_list_item("%s", capabilities[i]); pr_list_end(); } } static const char *dmi_memory_controller_interleave(u8 code) { /* 7.6.3 */ static const char *interleave[] = { "Other", /* 0x01 */ "Unknown", "One-way Interleave", "Two-way Interleave", "Four-way Interleave", "Eight-way Interleave", "Sixteen-way Interleave" /* 0x07 */ }; if (code >= 0x01 && code <= 0x07) return interleave[code - 0x01]; return out_of_spec; } static void dmi_memory_controller_speeds(const char *attr, u16 code) { /* 7.6.4 */ const char *speeds[] = { "Other", /* 0 */ "Unknown", "70 ns", "60 ns", "50 ns" /* 4 */ }; if ((code & 0x001F) == 0) pr_attr(attr, "None"); else { int i; pr_list_start(attr, NULL); for (i = 0; i <= 4; i++) if (code & (1 << i)) pr_list_item("%s", speeds[i]); pr_list_end(); } } static void dmi_memory_controller_slots(u8 count, const u8 *p) { int i; pr_list_start("Associated Memory Slots", "%u", count); for (i = 0; i < count; i++) pr_list_item("0x%04X", WORD(p + sizeof(u16) * i)); pr_list_end(); } /* * 7.7 Memory Module Information (Type 6) */ static void dmi_memory_module_types(const char *attr, u16 code, int flat) { /* 7.7.1 */ static const char *types[] = { "Other", /* 0 */ "Unknown", "Standard", "FPM", "EDO", "Parity", "ECC", "SIMM", "DIMM", "Burst EDO", "SDRAM" /* 10 */ }; if ((code & 0x07FF) == 0) pr_attr(attr, "None"); else if (flat) { char type_str[68]; int i, off = 0; for (i = 0; i <= 10; i++) { if (code & (1 << i)) { /* Insert space if not the first value */ off += sprintf(type_str + off, off ? " %s" :"%s", types[i]); } } if (off) pr_attr(attr, type_str); } else { int i; pr_list_start(attr, NULL); for (i = 0; i <= 10; i++) if (code & (1 << i)) pr_list_item("%s", types[i]); pr_list_end(); } } static void dmi_memory_module_connections(u8 code) { if (code == 0xFF) pr_attr("Bank Connections", "None"); else if ((code & 0xF0) == 0xF0) pr_attr("Bank Connections", "%u", code & 0x0F); else if ((code & 0x0F) == 0x0F) pr_attr("Bank Connections", "%u", code >> 4); else pr_attr("Bank Connections", "%u %u", code >> 4, code & 0x0F); } static void dmi_memory_module_speed(const char *attr, u8 code) { if (code == 0) pr_attr(attr, "Unknown"); else pr_attr(attr, "%u ns", code); } static void dmi_memory_module_size(const char *attr, u8 code) { const char *connection; /* 7.7.2 */ if (code & 0x80) connection = " (Double-bank Connection)"; else connection = " (Single-bank Connection)"; switch (code & 0x7F) { case 0x7D: pr_attr(attr, "Not Determinable%s", connection); break; case 0x7E: pr_attr(attr, "Disabled%s", connection); break; case 0x7F: pr_attr(attr, "Not Installed"); return; default: pr_attr(attr, "%u MB%s", 1 << (code & 0x7F), connection); } } static void dmi_memory_module_error(u8 code) { static const char *status[] = { "OK", /* 0x00 */ "Uncorrectable Errors", "Correctable Errors", "Correctable and Uncorrectable Errors" /* 0x03 */ }; if (code & (1 << 2)) pr_attr("Error Status", "See Event Log"); else pr_attr("Error Status", "%s", status[code & 0x03]); } /* * 7.8 Cache Information (Type 7) */ static const char *dmi_cache_mode(u8 code) { static const char *mode[] = { "Write Through", /* 0x00 */ "Write Back", "Varies With Memory Address", "Unknown" /* 0x03 */ }; return mode[code]; } /* code is assumed to be a 2-bit value */ static const char *dmi_cache_location(u8 code) { static const char *location[4] = { "Internal", /* 0x00 */ "External", out_of_spec, /* 0x02 */ "Unknown" /* 0x03 */ }; return location[code]; } static void dmi_cache_size_2(const char *attr, u32 code) { u64 size; if (code & 0x80000000) { code &= 0x7FFFFFFFLU; size.l = code << 6; size.h = code >> 26; } else { size.l = code; size.h = 0; } /* Use a more convenient unit for large cache size */ dmi_print_memory_size(attr, size, 1); } static void dmi_cache_size(const char *attr, u16 code) { dmi_cache_size_2(attr, (((u32)code & 0x8000LU) << 16) | (code & 0x7FFFLU)); } static void dmi_cache_types(const char *attr, u16 code, int flat) { /* 7.8.2 */ static const char *types[] = { "Other", /* 0 */ "Unknown", "Non-burst", "Burst", "Pipeline Burst", "Synchronous", "Asynchronous" /* 6 */ }; if ((code & 0x007F) == 0) pr_attr(attr, "None"); else if (flat) { char type_str[70]; int i, off = 0; for (i = 0; i <= 6; i++) { if (code & (1 << i)) { /* Insert space if not the first value */ off += sprintf(type_str + off, off ? " %s" :"%s", types[i]); } } if (off) pr_attr(attr, type_str); } else { int i; pr_list_start(attr, NULL); for (i = 0; i <= 6; i++) if (code & (1 << i)) pr_list_item("%s", types[i]); pr_list_end(); } } static const char *dmi_cache_ec_type(u8 code) { /* 7.8.3 */ static const char *type[] = { "Other", /* 0x01 */ "Unknown", "None", "Parity", "Single-bit ECC", "Multi-bit ECC" /* 0x06 */ }; if (code >= 0x01 && code <= 0x06) return type[code - 0x01]; return out_of_spec; } static const char *dmi_cache_type(u8 code) { /* 7.8.4 */ static const char *type[] = { "Other", /* 0x01 */ "Unknown", "Instruction", "Data", "Unified" /* 0x05 */ }; if (code >= 0x01 && code <= 0x05) return type[code - 0x01]; return out_of_spec; } static const char *dmi_cache_associativity(u8 code) { /* 7.8.5 */ static const char *type[] = { "Other", /* 0x01 */ "Unknown", "Direct Mapped", "2-way Set-associative", "4-way Set-associative", "Fully Associative", "8-way Set-associative", "16-way Set-associative", "12-way Set-associative", "24-way Set-associative", "32-way Set-associative", "48-way Set-associative", "64-way Set-associative", "20-way Set-associative" /* 0x0E */ }; if (code >= 0x01 && code <= 0x0E) return type[code - 0x01]; return out_of_spec; } /* * 7.9 Port Connector Information (Type 8) */ static const char *dmi_port_connector_type(u8 code) { /* 7.9.2 */ static const char *type[] = { "None", /* 0x00 */ "Centronics", "Mini Centronics", "Proprietary", "DB-25 male", "DB-25 female", "DB-15 male", "DB-15 female", "DB-9 male", "DB-9 female", "RJ-11", "RJ-45", "50 Pin MiniSCSI", "Mini DIN", "Micro DIN", "PS/2", "Infrared", "HP-HIL", "Access Bus (USB)", "SSA SCSI", "Circular DIN-8 male", "Circular DIN-8 female", "On Board IDE", "On Board Floppy", "9 Pin Dual Inline (pin 10 cut)", "25 Pin Dual Inline (pin 26 cut)", "50 Pin Dual Inline", "68 Pin Dual Inline", "On Board Sound Input From CD-ROM", "Mini Centronics Type-14", "Mini Centronics Type-26", "Mini Jack (headphones)", "BNC", "IEEE 1394", "SAS/SATA Plug Receptacle", "USB Type-C Receptacle" /* 0x23 */ }; static const char *type_0xA0[] = { "PC-98", /* 0xA0 */ "PC-98 Hireso", "PC-H98", "PC-98 Note", "PC-98 Full" /* 0xA4 */ }; if (code <= 0x23) return type[code]; if (code >= 0xA0 && code <= 0xA4) return type_0xA0[code - 0xA0]; if (code == 0xFF) return "Other"; return out_of_spec; } static const char *dmi_port_type(u8 code) { /* 7.9.3 */ static const char *type[] = { "None", /* 0x00 */ "Parallel Port XT/AT Compatible", "Parallel Port PS/2", "Parallel Port ECP", "Parallel Port EPP", "Parallel Port ECP/EPP", "Serial Port XT/AT Compatible", "Serial Port 16450 Compatible", "Serial Port 16550 Compatible", "Serial Port 16550A Compatible", "SCSI Port", "MIDI Port", "Joystick Port", "Keyboard Port", "Mouse Port", "SSA SCSI", "USB", "Firewire (IEEE P1394)", "PCMCIA Type I", "PCMCIA Type II", "PCMCIA Type III", "Cardbus", "Access Bus Port", "SCSI II", "SCSI Wide", "PC-98", "PC-98 Hireso", "PC-H98", "Video Port", "Audio Port", "Modem Port", "Network Port", "SATA", "SAS" /* 0x21 */ }; static const char *type_0xA0[] = { "8251 Compatible", /* 0xA0 */ "8251 FIFO Compatible" /* 0xA1 */ }; if (code <= 0x21) return type[code]; if (code >= 0xA0 && code <= 0xA1) return type_0xA0[code - 0xA0]; if (code == 0xFF) return "Other"; return out_of_spec; } /* * 7.10 System Slots (Type 9) */ static const char *dmi_slot_type(u8 code) { /* 7.10.1 */ static const char *type[] = { "Other", /* 0x01 */ "Unknown", "ISA", "MCA", "EISA", "PCI", "PC Card (PCMCIA)", "VLB", "Proprietary", "Processor Card", "Proprietary Memory Card", "I/O Riser Card", "NuBus", "PCI-66", "AGP", "AGP 2x", "AGP 4x", "PCI-X", "AGP 8x", "M.2 Socket 1-DP", "M.2 Socket 1-SD", "M.2 Socket 2", "M.2 Socket 3", "MXM Type I", "MXM Type II", "MXM Type III", "MXM Type III-HE", "MXM Type IV", "MXM 3.0 Type A", "MXM 3.0 Type B", "PCI Express 2 SFF-8639 (U.2)", "PCI Express 3 SFF-8639 (U.2)", "PCI Express Mini 52-pin with bottom-side keep-outs", "PCI Express Mini 52-pin without bottom-side keep-outs", "PCI Express Mini 76-pin", "PCI Express 4 SFF-8639 (U.2)", "PCI Express 5 SFF-8639 (U.2)", "OCP NIC 3.0 Small Form Factor (SFF)", "OCP NIC 3.0 Large Form Factor (LFF)", "OCP NIC Prior to 3.0" /* 0x28 */ }; static const char *type_0x30[] = { "CXL FLexbus 1.0" /* 0x30 */ }; static const char *type_0xA0[] = { "PC-98/C20", /* 0xA0 */ "PC-98/C24", "PC-98/E", "PC-98/Local Bus", "PC-98/Card", "PCI Express", "PCI Express x1", "PCI Express x2", "PCI Express x4", "PCI Express x8", "PCI Express x16", "PCI Express 2", "PCI Express 2 x1", "PCI Express 2 x2", "PCI Express 2 x4", "PCI Express 2 x8", "PCI Express 2 x16", "PCI Express 3", "PCI Express 3 x1", "PCI Express 3 x2", "PCI Express 3 x4", "PCI Express 3 x8", "PCI Express 3 x16", out_of_spec, /* 0xB7 */ "PCI Express 4", "PCI Express 4 x1", "PCI Express 4 x2", "PCI Express 4 x4", "PCI Express 4 x8", "PCI Express 4 x16", "PCI Express 5", "PCI Express 5 x1", "PCI Express 5 x2", "PCI Express 5 x4", "PCI Express 5 x8", "PCI Express 5 x16", "PCI Express 6+", "EDSFF E1", "EDSFF E3" /* 0xC6 */ }; /* * Note to developers: when adding entries to these lists, check if * function dmi_slot_id below needs updating too. */ if (code >= 0x01 && code <= 0x28) return type[code - 0x01]; if (code == 0x30) return type_0x30[code - 0x30]; if (code >= 0xA0 && code <= 0xC6) return type_0xA0[code - 0xA0]; return out_of_spec; } /* If hide_unknown is set, return NULL instead of "Other" or "Unknown" */ static const char *dmi_slot_bus_width(u8 code, int hide_unknown) { /* 7.10.2 */ static const char *width[] = { "Other", /* 0x01 */ "Unknown", "8-bit", "16-bit", "32-bit", "64-bit", "128-bit", "x1", "x2", "x4", "x8", "x12", "x16", "x32" /* 0x0E */ }; if (code >= 0x01 && code <= 0x0E) { if (code <= 0x02 && hide_unknown) return NULL; return width[code - 0x01]; } return out_of_spec; } static void dmi_slot_type_with_width(u8 type, u8 width) { const char *type_str, *width_str; type_str = dmi_slot_type(type); width_str = dmi_slot_bus_width(width, 1); if (width_str) pr_attr("Type", "%s %s", width_str, type_str); else pr_attr("Type", "%s", type_str); } static const char *dmi_slot_current_usage(u8 code) { /* 7.10.3 */ static const char *usage[] = { "Other", /* 0x01 */ "Unknown", "Available", "In Use", "Unavailable" /* 0x05 */ }; if (code >= 0x01 && code <= 0x05) return usage[code - 0x01]; return out_of_spec; } static const char *dmi_slot_length(u8 code) { /* 7.10.4 */ static const char *length[] = { "Other", /* 0x01 */ "Unknown", "Short", "Long", "2.5\" drive form factor", "3.5\" drive form factor" /* 0x06 */ }; if (code >= 0x01 && code <= 0x06) return length[code - 0x01]; return out_of_spec; } static void dmi_slot_id(u8 code1, u8 code2, u8 type) { /* 7.10.5 */ switch (type) { case 0x04: /* MCA */ pr_attr("ID", "%u", code1); break; case 0x05: /* EISA */ pr_attr("ID", "%u", code1); break; case 0x06: /* PCI */ case 0x0E: /* PCI */ case 0x0F: /* AGP */ case 0x10: /* AGP */ case 0x11: /* AGP */ case 0x12: /* PCI-X */ case 0x13: /* AGP */ case 0x1F: /* PCI Express 2 */ case 0x20: /* PCI Express 3 */ case 0x21: /* PCI Express Mini */ case 0x22: /* PCI Express Mini */ case 0x23: /* PCI Express Mini */ case 0xA5: /* PCI Express */ case 0xA6: /* PCI Express */ case 0xA7: /* PCI Express */ case 0xA8: /* PCI Express */ case 0xA9: /* PCI Express */ case 0xAA: /* PCI Express */ case 0xAB: /* PCI Express 2 */ case 0xAC: /* PCI Express 2 */ case 0xAD: /* PCI Express 2 */ case 0xAE: /* PCI Express 2 */ case 0xAF: /* PCI Express 2 */ case 0xB0: /* PCI Express 2 */ case 0xB1: /* PCI Express 3 */ case 0xB2: /* PCI Express 3 */ case 0xB3: /* PCI Express 3 */ case 0xB4: /* PCI Express 3 */ case 0xB5: /* PCI Express 3 */ case 0xB6: /* PCI Express 3 */ case 0xB8: /* PCI Express 4 */ case 0xB9: /* PCI Express 4 */ case 0xBA: /* PCI Express 4 */ case 0xBB: /* PCI Express 4 */ case 0xBC: /* PCI Express 4 */ case 0xBD: /* PCI Express 4 */ case 0xBE: /* PCI Express 5 */ case 0xBF: /* PCI Express 5 */ case 0xC0: /* PCI Express 5 */ case 0xC1: /* PCI Express 5 */ case 0xC2: /* PCI Express 5 */ case 0xC3: /* PCI Express 5 */ case 0xC4: /* PCI Express 6+ */ pr_attr("ID", "%u", code1); break; case 0x07: /* PCMCIA */ pr_attr("ID", "Adapter %u, Socket %u", code1, code2); break; } } static void dmi_slot_characteristics(const char *attr, u8 code1, u8 code2) { /* 7.10.6 */ static const char *characteristics1[] = { "5.0 V is provided", /* 1 */ "3.3 V is provided", "Opening is shared", "PC Card-16 is supported", "Cardbus is supported", "Zoom Video is supported", "Modem ring resume is supported" /* 7 */ }; /* 7.10.7 */ static const char *characteristics2[] = { "PME signal is supported", /* 0 */ "Hot-plug devices are supported", "SMBus signal is supported", "PCIe slot bifurcation is supported", "Async/surprise removal is supported", "Flexbus slot, CXL 1.0 capable", "Flexbus slot, CXL 2.0 capable" /* 6 */ }; if (code1 & (1 << 0)) pr_attr(attr, "Unknown"); else if ((code1 & 0xFE) == 0 && (code2 & 0x07) == 0) pr_attr(attr, "None"); else { int i; pr_list_start(attr, NULL); for (i = 1; i <= 7; i++) if (code1 & (1 << i)) pr_list_item("%s", characteristics1[i - 1]); for (i = 0; i <= 6; i++) if (code2 & (1 << i)) pr_list_item("%s", characteristics2[i]); pr_list_end(); } } static void dmi_slot_segment_bus_func(u16 code1, u8 code2, u8 code3) { /* 7.10.8 */ if (!(code1 == 0xFFFF && code2 == 0xFF && code3 == 0xFF)) pr_attr("Bus Address", "%04x:%02x:%02x.%x", code1, code2, code3 >> 3, code3 & 0x7); } static void dmi_slot_peers(u8 n, const u8 *data) { char attr[16]; int i; for (i = 1; i <= n; i++, data += 5) { sprintf(attr, "Peer Device %hhu", (u8)i); pr_attr(attr, "%04x:%02x:%02x.%x (Width %u)", WORD(data), data[2], data[3] >> 3, data[3] & 0x07, data[4]); } } static void dmi_slot_information(u8 type, u8 code) { switch (type) { case 0x1F: /* PCI Express 2 */ case 0x20: /* PCI Express 3 */ case 0x21: /* PCI Express Mini */ case 0x22: /* PCI Express Mini */ case 0x23: /* PCI Express Mini */ case 0xA5: /* PCI Express */ case 0xA6: /* PCI Express */ case 0xA7: /* PCI Express */ case 0xA8: /* PCI Express */ case 0xA9: /* PCI Express */ case 0xAA: /* PCI Express */ case 0xAB: /* PCI Express 2 */ case 0xAC: /* PCI Express 2 */ case 0xAD: /* PCI Express 2 */ case 0xAE: /* PCI Express 2 */ case 0xAF: /* PCI Express 2 */ case 0xB0: /* PCI Express 2 */ case 0xB1: /* PCI Express 3 */ case 0xB2: /* PCI Express 3 */ case 0xB3: /* PCI Express 3 */ case 0xB4: /* PCI Express 3 */ case 0xB5: /* PCI Express 3 */ case 0xB6: /* PCI Express 3 */ case 0xB8: /* PCI Express 4 */ case 0xB9: /* PCI Express 4 */ case 0xBA: /* PCI Express 4 */ case 0xBB: /* PCI Express 4 */ case 0xBC: /* PCI Express 4 */ case 0xBD: /* PCI Express 4 */ case 0xBE: /* PCI Express 5 */ case 0xBF: /* PCI Express 5 */ case 0xC0: /* PCI Express 5 */ case 0xC1: /* PCI Express 5 */ case 0xC2: /* PCI Express 5 */ case 0xC3: /* PCI Express 5 */ case 0xC4: /* PCI Express 6+ */ if (code) pr_attr("PCI Express Generation", "%u", code); break; } } static void dmi_slot_physical_width(u8 code) { if (code) pr_attr("Slot Physical Width", "%s", dmi_slot_bus_width(code, 0)); } static void dmi_slot_pitch(u16 code) { if (code) pr_attr("Pitch", "%u.%02u mm", code / 100, code % 100); } static const char *dmi_slot_height(u8 code) { /* 7.10.3 */ static const char *height[] = { "Not applicable", /* 0x00 */ "Other", "Unknown", "Full height", "Low-profile" /* 0x04 */ }; if (code <= 0x04) return height[code]; return out_of_spec; } /* * 7.11 On Board Devices Information (Type 10) */ static const char *dmi_on_board_devices_type(u8 code) { /* 7.11.1 and 7.42.2 */ static const char *type[] = { "Other", /* 0x01 */ "Unknown", "Video", "SCSI Controller", "Ethernet", "Token Ring", "Sound", "PATA Controller", "SATA Controller", "SAS Controller", "Wireless LAN", "Bluetooth", "WWAN", "eMMC", "NVMe Controller", "UFS Controller" /* 0x10 */ }; if (code >= 0x01 && code <= 0x10) return type[code - 0x01]; return out_of_spec; } static void dmi_on_board_devices(const struct dmi_header *h) { u8 *p = h->data + 4; u8 count = (h->length - 0x04) / 2; int i; for (i = 0; i < count; i++) { if (count == 1) pr_handle_name("On Board Device Information"); else pr_handle_name("On Board Device %d Information", i + 1); pr_attr("Type", "%s", dmi_on_board_devices_type(p[2 * i] & 0x7F)); pr_attr("Status", "%s", p[2 * i] & 0x80 ? "Enabled" : "Disabled"); pr_attr("Description", "%s", dmi_string(h, p[2 * i + 1])); } } /* * 7.12 OEM Strings (Type 11) */ static void dmi_oem_strings(const struct dmi_header *h) { char attr[11]; u8 *p = h->data + 4; u8 count = p[0x00]; int i; for (i = 1; i <= count; i++) { sprintf(attr, "String %hhu", (u8)i); pr_attr(attr, "%s",dmi_string(h, i)); } } /* * 7.13 System Configuration Options (Type 12) */ static void dmi_system_configuration_options(const struct dmi_header *h) { char attr[11]; u8 *p = h->data + 4; u8 count = p[0x00]; int i; for (i = 1; i <= count; i++) { sprintf(attr, "Option %hhu", (u8)i); pr_attr(attr, "%s",dmi_string(h, i)); } } /* * 7.14 BIOS Language Information (Type 13) */ static void dmi_bios_languages(const struct dmi_header *h) { u8 *p = h->data + 4; u8 count = p[0x00]; int i; for (i = 1; i <= count; i++) pr_list_item("%s", dmi_string(h, i)); } static const char *dmi_bios_language_format(u8 code) { if (code & 0x01) return "Abbreviated"; else return "Long"; } /* * 7.15 Group Associations (Type 14) */ static void dmi_group_associations_items(u8 count, const u8 *p) { int i; for (i = 0; i < count; i++) { pr_list_item("0x%04X (%s)", WORD(p + 3 * i + 1), dmi_smbios_structure_type(p[3 * i])); } } /* * 7.16 System Event Log (Type 15) */ static const char *dmi_event_log_method(u8 code) { static const char *method[] = { "Indexed I/O, one 8-bit index port, one 8-bit data port", /* 0x00 */ "Indexed I/O, two 8-bit index ports, one 8-bit data port", "Indexed I/O, one 16-bit index port, one 8-bit data port", "Memory-mapped physical 32-bit address", "General-purpose non-volatile data functions" /* 0x04 */ }; if (code <= 0x04) return method[code]; if (code >= 0x80) return "OEM-specific"; return out_of_spec; } static void dmi_event_log_status(u8 code) { static const char *valid[] = { "Invalid", /* 0 */ "Valid" /* 1 */ }; static const char *full[] = { "Not Full", /* 0 */ "Full" /* 1 */ }; pr_attr("Status", "%s, %s", valid[(code >> 0) & 1], full[(code >> 1) & 1]); } static void dmi_event_log_address(u8 method, const u8 *p) { /* 7.16.3 */ switch (method) { case 0x00: case 0x01: case 0x02: pr_attr("Access Address", "Index 0x%04X, Data 0x%04X", WORD(p), WORD(p + 2)); break; case 0x03: pr_attr("Access Address", "0x%08X", DWORD(p)); break; case 0x04: pr_attr("Access Address", "0x%04X", WORD(p)); break; default: pr_attr("Access Address", "Unknown"); } } static const char *dmi_event_log_header_type(u8 code) { static const char *type[] = { "No Header", /* 0x00 */ "Type 1" /* 0x01 */ }; if (code <= 0x01) return type[code]; if (code >= 0x80) return "OEM-specific"; return out_of_spec; } static const char *dmi_event_log_descriptor_type(u8 code) { /* 7.16.6.1 */ static const char *type[] = { NULL, /* 0x00 */ "Single-bit ECC memory error", "Multi-bit ECC memory error", "Parity memory error", "Bus timeout", "I/O channel block", "Software NMI", "POST memory resize", "POST error", "PCI parity error", "PCI system error", "CPU failure", "EISA failsafe timer timeout", "Correctable memory log disabled", "Logging disabled", NULL, /* 0x0F */ "System limit exceeded", "Asynchronous hardware timer expired", "System configuration information", "Hard disk information", "System reconfigured", "Uncorrectable CPU-complex error", "Log area reset/cleared", "System boot" /* 0x17 */ }; if (code <= 0x17 && type[code] != NULL) return type[code]; if (code >= 0x80 && code <= 0xFE) return "OEM-specific"; if (code == 0xFF) return "End of log"; return out_of_spec; } static const char *dmi_event_log_descriptor_format(u8 code) { /* 7.16.6.2 */ static const char *format[] = { "None", /* 0x00 */ "Handle", "Multiple-event", "Multiple-event handle", "POST results bitmap", "System management", "Multiple-event system management" /* 0x06 */ }; if (code <= 0x06) return format[code]; if (code >= 0x80) return "OEM-specific"; return out_of_spec; } static void dmi_event_log_descriptors(u8 count, u8 len, const u8 *p) { /* 7.16.1 */ char attr[16]; int i; for (i = 0; i < count; i++) { if (len >= 0x02) { sprintf(attr, "Descriptor %d", i + 1); pr_attr(attr, "%s", dmi_event_log_descriptor_type(p[i * len])); sprintf(attr, "Data Format %d", i + 1); pr_attr(attr, "%s", dmi_event_log_descriptor_format(p[i * len + 1])); } } } /* * 7.17 Physical Memory Array (Type 16) */ static const char *dmi_memory_array_location(u8 code) { /* 7.17.1 */ static const char *location[] = { "Other", /* 0x01 */ "Unknown", "System Board Or Motherboard", "ISA Add-on Card", "EISA Add-on Card", "PCI Add-on Card", "MCA Add-on Card", "PCMCIA Add-on Card", "Proprietary Add-on Card", "NuBus" /* 0x0A */ }; static const char *location_0xA0[] = { "PC-98/C20 Add-on Card", /* 0xA0 */ "PC-98/C24 Add-on Card", "PC-98/E Add-on Card", "PC-98/Local Bus Add-on Card", "CXL Flexbus 1.0" /* 0xA4 */ }; if (code >= 0x01 && code <= 0x0A) return location[code - 0x01]; if (code >= 0xA0 && code <= 0xA4) return location_0xA0[code - 0xA0]; return out_of_spec; } static const char *dmi_memory_array_use(u8 code) { /* 7.17.2 */ static const char *use[] = { "Other", /* 0x01 */ "Unknown", "System Memory", "Video Memory", "Flash Memory", "Non-volatile RAM", "Cache Memory" /* 0x07 */ }; if (code >= 0x01 && code <= 0x07) return use[code - 0x01]; return out_of_spec; } static const char *dmi_memory_array_ec_type(u8 code) { /* 7.17.3 */ static const char *type[] = { "Other", /* 0x01 */ "Unknown", "None", "Parity", "Single-bit ECC", "Multi-bit ECC", "CRC" /* 0x07 */ }; if (code >= 0x01 && code <= 0x07) return type[code - 0x01]; return out_of_spec; } static void dmi_memory_array_error_handle(u16 code) { if (code == 0xFFFE) pr_attr("Error Information Handle", "Not Provided"); else if (code == 0xFFFF) pr_attr("Error Information Handle", "No Error"); else pr_attr("Error Information Handle", "0x%04X", code); } /* * 7.18 Memory Device (Type 17) */ static void dmi_memory_device_width(const char *attr, u16 code) { /* * If no memory module is present, width may be 0 */ if (code == 0xFFFF || (code == 0 && !(opt.flags & FLAG_NO_QUIRKS))) pr_attr(attr, "Unknown"); else pr_attr(attr, "%u bits", code); } static void dmi_memory_device_size(u16 code) { if (code == 0) pr_attr("Size", "No Module Installed"); else if (code == 0xFFFF) pr_attr("Size", "Unknown"); else { u64 s = { .l = code & 0x7FFF }; if (!(code & 0x8000)) s.l <<= 10; dmi_print_memory_size("Size", s, 1); } } static char *dmi_memory_device_size_str(u16 code) { static char size[STR_LEN] = ""; if (code == 0) strncpy(size, "Empty", STR_LEN); else if (code == 0xFFFF) strncpy(size, "Unknown", STR_LEN); else { u64 s = { .l = code & 0x7FFF }; if (!(code & 0x8000)) s.l <<= 10; dmi_print_memory_size_str(size, STR_LEN, s, 1); } return size; } static void dmi_memory_device_extended_size(u32 code) { code &= 0x7FFFFFFFUL; /* * Use the greatest unit for which the exact value can be displayed * as an integer without rounding */ if (code & 0x3FFUL) pr_attr("Size", "%lu MB", (unsigned long)code); else if (code & 0xFFC00UL) pr_attr("Size", "%lu GB", (unsigned long)code >> 10); else pr_attr("Size", "%lu TB", (unsigned long)code >> 20); } static char *dmi_memory_device_extended_size_str(u32 code) { static char size[STR_LEN] = ""; code &= 0x7FFFFFFFUL; /* * Use the greatest unit for which the exact value can be displayed * as an integer without rounding */ if (code & 0x3FFUL) snprintf(size, STR_LEN, "%lu @MB@", (unsigned long)code); else if (code & 0xFFC00UL) snprintf(size, STR_LEN, "%lu @GB@", (unsigned long)code >> 10); else snprintf(size, STR_LEN, "%lu @TB@", (unsigned long)code >> 20); return size; } static void dmi_memory_voltage_value(const char *attr, u16 code) { if (code == 0) pr_attr(attr, "Unknown"); else pr_attr(attr, code % 100 ? "%g V" : "%.1f V", (float)code / 1000); } static char *dmi_memory_voltage_value_str(u16 code) { static char voltage[MAXSTR] = ""; if (code != 0) snprintf(voltage, MAXSTR, code % 100 ? "%g V" : "%.1f V", (float)code / 1000); return voltage; } static const char *dmi_memory_device_form_factor(u8 code) { /* 7.18.1 */ static const char *form_factor[] = { "Other", /* 0x01 */ "Unknown", "SIMM", "SIP", "Chip", "DIP", "ZIP", "Proprietary Card", "DIMM", "TSOP", "Row Of Chips", "RIMM", "SODIMM", "SRIMM", "FB-DIMM", "Die" /* 0x10 */ }; if (code >= 0x01 && code <= 0x10) return form_factor[code - 0x01]; return out_of_spec; } static void dmi_memory_device_set(u8 code) { if (code == 0) pr_attr("Set", "None"); else if (code == 0xFF) pr_attr("Set", "Unknown"); else pr_attr("Set", "%u", code); } static const char *dmi_memory_device_type(u8 code) { /* 7.18.2 */ static const char *type[] = { "Other", /* 0x01 */ "Unknown", "DRAM", "EDRAM", "VRAM", "SRAM", "RAM", "ROM", "Flash", "EEPROM", "FEPROM", "EPROM", "CDRAM", "3DRAM", "SDRAM", "SGRAM", "RDRAM", "DDR", "DDR2", "DDR2 FB-DIMM", "Reserved", "Reserved", "Reserved", "DDR3", "FBD2", "DDR4", "LPDDR", "LPDDR2", "LPDDR3", "LPDDR4", "Logical non-volatile device", "HBM", "HBM2", "DDR5", "LPDDR5" /* 0x23 */ }; if (code >= 0x01 && code <= 0x23) return type[code - 0x01]; return out_of_spec; } static void dmi_memory_device_type_detail(u16 code) { /* 7.18.3 */ static const char *detail[] = { "Other", /* 1 */ "Unknown", "Fast-paged", "Static Column", "Pseudo-static", "RAMBus", "Synchronous", "CMOS", "EDO", "Window DRAM", "Cache DRAM", "Non-Volatile", "Registered (Buffered)", "Unbuffered (Unregistered)", "LRDIMM" /* 15 */ }; char list[172]; /* Update length if you touch the array above */ if ((code & 0xFFFE) == 0) pr_attr("Type Detail", "None"); else { int i, off = 0; list[0] = '\0'; for (i = 1; i <= 15; i++) if (code & (1 << i)) off += sprintf(list + off, off ? " %s" : "%s", detail[i - 1]); pr_attr("Type Detail", list); } } static char *dmi_memory_device_type_detail_str(u16 code) { /* 7.18.3 */ static const char *detail[] = { "Other", /* 1 */ "Unknown", "Fast-paged", "Static Column", "Pseudo-static", "RAMBus", "Synchronous", "CMOS", "EDO", "Window DRAM", "Cache DRAM", "Non-Volatile", "Registered (Buffered)", "Unbuffered (Unregistered)", "LRDIMM" /* 15 */ }; static char list[172]; /* Update length if you touch the array above */ if ((code & 0xFFFE) == 0) return "None"; else { int i, off = 0; list[0] = '\0'; for (i = 1; i <= 15; i++) if (code & (1 << i)) off += sprintf(list + off, off ? " %s" : "%s", detail[i - 1]); return list; } } static void dmi_memory_device_speed(const char *attr, u16 code1, u32 code2) { if (code1 == 0xFFFF) { if (code2 == 0) pr_attr(attr, "Unknown"); else pr_attr(attr, "%lu MT/s", code2); } else { if (code1 == 0) pr_attr(attr, "Unknown"); else pr_attr(attr, "%u MT/s", code1); } } static char *dmi_memory_device_speed_str(u16 code1, u32 code2) { static char speed[STR_LEN] = ""; if (code1 == 0xFFFF) { if (code2 != 0) snprintf(speed, STR_LEN, "%u MT/s", code2); } else { if (code1 != 0) snprintf(speed, STR_LEN, "%u MT/s", code1); } return speed; } static void dmi_memory_technology(u8 code) { /* 7.18.6 */ static const char * const technology[] = { "Other", /* 0x01 */ "Unknown", "DRAM", "NVDIMM-N", "NVDIMM-F", "NVDIMM-P", "Intel Optane DC persistent memory" /* 0x07 */ }; if (code >= 0x01 && code <= 0x07) pr_attr("Memory Technology", "%s", technology[code - 0x01]); else pr_attr("Memory Technology", "%s", out_of_spec); } static void dmi_memory_operating_mode_capability(u16 code) { /* 7.18.7 */ static const char * const mode[] = { "Other", /* 1 */ "Unknown", "Volatile memory", "Byte-accessible persistent memory", "Block-accessible persistent memory" /* 5 */ }; char list[99]; /* Update length if you touch the array above */ if ((code & 0xFFFE) == 0) pr_attr("Memory Operating Mode Capability", "None"); else { int i, off = 0; list[0] = '\0'; for (i = 1; i <= 5; i++) if (code & (1 << i)) off += sprintf(list + off, off ? " %s" : "%s", mode[i - 1]); pr_attr("Memory Operating Mode Capability", list); } } static void dmi_memory_manufacturer_id(const char *attr, u16 code) { /* 7.18.8 */ /* 7.18.10 */ /* LSB is 7-bit Odd Parity number of continuation codes */ if (code == 0) pr_attr(attr, "Unknown"); else pr_attr(attr, "Bank %d, Hex 0x%02X", (code & 0x7F) + 1, code >> 8); } static void dmi_memory_product_id(const char *attr, u16 code) { /* 7.18.9 */ /* 7.18.11 */ if (code == 0) pr_attr(attr, "Unknown"); else pr_attr(attr, "0x%04X", code); } static void dmi_memory_size(const char *attr, u64 code) { /* 7.18.12 */ /* 7.18.13 */ if (code.h == 0xFFFFFFFF && code.l == 0xFFFFFFFF) pr_attr(attr, "Unknown"); else if (code.h == 0x0 && code.l == 0x0) pr_attr(attr, "None"); else dmi_print_memory_size(attr, code, 0); } /* * 7.19 32-bit Memory Error Information (Type 18) */ static const char *dmi_memory_error_type(u8 code) { /* 7.19.1 */ static const char *type[] = { "Other", /* 0x01 */ "Unknown", "OK", "Bad Read", "Parity Error", "Single-bit Error", "Double-bit Error", "Multi-bit Error", "Nibble Error", "Checksum Error", "CRC Error", "Corrected Single-bit Error", "Corrected Error", "Uncorrectable Error" /* 0x0E */ }; if (code >= 0x01 && code <= 0x0E) return type[code - 0x01]; return out_of_spec; } static const char *dmi_memory_error_granularity(u8 code) { /* 7.19.2 */ static const char *granularity[] = { "Other", /* 0x01 */ "Unknown", "Device Level", "Memory Partition Level" /* 0x04 */ }; if (code >= 0x01 && code <= 0x04) return granularity[code - 0x01]; return out_of_spec; } static const char *dmi_memory_error_operation(u8 code) { /* 7.19.3 */ static const char *operation[] = { "Other", /* 0x01 */ "Unknown", "Read", "Write", "Partial Write" /* 0x05 */ }; if (code >= 0x01 && code <= 0x05) return operation[code - 0x01]; return out_of_spec; } static void dmi_memory_error_syndrome(u32 code) { if (code == 0x00000000) pr_attr("Vendor Syndrome", "Unknown"); else pr_attr("Vendor Syndrome", "0x%08X", code); } static void dmi_32bit_memory_error_address(const char *attr, u32 code) { if (code == 0x80000000) pr_attr(attr, "Unknown"); else pr_attr(attr, "0x%08X", code); } /* * 7.20 Memory Array Mapped Address (Type 19) */ static void dmi_mapped_address_size(u32 code) { if (code == 0) pr_attr("Range Size", "Invalid"); else { u64 size; size.h = 0; size.l = code; dmi_print_memory_size("Range Size", size, 1); } } static void dmi_mapped_address_extended_size(u64 start, u64 end) { if (start.h == end.h && start.l == end.l) pr_attr("Range Size", "Invalid"); else dmi_print_memory_size("Range Size", u64_range(start, end), 0); } /* * 7.21 Memory Device Mapped Address (Type 20) */ static void dmi_mapped_address_row_position(u8 code) { if (code == 0) pr_attr("Partition Row Position", "%s", out_of_spec); else if (code == 0xFF) pr_attr("Partition Row Position", "Unknown"); else pr_attr("Partition Row Position", "%u", code); } static void dmi_mapped_address_interleave_position(u8 code) { if (code != 0) { if (code == 0xFF) pr_attr("Interleave Position", "Unknown"); else pr_attr("Interleave Position", "%u", code); } } static void dmi_mapped_address_interleaved_data_depth(u8 code) { if (code != 0) { if (code == 0xFF) pr_attr("Interleaved Data Depth", "Unknown"); else pr_attr("Interleaved Data Depth", "%u", code); } } /* * 7.22 Built-in Pointing Device (Type 21) */ static const char *dmi_pointing_device_type(u8 code) { /* 7.22.1 */ static const char *type[] = { "Other", /* 0x01 */ "Unknown", "Mouse", "Track Ball", "Track Point", "Glide Point", "Touch Pad", "Touch Screen", "Optical Sensor" /* 0x09 */ }; if (code >= 0x01 && code <= 0x09) return type[code - 0x01]; return out_of_spec; } static const char *dmi_pointing_device_interface(u8 code) { /* 7.22.2 */ static const char *interface[] = { "Other", /* 0x01 */ "Unknown", "Serial", "PS/2", "Infrared", "HIP-HIL", "Bus Mouse", "ADB (Apple Desktop Bus)" /* 0x08 */ }; static const char *interface_0xA0[] = { "Bus Mouse DB-9", /* 0xA0 */ "Bus Mouse Micro DIN", "USB", "I2C", "SPI" /* 0xA4 */ }; if (code >= 0x01 && code <= 0x08) return interface[code - 0x01]; if (code >= 0xA0 && code <= 0xA4) return interface_0xA0[code - 0xA0]; return out_of_spec; } /* * 7.23 Portable Battery (Type 22) */ static const char *dmi_battery_chemistry(u8 code) { /* 7.23.1 */ static const char *chemistry[] = { "Other", /* 0x01 */ "Unknown", "Lead Acid", "Nickel Cadmium", "Nickel Metal Hydride", "Lithium Ion", "Zinc Air", "Lithium Polymer" /* 0x08 */ }; if (code >= 0x01 && code <= 0x08) return chemistry[code - 0x01]; return out_of_spec; } static void dmi_battery_capacity(u16 code, u8 multiplier) { if (code == 0) pr_attr("Design Capacity", "Unknown"); else pr_attr("Design Capacity", "%u mWh", code * multiplier); } static void dmi_battery_voltage(u16 code) { if (code == 0) pr_attr("Design Voltage", "Unknown"); else pr_attr("Design Voltage", "%u mV", code); } static void dmi_battery_maximum_error(u8 code) { if (code == 0xFF) pr_attr("Maximum Error", "Unknown"); else pr_attr("Maximum Error", "%u%%", code); } /* * 7.24 System Reset (Type 23) */ /* code is assumed to be a 2-bit value */ static const char *dmi_system_reset_boot_option(u8 code) { static const char *option[] = { out_of_spec, /* 0x0 */ "Operating System", /* 0x1 */ "System Utilities", "Do Not Reboot" /* 0x3 */ }; return option[code]; } static void dmi_system_reset_count(const char *attr, u16 code) { if (code == 0xFFFF) pr_attr(attr, "Unknown"); else pr_attr(attr, "%u", code); } static void dmi_system_reset_timer(const char *attr, u16 code) { if (code == 0xFFFF) pr_attr(attr, "Unknown"); else pr_attr(attr, "%u min", code); } /* * 7.25 Hardware Security (Type 24) */ static const char *dmi_hardware_security_status(u8 code) { static const char *status[] = { "Disabled", /* 0x00 */ "Enabled", "Not Implemented", "Unknown" /* 0x03 */ }; return status[code]; } /* * 7.26 System Power Controls (Type 25) */ static void dmi_power_controls_power_on(const u8 *p) { char time[15]; int off = 0; /* 7.26.1 */ if (dmi_bcd_range(p[0], 0x01, 0x12)) off += sprintf(time + off, "%02X", p[0]); else off += sprintf(time + off, "*"); if (dmi_bcd_range(p[1], 0x01, 0x31)) off += sprintf(time + off, "-%02X", p[1]); else off += sprintf(time + off, "-*"); if (dmi_bcd_range(p[2], 0x00, 0x23)) off += sprintf(time + off, " %02X", p[2]); else off += sprintf(time + off, " *"); if (dmi_bcd_range(p[3], 0x00, 0x59)) off += sprintf(time + off, ":%02X", p[3]); else off += sprintf(time + off, ":*"); if (dmi_bcd_range(p[4], 0x00, 0x59)) off += sprintf(time + off, ":%02X", p[4]); else off += sprintf(time + off, ":*"); pr_attr("Next Scheduled Power-on", time); } /* * 7.27 Voltage Probe (Type 26) */ static const char *dmi_voltage_probe_location(u8 code) { /* 7.27.1 */ static const char *location[] = { "Other", /* 0x01 */ "Unknown", "Processor", "Disk", "Peripheral Bay", "System Management Module", "Motherboard", "Memory Module", "Processor Module", "Power Unit", "Add-in Card" /* 0x0B */ }; if (code >= 0x01 && code <= 0x0B) return location[code - 0x01]; return out_of_spec; } static const char *dmi_probe_status(u8 code) { /* 7.27.1 */ static const char *status[] = { "Other", /* 0x01 */ "Unknown", "OK", "Non-critical", "Critical", "Non-recoverable" /* 0x06 */ }; if (code >= 0x01 && code <= 0x06) return status[code - 0x01]; return out_of_spec; } static void dmi_voltage_probe_value(const char *attr, u16 code) { if (code == 0x8000) pr_attr(attr, "Unknown"); else pr_attr(attr, "%.3f V", (float)(i16)code / 1000); } static void dmi_voltage_probe_resolution(u16 code) { if (code == 0x8000) pr_attr("Resolution", "Unknown"); else pr_attr("Resolution", "%.1f mV", (float)code / 10); } static void dmi_probe_accuracy(u16 code) { if (code == 0x8000) pr_attr("Accuracy", "Unknown"); else pr_attr("Accuracy", "%.2f%%", (float)code / 100); } /* * 7.28 Cooling Device (Type 27) */ static const char *dmi_cooling_device_type(u8 code) { /* 7.28.1 */ static const char *type[] = { "Other", /* 0x01 */ "Unknown", "Fan", "Centrifugal Blower", "Chip Fan", "Cabinet Fan", "Power Supply Fan", "Heat Pipe", "Integrated Refrigeration" /* 0x09 */ }; static const char *type_0x10[] = { "Active Cooling", /* 0x10 */ "Passive Cooling" /* 0x11 */ }; if (code >= 0x01 && code <= 0x09) return type[code - 0x01]; if (code >= 0x10 && code <= 0x11) return type_0x10[code - 0x10]; return out_of_spec; } static void dmi_cooling_device_speed(u16 code) { if (code == 0x8000) pr_attr("Nominal Speed", "Unknown Or Non-rotating"); else pr_attr("Nominal Speed", "%u rpm", code); } /* * 7.29 Temperature Probe (Type 28) */ static const char *dmi_temperature_probe_location(u8 code) { /* 7.29.1 */ static const char *location[] = { "Other", /* 0x01 */ "Unknown", "Processor", "Disk", "Peripheral Bay", "System Management Module", "Motherboard", "Memory Module", "Processor Module", "Power Unit", "Add-in Card", "Front Panel Board", "Back Panel Board", "Power System Board", "Drive Back Plane" /* 0x0F */ }; if (code >= 0x01 && code <= 0x0F) return location[code - 0x01]; return out_of_spec; } static void dmi_temperature_probe_value(const char *attr, u16 code) { if (code == 0x8000) pr_attr(attr, "Unknown"); else pr_attr(attr, "%.1f deg C", (float)(i16)code / 10); } static void dmi_temperature_probe_resolution(u16 code) { if (code == 0x8000) pr_attr("Resolution", "Unknown"); else pr_attr("Resolution", "%.3f deg C", (float)code / 1000); } /* * 7.30 Electrical Current Probe (Type 29) */ static void dmi_current_probe_value(const char *attr, u16 code) { if (code == 0x8000) pr_attr(attr, "Unknown"); else pr_attr(attr, "%.3f A", (float)(i16)code / 1000); } static void dmi_current_probe_resolution(u16 code) { if (code == 0x8000) pr_attr("Resolution", "Unknown"); else pr_attr("Resolution", "%.1f mA", (float)code / 10); } /* * 7.33 System Boot Information (Type 32) */ static const char *dmi_system_boot_status(u8 code) { static const char *status[] = { "No errors detected", /* 0 */ "No bootable media", "Operating system failed to load", "Firmware-detected hardware failure", "Operating system-detected hardware failure", "User-requested boot", "System security violation", "Previously-requested image", "System watchdog timer expired" /* 8 */ }; if (code <= 8) return status[code]; if (code >= 128 && code <= 191) return "OEM-specific"; if (code >= 192) return "Product-specific"; return out_of_spec; } /* * 7.34 64-bit Memory Error Information (Type 33) */ static void dmi_64bit_memory_error_address(const char *attr, u64 code) { if (code.h == 0x80000000 && code.l == 0x00000000) pr_attr(attr, "Unknown"); else pr_attr(attr, "0x%08X%08X", code.h, code.l); } /* * 7.35 Management Device (Type 34) */ /* * Several boards have a bug where some type 34 structures have their * length incorrectly set to 0x10 instead of 0x0B. This causes the * first 5 characters of the device name to be trimmed. It's easy to * check and fix, so do it, but warn. */ static void dmi_fixup_type_34(struct dmi_header *h, int display) { u8 *p = h->data; /* Make sure the hidden data is ASCII only */ if (h->length == 0x10 && is_printable(p + 0x0B, 0x10 - 0x0B)) { if (!(opt.flags & FLAG_QUIET) && display) fprintf(stderr, "Invalid entry length (%u). Fixed up to %u.\n", 0x10, 0x0B); h->length = 0x0B; } } static const char *dmi_management_device_type(u8 code) { /* 7.35.1 */ static const char *type[] = { "Other", /* 0x01 */ "Unknown", "LM75", "LM78", "LM79", "LM80", "LM81", "ADM9240", "DS1780", "MAX1617", "GL518SM", "W83781D", "HT82H791" /* 0x0D */ }; if (code >= 0x01 && code <= 0x0D) return type[code - 0x01]; return out_of_spec; } static const char *dmi_management_device_address_type(u8 code) { /* 7.35.2 */ static const char *type[] = { "Other", /* 0x01 */ "Unknown", "I/O Port", "Memory", "SMBus" /* 0x05 */ }; if (code >= 0x01 && code <= 0x05) return type[code - 0x01]; return out_of_spec; } /* * 7.38 Memory Channel (Type 37) */ static const char *dmi_memory_channel_type(u8 code) { /* 7.38.1 */ static const char *type[] = { "Other", /* 0x01 */ "Unknown", "RamBus", "SyncLink" /* 0x04 */ }; if (code >= 0x01 && code <= 0x04) return type[code - 0x01]; return out_of_spec; } static void dmi_memory_channel_devices(u8 count, const u8 *p) { char attr[18]; int i; for (i = 1; i <= count; i++) { sprintf(attr, "Device %hhu Load", (u8)i); pr_attr(attr, "%u", p[3 * i]); if (!(opt.flags & FLAG_QUIET)) { sprintf(attr, "Device %hhu Handle", (u8)i); pr_attr(attr, "0x%04X", WORD(p + 3 * i + 1)); } } } /* * 7.39 IPMI Device Information (Type 38) */ static const char *dmi_ipmi_interface_type(u8 code) { /* 7.39.1 and IPMI 2.0, appendix C1, table C1-2 */ static const char *type[] = { "Unknown", /* 0x00 */ "KCS (Keyboard Control Style)", "SMIC (Server Management Interface Chip)", "BT (Block Transfer)", "SSIF (SMBus System Interface)" /* 0x04 */ }; if (code <= 0x04) return type[code]; return out_of_spec; } static void dmi_ipmi_base_address(u8 type, const u8 *p, u8 lsb) { if (type == 0x04) /* SSIF */ { pr_attr("Base Address", "0x%02X (SMBus)", (*p) >> 1); } else { u64 address = QWORD(p); pr_attr("Base Address", "0x%08X%08X (%s)", address.h, (address.l & ~1) | lsb, address.l & 1 ? "I/O" : "Memory-mapped"); } } /* code is assumed to be a 2-bit value */ static const char *dmi_ipmi_register_spacing(u8 code) { /* IPMI 2.0, appendix C1, table C1-1 */ static const char *spacing[] = { "Successive Byte Boundaries", /* 0x00 */ "32-bit Boundaries", "16-byte Boundaries", /* 0x02 */ out_of_spec /* 0x03 */ }; return spacing[code]; } /* * 7.40 System Power Supply (Type 39) */ static void dmi_power_supply_power(u16 code) { if (code == 0x8000) pr_attr("Max Power Capacity", "Unknown"); else pr_attr("Max Power Capacity", "%u W", (unsigned int)code); } static const char *dmi_power_supply_type(u8 code) { /* 7.40.1 */ static const char *type[] = { "Other", /* 0x01 */ "Unknown", "Linear", "Switching", "Battery", "UPS", "Converter", "Regulator" /* 0x08 */ }; if (code >= 0x01 && code <= 0x08) return type[code - 0x01]; return out_of_spec; } static const char *dmi_power_supply_status(u8 code) { /* 7.40.1 */ static const char *status[] = { "Other", /* 0x01 */ "Unknown", "OK", "Non-critical", "Critical" /* 0x05 */ }; if (code >= 0x01 && code <= 0x05) return status[code - 0x01]; return out_of_spec; } static const char *dmi_power_supply_range_switching(u8 code) { /* 7.40.1 */ static const char *switching[] = { "Other", /* 0x01 */ "Unknown", "Manual", "Auto-switch", "Wide Range", "N/A" /* 0x06 */ }; if (code >= 0x01 && code <= 0x06) return switching[code - 0x01]; return out_of_spec; } /* * 7.41 Additional Information (Type 40) * * Proper support of this entry type would require redesigning a large part of * the code, so I am waiting to see actual implementations of it to decide * whether it's worth the effort. */ static void dmi_additional_info(const struct dmi_header *h) { u8 *p = h->data + 4; u8 count = *p++; u8 length; int i, offset = 5; for (i = 0; i < count; i++) { pr_handle_name("Additional Information %d", i + 1); /* Check for short entries */ if (h->length < offset + 1) break; length = p[0x00]; if (length < 0x05 || h->length < offset + length) break; pr_attr("Referenced Handle", "0x%04x", WORD(p + 0x01)); pr_attr("Referenced Offset", "0x%02x", p[0x03]); pr_attr("String", "%s", dmi_string(h, p[0x04])); switch (length - 0x05) { case 1: pr_attr("Value", "0x%02x", p[0x05]); break; case 2: pr_attr("Value", "0x%04x", WORD(p + 0x05)); break; case 4: pr_attr("Value", "0x%08x", DWORD(p + 0x05)); break; default: pr_attr("Value", "Unexpected size"); break; } p += length; offset += length; } } /* * 7.43 Management Controller Host Interface (Type 42) */ static const char *dmi_management_controller_host_type(u8 code) { /* DMTF DSP0239 (MCTP) version 1.1.0 */ static const char *type[] = { "KCS: Keyboard Controller Style", /* 0x02 */ "8250 UART Register Compatible", "16450 UART Register Compatible", "16550/16550A UART Register Compatible", "16650/16650A UART Register Compatible", "16750/16750A UART Register Compatible", "16850/16850A UART Register Compatible" /* 0x08 */ }; if (code >= 0x02 && code <= 0x08) return type[code - 0x02]; if (code <= 0x3F) return "MCTP"; if (code == 0x40) return "Network"; if (code == 0xF0) return "OEM"; return out_of_spec; } /* * 7.43.2: Protocol Record Types */ static const char *dmi_protocol_record_type(u8 type) { const char *protocol[] = { "Reserved", /* 0x0 */ "Reserved", "IPMI", "MCTP", "Redfish over IP", /* 0x4 */ }; if (type <= 0x4) return protocol[type]; if (type == 0xF0) return "OEM"; return out_of_spec; } /* * DSP0270: 8.6: Protocol IP Assignment types */ static const char *dmi_protocol_assignment_type(u8 type) { const char *assignment[] = { "Unknown", /* 0x0 */ "Static", "DHCP", "AutoConf", "Host Selected", /* 0x4 */ }; if (type <= 0x4) return assignment[type]; return out_of_spec; } /* * DSP0270: 8.6: Protocol IP Address type */ static const char *dmi_address_type(u8 type) { const char *addressformat[] = { "Unknown", /* 0x0 */ "IPv4", "IPv6", /* 0x2 */ }; if (type <= 0x2) return addressformat[type]; return out_of_spec; } /* * DSP0270: 8.6 Protocol Address decode */ static const char *dmi_address_decode(u8 *data, char *storage, u8 addrtype) { if (addrtype == 0x1) /* IPv4 */ return inet_ntop(AF_INET, data, storage, 64); if (addrtype == 0x2) /* IPv6 */ return inet_ntop(AF_INET6, data, storage, 64); return out_of_spec; } /* * DSP0270: 8.5: Parse the protocol record format */ static void dmi_parse_protocol_record(u8 *rec) { u8 rid; u8 rlen; u8 *rdata; char buf[64]; u8 assign_val; u8 addrtype; u8 hlen; const char *addrstr; const char *hname; char attr[38]; /* DSP0270: 8.5: Protocol Identifier */ rid = rec[0x0]; /* DSP0270: 8.5: Protocol Record Length */ rlen = rec[0x1]; /* DSP0270: 8.5: Protocol Record Data */ rdata = &rec[0x2]; pr_attr("Protocol ID", "%02x (%s)", rid, dmi_protocol_record_type(rid)); /* * Don't decode anything other than Redfish for now * Note 0x4 is Redfish over IP in 7.43.2 * and DSP0270: 8.5 */ if (rid != 0x4) return; /* * Ensure that the protocol record is of sufficient length * For RedFish that means rlen must be at least 91 bytes * other protcols will need different length checks */ if (rlen < 91) return; /* * DSP0270: 8.6: Redfish Over IP Service UUID * Note: ver is hardcoded to 0x311 here just for * convenience. It could get passed from the SMBIOS * header, but that's a lot of passing of pointers just * to get that info, and the only thing it is used for is * to determine the endianness of the field. Since we only * do this parsing on versions of SMBIOS after 3.1.1, and the * endianness of the field is always little after version 2.6.0 * we can just pick a sufficiently recent version here. */ dmi_system_uuid(pr_subattr, "Service UUID", &rdata[0], 0x311); /* * DSP0270: 8.6: Redfish Over IP Host IP Assignment Type * Note, using decimal indices here, as the DSP0270 * uses decimal, so as to make it more comparable */ assign_val = rdata[16]; pr_subattr("Host IP Assignment Type", "%s", dmi_protocol_assignment_type(assign_val)); /* DSP0270: 8.6: Redfish Over IP Host Address format */ addrtype = rdata[17]; addrstr = dmi_address_type(addrtype); pr_subattr("Host IP Address Format", "%s", addrstr); /* DSP0270: 8.6 IP Assignment types */ /* We only use the Host IP Address and Mask if the assignment type is static */ if (assign_val == 0x1 || assign_val == 0x3) { /* DSP0270: 8.6: the Host IPv[4|6] Address */ sprintf(attr, "%s Address", addrstr); pr_subattr(attr, "%s", dmi_address_decode(&rdata[18], buf, addrtype)); /* DSP0270: 8.6: Prints the Host IPv[4|6] Mask */ sprintf(attr, "%s Mask", addrstr); pr_subattr(attr, "%s", dmi_address_decode(&rdata[34], buf, addrtype)); } /* DSP0270: 8.6: Get the Redfish Service IP Discovery Type */ assign_val = rdata[50]; /* Redfish Service IP Discovery type mirrors Host IP Assignment type */ pr_subattr("Redfish Service IP Discovery Type", "%s", dmi_protocol_assignment_type(assign_val)); /* DSP0270: 8.6: Get the Redfish Service IP Address Format */ addrtype = rdata[51]; addrstr = dmi_address_type(addrtype); pr_subattr("Redfish Service IP Address Format", "%s", addrstr); if (assign_val == 0x1 || assign_val == 0x3) { u16 port; u32 vlan; /* DSP0270: 8.6: Prints the Redfish IPv[4|6] Service Address */ sprintf(attr, "%s Redfish Service Address", addrstr); pr_subattr(attr, "%s", dmi_address_decode(&rdata[52], buf, addrtype)); /* DSP0270: 8.6: Prints the Redfish IPv[4|6] Service Mask */ sprintf(attr, "%s Redfish Service Mask", addrstr); pr_subattr(attr, "%s", dmi_address_decode(&rdata[68], buf, addrtype)); /* DSP0270: 8.6: Redfish vlan and port info */ port = WORD(&rdata[84]); vlan = DWORD(&rdata[86]); pr_subattr("Redfish Service Port", "%hu", port); pr_subattr("Redfish Service Vlan", "%u", vlan); } /* DSP0270: 8.6: Redfish host length and name */ hlen = rdata[90]; /* * DSP0270: 8.6: The length of the host string + 91 (the minimum * size of a protocol record) cannot exceed the record length * (rec[0x1]) */ hname = (const char *)&rdata[91]; if (hlen + 91 > rlen) { hname = out_of_spec; hlen = strlen(out_of_spec); } pr_subattr("Redfish Service Hostname", "%.*s", hlen, hname); } /* * DSP0270: 8.3: Device type ennumeration */ static const char *dmi_parse_device_type(u8 type) { const char *devname[] = { "USB", /* 0x2 */ "PCI/PCIe", /* 0x3 */ }; if (type >= 0x2 && type <= 0x3) return devname[type - 0x2]; if (type >= 0x80) return "OEM"; return out_of_spec; } static void dmi_parse_controller_structure(const struct dmi_header *h) { int i; u8 *data = h->data; /* Host interface type */ u8 type; /* Host Interface specific data length */ u8 len; u8 count; u32 total_read; /* * Minimum length of this struct is 0xB bytes */ if (h->length < 0xB) return; /* * Also need to ensure that the interface specific data length * plus the size of the structure to that point don't exceed * the defined length of the structure, or we will overrun its * bounds */ len = data[0x5]; total_read = len + 0x6; if (total_read > h->length) return; type = data[0x4]; pr_attr("Host Interface Type", "%s", dmi_management_controller_host_type(type)); /* * The following decodes are code for Network interface host types only * As defined in DSP0270 */ if (type != 0x40) return; if (len != 0) { /* DSP0270: 8.3 Table 2: Device Type */ type = data[0x6]; pr_attr("Device Type", "%s", dmi_parse_device_type(type)); if (type == 0x2 && len >= 5) { /* USB Device Type - need at least 6 bytes */ u8 *usbdata = &data[0x7]; /* USB Device Descriptor: idVendor */ pr_attr("idVendor", "0x%04x", WORD(&usbdata[0x0])); /* USB Device Descriptor: idProduct */ pr_attr("idProduct", "0x%04x", WORD(&usbdata[0x2])); /* * USB Serial number is here, but its useless, don't * bother decoding it */ } else if (type == 0x3 && len >= 9) { /* PCI Device Type - Need at least 8 bytes */ u8 *pcidata = &data[0x7]; /* PCI Device Descriptor: VendorID */ pr_attr("VendorID", "0x%04x", WORD(&pcidata[0x0])); /* PCI Device Descriptor: DeviceID */ pr_attr("DeviceID", "0x%04x", WORD(&pcidata[0x2])); /* PCI Device Descriptor: PCI SubvendorID */ pr_attr("SubVendorID", "0x%04x", WORD(&pcidata[0x4])); /* PCI Device Descriptor: PCI SubdeviceID */ pr_attr("SubDeviceID", "0x%04x", WORD(&pcidata[0x6])); } else if (type == 0x4 && len >= 5) { /* OEM Device Type - Need at least 4 bytes */ u8 *oemdata = &data[0x7]; /* OEM Device Descriptor: IANA */ pr_attr("Vendor ID", "0x%02x:0x%02x:0x%02x:0x%02x", oemdata[0x0], oemdata[0x1], oemdata[0x2], oemdata[0x3]); } /* Don't mess with unknown types for now */ } /* * DSP0270: 8.2 and 8.5: Protocol record count and protocol records * Move to the Protocol Count. */ data = &data[total_read]; /* * We've validated up to 0x6 + len bytes, but we need to validate * the next byte below, the count value. */ total_read++; if (total_read > h->length) { fprintf(stderr, "Total read length %d exceeds total structure length %d (handle 0x%04hx)\n", total_read, h->length, h->handle); return; } /* Get the protocol records count */ count = data[0x0]; if (count) { u8 *rec = &data[0x1]; for (i = 0; i < count; i++) { /* * Need to ensure that this record doesn't overrun * the total length of the type 42 struct. Note the +2 * is added for the two leading bytes of a protocol * record representing the type and length bytes. */ total_read += rec[1] + 2; if (total_read > h->length) { fprintf(stderr, "Total read length %d exceeds total structure length %d (handle 0x%04hx, record %d)\n", total_read, h->length, h->handle, i + 1); return; } dmi_parse_protocol_record(rec); /* * DSP0270: 8.6 * Each record is rec[1] bytes long, starting at the * data byte immediately following the length field. * That means we need to add the byte for the rec id, * the byte for the length field, and the value of the * length field itself. */ rec += rec[1] + 2; } } } /* * 7.44 TPM Device (Type 43) */ static void dmi_tpm_vendor_id(const u8 *p) { char vendor_id[5]; int i; /* ASCII filtering */ for (i = 0; i < 4 && p[i] != 0; i++) { if (p[i] < 32 || p[i] >= 127) vendor_id[i] = '.'; else vendor_id[i] = p[i]; } /* Terminate the string */ vendor_id[i] = '\0'; pr_attr("Vendor ID", "%s", vendor_id); } static void dmi_tpm_characteristics(u64 code) { /* 7.1.1 */ static const char *characteristics[] = { "TPM Device characteristics not supported", /* 2 */ "Family configurable via firmware update", "Family configurable via platform software support", "Family configurable via OEM proprietary mechanism" /* 5 */ }; int i; /* * This isn't very clear what this bit is supposed to mean */ if (code.l & (1 << 2)) { pr_list_item("%s", characteristics[0]); return; } for (i = 3; i <= 5; i++) if (code.l & (1 << i)) pr_list_item("%s", characteristics[i - 2]); } /* * 7.46 Firmware Inventory Information (Type 45) */ static void dmi_firmware_characteristics(u16 code) { /* 7.46.3 */ static const char *characteristics[] = { "Updatable", /* 0 */ "Write-Protect" /* 1 */ }; int i; for (i = 0; i <= 1; i++) pr_list_item("%s: %s", characteristics[i], (code & (1 << i)) ? "Yes" : "No"); } static const char *dmi_firmware_state(u8 code) { /* 7.46.4 */ static const char *state[] = { "Other", /* 0x01 */ "Unknown", "Disabled", "Enabled", "Absent", "Stand-by Offline", "Stand-by Spare", "Unavailable Offline" /* 0x08 */ }; if (code >= 0x01 && code <= 0x08) return state[code - 0x01]; return out_of_spec; } static void dmi_firmware_components(u8 count, const u8 *p) { int i; pr_list_start("Associated Components", "%u", count); for (i = 0; i < count; i++) pr_list_item("0x%04X", WORD(p + sizeof(u16) * i)); pr_list_end(); } /* * Main */ static void dmi_decode(const struct dmi_header *h, u16 ver) { const u8 *data = h->data; /* * Note: DMI types 37 and 42 are untested */ switch (h->type) { case 0: /* 7.1 BIOS Information */ pr_handle_name("BIOS Information"); if (h->length < 0x12) break; pr_attr("Vendor", "%s", dmi_string(h, data[0x04])); pr_attr("Version", "%s", dmi_string(h, data[0x05])); pr_attr("Release Date", "%s", dmi_string(h, data[0x08])); /* * On IA-64 and UEFI-based systems, the BIOS base * address will read 0 because there is no BIOS. Skip * the base address and the runtime size in this case. */ if (WORD(data + 0x06) != 0) { pr_attr("Address", "0x%04X0", WORD(data + 0x06)); dmi_bios_runtime_size((0x10000 - WORD(data + 0x06)) << 4); } dmi_bios_rom_size(data[0x09], h->length < 0x1A ? 16 : WORD(data + 0x18)); pr_list_start("Characteristics", NULL); dmi_bios_characteristics(QWORD(data + 0x0A)); pr_list_end(); if (h->length < 0x13) break; dmi_bios_characteristics_x1(data[0x12]); if (h->length < 0x14) break; dmi_bios_characteristics_x2(data[0x13]); if (h->length < 0x18) break; if (data[0x14] != 0xFF && data[0x15] != 0xFF) pr_attr("BIOS Revision", "%u.%u", data[0x14], data[0x15]); if (data[0x16] != 0xFF && data[0x17] != 0xFF) pr_attr("Firmware Revision", "%u.%u", data[0x16], data[0x17]); break; case 1: /* 7.2 System Information */ pr_handle_name("System Information"); if (h->length < 0x08) break; pr_attr("Manufacturer", "%s", dmi_string(h, data[0x04])); pr_attr("Product Name", "%s", dmi_string(h, data[0x05])); pr_attr("Version", "%s", dmi_string(h, data[0x06])); pr_attr("Serial Number", "%s", dmi_string(h, data[0x07])); if (h->length < 0x19) break; dmi_system_uuid(pr_attr, "UUID", data + 0x08, ver); pr_attr("Wake-up Type", "%s", dmi_system_wake_up_type(data[0x18])); if (h->length < 0x1B) break; pr_attr("SKU Number", "%s", dmi_string(h, data[0x19])); pr_attr("Family", "%s", dmi_string(h, data[0x1A])); break; case 2: /* 7.3 Base Board Information */ pr_handle_name("Base Board Information"); if (h->length < 0x08) break; pr_attr("Manufacturer", "%s", dmi_string(h, data[0x04])); pr_attr("Product Name", "%s", dmi_string(h, data[0x05])); pr_attr("Version", "%s", dmi_string(h, data[0x06])); pr_attr("Serial Number", "%s", dmi_string(h, data[0x07])); if (h->length < 0x09) break; pr_attr("Asset Tag", "%s", dmi_string(h, data[0x08])); if (h->length < 0x0A) break; dmi_base_board_features(data[0x09]); if (h->length < 0x0E) break; pr_attr("Location In Chassis", "%s", dmi_string(h, data[0x0A])); if (!(opt.flags & FLAG_QUIET)) pr_attr("Chassis Handle", "0x%04X", WORD(data + 0x0B)); pr_attr("Type", "%s", dmi_base_board_type(data[0x0D])); if (h->length < 0x0F) break; if (h->length < 0x0F + data[0x0E] * sizeof(u16)) break; if (!(opt.flags & FLAG_QUIET)) dmi_base_board_handles(data[0x0E], data + 0x0F); break; case 3: /* 7.4 Chassis Information */ pr_handle_name("Chassis Information"); if (h->length < 0x09) break; pr_attr("Manufacturer", "%s", dmi_string(h, data[0x04])); pr_attr("Type", "%s", dmi_chassis_type(data[0x05])); pr_attr("Lock", "%s", dmi_chassis_lock(data[0x05] >> 7)); pr_attr("Version", "%s", dmi_string(h, data[0x06])); pr_attr("Serial Number", "%s", dmi_string(h, data[0x07])); pr_attr("Asset Tag", "%s", dmi_string(h, data[0x08])); if (h->length < 0x0D) break; pr_attr("Boot-up State", "%s", dmi_chassis_state(data[0x09])); pr_attr("Power Supply State", "%s", dmi_chassis_state(data[0x0A])); pr_attr("Thermal State", "%s", dmi_chassis_state(data[0x0B])); pr_attr("Security Status", "%s", dmi_chassis_security_status(data[0x0C])); if (h->length < 0x11) break; pr_attr("OEM Information", "0x%08X", DWORD(data + 0x0D)); if (h->length < 0x13) break; dmi_chassis_height(data[0x11]); dmi_chassis_power_cords(data[0x12]); if (h->length < 0x15) break; if (h->length < 0x15 + data[0x13] * data[0x14]) break; dmi_chassis_elements(data[0x13], data[0x14], data + 0x15); if (h->length < 0x16 + data[0x13] * data[0x14]) break; pr_attr("SKU Number", "%s", dmi_string(h, data[0x15 + data[0x13] * data[0x14]])); break; case 4: /* 7.5 Processor Information */ pr_handle_name("Processor Information"); if (h->length < 0x1A) break; pr_attr("Socket Designation", "%s", dmi_string(h, data[0x04])); pr_attr("Type", "%s", dmi_processor_type(data[0x05])); pr_attr("Family", "%s", dmi_processor_family(h, ver)); pr_attr("Manufacturer", "%s", dmi_string(h, data[0x07])); dmi_processor_id(h); pr_attr("Version", "%s", dmi_string(h, data[0x10])); dmi_processor_voltage("Voltage", data[0x11]); dmi_processor_frequency("External Clock", data + 0x12); dmi_processor_frequency("Max Speed", data + 0x14); dmi_processor_frequency("Current Speed", data + 0x16); if (data[0x18] & (1 << 6)) pr_attr("Status", "Populated, %s", dmi_processor_status(data[0x18] & 0x07)); else pr_attr("Status", "Unpopulated"); pr_attr("Upgrade", "%s", dmi_processor_upgrade(data[0x19])); if (h->length < 0x20) break; if (!(opt.flags & FLAG_QUIET)) { dmi_processor_cache("L1 Cache Handle", WORD(data + 0x1A), "L1", ver); dmi_processor_cache("L2 Cache Handle", WORD(data + 0x1C), "L2", ver); dmi_processor_cache("L3 Cache Handle", WORD(data + 0x1E), "L3", ver); } if (h->length < 0x23) break; pr_attr("Serial Number", "%s", dmi_string(h, data[0x20])); pr_attr("Asset Tag", "%s", dmi_string(h, data[0x21])); pr_attr("Part Number", "%s", dmi_string(h, data[0x22])); if (h->length < 0x28) break; if (data[0x23] != 0) pr_attr("Core Count", "%u", h->length >= 0x2C && data[0x23] == 0xFF ? WORD(data + 0x2A) : data[0x23]); if (data[0x24] != 0) pr_attr("Core Enabled", "%u", h->length >= 0x2E && data[0x24] == 0xFF ? WORD(data + 0x2C) : data[0x24]); if (data[0x25] != 0) pr_attr("Thread Count", "%u", h->length >= 0x30 && data[0x25] == 0xFF ? WORD(data + 0x2E) : data[0x25]); dmi_processor_characteristics("Characteristics", WORD(data + 0x26)); break; case 5: /* 7.6 Memory Controller Information */ pr_handle_name("Memory Controller Information"); if (h->length < 0x0F) break; pr_attr("Error Detecting Method", "%s", dmi_memory_controller_ed_method(data[0x04])); dmi_memory_controller_ec_capabilities("Error Correcting Capabilities", data[0x05]); pr_attr("Supported Interleave", "%s", dmi_memory_controller_interleave(data[0x06])); pr_attr("Current Interleave", "%s", dmi_memory_controller_interleave(data[0x07])); pr_attr("Maximum Memory Module Size", "%u MB", 1 << data[0x08]); pr_attr("Maximum Total Memory Size", "%u MB", data[0x0E] * (1 << data[0x08])); dmi_memory_controller_speeds("Supported Speeds", WORD(data + 0x09)); dmi_memory_module_types("Supported Memory Types", WORD(data + 0x0B), 0); dmi_processor_voltage("Memory Module Voltage", data[0x0D]); if (h->length < 0x0F + data[0x0E] * sizeof(u16)) break; dmi_memory_controller_slots(data[0x0E], data + 0x0F); if (h->length < 0x10 + data[0x0E] * sizeof(u16)) break; dmi_memory_controller_ec_capabilities("Enabled Error Correcting Capabilities", data[0x0F + data[0x0E] * sizeof(u16)]); break; case 6: /* 7.7 Memory Module Information */ pr_handle_name("Memory Module Information"); if (h->length < 0x0C) break; pr_attr("Socket Designation", "%s", dmi_string(h, data[0x04])); dmi_memory_module_connections(data[0x05]); dmi_memory_module_speed("Current Speed", data[0x06]); dmi_memory_module_types("Type", WORD(data + 0x07), 1); dmi_memory_module_size("Installed Size", data[0x09]); dmi_memory_module_size("Enabled Size", data[0x0A]); dmi_memory_module_error(data[0x0B]); break; case 7: /* 7.8 Cache Information */ pr_handle_name("Cache Information"); if (h->length < 0x0F) break; pr_attr("Socket Designation", "%s", dmi_string(h, data[0x04])); pr_attr("Configuration", "%s, %s, Level %u", WORD(data + 0x05) & 0x0080 ? "Enabled" : "Disabled", WORD(data + 0x05) & 0x0008 ? "Socketed" : "Not Socketed", (WORD(data + 0x05) & 0x0007) + 1); pr_attr("Operational Mode", "%s", dmi_cache_mode((WORD(data + 0x05) >> 8) & 0x0003)); pr_attr("Location", "%s", dmi_cache_location((WORD(data + 0x05) >> 5) & 0x0003)); if (h->length >= 0x1B) dmi_cache_size_2("Installed Size", DWORD(data + 0x17)); else dmi_cache_size("Installed Size", WORD(data + 0x09)); if (h->length >= 0x17) dmi_cache_size_2("Maximum Size", DWORD(data + 0x13)); else dmi_cache_size("Maximum Size", WORD(data + 0x07)); dmi_cache_types("Supported SRAM Types", WORD(data + 0x0B), 0); dmi_cache_types("Installed SRAM Type", WORD(data + 0x0D), 1); if (h->length < 0x13) break; dmi_memory_module_speed("Speed", data[0x0F]); pr_attr("Error Correction Type", "%s", dmi_cache_ec_type(data[0x10])); pr_attr("System Type", "%s", dmi_cache_type(data[0x11])); pr_attr("Associativity", "%s", dmi_cache_associativity(data[0x12])); break; case 8: /* 7.9 Port Connector Information */ pr_handle_name("Port Connector Information"); if (h->length < 0x09) break; pr_attr("Internal Reference Designator", "%s", dmi_string(h, data[0x04])); pr_attr("Internal Connector Type", "%s", dmi_port_connector_type(data[0x05])); pr_attr("External Reference Designator", "%s", dmi_string(h, data[0x06])); pr_attr("External Connector Type", "%s", dmi_port_connector_type(data[0x07])); pr_attr("Port Type", "%s", dmi_port_type(data[0x08])); break; case 9: /* 7.10 System Slots */ pr_handle_name("System Slot Information"); if (h->length < 0x0C) break; pr_attr("Designation", "%s", dmi_string(h, data[0x04])); dmi_slot_type_with_width(data[0x05], data[0x06]); pr_attr("Current Usage", "%s", dmi_slot_current_usage(data[0x07])); pr_attr("Length", "%s", dmi_slot_length(data[0x08])); dmi_slot_id(data[0x09], data[0x0A], data[0x05]); if (h->length < 0x0D) dmi_slot_characteristics("Characteristics", data[0x0B], 0x00); else dmi_slot_characteristics("Characteristics", data[0x0B], data[0x0C]); if (h->length < 0x11) break; dmi_slot_segment_bus_func(WORD(data + 0x0D), data[0x0F], data[0x10]); if (h->length < 0x13) break; pr_attr("Data Bus Width", "%u", data[0x11]); pr_attr("Peer Devices", "%u", data[0x12]); if (h->length < 0x13 + data[0x12] * 5) break; dmi_slot_peers(data[0x12], data + 0x13); if (h->length < 0x17 + data[0x12] * 5) break; dmi_slot_information(data[0x05], data[0x13 + data[0x12] * 5]); dmi_slot_physical_width(data[0x14 + data[0x12] * 5]); dmi_slot_pitch(WORD(data + 0x15 + data[0x12] * 5)); if (h->length < 0x18 + data[0x12] * 5) break; pr_attr("Height", "%s", dmi_slot_height(data[0x17 + data[0x12] * 5])); break; case 10: /* 7.11 On Board Devices Information */ dmi_on_board_devices(h); break; case 11: /* 7.12 OEM Strings */ pr_handle_name("OEM Strings"); if (h->length < 0x05) break; dmi_oem_strings(h); break; case 12: /* 7.13 System Configuration Options */ pr_handle_name("System Configuration Options"); if (h->length < 0x05) break; dmi_system_configuration_options(h); break; case 13: /* 7.14 BIOS Language Information */ pr_handle_name("BIOS Language Information"); if (h->length < 0x16) break; if (ver >= 0x0201) { pr_attr("Language Description Format", "%s", dmi_bios_language_format(data[0x05])); } pr_list_start("Installable Languages", "%u", data[0x04]); dmi_bios_languages(h); pr_list_end(); pr_attr("Currently Installed Language", "%s", dmi_string(h, data[0x15])); break; case 14: /* 7.15 Group Associations */ pr_handle_name("Group Associations"); if (h->length < 0x05) break; pr_attr("Name", "%s", dmi_string(h, data[0x04])); pr_list_start("Items", "%u", (h->length - 0x05) / 3); dmi_group_associations_items((h->length - 0x05) / 3, data + 0x05); pr_list_end(); break; case 15: /* 7.16 System Event Log */ pr_handle_name("System Event Log"); if (h->length < 0x14) break; pr_attr("Area Length", "%u bytes", WORD(data + 0x04)); pr_attr("Header Start Offset", "0x%04X", WORD(data + 0x06)); if (WORD(data + 0x08) - WORD(data + 0x06)) pr_attr("Header Length", "%u byte%s", WORD(data + 0x08) - WORD(data + 0x06), WORD(data + 0x08) - WORD(data + 0x06) > 1 ? "s" : ""); pr_attr("Data Start Offset", "0x%04X", WORD(data + 0x08)); pr_attr("Access Method", "%s", dmi_event_log_method(data[0x0A])); dmi_event_log_address(data[0x0A], data + 0x10); dmi_event_log_status(data[0x0B]); pr_attr("Change Token", "0x%08X", DWORD(data + 0x0C)); if (h->length < 0x17) break; pr_attr("Header Format", "%s", dmi_event_log_header_type(data[0x14])); pr_attr("Supported Log Type Descriptors", "%u", data[0x15]); if (h->length < 0x17 + data[0x15] * data[0x16]) break; dmi_event_log_descriptors(data[0x15], data[0x16], data + 0x17); break; case 16: /* 7.17 Physical Memory Array */ pr_handle_name("Physical Memory Array"); if (h->length < 0x0F) break; pr_attr("Location", "%s", dmi_memory_array_location(data[0x04])); pr_attr("Use", "%s", dmi_memory_array_use(data[0x05])); pr_attr("Error Correction Type", "%s", dmi_memory_array_ec_type(data[0x06])); if (DWORD(data + 0x07) == 0x80000000) { if (h->length < 0x17) pr_attr("Maximum Capacity", "Unknown"); else dmi_print_memory_size("Maximum Capacity", QWORD(data + 0x0F), 0); } else { u64 capacity; capacity.h = 0; capacity.l = DWORD(data + 0x07); dmi_print_memory_size("Maximum Capacity", capacity, 1); } if (!(opt.flags & FLAG_QUIET)) dmi_memory_array_error_handle(WORD(data + 0x0B)); pr_attr("Number Of Devices", "%u", WORD(data + 0x0D)); break; case 17: /* 7.18 Memory Device */ pr_handle_name("Memory Device"); if (h->length < 0x15) break; if (!(opt.flags & FLAG_QUIET)) { pr_attr("Array Handle", "0x%04X", WORD(data + 0x04)); dmi_memory_array_error_handle(WORD(data + 0x06)); } dmi_memory_device_width("Total Width", WORD(data + 0x08)); dmi_memory_device_width("Data Width", WORD(data + 0x0A)); if (h->length >= 0x20 && WORD(data + 0x0C) == 0x7FFF) dmi_memory_device_extended_size(DWORD(data + 0x1C)); else dmi_memory_device_size(WORD(data + 0x0C)); pr_attr("Form Factor", "%s", dmi_memory_device_form_factor(data[0x0E])); dmi_memory_device_set(data[0x0F]); pr_attr("Locator", "%s", dmi_string(h, data[0x10])); pr_attr("Bank Locator", "%s", dmi_string(h, data[0x11])); pr_attr("Type", "%s", dmi_memory_device_type(data[0x12])); dmi_memory_device_type_detail(WORD(data + 0x13)); if (h->length < 0x17) break; /* If no module is present, the remaining fields are irrelevant */ if (WORD(data + 0x0C) == 0 && !(opt.flags & FLAG_NO_QUIRKS)) break; dmi_memory_device_speed("Speed", WORD(data + 0x15), h->length >= 0x5C ? DWORD(data + 0x54) : 0); if (h->length < 0x1B) break; pr_attr("Manufacturer", "%s", dmi_string(h, data[0x17])); pr_attr("Serial Number", "%s", dmi_string(h, data[0x18])); pr_attr("Asset Tag", "%s", dmi_string(h, data[0x19])); pr_attr("Part Number", "%s", dmi_string(h, data[0x1A])); if (h->length < 0x1C) break; if ((data[0x1B] & 0x0F) == 0) pr_attr("Rank", "Unknown"); else pr_attr("Rank", "%u", data[0x1B] & 0x0F); if (h->length < 0x22) break; dmi_memory_device_speed("Configured Memory Speed", WORD(data + 0x20), h->length >= 0x5C ? DWORD(data + 0x58) : 0); if (h->length < 0x28) break; dmi_memory_voltage_value("Minimum Voltage", WORD(data + 0x22)); dmi_memory_voltage_value("Maximum Voltage", WORD(data + 0x24)); dmi_memory_voltage_value("Configured Voltage", WORD(data + 0x26)); if (h->length < 0x34) break; dmi_memory_technology(data[0x28]); dmi_memory_operating_mode_capability(WORD(data + 0x29)); pr_attr("Firmware Version", "%s", dmi_string(h, data[0x2B])); dmi_memory_manufacturer_id("Module Manufacturer ID", WORD(data + 0x2C)); dmi_memory_product_id("Module Product ID", WORD(data + 0x2E)); dmi_memory_manufacturer_id("Memory Subsystem Controller Manufacturer ID", WORD(data + 0x30)); dmi_memory_product_id("Memory Subsystem Controller Product ID", WORD(data + 0x32)); if (h->length < 0x3C) break; dmi_memory_size("Non-Volatile Size", QWORD(data + 0x34)); if (h->length < 0x44) break; dmi_memory_size("Volatile Size", QWORD(data + 0x3C)); if (h->length < 0x4C) break; dmi_memory_size("Cache Size", QWORD(data + 0x44)); if (h->length < 0x54) break; dmi_memory_size("Logical Size", QWORD(data + 0x4C)); break; case 18: /* 7.19 32-bit Memory Error Information */ pr_handle_name("32-bit Memory Error Information"); if (h->length < 0x17) break; pr_attr("Type", "%s", dmi_memory_error_type(data[0x04])); pr_attr("Granularity", "%s", dmi_memory_error_granularity(data[0x05])); pr_attr("Operation", "%s", dmi_memory_error_operation(data[0x06])); dmi_memory_error_syndrome(DWORD(data + 0x07)); dmi_32bit_memory_error_address("Memory Array Address", DWORD(data + 0x0B)); dmi_32bit_memory_error_address("Device Address", DWORD(data + 0x0F)); dmi_32bit_memory_error_address("Resolution", DWORD(data + 0x13)); break; case 19: /* 7.20 Memory Array Mapped Address */ pr_handle_name("Memory Array Mapped Address"); if (h->length < 0x0F) break; if (h->length >= 0x1F && DWORD(data + 0x04) == 0xFFFFFFFF) { u64 start, end; start = QWORD(data + 0x0F); end = QWORD(data + 0x17); pr_attr("Starting Address", "0x%08X%08Xk", start.h, start.l); pr_attr("Ending Address", "0x%08X%08Xk", end.h, end.l); dmi_mapped_address_extended_size(start, end); } else { pr_attr("Starting Address", "0x%08X%03X", DWORD(data + 0x04) >> 2, (DWORD(data + 0x04) & 0x3) << 10); pr_attr("Ending Address", "0x%08X%03X", DWORD(data + 0x08) >> 2, ((DWORD(data + 0x08) & 0x3) << 10) + 0x3FF); dmi_mapped_address_size(DWORD(data + 0x08) - DWORD(data + 0x04) + 1); } if (!(opt.flags & FLAG_QUIET)) pr_attr("Physical Array Handle", "0x%04X", WORD(data + 0x0C)); pr_attr("Partition Width", "%u", data[0x0E]); break; case 20: /* 7.21 Memory Device Mapped Address */ pr_handle_name("Memory Device Mapped Address"); if (h->length < 0x13) break; if (h->length >= 0x23 && DWORD(data + 0x04) == 0xFFFFFFFF) { u64 start, end; start = QWORD(data + 0x13); end = QWORD(data + 0x1B); pr_attr("Starting Address", "0x%08X%08Xk", start.h, start.l); pr_attr("Ending Address", "0x%08X%08Xk", end.h, end.l); dmi_mapped_address_extended_size(start, end); } else { pr_attr("Starting Address", "0x%08X%03X", DWORD(data + 0x04) >> 2, (DWORD(data + 0x04) & 0x3) << 10); pr_attr("Ending Address", "0x%08X%03X", DWORD(data + 0x08) >> 2, ((DWORD(data + 0x08) & 0x3) << 10) + 0x3FF); dmi_mapped_address_size(DWORD(data + 0x08) - DWORD(data + 0x04) + 1); } if (!(opt.flags & FLAG_QUIET)) { pr_attr("Physical Device Handle", "0x%04X", WORD(data + 0x0C)); pr_attr("Memory Array Mapped Address Handle", "0x%04X", WORD(data + 0x0E)); } dmi_mapped_address_row_position(data[0x10]); dmi_mapped_address_interleave_position(data[0x11]); dmi_mapped_address_interleaved_data_depth(data[0x12]); break; case 21: /* 7.22 Built-in Pointing Device */ pr_handle_name("Built-in Pointing Device"); if (h->length < 0x07) break; pr_attr("Type", "%s", dmi_pointing_device_type(data[0x04])); pr_attr("Interface", "%s", dmi_pointing_device_interface(data[0x05])); pr_attr("Buttons", "%u", data[0x06]); break; case 22: /* 7.23 Portable Battery */ pr_handle_name("Portable Battery"); if (h->length < 0x10) break; pr_attr("Location", "%s", dmi_string(h, data[0x04])); pr_attr("Manufacturer", "%s", dmi_string(h, data[0x05])); if (data[0x06] || h->length < 0x1A) pr_attr("Manufacture Date", "%s", dmi_string(h, data[0x06])); if (data[0x07] || h->length < 0x1A) pr_attr("Serial Number", "%s", dmi_string(h, data[0x07])); pr_attr("Name", "%s", dmi_string(h, data[0x08])); if (data[0x09] != 0x02 || h->length < 0x1A) pr_attr("Chemistry", "%s", dmi_battery_chemistry(data[0x09])); if (h->length < 0x16) dmi_battery_capacity(WORD(data + 0x0A), 1); else dmi_battery_capacity(WORD(data + 0x0A), data[0x15]); dmi_battery_voltage(WORD(data + 0x0C)); pr_attr("SBDS Version", "%s", dmi_string(h, data[0x0E])); dmi_battery_maximum_error(data[0x0F]); if (h->length < 0x1A) break; if (data[0x07] == 0) pr_attr("SBDS Serial Number", "%04X", WORD(data + 0x10)); if (data[0x06] == 0) pr_attr("SBDS Manufacture Date", "%u-%02u-%02u", 1980 + (WORD(data + 0x12) >> 9), (WORD(data + 0x12) >> 5) & 0x0F, WORD(data + 0x12) & 0x1F); if (data[0x09] == 0x02) pr_attr("SBDS Chemistry", "%s", dmi_string(h, data[0x14])); pr_attr("OEM-specific Information", "0x%08X", DWORD(data + 0x16)); break; case 23: /* 7.24 System Reset */ pr_handle_name("System Reset"); if (h->length < 0x0D) break; pr_attr("Status", "%s", data[0x04] & (1 << 0) ? "Enabled" : "Disabled"); pr_attr("Watchdog Timer", "%s", data[0x04] & (1 << 5) ? "Present" : "Not Present"); if (!(data[0x04] & (1 << 5))) break; pr_attr("Boot Option", "%s", dmi_system_reset_boot_option((data[0x04] >> 1) & 0x3)); pr_attr("Boot Option On Limit", "%s", dmi_system_reset_boot_option((data[0x04] >> 3) & 0x3)); dmi_system_reset_count("Reset Count", WORD(data + 0x05)); dmi_system_reset_count("Reset Limit", WORD(data + 0x07)); dmi_system_reset_timer("Timer Interval", WORD(data + 0x09)); dmi_system_reset_timer("Timeout", WORD(data + 0x0B)); break; case 24: /* 7.25 Hardware Security */ pr_handle_name("Hardware Security"); if (h->length < 0x05) break; pr_attr("Power-On Password Status", "%s", dmi_hardware_security_status(data[0x04] >> 6)); pr_attr("Keyboard Password Status", "%s", dmi_hardware_security_status((data[0x04] >> 4) & 0x3)); pr_attr("Administrator Password Status", "%s", dmi_hardware_security_status((data[0x04] >> 2) & 0x3)); pr_attr("Front Panel Reset Status", "%s", dmi_hardware_security_status(data[0x04] & 0x3)); break; case 25: /* 7.26 System Power Controls */ pr_handle_name("System Power Controls"); if (h->length < 0x09) break; dmi_power_controls_power_on(data + 0x04); break; case 26: /* 7.27 Voltage Probe */ pr_handle_name("Voltage Probe"); if (h->length < 0x14) break; pr_attr("Description", "%s", dmi_string(h, data[0x04])); pr_attr("Location", "%s", dmi_voltage_probe_location(data[0x05] & 0x1f)); pr_attr("Status", "%s", dmi_probe_status(data[0x05] >> 5)); dmi_voltage_probe_value("Maximum Value", WORD(data + 0x06)); dmi_voltage_probe_value("Minimum Value", WORD(data + 0x08)); dmi_voltage_probe_resolution(WORD(data + 0x0A)); dmi_voltage_probe_value("Tolerance", WORD(data + 0x0C)); dmi_probe_accuracy(WORD(data + 0x0E)); pr_attr("OEM-specific Information", "0x%08X", DWORD(data + 0x10)); if (h->length < 0x16) break; dmi_voltage_probe_value("Nominal Value", WORD(data + 0x14)); break; case 27: /* 7.28 Cooling Device */ pr_handle_name("Cooling Device"); if (h->length < 0x0C) break; if (!(opt.flags & FLAG_QUIET) && WORD(data + 0x04) != 0xFFFF) pr_attr("Temperature Probe Handle", "0x%04X", WORD(data + 0x04)); pr_attr("Type", "%s", dmi_cooling_device_type(data[0x06] & 0x1f)); pr_attr("Status", "%s", dmi_probe_status(data[0x06] >> 5)); if (data[0x07] != 0x00) pr_attr("Cooling Unit Group", "%u", data[0x07]); pr_attr("OEM-specific Information", "0x%08X", DWORD(data + 0x08)); if (h->length < 0x0E) break; dmi_cooling_device_speed(WORD(data + 0x0C)); if (h->length < 0x0F) break; pr_attr("Description", "%s", dmi_string(h, data[0x0E])); break; case 28: /* 7.29 Temperature Probe */ pr_handle_name("Temperature Probe"); if (h->length < 0x14) break; pr_attr("Description", "%s", dmi_string(h, data[0x04])); pr_attr("Location", "%s", dmi_temperature_probe_location(data[0x05] & 0x1F)); pr_attr("Status", "%s", dmi_probe_status(data[0x05] >> 5)); dmi_temperature_probe_value("Maximum Value", WORD(data + 0x06)); dmi_temperature_probe_value("Minimum Value", WORD(data + 0x08)); dmi_temperature_probe_resolution(WORD(data + 0x0A)); dmi_temperature_probe_value("Tolerance", WORD(data + 0x0C)); dmi_probe_accuracy(WORD(data + 0x0E)); pr_attr("OEM-specific Information", "0x%08X", DWORD(data + 0x10)); if (h->length < 0x16) break; dmi_temperature_probe_value("Nominal Value", WORD(data + 0x14)); break; case 29: /* 7.30 Electrical Current Probe */ pr_handle_name("Electrical Current Probe"); if (h->length < 0x14) break; pr_attr("Description", "%s", dmi_string(h, data[0x04])); pr_attr("Location", "%s", dmi_voltage_probe_location(data[5] & 0x1F)); pr_attr("Status", "%s", dmi_probe_status(data[0x05] >> 5)); dmi_current_probe_value("Maximum Value", WORD(data + 0x06)); dmi_current_probe_value("Minimum Value", WORD(data + 0x08)); dmi_current_probe_resolution(WORD(data + 0x0A)); dmi_current_probe_value("Tolerance", WORD(data + 0x0C)); dmi_probe_accuracy(WORD(data + 0x0E)); pr_attr("OEM-specific Information", "0x%08X", DWORD(data + 0x10)); if (h->length < 0x16) break; dmi_current_probe_value("Nominal Value", WORD(data + 0x14)); break; case 30: /* 7.31 Out-of-band Remote Access */ pr_handle_name("Out-of-band Remote Access"); if (h->length < 0x06) break; pr_attr("Manufacturer Name", "%s", dmi_string(h, data[0x04])); pr_attr("Inbound Connection", "%s", data[0x05] & (1 << 0) ? "Enabled" : "Disabled"); pr_attr("Outbound Connection", "%s", data[0x05] & (1 << 1) ? "Enabled" : "Disabled"); break; case 31: /* 7.32 Boot Integrity Services Entry Point */ pr_handle_name("Boot Integrity Services Entry Point"); if (h->length < 0x1C) break; pr_attr("Checksum", "%s", checksum(data, h->length) ? "OK" : "Invalid"); pr_attr("16-bit Entry Point Address", "%04X:%04X", DWORD(data + 0x08) >> 16, DWORD(data + 0x08) & 0xFFFF); pr_attr("32-bit Entry Point Address", "0x%08X", DWORD(data + 0x0C)); break; case 32: /* 7.33 System Boot Information */ pr_handle_name("System Boot Information"); if (h->length < 0x0B) break; pr_attr("Status", "%s", dmi_system_boot_status(data[0x0A])); break; case 33: /* 7.34 64-bit Memory Error Information */ pr_handle_name("64-bit Memory Error Information"); if (h->length < 0x1F) break; pr_attr("Type", "%s", dmi_memory_error_type(data[0x04])); pr_attr("Granularity", "%s", dmi_memory_error_granularity(data[0x05])); pr_attr("Operation", "%s", dmi_memory_error_operation(data[0x06])); dmi_memory_error_syndrome(DWORD(data + 0x07)); dmi_64bit_memory_error_address("Memory Array Address", QWORD(data + 0x0B)); dmi_64bit_memory_error_address("Device Address", QWORD(data + 0x13)); dmi_32bit_memory_error_address("Resolution", DWORD(data + 0x1B)); break; case 34: /* 7.35 Management Device */ pr_handle_name("Management Device"); if (h->length < 0x0B) break; pr_attr("Description", "%s", dmi_string(h, data[0x04])); pr_attr("Type", "%s", dmi_management_device_type(data[0x05])); pr_attr("Address", "0x%08X", DWORD(data + 0x06)); pr_attr("Address Type", "%s", dmi_management_device_address_type(data[0x0A])); break; case 35: /* 7.36 Management Device Component */ pr_handle_name("Management Device Component"); if (h->length < 0x0B) break; pr_attr("Description", "%s", dmi_string(h, data[0x04])); if (!(opt.flags & FLAG_QUIET)) { pr_attr("Management Device Handle", "0x%04X", WORD(data + 0x05)); pr_attr("Component Handle", "0x%04X", WORD(data + 0x07)); if (WORD(data + 0x09) != 0xFFFF) pr_attr("Threshold Handle", "0x%04X", WORD(data + 0x09)); } break; case 36: /* 7.37 Management Device Threshold Data */ pr_handle_name("Management Device Threshold Data"); if (h->length < 0x10) break; if (WORD(data + 0x04) != 0x8000) pr_attr("Lower Non-critical Threshold", "%d", (i16)WORD(data + 0x04)); if (WORD(data + 0x06) != 0x8000) pr_attr("Upper Non-critical Threshold", "%d", (i16)WORD(data + 0x06)); if (WORD(data + 0x08) != 0x8000) pr_attr("Lower Critical Threshold", "%d", (i16)WORD(data + 0x08)); if (WORD(data + 0x0A) != 0x8000) pr_attr("Upper Critical Threshold", "%d", (i16)WORD(data + 0x0A)); if (WORD(data + 0x0C) != 0x8000) pr_attr("Lower Non-recoverable Threshold", "%d", (i16)WORD(data + 0x0C)); if (WORD(data + 0x0E) != 0x8000) pr_attr("Upper Non-recoverable Threshold", "%d", (i16)WORD(data + 0x0E)); break; case 37: /* 7.38 Memory Channel */ pr_handle_name("Memory Channel"); if (h->length < 0x07) break; pr_attr("Type", "%s", dmi_memory_channel_type(data[0x04])); pr_attr("Maximal Load", "%u", data[0x05]); pr_attr("Devices", "%u", data[0x06]); if (h->length < 0x07 + 3 * data[0x06]) break; dmi_memory_channel_devices(data[0x06], data + 0x07); break; case 38: /* 7.39 IPMI Device Information */ /* * We use the word "Version" instead of "Revision", conforming to * the IPMI specification. */ pr_handle_name("IPMI Device Information"); if (h->length < 0x10) break; pr_attr("Interface Type", "%s", dmi_ipmi_interface_type(data[0x04])); pr_attr("Specification Version", "%u.%u", data[0x05] >> 4, data[0x05] & 0x0F); pr_attr("I2C Slave Address", "0x%02x", data[0x06] >> 1); if (data[0x07] != 0xFF) pr_attr("NV Storage Device Address", "%u", data[0x07]); else pr_attr("NV Storage Device", "Not Present"); dmi_ipmi_base_address(data[0x04], data + 0x08, h->length < 0x11 ? 0 : (data[0x10] >> 4) & 1); if (h->length < 0x12) break; if (data[0x04] != 0x04) { pr_attr("Register Spacing", "%s", dmi_ipmi_register_spacing(data[0x10] >> 6)); if (data[0x10] & (1 << 3)) { pr_attr("Interrupt Polarity", "%s", data[0x10] & (1 << 1) ? "Active High" : "Active Low"); pr_attr("Interrupt Trigger Mode", "%s", data[0x10] & (1 << 0) ? "Level" : "Edge"); } } if (data[0x11] != 0x00) { pr_attr("Interrupt Number", "%u", data[0x11]); } break; case 39: /* 7.40 System Power Supply */ pr_handle_name("System Power Supply"); if (h->length < 0x10) break; if (data[0x04] != 0x00) pr_attr("Power Unit Group", "%u", data[0x04]); pr_attr("Location", "%s", dmi_string(h, data[0x05])); pr_attr("Name", "%s", dmi_string(h, data[0x06])); pr_attr("Manufacturer", "%s", dmi_string(h, data[0x07])); pr_attr("Serial Number", "%s", dmi_string(h, data[0x08])); pr_attr("Asset Tag", "%s", dmi_string(h, data[0x09])); pr_attr("Model Part Number", "%s", dmi_string(h, data[0x0A])); pr_attr("Revision", "%s", dmi_string(h, data[0x0B])); dmi_power_supply_power(WORD(data + 0x0C)); if (WORD(data + 0x0E) & (1 << 1)) pr_attr("Status", "Present, %s", dmi_power_supply_status((WORD(data + 0x0E) >> 7) & 0x07)); else pr_attr("Status", "Not Present"); pr_attr("Type", "%s", dmi_power_supply_type((WORD(data + 0x0E) >> 10) & 0x0F)); pr_attr("Input Voltage Range Switching", "%s", dmi_power_supply_range_switching((WORD(data + 0x0E) >> 3) & 0x0F)); pr_attr("Plugged", "%s", WORD(data + 0x0E) & (1 << 2) ? "No" : "Yes"); pr_attr("Hot Replaceable", "%s", WORD(data + 0x0E) & (1 << 0) ? "Yes" : "No"); if (h->length < 0x16) break; if (!(opt.flags & FLAG_QUIET)) { if (WORD(data + 0x10) != 0xFFFF) pr_attr("Input Voltage Probe Handle", "0x%04X", WORD(data + 0x10)); if (WORD(data + 0x12) != 0xFFFF) pr_attr("Cooling Device Handle", "0x%04X", WORD(data + 0x12)); if (WORD(data + 0x14) != 0xFFFF) pr_attr("Input Current Probe Handle", "0x%04X", WORD(data + 0x14)); } break; case 40: /* 7.41 Additional Information */ if (h->length < 0x0B) break; if (opt.flags & FLAG_QUIET) return; dmi_additional_info(h); break; case 41: /* 7.42 Onboard Device Extended Information */ pr_handle_name("Onboard Device"); if (h->length < 0x0B) break; pr_attr("Reference Designation", "%s", dmi_string(h, data[0x04])); pr_attr("Type", "%s", dmi_on_board_devices_type(data[0x05] & 0x7F)); pr_attr("Status", "%s", data[0x05] & 0x80 ? "Enabled" : "Disabled"); pr_attr("Type Instance", "%u", data[0x06]); dmi_slot_segment_bus_func(WORD(data + 0x07), data[0x09], data[0x0A]); break; case 42: /* 7.43 Management Controller Host Interface */ pr_handle_name("Management Controller Host Interface"); if (ver < 0x0302) { if (h->length < 0x05) break; pr_attr("Interface Type", "%s", dmi_management_controller_host_type(data[0x04])); /* * There you have a type-dependent, variable-length * part in the middle of the structure, with no * length specifier, so no easy way to decode the * common, final part of the structure. What a pity. */ if (h->length < 0x09) break; if (data[0x04] == 0xF0) /* OEM */ { pr_attr("Vendor ID", "0x%02X%02X%02X%02X", data[0x05], data[0x06], data[0x07], data[0x08]); } } else dmi_parse_controller_structure(h); break; case 43: /* 7.44 TPM Device */ pr_handle_name("TPM Device"); if (h->length < 0x1B) break; dmi_tpm_vendor_id(data + 0x04); pr_attr("Specification Version", "%d.%d", data[0x08], data[0x09]); switch (data[0x08]) { case 0x01: /* * We skip the first 2 bytes, which are * redundant with the above, and uncoded * in a silly way. */ pr_attr("Firmware Revision", "%u.%u", data[0x0C], data[0x0D]); break; case 0x02: pr_attr("Firmware Revision", "%u.%u", DWORD(data + 0x0A) >> 16, DWORD(data + 0x0A) & 0xFFFF); /* * We skip the next 4 bytes, as their * format is not standardized and their * usefulness seems limited anyway. */ break; } pr_attr("Description", "%s", dmi_string(h, data[0x12])); pr_list_start("Characteristics", NULL); dmi_tpm_characteristics(QWORD(data + 0x13)); pr_list_end(); if (h->length < 0x1F) break; pr_attr("OEM-specific Information", "0x%08X", DWORD(data + 0x1B)); break; case 45: /* 7.46 Firmware Inventory Information */ pr_handle_name("Firmware Inventory Information"); if (h->length < 0x18) break; pr_attr("Firmware Component Name", "%s", dmi_string(h, data[0x04])); pr_attr("Firmware Version", "%s", dmi_string(h, data[0x05])); pr_attr("Firmware ID", "%s", dmi_string(h, data[0x07])); pr_attr("Release Date", "%s", dmi_string(h, data[0x09])); pr_attr("Manufacturer", "%s", dmi_string(h, data[0x0A])); pr_attr("Lowest Supported Firmware Version", "%s", dmi_string(h, data[0x0B])); dmi_memory_size("Image Size", QWORD(data + 0x0C)); pr_list_start("Characteristics", NULL); dmi_firmware_characteristics(WORD(data + 0x14)); pr_list_end(); pr_attr("State", "%s", dmi_firmware_state(data[0x16])); if (h->length < 0x18 + data[0x17] * 2) break; if (!(opt.flags & FLAG_QUIET)) dmi_firmware_components(data[0x17], data + 0x18); break; case 126: pr_handle_name("Inactive"); break; case 127: pr_handle_name("End Of Table"); break; default: if (dmi_decode_oem(h)) break; if (opt.flags & FLAG_QUIET) return; pr_handle_name("%s Type", h->type >= 128 ? "OEM-specific" : "Unknown"); dmi_dump(h); } pr_sep(); } static void dmi_decode_cpux(const struct dmi_header *h) { const u8 *data = h->data; DmidecodeMemoryData *memory_tmp = NULL; switch (h->type) { case 0: /* 7.1 BIOS Information */ strncpy(cpux_data->bios.brand, dmi_string(h, data[0x04]), MAXSTR); strncpy(cpux_data->bios.version, dmi_string(h, data[0x05]), MAXSTR); strncpy(cpux_data->bios.date, dmi_string(h, data[0x08]), MAXSTR); snprintf(cpux_data->bios.romsize, MAXSTR, "%s / %s", dmi_bios_runtime_size_str((0x10000 - WORD(data + 0x06)) << 4), dmi_bios_rom_size_str(data[0x09], h->length < 0x1A ? 16 : WORD(data + 0x18))); break; case 2: /* 7.3 Base Board Information */ strncpy(cpux_data->mb.manufacturer, dmi_string(h, data[0x04]), MAXSTR); strncpy(cpux_data->mb.model, dmi_string(h, data[0x05]), MAXSTR); strncpy(cpux_data->mb.revision, dmi_string(h, data[0x06]), MAXSTR); break; case 4: /* 7.5 Processor Information */ cpux_data->processor.bus_freq = (double) WORD(data + 0x12); strncpy(cpux_data->processor.cpu_package, dmi_string(h, data[0x04]), MAXSTR); break; case 17: /* 7.18 Memory Device */ /* If no module is present, the remaining fields are irrelevant */ if(WORD(data + 0x0C) == 0 && !(opt.flags & FLAG_NO_QUIRKS)) break; memory_tmp = realloc(cpux_data->memory, sizeof(DmidecodeMemoryData) * (cpux_data->stick_count + 1)); if(memory_tmp == NULL) { fprintf(stderr, "dmi_decode_cpux(): failed to reallocate cpux_data->memory"); break; } cpux_data->memory = memory_tmp; memset(&cpux_data->memory[cpux_data->stick_count], 0, sizeof(DmidecodeMemoryData)); strncpy(cpux_data->memory[cpux_data->stick_count].manufacturer, dmi_string(h, data[0x17]), MAXSTR); strncpy(cpux_data->memory[cpux_data->stick_count].part_number, dmi_string(h, data[0x1A]), MAXSTR); snprintf(cpux_data->memory[cpux_data->stick_count].type, MAXSTR, "%s %s", dmi_memory_device_form_factor(data[0x0E]), dmi_memory_device_type(data[0x12])); strncpy(cpux_data->memory[cpux_data->stick_count].type_detail, dmi_memory_device_type_detail_str(WORD(data + 0x13)), MAXSTR); strncpy(cpux_data->memory[cpux_data->stick_count].device_locator, dmi_string(h, data[0x10]), MAXSTR); strncpy(cpux_data->memory[cpux_data->stick_count].bank_locator, dmi_string(h, data[0x11]), MAXSTR); strncpy(cpux_data->memory[cpux_data->stick_count].size, (h->length >= 0x20 && WORD(data + 0x0C) == 0x7FFF) ? dmi_memory_device_extended_size_str(DWORD(data + 0x1C)) : dmi_memory_device_size_str(WORD(data + 0x0C)), MAXSTR); if((data[0x1B] & 0x0F) == 0) strncpy(cpux_data->memory[cpux_data->stick_count].rank, _("Unknown"), MAXSTR); else snprintf(cpux_data->memory[cpux_data->stick_count].rank, MAXSTR, "%u", data[0x1B] & 0x0F); strncpy(cpux_data->memory[cpux_data->stick_count].speed_maximum, dmi_memory_device_speed_str(WORD(data + 0x15), h->length >= 0x5C ? DWORD(data + 0x54) : 0), MAXSTR); strncpy(cpux_data->memory[cpux_data->stick_count].speed_configured, dmi_memory_device_speed_str(WORD(data + 0x20), h->length >= 0x5C ? DWORD(data + 0x58) : 0), MAXSTR); strncpy(cpux_data->memory[cpux_data->stick_count].voltage_minimum, dmi_memory_voltage_value_str(WORD(data + 0x22)), MAXSTR); strncpy(cpux_data->memory[cpux_data->stick_count].voltage_maximum, dmi_memory_voltage_value_str(WORD(data + 0x24)), MAXSTR); strncpy(cpux_data->memory[cpux_data->stick_count].voltage_configured, dmi_memory_voltage_value_str(WORD(data + 0x26)), MAXSTR); cpux_data->stick_count++; break; default: fprintf(stderr, "internal error in dmi_decode_cpux(): type %u is not supported.", h->type); break; } } static void to_dmi_header(struct dmi_header *h, u8 *data) { h->type = data[0]; h->length = data[1]; h->handle = WORD(data + 2); h->data = data; } static void dmi_table_string(const struct dmi_header *h, const u8 *data, u16 ver) { int key; u8 offset = opt.string->offset; if (opt.string->type == 11) /* OEM strings */ { if (h->length < 5 || offset > data[4]) { fprintf(stderr, "No OEM string number %u\n", offset); return; } if (offset) printf("%s\n", dmi_string(h, offset)); else printf("%u\n", data[4]); /* count */ return; } if (offset >= h->length) return; key = (opt.string->type << 8) | offset; switch (key) { case 0x015: /* -s bios-revision */ if (data[offset - 1] != 0xFF && data[offset] != 0xFF) printf("%u.%u\n", data[offset - 1], data[offset]); break; case 0x017: /* -s firmware-revision */ if (data[offset - 1] != 0xFF && data[offset] != 0xFF) printf("%u.%u\n", data[offset - 1], data[offset]); break; case 0x108: dmi_system_uuid(NULL, NULL, data + offset, ver); break; case 0x305: printf("%s\n", dmi_chassis_type(data[offset])); break; case 0x406: printf("%s\n", dmi_processor_family(h, ver)); break; case 0x416: dmi_processor_frequency(NULL, data + offset); break; default: printf("%s\n", dmi_string(h, data[offset])); } } static int dmi_table_dump(const u8 *ep, u32 ep_len, const u8 *table, u32 table_len) { int fd; FILE *f; fd = open(opt.dumpfile, O_WRONLY|O_CREAT|O_EXCL, 0666); if (fd == -1) { fprintf(stderr, "%s: ", opt.dumpfile); perror("open"); return -1; } f = fdopen(fd, "wb"); if (!f) { fprintf(stderr, "%s: ", opt.dumpfile); perror("fdopen"); return -1; } if (!(opt.flags & FLAG_QUIET)) pr_comment("Writing %d bytes to %s.", ep_len, opt.dumpfile); if (fwrite(ep, ep_len, 1, f) != 1) { fprintf(stderr, "%s: ", opt.dumpfile); perror("fwrite"); goto err_close; } if (fseek(f, 32, SEEK_SET) != 0) { fprintf(stderr, "%s: ", opt.dumpfile); perror("fseek"); goto err_close; } if (!(opt.flags & FLAG_QUIET)) pr_comment("Writing %d bytes to %s.", table_len, opt.dumpfile); if (fwrite(table, table_len, 1, f) != 1) { fprintf(stderr, "%s: ", opt.dumpfile); perror("fwrite"); goto err_close; } if (fclose(f)) { fprintf(stderr, "%s: ", opt.dumpfile); perror("fclose"); return -1; } return 0; err_close: fclose(f); return -1; } static void dmi_table_decode(u8 *buf, u32 len, u16 num, u16 ver, u32 flags) { u8 *data; int i = 0; /* First pass: Save specific values needed to decode OEM types */ data = buf; while ((i < num || !num) && data + 4 <= buf + len) /* 4 is the length of an SMBIOS structure header */ { u8 *next; struct dmi_header h; to_dmi_header(&h, data); /* * If a short entry is found (less than 4 bytes), not only it * is invalid, but we cannot reliably locate the next entry. * Also stop at end-of-table marker if so instructed. */ if (h.length < 4 || (h.type == 127 && (opt.flags & (FLAG_QUIET | FLAG_STOP_AT_EOT)))) break; i++; /* Look for the next handle */ next = data + h.length; while ((unsigned long)(next - buf + 1) < len && (next[0] != 0 || next[1] != 0)) next++; next += 2; /* Make sure the whole structure fits in the table */ if ((unsigned long)(next - buf) > len) break; /* Assign vendor for vendor-specific decodes later */ if (h.type == 1 && h.length >= 6) dmi_set_vendor(_dmi_string(&h, data[0x04], 0), _dmi_string(&h, data[0x05], 0)); /* Remember CPUID type for HPE type 199 */ if (h.type == 4 && h.length >= 0x1A && cpuid_type == cpuid_none) cpuid_type = dmi_get_cpuid_type(&h); data = next; } /* Second pass: Actually decode the data */ i = 0; data = buf; while ((i < num || !num) && data + 4 <= buf + len) /* 4 is the length of an SMBIOS structure header */ { u8 *next; struct dmi_header h; int display; to_dmi_header(&h, data); display = ((opt.type == NULL || opt.type[h.type]) && (opt.handle == ~0U || opt.handle == h.handle) && !((opt.flags & FLAG_QUIET) && (h.type == 126 || h.type == 127)) && !opt.string); /* * If a short entry is found (less than 4 bytes), not only it * is invalid, but we cannot reliably locate the next entry. * Better stop at this point, and let the user know his/her * table is broken. */ if (h.length < 4) { if (!(opt.flags & FLAG_QUIET)) { fprintf(stderr, "Invalid entry length (%u). DMI table " "is broken! Stop.\n\n", (unsigned int)h.length); opt.flags |= FLAG_QUIET; } break; } i++; /* In quiet mode, stop decoding at end of table marker */ if ((opt.flags & FLAG_QUIET) && h.type == 127) break; if (display && (!(opt.flags & FLAG_QUIET) || (opt.flags & FLAG_DUMP))) pr_handle(&h); /* Look for the next handle */ next = data + h.length; while ((unsigned long)(next - buf + 1) < len && (next[0] != 0 || next[1] != 0)) next++; next += 2; /* Make sure the whole structure fits in the table */ if ((unsigned long)(next - buf) > len) { if (display && !(opt.flags & FLAG_QUIET)) pr_struct_err(""); pr_sep(); data = next; break; } /* Fixup a common mistake */ if (h.type == 34 && !(opt.flags & FLAG_NO_QUIRKS)) dmi_fixup_type_34(&h, display); if (display) { if (opt.flags & FLAG_DUMP) { dmi_dump(&h); pr_sep(); } else { if(cpux_data != NULL) dmi_decode_cpux(&h); else dmi_decode(&h, ver); } } else if (opt.string != NULL && opt.string->type == h.type) dmi_table_string(&h, data, ver); data = next; /* SMBIOS v3 requires stopping at this marker */ if (h.type == 127 && (flags & FLAG_STOP_AT_EOT)) break; } /* * SMBIOS v3 64-bit entry points do not announce a structures count, * and only indicate a maximum size for the table. */ if (!(opt.flags & FLAG_QUIET)) { if (num && i != num) fprintf(stderr, "Wrong DMI structures count: %d announced, " "only %d decoded.\n", num, i); if ((unsigned long)(data - buf) > len || (num && (unsigned long)(data - buf) < len)) fprintf(stderr, "Wrong DMI structures length: %u bytes " "announced, structures occupy %lu bytes.\n", len, (unsigned long)(data - buf)); } } /* Allocates a buffer for the table, must be freed by the caller */ static u8 *dmi_table_get(off_t base, u32 *len, u16 num, u32 ver, const char *devmem, u32 flags) { u8 *buf; if (ver > SUPPORTED_SMBIOS_VER && !(opt.flags & FLAG_QUIET)) { pr_comment("SMBIOS implementations newer than version %u.%u.%u are not", SUPPORTED_SMBIOS_VER >> 16, (SUPPORTED_SMBIOS_VER >> 8) & 0xFF, SUPPORTED_SMBIOS_VER & 0xFF); pr_comment("fully supported by this version of dmidecode."); } if (!(opt.flags & FLAG_QUIET)) { if (opt.type == NULL) { if (num) pr_info("%u structures occupying %u bytes.", num, *len); if (!(opt.flags & FLAG_FROM_DUMP)) pr_info("Table at 0x%08llX.", (unsigned long long)base); } pr_sep(); } if ((flags & FLAG_NO_FILE_OFFSET) || (opt.flags & FLAG_FROM_DUMP)) { /* * When reading from sysfs or from a dump file, the file may be * shorter than announced. For SMBIOS v3 this is expcted, as we * only know the maximum table size, not the actual table size. * For older implementations (and for SMBIOS v3 too), this * would be the result of the kernel truncating the table on * parse error. */ size_t size = *len; buf = read_file(flags & FLAG_NO_FILE_OFFSET ? 0 : base, &size, devmem); if (!(opt.flags & FLAG_QUIET) && num && size != (size_t)*len) { fprintf(stderr, "Wrong DMI structures length: %u bytes " "announced, only %lu bytes available.\n", *len, (unsigned long)size); } *len = size; } else buf = mem_chunk(base, *len, devmem); if (buf == NULL) { fprintf(stderr, "Failed to read table, sorry.\n"); #ifndef USE_MMAP if (!(flags & FLAG_NO_FILE_OFFSET)) fprintf(stderr, "Try compiling dmidecode with -DUSE_MMAP.\n"); #endif } return buf; } /* * Build a crafted entry point with table address hard-coded to 32, * as this is where we will put it in the output file. We adjust the * DMI checksum appropriately. The SMBIOS checksum needs no adjustment. */ static void overwrite_dmi_address(u8 *buf) { buf[0x05] += buf[0x08] + buf[0x09] + buf[0x0A] + buf[0x0B] - 32; buf[0x08] = 32; buf[0x09] = 0; buf[0x0A] = 0; buf[0x0B] = 0; } /* Same thing for SMBIOS3 entry points */ static void overwrite_smbios3_address(u8 *buf) { buf[0x05] += buf[0x10] + buf[0x11] + buf[0x12] + buf[0x13] + buf[0x14] + buf[0x15] + buf[0x16] + buf[0x17] - 32; buf[0x10] = 32; buf[0x11] = 0; buf[0x12] = 0; buf[0x13] = 0; buf[0x14] = 0; buf[0x15] = 0; buf[0x16] = 0; buf[0x17] = 0; } static int smbios3_decode(u8 *buf, const char *devmem, u32 flags) { u32 ver, len; u64 offset; u8 *table; /* Don't let checksum run beyond the buffer */ if (buf[0x06] > 0x20) { fprintf(stderr, "Entry point length too large (%u bytes, expected %u).\n", (unsigned int)buf[0x06], 0x18U); return 0; } if (buf[0x06] < 0x18 || !checksum(buf, buf[0x06])) return 0; ver = (buf[0x07] << 16) + (buf[0x08] << 8) + buf[0x09]; if (!(opt.flags & FLAG_QUIET)) pr_info("SMBIOS %u.%u.%u present.", buf[0x07], buf[0x08], buf[0x09]); offset = QWORD(buf + 0x10); if (!(flags & FLAG_NO_FILE_OFFSET) && offset.h && sizeof(off_t) < 8) { fprintf(stderr, "64-bit addresses not supported, sorry.\n"); return 0; } /* Maximum length, may get trimmed */ len = DWORD(buf + 0x0C); table = dmi_table_get(((off_t)offset.h << 32) | offset.l, &len, 0, ver, devmem, flags | FLAG_STOP_AT_EOT); if (table == NULL) return 1; if (opt.flags & FLAG_DUMP_BIN) { u8 crafted[32]; memcpy(crafted, buf, 32); overwrite_smbios3_address(crafted); dmi_table_dump(crafted, crafted[0x06], table, len); } else { dmi_table_decode(table, len, 0, ver >> 8, flags | FLAG_STOP_AT_EOT); } free(table); return 1; } static void dmi_fixup_version(u16 *ver) { /* Some BIOS report weird SMBIOS version, fix that up */ switch (*ver) { case 0x021F: case 0x0221: if (!(opt.flags & FLAG_QUIET)) fprintf(stderr, "SMBIOS version fixup (2.%d -> 2.%d).\n", *ver & 0xFF, 3); *ver = 0x0203; break; case 0x0233: if (!(opt.flags & FLAG_QUIET)) fprintf(stderr, "SMBIOS version fixup (2.%d -> 2.%d).\n", 51, 6); *ver = 0x0206; break; } } static int smbios_decode(u8 *buf, const char *devmem, u32 flags) { u16 ver, num; u32 len; u8 *table; /* Don't let checksum run beyond the buffer */ if (buf[0x05] > 0x20) { fprintf(stderr, "Entry point length too large (%u bytes, expected %u).\n", (unsigned int)buf[0x05], 0x1FU); return 0; } /* * The size of this structure is 0x1F bytes, but we also accept value * 0x1E due to a mistake in SMBIOS specification version 2.1. */ if (buf[0x05] < 0x1E || !checksum(buf, buf[0x05]) || memcmp(buf + 0x10, "_DMI_", 5) != 0 || !checksum(buf + 0x10, 0x0F)) return 0; ver = (buf[0x06] << 8) + buf[0x07]; if (!(opt.flags & FLAG_NO_QUIRKS)) dmi_fixup_version(&ver); if (!(opt.flags & FLAG_QUIET)) pr_info("SMBIOS %u.%u present.", ver >> 8, ver & 0xFF); /* Maximum length, may get trimmed */ len = WORD(buf + 0x16); num = WORD(buf + 0x1C); table = dmi_table_get(DWORD(buf + 0x18), &len, num, ver << 8, devmem, flags); if (table == NULL) return 1; if (opt.flags & FLAG_DUMP_BIN) { u8 crafted[32]; memcpy(crafted, buf, 32); overwrite_dmi_address(crafted + 0x10); dmi_table_dump(crafted, crafted[0x05], table, len); } else { dmi_table_decode(table, len, num, ver, flags); } free(table); return 1; } static int legacy_decode(u8 *buf, const char *devmem, u32 flags) { u16 ver, num; u32 len; u8 *table; if (!checksum(buf, 0x0F)) return 0; ver = ((buf[0x0E] & 0xF0) << 4) + (buf[0x0E] & 0x0F); if (!(opt.flags & FLAG_QUIET)) pr_info("Legacy DMI %u.%u present.", buf[0x0E] >> 4, buf[0x0E] & 0x0F); /* Maximum length, may get trimmed */ len = WORD(buf + 0x06); num = WORD(buf + 0x0C); table = dmi_table_get(DWORD(buf + 0x08), &len, num, ver << 8, devmem, flags); if (table == NULL) return 1; if (opt.flags & FLAG_DUMP_BIN) { u8 crafted[16]; memcpy(crafted, buf, 16); overwrite_dmi_address(crafted); dmi_table_dump(crafted, 0x0F, table, len); } else { dmi_table_decode(table, len, num, ver, flags); } free(table); return 1; } /* * Probe for EFI interface */ #define EFI_NOT_FOUND (-1) #define EFI_NO_SMBIOS (-2) static int address_from_efi(off_t *address) { #if defined(__linux__) FILE *efi_systab; const char *filename; char linebuf[64]; #elif defined(__FreeBSD__) char addrstr[KENV_MVALLEN + 1]; #endif const char *eptype; int ret; *address = 0; /* Prevent compiler warning */ #if defined(__linux__) /* * Linux up to 2.6.6: /proc/efi/systab * Linux 2.6.7 and up: /sys/firmware/efi/systab */ if ((efi_systab = fopen(filename = "/sys/firmware/efi/systab", "r")) == NULL && (efi_systab = fopen(filename = "/proc/efi/systab", "r")) == NULL) { /* No EFI interface, fallback to memory scan */ return EFI_NOT_FOUND; } ret = EFI_NO_SMBIOS; while ((fgets(linebuf, sizeof(linebuf) - 1, efi_systab)) != NULL) { char *addrp = strchr(linebuf, '='); *(addrp++) = '\0'; if (strcmp(linebuf, "SMBIOS3") == 0 || strcmp(linebuf, "SMBIOS") == 0) { *address = strtoull(addrp, NULL, 0); eptype = linebuf; ret = 0; break; } } if (fclose(efi_systab) != 0) perror(filename); if (ret == EFI_NO_SMBIOS) fprintf(stderr, "%s: SMBIOS entry point missing\n", filename); #elif defined(__FreeBSD__) /* * On FreeBSD, SMBIOS anchor base address in UEFI mode is exposed * via kernel environment: * https://svnweb.freebsd.org/base?view=revision&revision=307326 */ ret = kenv(KENV_GET, "hint.smbios.0.mem", addrstr, sizeof(addrstr)); if (ret == -1) { if (errno != ENOENT) perror("kenv"); return EFI_NOT_FOUND; } *address = strtoull(addrstr, NULL, 0); eptype = "SMBIOS"; ret = 0; #else ret = EFI_NOT_FOUND; #endif if (ret == 0 && !(opt.flags & FLAG_QUIET)) pr_comment("%s entry point at 0x%08llx", eptype, (unsigned long long)*address); return ret; } int dmidecode(int quiet, void *cpux_pdata) { int ret = 0; /* Returned value */ int found = 0; off_t fp; size_t size; int efi; u8 *buf = NULL; char *argv[] = { "dmidecode (built-in with CPU-X)", NULL }; cpux_data = (DmidecodeData *)cpux_pdata; if(cpux_pdata != NULL) { opt.type = (u8 *)calloc(256, sizeof(u8)); if (opt.type == NULL) { perror("calloc"); return 255; } opt.type[0] = 1; opt.type[2] = 1; opt.type[4] = 1; opt.type[17] = 1; } /* * We don't want stdout and stderr to be mixed up if both are * redirected to the same file. */ setlinebuf(stdout); setlinebuf(stderr); if (sizeof(u8) != 1 || sizeof(u16) != 2 || sizeof(u32) != 4 || '\0' != 0) { fprintf(stderr, "%s: compiler incompatibility\n", argv[0]); return 255; } /* Set default option values */ opt.devmem = DEFAULT_MEM_DEV; opt.flags = 0; opt.handle = ~0U; if(quiet) opt.flags |= FLAG_QUIET; #if 0 if (parse_command_line(argc, argv)<0) { ret = 2; goto exit_free; } if (opt.flags & FLAG_HELP) { print_help(); goto exit_free; } if (opt.flags & FLAG_VERSION) { printf("%s\n", VERSION); goto exit_free; } #endif if (cpux_data == NULL) pr_comment("%s %s\n", argv[0], VERSION); /* Read from dump if so instructed */ if (opt.flags & FLAG_FROM_DUMP) { if (!(opt.flags & FLAG_QUIET)) pr_info("Reading SMBIOS/DMI data from file %s.", opt.dumpfile); if ((buf = mem_chunk(0, 0x20, opt.dumpfile)) == NULL) { ret = 1; goto exit_free; } if (memcmp(buf, "_SM3_", 5) == 0) { if (smbios3_decode(buf, opt.dumpfile, 0)) found++; } else if (memcmp(buf, "_SM_", 4) == 0) { if (smbios_decode(buf, opt.dumpfile, 0)) found++; } else if (memcmp(buf, "_DMI_", 5) == 0) { if (legacy_decode(buf, opt.dumpfile, 0)) found++; } goto done; } /* * First try reading from sysfs tables. The entry point file could * contain one of several types of entry points, so read enough for * the largest one, then determine what type it contains. */ size = 0x20; if (!(opt.flags & FLAG_NO_SYSFS) && (buf = read_file(0, &size, SYS_ENTRY_FILE)) != NULL) { if (!(opt.flags & FLAG_QUIET)) pr_info("Getting SMBIOS data from sysfs."); if (size >= 24 && memcmp(buf, "_SM3_", 5) == 0) { if (smbios3_decode(buf, SYS_TABLE_FILE, FLAG_NO_FILE_OFFSET)) found++; } else if (size >= 31 && memcmp(buf, "_SM_", 4) == 0) { if (smbios_decode(buf, SYS_TABLE_FILE, FLAG_NO_FILE_OFFSET)) found++; } else if (size >= 15 && memcmp(buf, "_DMI_", 5) == 0) { if (legacy_decode(buf, SYS_TABLE_FILE, FLAG_NO_FILE_OFFSET)) found++; } if (found) goto done; if (!(opt.flags & FLAG_QUIET)) pr_info("Failed to get SMBIOS data from sysfs."); } /* Next try EFI (ia64, Intel-based Mac, arm64) */ efi = address_from_efi(&fp); switch (efi) { case EFI_NOT_FOUND: goto memory_scan; case EFI_NO_SMBIOS: ret = 1; goto exit_free; } if (!(opt.flags & FLAG_QUIET)) pr_info("Found SMBIOS entry point in EFI, reading table from %s.", opt.devmem); if ((buf = mem_chunk(fp, 0x20, opt.devmem)) == NULL) { ret = 1; goto exit_free; } if (memcmp(buf, "_SM3_", 5) == 0) { if (smbios3_decode(buf, opt.devmem, 0)) found++; } else if (memcmp(buf, "_SM_", 4) == 0) { if (smbios_decode(buf, opt.devmem, 0)) found++; } goto done; memory_scan: #if defined __i386__ || defined __x86_64__ if (!(opt.flags & FLAG_QUIET)) pr_info("Scanning %s for entry point.", opt.devmem); /* Fallback to memory scan (x86, x86_64) */ if ((buf = mem_chunk(0xF0000, 0x10000, opt.devmem)) == NULL) { ret = 1; goto exit_free; } /* Look for a 64-bit entry point first */ for (fp = 0; fp <= 0xFFE0; fp += 16) { if (memcmp(buf + fp, "_SM3_", 5) == 0) { if (smbios3_decode(buf + fp, opt.devmem, 0)) { found++; goto done; } } } /* If none found, look for a 32-bit entry point */ for (fp = 0; fp <= 0xFFF0; fp += 16) { if (memcmp(buf + fp, "_SM_", 4) == 0 && fp <= 0xFFE0) { if (smbios_decode(buf + fp, opt.devmem, 0)) { found++; goto done; } } else if (memcmp(buf + fp, "_DMI_", 5) == 0) { if (legacy_decode(buf + fp, opt.devmem, 0)) { found++; goto done; } } } #endif done: if (!found && !(opt.flags & FLAG_QUIET)) pr_comment("No SMBIOS nor DMI entry point found, sorry."); free(buf); exit_free: free(opt.type); opt.type = NULL; return ret; } CPU-X-5.0.3/src/dmidecode/dmidecode.h000066400000000000000000000027061454622605200171600ustar00rootroot00000000000000/* * This file is part of the dmidecode project. * * Copyright (C) 2005-2020 Jean Delvare * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public 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 DMIDECODE_H #define DMIDECODE_H #include "types.h" struct dmi_header { u8 type; u8 length; u16 handle; u8 *data; }; enum cpuid_type { cpuid_none, cpuid_80386, cpuid_80486, cpuid_arm_legacy, cpuid_arm_soc_id, cpuid_x86_intel, cpuid_x86_amd, }; extern enum cpuid_type cpuid_type; int is_printable(const u8 *data, int len); const char *dmi_string(const struct dmi_header *dm, u8 s); void dmi_print_memory_size(const char *addr, u64 code, int shift); void dmi_print_cpuid(void (*print_cb)(const char *name, const char *format, ...), const char *label, enum cpuid_type sig, const u8 *p); #endif CPU-X-5.0.3/src/dmidecode/dmioem.c000066400000000000000000001325311454622605200165100ustar00rootroot00000000000000/* * Decoding of OEM-specific entries * This file is part of the dmidecode project. * * Copyright (C) 2007-2020 Jean Delvare * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public 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 "types.h" #include "util.h" #include "dmidecode.h" #include "dmioem.h" #include "dmiopt.h" #include "dmioutput.h" /* * Globals for vendor-specific decodes */ enum DMI_VENDORS { VENDOR_UNKNOWN, VENDOR_ACER, VENDOR_HP, VENDOR_HPE, VENDOR_IBM, VENDOR_LENOVO, }; static enum DMI_VENDORS dmi_vendor = VENDOR_UNKNOWN; static const char *dmi_product = NULL; /* * Remember the system vendor for later use. We only actually store the * value if we know how to decode at least one specific entry type for * that vendor. */ void dmi_set_vendor(const char *v, const char *p) { const struct { const char *str; enum DMI_VENDORS id; } vendor[] = { { "Acer", VENDOR_ACER }, { "HP", VENDOR_HP }, { "Hewlett-Packard", VENDOR_HP }, { "HPE", VENDOR_HPE }, { "Hewlett Packard Enterprise", VENDOR_HPE }, { "IBM", VENDOR_IBM }, { "LENOVO", VENDOR_LENOVO }, }; unsigned int i; size_t len; /* * Often DMI strings have trailing spaces. Ignore these * when checking for known vendor names. */ len = v ? strlen(v) : 0; while (len && v[len - 1] == ' ') len--; for (i = 0; i < ARRAY_SIZE(vendor); i++) { if (strlen(vendor[i].str) == len && strncmp(v, vendor[i].str, len) == 0) { dmi_vendor = vendor[i].id; break; } } dmi_product = p; } /* * Acer-specific data structures are decoded here. */ static int dmi_decode_acer(const struct dmi_header *h) { u8 *data = h->data; u16 cap; switch (h->type) { case 170: /* * Vendor Specific: Acer Hotkey Function * * Source: acer-wmi kernel driver * * Probably applies to some laptop models of other * brands, including Fujitsu-Siemens, Medion, Lenovo, * and eMachines. */ pr_handle_name("Acer Hotkey Function"); if (h->length < 0x0F) break; cap = WORD(data + 0x04); pr_attr("Function bitmap for Communication Button", "0x%04hx", cap); pr_subattr("WiFi", "%s", cap & 0x0001 ? "Yes" : "No"); pr_subattr("3G", "%s", cap & 0x0040 ? "Yes" : "No"); pr_subattr("WiMAX", "%s", cap & 0x0080 ? "Yes" : "No"); pr_subattr("Bluetooth", "%s", cap & 0x0800 ? "Yes" : "No"); pr_attr("Function bitmap for Application Button", "0x%04hx", WORD(data + 0x06)); pr_attr("Function bitmap for Media Button", "0x%04hx", WORD(data + 0x08)); pr_attr("Function bitmap for Display Button", "0x%04hx", WORD(data + 0x0A)); pr_attr("Function bitmap for Others Button", "0x%04hx", WORD(data + 0x0C)); pr_attr("Communication Function Key Number", "%d", data[0x0E]); break; default: return 0; } return 1; } /* * HPE-specific data structures are decoded here. * * Code contributed by John Cagle and Tyler Bell. */ static void dmi_print_hp_net_iface_rec(u8 id, u8 bus, u8 dev, const u8 *mac) { /* Some systems do not provide an id. nic_ctr provides an artificial * id, and assumes the records will be provided "in order". Also, * using 0xFF marker is not future proof. 256 NICs is a lot, but * 640K ought to be enough for anybody(said no one, ever). * */ static u8 nic_ctr; char attr[8]; if (id == 0xFF) id = ++nic_ctr; sprintf(attr, "NIC %hhu", id); if (dev == 0x00 && bus == 0x00) pr_attr(attr, "Disabled"); else if (dev == 0xFF && bus == 0xFF) pr_attr(attr, "Not Installed"); else { pr_attr(attr, "PCI device %02x:%02x.%x, " "MAC address %02X:%02X:%02X:%02X:%02X:%02X", bus, dev >> 3, dev & 7, mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]); } } typedef enum { G6 = 6, G7, G8, G9, G10, G10P } dmi_hpegen_t; static int dmi_hpegen(const char *s) { struct { const char *name; dmi_hpegen_t gen; } table[] = { { "Gen10 Plus", G10P }, { "Gen10", G10 }, { "Gen9", G9 }, { "Gen8", G8 }, { "G7", G7 }, { "G6", G6 }, }; unsigned int i; if (!strstr(s, "ProLiant") && !strstr(s, "Apollo") && !strstr(s, "Synergy") && !strstr(s, "Edgeline")) return -1; for (i = 0; i < ARRAY_SIZE(table); i++) { if (strstr(s, table[i].name)) return(table[i].gen); } return (dmi_vendor == VENDOR_HPE) ? G10P : G6; } static void dmi_hp_240_attr(u64 defined, u64 set) { static const char *attributes[] = { "Updatable", "Reset Required", "Authentication Required", "In Use", "UEFI Image", }; unsigned int i; pr_list_start("Attributes Defined/Set", NULL); for (i = 0; i < ARRAY_SIZE(attributes); i++) { if (!(defined.l & (1UL << i))) continue; pr_list_item("%s: %s", attributes[i], set.l & (1UL << i) ? "Yes" : "No"); } pr_list_end(); } static void dmi_hp_203_assoc_hndl(const char *fname, u16 num) { if (opt.flags & FLAG_QUIET) return; if (num == 0xFFFE) pr_attr(fname, "N/A"); else pr_attr(fname, "0x%04X", num); } static void dmi_hp_203_pciinfo(const char *fname, u16 num) { if (num == 0xFFFF) pr_attr(fname, "Device Not Present"); else pr_attr(fname, "0x%04x", num); } static void dmi_hp_203_bayenc(const char *fname, u8 num) { switch (num) { case 0x00: pr_attr(fname, "Unknown"); break; case 0xff: pr_attr(fname, "Do Not Display"); break; default: pr_attr(fname, "%d", num); } } static void dmi_hp_203_devtyp(const char *fname, unsigned int code) { const char *str = "Reserved"; static const char *type[] = { "Unknown", /* 0x00 */ "Reserved", "Reserved", "Flexible LOM", "Embedded LOM", "NIC in a Slot", "Storage Controller", "Smart Array Storage Controller", "USB Hard Disk", "Other PCI Device", "RAM Disk", "Firmware Volume", "UEFI Shell", "Generic UEFI USB Boot Entry", "Dynamic Smart Array Controller", "File", "NVME Hard Drive", "NVDIMM" /* 0x11 */ }; if (code < ARRAY_SIZE(type)) str = type[code]; pr_attr(fname, "%s", str); } static void dmi_hp_203_devloc(const char *fname, unsigned int code) { const char *str = "Reserved"; static const char *location[] = { "Unknown", /* 0x00 */ "Embedded", "iLO Virtual Media", "Front USB Port", "Rear USB Port", "Internal USB", "Internal SD Card", "Internal Virtual USB (Embedded NAND)", "Embedded SATA Port", "Embedded Smart Array", "PCI Slot", "RAM Memory", "USB", "Dynamic Smart Array Controller", "URL", "NVMe Drive Bay" /* 0x0F */ }; if (code < ARRAY_SIZE(location)) str = location[code]; pr_attr(fname, "%s", str); } static void dmi_hp_216_fw_type(u16 code) { const char *str = "Reserved"; static const char * const type[] = { "Reserved", /* 0x00 */ "System ROM", "Redundant System ROM", "System ROM Bootblock", "Power Management Controller Firmware", "Power Management Controller Firmware Bootloader", "SL Chassis Firmware", "SL Chassis Firmware Bootloader", "Hardware PAL/CPLD", "SPS Firmware (ME Firmware)", "SL Chassis PAL/CPLD", "Compatibility Support Module (CSM)", "APML", "Smart Storage Battery (Megacell) Firmware", "Trusted Module (TPM or TCM) Firmware Version", "NVMe Backplane Firmware", "Intelligent Provisioning", "SPI Descriptor Version", "Innovation Engine Firmware (IE Firmware)", "UMB Backplane Firmware", "Reserved", /* 0x14 */ "Reserved", "Reserved", "Reserved", "Reserved", "Reserved", "Reserved", "Reserved", "Reserved", "Reserved", "Reserved", "Reserved", /* 0x1F */ "EL Chassis Abstraction Revision", "EL Chassis Firmware Revision", "EL Chassis PAL/CPLD", "EL Cartride Abstraction Revision", "Reserved", /* 0x24 */ "Reserved", "Reserved", "Reserved", "Reserved", "Reserved", "Reserved", "Reserved", "Reserved", "Reserved", "Reserved", "Reserved", /* 0x2F */ "Embedded Video Controller", "PCIe Riser Programmable Logic Device", "PCIe cards that contain a CPLD", "Intel NVMe VROC", "Intel SATA VROC", "Intel SPS Firmware", "Secondary System Programmable Logic Device", "CPU MEZZ Programmable Logic Device", /* 0x37 */ "Intel Artic Sound -M Accelerator Models Firmware", "Ampere System Control Processor (SCP – PMPro+SMPro)", "Intel CFR information", /* 0x3A */ }; if (code < ARRAY_SIZE(type)) str = type[code]; pr_attr("Firmware Type", "%s", str); } static void dmi_hp_216_version(u8 format, u8 *data) { const char * const name = "Version Data"; const char * const reserved = "Reserved"; int gen; gen = dmi_hpegen(dmi_product); switch (format) { case 0: pr_attr(name, "No Version Data"); break; case 1: pr_attr(name, "%c.%d.%d", data[0] & (1 << 7) ? 'B' : 'R', data[0] & 0x7, data[1] & 0x7); break; case 2: pr_attr(name, "%d.%d", data[0] >> 4, data[0] & 0x0f); break; case 4: pr_attr(name, "%d.%d.%d", data[0] >> 4, data[0] & 0x0f, data[1] & 0x7f); break; case 5: if (gen == G9) { pr_attr(name, "%d.%d.%d", data[0] >> 4, data[0] & 0x0f, data[1] & 0x7f); } else if (gen == G10 || gen == G10P) { pr_attr(name, "%d.%d.%d.%d", data[1] & 0x0f, data[3] & 0x0f, data[5] & 0x0f, data[6] & 0x0f); } else { pr_attr(name, "%s", reserved); } break; case 6: pr_attr(name, "%d.%d", data[1], data[0]); break; case 7: pr_attr(name, "v%d.%.2d (%.2d/%.2d/%d)", data[0], data[1], data[2], data[3], WORD(data + 4)); break; case 8: pr_attr(name, "%d.%d", WORD(data + 4), WORD(data)); break; case 9: pr_attr(name, "%d.%d.%d", data[0], data[1], WORD(data + 2)); break; case 10: pr_attr(name, "%d.%d.%d Build %d", data[0], data[1], data[2], data[3]); break; case 11: pr_attr(name, "%d.%d %d", WORD(data + 2), WORD(data), DWORD(data + 4)); break; case 12: pr_attr(name, "%d.%d.%d.%d", WORD(data), WORD(data + 2), WORD(data + 4), WORD(data + 6)); break; case 13: pr_attr(name, "%d", data[0]); break; case 14: pr_attr(name, "%d.%d.%d.%d", data[0], data[1], data[2], data[3]); break; case 15: pr_attr(name, "%d.%d.%d.%d (%.2d/%.2d/%d)", WORD(data), WORD(data + 2), WORD(data + 4), WORD(data + 6), data[8], data[9], WORD(data + 10)); break; case 16: pr_attr(name, "%c%c%c%c.%d%d", data[0], data[1], data[2], data[3], data[4], data[5]); break; case 17: pr_attr(name, "%08X", DWORD(data)); break; case 18: pr_attr(name, "%d.%2d", data[0], data[1]); break; case 3: /* fall through */ default: pr_attr(name, "%s", reserved); } } static int dmi_hp_224_status(u8 code) { static const char * const present[] = { "Not Present", /* 0x00 */ "Present/Enabled", "Present/Disabled", "Reserved" /* 0x03 */ }; pr_attr("Status", "%s", present[code & 0x03]); if ((code & 0x03) == 0x00) return 0; pr_attr("Option ROM Measuring", "%s", (code & (1 << 2)) ? "Yes" : "No"); pr_attr("Hidden", "%s", (code & (1 << 3)) ? "Yes" : "No"); return 1; } static void dmi_hp_224_ex_status(u8 status, u8 code) { const char *str = "Reserved"; static const char * const disable_reason[] = { "Not Specified", /* 0x00 */ "User Disabled", "Error Condition", "Reserved" /* 0x03 */ }; static const char * const error_condition[] = { "Not Specified", /* 0x00 */ "Self-Test", /* 0x01 */ }; if ((status & 0x03) == 0x02) pr_attr("Disable Reason", "%s", disable_reason[code & 0x03]); if ((code & 0x03) == 0x02) { u8 error = (code >> 2) & 0x0f; if (error < ARRAY_SIZE(error_condition)) str = error_condition[error]; pr_attr("Error Condition", "%s", str); } } static void dmi_hp_224_module_type(u8 code) { const char *str = "Reserved"; static const char * const type[] = { "Not Specified", /* 0x00 */ "TPM 1.2", "TPM 2.0", "Intel PTT fTPM" /* 0x03 */ }; if ((code & 0x0f) < ARRAY_SIZE(type)) str = type[code & 0x0f]; pr_attr("Type", "%s", str); pr_attr("Standard Algorithm Supported", "%s", (code & (1 << 4)) ? "Yes" : "No"); pr_attr("Chinese Algorithm Supported", "%s", (code & (1 << 5)) ? "Yes" : "No"); } static void dmi_hp_224_module_attr(u8 code) { static const char * const phys_attr[] = { "Not Specified", /* 0x00 */ "Pluggable and Optional", "Pluggable but Standard", "Soldered Down on System Board" /* 0x03 */ }; static const char * const fips_attr[] = { "Not Specified", /* 0x00 */ "Not FIPS Certified", "FIPS Certified", "Reserved" /* 0x03 */ }; pr_attr("Trusted Module Attributes", "%s", phys_attr[code & 0x3]); pr_attr("FIPS Certification", "%s", fips_attr[((code >> 2) & 0x03)]); } static void dmi_hp_224_chipid(u16 code) { const char *str = "Reserved"; static const char * const chipid[] = { "None", /* 0x00 */ "STMicroGen10 TPM", "Intel firmware TPM (PTT)", "Nationz TPM", "STMicroGen10 Plus TPM", "STMicroGen11 TPM", /* 0x05 */ }; if ((code & 0xff) < ARRAY_SIZE(chipid)) str = chipid[code & 0xff]; pr_attr("Chip Identifier", "%s", str); } static void dmi_hp_230_method_bus_seg_addr(u8 code, u8 bus_seg, u8 addr) { const char *str = "Reserved"; static const char * const method[] = { "Not Available", /* 0x00 */ "IPMI I2C", "iLO", "Chassis Manager", /* 0x03 */ }; if (code < ARRAY_SIZE(method)) str = method[code]; pr_attr("Access Method", "%s", str); if (code == 0 || code >= ARRAY_SIZE(method)) return; if (bus_seg != 0xFF) { if (code == 2) pr_attr("I2C Segment Number", "%d", bus_seg); else pr_attr("I2C Bus Number", "%d", bus_seg); } if (addr != 0xFF) pr_attr("I2C Address", "0x%02x", addr >> 1); } static void dmi_hp_238_loc(const char *fname, unsigned int code) { const char *str = "Reserved"; static const char *location[] = { "Internal", /* 0x00 */ "Front of Server", "Rear of Server", "Embedded internal SD Card", "iLO USB", "USB Hub for NAND Controller", "Reserved", "Debug Port", /* 0x07 */ }; if (code < ARRAY_SIZE(location)) str = location[code]; pr_attr(fname, "%s", str); } static void dmi_hp_238_flags(const char *fname, unsigned int code) { const char *str = "Reserved"; static const char *flags[] = { "Not Shared", /* 0x00 */ "Shared with physical switch", "Shared with automatic control", /* 0x02 */ }; if (code < ARRAY_SIZE(flags)) str = flags[code]; pr_attr(fname, "%s", str); } static void dmi_hp_238_speed(const char *fname, unsigned int code) { const char *str = "Reserved"; static const char *speed[] = { "Reserved", /* 0x00 */ "USB 1.1 Full Speed", "USB 2.0 High Speed", "USB 3.0 Super Speed" /* 0x03 */ }; if (code < ARRAY_SIZE(speed)) str = speed[code]; pr_attr(fname, "%s", str); } static void dmi_hp_242_hdd_type(u8 code) { const char *str = "Reserved"; static const char * const type[] = { "Undetermined", /* 0x00 */ "NVMe SSD", "SATA", "SAS", "SATA SSD", "NVMe Manged by VROC/VMD", /* 0x05 */ }; if (code < ARRAY_SIZE(type)) str = type[code]; pr_attr("Hard Drive Type", "%s", str); } static void dmi_hp_242_form_factor(u8 code) { const char *str = "Reserved"; static const char * const form[] = { "Reserved", /* 0x00 */ "Reserved", "3.5\" form factor", "2.5\" form factor", "1.8\" form factor", "Less than 1.8\" form factor", "mSATA", "M.2", "MicroSSD", "CFast", /* 0x09 */ }; if (code < ARRAY_SIZE(form)) str = form[code]; pr_attr("Form Factor", "%s", str); } static void dmi_hp_242_speed(const char *attr, u16 speed) { if (speed) pr_attr(attr, "%hu Gbit/s", speed); else pr_attr(attr, "%s", "Unknown"); } static int dmi_decode_hp(const struct dmi_header *h) { u8 *data = h->data; int nic, ptr; u32 feat; const char *company = (dmi_vendor == VENDOR_HP) ? "HP" : "HPE"; int gen; gen = dmi_hpegen(dmi_product); if (gen < 0) return 0; switch (h->type) { case 194: /* * Vendor Specific: Super IO Enable/Disable Features * * Offset | Name | Width | Description * ------------------------------------- * 0x00 | Type | BYTE | 0xC2, Super IO Enable/Disable Indicator * 0x01 | Length | BYTE | Length of structure * 0x02 | Handle | WORD | Unique handle * 0x04 | Dev Status | BYTE | Device Status */ pr_handle_name("%s ProLiant Super IO Enable/Disable Indicator", company); if (h->length < 0x05) break; feat = data[0x04]; pr_attr("Serial Port A", "%s", feat & (1 << 0) ? "Enabled" : "Disabled"); pr_attr("Serial Port B", "%s", feat & (1 << 1) ? "Enabled" : "Disabled"); pr_attr("Parallel Port", "%s", feat & (1 << 2) ? "Enabled" : "Disabled"); pr_attr("Floppy Disk Port", "%s", feat & (1 << 3) ? "Enabled" : "Disabled"); pr_attr("Virtual Serial Port", "%s", feat & (1 << 4) ? "Enabled" : "Disabled"); break; case 199: /* * Vendor Specific: CPU Microcode Patch * * Offset | Name | Width | Description * ------------------------------------- * 0x00 | Type | BYTE | 0xC7, CPU Microcode Patch * 0x01 | Length | BYTE | Length of structure * 0x02 | Handle | WORD | Unique handle * 0x04 | Patch Info | Varies| { ...} */ if (gen < G9) return 0; pr_handle_name("%s ProLiant CPU Microcode Patch Support Info", company); for (ptr = 0x4; ptr + 12 <= h->length; ptr += 12) { u32 cpuid = DWORD(data + ptr + 2 * 4); u32 date; /* AMD omits BaseFamily. Reconstruction valid on family >= 15. */ if (cpuid_type == cpuid_x86_amd) cpuid = ((cpuid & 0xfff00) << 8) | 0x0f00 | (cpuid & 0xff); dmi_print_cpuid(pr_attr, "CPU ID", cpuid_type, (u8 *) &cpuid); date = DWORD(data + ptr + 4); pr_subattr("Date", "%04x-%02x-%02x", date & 0xffff, (date >> 24) & 0xff, (date >> 16) & 0xff); pr_subattr("Patch", "0x%X", DWORD(data + ptr)); } break; case 203: /* * Vendor Specific: HP Device Correlation Record * * Offset | Name | Width | Description * ------------------------------------- * 0x00 | Type | BYTE | 0xCB, Correlation Record * 0x01 | Length | BYTE | Length of structure * 0x02 | Handle | WORD | Unique handle * 0x04 | Assoc Device | WORD | Handle of Associated Type 9 or Type 41 Record * 0x06 | Assoc SMBus | WORD | Handle of Associated Type 228 SMBus Segment Record * 0x08 | PCI Vendor ID| WORD | PCI Vendor ID of device 0xFFFF -> not present * 0x0A | PCI Device ID| WORD | PCI Device ID of device 0xFFFF -> not present * 0x0C | PCI SubVendor| WORD | PCI Sub Vendor ID of device 0xFFFF -> not present * 0x0E | PCI SubDevice| WORD | PCI Sub Device ID of device 0xFFFF -> not present * 0x10 | Class Code | BYTE | PCI Class Code of Endpoint. 0xFF if device not present. * 0x11 | Class SubCode| BYTE | PCI Sub Class Code of Endpoint. 0xFF if device not present. * 0x12 | Parent Handle| WORD | * 0x14 | Flags | WORD | * 0x16 | Device Type | BYTE | UEFI only * 0x17 | Device Loc | BYTE | Device Location * 0x18 | Dev Instance | BYTE | Device Instance * 0x19 | Sub Instance | BYTE | NIC Port # or NVMe Drive Bay * 0x1A | Bay | BYTE | * 0x1B | Enclosure | BYTE | * 0x1C | UEFI Dev Path| STRING| String number for UEFI Device Path * 0x1D | Struct Name | STRING| String number for UEFI Device Structured Name * 0x1E | Device Name | STRING| String number for UEFI Device Name * 0x1F | UEFI Location| STRING| String number for UEFI Location * 0x20 | Assoc Handle | WORD | Type 9 Handle. Defined if Flags[0] == 1. * 0x22 | Part Number | STRING| PCI Device Part Number * 0x23 | Serial Number| STRING| PCI Device Serial Number * 0x24 | Seg Number | WORD | Segment Group number. 0 -> Single group topology * 0x26 | Bus Number | BYTE | PCI Device Bus Number * 0x27 | Func Number | BTYE | PCI Device and Function Number */ if (gen < G9) return 0; pr_handle_name("%s Device Correlation Record", company); if (h->length < 0x1F) break; dmi_hp_203_assoc_hndl("Associated Device Record", WORD(data + 0x04)); dmi_hp_203_assoc_hndl("Associated SMBus Record", WORD(data + 0x06)); if (WORD(data + 0x08) == 0xffff && WORD(data + 0x0A) == 0xffff && WORD(data + 0x0C) == 0xffff && WORD(data + 0x0E) == 0xffff && data[0x10] == 0xFF && data[0x11] == 0xFF) { pr_attr("PCI Device Info", "Device Not Present"); } else { dmi_hp_203_pciinfo("PCI Vendor ID", WORD(data + 0x08)); dmi_hp_203_pciinfo("PCI Device ID", WORD(data + 0x0A)); dmi_hp_203_pciinfo("PCI Sub Vendor ID", WORD(data + 0x0C)); dmi_hp_203_pciinfo("PCI Sub Device ID", WORD(data + 0x0E)); dmi_hp_203_pciinfo("PCI Class Code", (char)data[0x10]); dmi_hp_203_pciinfo("PCI Sub Class Code", (char)data[0x11]); } dmi_hp_203_assoc_hndl("Parent Handle", WORD(data + 0x12)); pr_attr("Flags", "0x%04X", WORD(data + 0x14)); dmi_hp_203_devtyp("Device Type", data[0x16]); dmi_hp_203_devloc("Device Location", data[0x17]); pr_attr("Device Instance", "%d", data[0x18]); pr_attr("Device Sub-Instance", "%d", data[0x19]); dmi_hp_203_bayenc("Bay", data[0x1A]); dmi_hp_203_bayenc("Enclosure", data[0x1B]); pr_attr("Device Path", "%s", dmi_string(h, data[0x1C])); pr_attr("Structured Name", "%s", dmi_string(h, data[0x1D])); pr_attr("Device Name", "%s", dmi_string(h, data[0x1E])); if (h->length < 0x22) break; pr_attr("UEFI Location", "%s", dmi_string(h, data[0x1F])); if (!(opt.flags & FLAG_QUIET)) { if (WORD(data + 0x14) & 1) pr_attr("Associated Real/Phys Handle", "0x%04X", WORD(data + 0x20)); else pr_attr("Associated Real/Phys Handle", "N/A"); } if (h->length < 0x24) break; pr_attr("PCI Part Number", "%s", dmi_string(h, data[0x22])); pr_attr("Serial Number", "%s", dmi_string(h, data[0x23])); if (h->length < 0x28) break; pr_attr("Segment Group Number", "0x%04x", WORD(data + 0x24)); pr_attr("PCI Device", "%02x:%02x.%x", data[0x26], data[0x27] >> 3, data[0x27] & 7); break; case 204: /* * Vendor Specific: HPE ProLiant System/Rack Locator */ pr_handle_name("%s ProLiant System/Rack Locator", company); if (h->length < 0x0B) break; pr_attr("Rack Name", "%s", dmi_string(h, data[0x04])); pr_attr("Enclosure Name", "%s", dmi_string(h, data[0x05])); pr_attr("Enclosure Model", "%s", dmi_string(h, data[0x06])); pr_attr("Enclosure Serial", "%s", dmi_string(h, data[0x0A])); pr_attr("Enclosure Bays", "%d", data[0x08]); pr_attr("Server Bay", "%s", dmi_string(h, data[0x07])); pr_attr("Bays Filled", "%d", data[0x09]); break; case 209: case 221: /* * Vendor Specific: HPE ProLiant NIC MAC Information * * This prints the BIOS NIC number, * PCI bus/device/function, and MAC address * * Type 209: * Offset | Name | Width | Description * ------------------------------------- * 0x00 | Type | BYTE | 0xD1, MAC Info * 0x01 | Length | BYTE | Length of structure * 0x02 | Handle | WORD | Unique handle * 0x04 | Dev No | BYTE | PCI Device/Function No * 0x05 | Bus No | BYTE | PCI Bus * 0x06 | MAC | 6B | MAC addr * 0x0C | NIC #2 | 8B | Repeat 0x04-0x0B * * Type 221: is deprecated in the latest docs */ pr_handle_name("%s %s", company, h->type == 221 ? "BIOS iSCSI NIC PCI and MAC Information" : "BIOS PXE NIC PCI and MAC Information"); nic = 1; ptr = 4; while (h->length >= ptr + 8) { dmi_print_hp_net_iface_rec(nic, data[ptr + 0x01], data[ptr], &data[ptr + 0x02]); nic++; ptr += 8; } break; case 212: /* * Vendor Specific: HPE 64-bit CRU Information * * Source: hpwdt kernel driver */ pr_handle_name("%s 64-bit CRU Information", company); if (h->length < 0x18) break; if (is_printable(data + 0x04, 4)) pr_attr("Signature", "0x%08x (%c%c%c%c)", DWORD(data + 0x04), data[0x04], data[0x05], data[0x06], data[0x07]); else pr_attr("Signature", "0x%08x", DWORD(data + 0x04)); if (DWORD(data + 0x04) == 0x55524324) { u64 paddr = QWORD(data + 0x08); paddr.l += DWORD(data + 0x14); if (paddr.l < DWORD(data + 0x14)) paddr.h++; pr_attr("Physical Address", "0x%08x%08x", paddr.h, paddr.l); pr_attr("Length", "0x%08x", DWORD(data + 0x10)); } break; case 216: /* * Vendor Specific: Version Indicator Record * * This record is used to allow determining Firmware and CPLD revisions for * components in the system. The goal of this record is to provide a * flexible method to communicate to software and firmware the revisions * of these components. This record replaces much of the functionality of * Record Type 193. OEM SMBIOS Record Type 193 was not scaling well with * the large number of potential CPLD devices, power management controllers, * etc. This record is flexible such that each instance of Type 216 * defines one firmware component. This record also includes the string * name for which software should refer to the component. The record * includes both data bytes to indicate the revision and a string value. A * firmware component can implement either or both. If both are supported, * it allows easy display of the revision, but prevents the need for * software/firmware to parse strings when doing comparisons on revisions. * As there is one Type 216 Record per firmware component, the Handle for * the Record can be used to tie firmware components with other OEM SMBIOS * Records in the future if needed (similar to how SMBIOS Type 17 is tied * to other Record Types related to DIMMs) * * Offset | Name | Width | Description * ------------------------------------------ * 0x00 | Type | BYTE | 0xD8, Version Indicator Record * 0x01 | Length | BYTE | Length of structure * 0x02 | Handle | WORD | Unique handle * 0x04 | FW Type | WORD | Type of Firmware * 0x06 | FW Name | STRING | Name of Firmware * 0x07 | FW Version | STRING | Firmware Version * 0x08 | Data Format| BYTE | Format of the Version Data * 0x09 |Version Data|12 BYTES| Version Data in Format from field 0x08 * 0x15 | Unique ID | WORD | Unique ID for Firmware flash */ if (gen < G8) return 0; pr_handle_name("%s Version Indicator", company); if (h->length < 23) break; dmi_hp_216_fw_type(WORD(data + 0x04)); pr_attr("Firmware Name String", "%s", dmi_string(h, data[0x06])); pr_attr("Firmware Version String", "%s", dmi_string(h, data[0x07])); dmi_hp_216_version(data[0x08], data + 0x09); if (WORD(data + 0x15)) pr_attr("Unique ID", "0x%04x", WORD(data + 0x15)); break; case 219: /* * Vendor Specific: HPE ProLiant Information * * Source: hpwdt kernel driver */ pr_handle_name("%s ProLiant Information", company); if (h->length < 0x08) break; pr_attr("Power Features", "0x%08x", DWORD(data + 0x04)); if (h->length < 0x0C) break; pr_attr("Omega Features", "0x%08x", DWORD(data + 0x08)); if (h->length < 0x14) break; feat = DWORD(data + 0x10); pr_attr("Misc. Features", "0x%08x", feat); pr_subattr("iCRU", "%s", feat & 0x0001 ? "Yes" : "No"); pr_subattr("UEFI", "%s", feat & 0x1400 ? "Yes" : "No"); break; case 224: /* * Vendor Specific: Trusted Module (TPM or TCM) Status * * Offset | Name | Width | Description * ------------------------------------- * 0x00 | Type | BYTE | 0xE0, Trusted Module (TPM or TCM) Status * 0x01 | Length | BYTE | Length of structure * 0x02 | Handle | WORD | Unique handle * 0x04 | Status | BYTE | Status Flag Byte * 0x05 | Ex Stat| BYTE | TPM Extended Status * 0x06 | Type | BYTE | Trusted Module Type * 0x07 | Attrib | BYTE | Trusted Module Attributes * 0x08 | Handle | WORD | Handle to map to Type 216 * 0x0A | Chip ID| WORD | Chip Identifier Values */ pr_handle_name("%s Trusted Module (TPM or TCM) Status", company); if (h->length < 0x05) break; if (!dmi_hp_224_status(data[0x04])) break; if (h->length < 0x0a) break; dmi_hp_224_ex_status(data[0x04], data[0x05]); dmi_hp_224_module_type(data[0x06]); dmi_hp_224_module_attr(data[0x07]); if (!(opt.flags & FLAG_QUIET)) pr_attr("Associated Handle", "0x%04X", WORD(data + 0x8)); if (h->length < 0x0c) break; dmi_hp_224_chipid(WORD(data + 0x0a)); break; case 230: /* * Vendor Specific: Power Supply Information OEM SMBIOS Record * * This record is used to communicate additional Power Supply Information * beyond the Industry Standard System Power Supply (Type 39) Record. * * Offset| Name | Width | Description * ----------------------------------------- * 0x00 | Type | BYTE | 0xE6, Power Supply Information Indicator * 0x01 | Length | BYTE | Length of structure * 0x02 | Handle | WORD | Unique handle * 0x04 | Assoc Handle| WORD | Associated Handle (Type 39) * 0x06 | Manufacturer| STRING| Actual third party manufacturer * 0x07 | Revision | STRING| Power Supply Revision Level * 0x08 | FRU Access | BYTE | Power Supply FRU Access Method * 0x09 | I2C Bus Num | BYTE | I2C Bus #. Value based upon context * 0x0A | I2C Address | BYTE | I2C Address */ pr_handle_name("%s Power Supply Information", company); if (h->length < 0x0B) break; if (!(opt.flags & FLAG_QUIET)) pr_attr("Associated Handle", "0x%04X", WORD(data + 0x4)); pr_attr("Manufacturer", "%s", dmi_string(h, data[0x06])); pr_attr("Revision", "%s", dmi_string(h, data[0x07])); dmi_hp_230_method_bus_seg_addr(data[0x08], data[0x09], data[0x0A]); break; case 233: /* * Vendor Specific: HPE ProLiant NIC MAC Information * * This prints the BIOS NIC number, * PCI bus/device/function, and MAC address * * Offset | Name | Width | Description * ------------------------------------- * 0x00 | Type | BYTE | 0xE9, NIC structure * 0x01 | Length | BYTE | Length of structure * 0x02 | Handle | WORD | Unique handle * 0x04 | Grp No | WORD | 0 for single segment * 0x06 | Bus No | BYTE | PCI Bus * 0x07 | Dev No | BYTE | PCI Device/Function No * 0x08 | MAC | 32B | MAC addr padded w/ 0s * 0x28 | Port No| BYTE | Each NIC maps to a Port */ pr_handle_name("%s BIOS PXE NIC PCI and MAC Information", company); if (h->length < 0x0E) break; /* If the record isn't long enough, we don't have an ID * use 0xFF to use the internal counter. * */ nic = h->length > 0x28 ? data[0x28] : 0xFF; dmi_print_hp_net_iface_rec(nic, data[0x06], data[0x07], &data[0x08]); break; case 236: /* * Vendor Specific: HPE ProLiant HDD Backplane * * Offset | Name | Width | Description * --------------------------------------- * 0x00 | Type | BYTE | 0xEC, HDD Backplane * 0x01 | Length | BYTE | Length of structure * 0x02 | Handle | WORD | Unique handle * 0x04 | I2C Address| BYTE | Backplane FRU I2C Address * 0x05 | Box Number | WORD | Backplane Box Number * 0x07 | NVRAM ID | WORD | Backplane NVRAM ID * 0x09 | WWID | QWORD | SAS Expander WWID * 0x11 | Total Bays | BYTE | Total SAS Bays * 0x12 | A0 Bays | BYTE | (deprecated) Number of SAS drive bays behind port 0xA0 * 0x13 | A2 Bays | BYTE | (deprecated) Number of SAS drive bays behind port 0xA2 * 0x14 | Name | STRING| (deprecated) Backplane Name */ pr_handle_name("%s HDD Backplane FRU Information", company); if (h->length < 0x08) break; pr_attr("FRU I2C Address", "0x%X raw(0x%X)", data[0x4] >> 1, data[0x4]); pr_attr("Box Number", "%d", WORD(data + 0x5)); pr_attr("NVRAM ID", "0x%X", WORD(data + 0x7)); if (h->length < 0x11) break; pr_attr("SAS Expander WWID", "0x%X", QWORD(data + 0x9)); if (h->length < 0x12) break; pr_attr("Total SAS Bays", "%d", data[0x11]); if (h->length < 0x15) break; if (gen < G10P) { pr_attr("A0 Bay Count", "%d", data[0x12]); pr_attr("A2 Bay Count", "%d", data[0x13]); pr_attr("Backplane Name", "%s", dmi_string(h, data[0x14])); } break; case 237: /* * Vendor Specific: HPE DIMM Vendor Part Number Information * * Offset | Name | Width | Description * --------------------------------------- * 0x00 | Type | BYTE | 0xED, DIMM Vendor Part Number information record * 0x01 | Length | BYTE | Length of structure * 0x02 | Handle | WORD | Unique handle * 0x04 | Hand Assoc | WORD | Handle to map to Type 17 * 0x06 | Manufacture|STRING | DIMM Manufacturer * 0x07 | Part Number|STRING | DIMM Manufacturer's Part Number * 0x08 | Serial Num |STRING | DIMM Vendor Serial Number * 0x09 | Spare Part |STRING | DIMM Spare Part Number */ if (gen < G9) return 0; pr_handle_name("%s DIMM Vendor Information", company); if (h->length < 0x08) break; if (!(opt.flags & FLAG_QUIET)) pr_attr("Associated Handle", "0x%04X", WORD(data + 0x4)); pr_attr("DIMM Manufacturer", "%s", dmi_string(h, data[0x06])); pr_attr("DIMM Manufacturer Part Number", "%s", dmi_string(h, data[0x07])); if (h->length < 0x09) break; pr_attr("DIMM Vendor Serial Number", "%s", dmi_string(h, data[0x08])); if (h->length < 0x0A) break; pr_attr("DIMM Spare Part Number", "%s", dmi_string(h, data[0x09])); break; case 238: /* * Vendor Specific: HPE USB Port Connector Correlation Record * * Offset | Name | Width | Description * --------------------------------------- * 0x00 | Type | BYTE | 0xEE, HP Device Correlation Record * 0x01 | Length | BYTE | Length of structure * 0x02 | Handle | WORD | Unique handle * 0x04 | Hand Assoc | WORD | Handle to map to Type 8 * 0x06 | Parent Bus | BYTE | PCI Bus number of USB controller of this port * 0x07 | Par Dev/Fun| BYTE | PCI Dev/Fun of USB Controller of this port * 0x08 | Location | BYTE | Enumerated value of location of USB port * 0x09 | Flags | WORD | USB Shared Management Port * 0x0B | Port Inst | BYTE | Instance number for this type of USB port * 0x0C | Parent Hub | BYTE | Instance number of internal Hub * 0x0D | Port Speed | BYTE | Enumerated value of speed configured by BIOS * 0x0E | Device Path| STRING| UEFI Device Path of USB endpoint */ if (gen < G9) return 0; pr_handle_name("%s Proliant USB Port Connector Correlation Record", company); if (h->length < 0x0F) break; if (!(opt.flags & FLAG_QUIET)) pr_attr("Associated Handle", "0x%04X", WORD(data + 0x4)); pr_attr("PCI Device", "%02x:%02x.%x", data[0x6], data[0x7] >> 3, data[0x7] & 0x7); dmi_hp_238_loc("Location", data[0x8]); dmi_hp_238_flags("Management Port", WORD(data + 0x9)); pr_attr("Port Instance", "%d", data[0xB]); if (data[0xC] != 0xFE) pr_attr("Parent Hub Port Instance", "%d", data[0xC]); else pr_attr("Parent Hub Port Instance", "N/A"); dmi_hp_238_speed("Port Speed Capability", data[0xD]); pr_attr("Device Path", "%s", dmi_string(h, data[0xE])); break; case 240: /* * Vendor Specific: HPE Proliant Inventory Record * * Reports firmware version information for devices that report their * firmware using their UEFI drivers. Additionally provides association * with other SMBIOS records, such as Type 203 (which in turn is * associated with Types 9, 41, and 228). * * Offset | Name | Width | Description * --------------------------------------- * 0x00 | Type | BYTE | 0xF0, HP Firmware Inventory Record * 0x01 | Length | BYTE | Length of structure * 0x02 | Handle | WORD | Unique handle * 0x04 | Hndl Assoc | WORD | Handle to map to Type 203 * 0x06 | Pkg Vers | DWORD | FW Vers Release of All FW in Device * 0x0A | Ver String | STRING| FW Version String * 0x0B | Image Size | QWORD | FW image size (bytes) * 0x13 | Attributes | QWORD | Bitfield: Is attribute defined? * 0x1B | Attr Set | QWORD | BitField: If defined, is attribute set? * 0x23 | Version | DWORD | Lowest supported version. */ pr_handle_name("%s Proliant Inventory Record", company); if (h->length < 0x27) break; if (!(opt.flags & FLAG_QUIET)) pr_attr("Associated Handle", "0x%04X", WORD(data + 0x4)); pr_attr("Package Version", "0x%08X", DWORD(data + 0x6)); pr_attr("Version String", "%s", dmi_string(h, data[0x0A])); if (DWORD(data + 0x0B)) dmi_print_memory_size("Image Size", QWORD(data + 0xB), 0); else pr_attr("Image Size", "Not Available"); dmi_hp_240_attr(QWORD(data + 0x13), QWORD(data + 0x1B)); if (DWORD(data + 0x23)) pr_attr("Lowest Supported Version", "0x%08X", DWORD(data + 0x23)); else pr_attr("Lowest Supported Version", "Not Available"); break; case 242: /* * Vendor Specific: HPE Hard Drive Inventory Record * * This record provides a mechanism for software to gather information for * NVMe and SATA drives that are directly attached to the system. This * record does not contain drive information for drives attached to a HBA * (i.e. a SmartArray controller). This record will only contain information * for a hard drive detected by the BIOS during POST and does not * comprehend a hot plug event after the system has booted. * * Offset | Name | Width | Description * --------------------------------------- * 0x00 | Type | BYTE | 0xF2, HPE Hard Drive Inventory Record * 0x01 | Length | BYTE | Length of structure * 0x02 | Handle | WORD | Unique handle * 0x04 | Hndl Assoc | WORD | Handle to map to Type 203 * 0x06 | HDD Type | BYTE | Hard drive type * 0x07 | HDD Uniq ID| QWORD | SATA-> WWID. NVMe -> IEEE Ext Uniq ID. * 0x0F | Capacity | DWORD | Drive Capacity in Mbytes * 0x13 | Hours | 16BYTE| Number of poweron hours * 0x23 | Reserved | BYTE | Reserved * 0x24 | Power | BTYE | Wattage * 0x25 | Form Factor| BYTE | HDD Form Factor * 0x26 | Health | BYTE | Hard Drive Health Status * 0x27 | Serial Num | STRING| NVMe/SATA Serial Number * 0x28 | Model Num | STRING| NVMe/SATA Model Number * 0x29 | FW Rev | STRING| Firmware revision * 0x2A | Location | STRING| Drive location * 0x2B | Crypt Stat | BYTE | Drive encryption status from BIOS * 0x2C | Capacity | QWORD | Hard Drive capacity in bytes * 0x34 | Block Size | DWORD | Logical Block Size in bytes * 0x38 | Rot Speed | WORD | Nominal Rotational Speed (RPM) * 0x3A | Neg Speed | WORD | Current negotiated bus speed * 0x3C | Cap Speed | WORD | Fastest Capable Bus Speed of drive */ if (gen < G10) return 0; pr_handle_name("%s ProLiant Hard Drive Inventory Record", company); if (h->length < 0x2C) break; if (!(opt.flags & FLAG_QUIET)) pr_attr("Associated Handle", "0x%04X", WORD(data + 0x4)); dmi_hp_242_hdd_type(data[0x06]); pr_attr("ID", "%llx", QWORD(data + 0x07)); if (h->length < 0x3E) pr_attr("Capacity", "%u MB", DWORD(data + 0x0F)); else dmi_print_memory_size("Capacity", QWORD(data + 0x2C), 0); /* NB: Poweron low QWORD good for 2,104,351,365,926,255 years */ pr_attr("Poweron", "%ld hours", QWORD(data + 0x13)); if (data[0x24]) pr_attr("Power Wattage", "%hhu W", data[0x24]); else pr_attr("Power Wattage", "%s", "Unknown"); dmi_hp_242_form_factor(data[0x25]); feat = data[0x26]; pr_attr("Health Status", "%s", (feat == 0x00) ? "OK" : (feat == 0x01) ? "Warning" : (feat == 0x02) ? "Critical" : (feat == 0xFF) ? "Unknown" : "Reserved"); pr_attr("Serial Number", dmi_string(h, data[0x27])); pr_attr("Model Number", dmi_string(h, data[0x28])); pr_attr("Firmware Revision", dmi_string(h, data[0x29])); pr_attr("Location", dmi_string(h, data[0x2A])); feat = data[0x2B]; pr_attr("Encryption Status", "%s", (feat == 0) ? "Not Encrypted" : (feat == 1) ? "Encrypted" : (feat == 2) ? "Unknown" : (feat == 3) ? "Not Supported" : "Reserved"); if (h->length < 0x3E) break; pr_attr("Block Size", "%u bytes", DWORD(data + 0x34)); /* Rotational Speed: 0 -> Not Reported, 1 -> N/A (SSD) */ if (data[0x38] > 1) pr_attr("Rotational Speed", "%hhu RPM", data[0x38]); dmi_hp_242_speed("Negotiated Speed", WORD(data + 0x3A)); dmi_hp_242_speed("Capable Speed", WORD(data + 0x3C)); break; default: return 0; } return 1; } static int dmi_decode_ibm_lenovo(const struct dmi_header *h) { u8 *data = h->data; switch (h->type) { case 131: /* * Vendor Specific: ThinkVantage Technologies feature bits * * Source: Compal hel81 Service Manual Software Specification, * documented under "System Management BIOS(SM BIOS) * version 2.4 or greater" * * Offset | Name | Width | Description * ---------------------------------------------- * 0x00 | Type | BYTE | 0x83 * 0x01 | Length | BYTE | 0x16 * 0x02 | Handle | WORD | Varies * 0x04 | Version | BYTE | 0x01 * 0x05 | TVT Structure | BYTEx16 | Each of the 128 bits represents a TVT feature: * | | | - bit 127 means diagnostics (PC Doctor) is available * | | | (http://www.pc-doctor.com/company/pr-articles/45-lenovo-introduces-thinkvantage-toolbox) * | | | - the rest (126-0) are reserved/unknown * * It must also be followed by a string containing * "TVT-Enablement". There exist other type 131 records * with different length and a different string, for * other purposes. */ if (h->length != 0x16 || strcmp(dmi_string(h, 1), "TVT-Enablement") != 0) return 0; pr_handle_name("ThinkVantage Technologies"); pr_attr("Version", "%u", data[0x04]); pr_attr("Diagnostics", "%s", data[0x14] & 0x80 ? "Available" : "No"); break; case 135: /* * Vendor Specific: Device Presence Detection bits * * Source: Compal hel81 Service Manual Software Specification, * documented as "SMBIOS Type 135: Bulk for Lenovo * Mobile PC Unique OEM Data" under appendix D. * * Offset | Name | Width | Description * --------------------------------------------------- * 0x00 | Type | BYTE | 0x87 * 0x01 | Length | BYTE | 0x0A * 0x02 | Handle | WORD | Varies * 0x04 | Signature | WORD | 0x5054 (ASCII for "TP") * 0x06 | OEM struct offset | BYTE | 0x07 * 0x07 | OEM struct number | BYTE | 0x03, for this structure * 0x08 | OEM struct revision | BYTE | 0x01, for this format * 0x09 | Device presence bits | BYTE | Each of the 8 bits indicates device presence: * | | | - bit 0 indicates the presence of a fingerprint reader * | | | - the rest (7-1) are reserved/unknown * * Other OEM struct number+rev combinations have been * seen in the wild but we don't know how to decode * them. */ if (h->length < 0x0A || data[0x04] != 'T' || data[0x05] != 'P') return 0; /* Bail out if not the expected format */ if (data[0x06] != 0x07 || data[0x07] != 0x03 || data[0x08] != 0x01) return 0; pr_handle_name("ThinkPad Device Presence Detection"); pr_attr("Fingerprint Reader", "%s", data[0x09] & 0x01 ? "Present" : "No"); break; case 140: /* * Vendor Specific: ThinkPad Embedded Controller Program * * Source: some guesswork, and publicly available information; * Lenovo's BIOS update READMEs often contain the ECP IDs * which match the first string in this type. * * Offset | Name | Width | Description * ---------------------------------------------------- * 0x00 | Type | BYTE | 0x8C * 0x01 | Length | BYTE | * 0x02 | Handle | WORD | Varies * 0x04 | Signature | BYTEx6 | ASCII for "LENOVO" * 0x0A | OEM struct offset | BYTE | 0x0B * 0x0B | OEM struct number | BYTE | 0x07, for this structure * 0x0C | OEM struct revision | BYTE | 0x01, for this format * 0x0D | ECP version ID | STRING | * 0x0E | ECP release date | STRING | */ if (h->length < 0x0F || memcmp(data + 4, "LENOVO", 6) != 0) return 0; /* Bail out if not the expected format */ if (data[0x0A] != 0x0B || data[0x0B] != 0x07 || data[0x0C] != 0x01) return 0; pr_handle_name("ThinkPad Embedded Controller Program"); pr_attr("Version ID", "%s", dmi_string(h, 1)); pr_attr("Release Date", "%s", dmi_string(h, 2)); break; default: return 0; } return 1; } /* * Dispatch vendor-specific entries decoding * Return 1 if decoding was successful, 0 otherwise */ int dmi_decode_oem(const struct dmi_header *h) { switch (dmi_vendor) { case VENDOR_HP: case VENDOR_HPE: return dmi_decode_hp(h); case VENDOR_ACER: return dmi_decode_acer(h); case VENDOR_IBM: case VENDOR_LENOVO: return dmi_decode_ibm_lenovo(h); default: return 0; } } CPU-X-5.0.3/src/dmidecode/dmioem.h000066400000000000000000000017631454622605200165170ustar00rootroot00000000000000/* * Decoding of OEM-specific entries * This file is part of the dmidecode project. * * Copyright (C) 2007-2008 Jean Delvare * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ struct dmi_header; void dmi_set_vendor(const char *s, const char *p); int dmi_decode_oem(const struct dmi_header *h); CPU-X-5.0.3/src/dmidecode/dmiopt.c000066400000000000000000000234071454622605200165330ustar00rootroot00000000000000/* * Command line handling of dmidecode * This file is part of the dmidecode project. * * Copyright (C) 2005-2008 Jean Delvare * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #include #include #include #include #include #include "config.h" #include "types.h" #include "util.h" #include "dmidecode.h" #include "dmiopt.h" /* Options are global */ struct opt opt; /* * Handling of option --type */ struct type_keyword { const char *keyword; const u8 *type; }; static const u8 opt_type_bios[] = { 0, 13, 255 }; static const u8 opt_type_system[] = { 1, 12, 15, 23, 32, 255 }; static const u8 opt_type_baseboard[] = { 2, 10, 41, 255 }; static const u8 opt_type_chassis[] = { 3, 255 }; static const u8 opt_type_processor[] = { 4, 255 }; static const u8 opt_type_memory[] = { 5, 6, 16, 17, 255 }; static const u8 opt_type_cache[] = { 7, 255 }; static const u8 opt_type_connector[] = { 8, 255 }; static const u8 opt_type_slot[] = { 9, 255 }; static const struct type_keyword opt_type_keyword[] = { { "bios", opt_type_bios }, { "system", opt_type_system }, { "baseboard", opt_type_baseboard }, { "chassis", opt_type_chassis }, { "processor", opt_type_processor }, { "memory", opt_type_memory }, { "cache", opt_type_cache }, { "connector", opt_type_connector }, { "slot", opt_type_slot }, }; static void print_opt_type_list(void) { unsigned int i; fprintf(stderr, "Valid type keywords are:\n"); for (i = 0; i < ARRAY_SIZE(opt_type_keyword); i++) { fprintf(stderr, " %s\n", opt_type_keyword[i].keyword); } } static u8 *parse_opt_type(u8 *p, const char *arg) { unsigned int i; /* Allocate memory on first call only */ if (p == NULL) { p = (u8 *)calloc(256, sizeof(u8)); if (p == NULL) { perror("calloc"); return NULL; } } /* First try as a keyword */ for (i = 0; i < ARRAY_SIZE(opt_type_keyword); i++) { if (!strcasecmp(arg, opt_type_keyword[i].keyword)) { int j = 0; while (opt_type_keyword[i].type[j] != 255) p[opt_type_keyword[i].type[j++]] = 1; goto found; } } /* Else try as a number */ while (*arg != '\0') { unsigned long val; char *next; val = strtoul(arg, &next, 0); if (next == arg || (*next != '\0' && *next != ',' && *next != ' ')) { fprintf(stderr, "Invalid type keyword: %s\n", arg); print_opt_type_list(); goto exit_free; } if (val > 0xff) { fprintf(stderr, "Invalid type number: %lu\n", val); goto exit_free; } p[val] = 1; arg = next; while (*arg == ',' || *arg == ' ') arg++; } found: return p; exit_free: free(p); return NULL; } /* * Handling of option --string */ /* This lookup table could admittedly be reworked for improved performance. Due to the low count of items in there at the moment, it did not seem worth the additional code complexity though. */ static const struct string_keyword opt_string_keyword[] = { { "bios-vendor", 0, 0x04 }, { "bios-version", 0, 0x05 }, { "bios-release-date", 0, 0x08 }, { "bios-revision", 0, 0x15 }, /* 0x14 and 0x15 */ { "firmware-revision", 0, 0x17 }, /* 0x16 and 0x17 */ { "system-manufacturer", 1, 0x04 }, { "system-product-name", 1, 0x05 }, { "system-version", 1, 0x06 }, { "system-serial-number", 1, 0x07 }, { "system-uuid", 1, 0x08 }, /* dmi_system_uuid() */ { "system-sku-number", 1, 0x19 }, { "system-family", 1, 0x1a }, { "baseboard-manufacturer", 2, 0x04 }, { "baseboard-product-name", 2, 0x05 }, { "baseboard-version", 2, 0x06 }, { "baseboard-serial-number", 2, 0x07 }, { "baseboard-asset-tag", 2, 0x08 }, { "chassis-manufacturer", 3, 0x04 }, { "chassis-type", 3, 0x05 }, /* dmi_chassis_type() */ { "chassis-version", 3, 0x06 }, { "chassis-serial-number", 3, 0x07 }, { "chassis-asset-tag", 3, 0x08 }, { "processor-family", 4, 0x06 }, /* dmi_processor_family() */ { "processor-manufacturer", 4, 0x07 }, { "processor-version", 4, 0x10 }, { "processor-frequency", 4, 0x16 }, /* dmi_processor_frequency() */ }; /* This is a template, 3rd field is set at runtime. */ static struct string_keyword opt_oem_string_keyword = { NULL, 11, 0x00 }; static void print_opt_string_list(void) { unsigned int i; fprintf(stderr, "Valid string keywords are:\n"); for (i = 0; i < ARRAY_SIZE(opt_string_keyword); i++) { fprintf(stderr, " %s\n", opt_string_keyword[i].keyword); } } static int parse_opt_string(const char *arg) { unsigned int i; if (opt.string) { fprintf(stderr, "Only one string can be specified\n"); return -1; } for (i = 0; i < ARRAY_SIZE(opt_string_keyword); i++) { if (!strcasecmp(arg, opt_string_keyword[i].keyword)) { opt.string = &opt_string_keyword[i]; return 0; } } fprintf(stderr, "Invalid string keyword: %s\n", arg); print_opt_string_list(); return -1; } static int parse_opt_oem_string(const char *arg) { unsigned long val; char *next; if (opt.string) { fprintf(stderr, "Only one string can be specified\n"); return -1; } /* Return the number of OEM strings */ if (strcmp(arg, "count") == 0) goto done; val = strtoul(arg, &next, 10); if (next == arg || *next != '\0' || val == 0x00 || val > 0xff) { fprintf(stderr, "Invalid OEM string number: %s\n", arg); return -1; } opt_oem_string_keyword.offset = val; done: opt.string = &opt_oem_string_keyword; return 0; } static u32 parse_opt_handle(const char *arg) { u32 val; char *next; val = strtoul(arg, &next, 0); if (next == arg || *next != '\0' || val > 0xffff) { fprintf(stderr, "Invalid handle number: %s\n", arg); return ~0; } return val; } /* * Command line options handling */ /* Return -1 on error, 0 on success */ int parse_command_line(int argc, char * const argv[]) { int option; const char *optstring = "d:hqs:t:uH:V"; struct option longopts[] = { { "dev-mem", required_argument, NULL, 'd' }, { "help", no_argument, NULL, 'h' }, { "quiet", no_argument, NULL, 'q' }, { "no-quirks", no_argument, NULL, 'Q' }, { "string", required_argument, NULL, 's' }, { "type", required_argument, NULL, 't' }, { "dump", no_argument, NULL, 'u' }, { "dump-bin", required_argument, NULL, 'B' }, { "from-dump", required_argument, NULL, 'F' }, { "handle", required_argument, NULL, 'H' }, { "oem-string", required_argument, NULL, 'O' }, { "no-sysfs", no_argument, NULL, 'S' }, { "version", no_argument, NULL, 'V' }, { NULL, 0, NULL, 0 } }; while ((option = getopt_long(argc, argv, optstring, longopts, NULL)) != -1) switch (option) { case 'B': opt.flags |= FLAG_DUMP_BIN; opt.dumpfile = optarg; break; case 'F': opt.flags |= FLAG_FROM_DUMP; opt.dumpfile = optarg; break; case 'd': opt.devmem = optarg; break; case 'h': opt.flags |= FLAG_HELP; break; case 'q': opt.flags |= FLAG_QUIET; break; case 'Q': opt.flags |= FLAG_NO_QUIRKS; break; case 's': if (parse_opt_string(optarg) < 0) return -1; opt.flags |= FLAG_QUIET; break; case 'O': if (parse_opt_oem_string(optarg) < 0) return -1; opt.flags |= FLAG_QUIET; break; case 't': opt.type = parse_opt_type(opt.type, optarg); if (opt.type == NULL) return -1; break; case 'H': opt.handle = parse_opt_handle(optarg); if (opt.handle == ~0U) return -1; break; case 'u': opt.flags |= FLAG_DUMP; break; case 'S': opt.flags |= FLAG_NO_SYSFS; break; case 'V': opt.flags |= FLAG_VERSION; break; case '?': switch (optopt) { case 's': fprintf(stderr, "String keyword expected\n"); print_opt_string_list(); break; case 't': fprintf(stderr, "Type number or keyword expected\n"); print_opt_type_list(); break; } return -1; } /* Check for mutually exclusive output format options */ if ((opt.string != NULL) + (opt.type != NULL) + !!(opt.flags & FLAG_DUMP_BIN) + (opt.handle != ~0U) > 1) { fprintf(stderr, "Options --string, --type, --handle and --dump-bin are mutually exclusive\n"); return -1; } if ((opt.flags & FLAG_FROM_DUMP) && (opt.flags & FLAG_DUMP_BIN)) { fprintf(stderr, "Options --from-dump and --dump-bin are mutually exclusive\n"); return -1; } return 0; } void print_help(void) { static const char *help = "Usage: dmidecode [OPTIONS]\n" "Options are:\n" " -d, --dev-mem FILE Read memory from device FILE (default: " DEFAULT_MEM_DEV ")\n" " -h, --help Display this help text and exit\n" " -q, --quiet Less verbose output\n" " --no-quirks Decode everything without quirks\n" " -s, --string KEYWORD Only display the value of the given DMI string\n" " -t, --type TYPE Only display the entries of given type\n" " -H, --handle HANDLE Only display the entry of given handle\n" " -u, --dump Do not decode the entries\n" " --dump-bin FILE Dump the DMI data to a binary file\n" " --from-dump FILE Read the DMI data from a binary file\n" " --no-sysfs Do not attempt to read DMI data from sysfs files\n" " --oem-string N Only display the value of the given OEM string\n" " -V, --version Display the version and exit\n"; printf("%s", help); } CPU-X-5.0.3/src/dmidecode/dmiopt.h000066400000000000000000000030531454622605200165330ustar00rootroot00000000000000/* * Command line handling of dmidecode * This file is part of the dmidecode project. * * Copyright (C) 2005-2008 Jean Delvare * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #if !HAS_LIBPCI # include "types.h" #endif struct string_keyword { const char *keyword; u8 type; u8 offset; }; struct opt { const char *devmem; unsigned int flags; u8 *type; const struct string_keyword *string; char *dumpfile; u32 handle; }; extern struct opt opt; #define FLAG_VERSION (1 << 0) #define FLAG_HELP (1 << 1) #define FLAG_DUMP (1 << 2) #define FLAG_QUIET (1 << 3) #define FLAG_DUMP_BIN (1 << 4) #define FLAG_FROM_DUMP (1 << 5) #define FLAG_NO_SYSFS (1 << 6) #define FLAG_NO_QUIRKS (1 << 7) int parse_command_line(int argc, char * const argv[]); void print_help(void); CPU-X-5.0.3/src/dmidecode/dmioutput.c000066400000000000000000000050301454622605200172610ustar00rootroot00000000000000/* * Generic output functions * This file is part of the dmidecode project. * * Copyright (C) 2020 Jean Delvare * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public 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 "dmioutput.h" void pr_comment(const char *format, ...) { va_list args; printf("# "); va_start(args, format); vprintf(format, args); va_end(args); printf("\n"); } void pr_info(const char *format, ...) { va_list args; va_start(args, format); vprintf(format, args); va_end(args); printf("\n"); } void pr_handle(const struct dmi_header *h) { printf("Handle 0x%04X, DMI type %d, %d bytes\n", h->handle, h->type, h->length); } void pr_handle_name(const char *format, ...) { va_list args; va_start(args, format); vprintf(format, args); va_end(args); printf("\n"); } void pr_attr(const char *name, const char *format, ...) { va_list args; printf("\t%s: ", name); va_start(args, format); vprintf(format, args); va_end(args); printf("\n"); } void pr_subattr(const char *name, const char *format, ...) { va_list args; printf("\t\t%s: ", name); va_start(args, format); vprintf(format, args); va_end(args); printf("\n"); } void pr_list_start(const char *name, const char *format, ...) { va_list args; printf("\t%s:", name); /* format is optional, skip value if not provided */ if (format) { printf(" "); va_start(args, format); vprintf(format, args); va_end(args); } printf("\n"); } void pr_list_item(const char *format, ...) { va_list args; printf("\t\t"); va_start(args, format); vprintf(format, args); va_end(args); printf("\n"); } void pr_list_end(void) { /* a no-op for text output */ } void pr_sep(void) { printf("\n"); } void pr_struct_err(const char *format, ...) { va_list args; printf("\t"); va_start(args, format); vprintf(format, args); va_end(args); printf("\n"); } CPU-X-5.0.3/src/dmidecode/dmioutput.h000066400000000000000000000025521454622605200172740ustar00rootroot00000000000000/* * Generic output functions * This file is part of the dmidecode project. * * Copyright (C) 2020 Jean Delvare * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public 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 "dmidecode.h" void pr_comment(const char *format, ...); void pr_info(const char *format, ...); void pr_handle(const struct dmi_header *h); void pr_handle_name(const char *format, ...); void pr_attr(const char *name, const char *format, ...); void pr_subattr(const char *name, const char *format, ...); void pr_list_start(const char *name, const char *format, ...); void pr_list_item(const char *format, ...); void pr_list_end(void); void pr_sep(void); void pr_struct_err(const char *format, ...); CPU-X-5.0.3/src/dmidecode/libdmidecode.h000066400000000000000000000021411454622605200176400ustar00rootroot00000000000000/**************************************************************************** * Copyright © 2014-2024 The Tumultuous Unicorn Of Darkness * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * ****************************************************************************/ /* * PROJECT CPU-X * FILE dmidecode.h */ #ifndef _LIBDMIDECODE_H_ #define _LIBDMIDECODE_H_ #ifdef __cplusplus extern "C" { #endif int dmidecode(int quiet, void *cpux_pdata); #ifdef __cplusplus } /* extern "C" */ #endif #endif CPU-X-5.0.3/src/dmidecode/types.h000066400000000000000000000025631454622605200164100ustar00rootroot00000000000000#ifndef TYPES_H #define TYPES_H #include "config.h" typedef unsigned char u8; typedef unsigned short u16; typedef signed short i16; typedef unsigned int u32; /* * You may use the following defines to adjust the type definitions * depending on the architecture: * - Define BIGENDIAN on big-endian systems. * - Define ALIGNMENT_WORKAROUND if your system doesn't support * non-aligned memory access. In this case, we use a slower, but safer, * memory access method. This should be done automatically in config.h * for architectures which need it. */ #ifdef BIGENDIAN typedef struct { u32 h; u32 l; } u64; #else typedef struct { u32 l; u32 h; } u64; #endif #if defined(ALIGNMENT_WORKAROUND) || defined(BIGENDIAN) static inline u64 U64(u32 low, u32 high) { u64 self; self.l = low; self.h = high; return self; } #endif /* * Per SMBIOS v2.8.0 and later, all structures assume a little-endian * ordering convention. */ #if defined(ALIGNMENT_WORKAROUND) || defined(BIGENDIAN) #define WORD(x) (u16)((x)[0] + ((x)[1] << 8)) #define DWORD(x) (u32)((x)[0] + ((x)[1] << 8) + ((x)[2] << 16) + ((x)[3] << 24)) #define QWORD(x) (U64(DWORD(x), DWORD(x + 4))) #else /* ALIGNMENT_WORKAROUND || BIGENDIAN */ #define WORD(x) (u16)(*(const u16 *)(x)) #define DWORD(x) (u32)(*(const u32 *)(x)) #define QWORD(x) (*(const u64 *)(x)) #endif /* ALIGNMENT_WORKAROUND || BIGENDIAN */ #endif CPU-X-5.0.3/src/dmidecode/util.c000066400000000000000000000133141454622605200162100ustar00rootroot00000000000000/* * Common "util" functions * This file is part of the dmidecode project. * * Copyright (C) 2002-2018 Jean Delvare * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * For the avoidance of doubt the "preferred form" of this code is one which * is in an open unpatent encumbered format. Where cryptographic key signing * forms part of the process of creating an executable the information * including keys needed to generate an equivalently functional executable * are deemed to be part of the source code. */ #include #include #include "config.h" #ifdef USE_MMAP #include #ifndef MAP_FAILED #define MAP_FAILED ((void *) -1) #endif /* !MAP_FAILED */ #endif /* USE MMAP */ #include #include #include #include #include #include #include "types.h" #include "util.h" static int myread(int fd, u8 *buf, size_t count, const char *prefix) { ssize_t r = 1; size_t r2 = 0; while (r2 != count && r != 0) { r = read(fd, buf + r2, count - r2); if (r == -1) { if (errno != EINTR) { perror(prefix); return -1; } } else r2 += r; } if (r2 != count) { fprintf(stderr, "%s: Unexpected end of file\n", prefix); return -1; } return 0; } int checksum(const u8 *buf, size_t len) { u8 sum = 0; size_t a; for (a = 0; a < len; a++) sum += buf[a]; return (sum == 0); } /* * Reads all of file from given offset, up to max_len bytes. * A buffer of at most max_len bytes is allocated by this function, and * needs to be freed by the caller. * This provides a similar usage model to mem_chunk() * * Returns a pointer to the allocated buffer, or NULL on error, and * sets max_len to the length actually read. */ void *read_file(off_t base, size_t *max_len, const char *filename) { struct stat statbuf; int fd; u8 *p; /* * Don't print error message on missing file, as we will try to read * files that may or may not be present. */ if ((fd = open(filename, O_RDONLY)) == -1) { if (errno != ENOENT) perror(filename); return NULL; } /* * Check file size, don't allocate more than can be read. */ if (fstat(fd, &statbuf) == 0) { if (base >= statbuf.st_size) { fprintf(stderr, "%s: Can't read data beyond EOF\n", filename); p = NULL; goto out; } if (*max_len > (size_t)statbuf.st_size - base) *max_len = statbuf.st_size - base; } if ((p = malloc(*max_len)) == NULL) { perror("malloc"); goto out; } if (lseek(fd, base, SEEK_SET) == -1) { fprintf(stderr, "%s: ", filename); perror("lseek"); goto err_free; } if (myread(fd, p, *max_len, filename) == 0) goto out; err_free: free(p); p = NULL; out: if (close(fd) == -1) perror(filename); return p; } #ifdef USE_MMAP static void safe_memcpy(void *dest, const void *src, size_t n) { #ifdef USE_SLOW_MEMCPY size_t i; for (i = 0; i < n; i++) *((u8 *)dest + i) = *((const u8 *)src + i); #else memcpy(dest, src, n); #endif /* USE_SLOW_MEMCPY */ } #endif /* USE_MMAP */ /* * Copy a physical memory chunk into a memory buffer. * This function allocates memory. */ void *mem_chunk(off_t base, size_t len, const char *devmem) { struct stat statbuf; void *p = NULL; int fd; #ifdef USE_MMAP off_t mmoffset; void *mmp; #endif /* * Safety check: if running as root, devmem is expected to be a * character device file. */ if ((fd = open(devmem, O_RDONLY)) == -1 || fstat(fd, &statbuf) == -1 || (geteuid() == 0 && !S_ISCHR(statbuf.st_mode))) { fprintf(stderr, "Can't read memory from %s\n", devmem); if (fd == -1) return NULL; goto out; } if ((p = malloc(len)) == NULL) { perror("malloc"); goto out; } #ifdef USE_MMAP /* * mmap() will fail with SIGBUS if trying to map beyond the end of * the file. */ if (S_ISREG(statbuf.st_mode) && base + (off_t)len > statbuf.st_size) { fprintf(stderr, "mmap: Can't map beyond end of file %s\n", devmem); goto err_free; } #ifdef _SC_PAGESIZE mmoffset = base % sysconf(_SC_PAGESIZE); #else mmoffset = base % getpagesize(); #endif /* _SC_PAGESIZE */ /* * Please note that we don't use mmap() for performance reasons here, * but to workaround problems many people encountered when trying * to read from /dev/mem using regular read() calls. */ mmp = mmap(NULL, mmoffset + len, PROT_READ, MAP_SHARED, fd, base - mmoffset); if (mmp == MAP_FAILED) goto try_read; safe_memcpy(p, (u8 *)mmp + mmoffset, len); if (munmap(mmp, mmoffset + len) == -1) { fprintf(stderr, "%s: ", devmem); perror("munmap"); } goto out; try_read: #endif /* USE_MMAP */ if (lseek(fd, base, SEEK_SET) == -1) { fprintf(stderr, "%s: ", devmem); perror("lseek"); goto err_free; } if (myread(fd, p, len, devmem) == 0) goto out; err_free: free(p); p = NULL; out: if (close(fd) == -1) perror(devmem); return p; } /* Returns end - start + 1, assuming start < end */ u64 u64_range(u64 start, u64 end) { u64 res; res.h = end.h - start.h; res.l = end.l - start.l; if (end.l < start.l) res.h--; if (++res.l == 0) res.h++; return res; } CPU-X-5.0.3/src/dmidecode/util.h000066400000000000000000000021771454622605200162220ustar00rootroot00000000000000/* * This file is part of the dmidecode project. * * Copyright (C) 2003-2017 Jean Delvare * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public 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 "types.h" #define ARRAY_SIZE(x) (sizeof(x)/sizeof((x)[0])) int checksum(const u8 *buf, size_t len); void *read_file(off_t base, size_t *len, const char *filename); void *mem_chunk(off_t base, size_t len, const char *devmem); u64 u64_range(u64 start, u64 end); CPU-X-5.0.3/src/gui_gtk.cpp000066400000000000000000001366531454622605200153230ustar00rootroot00000000000000/**************************************************************************** * Copyright © 2014-2024 The Tumultuous Unicorn Of Darkness * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * ****************************************************************************/ /* * PROJECT CPU-X * FILE gui_gtk.cpp */ #include #include #include #include #include #include #include #include "options.hpp" #include "util.hpp" #include "data.hpp" #include "core.hpp" #include "daemon.h" #include "daemon_client.hpp" #include "gui_gtk.hpp" using CacheLevels = Data::Caches::CpuType::CacheLevels; /************************* Private functions *************************/ Glib::RefPtr app; static Glib::RefPtr settings; /* Search file location in standard paths */ static const std::string get_data_path(const std::string &file) { for(const auto& dir : Glib::get_system_data_dirs()) { const std::string full_path = dir + "/" + PRGNAME_LOW + "/" + file; if(Glib::file_test(full_path, Glib::FILE_TEST_EXISTS)) { MSG_DEBUG("get_data_path: file=%s ==> %s found", file.c_str(), full_path.c_str()); return full_path; } else MSG_DEBUG("get_data_path: file=%s ==> %s does not exist", file.c_str(), full_path.c_str()); } MSG_ERROR(_("Cannot find path for '%s' file"), file.c_str()); return std::string(); } static void set_tab_name(const Tab &tab) { EXT_TAB(tab)->name->set_text(tab.name); } static void set_frame_name(const Frame &frame) { EXT_FRAME(frame)->name->set_text(frame.name); } static void set_label_name_and_value(const Label &label, const std::optional &tooltip = std::nullopt) { EXT_LABEL(label)->name->set_text(label.name); EXT_LABEL(label)->name->set_tooltip_text(tooltip ? _(tooltip.value().c_str()) : label.name); EXT_LABEL(label)->value->set_text(label.value); EXT_LABEL(label)->value->set_tooltip_text(label.value); } /* Object-derived classes */ ExtTab::ExtTab(Glib::RefPtr builder, const std::string name) { builder->get_widget(name, this->name); this->name->set_name("tab"); } ExtFrame::ExtFrame(Glib::RefPtr builder, const std::string name) { builder->get_widget(name, this->name); this->name->set_name(name); } template ExtLabel::ExtLabel(Glib::RefPtr builder, const std::string name) { const auto index = name.find("_") + 1; const std::string prefix = name.substr(0, index); const std::string suffix = name.substr(index); builder->get_widget(prefix + "lab" + suffix, this->name); builder->get_widget(prefix + "val" + suffix, this->value); this->value->set_name("value"); } /* GtkData class */ GtkData::GtkData(Glib::RefPtr builder, Data &data) : data(data) { this->get_widgets(builder); this->check_theme_color(); this->set_colors(); this->set_logos(); this->set_all_labels(); this->set_signals(); this->bind_settings(); } void GtkData::get_widgets(Glib::RefPtr builder) { /* Common */ builder->get_widget("mainwindow", this->mainwindow); builder->get_widget("daemonbutton", this->daemonbutton); builder->get_widget("labprgver", this->labprgver); builder->get_widget("header_notebook", this->notebook); /* Settings */ builder->get_widget("settingswindow", this->settingswindow); builder->get_widget("settingsbutton", this->settingsbutton); builder->get_widget("validatebutton", this->validatebutton); builder->get_widget("cancelbutton", this->cancelbutton); builder->get_widget("temperatureunit_val", this->temperatureunit); builder->get_widget("refreshtime_val", this->refreshtime); builder->get_widget("theme_val", this->theme); builder->get_widget("defaulttab_val", this->defaulttab); builder->get_widget("defaulttype_val", this->defaulttype); builder->get_widget("defaultcore_val", this->defaultcore); builder->get_widget("defaultcachetest_val", this->defaultcachetest); builder->get_widget("defaultstick_val", this->defaultstick); builder->get_widget("defaultcard_val", this->defaultcard); builder->get_widget("cpuiddecimal", this->cpuiddecimal); builder->get_widget("startdaemon", this->startdaemon); /* Tab: CPU */ this->data.cpu.extend(new GtkData::ExtTabCpu(builder)); for(auto& cpu_type : this->data.cpu.cpu_types) { /* Processor frame */ cpu_type.processor.extend(new ExtFrame(builder, "proc_lab")); cpu_type.processor.vendor. extend(new ExtLabel(builder, "proc_vendor")); cpu_type.processor.codename. extend(new ExtLabel(builder, "proc_cdename")); cpu_type.processor.package. extend(new ExtLabel(builder, "proc_pkg")); cpu_type.processor.technology. extend(new ExtLabel(builder, "proc_tech")); cpu_type.processor.voltage. extend(new ExtLabel(builder, "proc_volt")); cpu_type.processor.specification.extend(new ExtLabel(builder, "proc_spec")); cpu_type.processor.family. extend(new ExtLabel(builder, "proc_fam")); cpu_type.processor.dispfamily. extend(new ExtLabel(builder, "proc_extfam")); cpu_type.processor.model. extend(new ExtLabel(builder, "proc_mod")); cpu_type.processor.dispmodel. extend(new ExtLabel(builder, "proc_extmod")); cpu_type.processor.temperature. extend(new ExtLabel(builder, "proc_temp")); cpu_type.processor.stepping. extend(new ExtLabel(builder, "proc_step")); cpu_type.processor.instructions. extend(new ExtLabel(builder, "proc_instr")); /* Caches frame */ cpu_type.caches.extend(new ExtFrame(builder, "cache_lab")); cpu_type.caches.level1d.extend(new ExtLabel(builder, "cache_l1d")); cpu_type.caches.level1i.extend(new ExtLabel(builder, "cache_l1i")); cpu_type.caches.level2. extend(new ExtLabel(builder, "cache_l2")); cpu_type.caches.level3. extend(new ExtLabel(builder, "cache_l3")); /* Footer frame */ cpu_type.footer.cores. extend(new ExtLabel(builder, "cpufooter_core")); cpu_type.footer.threads.extend(new ExtLabel(builder, "cpufooter_thrd")); } /* Clocks frame */ this->data.cpu.clocks.extend(new ExtFrame(builder, "clock_lab")); this->data.cpu.clocks.core_speed.extend(new ExtLabel(builder, "clock_core")); this->data.cpu.clocks.multiplier.extend(new ExtLabel(builder, "clock_mult")); this->data.cpu.clocks.bus_speed. extend(new ExtLabel(builder, "clock_bus")); this->data.cpu.clocks.usage. extend(new ExtLabel(builder, "clock_usage")); /* Tab: Caches */ this->data.caches.extend(new GtkData::ExtTabCaches(builder)); for(auto& cpu_type : this->data.caches.cpu_types) { /* Cache frame */ for(unsigned index = 0; index < cpu_type.caches.size(); index++) { const std::string level_string = "l" + std::to_string(index + 1); cpu_type.caches[index].extend(new ExtFrame(builder, level_string + "cache_lab")); cpu_type.caches[index].size. extend(new ExtLabel(builder, level_string + "cache_size")); cpu_type.caches[index].speed.extend(new ExtLabel(builder, level_string + "cache_speed")); } } /* Test frame */ this->data.caches.test.extend(new ExtFrame(builder, "test_lab")); /* Tab: Motherboard */ this->data.motherboard.extend(new GtkData::ExtTabMotherboard(builder)); /* Motherboard frame */ this->data.motherboard.board.extend(new ExtFrame(builder, "motherboard_lab")); this->data.motherboard.board.manufacturer.extend(new ExtLabel(builder, "motherboard_manu")); this->data.motherboard.board.model. extend(new ExtLabel(builder, "motherboard_mod")); this->data.motherboard.board.revision. extend(new ExtLabel(builder, "motherboard_rev")); /* BIOS frame */ this->data.motherboard.bios.extend(new ExtFrame(builder, "bios_lab")); this->data.motherboard.bios.brand. extend(new ExtLabel(builder, "bios_brand")); this->data.motherboard.bios.version.extend(new ExtLabel(builder, "bios_vers")); this->data.motherboard.bios.date. extend(new ExtLabel(builder, "bios_date")); this->data.motherboard.bios.romsize.extend(new ExtLabel(builder, "bios_rom")); /* Chipset frame */ this->data.motherboard.chipset.extend(new ExtFrame(builder, "chip_lab")); this->data.motherboard.chipset.vendor.extend(new ExtLabel(builder, "chip_vend")); this->data.motherboard.chipset.model. extend(new ExtLabel(builder, "chip_name")); /* Tab: Memory */ this->data.memory.extend(new GtkData::ExtTabMemory(builder)); /* Stick frame */ for(auto& stick : this->data.memory.sticks) { stick.extend(new ExtFrame(builder, "stick_lab")); stick.manufacturer. extend(new ExtLabel(builder, "stick_manufacturer")); stick.part_number. extend(new ExtLabel(builder, "stick_partnumber")); stick.type. extend(new ExtLabel(builder, "stick_type")); stick.type_detail. extend(new ExtLabel(builder, "stick_typedetail")); stick.device_locator.extend(new ExtLabel(builder, "stick_devicelocator")); stick.bank_locator. extend(new ExtLabel(builder, "stick_banklocator")); stick.size. extend(new ExtLabel(builder, "stick_size")); stick.rank. extend(new ExtLabel(builder, "stick_rank")); stick.speed. extend(new ExtLabel(builder, "stick_speed")); stick.voltage. extend(new ExtLabel(builder, "stick_voltage")); } /* Sticks frame */ this->data.memory.footer.extend(new ExtFrame(builder, "sticks_lab")); /* Tab: System */ this->data.system.extend(new GtkData::ExtTabSystem(builder)); /* Operating System frame */ this->data.system.os.extend(new ExtFrame(builder, "os_lab")); this->data.system.os.name. extend(new ExtLabel(builder, "os_name")); this->data.system.os.kernel. extend(new ExtLabel(builder, "os_kernel")); this->data.system.os.hostname.extend(new ExtLabel(builder, "os_hostname")); this->data.system.os.uptime. extend(new ExtLabel(builder, "os_uptime")); /* Memory frame */ this->data.system.memory.extend(new ExtFrame(builder, "mem_lab")); this->data.system.memory.used. extend(new ExtLabel(builder, "mem_used")); this->data.system.memory.buffers.extend(new ExtLabel(builder, "mem_buff")); this->data.system.memory.cached. extend(new ExtLabel(builder, "mem_cache")); this->data.system.memory.free. extend(new ExtLabel(builder, "mem_free")); this->data.system.memory.swap. extend(new ExtLabel(builder, "mem_swap")); /* Tab: Graphics */ this->data.graphics.extend(new GtkData::ExtTabGraphics(builder)); /* Card frame */ for(auto& card : this->data.graphics.cards) { card.extend(new ExtFrame(builder, "card_lab")); card.vendor. extend(new ExtLabel(builder, "card_vend")); card.kernel_driver. extend(new ExtLabel(builder, "card_driver")); card.user_mode_driver.extend(new ExtLabel(builder, "card_umd")); card.model. extend(new ExtLabel(builder, "card_mod")); card.comp_unit. extend(new ExtLabel(builder, "card_comp_unit")); card.device_id. extend(new ExtLabel(builder, "card_did_rid")); card.vbios_version. extend(new ExtLabel(builder, "card_vbios_ver")); card.interface. extend(new ExtLabel(builder, "card_pcie")); card.temperature. extend(new ExtLabel(builder, "card_temp")); card.usage. extend(new ExtLabel(builder, "card_usage")); card.core_voltage. extend(new ExtLabel(builder, "card_gvolt")); card.power_avg. extend(new ExtLabel(builder, "card_gpwr")); card.core_clock. extend(new ExtLabel(builder, "card_gclk")); card.mem_clock. extend(new ExtLabel(builder, "card_mclk")); card.mem_used. extend(new ExtLabel(builder, "card_vram_used")); card.resizable_bar. extend(new ExtLabel(builder, "card_rebar")); card.vulkan_rt. extend(new ExtLabel(builder, "card_vkrt")); card.opengl_version. extend(new ExtLabel(builder, "card_gl_ver")); card.vulkan_version. extend(new ExtLabel(builder, "card_vk_ver")); card.opencl_version. extend(new ExtLabel(builder, "card_cl_ver")); } /* Cards frame */ this->data.graphics.footer.extend(new ExtFrame(builder, "cards_lab")); /* Tab: Bench */ this->data.bench.extend(new GtkData::ExtTabBench(builder)); /* Prime Slow frame */ this->data.bench.prime_slow.extend(new ExtFrame(builder, "primeslow_lab")); this->data.bench.prime_slow.score.extend(new ExtLabel(builder, "primeslow_score")); this->data.bench.prime_slow.state.extend(new ExtLabel(builder, "primeslow_run")); /* Prime Fast frame */ this->data.bench.prime_fast.extend(new ExtFrame(builder, "primefast_lab")); this->data.bench.prime_fast.score.extend(new ExtLabel(builder, "primefast_score")); this->data.bench.prime_fast.state.extend(new ExtLabel(builder, "primefast_run")); /* Parameters frame */ this->data.bench.parameters.extend(new ExtFrame(builder, "param_lab")); this->data.bench.parameters.duration.extend(new ExtLabel(builder, "param_duration")); this->data.bench.parameters.threads. extend(new ExtLabel(builder, "param_threads")); /* Tab: About */ this->data.about.extend(new GtkData::ExtTabAbout(builder)); /* About frame */ this->data.about.about.extend(new ExtFrame(builder, "about_lab")); /* License frame */ this->data.about.license.extend(new ExtFrame(builder, "license_lab")); } void GtkData::check_theme_color() { const GtkTheme current_theme = static_cast(settings->get_enum("gui-theme")); if(current_theme == AUTO) { const auto stylecontext = this->mainwindow->get_style_context(); const auto fg = stylecontext->get_color(Gtk::STATE_FLAG_NORMAL); const auto bg = stylecontext->get_background_color(Gtk::STATE_FLAG_NORMAL); const double contrast = bg.get_red() - fg.get_red() + bg.get_green() - fg.get_green() + bg.get_blue() - fg.get_blue(); this->is_dark_theme = (contrast < -1); } else this->is_dark_theme = (current_theme == DARK); } void GtkData::set_colors() { auto provider = Gtk::CssProvider::create(); #if GTK_CHECK_VERSION(3, 20, 0) // GTK 3.20+ provider->load_from_path(get_data_path(this->is_dark_theme ? "cpu-x-gtk-3.20-dark.css" : "cpu-x-gtk-3.20.css")); #else // GTK 3.12 to 3.18 provider->load_from_path(get_data_path(this->is_dark_theme ? "cpu-x-gtk-3.12-dark.css" : "cpu-x-gtk-3.12.css")); #endif Gtk::StyleContext::add_provider_for_screen(Gdk::Screen::get_default(), provider, GTK_STYLE_PROVIDER_PRIORITY_APPLICATION); } void GtkData::set_logos() { bool set_unknown = false; const auto& cpu_type = this->data.cpu.get_selected_cpu_type(); const int prg_size = 72; const int width = EXT_LABEL(cpu_type.processor.specification)->value->get_allocated_width() - EXT_LABEL(cpu_type.processor.vendor)->value->get_allocated_width() - 6; const int height = (EXT_LABEL(cpu_type.processor.vendor)->value->get_allocated_height() + 4) * 4; /* CPU logo */ try { if(cpu_type.processor.vendor.value.size() > 0) { auto cpu_pixbuf = Gdk::Pixbuf::create_from_file(get_data_path(cpu_type.processor.vendor.value + ".png"), width, height, true); EXT_TAB_CPU(this->data.cpu)->logocpu->set(cpu_pixbuf); } else set_unknown = true; } catch(...) { set_unknown = true; } try { if(set_unknown) { auto unknown_pixbuf = Gdk::Pixbuf::create_from_file(get_data_path("Unknown.png"), width, height, true); EXT_TAB_CPU(this->data.cpu)->logocpu->set(unknown_pixbuf); } } catch(...) { MSG_ERRNO("%s", "failed to set CPU icon"); } /* Program logo */ try { auto prg_pixbuf = Gdk::Pixbuf::create_from_file(get_data_path(std::string(PRGNAME) + ".png"), prg_size, prg_size, true); this->mainwindow->set_icon(prg_pixbuf); EXT_TAB_ABOUT(this->data.about)->logoprg->set(prg_pixbuf); } catch(...) { MSG_ERRNO("%s", "failed to set program icon"); } } void GtkData::set_all_labels() { Gtk::Requisition minimum_size, natural_size; const auto margin = 6; const auto width_full = EXT_LABEL(this->data.system.os.hostname)->value->get_allocated_width(); const auto width_half = width_full - EXT_LABEL(this->data.system.memory.used)->value->get_allocated_width() - margin; const int pkcheck = run_command("pkcheck --action-id org.freedesktop.policykit.exec --process %u > /dev/null 2>&1", getpid()); // getpid() returns 2 on Flatpak /* Common */ notebook->set_current_page(Options::get_selected_page()); this->labprgver->set_text(this->data.about.about.version); this->daemonbutton->set_label(_("Start daemon")); this->daemonbutton->set_sensitive(false); if(DAEMON_UP) this->daemonbutton->set_tooltip_text(_("Connected to daemon")); #ifndef FLATPAK else if(WEXITSTATUS(pkcheck) > 2) this->daemonbutton->set_tooltip_text(_("No polkit authentication agent found")); #endif /* !FLATPAK */ else { this->daemonbutton->set_sensitive(true); this->daemonbutton->set_tooltip_text(_("Ask password to start daemon in background")); } /* Settings */ this->settingswindow->set_title(_("Settings")); this->refreshtime->set_range(1, G_MAXUSHORT); this->refreshtime->set_increments(1, 60); this->defaulttab->insert(0, "cpu", this->data.cpu.name); this->defaulttab->insert(1, "caches", this->data.caches.name); this->defaulttab->insert(2, "motherboad", this->data.motherboard.name); this->defaulttab->insert(3, "memory", this->data.memory.name); this->defaulttab->insert(4, "system", this->data.system.name); this->defaulttab->insert(5, "graphics", this->data.graphics.name); this->defaulttab->insert(6, "bench", this->data.bench.name); this->defaulttab->insert(7, "about", this->data.about.name); this->defaulttab->set_active(Options::get_selected_page()); this->fill_box_active_type(this->defaulttype); this->fill_box_active_core(this->defaultcore); this->fill_box_active_test(this->defaultcachetest); this->fill_box_active_stick(this->defaultstick); this->fill_box_active_card(this->defaultcard); /* Tab: system */ EXT_LABEL(this->data.system.memory.used)->value->get_preferred_size(minimum_size, natural_size); EXT_TAB_SYSTEM(this->data.system)->barused-> set_size_request(width_half, natural_size.height); EXT_TAB_SYSTEM(this->data.system)->barbuff-> set_size_request(width_half, natural_size.height); EXT_TAB_SYSTEM(this->data.system)->barcache->set_size_request(width_half, natural_size.height); EXT_TAB_SYSTEM(this->data.system)->barfree-> set_size_request(width_half, natural_size.height); EXT_TAB_SYSTEM(this->data.system)->barswap-> set_size_request(width_half, natural_size.height); EXT_TAB_SYSTEM(this->data.system)->barused-> signal_draw().connect(sigc::mem_fun(*this, &GtkData::draw_bar_memory_used)); EXT_TAB_SYSTEM(this->data.system)->barbuff-> signal_draw().connect(sigc::mem_fun(*this, &GtkData::draw_bar_memory_buffers)); EXT_TAB_SYSTEM(this->data.system)->barcache->signal_draw().connect(sigc::mem_fun(*this, &GtkData::draw_bar_memory_cached)); EXT_TAB_SYSTEM(this->data.system)->barfree-> signal_draw().connect(sigc::mem_fun(*this, &GtkData::draw_bar_memory_free)); EXT_TAB_SYSTEM(this->data.system)->barswap-> signal_draw().connect(sigc::mem_fun(*this, &GtkData::draw_bar_memory_swap)); /* Tab: Bench */ EXT_LABEL_PROGRESS_BAR(this->data.bench.prime_slow.score)->value->set_size_request(width_full, natural_size.height); EXT_LABEL_PROGRESS_BAR(this->data.bench.prime_fast.score)->value->set_size_request(width_full, natural_size.height); EXT_LABEL_SPIN_BUTTON(this->data.bench.parameters.duration)->value->set_increments(1, 60); EXT_LABEL_SPIN_BUTTON(this->data.bench.parameters.duration)->value->set_range(1, 60 * 24); EXT_LABEL_SPIN_BUTTON(this->data.bench.parameters.threads)->value->set_increments(1, 1); EXT_LABEL_SPIN_BUTTON(this->data.bench.parameters.threads)->value->set_range(1, std::thread::hardware_concurrency()); /* All tabs */ this->gtab_cpu(); this->fill_box_active_type(); this->fill_box_active_core(); this->gtab_caches(); this->fill_box_active_test(); this->gtab_motherboard(); this->gtab_memory(); this->fill_box_active_stick(); this->gtab_system(); this->gtab_graphics(); this->fill_box_active_card(); this->gtab_bench(); this->gtab_about(); } void GtkData::set_signals() { /* Main window */ /* Update Options::selected_page when user navigate to a different tab (required by do_refresh()) */ this->notebook->signal_switch_page().connect([]([[maybe_unused]] Gtk::Widget *page, guint page_number) { Options::set_selected_page(static_cast(page_number)); }); /* Show settings window */ this->settingsbutton->signal_clicked().connect([this] { this->settingswindow->show(); }); /* Start daemon and reload CPU-X */ this->daemonbutton->signal_clicked().connect([this] { this->daemonbutton->set_sensitive(false); const char *msg = start_daemon(true); if(msg == NULL) { this->data.reload = true; app->quit(); } else { Gtk::MessageDialog dialog(*this->mainwindow, _(msg), false, Gtk::MessageType::MESSAGE_WARNING, Gtk::ButtonsType::BUTTONS_CLOSE); dialog.run(); this->daemonbutton->set_sensitive(true); } }); EXT_TAB_CPU(this->data.cpu)->activetype->signal_changed().connect(sigc::mem_fun(*this, &GtkData::change_active_type)); EXT_TAB_CPU(this->data.cpu)->activecore->signal_changed().connect(sigc::mem_fun(*this, &GtkData::change_active_core)); EXT_TAB_CACHES(this->data.caches)->activetest->signal_changed().connect(sigc::mem_fun(*this, &GtkData::change_active_test)); EXT_TAB_MEMORY(this->data.memory)->activestick->signal_changed().connect(sigc::mem_fun(*this, &GtkData::change_active_stick)); EXT_TAB_GRAPHICS(this->data.graphics)->activecard->signal_changed().connect(sigc::mem_fun(*this, &GtkData::change_active_card)); EXT_LABEL_SWITCH(this->data.bench.prime_slow.state)->value->signal_state_set().connect(sigc::mem_fun(*this, &GtkData::start_bench_prime_slow), false); EXT_LABEL_SWITCH(this->data.bench.prime_fast.state)->value->signal_state_set().connect(sigc::mem_fun(*this, &GtkData::start_bench_prime_fast), false); EXT_LABEL_SPIN_BUTTON(this->data.bench.parameters.duration)->value->signal_value_changed().connect(sigc::mem_fun(*this, &GtkData::change_bench_duration)); EXT_LABEL_SPIN_BUTTON(this->data.bench.parameters.threads)->value->signal_value_changed().connect(sigc::mem_fun(*this, &GtkData::change_bench_threads)); this->refresh_handle = Glib::signal_timeout().connect_seconds(sigc::mem_fun(*this, &GtkData::grefresh), Options::get_refr_time()); /* Settings window */ /* Hide settings window and revert changes */ this->settingswindow->signal_delete_event().connect([this]([[maybe_unused]] GdkEventAny *any_event) { settings->revert(); this->settingswindow->hide(); return true; }); /* Event in settings window when CPU type is changed */ this->defaulttype->signal_changed().connect([this] { this->fill_box_active_core(this->defaultcore); }); /* Hide settings window and apply changes */ this->validatebutton->signal_clicked().connect([this] { /* Apply new temperature unit */ Options::set_temp_unit(static_cast(settings->get_enum("temperature-unit"))); /* Apply new refresh time */ Options::set_refr_time(settings->get_uint("refresh-time")); this->refresh_handle.disconnect(); this->refresh_handle = Glib::signal_timeout().connect_seconds(sigc::mem_fun(*this, &GtkData::grefresh), Options::get_refr_time()); /* Apply new color theme */ this->check_theme_color(); this->set_colors(); /* Save settings and close window */ settings->apply(); this->settingswindow->hide(); }); /* Hide settings window and revert changes */ this->cancelbutton->signal_clicked().connect([this] { settings->revert(); this->settingswindow->hide(); }); } void GtkData::bind_settings() { settings->bind("temperature-unit", this->temperatureunit, "active-id"); settings->bind("refresh-time", this->refreshtime, "value" ); settings->bind("gui-theme", this->theme, "active-id"); settings->bind("default-tab", this->defaulttab, "active-id"); settings->bind("default-core-type", this->defaulttype, "active" ); settings->bind("default-cpu-core", this->defaultcore, "active" ); settings->bind("default-cache-test", this->defaultcachetest, "active" ); settings->bind("default-memory-stick", this->defaultstick, "active" ); settings->bind("default-active-card", this->defaultcard, "active" ); settings->bind("print-cpuid-decimal", this->cpuiddecimal, "active" ); settings->bind("always-start-daemon", this->startdaemon, "active" ); } bool GtkData::grefresh() { const auto page = Options::get_selected_page(); switch(page) { case TAB_CPU: do_refresh(this->data, page); this->gtab_cpu(); break; case TAB_CACHES: do_refresh(this->data, page); this->gtab_caches(); break; case TAB_SYSTEM: do_refresh(this->data, page); this->gtab_system(); break; case TAB_GRAPHICS: do_refresh(this->data, page); this->gtab_graphics(); break; case TAB_BENCH: do_refresh(this->data, page); this->change_bench_sensitive(data.bench.is_running); this->gtab_bench(); break; default: break; } return true; } /* CPU tab related methods */ GtkData::ExtTabCpu::ExtTabCpu(Glib::RefPtr builder) : ExtTab(builder, "cpulabel") { builder->get_widget("proc_logocpu", this->logocpu); builder->get_widget("cpufooter_activetype", this->activetype); builder->get_widget("cpufooter_activecore", this->activecore); } void GtkData::gtab_cpu() { auto& cpu_type = data.cpu.get_selected_cpu_type(); set_tab_name(this->data.cpu); /* Processor frame */ set_frame_name(cpu_type.processor); set_label_name_and_value(cpu_type.processor.vendor); set_label_name_and_value(cpu_type.processor.codename); set_label_name_and_value(cpu_type.processor.package); set_label_name_and_value(cpu_type.processor.technology); set_label_name_and_value(cpu_type.processor.voltage); set_label_name_and_value(cpu_type.processor.specification); set_label_name_and_value(cpu_type.processor.family, _("BaseFamily")); set_label_name_and_value(cpu_type.processor.dispfamily, _("CPU display (\"true\") family (computed as BaseFamily+ExtendedFamily)")); set_label_name_and_value(cpu_type.processor.model, _("BaseModel")); set_label_name_and_value(cpu_type.processor.dispmodel, _("CPU display (\"true\") model (computed as (ExtendedModel<<4)+BaseModel)")); set_label_name_and_value(cpu_type.processor.temperature); set_label_name_and_value(cpu_type.processor.stepping); set_label_name_and_value(cpu_type.processor.instructions); /* Clocks frame */ set_frame_name(data.cpu.clocks); set_label_name_and_value(data.cpu.clocks.core_speed); set_label_name_and_value(data.cpu.clocks.multiplier); set_label_name_and_value(data.cpu.clocks.bus_speed); set_label_name_and_value(data.cpu.clocks.usage); /* Caches frame */ set_frame_name(cpu_type.caches); set_label_name_and_value(cpu_type.caches.level1d); set_label_name_and_value(cpu_type.caches.level1i); set_label_name_and_value(cpu_type.caches.level2); set_label_name_and_value(cpu_type.caches.level3); /* Footer frame */ set_label_name_and_value(cpu_type.footer.cores); set_label_name_and_value(cpu_type.footer.threads); } void GtkData::fill_box_active_type() { fill_box_active_type(EXT_TAB_CPU(this->data.cpu)->activetype); } void GtkData::fill_box_active_type(Gtk::ComboBoxText *comboboxtext) { if(this->data.cpu.cpu_types.size() > 0) { comboboxtext->remove_all(); for(auto& type : this->data.cpu.cpu_types) comboboxtext->append(type.name); comboboxtext->set_active(Options::get_selected_type()); } else comboboxtext->set_sensitive(false); } void GtkData::fill_box_active_core() { fill_box_active_core(EXT_TAB_CPU(this->data.cpu)->activecore); } void GtkData::fill_box_active_core(Gtk::ComboBoxText *comboboxtext) { auto& cpu_type = this->data.cpu.get_selected_cpu_type(); if(cpu_type.footer.num_threads > 0) { comboboxtext->remove_all(); for(auto i = 0; i < cpu_type.footer.num_threads; i++) comboboxtext->append(cpu_type.get_core_formatted(i)); comboboxtext->set_active(Options::get_selected_core()); } else comboboxtext->set_sensitive(false); } void GtkData::change_active_type() { const int type = EXT_TAB_CPU(this->data.cpu)->activetype->get_active_row_number(); if(type < 0) return; Options::set_selected_type(type, data.cpu.cpu_types.size()); this->fill_box_active_core(); this->grefresh(); } void GtkData::change_active_core() { const int core = EXT_TAB_CPU(this->data.cpu)->activecore->get_active_row_number(); if(core < 0) return; Options::set_selected_core(core, data.cpu.get_selected_cpu_type().footer.num_threads); } /* Caches tab related methods */ GtkData::ExtTabCaches::ExtTabCaches(Glib::RefPtr builder) : ExtTab(builder, "cacheslabel") { builder->get_widget("caches_grid", this->gridcaches); builder->get_widget("test_activetest", this->activetest); } void GtkData::gtab_caches() { auto& cpu_type = data.caches.get_selected_cpu_type(); static bool is_init = false; /* Hide tab if there is no cache */ if(cpu_type.caches.size() == 0) { EXT_TAB_CACHES(this->data.caches)->gridcaches->hide(); return; } set_tab_name(this->data.caches); /* Cache frame */ for(auto& cache : cpu_type.caches) { set_frame_name(cache); set_label_name_and_value(cache.size); set_label_name_and_value(cache.speed); } if(!is_init) { is_init = true; /* Remove empty frames */ for(int i = CacheLevels::L4; i >= int(cpu_type.caches.size()); i--) EXT_TAB_CACHES(this->data.caches)->gridcaches->remove_row(i); /* Test frame */ set_frame_name(data.caches.test); } } void GtkData::fill_box_active_test() { fill_box_active_test(EXT_TAB_CACHES(this->data.caches)->activetest); } void GtkData::fill_box_active_test(Gtk::ComboBoxText *comboboxtext) { if(this->data.caches.test.names.size() > 0) { comboboxtext->remove_all(); for(const auto& test_name : this->data.caches.test.names) comboboxtext->append(test_name); comboboxtext->set_active(Options::get_selected_test()); } else comboboxtext->set_sensitive(false); } void GtkData::change_active_test() { const int test = EXT_TAB_CACHES(this->data.caches)->activetest->get_active_row_number(); if(test < 0) return; Options::set_selected_test(test); } /* Motherboard tab related methods */ GtkData::ExtTabMotherboard::ExtTabMotherboard(Glib::RefPtr builder) : ExtTab(builder, "motherboardlabel") { } void GtkData::gtab_motherboard() { set_tab_name(this->data.motherboard); /* Motherboard frame */ set_frame_name(this->data.motherboard.board); set_label_name_and_value(this->data.motherboard.board.manufacturer); set_label_name_and_value(this->data.motherboard.board.model); set_label_name_and_value(this->data.motherboard.board.revision); /* BIOS frame */ set_frame_name(this->data.motherboard.bios); set_label_name_and_value(this->data.motherboard.bios.brand); set_label_name_and_value(this->data.motherboard.bios.version); set_label_name_and_value(this->data.motherboard.bios.date); set_label_name_and_value(this->data.motherboard.bios.romsize); /* Chipset frame */ set_frame_name(this->data.motherboard.chipset); set_label_name_and_value(this->data.motherboard.chipset.vendor); set_label_name_and_value(this->data.motherboard.chipset.model); } /* Memory tab related methods */ GtkData::ExtTabMemory::ExtTabMemory(Glib::RefPtr builder) : ExtTab(builder, "memorylabel") { builder->get_widget("memory_scrolledwindow", this->scrolledsticks); builder->get_widget("sticks_activestick", this->activestick); } void GtkData::gtab_memory() { /* Hide tab if there is no sticks */ if(this->data.memory.sticks.size() == 0) { EXT_TAB_MEMORY(this->data.memory)->scrolledsticks->hide(); return; } set_tab_name(this->data.memory); /* Stick frame */ const auto& stick = data.memory.get_selected_stick(); set_frame_name(stick); set_label_name_and_value(stick.manufacturer); set_label_name_and_value(stick.part_number); set_label_name_and_value(stick.type); set_label_name_and_value(stick.type_detail); set_label_name_and_value(stick.device_locator, _("Identify the physically-labeled socket or board position where the memory device is located")); set_label_name_and_value(stick.bank_locator, _("Identify the physically labeled bank where the memory device is located")); set_label_name_and_value(stick.size); set_label_name_and_value(stick.rank); set_label_name_and_value(stick.speed); set_label_name_and_value(stick.voltage); /* Sticks frame */ set_frame_name(this->data.memory.footer); } void GtkData::fill_box_active_stick() { fill_box_active_stick(EXT_TAB_MEMORY(this->data.memory)->activestick); } void GtkData::fill_box_active_stick(Gtk::ComboBoxText *comboboxtext) { if(this->data.memory.sticks.size() > 0) { comboboxtext->remove_all(); for(unsigned i = 0; i < this->data.memory.sticks.size(); i++) comboboxtext->append(this->data.memory.get_stick_formatted(i)); comboboxtext->set_active(Options::get_selected_stick()); } else comboboxtext->set_sensitive(false); } void GtkData::change_active_stick() { const int stick = EXT_TAB_MEMORY(this->data.memory)->activestick->get_active_row_number(); if(stick < 0) return; Options::set_selected_stick(stick, this->data.memory.sticks.size()); this->gtab_memory(); } /* System tab related methods */ GtkData::ExtTabSystem::ExtTabSystem(Glib::RefPtr builder) : ExtTab(builder, "systemlabel") { builder->get_widget("mem_barused", this->barused); builder->get_widget("mem_barbuff", this->barbuff); builder->get_widget("mem_barcache", this->barcache); builder->get_widget("mem_barfree", this->barfree); builder->get_widget("mem_barswap", this->barswap); } void GtkData::gtab_system() { set_tab_name(this->data.system); /* Operating System frame */ set_frame_name(this->data.system.os); set_label_name_and_value(this->data.system.os.name); set_label_name_and_value(this->data.system.os.kernel); set_label_name_and_value(this->data.system.os.hostname); set_label_name_and_value(this->data.system.os.uptime); /* Memory frame */ set_frame_name(this->data.system.memory); set_label_name_and_value(this->data.system.memory.used); set_label_name_and_value(this->data.system.memory.buffers); set_label_name_and_value(this->data.system.memory.cached); set_label_name_and_value(this->data.system.memory.free); set_label_name_and_value(this->data.system.memory.swap); } bool GtkData::draw_bar_memory_used(const Cairo::RefPtr &cr) { if(this->data.system.memory.mem_total == 0) return false; double before = 0; double percent = this->data.system.memory.mem_used / this->data.system.memory.mem_total * 100; if(this->is_dark_theme) cr->set_source_rgba(0.01, 0.02, 0.37, 1.00); else cr->set_source_rgba(1.00, 0.92, 0.23, 1.00); return draw_bar_memory(cr, EXT_TAB_SYSTEM(this->data.system)->barused, EXT_LABEL(this->data.system.memory.used)->value, before, percent); } bool GtkData::draw_bar_memory_buffers(const Cairo::RefPtr &cr) { if(this->data.system.memory.mem_total == 0) return false; double before = this->data.system.memory.mem_used / this->data.system.memory.mem_total * 100; double percent = this->data.system.memory.mem_buffers / this->data.system.memory.mem_total * 100; if(this->is_dark_theme) cr->set_source_rgba(0.01, 0.24, 0.54, 1.00); else cr->set_source_rgba(0.13, 0.59, 0.95, 1.00); return draw_bar_memory(cr, EXT_TAB_SYSTEM(this->data.system)->barbuff, EXT_LABEL(this->data.system.memory.buffers)->value, before, percent); } bool GtkData::draw_bar_memory_cached(const Cairo::RefPtr &cr) { if(this->data.system.memory.mem_total == 0) return false; double before = this->data.system.memory.mem_used / this->data.system.memory.mem_total * 100; before += this->data.system.memory.mem_buffers / this->data.system.memory.mem_total * 100; double percent = this->data.system.memory.mem_cached / this->data.system.memory.mem_total * 100; if(this->is_dark_theme) cr->set_source_rgba(0.00, 0.47, 0.71, 1.00) ; else cr->set_source_rgba(0.61, 0.15, 0.69, 1.00); return draw_bar_memory(cr, EXT_TAB_SYSTEM(this->data.system)->barcache, EXT_LABEL(this->data.system.memory.cached)->value, before, percent); } bool GtkData::draw_bar_memory_free(const Cairo::RefPtr &cr) { if(this->data.system.memory.mem_total == 0) return false; double before = this->data.system.memory.mem_used / this->data.system.memory.mem_total * 100; before += this->data.system.memory.mem_buffers / this->data.system.memory.mem_total * 100; before += this->data.system.memory.mem_cached / this->data.system.memory.mem_total * 100; double percent = this->data.system.memory.mem_free / this->data.system.memory.mem_total * 100; if(this->is_dark_theme) cr->set_source_rgba(0.00, 0.59, 0.78, 1.00); else cr->set_source_rgba(0.30, 0.69, 0.31, 1.00); return draw_bar_memory(cr, EXT_TAB_SYSTEM(this->data.system)->barfree, EXT_LABEL(this->data.system.memory.free)->value, before, percent); } bool GtkData::draw_bar_memory_swap(const Cairo::RefPtr &cr) { if(this->data.system.memory.swap_total == 0) return false; double before = 0; double percent = this->data.system.memory.swap_used / this->data.system.memory.swap_total * 100; if(this->is_dark_theme) cr->set_source_rgba(0.00, 0.71, 0.85, 1.00); else cr->set_source_rgba(0.96, 0.26, 0.21, 1.00); return draw_bar_memory(cr, EXT_TAB_SYSTEM(this->data.system)->barswap, EXT_LABEL(this->data.system.memory.swap)->value, before, percent); } bool GtkData::draw_bar_memory(const Cairo::RefPtr &cr, Gtk::DrawingArea *area, Gtk::Label *label, double before, double percent) { if(std::isnan(percent)) return false; auto newlayout = label->get_layout()->copy(); const auto width = area->get_allocated_width(); const auto height = area->get_allocated_height(); /* Print a colored rectangle */ cr->rectangle(before / 100 * width, 0, percent / 100 * width, height); cr->fill(); /* Print percentage */ if(this->is_dark_theme) cr->set_source_rgb(192.0 / 255.0, 192.0 / 255.0, 0.0); // yellow text for dark theme else cr->set_source_rgb(0.0, 0.0, 128.0 / 255.0); // blue text for light theme cr->move_to(-40, 0); newlayout->set_text(string_format("%.2f%%", percent)); newlayout->show_in_cairo_context(cr); cr->fill(); return true; } /* Graphics tab related methods */ GtkData::ExtTabGraphics::ExtTabGraphics(Glib::RefPtr builder) : ExtTab(builder, "graphicslabel") { builder->get_widget("graphics_scrolledwindow", this->scrolledcards); builder->get_widget("cards_activecard", this->activecard); } void GtkData::gtab_graphics() { /* Hide tab if there is no cards */ if(this->data.graphics.cards.size() == 0) { EXT_TAB_GRAPHICS(this->data.graphics)->scrolledcards->hide(); return; } set_tab_name(this->data.graphics); /* Card frame */ const auto& card = data.graphics.get_selected_card(); set_frame_name(card); set_label_name_and_value(card.vendor); set_label_name_and_value(card.kernel_driver); set_label_name_and_value(card.user_mode_driver, _("User Mode Driver Version")); set_label_name_and_value(card.model); set_label_name_and_value(card.comp_unit); set_label_name_and_value(card.device_id); set_label_name_and_value(card.vbios_version); set_label_name_and_value(card.interface); set_label_name_and_value(card.temperature); set_label_name_and_value(card.usage); set_label_name_and_value(card.core_voltage); set_label_name_and_value(card.power_avg); set_label_name_and_value(card.core_clock); set_label_name_and_value(card.mem_clock); set_label_name_and_value(card.mem_used); set_label_name_and_value(card.resizable_bar); set_label_name_and_value(card.vulkan_rt, _("Vulkan Ray Tracing")); set_label_name_and_value(card.opengl_version); set_label_name_and_value(card.vulkan_version); set_label_name_and_value(card.opencl_version); /* Cards frame */ set_frame_name(this->data.graphics.footer); } void GtkData::fill_box_active_card() { fill_box_active_card(EXT_TAB_GRAPHICS(this->data.graphics)->activecard); } void GtkData::fill_box_active_card(Gtk::ComboBoxText *comboboxtext) { if(this->data.graphics.cards.size() > 0) { comboboxtext->remove_all(); for(unsigned i = 0; i < this->data.graphics.cards.size(); i++) comboboxtext->append(this->data.graphics.get_card_formatted(i)); comboboxtext->set_active(Options::get_selected_gpu()); } else comboboxtext->set_sensitive(false); } void GtkData::change_active_card() { const int card = EXT_TAB_GRAPHICS(this->data.graphics)->activecard->get_active_row_number(); if(card < 0) return; Options::set_selected_gpu(card, this->data.graphics.cards.size()); this->grefresh(); } /* Bench tab related methods */ GtkData::ExtTabBench::ExtTabBench(Glib::RefPtr builder) : ExtTab(builder, "benchlabel") { } void GtkData::gtab_bench() { set_tab_name(this->data.bench); /* Prime Slow frame */ set_frame_name(this->data.bench.prime_slow); EXT_LABEL(this->data.bench.prime_slow.score)->name->set_text(this->data.bench.prime_slow.score.name); EXT_LABEL_PROGRESS_BAR(this->data.bench.prime_slow.score)->value->set_text(this->data.bench.prime_slow.score.value); EXT_LABEL(this->data.bench.prime_slow.state)->name->set_text(this->data.bench.prime_slow.state.name); /* Prime Fast frame */ set_frame_name(this->data.bench.prime_fast); EXT_LABEL(this->data.bench.prime_fast.score)->name->set_text(this->data.bench.prime_fast.score.name); EXT_LABEL_PROGRESS_BAR(this->data.bench.prime_fast.score)->value->set_text(this->data.bench.prime_fast.score.value); EXT_LABEL(this->data.bench.prime_fast.state)->name->set_text(this->data.bench.prime_fast.state.name); /* Parameters frame */ set_frame_name(this->data.bench.parameters); EXT_LABEL(this->data.bench.parameters.duration)->name->set_text(this->data.bench.parameters.duration.name); EXT_LABEL(this->data.bench.parameters.threads)->name->set_text(this->data.bench.parameters.threads.name); } bool GtkData::start_bench_prime_slow(bool state) { if(state) { this->data.bench.fast_mode = false; start_benchmarks(data); } else data.bench.is_running = false; grefresh(); return false; } bool GtkData::start_bench_prime_fast(bool state) { if(state) { this->data.bench.fast_mode = true; start_benchmarks(data); } else data.bench.is_running = false; grefresh(); return false; } void GtkData::change_bench_sensitive(bool state) { auto *gtk_switch_active = this->data.bench.fast_mode ? EXT_LABEL_SWITCH(this->data.bench.prime_fast.state)->value : EXT_LABEL_SWITCH(this->data.bench.prime_slow.state)->value; auto *gtk_switch_standby = this->data.bench.fast_mode ? EXT_LABEL_SWITCH(this->data.bench.prime_slow.state)->value : EXT_LABEL_SWITCH(this->data.bench.prime_fast.state)->value; auto *gtk_progress_bar = this->data.bench.fast_mode ? EXT_LABEL_PROGRESS_BAR(this->data.bench.prime_fast.score)->value : EXT_LABEL_PROGRESS_BAR(this->data.bench.prime_slow.score)->value; if(state) { gtk_switch_standby->set_sensitive(false); EXT_LABEL_SPIN_BUTTON(this->data.bench.parameters.threads)->value->set_sensitive(false); gtk_progress_bar->set_fraction(this->data.bench.parameters.elapsed_i / double(this->data.bench.parameters.duration_i * 60)); } else { gtk_switch_active->set_active(false); gtk_switch_standby->set_sensitive(true); EXT_LABEL_SPIN_BUTTON(this->data.bench.parameters.threads)->value->set_sensitive(true); if(this->data.bench.is_completed) gtk_progress_bar->set_fraction(1.0); } } void GtkData::change_bench_duration() { const int duration = EXT_LABEL_SPIN_BUTTON(this->data.bench.parameters.duration)->value->get_value_as_int(); if(duration < 0) return; data.bench.parameters.set_duration(duration); } void GtkData::change_bench_threads() { const int threads = EXT_LABEL_SPIN_BUTTON(this->data.bench.parameters.threads)->value->get_value_as_int(); if(threads < 0) return; data.bench.parameters.set_threads(threads); } /* About tab related methods */ GtkData::ExtTabAbout::ExtTabAbout(Glib::RefPtr builder) : ExtTab(builder, "aboutlabel") { builder->get_widget("about_logoprg", this->logoprg); builder->get_widget("about_descr", this->about_descr); builder->get_widget("about_version", this->about_version); builder->get_widget("about_author", this->about_author); builder->get_widget("about_website", this->about_website); builder->get_widget("license_copyright", this->license_copyright); builder->get_widget("license_name", this->license_name); builder->get_widget("license_warranty", this->license_warranty); } void GtkData::gtab_about() { set_tab_name(this->data.about); /* Header frame */ EXT_TAB_ABOUT(this->data.about)->about_descr->set_text(this->data.about.description.text); /* About frame */ set_frame_name(this->data.about.about); EXT_TAB_ABOUT(this->data.about)->about_version->set_text(this->data.about.about.version); EXT_TAB_ABOUT(this->data.about)->about_author->set_text(this->data.about.about.author); EXT_TAB_ABOUT(this->data.about)->about_website->set_text(this->data.about.about.website); /* License frame */ set_frame_name(this->data.about.license); EXT_TAB_ABOUT(this->data.about)->license_copyright->set_text(this->data.about.license.copyright); EXT_TAB_ABOUT(this->data.about)->license_name->set_text(this->data.about.license.name); EXT_TAB_ABOUT(this->data.about)->license_warranty->set_text(this->data.about.license.warranty); } /************************* Public function *************************/ /* Load and apply settings from GSettings */ void load_settings() { Glib::init(); settings = Gio::Settings::create(APPLICATION_ID); settings->delay(); Options::set_temp_unit (static_cast(settings->get_enum("temperature-unit"))); Options::set_refr_time (settings->get_uint("refresh-time")); Options::set_selected_page (static_cast(settings->get_enum("default-tab"))); Options::set_selected_type (settings->get_uint("default-core-type"), -1); Options::set_selected_core (settings->get_uint("default-cpu-core"), -1); Options::set_selected_test (settings->get_uint("default-cache-test")); Options::set_selected_stick(settings->get_uint("default-memory-stick"), -1); Options::set_selected_gpu (settings->get_uint("default-active-card"), -1); Options::set_cpuid_decimal (settings->get_boolean("print-cpuid-decimal")); Options::set_with_daemon (settings->get_boolean("always-start-daemon")); } /* Start CPU-X in GTK mode */ int start_gui_gtk(Data &data) { MSG_VERBOSE("%s", _("Starting GTK GUI…")); try { app = Gtk::Application::create(APPLICATION_ID, Gio::APPLICATION_NON_UNIQUE); const auto builder = Gtk::Builder::create_from_file(get_data_path("cpu-x-gtk-3.12.ui")); Glib::set_prgname(APPLICATION_ID); GtkData gdata(builder, data); return app->run(*gdata.mainwindow); } catch(const Gtk::BuilderError& e) { std::cerr << e.what() << std::endl; MSG_ERROR("%s", _("failed to import UI in GtkBuilder")); return EXIT_FAILURE; } } CPU-X-5.0.3/src/gui_gtk.hpp000066400000000000000000000162511454622605200153170ustar00rootroot00000000000000/**************************************************************************** * Copyright © 2014-2024 The Tumultuous Unicorn Of Darkness * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * ****************************************************************************/ /* * PROJECT CPU-X * FILE gui_gtk.hpp */ #ifndef _GUI_GTK_HPP_ #define _GUI_GTK_HPP_ #include #include #include #include #include #include #include "data.hpp" #define APPLICATION_ID "io.github." PRGUSERNAME "." PRGNAME_LOW // https://developer.gnome.org/documentation/tutorials/application-id.html#guidelines-for-choosing-an-application-id enum GtkTheme { AUTO, LIGHT, DARK }; struct ExtTab : public Object { Gtk::Label *name; ExtTab(Glib::RefPtr builder, const std::string name); }; #define EXT_TAB(tab) static_cast(tab.ext) struct ExtFrame : public Object { Gtk::Label *name; ExtFrame(Glib::RefPtr builder, const std::string name); }; #define EXT_FRAME(frame) static_cast(frame.ext) template struct ExtLabel : public Object { Gtk::Label *name; T *value; ExtLabel(Glib::RefPtr builder, const std::string name); }; #define EXT_LABEL(label) static_cast*>(label.ext) #define EXT_LABEL_PROGRESS_BAR(label) static_cast*>(label.ext) #define EXT_LABEL_SWITCH(label) static_cast*>(label.ext) #define EXT_LABEL_SPIN_BUTTON(label) static_cast*>(label.ext) struct GtkData { bool is_dark_theme = false; Data &data; /* Common */ Gtk::Window *mainwindow = nullptr; Gtk::Button *daemonbutton = nullptr; Gtk::Label *labprgver = nullptr; Gtk::Notebook *notebook = nullptr; sigc::connection refresh_handle; /* Settings */ Gtk::Window *settingswindow = nullptr; Gtk::Button *settingsbutton = nullptr; Gtk::Button *validatebutton = nullptr; Gtk::Button *cancelbutton = nullptr; Gtk::ComboBoxText *temperatureunit = nullptr; Gtk::SpinButton *refreshtime = nullptr; Gtk::ComboBoxText *theme = nullptr; Gtk::ComboBoxText *defaulttab = nullptr; Gtk::ComboBoxText *defaulttype = nullptr; Gtk::ComboBoxText *defaultcore = nullptr; Gtk::ComboBoxText *defaultcachetest = nullptr; Gtk::ComboBoxText *defaultstick = nullptr; Gtk::ComboBoxText *defaultcard = nullptr; Gtk::CheckButton *cpuiddecimal = nullptr; Gtk::CheckButton *startdaemon = nullptr; GtkData(Glib::RefPtr builder, Data &data); void get_widgets(Glib::RefPtr builder); void check_theme_color(); void set_colors(); void set_logos(); void set_all_labels(); void set_signals(); void bind_settings(); bool grefresh(); /* Tab CPU */ struct ExtTabCpu : public ExtTab { Gtk::Image *logocpu = nullptr; Gtk::ComboBoxText *activetype = nullptr; Gtk::ComboBoxText *activecore = nullptr; ExtTabCpu(Glib::RefPtr builder); }; #define EXT_TAB_CPU(cpu) static_cast(cpu.ext) void gtab_cpu(); void fill_box_active_type(); void fill_box_active_type(Gtk::ComboBoxText *comboboxtext); void fill_box_active_core(); void fill_box_active_core(Gtk::ComboBoxText *comboboxtext); void change_active_type(); void change_active_core(); /* Tab Caches */ struct ExtTabCaches : public ExtTab { Gtk::Grid *gridcaches = nullptr; Gtk::ComboBoxText *activetest = nullptr; ExtTabCaches(Glib::RefPtr builder); }; #define EXT_TAB_CACHES(caches) static_cast(caches.ext) void gtab_caches(); void fill_box_active_test(); void fill_box_active_test(Gtk::ComboBoxText *comboboxtext); void change_active_test(); /* Tab Motherboard */ struct ExtTabMotherboard : public ExtTab { ExtTabMotherboard(Glib::RefPtr builder); }; void gtab_motherboard(); /* Tab Memory */ struct ExtTabMemory : public ExtTab { Gtk::ScrolledWindow *scrolledsticks = nullptr; Gtk::ComboBoxText *activestick = nullptr; ExtTabMemory(Glib::RefPtr builder); }; #define EXT_TAB_MEMORY(memory) static_cast(memory.ext) void gtab_memory(); void fill_box_active_stick(); void fill_box_active_stick(Gtk::ComboBoxText *comboboxtext); void change_active_stick(); /* Tab System */ struct ExtTabSystem : public ExtTab { Gtk::DrawingArea *barused = nullptr; Gtk::DrawingArea *barbuff = nullptr; Gtk::DrawingArea *barcache = nullptr; Gtk::DrawingArea *barfree = nullptr; Gtk::DrawingArea *barswap = nullptr; ExtTabSystem(Glib::RefPtr builder); }; #define EXT_TAB_SYSTEM(system) static_cast(system.ext) void gtab_system(); bool draw_bar_memory_used(const Cairo::RefPtr &cr); bool draw_bar_memory_buffers(const Cairo::RefPtr &cr); bool draw_bar_memory_cached(const Cairo::RefPtr &cr); bool draw_bar_memory_free(const Cairo::RefPtr &cr); bool draw_bar_memory_swap(const Cairo::RefPtr &cr); bool draw_bar_memory(const Cairo::RefPtr &cr, Gtk::DrawingArea *area, Gtk::Label *label, double before, double percent); /* Tab Graphics */ struct ExtTabGraphics : public ExtTab { Gtk::ScrolledWindow *scrolledcards = nullptr; Gtk::ComboBoxText *activecard = nullptr; ExtTabGraphics(Glib::RefPtr builder); }; #define EXT_TAB_GRAPHICS(graphics) static_cast(graphics.ext) void gtab_graphics(); void fill_box_active_card(); void fill_box_active_card(Gtk::ComboBoxText *comboboxtext); void change_active_card(); /* Tab Bench */ struct ExtTabBench : public ExtTab { ExtTabBench(Glib::RefPtr builder); }; #define EXT_TAB_BENCH(bench) static_cast(bench.ext) void gtab_bench(); bool start_bench_prime_slow(bool state); bool start_bench_prime_fast(bool state); void change_bench_sensitive(bool state); void change_bench_duration(); void change_bench_threads(); /* Tab About */ struct ExtTabAbout : public ExtTab { Gtk::Image *logoprg = nullptr; Gtk::Label *about_descr = nullptr; Gtk::Label *about_version = nullptr; Gtk::Label *about_author = nullptr; Gtk::Label *about_website = nullptr; Gtk::Label *license_copyright = nullptr; Gtk::Label *license_name = nullptr; Gtk::Label *license_warranty = nullptr; ExtTabAbout(Glib::RefPtr builder); }; #define EXT_TAB_ABOUT(about) static_cast(about.ext) void gtab_about(); }; struct SettingsWindow { SettingsWindow(Glib::RefPtr builder, Data &data); void get_widgets(Glib::RefPtr builder); void set_signals(); }; #endif /* _GUI_GTK_HPP_ */ CPU-X-5.0.3/src/logger.cpp000066400000000000000000000035741454622605200151440ustar00rootroot00000000000000/**************************************************************************** * Copyright © 2014-2024 The Tumultuous Unicorn Of Darkness * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * ****************************************************************************/ /* * PROJECT CPU-X * FILE logger.cpp */ #include #include #include #include #include "options.hpp" #include "logger.hpp" void Logger::set_verbosity(LogPriority priority) { Logger::verbosity = priority; } LogPriority Logger::get_verbosity() { return Logger::verbosity; } void Logger::log(LogPriority priority, bool print_errno, std::string message) { std::string color; std::ostream *os; if(priority < Logger::verbosity) return; switch(priority) { case LOG_DEBUG: os = &std::cout; color = BOLD_MAGENTA; break; case LOG_VERBOSE: os = &std::cout; color = BOLD_GREEN; break; case LOG_STANDARD: os = &std::cout; color = DEFAULT; break; case LOG_WARNING: os = &std::cout; color = BOLD_YELLOW; break; case LOG_ERROR: os = &std::cerr; color = BOLD_RED; break; } if(Options::get_color()) *os << color; *os << message; if(print_errno) *os << " (" << std::strerror(errno) << ")"; if(Options::get_color()) *os << DEFAULT; *os << std::endl; } CPU-X-5.0.3/src/logger.hpp000066400000000000000000000031761454622605200151470ustar00rootroot00000000000000/**************************************************************************** * Copyright © 2014-2024 The Tumultuous Unicorn Of Darkness * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * ****************************************************************************/ /* * PROJECT CPU-X * FILE logger.hpp */ #ifndef _LOGGER_HPP_ #define _LOGGER_HPP_ #include #define DEFAULT "\x1b[0m" #define BOLD_RED "\x1b[1;31m" #define BOLD_GREEN "\x1b[1;32m" #define BOLD_YELLOW "\x1b[1;33m" #define BOLD_BLUE "\x1b[1;34m" #define BOLD_MAGENTA "\x1b[1;35m" enum LogPriority { LOG_DEBUG, LOG_VERBOSE, LOG_STANDARD, LOG_WARNING, LOG_ERROR, }; class Logger { public: static void set_verbosity(LogPriority priority); static LogPriority get_verbosity(); static void log(LogPriority priority, bool print_errno, std::string message); private: static inline LogPriority verbosity = LOG_STANDARD; Logger() = delete; ~Logger() = delete; }; #endif /* _LOGGER_HPP_ */ CPU-X-5.0.3/src/main.cpp000066400000000000000000000414111454622605200146010ustar00rootroot00000000000000/**************************************************************************** * Copyright © 2014-2024 The Tumultuous Unicorn Of Darkness * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * ****************************************************************************/ /* * PROJECT CPU-X * FILE main.cpp */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "options.hpp" #include "util.hpp" #include "data.hpp" #include "core.hpp" #include "daemon.h" #include "daemon_client.hpp" #define LOG_FILE "/tmp/cpu-x.log" bool __sigabrt_received = false; /************************* Options-related functions *************************/ struct Getopt { const bool has_mod; const char short_opt; const char *long_opt; const int need_arg; const char *description; }; static const std::list cpux_options = { { HAS_GTK, 'G', "gtk", no_argument, N_("Start graphical user interface (GUI) (default)") }, { HAS_NCURSES, 'N', "ncurses", no_argument, N_("Start text-based user interface (TUI)") }, { true, 'D', "dump", no_argument, N_("Dump all data on standard output and exit") }, { HAS_DMIDECODE, 'M', "dmidecode", no_argument, N_("Run embedded command dmidecode and exit") }, { HAS_BANDWIDTH, 'B', "bandwidth", no_argument, N_("Run embedded command bandwidth and exit") }, { true, 'u', "temp-unit", required_argument, N_("Set temperature unit (c[elsius]|f[ahrenheit]|k[elvin]|r[ankine])") }, { true, 'r', "refresh", required_argument, N_("Set custom time between two refreshes (in seconds)") }, { true, 't', "tab", required_argument, N_("Set default tab (integer)") }, { HAS_LIBCPUID, 'p', "type", required_argument, N_("Select core type to monitor (integer)") }, { HAS_LIBCPUID, 'c', "core", required_argument, N_("Select CPU core to monitor (integer)") }, { HAS_BANDWIDTH, 'b', "cachetest", required_argument, N_("Set custom bandwidth test for CPU caches speed (integer)") }, { HAS_DMIDECODE, 's', "stick", required_argument, N_("Select default memory stick (integer)") }, { HAS_LIBPCI, 'g', "gpu", required_argument, N_("Select default graphic card (integer)") }, { true, 'd', "daemon", no_argument, N_("Start and connect to daemon") }, { true, 'v', "verbose", no_argument, N_("Verbose output") }, { true, 'h', "help", no_argument, N_("Print help and exit") }, { true, 'V', "version", no_argument, N_("Print version and exit") }, { HAS_LIBCPUID, 0, "cpuid-decimal", no_argument, N_("Print CPUID values in decimal (default is hexadeximal)") }, { true, 0, "nocolor", no_argument, N_("Disable colored output") }, { true, 0, "debug", no_argument, N_("Print information for debugging") }, { true, 0, "issue-fmt", no_argument, N_("Print required information to paste in an issue") }, { HAS_NCURSES, 0, "keymap", required_argument, N_("Set key mapping for NCurses mode (a[rrows]|e[macs]|i[nverted-T]|v[im])") }, }; struct EnvVar { const bool has_mod; const char *var_name; const char *description; }; static const std::list cpux_env_vars = { { true, "CPUX_ARGS", N_("Add default command line arguments") }, { true, "CPUX_BCLK", N_("Enforce the bus clock") }, { true, "CPUX_FORCE_CPU_FALLBACK", N_("Ignore CPU values reported by libcpuid (comma-separated values among 'temp', 'volt' and 'freq')") }, { HAS_LIBCPUID, "CPUX_CPUID_RAW", N_("Read CPUID raw data from a given file") }, { HAS_LIBCPUID, "CPUX_DEBUG_DATABASE", N_("Only print a message if CPU is not present in the database") }, }; /* Check for influenceable environment variables */ static void check_environment_variables(Data &data) { if(std::getenv("CPUX_BCLK")) data.cpu.clocks.set_bus_freq(std::atof(std::getenv("CPUX_BCLK"))); if(std::getenv("CPUX_FORCE_CPU_FALLBACK")) { const std::string force_cpu_fallback = std::getenv("CPUX_FORCE_CPU_FALLBACK"); Options::set_fallback_cpu_temp(force_cpu_fallback.find("temp") != std::string::npos); Options::set_fallback_cpu_volt(force_cpu_fallback.find("volt") != std::string::npos); Options::set_fallback_cpu_freq(force_cpu_fallback.find("freq") != std::string::npos); } if(std::getenv("CPUX_CPUID_RAW")) data.cpu.cpuid_raw_file = std::getenv("CPUX_CPUID_RAW"); if(std::getenv("CPUX_DEBUG_DATABASE")) Options::set_debug_database((std::atoi(std::getenv("CPUX_DEBUG_DATABASE"))) > 0); } /* This is help display with --help option */ static void help(std::string binary_name) { bool options_header = false; char buff[MAXSTR]; MSG_STDOUT(_("Usage: %s DISPLAY [OPTIONS]\n"), binary_name.c_str()); MSG_STDOUT("%s", _("Available DISPLAY:")); for(auto& option : cpux_options) { if(option.has_mod) { if(!options_header && islower(option.short_opt)) { options_header = true; MSG_STDOUT("\n%s", _("Available OPTIONS:")); } if(option.short_opt) snprintf(buff, MAXSTR, " -%c,", option.short_opt); else snprintf(buff, MAXSTR, " "); MSG_STDOUT("%s --%-14s %s", buff, option.long_opt, _(option.description)); } } MSG_STDOUT("\n%s", _("Influenceable environment variables:")); for(auto& env_var : cpux_env_vars) if(env_var.has_mod) MSG_STDOUT(" %-25s %s", env_var.var_name, _(env_var.description)); } /* This is the --version option */ static void version(bool full_header) { int i; const struct { const bool has_mod; const char *lib, *version; } libs_ver[] = { { HAS_GTK, "GTK", GTK_VERSION }, { HAS_NCURSES, "NCURSES", NCURSES_VERSION }, { HAS_LIBCPUID, "LIBCPUID", LIBCPUID_VERSION }, { HAS_LIBPCI, "LIBPCI", LIBPCI_VERSION }, { HAS_LIBGLFW, "LIBGLFW", LIBGLFW_VERSION }, { HAS_Vulkan, "VULKAN", Vulkan_VERSION }, { HAS_OpenCL, "OPENCL", OpenCL_VERSION }, { HAS_LIBPROC2, "LIBPROC2", LIBPROC2_VERSION }, { HAS_LIBPROCPS, "LIBPROCPS", LIBPROCPS_VERSION }, { HAS_LIBSTATGRAB, "LIBSTATGRAB", LIBSTATGRAB_VERSION }, { HAS_DMIDECODE, "DMIDECODE", DMIDECODE_VERSION }, { HAS_BANDWIDTH, "BANDWIDTH", BANDWIDTH_VERSION }, { false, NULL, NULL } }; PRGINFO(stdout); if(full_header) { MSG_STDOUT("%s\n", PRGCPRGHT); MSG_STDOUT("%s", _("This is free software: you are free to change and redistribute it.")); MSG_STDOUT("%s", _("This program comes with ABSOLUTELY NO WARRANTY")); MSG_STDOUT(_("See the %s license: <%s>\n"), PRGLCNS, LCNSURL); } /* Print features version */ for(i = 0; libs_ver[i].lib != NULL; i++) { if(libs_ver[i].has_mod) MSG_STDOUT(_("-- %-9s version: %s"), libs_ver[i].lib, libs_ver[i].version); } } /* Add arguments from environment variable CPUX_ARGS */ static std::vector get_arguments_from_environment(std::string binary_name) { const char *env_args = std::getenv("CPUX_ARGS"); std::vector args = { binary_name }; if(env_args != NULL) { std::string tmp; std::stringstream stream_env_args(env_args); while (stream_env_args >> tmp) args.push_back(tmp); } return args; } /* Parse arguments and set some flags */ static void parse_arguments(std::forward_list &cmd_args) { int c, longindex; std::string shortopts; std::vector cargs; std::vector longopts; const std::string binary_name = cmd_args.front(); /* Inject arguments from CPUX_ARGS environment variable */ cmd_args.pop_front(); std::vector env_args = get_arguments_from_environment(binary_name); env_args.insert(env_args.end(), std::make_move_iterator(cmd_args.begin()), std::make_move_iterator(cmd_args.end())); std::transform(env_args.begin(), env_args.end(), std::back_inserter(cargs), [](const std::string& str) { return const_cast(str.c_str()); }); /* Fill longopts structure */ for(auto& option : cpux_options) { if(option.has_mod) { longopts.push_back({ option.long_opt, option.need_arg, NULL, option.short_opt }); if(option.short_opt) { shortopts.push_back(option.short_opt); if(option.need_arg) shortopts.push_back(':'); } } } longopts.push_back({ NULL, no_argument, NULL, 0 }); /* Set the default mode */ if(HAS_GTK && (std::getenv("DISPLAY") != NULL || std::getenv("WAYLAND_DISPLAY") != NULL)) Options::set_output_type(OUT_GTK); else if(HAS_NCURSES) Options::set_output_type(OUT_NCURSES); else Options::set_output_type(OUT_DUMP); /* Parse options */ while((c = getopt_long(cargs.size(), cargs.data(), shortopts.c_str(), longopts.data(), &longindex)) != -1) { switch(c) { case 'G': Options::set_output_type(OUT_GTK); break; case 'N': Options::set_output_type(OUT_NCURSES); break; case 'D': Options::set_output_type(OUT_DUMP); break; case 'M': Options::set_output_type(OUT_DMIDECODE); break; case 'B': Options::set_output_type(OUT_BANDWIDTH); break; case 'u': switch(std::tolower(optarg[0])) { case 'c': Options::set_temp_unit(CELSIUS); break; case 'f': Options::set_temp_unit(FAHRENHEIT); break; case 'k': Options::set_temp_unit(KELVIN); break; case 'r': Options::set_temp_unit(RANKINE); break; default: help(binary_name); exit(EXIT_FAILURE); } break; case 'r': Options::set_refr_time(std::stoul(optarg)); break; case 't': Options::set_selected_page(static_cast(std::stoul(optarg))); break; case 'p': Options::set_selected_type(std::stoul(optarg), -1); break; case 'c': Options::set_selected_core(std::stoul(optarg), -1); break; case 'b': Options::set_selected_test(std::stoul(optarg)); break; case 's': Options::set_selected_stick(std::stoul(optarg), -1); break; case 'g': Options::set_selected_gpu(std::stoul(optarg), -1); break; case 'd': Options::set_with_daemon(true); break; case 'v': Logger::set_verbosity(LOG_VERBOSE); break; case 'h': help(binary_name); exit(EXIT_SUCCESS); break; case 'V': version(true); exit(EXIT_SUCCESS); break; case 0: if(!strcmp(longopts[longindex].name, "cpuid-decimal")) { Options::set_cpuid_decimal(true); break; } else if(!strcmp(longopts[longindex].name, "nocolor")) { Options::set_color(false); break; } else if(!strcmp(longopts[longindex].name, "debug")) { Logger::set_verbosity(LOG_DEBUG); break; } else if(!strcmp(longopts[longindex].name, "issue-fmt")) { Options::set_color(false); Options::set_issue(true); Options::set_output_type(OUT_DUMP); Logger::set_verbosity(LOG_DEBUG); std::setlocale(LC_ALL, "C"); std::freopen(LOG_FILE, "w", stdout); std::setvbuf(stdout, NULL, _IONBF, 0); dup2(STDOUT_FILENO, STDERR_FILENO); version(false); break; } else if(!strcmp(longopts[longindex].name, "keymap")) { switch(std::tolower(optarg[0])) { case 'a': Options::set_keymap(ARROWS); break; case 'e': Options::set_keymap(EMACS); break; case 'i': Options::set_keymap(INVERTED_T); break; case 'v': Options::set_keymap(VIM); break; default: help(binary_name); exit(EXIT_FAILURE); } break; } /* Fall through */ case '?': default: help(binary_name); exit(EXIT_FAILURE); } } } /************************* Main-related functions *************************/ static void common_sighandler(int signum, bool need_stop) { int bt_size, i; char **bt_syms; void *bt[16]; std::string::size_type addr_start, addr_end; std::string line, address, line_number; /* Get the backtrace */ bt_size = backtrace(bt, 16); bt_syms = backtrace_symbols(bt, bt_size); /* Print the backtrace */ Logger::set_verbosity(LOG_ERROR); // disable DEBUG mode for popen_to_str() if(need_stop) MSG_ERROR(_("\nOops, something was wrong! %s has received signal %d (%s) and has crashed."), PRGNAME, signum, strsignal(signum)); else MSG_ERROR(_("\nOops, something was wrong! %s has received signal %d (%s) and is trying to recover."), PRGNAME, signum, strsignal(signum)); MSG_ERROR("%s", "========================= Backtrace ========================="); PRGINFO(stderr); for(i = 1; i < bt_size; i++) { line_number.clear(); line = bt_syms[i]; addr_start = line.find("["); addr_end = line.find("]"); if((addr_start != std::string::npos) && (addr_end != std::string::npos)) { addr_start++; address = line.substr(addr_start, addr_end - addr_start); popen_to_str(line_number, "addr2line -s -e /proc/%d/exe %s | cut -d' ' -f1", getpid(), address.c_str()); } if(!line_number.empty() && (line_number.find("??") == std::string::npos)) MSG_ERROR("#%2i %s %s", i, line_number.c_str(), bt_syms[i]); else MSG_ERROR("#%2i %s", i, bt_syms[i]); } MSG_ERROR("%s\n", "======================== End Backtrace ======================="); if(need_stop) { MSG_ERROR("%s", _("You can open a new issue here, by filling the template as requested:")); MSG_ERROR("%s\n", ISSUEURL); } /* Stop program */ free(bt_syms); if(need_stop) { std::signal(signum, SIG_DFL); kill(getpid(), signum); } } /* Action on SIGILL/SIGSEV/SIGFPE */ static void sighandler_fatal(int signum) { common_sighandler(signum, true); } /* Action on SIGABRT */ static void sighandler_abrt(int signum) { __sigabrt_received = true; common_sighandler(signum, false); } /* Enable internationalization support */ #if HAS_GETTEXT static int set_locales(void) { int err; const char *TEXTDOMAINDIR = std::getenv("TEXTDOMAINDIR") ? std::getenv("TEXTDOMAINDIR") : LOCALEDIR; /* Apply locale */ std::setlocale(LC_ALL, ""); err = bindtextdomain(GETTEXT_PACKAGE, TEXTDOMAINDIR) ? 0 : 1; err += bind_textdomain_codeset(GETTEXT_PACKAGE, "UTF-8") ? 0 : 1; err += textdomain(GETTEXT_PACKAGE) ? 0 : 1; /* Check if something is wrong */ if(err) { MSG_ERROR("%s", _("an error occurred while setting locale")); return 1; } else return 0; } #endif /* HAS_GETTEXT */ int main(int argc, char *argv[]) { #if HAS_GETTEXT /* Text localization */ set_locales(); #endif /* HAS_GETTEXT */ /* Signal handlers */ std::signal(SIGILL, sighandler_fatal); std::signal(SIGSEGV, sighandler_fatal); std::signal(SIGFPE, sighandler_fatal); std::signal(SIGABRT, sighandler_abrt); /* Init variables */ std::forward_list args(argv, argv + argc); Data data; // Note: must be done after set_locales() to translate all labels /* Parse options */ #if HAS_GTK load_settings(); #endif /* HAS_GTK */ parse_arguments(args); check_environment_variables(data); if(Options::get_output_type() > OUT_NO_CPUX) goto skip_init; /* Connect to daemon */ if(IS_ROOT || Options::get_with_daemon()) start_daemon(false); if(daemon_is_alive()) connect_to_daemon(data.socket_fd); /* Retrieve data */ fill_labels(data); /* Show data */ if(HAS_GTK && Options::output_type_is(OUT_GTK)) start_gui_gtk(data); if(HAS_NCURSES && Options::output_type_is(OUT_NCURSES)) start_tui_ncurses(data); if(Options::output_type_is(OUT_DUMP)) std::cout << data; skip_init: if(HAS_DMIDECODE && Options::output_type_is(OUT_DMIDECODE)) return run_dmidecode(); if(HAS_BANDWIDTH && Options::output_type_is(OUT_BANDWIDTH)) return run_bandwidth(); if(data.reload) execvp(argv[0], argv); return EXIT_SUCCESS; } CPU-X-5.0.3/src/opencl_ext.h000066400000000000000000000122751454622605200154700ustar00rootroot00000000000000/******************************************************************************* * Copyright (c) 2008-2020 The Khronos Group Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. ******************************************************************************/ /* * PROJECT CPU-X * FILE opencl_ext.h */ #ifndef _OPENCL_EXT_H_ #define _OPENCL_EXT_H_ /* https://stackoverflow.com/a/60890691 */ #define CaseReturnString(x) case x: return #x; const char *opencl_error(cl_int err) { switch (err) { CaseReturnString(CL_SUCCESS ) CaseReturnString(CL_DEVICE_NOT_FOUND ) CaseReturnString(CL_DEVICE_NOT_AVAILABLE ) CaseReturnString(CL_COMPILER_NOT_AVAILABLE ) CaseReturnString(CL_MEM_OBJECT_ALLOCATION_FAILURE ) CaseReturnString(CL_OUT_OF_RESOURCES ) CaseReturnString(CL_OUT_OF_HOST_MEMORY ) CaseReturnString(CL_PROFILING_INFO_NOT_AVAILABLE ) CaseReturnString(CL_MEM_COPY_OVERLAP ) CaseReturnString(CL_IMAGE_FORMAT_MISMATCH ) CaseReturnString(CL_IMAGE_FORMAT_NOT_SUPPORTED ) CaseReturnString(CL_BUILD_PROGRAM_FAILURE ) CaseReturnString(CL_MAP_FAILURE ) CaseReturnString(CL_MISALIGNED_SUB_BUFFER_OFFSET ) CaseReturnString(CL_COMPILE_PROGRAM_FAILURE ) CaseReturnString(CL_LINKER_NOT_AVAILABLE ) CaseReturnString(CL_LINK_PROGRAM_FAILURE ) CaseReturnString(CL_DEVICE_PARTITION_FAILED ) CaseReturnString(CL_KERNEL_ARG_INFO_NOT_AVAILABLE ) CaseReturnString(CL_INVALID_VALUE ) CaseReturnString(CL_INVALID_DEVICE_TYPE ) CaseReturnString(CL_INVALID_PLATFORM ) CaseReturnString(CL_INVALID_DEVICE ) CaseReturnString(CL_INVALID_CONTEXT ) CaseReturnString(CL_INVALID_QUEUE_PROPERTIES ) CaseReturnString(CL_INVALID_COMMAND_QUEUE ) CaseReturnString(CL_INVALID_HOST_PTR ) CaseReturnString(CL_INVALID_MEM_OBJECT ) CaseReturnString(CL_INVALID_IMAGE_FORMAT_DESCRIPTOR) CaseReturnString(CL_INVALID_IMAGE_SIZE ) CaseReturnString(CL_INVALID_SAMPLER ) CaseReturnString(CL_INVALID_BINARY ) CaseReturnString(CL_INVALID_BUILD_OPTIONS ) CaseReturnString(CL_INVALID_PROGRAM ) CaseReturnString(CL_INVALID_PROGRAM_EXECUTABLE ) CaseReturnString(CL_INVALID_KERNEL_NAME ) CaseReturnString(CL_INVALID_KERNEL_DEFINITION ) CaseReturnString(CL_INVALID_KERNEL ) CaseReturnString(CL_INVALID_ARG_INDEX ) CaseReturnString(CL_INVALID_ARG_VALUE ) CaseReturnString(CL_INVALID_ARG_SIZE ) CaseReturnString(CL_INVALID_KERNEL_ARGS ) CaseReturnString(CL_INVALID_WORK_DIMENSION ) CaseReturnString(CL_INVALID_WORK_GROUP_SIZE ) CaseReturnString(CL_INVALID_WORK_ITEM_SIZE ) CaseReturnString(CL_INVALID_GLOBAL_OFFSET ) CaseReturnString(CL_INVALID_EVENT_WAIT_LIST ) CaseReturnString(CL_INVALID_EVENT ) CaseReturnString(CL_INVALID_OPERATION ) CaseReturnString(CL_INVALID_GL_OBJECT ) CaseReturnString(CL_INVALID_BUFFER_SIZE ) CaseReturnString(CL_INVALID_MIP_LEVEL ) CaseReturnString(CL_INVALID_GLOBAL_WORK_SIZE ) CaseReturnString(CL_INVALID_PROPERTY ) CaseReturnString(CL_INVALID_IMAGE_DESCRIPTOR ) CaseReturnString(CL_INVALID_COMPILER_OPTIONS ) CaseReturnString(CL_INVALID_LINKER_OPTIONS ) CaseReturnString(CL_INVALID_DEVICE_PARTITION_COUNT ) case -1001: return "CL_PLATFORM_NOT_FOUND_KHR"; default: return "Unknown OpenCL error code"; } } /********************************* * cl_amd_device_attribute_query * *********************************/ #define CL_DEVICE_TOPOLOGY_AMD 0x4037 #define CL_DEVICE_BOARD_NAME_AMD 0x4038 #define CL_DEVICE_GFXIP_MAJOR_AMD 0x404A #define CL_DEVICE_GFXIP_MINOR_AMD 0x404B #define CL_DEVICE_PCIE_ID_AMD 0x4034 typedef union { struct { cl_uint type; cl_uint data[5]; } raw; struct { cl_uint type; cl_uchar unused[17]; cl_uchar bus; cl_uchar device; cl_uchar function; } pcie; } cl_device_topology_amd; #define CL_DEVICE_TOPOLOGY_TYPE_PCIE_AMD 1 /****************************************** * cl_nv_device_attribute_query extension * ******************************************/ #define CL_DEVICE_PCI_BUS_ID_NV 0x4008 #define CL_DEVICE_PCI_SLOT_ID_NV 0x4009 #define CL_DEVICE_PCI_DOMAIN_ID_NV 0x400A #endif /* _OPENCL_EXT_H_ */ CPU-X-5.0.3/src/options.cpp000066400000000000000000000162611454622605200153550ustar00rootroot00000000000000/**************************************************************************** * Copyright © 2014-2024 The Tumultuous Unicorn Of Darkness * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * ****************************************************************************/ /* * PROJECT CPU-X * FILE options.cpp */ #include #include "util.hpp" #include "options.hpp" #if HAS_BANDWIDTH # include "bandwidth/libbandwidth.h" #endif void Options::set_cpuid_decimal(bool cpuid_decimal) { Options::cpuid_decimal = cpuid_decimal; } bool Options::get_cpuid_decimal() { return Options::cpuid_decimal; } void Options::set_color(bool color) { Options::color = color; } bool Options::get_color() { return Options::color; } void Options::set_issue(bool issue) { Options::issue = issue; } bool Options::get_issue() { return Options::issue; } void Options::set_with_daemon(bool with_daemon) { Options::with_daemon = with_daemon; } bool Options::get_with_daemon() { return Options::with_daemon; } void Options::set_debug_database(bool debug_database) { Options::debug_database = debug_database; } bool Options::get_debug_database() { return Options::debug_database; } void Options::set_fallback_cpu_temp(bool fallback_cpu_temp) { Options::fallback_cpu_temp = fallback_cpu_temp; } bool Options::get_fallback_cpu_temp() { return Options::fallback_cpu_temp; } void Options::set_fallback_cpu_volt(bool fallback_cpu_volt) { Options::fallback_cpu_volt = fallback_cpu_volt; } bool Options::get_fallback_cpu_volt() { return Options::fallback_cpu_volt; } void Options::set_fallback_cpu_freq(bool fallback_cpu_freq) { Options::fallback_cpu_freq = fallback_cpu_freq; } bool Options::get_fallback_cpu_freq() { return Options::fallback_cpu_freq; } bool Options::set_selected_type(uint8_t selected_type, uint8_t num_cpu_types) { Options::set_selected_core(0, -1); if(selected_type < num_cpu_types) { Options::selected_type = selected_type; return true; } else { Options::selected_type = 0; MSG_WARNING(_("Selected CPU type (%u) is not a valid number (%u is the maximum for this CPU)"), selected_type, num_cpu_types - 1); return false; } } uint8_t Options::get_selected_type() { return Options::selected_type; } bool Options::set_selected_test([[maybe_unused]] uint8_t selected_test) { #if HAS_BANDWIDTH if(selected_test < BANDWIDTH_LAST_TEST) { Options::selected_test = selected_test; return true; } else { Options::selected_test = 0; MSG_WARNING(_("Selected bandwidth test (%u) is not a valid number (%u is the maximum for this system)"), selected_test, BANDWIDTH_LAST_TEST - 1); return false; } #else return false; #endif /* HAS_BANDWIDTH */ } uint8_t Options::get_selected_test() { return Options::selected_test; } bool Options::set_selected_stick(uint8_t selected_stick, uint8_t num_sticks) { if(selected_stick < num_sticks) { Options::selected_stick = selected_stick; return true; } else { Options::selected_stick = 0; MSG_WARNING(_("Selected RAM stick (%u) is not a valid number (%u is the maximum for this system)"), selected_stick, num_sticks - 1); return false; } } uint8_t Options::get_selected_stick() { return Options::selected_stick; } bool Options::set_selected_gpu(uint8_t selected_gpu, uint8_t num_gpus) { if(selected_gpu < num_gpus) { Options::selected_gpu = selected_gpu; return true; } else { Options::selected_gpu = 0; MSG_WARNING(_("Selected graphic card (%u) is not a valid number (%u is the maximum for this system)"), selected_gpu, num_gpus - 1); return false; } } uint8_t Options::get_selected_gpu() { return Options::selected_gpu; } bool Options::set_selected_core(uint16_t selected_core, uint16_t num_cpu_cores) { if(selected_core < num_cpu_cores) { Options::selected_core = selected_core; if(!set_cpu_affinity(selected_core)) MSG_ERROR(_("failed to change CPU affinitiy to core %u"), selected_core); return true; } else { Options::selected_core = 0; MSG_WARNING(_("Selected CPU core (%u) is not a valid number (%u is the maximum for this type of core)"), selected_core, num_cpu_cores - 1); return false; } } uint16_t Options::get_selected_core() { return Options::selected_core; } bool Options::set_output_type(uint16_t output_type) { switch(output_type) { case OUT_GTK: case OUT_NCURSES: case OUT_DUMP: case OUT_NO_CPUX: case OUT_DMIDECODE: case OUT_BANDWIDTH: Options::output_type = output_type; return true; default: Options::output_type = OUT_DUMP; MSG_ERROR("Options::set_output_type() called with 0x%X", output_type); return false; } } bool Options::output_type_is(uint16_t output_type) { return Options::output_type == output_type; } uint16_t Options::get_output_type() { return Options::output_type; } bool Options::set_refr_time(uint16_t refr_time) { if(refr_time >= 1) { Options::refr_time = refr_time; return true; } else { Options::refr_time = 1; return false; } } uint16_t Options::get_refr_time() { return Options::refr_time; } bool Options::set_selected_page(TabNumber selected_page) { switch(selected_page) { case TAB_CPU: case TAB_CACHES: case TAB_MOTHERBOARD: case TAB_MEMORY: case TAB_SYSTEM: case TAB_GRAPHICS: case TAB_BENCH: case TAB_ABOUT: Options::selected_page = selected_page; return true; default: Options::selected_page = TAB_CPU; MSG_WARNING(_("Selected tab (%u) is not a valid number (%u is the maximum)"), selected_page, TAB_ABOUT); return false; } } bool Options::set_selected_page_next() { if(Options::selected_page < TAB_ABOUT) { Options::selected_page = TabNumber(Options::selected_page + 1); return true; } else return false; } bool Options::set_selected_page_prev() { if(Options::selected_page > TAB_CPU) { Options::selected_page = TabNumber(Options::selected_page - 1); return true; } else return false; } TabNumber Options::get_selected_page() { return Options::selected_page; } bool Options::set_keymap(OptKeymap keymap) { switch(keymap) { case ARROWS: case EMACS: case INVERTED_T: case VIM: Options::keymap = keymap; return true; default: Options::keymap = ARROWS; MSG_ERROR("Options::set_keymap() called with %i", keymap); return false; } } OptKeymap Options::get_keymap() { return Options::keymap; } bool Options::set_temp_unit(OptTempUnit temp_unit) { switch(temp_unit) { case CELSIUS: case FAHRENHEIT: case KELVIN: case RANKINE: Options::temp_unit = temp_unit; return true; default: Options::temp_unit = CELSIUS; MSG_ERROR("Options::set_temp_unit() called with %i", temp_unit); return false; } } OptTempUnit Options::get_temp_unit() { return Options::temp_unit; } CPU-X-5.0.3/src/options.hpp000066400000000000000000000104411454622605200153540ustar00rootroot00000000000000/**************************************************************************** * Copyright © 2014-2024 The Tumultuous Unicorn Of Darkness * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * ****************************************************************************/ /* * PROJECT CPU-X * FILE options.hpp */ #ifndef _OPTIONS_HPP_ #define _OPTIONS_HPP_ #include /* Options definition */ #define OUT_GTK (1 << 0) #define OUT_NCURSES (1 << 1) #define OUT_DUMP (1 << 2) #define OUT_NO_CPUX (1 << 10) #define OUT_DMIDECODE (1 << 11) #define OUT_BANDWIDTH (1 << 12) enum OptKeymap { ARROWS, EMACS, INVERTED_T, VIM, LASTKEYMAP }; enum OptTempUnit { CELSIUS, FAHRENHEIT, KELVIN, RANKINE, LASTTEMPUNIT }; enum TabNumber { TAB_CPU, TAB_CACHES, TAB_MOTHERBOARD, TAB_MEMORY, TAB_SYSTEM, TAB_GRAPHICS, TAB_BENCH, TAB_ABOUT }; class Options { public: /* Function's prototypes generated with: grep -E "set_|get_" src/options.cpp | sed -e 's|^|static |g' -e 's|Options::||g' -e 's|)|);|g' */ static void set_cpuid_decimal(bool cpuid_decimal); static bool get_cpuid_decimal(); static void set_color(bool color); static bool get_color(); static void set_issue(bool issue); static bool get_issue(); static void set_with_daemon(bool with_daemon); static bool get_with_daemon(); static void set_debug_database(bool debug_database); static bool get_debug_database(); static void set_fallback_cpu_temp(bool fallback_cpu_temp); static bool get_fallback_cpu_temp(); static void set_fallback_cpu_volt(bool fallback_cpu_volt); static bool get_fallback_cpu_volt(); static void set_fallback_cpu_freq(bool fallback_cpu_freq); static bool get_fallback_cpu_freq(); static bool set_selected_page(TabNumber selected_page); static bool set_selected_page_next(); static bool set_selected_page_prev(); static TabNumber get_selected_page(); static bool set_selected_type(uint8_t num_cpu_types, uint8_t selected_type); static uint8_t get_selected_type(); static bool set_selected_test(uint8_t selected_test); static uint8_t get_selected_test(); static bool set_selected_stick(uint8_t selected_stick, uint8_t num_sticks); static uint8_t get_selected_stick(); static bool set_selected_gpu(uint8_t selected_gpu, uint8_t num_gpus); static uint8_t get_selected_gpu(); static bool set_selected_core(uint16_t selected_core, uint16_t num_cpu_cores); static uint16_t get_selected_core(); static bool set_output_type(uint16_t output_type); static bool output_type_is(uint16_t output_type); static uint16_t get_output_type(); static bool set_refr_time(uint16_t refr_time); static uint16_t get_refr_time(); static bool set_keymap(OptKeymap keymap); static OptKeymap get_keymap(); static bool set_temp_unit(OptTempUnit temp_unit); static OptTempUnit get_temp_unit(); private: static inline bool cpuid_decimal = false; static inline bool color = true; static inline bool issue = false; static inline bool with_daemon = false; static inline bool debug_database = false; static inline bool fallback_cpu_temp = false; static inline bool fallback_cpu_volt = false; static inline bool fallback_cpu_freq = false; static inline uint8_t selected_type = 0; static inline uint8_t selected_test = 0; static inline uint8_t selected_stick = 0; static inline uint8_t selected_gpu = 0; static inline uint16_t selected_core = 0; static inline uint16_t output_type = 0; static inline uint16_t refr_time = 1; static inline TabNumber selected_page = TAB_CPU; static inline OptKeymap keymap = ARROWS; static inline OptTempUnit temp_unit = CELSIUS; Options() = delete; ~Options() = delete; }; #endif /* _OPTIONS_HPP_ */ CPU-X-5.0.3/src/tui_ncurses.cpp000066400000000000000000000717041454622605200162300ustar00rootroot00000000000000/**************************************************************************** * Copyright © 2014-2024 The Tumultuous Unicorn Of Darkness * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * ****************************************************************************/ /* * PROJECT CPU-X * FILE tui_ncurses.cpp */ #include #include #include #include #include #include #include #include #include "options.hpp" #include "data.hpp" #include "core.hpp" #include "tui_ncurses.hpp" #if HAS_GETTEXT # include #endif /* Pairs class */ Pairs::Definition::Definition(const short pair, const short foreground, const short background, const int attrs) : pair(pair), foreground(foreground), background(background), attrs(attrs) { } void Pairs::init() { for(auto& color : Pairs::colors) init_pair(color.pair, color.foreground, color.background); } int Pairs::get_attrs(const Pairs::Colors pair) { return ((pair >= DEFAULT_COLOR) && (pair < LAST_COLOR)) ? Pairs::colors[pair].attrs : 0; } /************************* Private functions *************************/ static int convert_char(int ch) { int i = 0; static int modifier = 0; const int ch_mod = modifier ? ch & modifier : ch; const int keymaps[][LASTKEYMAP] = { //Arrow Emacs Inverted-T Vim { KEY_LEFT, CTRL('b'), 'j', 'h' }, { KEY_RIGHT, CTRL('f'), 'l', 'l' }, { KEY_UP, CTRL('p'), 'i', 'k' }, { KEY_DOWN, CTRL('n'), 'k', 'j' }, { KEY_PPAGE, CTRL('v'), CTRL('b'), CTRL('b') }, { KEY_NPAGE, ALT('v'), CTRL('f'), CTRL('f') }, { 'h', '?', '?', '?' }, { ch_mod, ch_mod, ch_mod, ch_mod } // Sentinel value }; modifier = (ch == ALT_CODE) ? ch : 0; while(keymaps[i][Options::get_keymap()] != ch_mod) i++; return keymaps[i][0]; } #undef ALT_CODE #undef ALT /* Put window in the center of the screen */ static bool resize_window(WINDOW *pwin) { static int prev_lines = -1, prev_cols = -1; bool ret = true; const int starty = (LINES - SizeInfo::height) / 2; const int startx = (COLS - SizeInfo::width) / 2; if (prev_lines >= 0 && prev_lines == LINES && prev_cols >= 0 && prev_cols == COLS) return true; prev_lines = LINES; prev_cols = COLS; erase(); if((startx < 0) || (starty < 0)) { printw("%s\n", _("Window is too small!")); timeout(-1); ret = false; } else { wresize(pwin, SizeInfo::height, SizeInfo::width); mvwin(pwin, starty, startx); printw("%s\n", _("Press 'h' to see help.")); timeout(Options::get_refr_time() * 1000); } refresh(); return ret; } /* Clean window */ static void wclrscr(WINDOW *pwin) { int y, x, maxy, maxx; getmaxyx(pwin, maxy, maxx); for(y = 0; y < maxy; y++) { for(x = 0; x < maxx; x++) mvwaddch(pwin, y, x, ' '); } } /* Similar to mvwprintw, but specify a color pair */ static int mvwprintwc(WINDOW *win, int y, int x, Pairs::Colors pair, const char *fmt, ...) { int ret; va_list args; va_start(args, fmt); wmove(win, y, x); if(Options::get_color()) wattron(win, COLOR_PAIR(pair) | Pairs::get_attrs(pair)); ret = vwprintw(win, fmt, args); if(Options::get_color()) wattroff(win, COLOR_PAIR(pair) | Pairs::get_attrs(pair)); va_end(args); return ret; } static int mvwprintwc(WINDOW *win, int y, int x, Pairs::Colors pair, const std::string &str) { return mvwprintwc(win, y, x, pair, "%s", str.c_str()); } /* Similar to mvwprintw, but print first string in black and second string in blue */ static int mvwprintw2c(WINDOW *win, int y, int x, const char *fmt_name, const char *fmt_value, const Label &label) { int ret = 0; Pairs::Colors pair; /* Print label name */ wmove(win, y, x); pair = Pairs::Colors::LABEL_NAME_COLOR; if(Options::get_color()) wattron(win, COLOR_PAIR(pair) | Pairs::get_attrs(pair)); ret += wprintw(win, fmt_name, label.name.c_str()); ret += wprintw(win, ": "); if(Options::get_color()) wattroff(win, COLOR_PAIR(pair) | Pairs::get_attrs(pair)); /* Print label value */ pair = Pairs::Colors::LABEL_VALUE_COLOR; if(Options::get_color()) wattron(win, COLOR_PAIR(pair) | Pairs::get_attrs(pair)); ret += wprintw(win, fmt_value, label.value.c_str()); if(Options::get_color()) wattroff(win, COLOR_PAIR(pair) | Pairs::get_attrs(pair)); return ret; } /* Draw a frame */ static void draw_frame(WINDOW *win, int starty, int startx, int endy, int endx, const std::string &frame_name) { if(Options::get_color()) { init_pair(Pairs::Colors::DEFAULT_COLOR, COLOR_BLACK, COLOR_WHITE); wattron(win, COLOR_PAIR(Pairs::Colors::DEFAULT_COLOR)); } /* Horizontal lines */ mvwhline(win, starty, startx, 0, endx - startx); mvwhline(win, endy, startx, 0, endx - startx); /* Vertical lines */ mvwvline(win, starty, startx, 0, endy - starty); mvwvline(win, starty, endx - 1, 0, endy - starty); /* Corners */ mvwhline(win, starty, startx, ACS_ULCORNER, 1); mvwhline(win, endy, startx, ACS_LLCORNER, 1); mvwhline(win, starty, endx - 1, ACS_URCORNER, 1); mvwhline(win, endy, endx - 1, ACS_LRCORNER, 1); /* Title */ mvwprintwc(win, starty, startx + 2, Pairs::Colors::DEFAULT_COLOR, frame_name); if(Options::get_color()) wattroff(win, COLOR_PAIR(Pairs::Colors::DEFAULT_COLOR)); } static void draw_frame(WINDOW *win, int starty, int startx, int endy, int endx, const Frame &frame) { draw_frame(win, starty, startx, endy, endx, frame.name); } /* Print how to use this TUI */ static void print_help() { timeout(-1); nodelay(stdscr, FALSE); printw(_("Welcome in %s NCurses help!\n"), PRGNAME); printw("%s\n", _("This help describes how to use this Text-based User Interface.")); printw("\n%s\n", _("Global keys:")); printw("\t%s\n", _("Press 'left' key or 'tab' key to switch in left tab.")); printw("\t%s\n", _("Press 'right' key or 'shift + tab' keys to switch in right tab.")); printw("\t%s\n", _("Press 'h' key to see this help.")); printw("\t%s\n", _("Press 'q' key to exit.")); printw("\n%s\n", _("CPU tab:")); printw("\t%s\n", _("Press 'next page' key to decrease core type number to monitor.")); printw("\t%s\n", _("Press 'previous page' key to increase core type number to monitor.")); printw("\t%s\n", _("Press 'down' key to decrease CPU core number to monitor.")); printw("\t%s\n", _("Press 'up' key to increase CPU core number to monitor.")); printw("\n%s\n", _("Caches tab:")); printw("\t%s\n", _("Press 'down' key to switch to previous test.")); printw("\t%s\n", _("Press 'up' key to switch to next test.")); printw("\n%s\n", _("Bench tab:")); printw("\t%s\n", _("Press 'down' key to decrement benchmark duration.")); printw("\t%s\n", _("Press 'up' key to increment benchmark duration.")); printw("\t%s\n", _("Press 'next page' key to decrement number of threads to use.")); printw("\t%s\n", _("Press 'previous page' key to increment number of threads to use.")); printw("\t%s\n", _("Press 's' key to start/stop prime numbers (slow) benchmark.")); printw("\t%s\n", _("Press 'f' key to start/stop prime numbers (fast) benchmark.")); printw("\n%s\n", _("Graphics tab:")); printw("\t%s\n", _("Press 'down' key to switch to previous graphic card.")); printw("\t%s\n", _("Press 'up' key to switch to next graphic card.")); printw("\n%s\n", _("Press any key to exit this help.")); refresh(); getch(); nodelay(stdscr, TRUE); timeout(Options::get_refr_time() * 1000); } /* The main window (title, tabs, footer) */ static void main_win(WINDOW *win, Data &data) { int cpt = 2; const std::array tab_list = { &data.cpu, &data.caches, &data.motherboard, &data.memory, &data.system, &data.graphics, &data.bench, &data.about }; if(Options::get_color()) { init_pair(Pairs::Colors::DEFAULT_COLOR, COLOR_BLACK, COLOR_WHITE); wattrset(win, COLOR_PAIR(Pairs::Colors::DEFAULT_COLOR)); } wclrscr(win); box(win, 0, 0); mvwprintwc(win, TITLE_LINE, SizeInfo::width / 2 - std::strlen(PRGNAME) / 2, Pairs::Colors::TITLE_COLOR, PRGNAME); mvwprintwc(win, HEADER_LINE, 12, Pairs::Colors::DEFAULT_COLOR, PRGNAME); mvwprintwc(win, HEADER_LINE, SizeInfo::width / 2, Pairs::Colors::DEFAULT_COLOR, data.about.about.version); for(int i = 1; i < SizeInfo::width - 1; i++) mvwprintwc(win, TABS_LINE, i, Pairs::Colors::INACTIVE_TAB_COLOR, " "); for(uint8_t i = 0; i < tab_list.size(); i++) { if(static_cast(i) == Options::get_selected_page()) { if(Options::get_color()) mvwprintwc(win, TABS_LINE, cpt, Pairs::Colors::ACTIVE_TAB_COLOR, tab_list[i]->name); else mvwprintw(win, TABS_LINE, cpt++, "[%s]", tab_list[i]->name.c_str()); } else mvwprintwc(win, TABS_LINE, cpt, Pairs::Colors::INACTIVE_TAB_COLOR, tab_list[i]->name); cpt += tab_list[i]->name.size() + 2; } } /* CPU tab */ static void ntab_cpu(WINDOW *win, Data &data) { const unsigned length = SizeInfo::width - (SizeInfo::tb + 18); const auto& cpu_type = data.cpu.get_selected_cpu_type(); std::string::size_type index_prev = 0, indes_cur = 0; Label instructions1 = Label(cpu_type.processor.instructions.name); Label instructions2 = Label(cpu_type.processor.instructions.name); /* Split Intructions label in two parts */ while((indes_cur = cpu_type.processor.instructions.value.find(",", indes_cur)) != std::string::npos) { if(indes_cur >= length) { instructions1.value = cpu_type.processor.instructions.value.substr(0, index_prev); instructions2.value = cpu_type.processor.instructions.value.substr(index_prev + 1); break; } indes_cur++; index_prev = indes_cur; } /* Processor frame */ draw_frame(win, LINE_0, SizeInfo::start , LINE_10, SizeInfo::width - 1, cpu_type.processor); mvwprintw2c(win, LINE_1, SizeInfo::tb, "%14s", "%s", cpu_type.processor.vendor); mvwprintw2c(win, LINE_2, SizeInfo::tb, "%14s", "%s", cpu_type.processor.codename); mvwprintw2c(win, LINE_3, SizeInfo::tb, "%14s", "%s", cpu_type.processor.package); mvwprintw2c(win, LINE_4, SizeInfo::tb, "%14s", "%s", cpu_type.processor.technology); mvwprintw2c(win, LINE_4, SizeInfo::tm, "%11s", "%s", cpu_type.processor.voltage); mvwprintw2c(win, LINE_5, SizeInfo::tb, "%14s", "%s", cpu_type.processor.specification); mvwprintw2c(win, LINE_6, SizeInfo::tb, "%14s", "%s", cpu_type.processor.family); mvwprintw2c(win, LINE_6, SizeInfo::tm, "%11s", "%s", cpu_type.processor.model); mvwprintw2c(win, LINE_6, SizeInfo::te, "%9s", "%s", cpu_type.processor.temperature); mvwprintw2c(win, LINE_7, SizeInfo::tb, "%14s", "%s", cpu_type.processor.dispfamily); mvwprintw2c(win, LINE_7, SizeInfo::tm, "%11s", "%s", cpu_type.processor.dispmodel); mvwprintw2c(win, LINE_7, SizeInfo::te, "%9s", "%s", cpu_type.processor.stepping); mvwprintw2c(win, LINE_8, SizeInfo::tb, "%14s", "%s", instructions1); mvwprintwc (win, LINE_9, SizeInfo::tb + 16, Pairs::Colors::LABEL_VALUE_COLOR, instructions2.value); /* Clocks frame */ draw_frame(win, LINE_11, SizeInfo::start, LINE_16, SizeInfo::middle, data.cpu.clocks); mvwprintw2c(win, LINE_12, SizeInfo::tb, "%14s", "%s", data.cpu.clocks.core_speed); mvwprintw2c(win, LINE_13, SizeInfo::tb, "%14s", "%s", data.cpu.clocks.multiplier); mvwprintw2c(win, LINE_14, SizeInfo::tb, "%14s", "%s", data.cpu.clocks.bus_speed); mvwprintw2c(win, LINE_15, SizeInfo::tb, "%14s", "%s", data.cpu.clocks.usage); /* Cache frame */ draw_frame(win, LINE_11, SizeInfo::middle, LINE_16, SizeInfo::width - 1, cpu_type.caches); mvwprintw2c(win, LINE_12, SizeInfo::middle + 1, "%12s", "%s", cpu_type.caches.level1d); mvwprintw2c(win, LINE_13, SizeInfo::middle + 1, "%12s", "%s", cpu_type.caches.level1i); mvwprintw2c(win, LINE_14, SizeInfo::middle + 1, "%12s", "%s", cpu_type.caches.level2); mvwprintw2c(win, LINE_15, SizeInfo::middle + 1, "%12s", "%s", cpu_type.caches.level3); /* Footer frame */ draw_frame(win, LINE_17, SizeInfo::start, LINE_19, SizeInfo::width - 1, ""); mvwprintwc(win, LINE_18, 4, Pairs::Colors::DEFAULT_COLOR, data.cpu.get_selected_cpu_type_formatted()); mvwprintwc(win, LINE_18, SizeInfo::quarter + 6, Pairs::Colors::DEFAULT_COLOR, data.cpu.get_selected_cpu_core_formatted()); mvwprintw2c(win, LINE_18, SizeInfo::middle, "%s", "%2s", cpu_type.footer.cores); mvwprintw2c(win, LINE_18, SizeInfo::middle + SizeInfo::quarter, "%s", "%2s", cpu_type.footer.threads); } /* Caches tab */ static void ntab_caches(WINDOW *win, Data &data) { int line = LINE_1, start = LINE_0, end = LINE_3; const int frame_height = end - start + 1; /* Cache frames */ for(const auto& cache : data.caches.get_selected_cpu_type().caches) { draw_frame(win, start, SizeInfo::start, end, SizeInfo::width - 1, cache); line = start + 1; mvwprintw2c(win, line++, 2, "%13s", "%s", cache.size); mvwprintw2c(win, line++, 2, "%13s", "%s", cache.speed); start = end + 1; end += frame_height; } /* Test frame */ draw_frame(win, LINE_17, SizeInfo::start, LINE_19, SizeInfo::width - 1, data.caches.test); if(data.caches.test.names.size() > 0) mvwprintwc(win, LINE_18, SizeInfo::tb + 1, Pairs::Colors::DEFAULT_COLOR, data.caches.test.get_selected_test_formatted()); } /* Motherboard tab */ static void ntab_motherboard(WINDOW *win, Data &data) { /* Motherboard frame */ draw_frame(win, LINE_0, SizeInfo::start , LINE_4, SizeInfo::width - 1, data.motherboard.board); mvwprintw2c(win, LINE_1, SizeInfo::tb, "%13s", "%s", data.motherboard.board.manufacturer); mvwprintw2c(win, LINE_2, SizeInfo::tb, "%13s", "%s", data.motherboard.board.model); mvwprintw2c(win, LINE_3, SizeInfo::tb, "%13s", "%s", data.motherboard.board.revision); /* BIOS frame */ draw_frame(win, LINE_5, SizeInfo::start , LINE_10, SizeInfo::width - 1, data.motherboard.bios); mvwprintw2c(win, LINE_6, SizeInfo::tb, "%13s", "%s", data.motherboard.bios.brand); mvwprintw2c(win, LINE_7, SizeInfo::tb, "%13s", "%s", data.motherboard.bios.version); mvwprintw2c(win, LINE_8, SizeInfo::tb, "%13s", "%s", data.motherboard.bios.date); mvwprintw2c(win, LINE_9, SizeInfo::tb, "%13s", "%s", data.motherboard.bios.romsize); /* Chipset frame */ draw_frame(win, LINE_11, SizeInfo::start , LINE_14, SizeInfo::width - 1, data.motherboard.chipset); mvwprintw2c(win, LINE_12, SizeInfo::tb, "%13s", "%s", data.motherboard.chipset.vendor); mvwprintw2c(win, LINE_13, SizeInfo::tb, "%13s", "%s", data.motherboard.chipset.model); } /* Memory tab */ static void ntab_memory(WINDOW *win, Data &data) { if(data.memory.sticks.size() == 0) return; const auto& stick = data.memory.get_selected_stick(); /* Card frame */ draw_frame(win, LINE_0, SizeInfo::start, LINE_10, SizeInfo::width - 1, stick); mvwprintw2c(win, LINE_1, SizeInfo::tb, "%16s", "%s", stick.manufacturer); mvwprintw2c(win, LINE_2, SizeInfo::tb, "%16s", "%s", stick.part_number); mvwprintw2c(win, LINE_3, SizeInfo::tb, "%16s", "%s", stick.type); mvwprintw2c(win, LINE_4, SizeInfo::tb, "%16s", "%s", stick.type_detail); mvwprintw2c(win, LINE_5, SizeInfo::tb, "%16s", "%s", stick.device_locator); mvwprintw2c(win, LINE_6, SizeInfo::tb, "%16s", "%s", stick.bank_locator); mvwprintw2c(win, LINE_7, SizeInfo::tb, "%16s", "%s", stick.size); mvwprintw2c(win, LINE_7, SizeInfo::tm, "%18s", "%s", stick.rank); mvwprintw2c(win, LINE_8, SizeInfo::tb, "%16s", "%s", stick.speed); mvwprintw2c(win, LINE_9, SizeInfo::tb, "%16s", "%s", stick.voltage); /* Sticks frame */ draw_frame(win, LINE_17, SizeInfo::start , LINE_19, SizeInfo::width - 1, data.memory.footer); mvwprintwc(win, LINE_18, 4, Pairs::Colors::DEFAULT_COLOR, data.memory.get_selected_stick_formatted()); } /* Draw an usage bar in System tab */ static void draw_bar(WINDOW *win, int line, Pairs::Colors pair, bool start_left, long double used, long double total) { int i, bar_count, adjust = 0; static int before = 0; const int val = 39, start = 46, end = SizeInfo::width - 3, size = end - start - 1; long double percent; if(total == 0.0) return; before = start_left ? 0 : before; percent = used / total; if(std::isnan(percent)) return; bar_count = int(std::round(percent * (size - 1))); if(0.0 < percent && bar_count < 1) { bar_count = 1; adjust = 1; } /* Write percentage + delimiters */ mvwprintwc(win, line, val, Pairs::Colors::LABEL_VALUE_COLOR, "%.2Lf%%", percent * 100); mvwprintwc(win, line, start, Pairs::Colors::DEFAULT_COLOR, "["); mvwprintwc(win, line, end, Pairs::Colors::DEFAULT_COLOR, "]"); /* Draw bar */ for(i = 0; i < bar_count; i++) { if(Options::get_color()) mvwprintwc(win, line, start + 1 + before + i, pair, " "); else mvwprintw(win, line, start + 1 + before + i, "|"); } before += bar_count - adjust; } /* System tab */ static void ntab_system(WINDOW *win, Data &data) { /* OS frame */ draw_frame(win, LINE_0, SizeInfo::start , LINE_5, SizeInfo::width - 1, data.system.os); mvwprintw2c(win, LINE_1, SizeInfo::tb, "%13s", "%s", data.system.os.name); mvwprintw2c(win, LINE_2, SizeInfo::tb, "%13s", "%s", data.system.os.kernel); mvwprintw2c(win, LINE_3, SizeInfo::tb, "%13s", "%s", data.system.os.hostname); mvwprintw2c(win, LINE_4, SizeInfo::tb, "%13s", "%s", data.system.os.uptime); /* Memory frame */ draw_frame(win, LINE_6, SizeInfo::start , LINE_12, SizeInfo::width - 1, data.system.memory); mvwprintw2c(win, LINE_7, SizeInfo::tb, "%13s", "%s", data.system.memory.used); draw_bar(win, LINE_7, Pairs::Colors::YELLOW_BAR_COLOR, true, data.system.memory.mem_used, data.system.memory.mem_total); mvwprintw2c(win, LINE_8, SizeInfo::tb, "%13s", "%s", data.system.memory.buffers); draw_bar(win, LINE_8, Pairs::Colors::BLUE_BAR_COLOR, false, data.system.memory.mem_buffers, data.system.memory.mem_total); mvwprintw2c(win, LINE_9, SizeInfo::tb, "%13s", "%s", data.system.memory.cached); draw_bar(win, LINE_9, Pairs::Colors::MAGENTA_BAR_COLOR, false, data.system.memory.mem_cached, data.system.memory.mem_total); mvwprintw2c(win, LINE_10, SizeInfo::tb, "%13s", "%s", data.system.memory.free); draw_bar(win, LINE_10, Pairs::Colors::GREEN_BAR_COLOR, false, data.system.memory.mem_free, data.system.memory.mem_total); mvwprintw2c(win, LINE_11, SizeInfo::tb, "%13s", "%s", data.system.memory.swap); draw_bar(win, LINE_11, Pairs::Colors::RED_BAR_COLOR, true, data.system.memory.swap_used, data.system.memory.swap_total); } /* Graphics tab */ static void ntab_graphics(WINDOW *win, Data &data) { if(data.graphics.cards.size() == 0) return; const auto& card = data.graphics.get_selected_card(); /* Card frame */ draw_frame(win, LINE_0, SizeInfo::start, LINE_14, SizeInfo::width - 1, card); mvwprintw2c(win, LINE_1, SizeInfo::tb, "%13s", "%s", card.vendor); mvwprintw2c(win, LINE_1, SizeInfo::tm, "%18s", "%s", card.kernel_driver); mvwprintw2c(win, LINE_2, SizeInfo::tb, "%13s", "%s", card.user_mode_driver); mvwprintw2c(win, LINE_3, SizeInfo::tb, "%13s", "%s", card.model); mvwprintw2c(win, LINE_4, SizeInfo::tb, "%13s", "%s", card.comp_unit); mvwprintw2c(win, LINE_4, SizeInfo::tm, "%18s", "%s", card.device_id); mvwprintw2c(win, LINE_5, SizeInfo::tb, "%13s", "%s", card.vbios_version); mvwprintw2c(win, LINE_6, SizeInfo::tb, "%13s", "%s", card.interface); mvwprintw2c(win, LINE_7, SizeInfo::tb, "%13s", "%s", card.temperature); mvwprintw2c(win, LINE_7, SizeInfo::tm, "%18s", "%s", card.usage); mvwprintw2c(win, LINE_8, SizeInfo::tb, "%13s", "%s", card.core_voltage); mvwprintw2c(win, LINE_8, SizeInfo::tm, "%18s", "%s", card.power_avg); mvwprintw2c(win, LINE_9, SizeInfo::tb, "%13s", "%s", card.core_clock); mvwprintw2c(win, LINE_9, SizeInfo::tm, "%18s", "%s", card.mem_clock); mvwprintw2c(win, LINE_10, SizeInfo::tb, "%13s", "%s", card.mem_used); mvwprintw2c(win, LINE_11, SizeInfo::tb, "%13s", "%s", card.resizable_bar); mvwprintw2c(win, LINE_11, SizeInfo::tm, "%18s", "%s", card.vulkan_rt); mvwprintw2c(win, LINE_12, SizeInfo::tb, "%13s", "%s", card.opengl_version); mvwprintw2c(win, LINE_12, SizeInfo::tm, "%18s", "%s", card.vulkan_version); mvwprintw2c(win, LINE_13, SizeInfo::tb, "%13s", "%s", card.opencl_version); /* Cards frame */ draw_frame(win, LINE_17, SizeInfo::start , LINE_19, SizeInfo::width - 1, data.graphics.footer); mvwprintwc(win, LINE_18, 4, Pairs::Colors::DEFAULT_COLOR, data.graphics.get_selected_card_formatted()); } /* Bench tab */ static void ntab_bench(WINDOW *win, Data &data) { /* Prime numbers (slow) frame */ draw_frame(win, LINE_0, SizeInfo::start , LINE_3, SizeInfo::width - 1, data.bench.prime_slow); mvwprintw2c(win, LINE_1, SizeInfo::tb, "%13s", "%s", data.bench.prime_slow.score); mvwprintw2c(win, LINE_2, SizeInfo::tb, "%13s", "%s", data.bench.prime_slow.state); /* Prime numbers (fast) frame */ draw_frame(win, LINE_4, SizeInfo::start , LINE_7, SizeInfo::width - 1, data.bench.prime_fast); mvwprintw2c(win, LINE_5, SizeInfo::tb, "%13s", "%s", data.bench.prime_fast.score); mvwprintw2c(win, LINE_6, SizeInfo::tb, "%13s", "%s", data.bench.prime_fast.state); /* Parameters frame */ draw_frame(win, LINE_17, SizeInfo::start , LINE_19, SizeInfo::width - 1, data.bench.parameters); mvwprintw2c(win, LINE_18, SizeInfo::tb, "%13s", "%s", data.bench.parameters.duration); mvwprintw2c(win, LINE_18, SizeInfo::tm, "%13s", "%s", data.bench.parameters.threads); } /* About tab */ static void ntab_about(WINDOW *win, Data &data) { const auto pos = data.about.description.text.find("\n"); const std::string description1 = data.about.description.text.substr(0, pos); const std::string description2 = data.about.description.text.substr(pos + 1); /* About CPU-X frame */ draw_frame(win, LINE_0, SizeInfo::start, LINE_5, SizeInfo::width - 1, ""); mvwprintwc(win, LINE_2, 4, Pairs::Colors::DEFAULT_COLOR, description1); mvwprintwc(win, LINE_3, 4, Pairs::Colors::DEFAULT_COLOR, description2); /* About frame */ draw_frame(win, LINE_6, SizeInfo::start, LINE_10, SizeInfo::width - 1, data.about.about); mvwprintwc(win, LINE_7, 4, Pairs::Colors::DEFAULT_COLOR, data.about.about.version); mvwprintwc(win, LINE_8, 4, Pairs::Colors::DEFAULT_COLOR, data.about.about.author); mvwprintwc(win, LINE_9, 4, Pairs::Colors::DEFAULT_COLOR, data.about.about.website); /* License frame */ draw_frame(win, LINE_11, SizeInfo::start, LINE_16, SizeInfo::width - 1, data.about.license); mvwprintwc(win, LINE_12, 4, Pairs::Colors::DEFAULT_COLOR, data.about.license.copyright); mvwprintwc(win, LINE_14, 4, Pairs::Colors::DEFAULT_COLOR, data.about.license.name); mvwprintwc(win, LINE_15, 4, Pairs::Colors::DEFAULT_COLOR, data.about.license.warranty); } static void (*func_ptr[])(WINDOW*, Data&) = { ntab_cpu, ntab_caches, ntab_motherboard, ntab_memory, ntab_system, ntab_graphics, ntab_bench, ntab_about }; /* Draw main window and tab content */ static void draw_window(WINDOW *win, Data &data) { main_win(win, data); (*func_ptr[Options::get_selected_page()])(win, data); wrefresh(win); } /* Refresh dynamic values */ static void nrefresh(WINDOW *win, Data &data) { switch(Options::get_selected_page()) { case TAB_CPU: case TAB_CACHES: case TAB_SYSTEM: case TAB_GRAPHICS: case TAB_BENCH: do_refresh(data, Options::get_selected_page()); draw_window(win, data); break; default: return; } } /************************* Public function *************************/ /* Start CPU-X in NCurses mode */ void start_tui_ncurses(Data &data) { int err = 0, ch = 0; WINDOW *win; MSG_VERBOSE("%s", _("Starting NCurses TUI…")); if(!std::getenv("TERMINFO")) setenv("TERMINFO", TERMINFODIR, 0); std::freopen("/dev/null", "a", stderr); if(setupterm(NULL, STDOUT_FILENO, &err)) { if(err == -1) { MSG_ERROR("%s", _("FATAL ERROR: terminfo database could not be found (try to set TERMINFO environment variable)")); exit(255); } else { MSG_WARNING(_("Failed to set up %s terminal (err=%i); falling back to %s"), getenv("TERM"), err, DEFAULT_TERM); setenv("TERM", DEFAULT_TERM, 1); setupterm(DEFAULT_TERM, STDOUT_FILENO, &err); } } initscr(); cbreak(); noecho(); curs_set(0); halfdelay(0); nodelay(stdscr, TRUE); keypad(stdscr, TRUE); if(Options::get_color()) { start_color(); Options::set_color(has_colors()); } if(Options::get_color()) Pairs::init(); win = newwin(SizeInfo::height, SizeInfo::width, 0, 0); if(resize_window(win)) draw_window(win, data); while(ch != 'q') { ch = convert_char(getch()); switch(ch) { case KEY_LEFT: case SHIFT_TAB: /* Switch to left tab */ if(Options::set_selected_page_prev()) if(resize_window(win)) draw_window(win, data); break; case KEY_RIGHT: case KEY_TAB: /* Switch to right tab */ if(Options::set_selected_page_next()) if(resize_window(win)) draw_window(win, data); break; case KEY_DOWN: if((Options::get_selected_page() == TAB_CPU) && (Options::get_selected_core() > 0)) { Options::set_selected_core(Options::get_selected_core() - 1, data.cpu.get_selected_cpu_type().footer.num_threads); draw_window(win, data); } else if((Options::get_selected_page() == TAB_CACHES) && (Options::get_selected_test() > 0)) { Options::set_selected_test(Options::get_selected_test() - 1); draw_window(win, data); } else if((Options::get_selected_page() == TAB_MEMORY) && (Options::get_selected_stick() > 0)) { Options::set_selected_stick(Options::get_selected_stick() - 1, data.memory.sticks.size()); draw_window(win, data); } else if((Options::get_selected_page() == TAB_GRAPHICS) && (Options::get_selected_gpu() > 0)) { Options::set_selected_gpu(Options::get_selected_gpu() - 1, data.graphics.cards.size()); draw_window(win, data); } else if((Options::get_selected_page() == TAB_BENCH) && data.bench.parameters.set_duration(data.bench.parameters.duration_i - 1)) draw_window(win, data); break; case KEY_NPAGE: if((Options::get_selected_page() == TAB_CPU) && (Options::get_selected_type() > 0)) { Options::set_selected_type(Options::get_selected_type() - 1, data.cpu.cpu_types.size()); draw_window(win, data); } else if((Options::get_selected_page() == TAB_BENCH) && !data.bench.is_running && (data.bench.parameters.threads_i > 0)) if(data.bench.parameters.set_threads(data.bench.parameters.threads_i - 1)) draw_window(win, data); break; case KEY_UP: if((Options::get_selected_page() == TAB_CPU) && (Options::get_selected_core() < data.cpu.get_selected_cpu_type().footer.num_threads - 1)) { Options::set_selected_core(Options::get_selected_core() + 1, data.cpu.get_selected_cpu_type().footer.num_threads); draw_window(win, data); } else if((Options::get_selected_page() == TAB_CACHES) && (Options::get_selected_test() < data.caches.test.names.size() - 1)) { Options::set_selected_test(Options::get_selected_test() + 1); draw_window(win, data); } else if((Options::get_selected_page() == TAB_MEMORY) && (Options::get_selected_stick() < data.memory.sticks.size() - 1)) { Options::set_selected_stick(Options::get_selected_stick() + 1, data.memory.sticks.size()); draw_window(win, data); } else if((Options::get_selected_page() == TAB_GRAPHICS) && (Options::get_selected_gpu() < data.graphics.cards.size() - 1)) { Options::set_selected_gpu(Options::get_selected_gpu() + 1, data.graphics.cards.size()); draw_window(win, data); } else if((Options::get_selected_page() == TAB_BENCH) && data.bench.parameters.set_duration(data.bench.parameters.duration_i + 1)) draw_window(win, data); break; case KEY_PPAGE: if((Options::get_selected_page() == TAB_CPU) && (Options::get_selected_type() < data.cpu.cpu_types.size() - 1)) { Options::set_selected_type(Options::get_selected_type() + 1, data.cpu.cpu_types.size()); draw_window(win, data); } else if((Options::get_selected_page() == TAB_BENCH) && !data.bench.is_running && (data.bench.parameters.threads_i < std::thread::hardware_concurrency())) if(data.bench.parameters.set_threads(data.bench.parameters.threads_i + 1)) draw_window(win, data); break; case 'f': if(Options::get_selected_page() == TAB_BENCH) { if(data.bench.is_running) data.bench.is_running = false; else { data.bench.fast_mode = true; start_benchmarks(data); } nrefresh(win, data); } break; case 's': if(Options::get_selected_page() == TAB_BENCH) { if(data.bench.is_running) data.bench.is_running = false; else { data.bench.fast_mode = false; start_benchmarks(data); } nrefresh(win, data); } break; case 'h': erase(); print_help(); if(resize_window(win)) draw_window(win, data); break; case ERR: /* Refresh dynamic labels */ if(resize_window(win)) nrefresh(win, data); break; case KEY_RESIZE: /* Resize window */ if(resize_window(win)) draw_window(win, data); break; default: break; } } endwin(); } CPU-X-5.0.3/src/tui_ncurses.hpp000066400000000000000000000066241454622605200162340ustar00rootroot00000000000000/**************************************************************************** * Copyright © 2014-2024 The Tumultuous Unicorn Of Darkness * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * ****************************************************************************/ /* * PROJECT CPU-X * FILE tui_ncurses.h */ #ifndef _TUI_NCURSES_HPP_ #define _TUI_NCURSES_HPP_ #include #include #define DEFAULT_TERM "xterm" /* Convert keys when an alternative mapping is used */ #define ALT_CODE 27 #define ALT(x) (x & ALT_CODE) /* glibc's term.h pulls in sys/ttydefaults.h which has it, but musl's does not. */ #ifndef CTRL #define CTRL(x) (x & 037) #endif /* Tab key */ #define KEY_TAB '\t' #define SHIFT_TAB 353 enum Lines { WINDOW_TOP_LINE, TITLE_LINE, TABS_LINE, LINE_0, LINE_1, LINE_2, LINE_3, LINE_4, LINE_5, LINE_6, LINE_7, LINE_8, LINE_9, LINE_10, LINE_11, LINE_12, LINE_13, LINE_14, LINE_15, LINE_16, LINE_17, LINE_18, LINE_19, HEADER_LINE, WINDOW_BOTTOM_LINE, LINE_COUNT }; /* Pairs class */ class Pairs { public: enum Colors { DEFAULT_COLOR = 1, TITLE_COLOR, ACTIVE_TAB_COLOR, INACTIVE_TAB_COLOR, LABEL_NAME_COLOR, LABEL_VALUE_COLOR, YELLOW_BAR_COLOR, BLUE_BAR_COLOR, MAGENTA_BAR_COLOR, GREEN_BAR_COLOR, RED_BAR_COLOR, LAST_COLOR }; struct Definition { const short pair, foreground, background; const int attrs; Definition(const short pair, const short foreground, const short background, const int attrs); }; static void init(); static int get_attrs(const Colors pair); private: static const inline std::vector colors = { { 0, 0, 0, 0 }, { DEFAULT_COLOR, COLOR_BLACK, COLOR_WHITE, A_NORMAL }, { TITLE_COLOR, COLOR_BLUE, COLOR_WHITE, A_BOLD }, { ACTIVE_TAB_COLOR, COLOR_WHITE, COLOR_BLUE, A_BOLD }, { INACTIVE_TAB_COLOR, COLOR_WHITE, COLOR_BLUE, A_NORMAL }, { LABEL_NAME_COLOR, COLOR_BLACK, COLOR_WHITE, A_NORMAL }, { LABEL_VALUE_COLOR, COLOR_BLUE, COLOR_WHITE, A_NORMAL }, { YELLOW_BAR_COLOR, COLOR_YELLOW, COLOR_YELLOW, A_NORMAL }, { BLUE_BAR_COLOR, COLOR_BLUE, COLOR_BLUE, A_NORMAL }, { MAGENTA_BAR_COLOR, COLOR_MAGENTA, COLOR_MAGENTA, A_NORMAL }, { GREEN_BAR_COLOR, COLOR_GREEN, COLOR_GREEN, A_NORMAL }, { RED_BAR_COLOR, COLOR_RED, COLOR_RED, A_NORMAL } }; }; /* SizeInfo class */ struct SizeInfo { static const inline int height = LINE_COUNT; static const inline int width = 76; static const inline int start = 1; static const inline int middle = width / 2; static const inline int quarter = (middle - 3) / 2; static const inline int tb = 2; static const inline int tm = 26; static const inline int te = 48; }; #endif /* _TUI_NCURSES_HPP_ */ CPU-X-5.0.3/src/util.cpp000066400000000000000000000435521454622605200146420ustar00rootroot00000000000000/**************************************************************************** * Copyright © 2014-2024 The Tumultuous Unicorn Of Darkness * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * ****************************************************************************/ /* * PROJECT CPU-X * FILE util.cpp */ #include #include #include #include #include #include #include #include #include #include #include #include "options.hpp" #include "util.hpp" #include "daemon.h" namespace fs = std::filesystem; /* PrefixUnit class */ PrefixUnit::PrefixUnit() : init(false) { } void PrefixUnit::find_best_prefix(uint64_t value, PrefixUnit::Multipliers multiplier, bool use_si_prefixes) { unsigned prefix_index, divisor_index; struct Table { PrefixUnit::Multipliers multiplier; char *prefix; uint64_t divisor; }; const std::array si_prefixes {{ { MULT_NONE, UNIT_B, static_cast(1) }, { MULT_K, UNIT_KB, static_cast(1e3) }, { MULT_M, UNIT_MB, static_cast(1e6) }, { MULT_G, UNIT_GB, static_cast(1e9) }, { MULT_T, UNIT_TB, static_cast(1e12) }, }}; const std::array binary_prefixes {{ { MULT_NONE, UNIT_B, static_cast(1) }, { MULT_K, UNIT_KB, static_cast(1e3) }, { MULT_M, UNIT_MB, static_cast(1e6) }, { MULT_G, UNIT_GB, static_cast(1e9) }, { MULT_T, UNIT_TB, static_cast(1e12) }, }}; const std::array prefixes = use_si_prefixes ? si_prefixes : binary_prefixes; /* Find current multiplier */ for(prefix_index = 0; (prefixes[prefix_index].multiplier != multiplier) && (prefix_index < prefixes.size()); prefix_index++); if(prefix_index >= prefixes.size()) { /* Due to the loop over an enum, this case is not possible */ MSG_ERROR("multiplier=%i, value=%llu", multiplier, value); return; } this->init = true; this->prefix = prefixes[prefix_index].prefix; this->divisor = prefixes[0].divisor; /* Find new prefix and new divisor */ for(prefix_index = prefix_index + 1, divisor_index = 1; (prefix_index < prefixes.size()) && (divisor_index < prefixes.size()) && ((value / prefixes[divisor_index].divisor) > 0); prefix_index++, divisor_index++) { this->prefix = prefixes[prefix_index].prefix; this->divisor = prefixes[divisor_index].divisor; } } void PrefixUnit::find_best_si_prefix(uint64_t value, Multipliers multiplier) { find_best_prefix(value, multiplier, true); } void PrefixUnit::find_best_binary_prefix(uint64_t value, Multipliers multiplier) { find_best_prefix(value, multiplier, false); } /* Functions */ /* Check if string can be converted to an unsigned integer */ bool is_unsigned_integer(const std::string &str) { bool result = false; try { std::stoull(str); result = true; } catch (...) { } return result; } /* Return a formatted C++ string */ std::string string_format(const char *str, ...) { char *buff = NULL; va_list aptr; va_start(aptr, str); vasprintf(&buff, str, aptr); va_end(aptr); std::string ret(buff); free(buff); return ret; } /* Trim a C++ string from start */ static inline void string_ltrim(std::string &str) { str.erase(str.begin(), std::find_if(str.begin(), str.end(), [](unsigned char ch) { return !std::isspace(ch); })); } /* Trim a C++ string from end */ static inline void string_rtrim(std::string &str) { str.erase(std::find_if(str.rbegin(), str.rend(), [](unsigned char ch) { return !std::isspace(ch); }).base(), str.end()); } /* Trim a C++ string from both ends */ void string_trim(std::string &str) { string_rtrim(str); string_ltrim(str); } #define TOKEN_LEN 4 /* Duplicate a string and set data size unit */ std::string string_set_size_unit(char *str_src) { if(str_src == NULL) return ""; ssize_t i = 0; const ssize_t len = std::strlen(str_src); std::string str_dst = ""; while(i < len) { if((str_src[i] == '@') && (i + TOKEN_LEN - 1 < len) && (str_src[i + TOKEN_LEN - 1] == '@')) { std::string buff = ""; /* Set unit in destination string */ if(!strncmp(&str_src[i], "@0B@", TOKEN_LEN)) buff = UNIT_B; else if(!strncmp(&str_src[i], "@KB@", TOKEN_LEN)) buff = UNIT_KB; else if(!strncmp(&str_src[i], "@MB@", TOKEN_LEN)) buff = UNIT_MB; else if(!strncmp(&str_src[i], "@GB@", TOKEN_LEN)) buff = UNIT_GB; else if(!strncmp(&str_src[i], "@TB@", TOKEN_LEN)) buff = UNIT_TB; else MSG_ERROR(_("cannot find unit in '%s' string at position %i"), str_src, i); str_dst += buff; i += TOKEN_LEN; } else { /* Copy one character */ str_dst += str_src[i++]; } } return str_dst; } #undef TOKEN_LEN /* Get a string containing temperature with proper unit */ std::string string_with_temperature_unit(const double temp_celsius) { double temp; std::string unit; switch(Options::get_temp_unit()) { case FAHRENHEIT: unit = "°F"; temp = temp_celsius * 9/5 + 32; break; case KELVIN: unit = "K"; temp = temp_celsius + 273.15; break; case RANKINE: unit = "Ra"; temp = temp_celsius * 9/5 + 491.67; break; default: unit = "°C"; temp = temp_celsius; break; } std::string ret = string_format("%.2f", temp); ret += unit; MSG_DEBUG("string_format_temperature_unit: %.2f°C ==> %s", temp_celsius, ret.c_str()); return ret; } /* Open a file and put its content in a variable ('str' accept printf-like format) */ int fopen_to_str(std::string &out, const char *str, ...) { char *filename_str = NULL; std::string line; va_list aptr; out.clear(); va_start(aptr, str); vasprintf(&filename_str, str, aptr); va_end(aptr); MSG_DEBUG("fopen_to_str: opening '%s'", filename_str); std::ifstream file(filename_str); if(!file.is_open()) { MSG_ERROR(_("an error occurred while opening file '%s'"), filename_str); free(filename_str); return 1; } free(filename_str); while(std::getline(file, line)) out += line; file.close(); return 0; } template std::string fopen_to_str(const char *str, Args... args) { std::string buff; fopen_to_str(buff, str, args...); return buff; } /* Run a command and put output in a variable ('str' accept printf-like format) */ int popen_to_str(std::string &out, const char *str, ...) { char *cmd_tmp = NULL, *cmd_str = NULL; char buffer[MAXSTR]; FILE *pipe_descr = NULL; va_list aptr; out.clear(); va_start(aptr, str); vasprintf(&cmd_tmp, str, aptr); va_end(aptr); #ifdef FLATPAK asprintf(&cmd_str, "flatpak-spawn --host %s", cmd_tmp); free(cmd_tmp); #else cmd_str = cmd_tmp; #endif /* FLATPAK */ MSG_DEBUG("popen_to_str: running '%s'", cmd_str); pipe_descr = popen(cmd_str, "r"); if(pipe_descr == NULL) { MSG_ERROR(_("an error occurred while running command '%s'"), cmd_str); free(cmd_str); return 1; } free(cmd_str); while(fgets(buffer, MAXSTR, pipe_descr) != NULL) { buffer[strcspn(buffer, "\r\n")] = '\0'; out += buffer; } return pclose(pipe_descr); } /* Run a command and ignore output ('str' accept printf-like format) */ int run_command(const char *str, ...) { int ret; char *cmd_tmp = NULL, *cmd_str = NULL; va_list aptr; va_start(aptr, str); vasprintf(&cmd_tmp, str, aptr); va_end(aptr); #ifdef FLATPAK asprintf(&cmd_str, "flatpak-spawn --host %s", cmd_tmp); free(cmd_tmp); #else cmd_str = cmd_tmp; #endif /* FLATPAK */ MSG_DEBUG("run_command: running '%s'", cmd_str); ret = std::system(cmd_str); free(cmd_str); return ret; } /* Check if a file exists */ bool file_exists(const std::string& filename) { std::ifstream file(filename.c_str()); return file.good(); } /* Check if a command exists */ bool command_exists(const char *cmd) { char buff[MAXSTR]; snprintf(buff, MAXSTR, "command -v %s > /dev/null", cmd); return !std::system(buff); } /* Load a kernel module */ int load_module(const char *module, int *fd) { int ret = -1; const ssize_t len = std::strlen(module) + 1; const DaemonCommand cmd = LOAD_MODULE; #if defined (__linux__) ret = run_command("grep -wq %s /proc/modules 2> /dev/null", module); #elif defined (__DragonFly__) || defined (__FreeBSD__) || defined (__NetBSD__) || defined (__OpenBSD__) ret = run_command("kldstat | grep %s > /dev/null", module); #else # error "Unsupported operating system" #endif if((ret != 0) && (*fd >= 0)) { /* Send module name to daemon */ MSG_DEBUG("load_module: loading module %s", module); SEND_DATA(fd, &cmd, sizeof(DaemonCommand)); SEND_DATA(fd, &len, sizeof(ssize_t)); SEND_DATA(fd, module, len); /* Receive return value */ RECEIVE_DATA(fd, &ret, sizeof(int)); } return ret; } /* Change CPU affinity */ #if defined (__linux__) # include bool set_cpu_affinity(uint16_t logical_cpu) { cpu_set_t cpuset; CPU_ZERO(&cpuset); CPU_SET(logical_cpu, &cpuset); return sched_setaffinity(0, sizeof(cpuset), &cpuset) == 0; } /* endif defined (__linux__) */ #elif defined (__FreeBSD__) # include # include bool set_cpu_affinity(uint16_t logical_cpu) { cpuset_t cpuset; CPU_ZERO(&cpuset); CPU_SET(logical_cpu, &cpuset); return cpuset_setaffinity(CPU_LEVEL_WHICH, CPU_WHICH_TID, -1, sizeof(cpuset), &cpuset) == 0; } /* endif defined (__FreeBSD__) */ #elif defined (__DragonFly__) # include # include bool set_cpu_affinity(uint16_t logical_cpu) { cpuset_t cpuset; CPU_ZERO(&cpuset); CPU_SET(logical_cpu, &cpuset); return pthread_setaffinity_np(pthread_self(), sizeof(cpuset), &cpuset) == 0; } /* endif defined (__DragonFly__) */ #elif defined (__NetBSD__) # include # include bool set_cpu_affinity(uint16_t logical_cpu) { cpuset_t *cpuset; cpuset = cpuset_create(); cpuset_set((cpuid_t) logical_cpu, cpuset); int ret = pthread_setaffinity_np(pthread_self(), cpuset_size(cpuset), cpuset); cpuset_destroy(cpuset); return ret == 0; } /* endif defined (__NetBSD__) */ #else bool set_cpu_affinity(uint16_t logical_cpu) { static bool warning_printed = 0; if(!warning_printed) { MSG_WARNING("%s", _("set_cpu_affinity() not supported on this operating system")); warning_printed = 1; } return false; } #endif /* set_cpu_affinity defined */ /* Find system path for device to drm */ std::string get_device_path_drm(std::string device_path) { std::error_code fs_code; const fs::path drm_path(fs::path(device_path) / "drm"); const std::regex regex_card("card[[:digit:]]"); auto drm_path_it = fs::directory_iterator(drm_path, fs_code); auto find_it = std::find_if(drm_path_it, end(drm_path_it), [®ex_card](const auto& dir_entry) { return std::regex_search(dir_entry.path().string(), regex_card); }); const std::string ret = (find_it != end(drm_path_it)) ? find_it->path().string() : std::string(); MSG_DEBUG("get_device_path_drm: device_path=%s ==> %s", device_path.c_str(), ret.c_str()); return ret; } /* Find system path for device to hwmon */ std::string get_device_path_hwmon(std::string device_path) { std::error_code fs_code; const fs::path hwmon_path(fs::path(device_path) / "hwmon"); const std::regex regex_hwmon("hwmon[[:digit:]]"); auto hwmon_path_it = fs::directory_iterator(hwmon_path, fs_code); auto find_it = std::find_if(hwmon_path_it, end(hwmon_path_it), [®ex_hwmon](const auto& dir_entry) { return std::regex_search(dir_entry.path().string(), regex_hwmon); }); const std::string ret = (find_it != end(hwmon_path_it)) ? find_it->path().string() : std::string(); MSG_DEBUG("get_device_path_hwmon: device_path=%s ==> ret=%s", device_path.c_str(), ret.c_str()); return ret; } /* Find sensor path for CPU temperature depending on kernel driver */ std::string get_sensor_path_cpu_temperature_driver(uint16_t current_core_id) { std::error_code fs_code; const std::regex regex_filename_temp_in ("temp1_input"); const std::regex regex_filename_temp_lab("temp[[:digit:]]_label"); const std::regex regex_filename_in_in ("in1_input"); const std::regex regex_dirname_cardN ("card[[:digit:]]"); const std::regex regex_label_coreN ("Core[[:space:]]*" + std::to_string(current_core_id), std::regex::icase); const std::regex regex_label_tdie ("Tdie", std::regex::icase); const std::unordered_multimap>> drivers = { { "coretemp", { regex_filename_temp_lab, regex_label_coreN } }, // "Core 0: +33.0°C (high = +80.0°C, crit = +98.0°C)" { "k8temp", { regex_filename_temp_lab, regex_label_coreN } }, // "Core0 Temp: +64.0°C" { "k10temp", { regex_filename_temp_lab, regex_label_tdie } }, // "Tdie: +41.4°C" { "k10temp", { regex_filename_temp_in, std::nullopt } }, // "temp1: +29.5°C" { "zenpower", { regex_filename_temp_in, std::nullopt } }, // "Tdie: +67.9°C" }; /* Loop over all directories in SYS_HWMON */ for(auto const& dir_entry : fs::directory_iterator(SYS_HWMON, fs_code)) { /* Ignore drivers not in unordered_map */ const std::string driver_name = fopen_to_str("%s/name", dir_entry.path().string().c_str()); if(drivers.find(driver_name) == drivers.end()) continue; /* Look sensor matching pattern */ auto range = drivers.equal_range(driver_name); for(auto it = range.first; it != range.second; ++it) { const auto &pair = it->second; const std::regex ®ex_filename = pair.first; const std::optional ®ex_label = pair.second; for(auto const& dir_sub_entry : fs::directory_iterator{dir_entry.path()}) { std::string ret; std::string sensor_filename = dir_sub_entry.path().string(); /* Keep only files matching label filename */ if(!std::regex_search(sensor_filename, regex_filename)) continue; if(regex_label.has_value()) { std::smatch match_regex_label; const std::string label_content = fopen_to_str("%s", sensor_filename.c_str()); std::regex_search(label_content, match_regex_label, regex_label.value()); /* Return sensor filename if label content corresponds to expected value */ if(!match_regex_label.empty()) ret = std::regex_replace(sensor_filename, std::regex("_label"), "_input"); } else { /* Return sensor filename as is */ ret = sensor_filename; } if(!ret.empty()) { MSG_DEBUG("get_sensor_path_cpu_temperature_driver: current_core_id=%u ==> ret=%s", current_core_id, ret.c_str()); return ret; } } } } return std::string(); } /* Find sensor path for generic CPU temperature */ std::string get_sensor_path_cpu_temperature_generic() { std::error_code fs_code; const std::regex regex_filename_temp_lab("temp[[:digit:]]_label"); const std::regex regex_label_other ("CPU", std::regex::icase); /* Loop over all directories in SYS_HWMON */ for(auto const& dir_entry : fs::directory_iterator(SYS_HWMON, fs_code)) { for(auto const& dir_sub_entry : fs::directory_iterator{dir_entry.path()}) { /* Keep only files matching label filename */ std::smatch match_regex_filename; const std::string label_filename = dir_sub_entry.path().filename().string(); std::regex_search(label_filename, match_regex_filename, regex_filename_temp_lab); if(match_regex_filename.empty()) continue; std::smatch match_regex_label; const std::string label_content = fopen_to_str("%s", dir_sub_entry.path().string().c_str()); std::regex_search(label_content, match_regex_label, regex_label_other); /* Return sensor filename if label content corresponds to expected value */ if(!match_regex_label.empty()) { std::string ret = dir_sub_entry.path().parent_path().string(); ret += "/" + std::regex_replace(match_regex_filename.str(), std::regex("_label"), "_input"); MSG_DEBUG("get_sensor_path_cpu_temperature_generic: ret=%s", ret.c_str()); return ret; } } } return std::string(); } /* Find sensor path for CPU voltage */ std::string get_sensor_path_cpu_voltage(uint16_t current_core_id) { std::error_code fs_code; const std::unordered_map> drivers = { { "zenpower", { "in1", "SVI2_Core" } } // "SVI2_Core: 1.38 V" }; /* Loop over all directories in SYS_HWMON */ for(auto const& dir_entry : fs::directory_iterator(SYS_HWMON, fs_code)) { /* Ignore drivers not in unordered_map */ const std::string driver_name = fopen_to_str("%s/name", dir_entry.path().string().c_str()); if(drivers.find(driver_name) == drivers.end()) continue; /* Look sensor matching pattern */ const auto &pair = drivers.at(driver_name); const std::string input_filename = pair.first + "_input"; const std::string label_filename = pair.first + "_label"; const std::string label_exp_value = pair.second; for(auto const& dir_sub_entry : fs::directory_iterator{dir_entry.path()}) { /* Keep only files matching label filename */ if(dir_sub_entry.path().filename() != label_filename) continue; /* Return sensor filename if label content corresponds to expected value */ const std::string label_content = fopen_to_str("%s", dir_sub_entry.path().string().c_str()); if(label_content == label_exp_value) { std::string ret = dir_sub_entry.path().parent_path() / input_filename; MSG_DEBUG("get_sensor_path_cpu_voltage: current_core_id=%u ==> ret=%s", current_core_id, ret.c_str()); return ret; } } } return std::string(); } CPU-X-5.0.3/src/util.hpp000066400000000000000000000165471454622605200146530ustar00rootroot00000000000000/**************************************************************************** * Copyright © 2014-2024 The Tumultuous Unicorn Of Darkness * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * ****************************************************************************/ /* * PROJECT CPU-X * FILE util.hpp */ #ifndef _UTIL_HPP_ #define _UTIL_HPP_ #include #include #include #include "logger.hpp" #if HAS_GETTEXT # include #endif /* Software definition */ #define PRGNAME "CPU-X" #define PRGNAME_LOW "cpu-x" #define PRGAUTH "The Tumultuous Unicorn Of Darkness" #define PRGUSERNAME "thetumultuousunicornofdarkness" #define PRGURL "https://" PRGUSERNAME ".github.io/" PRGNAME #define ISSUEURL "https://github.com/" PRGUSERNAME "/" PRGNAME "/issues/new?template=bug_report.md" #define PRGCPRGHT "Copyright © 2014-2024 " PRGAUTH #define PRGLCNS "GNU GPL v3" #define LCNSURL "https://www.gnu.org/licenses/gpl.txt" /* Colors definition */ #define DEFAULT "\x1b[0m" #define BOLD_RED "\x1b[1;31m" #define BOLD_GREEN "\x1b[1;32m" #define BOLD_YELLOW "\x1b[1;33m" #define BOLD_BLUE "\x1b[1;34m" #define BOLD_MAGENTA "\x1b[1;35m" /* Utilities macro */ #define GOTO_ERROR(str) { error_str = str; goto error; } #define IS_ROOT (getuid() == 0) #define PRGINFO(out) fprintf(out, "%s %s%s (%s %s, %s %s, %s %s)\n", PRGNAME, PRGVER, GITREV, __DATE__, __TIME__, SYSTEM_NAME, SYSTEM_PROCESSOR, C_COMPILER_ID, __VERSION__) /* Formatted messages definition */ #define MSG_DEBUG(fmt, ...) Logger::log(LOG_DEBUG, false, string_format(fmt, __VA_ARGS__)) #define MSG_VERBOSE(fmt, ...) Logger::log(LOG_VERBOSE, false, string_format(fmt, __VA_ARGS__)) #define MSG_STDOUT(fmt, ...) Logger::log(LOG_STANDARD, false, string_format(fmt, __VA_ARGS__)) #define MSG_WARNING(fmt, ...) Logger::log(LOG_WARNING, false, string_format(fmt, __VA_ARGS__)) #define MSG_ERROR(fmt, ...) Logger::log(LOG_ERROR, false, string_format(fmt, __VA_ARGS__)) #define MSG_ERRNO(fmt, ...) Logger::log(LOG_ERROR, true, string_format(fmt, __VA_ARGS__)) #if HAS_GETTEXT # define _(msg) gettext(msg) #else # define _(msg) msg #endif /* HAS_GETTEXT */ #define N_(msg) msg /* Arrays definition */ #define MAXSTR 80 /* Max string */ #define UNIT_B _("bytes") /* SI unit prefixes */ // TRANSLATORS: initials for kilobyte (10³): please put initials (keep it short) #define UNIT_KB _("kB") // TRANSLATORS: initials for megabyte (10⁶): please put initials (keep it short) #define UNIT_MB _("MB") // TRANSLATORS: initials for gigabyte (10⁹): please put initials (keep it short) #define UNIT_GB _("GB") // TRANSLATORS: initials for terabyte (10¹²): please put initials (keep it short) #define UNIT_TB _("TB") /* Binary unit prefixes */ // TRANSLATORS: initials for kibibyte (2¹⁰): please put initials (keep it short) #define UNIT_KIB _("KiB") // TRANSLATORS: initials for mebibyte (2²⁰): please put initials (keep it short) #define UNIT_MIB _("MiB") // TRANSLATORS: initials for gibibyte (2³⁰): please put initials (keep it short) #define UNIT_GIB _("GiB") // TRANSLATORS: initials for tebibyte (2⁴⁰): please put initials (keep it short) #define UNIT_TIB _("TiB") /* Linux-specific paths definition */ #define SYS_DMI "/sys/devices/virtual/dmi/id" #define SYS_CPU "/sys/devices/system/cpu/cpu" #define SYS_DRM "/sys/class/drm/card" #define SYS_HWMON "/sys/class/hwmon" #define SYS_DEBUG "/sys/kernel/debug" #define SYS_DEBUG_DRI SYS_DEBUG"/dri" /* FreeBSD-specific paths definition */ #define DEV_PCI "/dev/pci" /* Devices vendor ID */ #define DEV_VENDOR_ID_AMD 0x1002 #define DEV_VENDOR_ID_INTEL 0x8086 #define DEV_VENDOR_ID_NVIDIA 0x10DE /* PrefixUnit class */ class PrefixUnit { public: enum Multipliers { MULT_NONE = 0, MULT_K = 1, MULT_M = 2, MULT_G = 3, MULT_T = 4, MULT_LAST = 5 }; bool init; const char *prefix; uint64_t divisor; PrefixUnit(); void find_best_si_prefix(uint64_t value, Multipliers multiplier); void find_best_binary_prefix(uint64_t value, Multipliers multiplier); private: void find_best_prefix(uint64_t value, Multipliers multiplier, bool use_si_prefixes); }; /* Functions */ /* Check if string can be converted to an unsigned integer */ bool is_unsigned_integer(const std::string &str); /* Return a formatted C++ string */ std::string string_format(const char *str, ...); /* Trim a C++ string from both ends */ void string_trim(std::string &str); /* Duplicate a string and set data size unit */ std::string string_set_size_unit(char *str_src); /* Get a string containing temperature with proper unit */ std::string string_with_temperature_unit(const double temp_celsius); /* Open a file and put its content in a variable ('str' accept printf-like format) */ int fopen_to_str(std::string &out, const char *str, ...); /* Run a command and put output in a variable ('str' accept printf-like format) */ int popen_to_str(std::string &out, const char *str, ...); /* Run a command and ignore output ('str' accept printf-like format) */ int run_command(const char *str, ...); /* Check if a file exists */ bool file_exists(const std::string& filename); /* Check if a command exists */ bool command_exists(const char *cmd); /* Load a kernel module (return 0 on success) */ int load_module(const char *module, int *fd); /* Change CPU affinity */ bool set_cpu_affinity(uint16_t logical_cpu); /* Find system path for device to drm */ std::string get_device_path_drm(std::string device_path); /* Find system path for device to hwmon */ std::string get_device_path_hwmon(std::string device_path); /* Find sensor path for CPU temperature depending on kernel driver */ std::string get_sensor_path_cpu_temperature_driver(uint16_t current_core_id); /* Find sensor path for generic CPU temperature */ std::string get_sensor_path_cpu_temperature_generic(); /* Find sensor path for CPU voltage */ std::string get_sensor_path_cpu_voltage(uint16_t current_core_id); /* Templates */ // https://stackoverflow.com/a/47072631 template int execvp_cpp(const char* file, const char* const (&argv)[N]) { assert((N > 0) && (argv[N - 1] == nullptr)); std::string args; for(int i = 0; const_cast(argv[i]) != nullptr; i++) args += std::string(const_cast(argv[i])) + " "; MSG_DEBUG("execvp: %s", args.c_str()); return execvp(file, const_cast(argv)); } #endif /* _UTIL_HPP_ */ CPU-X-5.0.3/tests/000077500000000000000000000000001454622605200135235ustar00rootroot00000000000000CPU-X-5.0.3/tests/CMakeLists.txt000066400000000000000000000003201454622605200162560ustar00rootroot00000000000000project(tests LANGUAGES NONE ) add_test(NAME test_awk_regex COMMAND "${CMAKE_CURRENT_SOURCE_DIR}/awk/test_regex.sh") add_test(NAME test_grep_regex COMMAND "${CMAKE_CURRENT_SOURCE_DIR}/grep/test_regex.sh") CPU-X-5.0.3/tests/awk/000077500000000000000000000000001454622605200143055ustar00rootroot00000000000000CPU-X-5.0.3/tests/awk/results/000077500000000000000000000000001454622605200160065ustar00rootroot00000000000000CPU-X-5.0.3/tests/awk/results/amdgpu_pm_info000066400000000000000000000000031454622605200207060ustar00rootroot0000000000000042 CPU-X-5.0.3/tests/awk/results/aticonfig-odgc-load000066400000000000000000000000031454622605200215140ustar00rootroot0000000000000077 CPU-X-5.0.3/tests/awk/results/aticonfig-odgc-mclk000066400000000000000000000000041454622605200215240ustar00rootroot00000000000000300 CPU-X-5.0.3/tests/awk/results/aticonfig-odgc-sclk000066400000000000000000000000041454622605200215320ustar00rootroot00000000000000157 CPU-X-5.0.3/tests/awk/results/aticonfig-odgt000066400000000000000000000000061454622605200206230ustar00rootroot0000000000000048.50 CPU-X-5.0.3/tests/awk/results/nvidia-settings-GPUCurrentClockFreqs-mclk000066400000000000000000000000041454622605200257300ustar00rootroot00000000000000405 CPU-X-5.0.3/tests/awk/results/nvidia-settings-GPUCurrentClockFreqs-sclk000066400000000000000000000000041454622605200257360ustar00rootroot00000000000000135 CPU-X-5.0.3/tests/awk/results/nvidia-settings-GPUUtilization000066400000000000000000000000031454622605200237170ustar00rootroot0000000000000033 CPU-X-5.0.3/tests/awk/results/pp_dpm_mclk000066400000000000000000000000041454622605200202100ustar00rootroot00000000000000300 CPU-X-5.0.3/tests/awk/results/pp_dpm_sclk000066400000000000000000000000041454622605200202160ustar00rootroot00000000000000900 CPU-X-5.0.3/tests/awk/results/radeon_pm_info-mclk000066400000000000000000000000071454622605200216310ustar00rootroot00000000000000150000 CPU-X-5.0.3/tests/awk/results/radeon_pm_info-sclk000066400000000000000000000000061454622605200216360ustar00rootroot0000000000000037500 CPU-X-5.0.3/tests/awk/results/radeon_pm_info-vddc000066400000000000000000000000041454622605200216200ustar00rootroot00000000000000950 CPU-X-5.0.3/tests/awk/samples/000077500000000000000000000000001454622605200157515ustar00rootroot00000000000000CPU-X-5.0.3/tests/awk/samples/amdgpu_pm_info000066400000000000000000000024721454622605200206650ustar00rootroot00000000000000Clock Gating Flags Mask: 0x3fbcf Graphics Medium Grain Clock Gating: On Graphics Medium Grain memory Light Sleep: On Graphics Coarse Grain Clock Gating: On Graphics Coarse Grain memory Light Sleep: On Graphics Coarse Grain Tree Shader Clock Gating: Off Graphics Coarse Grain Tree Shader Light Sleep: Off Graphics Command Processor Light Sleep: On Graphics Run List Controller Light Sleep: On Graphics 3D Coarse Grain Clock Gating: Off Graphics 3D Coarse Grain memory Light Sleep: Off Memory Controller Light Sleep: On Memory Controller Medium Grain Clock Gating: On System Direct Memory Access Light Sleep: Off System Direct Memory Access Medium Grain Clock Gating: On Bus Interface Medium Grain Clock Gating: Off Bus Interface Light Sleep: On Unified Video Decoder Medium Grain Clock Gating: On Video Compression Engine Medium Grain Clock Gating: On Host Data Path Light Sleep: On Host Data Path Medium Grain Clock Gating: On Digital Right Management Medium Grain Clock Gating: Off Digital Right Management Light Sleep: Off Rom Medium Grain Clock Gating: On Data Fabric Medium Grain Clock Gating: Off GFX Clocks and Power: 1000 MHz (MCLK) 472 MHz (SCLK) 600 MHz (PSTATE_SCLK) 1000 MHz (PSTATE_MCLK) 950 mV (VDDGFX) 35.114 W (average GPU) GPU Temperature: 35 C GPU Load: 42 % UVD: Disabled VCE: Disabled CPU-X-5.0.3/tests/awk/samples/aticonfig-odgc000066400000000000000000000004321454622605200205500ustar00rootroot00000000000000Adapter 1 - ATI Radeon HD 5700 Series Core (MHz) Memory (MHz) Current Clocks : 157 300 Current Peak : 900 1200 Configurable Peak Range : [500-1080] [1200-1450] GPU load : 77% CPU-X-5.0.3/tests/awk/samples/aticonfig-odgt000066400000000000000000000001501454622605200205660ustar00rootroot00000000000000Default Adapter - ATI Mobility Radeon HD 5000 Series Sensor 0: Temperature - 48.50 C CPU-X-5.0.3/tests/awk/samples/nvidia-settings-GPUCurrentClockFreqs000066400000000000000000000000101454622605200247440ustar00rootroot00000000000000135,405 CPU-X-5.0.3/tests/awk/samples/nvidia-settings-GPUUtilization000066400000000000000000000000471454622605200236720ustar00rootroot00000000000000graphics=33, memory=8, video=0, PCIe=0 CPU-X-5.0.3/tests/awk/samples/pp_dpm_mclk000066400000000000000000000000441454622605200201570ustar00rootroot000000000000000: 300Mhz * 1: 1000Mhz 2: 2235Mhz CPU-X-5.0.3/tests/awk/samples/pp_dpm_sclk000066400000000000000000000001361454622605200201670ustar00rootroot000000000000000: 300Mhz 1: 600Mhz 2: 900Mhz * 3: 1145Mhz 4: 1215Mhz 5: 1257Mhz 6: 1300Mhz 7: 1420Mhz CPU-X-5.0.3/tests/awk/samples/radeon_pm_info000066400000000000000000000001421454622605200206500ustar00rootroot00000000000000uvd vclk: 0 dclk: 0 power level 0 sclk: 37500 mclk: 150000 vddc: 950 vddci: 875 pcie gen: 3 CPU-X-5.0.3/tests/awk/test_regex.sh000077500000000000000000000040271454622605200170200ustar00rootroot00000000000000#!/bin/bash TEST_DIR="$(dirname "$(realpath "$0")")" # shellcheck disable=SC1090 source "$TEST_DIR/../common.sh" cd "$TEST_DIR/samples" || exit 255 tmp_dir="$(mktemp --tmpdir --directory CPU-X.XXXXXX)" for awk in gawk mawk nawk; do if [[ -z "$(command -v "$awk")" ]]; then continue fi $awk '/Sensor/ { print $5 }' aticonfig-odgt &> "$tmp_dir/aticonfig-odgt.$awk" $awk '/GPU Load/ { print $3 }' amdgpu_pm_info &> "$tmp_dir/amdgpu_pm_info.$awk" $awk -F '(: |Mhz)' '/\*/ { print $2 }' pp_dpm_sclk &> "$tmp_dir/pp_dpm_sclk.$awk" $awk -F '(: |Mhz)' '/\*/ { print $2 }' pp_dpm_mclk &> "$tmp_dir/pp_dpm_mclk.$awk" $awk '/GPU load/ { sub("%","",$4); print $4 }' aticonfig-odgc &> "$tmp_dir/aticonfig-odgc-load.$awk" $awk '/Current Clocks/ { print $4 }' aticonfig-odgc &> "$tmp_dir/aticonfig-odgc-sclk.$awk" $awk '/Current Clocks/ { print $5 }' aticonfig-odgc &> "$tmp_dir/aticonfig-odgc-mclk.$awk" $awk -F '(sclk: | mclk:)' 'NR==2 { print $2 }' radeon_pm_info &> "$tmp_dir/radeon_pm_info-sclk.$awk" $awk -F '(mclk: | vddc:)' 'NR==2 { print $2 }' radeon_pm_info &> "$tmp_dir/radeon_pm_info-mclk.$awk" $awk -F '(vddc: | vddci:)' 'NR==2 { print $2 }' radeon_pm_info &> "$tmp_dir/radeon_pm_info-vddc.$awk" $awk -F '[,= ]' '{ print $2 }' nvidia-settings-GPUUtilization &> "$tmp_dir/nvidia-settings-GPUUtilization.$awk" $awk -F '[,]' '{ print $1 }' nvidia-settings-GPUCurrentClockFreqs &> "$tmp_dir/nvidia-settings-GPUCurrentClockFreqs-sclk.$awk" $awk -F '[,]' '{ print $2 }' nvidia-settings-GPUCurrentClockFreqs &> "$tmp_dir/nvidia-settings-GPUCurrentClockFreqs-mclk.$awk" done cd "$tmp_dir" || exit 255 failed=0 for res_file in *; do exp_file="$TEST_DIR/results/$(basename "${res_file%.*}")" printf "%-50s: " "$res_file" if cmp --quiet "$exp_file" "$res_file"; then success "OK" else error "KO" "(got '$(< "$res_file")', wanted '$(< "$exp_file")')" ((failed++)) fi done summary "$failed" rm -rf "$tmp_dir" CPU-X-5.0.3/tests/common.sh000066400000000000000000000005401454622605200153460ustar00rootroot00000000000000#!/bin/bash success() { local msg="$1" local details="$2" echo -e "\033[1;32m$msg\033[0m $details" } error() { local msg="$1" local details="$2" echo -e "\033[1;31m$msg\033[0m $details" } summary() { local failed=$1 echo if [[ $failed -eq 0 ]]; then success "All tests passed!" else error "$failed tests failed." fi exit "$failed" } CPU-X-5.0.3/tests/grep/000077500000000000000000000000001454622605200144605ustar00rootroot00000000000000CPU-X-5.0.3/tests/grep/results/000077500000000000000000000000001454622605200161615ustar00rootroot00000000000000CPU-X-5.0.3/tests/grep/results/nouveau_pstate_first_core000066400000000000000000000000041454622605200233570ustar00rootroot00000000000000405 CPU-X-5.0.3/tests/grep/results/nouveau_pstate_first_memory000066400000000000000000000000041454622605200237370ustar00rootroot00000000000000838 CPU-X-5.0.3/tests/grep/results/nouveau_pstate_forced_core000066400000000000000000000000041454622605200234720ustar00rootroot00000000000000900 CPU-X-5.0.3/tests/grep/results/nouveau_pstate_forced_memory000066400000000000000000000000051454622605200240530ustar00rootroot000000000000004000 CPU-X-5.0.3/tests/grep/samples/000077500000000000000000000000001454622605200161245ustar00rootroot00000000000000CPU-X-5.0.3/tests/grep/samples/nouveau_pstate_first000066400000000000000000000002641454622605200223220ustar00rootroot0000000000000007: core 270-405 MHz memory 838 MHz 0a: core 270-900 MHz memory 1560 MHz 0e: core 270-900 MHz memory 4000 MHz 0f: core 270-900 MHz memory 5016 MHz AC: core 405 MHz memory 5016 MHz CPU-X-5.0.3/tests/grep/samples/nouveau_pstate_forced000066400000000000000000000002741454622605200224360ustar00rootroot0000000000000007: core 270-405 MHz memory 838 MHz 0a: core 270-900 MHz memory 1560 MHz 0e: core 270-900 MHz memory 4000 MHz AC DC * 0f: core 270-900 MHz memory 5016 MHz AC: core 405 MHz memory 5016 MHz CPU-X-5.0.3/tests/grep/test_regex.sh000077500000000000000000000014061454622605200171710ustar00rootroot00000000000000#!/bin/bash TEST_DIR="$(dirname "$(realpath "$0")")" # shellcheck disable=SC1090 source "$TEST_DIR/../common.sh" cd "$TEST_DIR" || exit 255 failed=0 for samplefile in samples/nouveau_pstate_*; do file=$(basename "$samplefile") pstate=$(grep '\*' "$samplefile" || sed -n 1p "$samplefile") samplecore=$(echo "$pstate" | grep -oP '(?<=core )[^ ]*' | cut -d- -f2) samplememory=$(echo "$pstate" | grep -oP '(?<=memory )[^ ]*') resultcore=$(< "results/${file}_core") resultmemory=$(< "results/${file}_memory") printf "%-41s: " "$file" if [[ "$samplecore" == "$resultcore" ]] && [[ "$samplememory" == "$resultmemory" ]]; then success "OK" else error "KO" "(got $samplecore/$samplememory, wanted $resultcore/$resultmemory)" ((failed++)) fi done summary "$failed" CPU-X-5.0.3/vagrant/000077500000000000000000000000001454622605200140235ustar00rootroot00000000000000CPU-X-5.0.3/vagrant/Vagrantfile000066400000000000000000000036671454622605200162240ustar00rootroot00000000000000VAGRANTFILE_API_VERSION = "2" VM_CPU = "2" VM_MEMORY = "4096" vms = { "ubuntu/jammy64" => { :name => "jammy", :bootstrap => "ubuntu" }, "fedora/38-cloud-base" => { :name => "fedora", :bootstrap => "fedora" } } Vagrant.configure(VAGRANTFILE_API_VERSION) do |config| config.ssh.disable_deprecated_algorithms = true if Vagrant.has_plugin?("vagrant-vbguest") then config.vbguest.iso_path = "/usr/lib/virtualbox/additions/VBoxGuestAdditions.iso" config.vbguest.auto_update = false config.vbguest.no_remote = true end vms.each_with_index do |(box, info), index| config.vm.define info[:name] do |node| node.vm.box = box node.vm.hostname = info[:name] node.vm.synced_folder ".", "/vagrant", disabled: true #node.vm.synced_folder '../', '/home/vagrant/CPU-X' #node.vm.provision :shell, path: "bootstrap_" + info[:bootstrap] + ".sh" if Vagrant.has_plugin?("vagrant-proxyconf") node.proxy.http = ENV['HTTP_PROXY'] || ENV['http_proxy'] || "" node.proxy.https = ENV['HTTPS_PROXY'] || ENV['https_proxy'] || "" node.proxy.no_proxy = $no_proxy end node.vm.provider :virtualbox do |vb, override| vb.name = info[:name] vb.cpus = VM_CPU vb.memory = VM_MEMORY vb.gui = true vb.customize ["modifyvm", :id, "--vram", "128", "--clipboard-mode=bidirectional", "--drag-and-drop=bidirectional"] vb.customize ["setextradata", "global", "GUI/Customizations", "noMenuBar"] node.vm.provision :shell, reboot: true, env: {"HOST_LANG" => ENV['LANG']}, path: "bootstrap_common.sh", args: "virtualbox" end node.vm.provider :libvirt do |libvirt, override| libvirt.cpus = VM_CPU libvirt.memory = VM_MEMORY libvirt.loader = "/usr/share/edk2/x64/OVMF.4m.fd" libvirt.disk_driver :cache => 'none' node.vm.provision :shell, reboot: true, env: {"HOST_LANG" => ENV['LANG']}, path: "bootstrap_common.sh", args: "libvirt" end end end end CPU-X-5.0.3/vagrant/bootstrap_common.sh000077500000000000000000000047011454622605200177510ustar00rootroot00000000000000#!/bin/bash PROVIDER="$1" source /etc/os-release if [[ "$ID" == "ubuntu" ]]; then export DEBIAN_FRONTEND=noninteractive sed -i 's/1/0/g' /etc/apt/apt.conf.d/20auto-upgrades apt-get update -y apt-get upgrade -y apt-get install -y --no-install-recommends ubuntu-desktop unity-lens-applications unity-lens-files fonts-inconsolata gdm3 gnome-terminal firefox dbus-x11 console-data case "$PROVIDER" in virtualbox) apt-get install -y --no-install-recommends virtualbox-guest-utils virtualbox-guest-x11;; libvirt) apt-get install -y --no-install-recommends qemu-guest-agent spice-vdagent; systemctl enable qemu-guest-agent;; esac echo "/usr/sbin/gdm3" > /etc/X11/default-display-manager systemctl enable --now gdm3.service DEBCONF_NONINTERACTIVE_SEEN=true dpkg-reconfigure gdm3 echo "set shared/default-x-display-manager gdm3" | debconf-communicate GDM_CONFIG_DIR="/etc/gdm3" GDM_DEFAULT_SESSION="Ubuntu" elif [[ "$ID" == "fedora" ]]; then dnf update -y dnf -y group install GNOME --allowerasing dnf install -y levien-inconsolata-fonts firefox xdg-user-dirs dbus-x11 polkit-gnome gnome-tweak-tool case "$PROVIDER" in virtualbox) dnf install -y virtualbox-guest-additions;; libvirt) dnf install -y qemu-guest-agent spice-vdagent; systemctl enable qemu-guest-agent;; esac usermod -a -G wheel vagrant GDM_CONFIG_DIR="/etc/gdm" GDM_DEFAULT_SESSION="GNOME" else echo "$ID not supported." > /dev/stderr exit 1 fi # System settings localectl set-keymap "${HOST_LANG//[_.]*/}" if ! grep -q "127.0.0.1 $(hostname)" /etc/hosts; then echo "127.0.0.1 $(hostname)" >> /etc/hosts fi # Autologin to GDM mkdir -pv "$GDM_CONFIG_DIR" cat > "$GDM_CONFIG_DIR/custom.conf" << EOF [daemon] AutomaticLogin=vagrant AutomaticLoginEnable=True DefaultSession=$GDM_DEFAULT_SESSION EOF systemctl set-default graphical.target systemctl restart gdm # Vagrant user passwd --delete vagrant su - vagrant -c "xdg-user-dirs-update --force" su - vagrant -c "dbus-launch gsettings set org.gnome.desktop.input-sources sources '[]'" su - vagrant -c "dbus-launch gsettings set org.gnome.desktop.screensaver lock-enabled false" su - vagrant -c "dbus-launch gsettings set org.gnome.desktop.session idle-delay 0" su - vagrant -c "dbus-launch gsettings set org.gnome.desktop.lockdown disable-lock-screen true" su - vagrant -c "dbus-launch gsettings set org.gnome.desktop.interface monospace-font-name 'Inconsolata Regular 12'" su - vagrant -c "echo yes > /home/vagrant/.config/gnome-initial-setup-done"