pax_global_header00006660000000000000000000000064144332062520014513gustar00rootroot0000000000000052 comment=31137155adb25a2e3a80de83b09e723dc2d78f4a amberol-0.10.3/000077500000000000000000000000001443320625200132155ustar00rootroot00000000000000amberol-0.10.3/.editorconfig000066400000000000000000000006721443320625200156770ustar00rootroot00000000000000# SPDX-FileCopyrightText: 2022 Emmanuele Bassi # SPDX-License-Identifier: CC0-1.0 root = true [*] charset = utf-8 end_of_line = lf trim_trailing_whitespace = true insert_final_newline = true indent_style = space indent_size = 4 [*.css] indent_size = 2 [*.ui] indent_size = 2 [*.{xml,xml.in,xml.in.in}] indent_size = 2 [meson.build] indent_size = 2 [*.md] max_line_length = 80 trim_trailing_whitespace = false [*.json] indent_size = 4 amberol-0.10.3/.gitignore000066400000000000000000000000371443320625200152050ustar00rootroot00000000000000*.json~ src/config.rs target amberol-0.10.3/.gitlab-ci.yml000066400000000000000000000015571443320625200156610ustar00rootroot00000000000000include: - project: 'gnome/citemplates' file: 'flatpak/flatpak-ci-initiative-sdk-extensions.yml' # ref: '' stages: - check - test - deploy flatpak: extends: ".flatpak" variables: APP_ID: "io.bassi.Amberol.Devel" BUNDLE: "io.bassi.Amberol.Devel.flatpak" FLATPAK_MODULE: "amberol" MANIFEST_PATH: "io.bassi.Amberol.json" RUNTIME_REPO: "https://nightly.gnome.org/gnome-nightly.flatpakrepo" rust-fmt: image: "registry.gitlab.com/alatiera/rustfmt-oci-image/rustfmt:stable" stage: "check" needs: [] script: - echo -e "" > src/config.rs - rustc -Vv && cargo -Vv - cargo --version - cargo fmt --all -- --check reuse: image: fedora:latest stage: "check" needs: [] before_script: - export PATH="$HOME/.local/bin:$PATH" - dnf install -y python3-pip script: - pip install --user reuse - reuse lint amberol-0.10.3/.reuse/000077500000000000000000000000001443320625200144165ustar00rootroot00000000000000amberol-0.10.3/.reuse/dep5000066400000000000000000000036201443320625200151770ustar00rootroot00000000000000Format: https://www.debian.org/doc/packaging-manuals/copyright-format/1.0/ Upstream-Name: amberol Upstream-Contact: Emmanuele Bassi Source: https://gitlab.gnome.org/ebassi/amberol Files: .gitignore Copyright: 2022 Emmanuele Bassi License: CC0-1.0 Files: .gitlab-ci.yml Copyright: 2022 Emmanuele Bassi License: CC0-1.0 Files: amberol.doap Copyright: 2022 Sophie Herold License: CC0-1.0 Files: Cargo.lock Copyright: 2022 Emmanuele Bassi License: GPL-3.0-or-later Files: README.md CONTRIBUTING.md CHANGES.md RELEASING.md Copyright: 2022 Emmanuele Bassi License: CC0-1.0 Files: io.bassi.Amberol.json Copyright: 2022 Emmanuele Bassi License: CC0-1.0 Files: io.bassi.Amberol.Devel.json Copyright: 2022 Emmanuele Bassi License: CC0-1.0 Files: data/io.bassi.Amberol.appdata.xml.in.in Copyright: 2022 Emmanuele Bassi License: CC0-1.0 Files: data/io.bassi.Amberol.desktop.in.in Copyright: 2022 Emmanuele Bassi License: CC0-1.0 Files: data/io.bassi.Amberol.gschema.xml Copyright: 2022 Emmanuele Bassi License: CC0-1.0 Files: data/io.bassi.Amberol.service.in Copyright: 2022 Emmanuele Bassi License: CC0-1.0 Files: data/screenshots/*.png Copyright: 2022 Emmanuele Bassi License: CC0-1.0 Files: data/icons/hicolor/scalable/apps/io.bassi.Amberol.* Copyright: 2022 Jakub Steiner License: CC-BY-SA-3.0 Files: data/icons/hicolor/symbolic/apps/io.bassi.Amberol.* Copyright: 2022 Jakub Steiner License: CC-BY-SA-3.0 Files: *.svg Copyright: 2022 Emmanuele Bassi License: CC-BY-SA-3.0 Files: po/POTFILES.in po/LINGUAS Copyright: 2022 Emmanuele Bassi License: CC0-1.0 Files: po/*.po Copyright: 2022 Translation authors License: GPL-3.0-or-later Files: src/amberol.gresource.xml Copyright: 2022 Emmanuele Bassi License: GPL-3.0-or-later Files: src/gtk/*.ui Copyright: 2022 Emmanuele Bassi License: GPL-3.0-or-later Files: src/gtk/style.css src/gtk/style-hc.css Copyright: 2022 Emmanuele Bassi License: GPL-3.0-or-later amberol-0.10.3/.rustfmt.toml000066400000000000000000000004771443320625200157040ustar00rootroot00000000000000# SPDX-FileCopyrightText: 2022 Emmanuele Bassi # SPDX-License-Identifier: CC0-1.0 condense_wildcard_suffixes = true format_code_in_doc_comments = true group_imports = "StdExternalCrate" imports_granularity = "Crate" newline_style = "Unix" normalize_comments = true normalize_doc_attributes = true wrap_comments = true amberol-0.10.3/.typos.toml000066400000000000000000000002031443320625200153410ustar00rootroot00000000000000# SPDX-FileCopyrightText: 2022 Emmanuele Bassi # SPDX-License-Identifier: CC0-1.0 [files] extend-exclude = ["LICENSES/*", "po/*"] amberol-0.10.3/CHANGES.md000066400000000000000000000327321443320625200146160ustar00rootroot00000000000000# Changes All notable changes to this project will be documented in this file. ## [Unreleased] ### Added ### Changed ### Fixed ### Removed ## [0.10.3] - 2023-05-23 ### Changed - Translation updates - Hebrew - Polish - Finnish - Portuguese - Russian - German ### Fixed - Resize the waveform view when interpolating states - Fix cover art scaling [#324] - Fix deprecation warnings at build time ## [0.10.2] - 2023-04-28 ### Changed - Use a better icon for the drop overlay [!135] - Translation updates - Galician - Slovenian - Hungarian - Swedish - Turkish - Indonesian - French - Occitan ### Fixed - Crash when adjusting volume while in background [#317] - Crash when adding folder after sending app to the background [#319] ## [0.10.1] - 2023-04-25 ### Fixed - Background playback doesn't work [#314] ## [0.10.0] - 2023-04-24 ### Added - Allow restoring the playlist from the previous session [!120] - Allow disabling background playback - Add control to quickly muting/unmuting the audio - Enable ashpd on FreeBSD [!130] - New translations - Belarusian - French - Korean - Friulan - Czech ### Changed - Update the dependency to the gtk-rs bindings - Update the dependency to ashpd - Update the dependency to lofty - Use consistent labelling for adding single songs [#270] - Use consistent terms for songs and playlist [#301] - Improve rendering of cover art [#310] - Separate the volume bar from the waveform display - Translation updates - Ukrainian - German - Slovenian - Portuguese - Brazilian Portuguese - Georgian - Russian - Croatian - Danish - Turkish - Swedish - Hebrew - Polish - Indonesian - Occitan - Lithuanian - Occitan - Galician - Finnish - Basque - Korean - Persian - Spanish - Hungarian - Serbian ### Fixed - Reset the playlist position when searching [!117] - Use HIG-compliant capitalization in the shortcuts view [!115] - Narrow playlist view [#230] - Do not add duplicate songs to the playlist [#248] - Update next track button state depending on repeat mode [!114] - Fix styling of the search bar [#266] - Stop waveform pipeline when dropping the generator [!107] - Change the ReplayGain menu translatable context [#281] - Always draw last bar in waveform view [!127] - Fix waveform overdrawing in RTL layout [!128] - Fix waveform overdrawing [!124] - Improve the readability of the drop overlay [#288] ### Removed ## [0.9.2] - 2022-12-10 ### Added - Allow continuous seeking on the waveform widget [#99] - New translations - Icelanding - Hungarian - British English - Greek ### Changed - Use new about window from libadwaita - Update build to use Cargo directly without a wrapper - Update the dependency on lofty to 0.9.0 - Translation updates - Finnish - Persian - Portuguese - Turkish - Chinese (China) - Italian - Swedish - Brazilian Portuguese - Danish - Occitan - Slovenian - Hebrew - Indonesian - German - Russian - Serbian - Basque - Georgian - Dutch ### Fixed - Recolor the folded playlist background - Check for more file names for external covers [#247] - Force the direction of the primary menu - Remove toast for failed background portal requests - Fully animate waveform between tracks [#254] ## [0.9.1] - 2022-08-30 ### Added - Add ReplayGain support [#75] - Show hours to the playlist time - Support external cover art files [#14] - Add playing indicator in selection mode [#227] - New translations - Serbian ### Changed - Stabilise the shuffling behaviour [!104, #207] - Update the version of lofty [#216] - Translation updates - Russian - Portuguese - Persian - Polish - Ukrainian - Basque - Turkish - Italian - Finnish - Croatian - Occitan ### Fixed - Clarify the notification text for unavailable files [#215] - Increase specificity of the cover art UUID - Make the playlist side bar narrower [#230] - Check for unsigned overflow [#223] - Properly mark playlist remaining time for translation [#225] ### Removed - Remove the "sound" keyword from the desktop file [#224] ## [0.9.0] - 2022-08-05 ### Added - Add key shortcut for toggling playlist shuffle [!94] - Add fuzzy search to the playlist [!96] - New translations - Catalan - Lithuanian - Georgian - Italian ### Changed - Only list audio MIME types supported by lofty - Update the version of lofty we depend on - Translation updates - Swedish - Portuguese - Basque - Russian - Polish - Persian - Ukrainian - Dutch - German - Indonesian - Chinese (China) - Hebrew - Brazilian Portuguese - Occitan - Finnish ### Fixed - Add the directory MIME type to the list of supported typs [#202] - Explicitly remove action bar background [!95] - Make sure to maintain aspect ratio of cover art pixbuf [#208] ### Removed - Remove MIME type associations for unsupported file types ## [0.8.1] - 2022-06-24 ### Added - New translations - Danish ### Changed - Use the appropriate wording and style for tooltips [!89] - Require version 0.4.8 of the gtk4 crate [!90] - Translation updates - Ukrainian - German - Hebrew - Russian - Polish - Swedish - Occitan - Portuguese - Chinese (China) ### Fixed - Allow selecting multiple files and folders [#71] - Fix improper MPRIS reporting when paused [#201] - Fix panic on playback state change with no window [!91] - Maintain the playlist panel's width [#190] - Use the display name as the song base UUID [#198] - Handle nested dist folders properly - Let Amberol run in the background without a window [!83] - Sort files like Nautilus when adding a folder [#187] ## [0.8.0] - 2022-06-17 ### Added - Implement playlist search [#178] - Restore the window state [!79] - Support building and running on macOS [#179] - Add cover cache object [!74] - Allow running Amberol in the background [!72] - New translations - Finnish - Portuguese - Nepali ### Changed - Flip the waveform channels [!76] - Notify the user when drag and drop gives us no files [#175] - Update the dependency on lofty [#172] - Translation updates - Polish - Ukrainian - Swedish - Hebrew - Brazilian Portuguese - German - Basque - Occitan - Persian - Russian - Chinese (China) ### Fixed - Reset the player state when removing its last song [#170] - Disable queue.clear action while adding songs [#163] - Mark file selection dialog titles for translation [#164] - Start playing when selecting the current row - Set min-height for the song details [#155] - Restore queue actions once loading ends [#160] ### Removed ## [0.7.0] - 2022-06-03 ### Added - Show the current song in the window title - Add a warning for failed cover art loading - Show toast when adding a single song [#136] - New translation - Slovenian ### Changed - Change the currently playing song indicator [#74] - Improve vertical spacing of playback controls [!70] - Make the shuffle model more predictable [!67] - Refine the app icon [!66] - Rework waveform colors [#119] - Tweak the cover art style in the playlist [!63, #147] - Use a single suggested action button [#145] - Adjust scale and progress bar styles [#146] - Translation updates - German - Polish - Ukrainian - Swedish - Russian - Turkish - Hebrew - Dutch ### Fixed - Do not change position when scrubbing without a song [#151] - Fix double select on playlist end [#149] - Notify if no files/folders were selected [#148] - Add a check for MPRIS cover art - Fix handling cleared queues [#138] - Use a weak reference when loading songs [#140] - Update playlist length when removing a single song - Switch window mode when opening a file ## [0.6.3] - 2022-05-21 ### Added - Add translations: - German ### Changed - Translation updates: - Swedish ### Fixed - Fix drag and drop on the initial landing page [!62] ## [0.6.2] - 2022-05-20 ### Added - Add "copy song details to clipboard" [!53] - Add a cache for the waveforms, to speed up loading on songs we have already seen [#131] - Add accessibility information to various custom widgets - Add translations: - Chinese (China) ### Changed - Add whole folder at once [!30] - Provide user feedback during loading [!54] - Translation updates: - Swedish - Ukrainian - Occitan - Basque - Turkish - Polish - Russian - Persian ### Fixed - Ensure that the remaining time sign is consistent in RTL locales [#118] - Improve the UI consistency when clearing the playlist - Apply darkening to the playlist view unconditionally [#128] - Fix the playlist end state [#132] - Fix key navigation [#130] ## [0.6.1] - 2022-05-09 ### Added - Add translations for: - Dutch - Indonesian - Occitan - Spanish ### Changed - Make the cover art image slightly bigger - Update translations for: - Ukrainian - Swedish - Polish - Persian ### Fixed - Improve the appearance of the initial landing page [#106] - Stabilise the width of the playlist panel [#110] - Rely on gdk-pixbuf instead of lofty for image format detection [#111] - Multiple papercut style fixes [#105, #108] - Fix selector for playlist background when folded [#107] ## [0.6.0] - 2022-05-06 ### Added - Use a selection mode for the playlist management [#81] - Allow disabling UI recoloring - Expose more song state through MPRIS - Add better error messages in the UI - Support RTL text direction in the waveform widget - Add translations for: - Russian - Turkish - Brazilian Portuguese - Hebrew - Galician - Swedish - Basque - Persian - Ukrainian - Polish ### Changed - Reset to the initial state when clearing the playlist [#101] - Tone down the recoloring to improve legibility of text and controls [#97] - Recolor only the main window [#104] - Use better icon for playlist toggle button [#102] - Use the cover art palette for the waveform view accent color [#61] - Set the minimum and maximum width for the playlist view [#93] ### Fixed - Fix the background recoloring gradient to use the whole cover art palette - Reset the waveform generator and view on failure [#57] - Darken the playlist background when unfolded [#85] - Improve the tooltips for playback controls [#69] - Fix extra spacing in the playlist view [#98] - Fix elapsed song time in RTL locales [#95] - Remove missing shortcuts from the shortcuts dialog [#96] ## [0.5.0] - 2022-04-29 ### Added - Improve fallback paths for song metadata ### Changed - Move the playlist side panel to the left of the playback controls [#50] - Make sure that the remove button in the playlist rows is accessible without hovering ### Fixed - Align the waveform to the pixel grid [#76] ### Removed - Drop the seek buttons, and rely on the waveform control [#59] ## [0.4.3] - 2022-04-26 ### Added - Add scrolling support to the volume control [#50] ### Fixed - Fix behaviour of the waveform with short songs and avoid overdrawing [#68] - Make the waveform control more legible [#52] - Reset the shuffle state when clearing the playlist [#60] - Keep the playlist visibility, folded or unfolded, in sync with the toggle button that controls it [#55] - Fix a crash when manually advancing through the playlist [#54] ## [0.4.2] - 2022-04-22 ### Fixed - Fix the fallback cover art in the playlist ## [0.4.1] - 2022-04-22 ### Fixed - Don't skip songs without a cover art [#46] - Clean up unnecessary overrides [Bilal Elmoussaoui, !32] ## [0.4.0] - 2022-04-22 ### Added - Add waveform display and quick navigation - Allow queueing folders recursively - Add initial status page at startup [#27] - Add remove button to the playlist [#40] - Show cover art in the playlist ### Changed - Allow adding folders via drag and drop [#17] - Allow shuffling only when the playlist contains more than one song [#15] - Style the popover using a similar background as the main window [#12] - Small style tweaks for the recoloring - Reduce the height of the full window to fit in 768p displays [#16] - Make the layout more mobile friendly [#28] - Ship our own icon assets ### Fixed - Fix an assertion failure when reaching the end of a shuffled playlist - Scroll playlist to the current song [#29] - Update dependency on lofty for m4a support [#22] - Add divider above scrolling playlist [#26] - Fix styling of the missing cover fallback image [#36] - Set the album art metadata for MPRIS [#13] ## [0.3.0] - 2022-04-15 ### Added - Allow shuffling the contents of the playlist - Support dropping multiple files - Volume control - Allow Amberol to be set as the default application for Music in the GNOME Settings ### Changed - Miscellaneous cleanups [Christopher Davis, !10] - Use idiomatic Rust as suggested by Clippy - Improve handling the end of playlist state - Skip songs that cannot be queried for metadata - Switch to a portrait layout ### Fixed - Stop playback when clearing the playlist - Immediately play the song selected from the playlist - Use the appropriate color format for the texture data [#7] - Use the proper fallback asset for albums with no cover - Start playing when opening a file [#8] ## [0.2.1] - 2022-04-11 ### Changed - Style tweaks [Jakub Steiner, !9] ### Fixed - Handle songs with unset fields without panicking ## [0.2.0] - 2022-04-11 ### Added - Inhibit system suspend when playing ### Changed - Tweak the behaviour of the window when toggling the playlist - Improve the style of the window [Alexander Mikhaylenko, !7] - Deal with margins and padding - Style the playlist list view - Style the drag overlay ## [0.1.0] - 2022-04-08 Initial alpha release for Amberol ### Added - Basic playback - Playlist control: - Add single file - Add folder - Drag and drop - Support opening files from the CLI - Recolor the UI using the cover art palette amberol-0.10.3/CONTRIBUTING.md000066400000000000000000000154571443320625200154620ustar00rootroot00000000000000# Contribution guidelines Thank you for considering contributing to the Amberol project! Following these guidelines helps to communicate that you respect the time of the developers managing and developing this free software project. In return, they should reciprocate that respect in addressing your issue, assessing changes, and helping you finalize your pull requests. There are many ways to contribute, from improving the documentation, submitting bug reports and feature requests, localizing the user interface, or writing code which can be incorporated into Amberol itself. The issue tracker is meant to be used for actionable issues only. Please, don't use the issue tracker for support questions. Feel free to use the [GNOME Discourse forum](https://discourse.gnome.org) to ask your questions. ## How to report bugs Issues should only be reported [on the project page](https://gitlab.gnome.org/Amberol/issues/). ### Bug reports If you're reporting a bug make sure to list: 0. which version of Amberol are you using? 0. which operating system are you using? 0. how did you install Amberol? 0. the necessary steps to reproduce the issue 0. the expected outcome 0. a description of the behavior; screenshots are also welcome If the issue includes a crash, you should also include: 0. the eventual warnings printed on the terminal 0. a backtrace, obtained with tools such as GDB or LLDB It is fine to include screenshots of screen recordings to demonstrate an issue that is best to understand visually, but please don't just attach screen recordings without further details into issues. It is essential that the problem is described in enough detail to reproduce it without watching a video. For small issues, such as: - spelling/grammar fixes in the documentation - typo correction - comment clean ups - changes to metadata files (CI, `.gitignore`) - build system changes - source tree clean ups and reorganizations You should directly open a merge request instead of filing a new issue. ### Security issues If you have a security issue, please mark it as confidential in the issue tracker, to ensure that only the maintainers can see it. ### Features and enhancements Feature discussion can be open ended and require high bandwidth channels; if you are proposing a new feature on the issue tracker, make sure to make an actionable proposal, and list: 0. what you're trying to achieve 0. prior art, in other applications 0. design and theming changes When in doubt, you should open an issue to discuss your changes and ask questions before opening your code editor and hacking away; this way you'll get feedback from the project maintainers, if they have any, and you will avoid spending unnecessary effort. ## Your first contribution ### Prerequisites If you want to contribute to the Amberol project, you will need to have the development tools appropriate for your operating system, including: - Python 3.x - Meson - Ninja - the Rust compiler - Cargo ### Dependencies You will also need the various dependencies needed to build Amberol from source. You will find the compile time dependencies in the [`Cargo.toml`](./Cargo.toml) file, while the run time dependencies are listed in the [`meson.build`](./meson.build) file. You are strongly encouraged to use GNOME Builder to build and run Amberol, as it knows how to download and build all the dependencies necessary. ### Getting started You should start by forking the Amberol repository from the GitLab web UI; then you can select *Clone Repository* from GNOME Builder and use your fork's URL as the repository URL. GNOME Builder will find all the dependencies and download them for you. ---- If you want to use another development environment, you will need to clone the repository manually: ```sh $ git clone git@gitlab.gnome.org:yourusername/amberol.git $ cd amberol ``` To compile the Git version of GTK on your system, you will need to configure your build using Meson: ```sh $ meson setup _builddir . $ meson compile -C _builddir ``` Meson will search for all the required dependencies during the setup step, and will run Cargo in the compile step. You can run Amberol uninstalled by using the Meson devenv command: ```sh $ meson devenv -C _builddir $ ./src/amberol $ exit ``` ---- You can now switch to a new branch to work on Amberol: ```sh $ git switch -C your-branch ``` Once you've finished working on the bug fix or feature, push the branch to your Git repository and open a new merge request, to let the Amberol maintainers review your contribution. Remember that the Amberol is maintained by volunteers, so it might take a little while to get reviews or feedback. Don't be discouraged, and feel free to join the `#amberol:gnome.org` channel on Matrix for any issue you may find. ### Coding style Amberol uses the standard Rust coding style. You can use: cargo +nightly fmt --all To ensure that your contribution is following the expected format. Amberol has an additional set of checks available in the [`checks.sh`](./build-aux/checks.sh) tool. ### Commit messages The expected format for git commit messages is as follows: ```plain Short explanation of the commit Longer explanation explaining exactly what's changed, whether any external or private interfaces changed, what bugs were fixed (with bug tracker reference if applicable) and so forth. Be concise but not too brief. Closes #1234 ``` - Always add a brief description of the commit to the _first_ line of the commit and terminate by two newlines (it will work without the second newline, but that is not nice for the interfaces). - First line (the brief description) must only be one sentence and should start with a capital letter unless it starts with a lowercase symbol or identifier. Don't use a trailing period either. Don't exceed 72 characters. - The main description (the body) is normal prose and should use normal punctuation and capital letters where appropriate. Consider the commit message as an email sent to the developers (or yourself, six months down the line) detailing **why** you changed something. There's no need to specify the **how**: the changes can be inlined. - When committing code on behalf of others use the `--author` option, e.g. `git commit -a --author "Joe Coder "` and `--signoff`. - If your commit is addressing an issue, use the [GitLab syntax](https://docs.gitlab.com/ce/user/project/issues/automatic_issue_closing.html) to automatically close the issue when merging the commit with the upstream repository: ```plain Closes #1234 Fixes #1234 Closes: https://gitlab.gnome.org/GNOME/gtk/issues/1234 ``` - If you have a merge request with multiple commits and none of them completely fixes an issue, you should add a reference to the issue in the commit message, e.g. `Bug: #1234`, and use the automatic issue closing syntax in the description of the merge request. amberol-0.10.3/Cargo.lock000066400000000000000000001633531443320625200151350ustar00rootroot00000000000000# This file is automatically @generated by Cargo. # It is not intended for manual editing. version = 3 [[package]] name = "adler" version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" [[package]] name = "aho-corasick" version = "0.7.20" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cc936419f96fa211c1b9166887b38e5e40b19958e5b895be7c1f93adec7071ac" dependencies = [ "memchr", ] [[package]] name = "amberol" version = "0.1.0" dependencies = [ "ashpd", "color-thief", "fuzzy-matcher", "gdk-pixbuf", "gettext-rs", "gstreamer", "gstreamer-audio", "gstreamer-player", "gtk4", "libadwaita", "lofty", "log", "mpris-player", "once_cell", "pretty_env_logger", "rand", "regex", "serde_json", "sha2", ] [[package]] name = "anyhow" version = "1.0.69" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "224afbd727c3d6e4b90103ece64b8d1b67fbb1973b1046c2281eed3f3803f800" [[package]] name = "ashpd" version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "31688b40eb5d739049f721d8405c33d3796b3f51f2bea84421a542dafe397e41" dependencies = [ "async-std", "enumflags2", "futures-channel", "futures-util", "gdk4-wayland", "gdk4-x11", "gtk4", "once_cell", "rand", "serde", "serde_repr", "url", "zbus", ] [[package]] name = "async-broadcast" version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7c48ccdbf6ca6b121e0f586cbc0e73ae440e56c67c30fa0873b4e110d9c26d2b" dependencies = [ "event-listener", "futures-core", ] [[package]] name = "async-channel" version = "1.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cf46fee83e5ccffc220104713af3292ff9bc7c64c7de289f66dae8e38d826833" dependencies = [ "concurrent-queue", "event-listener", "futures-core", ] [[package]] name = "async-executor" version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "17adb73da160dfb475c183343c8cccd80721ea5a605d3eb57125f0a7b7a92d0b" dependencies = [ "async-lock", "async-task", "concurrent-queue", "fastrand", "futures-lite", "slab", ] [[package]] name = "async-global-executor" version = "2.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f1b6f5d7df27bd294849f8eec66ecfc63d11814df7a4f5d74168a2394467b776" dependencies = [ "async-channel", "async-executor", "async-io", "async-lock", "blocking", "futures-lite", "once_cell", ] [[package]] name = "async-io" version = "1.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8c374dda1ed3e7d8f0d9ba58715f924862c63eae6849c92d3a18e7fbde9e2794" dependencies = [ "async-lock", "autocfg", "concurrent-queue", "futures-lite", "libc", "log", "parking", "polling", "slab", "socket2", "waker-fn", "windows-sys", ] [[package]] name = "async-lock" version = "2.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c8101efe8695a6c17e02911402145357e718ac92d3ff88ae8419e84b1707b685" dependencies = [ "event-listener", "futures-lite", ] [[package]] name = "async-recursion" version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3b015a331cc64ebd1774ba119538573603427eaace0a1950c423ab971f903796" dependencies = [ "proc-macro2", "quote", "syn", ] [[package]] name = "async-std" version = "1.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "62565bb4402e926b29953c785397c6dc0391b7b446e45008b0049eb43cec6f5d" dependencies = [ "async-channel", "async-global-executor", "async-io", "async-lock", "crossbeam-utils", "futures-channel", "futures-core", "futures-io", "futures-lite", "gloo-timers", "kv-log-macro", "log", "memchr", "once_cell", "pin-project-lite", "pin-utils", "slab", "wasm-bindgen-futures", ] [[package]] name = "async-task" version = "4.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7a40729d2133846d9ed0ea60a8b9541bccddab49cd30f0715a1da672fe9a2524" [[package]] name = "async-trait" version = "0.1.64" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1cd7fce9ba8c3c042128ce72d8b2ddbf3a05747efb67ea0313c635e10bda47a2" dependencies = [ "proc-macro2", "quote", "syn", ] [[package]] name = "atomic-waker" version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "debc29dde2e69f9e47506b525f639ed42300fc014a3e007832592448fa8e4599" [[package]] name = "atomic_refcell" version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "857253367827bd9d0fd973f0ef15506a96e79e41b0ad7aa691203a4e3214f6c8" [[package]] name = "atty" version = "0.2.14" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d9b39be18770d11421cdb1b9947a45dd3f37e93092cbf377614828a319d5fee8" dependencies = [ "hermit-abi", "libc", "winapi", ] [[package]] name = "autocfg" version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" [[package]] name = "base64" version = "0.21.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a4a4ddaa51a5bc52a6948f74c06d20aaaddb71924eab79b8c97a8c556e942d6a" [[package]] name = "bitflags" version = "1.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" [[package]] name = "block" version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0d8c1fef690941d3e7788d328517591fecc684c084084702d6ff1641e993699a" [[package]] name = "block-buffer" version = "0.10.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "69cce20737498f97b993470a6e536b8523f0af7892a4f928cceb1ac5e52ebe7e" dependencies = [ "generic-array", ] [[package]] name = "blocking" version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3c67b173a56acffd6d2326fb7ab938ba0b00a71480e14902b2591c87bc5741e8" dependencies = [ "async-channel", "async-lock", "async-task", "atomic-waker", "fastrand", "futures-lite", ] [[package]] name = "bumpalo" version = "3.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0d261e256854913907f67ed06efbc3338dfe6179796deefc1ff763fc1aee5535" [[package]] name = "bytemuck" version = "1.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c041d3eab048880cb0b86b256447da3f18859a163c3b8d8893f4e6368abe6393" [[package]] name = "byteorder" version = "1.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "14c189c53d098945499cdfa7ecc63567cf3886b3332b312a5b4585d8d3a6a610" [[package]] name = "cairo-rs" version = "0.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a8af54f5d48af1226928adc1f57edd22f5df1349e7da1fc96ae15cf43db0e871" dependencies = [ "bitflags", "cairo-sys-rs", "glib 0.17.5", "libc", "once_cell", "thiserror", ] [[package]] name = "cairo-sys-rs" version = "0.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f55382a01d30e5e53f185eee269124f5e21ab526595b872751278dfbb463594e" dependencies = [ "glib-sys 0.17.4", "libc", "system-deps", ] [[package]] name = "cc" version = "1.0.79" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "50d30906286121d95be3d479533b458f87493b30a4b5f79a607db8f5d11aa91f" [[package]] name = "cfg-expr" version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b0357a6402b295ca3a86bc148e84df46c02e41f41fef186bda662557ef6328aa" dependencies = [ "smallvec", ] [[package]] name = "cfg-if" version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" [[package]] name = "color-thief" version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e6460d760cf38ce67c9e0318f896538820acc54f2d0a3bfc5b2c557211066c98" dependencies = [ "rgb", ] [[package]] name = "concurrent-queue" version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c278839b831783b70278b14df4d45e1beb1aad306c07bb796637de9a0e323e8e" dependencies = [ "crossbeam-utils", ] [[package]] name = "cpufeatures" version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "28d997bd5e24a5928dd43e46dc529867e207907fe0b239c3477d924f7f2ca320" dependencies = [ "libc", ] [[package]] name = "crc32fast" version = "1.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b540bd8bc810d3885c6ea91e2018302f68baba2129ab3e88f32389ee9370880d" dependencies = [ "cfg-if", ] [[package]] name = "crossbeam-utils" version = "0.8.14" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4fb766fa798726286dbbb842f174001dab8abc7b627a1dd86e0b7222a95d929f" dependencies = [ "cfg-if", ] [[package]] name = "crypto-common" version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" dependencies = [ "generic-array", "typenum", ] [[package]] name = "ctor" version = "0.1.26" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6d2301688392eb071b0bf1a37be05c469d3cc4dbbd95df672fe28ab021e6a096" dependencies = [ "quote", "syn", ] [[package]] name = "dbus" version = "0.6.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "48b5f0f36f1eebe901b0e6bee369a77ed3396334bf3f09abd46454a576f71819" dependencies = [ "libc", "libdbus-sys", ] [[package]] name = "derivative" version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fcc3dd5e9e9c0b295d6e1e4d811fb6f157d5ffd784b8d202fc62eac8035a770b" dependencies = [ "proc-macro2", "quote", "syn", ] [[package]] name = "digest" version = "0.10.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8168378f4e5023e7218c89c891c0fd8ecdb5e5e4f18cb78f38cf245dd021e76f" dependencies = [ "block-buffer", "crypto-common", ] [[package]] name = "dirs" version = "4.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ca3aa72a6f96ea37bbc5aa912f6788242832f75369bdfdadcb0e38423f100059" dependencies = [ "dirs-sys", ] [[package]] name = "dirs-sys" version = "0.3.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1b1d1d91c932ef41c0f2663aa8b0ca0342d444d842c06914aa0a7e352d0bada6" dependencies = [ "libc", "redox_users", "winapi", ] [[package]] name = "enumflags2" version = "0.7.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e75d4cd21b95383444831539909fbb14b9dc3fdceb2a6f5d36577329a1f55ccb" dependencies = [ "enumflags2_derive", "serde", ] [[package]] name = "enumflags2_derive" version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f58dc3c5e468259f19f2d46304a6b28f1c3d034442e14b322d2b850e36f6d5ae" dependencies = [ "proc-macro2", "quote", "syn", ] [[package]] name = "env_logger" version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "44533bbbb3bb3c1fa17d9f2e4e38bbbaf8396ba82193c4cb1b6445d711445d36" dependencies = [ "atty", "humantime", "log", "regex", "termcolor", ] [[package]] name = "event-listener" version = "2.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0206175f82b8d6bf6652ff7d71a1e27fd2e4efde587fd368662814d6ec1d9ce0" [[package]] name = "fastrand" version = "1.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e51093e27b0797c359783294ca4f0a911c270184cb10f85783b118614a1501be" dependencies = [ "instant", ] [[package]] name = "field-offset" version = "0.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1e1c54951450cbd39f3dbcf1005ac413b49487dabf18a720ad2383eccfeffb92" dependencies = [ "memoffset", "rustc_version", ] [[package]] name = "flate2" version = "1.0.25" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a8a2db397cb1c8772f31494cb8917e48cd1e64f0fa7efac59fbd741a0a8ce841" dependencies = [ "crc32fast", "miniz_oxide", ] [[package]] name = "form_urlencoded" version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a9c384f161156f5260c24a097c56119f9be8c798586aecc13afbcbe7b7e26bf8" dependencies = [ "percent-encoding", ] [[package]] name = "futures-channel" version = "0.3.26" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2e5317663a9089767a1ec00a487df42e0ca174b61b4483213ac24448e4664df5" dependencies = [ "futures-core", ] [[package]] name = "futures-core" version = "0.3.26" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ec90ff4d0fe1f57d600049061dc6bb68ed03c7d2fbd697274c41805dcb3f8608" [[package]] name = "futures-executor" version = "0.3.26" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e8de0a35a6ab97ec8869e32a2473f4b1324459e14c29275d14b10cb1fd19b50e" dependencies = [ "futures-core", "futures-task", "futures-util", ] [[package]] name = "futures-io" version = "0.3.26" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bfb8371b6fb2aeb2d280374607aeabfc99d95c72edfe51692e42d3d7f0d08531" [[package]] name = "futures-lite" version = "1.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7694489acd39452c77daa48516b894c153f192c3578d5a839b62c58099fcbf48" dependencies = [ "fastrand", "futures-core", "futures-io", "memchr", "parking", "pin-project-lite", "waker-fn", ] [[package]] name = "futures-macro" version = "0.3.26" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "95a73af87da33b5acf53acfebdc339fe592ecf5357ac7c0a7734ab9d8c876a70" dependencies = [ "proc-macro2", "quote", "syn", ] [[package]] name = "futures-sink" version = "0.3.26" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f310820bb3e8cfd46c80db4d7fb8353e15dfff853a127158425f31e0be6c8364" [[package]] name = "futures-task" version = "0.3.26" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dcf79a1bf610b10f42aea489289c5a2c478a786509693b80cd39c44ccd936366" [[package]] name = "futures-util" version = "0.3.26" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9c1d6de3acfef38d2be4b1f543f553131788603495be83da675e180c8d6b7bd1" dependencies = [ "futures-core", "futures-macro", "futures-sink", "futures-task", "pin-project-lite", "pin-utils", "slab", ] [[package]] name = "fuzzy-matcher" version = "0.3.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "54614a3312934d066701a80f20f15fa3b56d67ac7722b39eea5b4c9dd1d66c94" dependencies = [ "thread_local", ] [[package]] name = "gdk-pixbuf" version = "0.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b023fbe0c6b407bd3d9805d107d9800da3829dc5a676653210f1d5f16d7f59bf" dependencies = [ "bitflags", "gdk-pixbuf-sys", "gio", "glib 0.17.5", "libc", "once_cell", ] [[package]] name = "gdk-pixbuf-sys" version = "0.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7b41bd2b44ed49d99277d3925652a163038bd5ed943ec9809338ffb2f4391e3b" dependencies = [ "gio-sys", "glib-sys 0.17.4", "gobject-sys 0.17.4", "libc", "system-deps", ] [[package]] name = "gdk4" version = "0.6.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c3abf96408a26e3eddf881a7f893a1e111767137136e347745e8ea6ed12731ff" dependencies = [ "bitflags", "cairo-rs", "gdk-pixbuf", "gdk4-sys", "gio", "glib 0.17.5", "libc", "pango", ] [[package]] name = "gdk4-sys" version = "0.6.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1bc92aa1608c089c49393d014c38ac0390d01e4841e1fedaa75dbcef77aaed64" dependencies = [ "cairo-sys-rs", "gdk-pixbuf-sys", "gio-sys", "glib-sys 0.17.4", "gobject-sys 0.17.4", "libc", "pango-sys", "pkg-config", "system-deps", ] [[package]] name = "gdk4-wayland" version = "0.6.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2fa73894ed86fe10157436123d8baae5f2924ebc4fa48a11d8f093e07b9ecbbd" dependencies = [ "gdk4", "gdk4-wayland-sys", "gio", "glib 0.17.5", "libc", ] [[package]] name = "gdk4-wayland-sys" version = "0.6.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "af41c5a9cd7e06f612b91ec45ecb423ab57921bbd92f56e46a67b962be198e0c" dependencies = [ "glib-sys 0.17.4", "libc", "system-deps", ] [[package]] name = "gdk4-x11" version = "0.6.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "17de2c3554d5127b9dfacd4d1801e2e3c9163bce01c6e1c407c054e9b771f2ee" dependencies = [ "gdk4", "gdk4-x11-sys", "gio", "glib 0.17.5", "libc", ] [[package]] name = "gdk4-x11-sys" version = "0.6.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e6ca6c03d5019467d21671936edeba09f908039900af8ce4b834c19646031c72" dependencies = [ "gdk4-sys", "glib-sys 0.17.4", "libc", "system-deps", ] [[package]] name = "generic-array" version = "0.14.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bff49e947297f3312447abdca79f45f4738097cc82b06e72054d2223f601f1b9" dependencies = [ "typenum", "version_check", ] [[package]] name = "getrandom" version = "0.2.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c05aeb6a22b8f62540c194aac980f2115af067bfe15a0734d7277a768d396b31" dependencies = [ "cfg-if", "libc", "wasi", ] [[package]] name = "gettext-rs" version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e49ea8a8fad198aaa1f9655a2524b64b70eb06b2f3ff37da407566c93054f364" dependencies = [ "gettext-sys", "locale_config", ] [[package]] name = "gettext-sys" version = "0.21.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c63ce2e00f56a206778276704bbe38564c8695249fdc8f354b4ef71c57c3839d" dependencies = [ "cc", "temp-dir", ] [[package]] name = "gio" version = "0.17.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2261a3b4e922ec676d1c27ac466218c38cf5dcb49a759129e54bb5046e442125" dependencies = [ "bitflags", "futures-channel", "futures-core", "futures-io", "futures-util", "gio-sys", "glib 0.17.5", "libc", "once_cell", "pin-project-lite", "smallvec", "thiserror", ] [[package]] name = "gio-sys" version = "0.17.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6b1d43b0d7968b48455244ecafe41192871257f5740aa6b095eb19db78e362a5" dependencies = [ "glib-sys 0.17.4", "gobject-sys 0.17.4", "libc", "system-deps", "winapi", ] [[package]] name = "glib" version = "0.15.12" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "edb0306fbad0ab5428b0ca674a23893db909a98582969c9b537be4ced78c505d" dependencies = [ "bitflags", "futures-channel", "futures-core", "futures-executor", "futures-task", "glib-macros 0.15.13", "glib-sys 0.15.10", "gobject-sys 0.15.10", "libc", "once_cell", "smallvec", "thiserror", ] [[package]] name = "glib" version = "0.17.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cfb53061756195d76969292c2d2e329e01259276524a9bae6c9b73af62854773" dependencies = [ "bitflags", "futures-channel", "futures-core", "futures-executor", "futures-task", "futures-util", "gio-sys", "glib-macros 0.17.6", "glib-sys 0.17.4", "gobject-sys 0.17.4", "libc", "memchr", "once_cell", "smallvec", "thiserror", ] [[package]] name = "glib-macros" version = "0.15.13" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "10c6ae9f6fa26f4fb2ac16b528d138d971ead56141de489f8111e259b9df3c4a" dependencies = [ "anyhow", "heck", "proc-macro-crate", "proc-macro-error", "proc-macro2", "quote", "syn", ] [[package]] name = "glib-macros" version = "0.17.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "32e73a9790e243f6d55d8e302426419f6084a1de7a84cd07f7268300408a19de" dependencies = [ "anyhow", "heck", "proc-macro-crate", "proc-macro-error", "proc-macro2", "quote", "syn", ] [[package]] name = "glib-sys" version = "0.15.10" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ef4b192f8e65e9cf76cbf4ea71fa8e3be4a0e18ffe3d68b8da6836974cc5bad4" dependencies = [ "libc", "system-deps", ] [[package]] name = "glib-sys" version = "0.17.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "49f00ad0a1bf548e61adfff15d83430941d9e1bb620e334f779edd1c745680a5" dependencies = [ "libc", "system-deps", ] [[package]] name = "gloo-timers" version = "0.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9b995a66bb87bebce9a0f4a95aed01daca4872c050bfcb21653361c03bc35e5c" dependencies = [ "futures-channel", "futures-core", "js-sys", "wasm-bindgen", ] [[package]] name = "gobject-sys" version = "0.15.10" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0d57ce44246becd17153bd035ab4d32cfee096a657fc01f2231c9278378d1e0a" dependencies = [ "glib-sys 0.15.10", "libc", "system-deps", ] [[package]] name = "gobject-sys" version = "0.17.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "15e75b0000a64632b2d8ca3cf856af9308e3a970844f6e9659bd197f026793d0" dependencies = [ "glib-sys 0.17.4", "libc", "system-deps", ] [[package]] name = "graphene-rs" version = "0.17.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "21cf11565bb0e4dfc2f99d4775b6c329f0d40a2cff9c0066214d31a0e1b46256" dependencies = [ "glib 0.17.5", "graphene-sys", "libc", ] [[package]] name = "graphene-sys" version = "0.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cf80a4849a8d9565410a8fec6fc3678e9c617f4ac7be182ca55ab75016e07af9" dependencies = [ "glib-sys 0.17.4", "libc", "pkg-config", "system-deps", ] [[package]] name = "gsk4" version = "0.6.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6f01ef44fa7cac15e2da9978529383e6bee03e570ba5bf7036b4c10a15cc3a3c" dependencies = [ "bitflags", "cairo-rs", "gdk4", "glib 0.17.5", "graphene-rs", "gsk4-sys", "libc", "pango", ] [[package]] name = "gsk4-sys" version = "0.6.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c07a84fb4dcf1323d29435aa85e2f5f58bef564342bef06775ec7bd0da1f01b0" dependencies = [ "cairo-sys-rs", "gdk4-sys", "glib-sys 0.17.4", "gobject-sys 0.17.4", "graphene-sys", "libc", "pango-sys", "system-deps", ] [[package]] name = "gstreamer" version = "0.20.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4c46cc10a7ab79329feb68bef54a242ced84c3147cc1b81bc5c6140346a1dbf9" dependencies = [ "bitflags", "cfg-if", "futures-channel", "futures-core", "futures-util", "glib 0.17.5", "gstreamer-sys", "libc", "muldiv", "num-integer", "num-rational", "once_cell", "option-operations", "paste", "pretty-hex", "smallvec", "thiserror", ] [[package]] name = "gstreamer-audio" version = "0.20.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8ca6d26ab15835a268939e2367ed4ddb1e7157b03d0bb56ba4a0b036c1ac8393" dependencies = [ "bitflags", "cfg-if", "glib 0.17.5", "gstreamer", "gstreamer-audio-sys", "gstreamer-base", "libc", "once_cell", ] [[package]] name = "gstreamer-audio-sys" version = "0.20.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9d4001b779e4707b32acd6ec0960e327b926369c1a34f7c41d477ac42b2670e8" dependencies = [ "glib-sys 0.17.4", "gobject-sys 0.17.4", "gstreamer-base-sys", "gstreamer-sys", "libc", "system-deps", ] [[package]] name = "gstreamer-base" version = "0.20.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5598bfedbff12675a6cddbe420b6a3ba5039c64aaf7df130db6339d09b634b0e" dependencies = [ "atomic_refcell", "bitflags", "cfg-if", "glib 0.17.5", "gstreamer", "gstreamer-base-sys", "libc", ] [[package]] name = "gstreamer-base-sys" version = "0.20.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "26114ed96f6668380f5a1554128159e98e06c3a7a8460f216d7cd6dce28f928c" dependencies = [ "glib-sys 0.17.4", "gobject-sys 0.17.4", "gstreamer-sys", "libc", "system-deps", ] [[package]] name = "gstreamer-player" version = "0.20.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "76566698a39a2d80b17fa80b5bacb7f1ae728facb7f2b2090532380250b5cbfe" dependencies = [ "bitflags", "glib 0.17.5", "gstreamer", "gstreamer-player-sys", "gstreamer-video", "libc", "once_cell", ] [[package]] name = "gstreamer-player-sys" version = "0.20.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "15321aaaf3bb247b4af3e09456a62dc17f030515d6328377a34081d9ed5803c0" dependencies = [ "glib-sys 0.17.4", "gobject-sys 0.17.4", "gstreamer-sys", "gstreamer-video-sys", "libc", "system-deps", ] [[package]] name = "gstreamer-sys" version = "0.20.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e56fe047adef7d47dbafa8bc1340fddb53c325e16574763063702fc94b5786d2" dependencies = [ "glib-sys 0.17.4", "gobject-sys 0.17.4", "libc", "system-deps", ] [[package]] name = "gstreamer-video" version = "0.20.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "467cddb6a4135e72fefb6ba21262b1cca5493e9928792e88fe672ec0a37b761c" dependencies = [ "bitflags", "cfg-if", "futures-channel", "glib 0.17.5", "gstreamer", "gstreamer-base", "gstreamer-video-sys", "libc", "once_cell", ] [[package]] name = "gstreamer-video-sys" version = "0.20.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "66ddb6112d438aac0004d2db6053a572f92b1c5e0e9d6ff6c71d9245f7f73e46" dependencies = [ "glib-sys 0.17.4", "gobject-sys 0.17.4", "gstreamer-base-sys", "gstreamer-sys", "libc", "system-deps", ] [[package]] name = "gtk4" version = "0.6.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b28a32a04cd75cef14a0983f8b0c669e0fe152a0a7725accdeb594e2c764c88b" dependencies = [ "bitflags", "cairo-rs", "field-offset", "futures-channel", "gdk-pixbuf", "gdk4", "gio", "glib 0.17.5", "graphene-rs", "gsk4", "gtk4-macros", "gtk4-sys", "libc", "once_cell", "pango", ] [[package]] name = "gtk4-macros" version = "0.6.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f041a797fb098bfb06e432c61738133604bfa3af57f13f1da3b9d46271422ef0" dependencies = [ "anyhow", "proc-macro-crate", "proc-macro-error", "proc-macro2", "quote", "syn", ] [[package]] name = "gtk4-sys" version = "0.6.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5f8283f707b07e019e76c7f2934bdd4180c277e08aa93f4c0d8dd07b7a34e22f" dependencies = [ "cairo-sys-rs", "gdk-pixbuf-sys", "gdk4-sys", "gio-sys", "glib-sys 0.17.4", "gobject-sys 0.17.4", "graphene-sys", "gsk4-sys", "libc", "pango-sys", "system-deps", ] [[package]] name = "hashbrown" version = "0.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" [[package]] name = "heck" version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" [[package]] name = "hermit-abi" version = "0.1.19" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "62b467343b94ba476dcb2500d242dadbb39557df889310ac77c5d99100aaac33" dependencies = [ "libc", ] [[package]] name = "hex" version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" [[package]] name = "humantime" version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "df004cfca50ef23c36850aaaa59ad52cc70d0e90243c3c7737a4dd32dc7a3c4f" dependencies = [ "quick-error", ] [[package]] name = "idna" version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e14ddfc70884202db2244c223200c204c2bda1bc6e0998d11b5e024d657209e6" dependencies = [ "unicode-bidi", "unicode-normalization", ] [[package]] name = "indexmap" version = "1.9.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1885e79c1fc4b10f0e172c475f458b7f7b93061064d98c3293e98c5ba0c8b399" dependencies = [ "autocfg", "hashbrown", ] [[package]] name = "instant" version = "0.1.12" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7a5bbe824c507c5da5956355e86a746d82e0e1464f65d862cc5e71da70e94b2c" dependencies = [ "cfg-if", ] [[package]] name = "itoa" version = "1.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fad582f4b9e86b6caa621cabeb0963332d92eea04729ab12892c2533951e6440" [[package]] name = "js-sys" version = "0.3.61" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "445dde2150c55e483f3d8416706b97ec8e8237c307e5b7b4b8dd15e6af2a0730" dependencies = [ "wasm-bindgen", ] [[package]] name = "kv-log-macro" version = "1.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0de8b303297635ad57c9f5059fd9cee7a47f8e8daa09df0fcd07dd39fb22977f" dependencies = [ "log", ] [[package]] name = "lazy_static" version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" [[package]] name = "libadwaita" version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b1c4efd2020a4fcedbad2c4a97de97bf6045e5dc49d61d5a5d0cfd753db60700" dependencies = [ "bitflags", "futures-channel", "gdk-pixbuf", "gdk4", "gio", "glib 0.17.5", "gtk4", "libadwaita-sys", "libc", "once_cell", "pango", ] [[package]] name = "libadwaita-sys" version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0727b85b4fe2b1bed5ac90df6343de15cbf8118bfb96d7c3cc1512681a4b34ac" dependencies = [ "gdk4-sys", "gio-sys", "glib-sys 0.17.4", "gobject-sys 0.17.4", "gtk4-sys", "libc", "pango-sys", "system-deps", ] [[package]] name = "libc" version = "0.2.139" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "201de327520df007757c1f0adce6e827fe8562fbc28bfd9c15571c66ca1f5f79" [[package]] name = "libdbus-sys" version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9f8d7ae751e1cb825c840ae5e682f59b098cdfd213c350ac268b61449a5f58a0" dependencies = [ "pkg-config", ] [[package]] name = "locale_config" version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "08d2c35b16f4483f6c26f0e4e9550717a2f6575bcd6f12a53ff0c490a94a6934" dependencies = [ "lazy_static", "objc", "objc-foundation", "regex", "winapi", ] [[package]] name = "lofty" version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fed685b48b30ef8f5213a32422d08c80b765f954ad5b6f6b634f901e7844ca52" dependencies = [ "base64", "byteorder", "cfg-if", "flate2", "lofty_attr", "log", "ogg_pager", "once_cell", "paste", ] [[package]] name = "lofty_attr" version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "336dfabb2fdfd932cebfcaa5d0fc57abac0d49f6ae9ddaa7c47a51bf9f74f966" dependencies = [ "proc-macro2", "quote", "syn", ] [[package]] name = "log" version = "0.4.17" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "abb12e687cfb44aa40f41fc3978ef76448f9b6038cad6aef4259d3c095a2382e" dependencies = [ "cfg-if", "value-bag", ] [[package]] name = "malloc_buf" version = "0.0.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "62bb907fe88d54d8d9ce32a3cceab4218ed2f6b7d35617cafe9adf84e43919cb" dependencies = [ "libc", ] [[package]] name = "memchr" version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2dffe52ecf27772e601905b7522cb4ef790d2cc203488bbd0e2fe85fcb74566d" [[package]] name = "memoffset" version = "0.6.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5aa361d4faea93603064a027415f07bd8e1d5c88c9fbf68bf56a285428fd79ce" dependencies = [ "autocfg", ] [[package]] name = "miniz_oxide" version = "0.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b275950c28b37e794e8c55d88aeb5e139d0ce23fdbbeda68f8d7174abdf9e8fa" dependencies = [ "adler", ] [[package]] name = "mpris-player" version = "0.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "be832ec9171fdaf43609d02bb552f4129ba6eacd184bb25186e2906dbd3cf098" dependencies = [ "dbus", "glib 0.15.12", ] [[package]] name = "muldiv" version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "956787520e75e9bd233246045d19f42fb73242759cc57fba9611d940ae96d4b0" [[package]] name = "nix" version = "0.25.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f346ff70e7dbfd675fe90590b92d59ef2de15a8779ae305ebcbfd3f0caf59be4" dependencies = [ "autocfg", "bitflags", "cfg-if", "libc", "memoffset", "pin-utils", ] [[package]] name = "nom8" version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ae01545c9c7fc4486ab7debaf2aad7003ac19431791868fb2e8066df97fad2f8" dependencies = [ "memchr", ] [[package]] name = "num-integer" version = "0.1.45" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "225d3389fb3509a24c93f5c29eb6bde2586b98d9f016636dff58d7c6f7569cd9" dependencies = [ "autocfg", "num-traits", ] [[package]] name = "num-rational" version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0638a1c9d0a3c0914158145bc76cff373a75a627e6ecbfb71cbe6f453a5a19b0" dependencies = [ "autocfg", "num-integer", "num-traits", ] [[package]] name = "num-traits" version = "0.2.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "578ede34cf02f8924ab9447f50c28075b4d3e5b269972345e7e0372b38c6cdcd" dependencies = [ "autocfg", ] [[package]] name = "objc" version = "0.2.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "915b1b472bc21c53464d6c8461c9d3af805ba1ef837e1cac254428f4a77177b1" dependencies = [ "malloc_buf", ] [[package]] name = "objc-foundation" version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1add1b659e36c9607c7aab864a76c7a4c2760cd0cd2e120f3fb8b952c7e22bf9" dependencies = [ "block", "objc", "objc_id", ] [[package]] name = "objc_id" version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c92d4ddb4bd7b50d730c215ff871754d0da6b2178849f8a2a2ab69712d0c073b" dependencies = [ "objc", ] [[package]] name = "ogg_pager" version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0d218a406e5de88e1c492d0162d569916f7436efe851ba5cc40a4bf4fa97cb40" dependencies = [ "byteorder", ] [[package]] name = "once_cell" version = "1.17.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b7e5500299e16ebb147ae15a00a942af264cf3688f47923b8fc2cd5858f23ad3" [[package]] name = "option-operations" version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7c26d27bb1aeab65138e4bf7666045169d1717febcc9ff870166be8348b223d0" dependencies = [ "paste", ] [[package]] name = "ordered-stream" version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9aa2b01e1d916879f73a53d01d1d6cee68adbb31d6d9177a8cfce093cced1d50" dependencies = [ "futures-core", "pin-project-lite", ] [[package]] name = "pango" version = "0.17.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "52c280b82a881e4208afb3359a8e7fde27a1b272280981f1f34610bed5770d37" dependencies = [ "bitflags", "gio", "glib 0.17.5", "libc", "once_cell", "pango-sys", ] [[package]] name = "pango-sys" version = "0.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4293d0f0b5525eb5c24734d30b0ed02cd02aa734f216883f376b54de49625de8" dependencies = [ "glib-sys 0.17.4", "gobject-sys 0.17.4", "libc", "system-deps", ] [[package]] name = "parking" version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "427c3892f9e783d91cc128285287e70a59e206ca452770ece88a76f7a3eddd72" [[package]] name = "paste" version = "1.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d01a5bd0424d00070b0098dd17ebca6f961a959dead1dbcbbbc1d1cd8d3deeba" [[package]] name = "percent-encoding" version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "478c572c3d73181ff3c2539045f6eb99e5491218eae919370993b890cdbdd98e" [[package]] name = "pest" version = "2.5.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "028accff104c4e513bad663bbcd2ad7cfd5304144404c31ed0a77ac103d00660" dependencies = [ "thiserror", "ucd-trie", ] [[package]] name = "pin-project-lite" version = "0.2.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e0a7ae3ac2f1173085d398531c705756c94a4c56843785df85a60c1a0afac116" [[package]] name = "pin-utils" version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" [[package]] name = "pkg-config" version = "0.3.26" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6ac9a59f73473f1b8d852421e59e64809f025994837ef743615c6d0c5b305160" [[package]] name = "polling" version = "2.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "22122d5ec4f9fe1b3916419b76be1e80bcb93f618d071d2edf841b137b2a2bd6" dependencies = [ "autocfg", "cfg-if", "libc", "log", "wepoll-ffi", "windows-sys", ] [[package]] name = "ppv-lite86" version = "0.2.17" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" [[package]] name = "pretty-hex" version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c6fa0831dd7cc608c38a5e323422a0077678fa5744aa2be4ad91c4ece8eec8d5" [[package]] name = "pretty_env_logger" version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "926d36b9553851b8b0005f1275891b392ee4d2d833852c417ed025477350fb9d" dependencies = [ "env_logger", "log", ] [[package]] name = "proc-macro-crate" version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "66618389e4ec1c7afe67d51a9bf34ff9236480f8d51e7489b7d5ab0303c13f34" dependencies = [ "once_cell", "toml_edit", ] [[package]] name = "proc-macro-error" version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c" dependencies = [ "proc-macro-error-attr", "proc-macro2", "quote", "syn", "version_check", ] [[package]] name = "proc-macro-error-attr" version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869" dependencies = [ "proc-macro2", "quote", "version_check", ] [[package]] name = "proc-macro2" version = "1.0.51" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5d727cae5b39d21da60fa540906919ad737832fe0b1c165da3a34d6548c849d6" dependencies = [ "unicode-ident", ] [[package]] name = "quick-error" version = "1.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a1d01941d82fa2ab50be1e79e6714289dd7cde78eba4c074bc5a4374f650dfe0" [[package]] name = "quote" version = "1.0.23" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8856d8364d252a14d474036ea1358d63c9e6965c8e5c1885c18f73d70bff9c7b" dependencies = [ "proc-macro2", ] [[package]] name = "rand" version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" dependencies = [ "libc", "rand_chacha", "rand_core", ] [[package]] name = "rand_chacha" version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" dependencies = [ "ppv-lite86", "rand_core", ] [[package]] name = "rand_core" version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" dependencies = [ "getrandom", ] [[package]] name = "redox_syscall" version = "0.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fb5a58c1855b4b6819d59012155603f0b22ad30cad752600aadfcb695265519a" dependencies = [ "bitflags", ] [[package]] name = "redox_users" version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b033d837a7cf162d7993aded9304e30a83213c648b6e389db233191f891e5c2b" dependencies = [ "getrandom", "redox_syscall", "thiserror", ] [[package]] name = "regex" version = "1.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "48aaa5748ba571fb95cd2c85c09f629215d3a6ece942baa100950af03a34f733" dependencies = [ "aho-corasick", "memchr", "regex-syntax", ] [[package]] name = "regex-syntax" version = "0.6.28" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "456c603be3e8d448b072f410900c09faf164fbce2d480456f50eea6e25f9c848" [[package]] name = "remove_dir_all" version = "0.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3acd125665422973a33ac9d3dd2df85edad0f4ae9b00dafb1a05e43a9f5ef8e7" dependencies = [ "winapi", ] [[package]] name = "rgb" version = "0.8.36" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "20ec2d3e3fc7a92ced357df9cebd5a10b6fb2aa1ee797bf7e9ce2f17dffc8f59" dependencies = [ "bytemuck", ] [[package]] name = "rustc_version" version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f0dfe2087c51c460008730de8b57e6a320782fbfb312e1f4d520e6c6fae155ee" dependencies = [ "semver", ] [[package]] name = "ryu" version = "1.0.12" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7b4b9743ed687d4b4bcedf9ff5eaa7398495ae14e61cba0a295704edbc7decde" [[package]] name = "semver" version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f301af10236f6df4160f7c3f04eec6dbc70ace82d23326abad5edee88801c6b6" dependencies = [ "semver-parser", ] [[package]] name = "semver-parser" version = "0.10.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "00b0bef5b7f9e0df16536d3961cfb6e84331c065b4066afb39768d0e319411f7" dependencies = [ "pest", ] [[package]] name = "serde" version = "1.0.152" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bb7d1f0d3021d347a83e556fc4683dea2ea09d87bccdf88ff5c12545d89d5efb" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" version = "1.0.152" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "af487d118eecd09402d70a5d72551860e788df87b464af30e5ea6a38c75c541e" dependencies = [ "proc-macro2", "quote", "syn", ] [[package]] name = "serde_json" version = "1.0.93" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cad406b69c91885b5107daf2c29572f6c8cdb3c66826821e286c533490c0bc76" dependencies = [ "itoa", "ryu", "serde", ] [[package]] name = "serde_repr" version = "0.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9a5ec9fa74a20ebbe5d9ac23dac1fc96ba0ecfe9f50f2843b52e537b10fbcb4e" dependencies = [ "proc-macro2", "quote", "syn", ] [[package]] name = "sha1" version = "0.10.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f04293dc80c3993519f2d7f6f511707ee7094fe0c6d3406feb330cdb3540eba3" dependencies = [ "cfg-if", "cpufeatures", "digest", ] [[package]] name = "sha2" version = "0.10.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "82e6b795fe2e3b1e845bafcb27aa35405c4d47cdfc92af5fc8d3002f76cebdc0" dependencies = [ "cfg-if", "cpufeatures", "digest", ] [[package]] name = "slab" version = "0.4.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6528351c9bc8ab22353f9d776db39a20288e8d6c37ef8cfe3317cf875eecfc2d" dependencies = [ "autocfg", ] [[package]] name = "smallvec" version = "1.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a507befe795404456341dfab10cef66ead4c041f62b8b11bbb92bffe5d0953e0" [[package]] name = "socket2" version = "0.4.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "02e2d2db9033d13a1567121ddd7a095ee144db4e1ca1b1bda3419bc0da294ebd" dependencies = [ "libc", "winapi", ] [[package]] name = "static_assertions" version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" [[package]] name = "syn" version = "1.0.108" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d56e159d99e6c2b93995d171050271edb50ecc5288fbc7cc17de8fdce4e58c14" dependencies = [ "proc-macro2", "quote", "unicode-ident", ] [[package]] name = "system-deps" version = "6.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2955b1fe31e1fa2fbd1976b71cc69a606d7d4da16f6de3333d0c92d51419aeff" dependencies = [ "cfg-expr", "heck", "pkg-config", "toml", "version-compare", ] [[package]] name = "temp-dir" version = "0.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "af547b166dd1ea4b472165569fc456cfb6818116f854690b0ff205e636523dab" [[package]] name = "tempfile" version = "3.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5cdb1ef4eaeeaddc8fbd371e5017057064af0911902ef36b39801f67cc6d79e4" dependencies = [ "cfg-if", "fastrand", "libc", "redox_syscall", "remove_dir_all", "winapi", ] [[package]] name = "termcolor" version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "be55cf8942feac5c765c2c993422806843c9a9a45d4d5c407ad6dd2ea95eb9b6" dependencies = [ "winapi-util", ] [[package]] name = "thiserror" version = "1.0.38" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6a9cd18aa97d5c45c6603caea1da6628790b37f7a34b6ca89522331c5180fed0" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" version = "1.0.38" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1fb327af4685e4d03fa8cbcf1716380da910eeb2bb8be417e7f9fd3fb164f36f" dependencies = [ "proc-macro2", "quote", "syn", ] [[package]] name = "thread_local" version = "1.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3fdd6f064ccff2d6567adcb3873ca630700f00b5ad3f060c25b5dcfd9a4ce152" dependencies = [ "cfg-if", "once_cell", ] [[package]] name = "tinyvec" version = "1.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "87cc5ceb3875bb20c2890005a4e226a4651264a5c75edb2421b52861a0a0cb50" dependencies = [ "tinyvec_macros", ] [[package]] name = "tinyvec_macros" version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "toml" version = "0.5.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f4f7f0dd8d50a853a531c426359045b1998f04219d88799810762cd4ad314234" dependencies = [ "serde", ] [[package]] name = "toml_datetime" version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4553f467ac8e3d374bc9a177a26801e5d0f9b211aa1673fb137a403afd1c9cf5" [[package]] name = "toml_edit" version = "0.18.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "56c59d8dd7d0dcbc6428bf7aa2f0e823e26e43b3c9aca15bbc9475d23e5fa12b" dependencies = [ "indexmap", "nom8", "toml_datetime", ] [[package]] name = "tracing" version = "0.1.37" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8ce8c33a8d48bd45d624a6e523445fd21ec13d3653cd51f681abf67418f54eb8" dependencies = [ "cfg-if", "pin-project-lite", "tracing-attributes", "tracing-core", ] [[package]] name = "tracing-attributes" version = "0.1.23" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4017f8f45139870ca7e672686113917c71c7a6e02d4924eda67186083c03081a" dependencies = [ "proc-macro2", "quote", "syn", ] [[package]] name = "tracing-core" version = "0.1.30" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "24eb03ba0eab1fd845050058ce5e616558e8f8d8fca633e6b163fe25c797213a" dependencies = [ "once_cell", ] [[package]] name = "typenum" version = "1.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "497961ef93d974e23eb6f433eb5fe1b7930b659f06d12dec6fc44a8f554c0bba" [[package]] name = "ucd-trie" version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9e79c4d996edb816c91e4308506774452e55e95c3c9de07b6729e17e15a5ef81" [[package]] name = "uds_windows" version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ce65604324d3cce9b966701489fbd0cf318cb1f7bd9dd07ac9a4ee6fb791930d" dependencies = [ "tempfile", "winapi", ] [[package]] name = "unicode-bidi" version = "0.3.10" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d54675592c1dbefd78cbd98db9bacd89886e1ca50692a0692baefffdeb92dd58" [[package]] name = "unicode-ident" version = "1.0.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "84a22b9f218b40614adcb3f4ff08b703773ad44fa9423e4e0d346d5db86e4ebc" [[package]] name = "unicode-normalization" version = "0.1.22" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5c5713f0fc4b5db668a2ac63cdb7bb4469d8c9fed047b1d0292cc7b0ce2ba921" dependencies = [ "tinyvec", ] [[package]] name = "url" version = "2.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0d68c799ae75762b8c3fe375feb6600ef5602c883c5d21eb51c09f22b83c4643" dependencies = [ "form_urlencoded", "idna", "percent-encoding", "serde", ] [[package]] name = "value-bag" version = "1.0.0-alpha.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2209b78d1249f7e6f3293657c9779fe31ced465df091bbd433a1cf88e916ec55" dependencies = [ "ctor", "version_check", ] [[package]] name = "version-compare" version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "579a42fc0b8e0c63b76519a339be31bed574929511fa53c1a3acae26eb258f29" [[package]] name = "version_check" version = "0.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" [[package]] name = "waker-fn" version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9d5b2c62b4012a3e1eca5a7e077d13b3bf498c4073e33ccd58626607748ceeca" [[package]] name = "wasi" version = "0.11.0+wasi-snapshot-preview1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" [[package]] name = "wasm-bindgen" version = "0.2.84" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "31f8dcbc21f30d9b8f2ea926ecb58f6b91192c17e9d33594b3df58b2007ca53b" dependencies = [ "cfg-if", "wasm-bindgen-macro", ] [[package]] name = "wasm-bindgen-backend" version = "0.2.84" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "95ce90fd5bcc06af55a641a86428ee4229e44e07033963a2290a8e241607ccb9" dependencies = [ "bumpalo", "log", "once_cell", "proc-macro2", "quote", "syn", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-futures" version = "0.4.34" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f219e0d211ba40266969f6dbdd90636da12f75bee4fc9d6c23d1260dadb51454" dependencies = [ "cfg-if", "js-sys", "wasm-bindgen", "web-sys", ] [[package]] name = "wasm-bindgen-macro" version = "0.2.84" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4c21f77c0bedc37fd5dc21f897894a5ca01e7bb159884559461862ae90c0b4c5" dependencies = [ "quote", "wasm-bindgen-macro-support", ] [[package]] name = "wasm-bindgen-macro-support" version = "0.2.84" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2aff81306fcac3c7515ad4e177f521b5c9a15f2b08f4e32d823066102f35a5f6" dependencies = [ "proc-macro2", "quote", "syn", "wasm-bindgen-backend", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-shared" version = "0.2.84" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0046fef7e28c3804e5e38bfa31ea2a0f73905319b677e57ebe37e49358989b5d" [[package]] name = "web-sys" version = "0.3.61" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e33b99f4b23ba3eec1a53ac264e35a755f00e966e0065077d6027c0f575b0b97" dependencies = [ "js-sys", "wasm-bindgen", ] [[package]] name = "wepoll-ffi" version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d743fdedc5c64377b5fc2bc036b01c7fd642205a0d96356034ae3404d49eb7fb" dependencies = [ "cc", ] [[package]] name = "winapi" version = "0.3.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" dependencies = [ "winapi-i686-pc-windows-gnu", "winapi-x86_64-pc-windows-gnu", ] [[package]] name = "winapi-i686-pc-windows-gnu" version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" [[package]] name = "winapi-util" version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "70ec6ce85bb158151cae5e5c87f95a8e97d2c0c4b001223f33a334e3ce5de178" dependencies = [ "winapi", ] [[package]] name = "winapi-x86_64-pc-windows-gnu" version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" [[package]] name = "windows-sys" version = "0.42.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5a3e1820f08b8513f676f7ab6c1f99ff312fb97b553d30ff4dd86f9f15728aa7" dependencies = [ "windows_aarch64_gnullvm", "windows_aarch64_msvc", "windows_i686_gnu", "windows_i686_msvc", "windows_x86_64_gnu", "windows_x86_64_gnullvm", "windows_x86_64_msvc", ] [[package]] name = "windows_aarch64_gnullvm" version = "0.42.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8c9864e83243fdec7fc9c5444389dcbbfd258f745e7853198f365e3c4968a608" [[package]] name = "windows_aarch64_msvc" version = "0.42.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4c8b1b673ffc16c47a9ff48570a9d85e25d265735c503681332589af6253c6c7" [[package]] name = "windows_i686_gnu" version = "0.42.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "de3887528ad530ba7bdbb1faa8275ec7a1155a45ffa57c37993960277145d640" [[package]] name = "windows_i686_msvc" version = "0.42.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bf4d1122317eddd6ff351aa852118a2418ad4214e6613a50e0191f7004372605" [[package]] name = "windows_x86_64_gnu" version = "0.42.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c1040f221285e17ebccbc2591ffdc2d44ee1f9186324dd3e84e99ac68d699c45" [[package]] name = "windows_x86_64_gnullvm" version = "0.42.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "628bfdf232daa22b0d64fdb62b09fcc36bb01f05a3939e20ab73aaf9470d0463" [[package]] name = "windows_x86_64_msvc" version = "0.42.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "447660ad36a13288b1db4d4248e857b510e8c3a225c822ba4fb748c0aafecffd" [[package]] name = "zbus" version = "3.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f770930448dd412a4a7131dd968a8e6df0064db4d7916fbbd2d6c3f26b566938" dependencies = [ "async-broadcast", "async-executor", "async-io", "async-lock", "async-recursion", "async-task", "async-trait", "byteorder", "derivative", "dirs", "enumflags2", "event-listener", "futures-core", "futures-sink", "futures-util", "hex", "nix", "once_cell", "ordered-stream", "rand", "serde", "serde_repr", "sha1", "static_assertions", "tracing", "uds_windows", "winapi", "zbus_macros", "zbus_names", "zvariant", ] [[package]] name = "zbus_macros" version = "3.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4832059b438689017db7340580ebabba07f114eab91bf990c6e55052408b40d8" dependencies = [ "proc-macro-crate", "proc-macro2", "quote", "regex", "syn", ] [[package]] name = "zbus_names" version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f34f314916bd89bdb9934154627fab152f4f28acdda03e7c4c68181b214fe7e3" dependencies = [ "serde", "static_assertions", "zvariant", ] [[package]] name = "zvariant" version = "3.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "903169c05b9ab948ee93fefc9127d08930df4ce031d46c980784274439803e51" dependencies = [ "byteorder", "enumflags2", "libc", "serde", "static_assertions", "url", "zvariant_derive", ] [[package]] name = "zvariant_derive" version = "3.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cce76636e8fab7911be67211cf378c252b115ee7f2bae14b18b84821b39260b5" dependencies = [ "proc-macro-crate", "proc-macro2", "quote", "syn", ] amberol-0.10.3/Cargo.toml000066400000000000000000000020001443320625200151350ustar00rootroot00000000000000# SPDX-FileCopyrightText: 2022 Emmanuele Bassi # SPDX-License-Identifier: GPL-3.0-or-later [package] name = "amberol" authors = ["Emmanuele Bassi "] version = "0.1.0" edition = "2018" [dependencies] color-thief = "0.2.1" gdk-pixbuf = { version = "0.17", features = ["v2_42"] } gettext-rs = { version = "0.7", features = ["gettext-system"] } gtk = { version = "0.6.6", package = "gtk4", features = ["v4_10"] } lofty = "0.11.0" log = "0.4" mpris-player = "0.6" once_cell = "1.10" pretty_env_logger = "0.4" rand = "0.8.5" regex = "1.3.4" serde_json = "1.0" sha2 = "0.10.2" fuzzy-matcher = "0.3.7" [target.'cfg(any(target_os = "linux", target_os = "freebsd"))'.dependencies] ashpd = {version = "0.4.0", features = ["gtk4"]} [dependencies.adw] package = "libadwaita" version = "0.3" features = ["v1_2"] [dependencies.gst] package = "gstreamer" version = "0.20" [dependencies.gst-audio] package = "gstreamer-audio" version = "0.20" [dependencies.gst-player] package = "gstreamer-player" version = "0.20" amberol-0.10.3/LICENSES/000077500000000000000000000000001443320625200144225ustar00rootroot00000000000000amberol-0.10.3/LICENSES/CC-BY-SA-3.0.txt000066400000000000000000000533401443320625200165640ustar00rootroot00000000000000Creative Commons Legal Code Attribution-ShareAlike 3.0 Unported CREATIVE COMMONS CORPORATION IS NOT A LAW FIRM AND DOES NOT PROVIDE LEGAL SERVICES. DISTRIBUTION OF THIS LICENSE DOES NOT CREATE AN ATTORNEY-CLIENT RELATIONSHIP. CREATIVE COMMONS PROVIDES THIS INFORMATION ON AN "AS-IS" BASIS. CREATIVE COMMONS MAKES NO WARRANTIES REGARDING THE INFORMATION PROVIDED, AND DISCLAIMS LIABILITY FOR DAMAGES RESULTING FROM ITS USE. License THE WORK (AS DEFINED BELOW) IS PROVIDED UNDER THE TERMS OF THIS CREATIVE COMMONS PUBLIC LICENSE ("CCPL" OR "LICENSE"). THE WORK IS PROTECTED BY COPYRIGHT AND/OR OTHER APPLICABLE LAW. ANY USE OF THE WORK OTHER THAN AS AUTHORIZED UNDER THIS LICENSE OR COPYRIGHT LAW IS PROHIBITED. BY EXERCISING ANY RIGHTS TO THE WORK PROVIDED HERE, YOU ACCEPT AND AGREE TO BE BOUND BY THE TERMS OF THIS LICENSE. TO THE EXTENT THIS LICENSE MAY BE CONSIDERED TO BE A CONTRACT, THE LICENSOR GRANTS YOU THE RIGHTS CONTAINED HERE IN CONSIDERATION OF YOUR ACCEPTANCE OF SUCH TERMS AND CONDITIONS. 1. Definitions a. "Adaptation" means a work based upon the Work, or upon the Work and other pre-existing works, such as a translation, adaptation, derivative work, arrangement of music or other alterations of a literary or artistic work, or phonogram or performance and includes cinematographic adaptations or any other form in which the Work may be recast, transformed, or adapted including in any form recognizably derived from the original, except that a work that constitutes a Collection will not be considered an Adaptation for the purpose of this License. For the avoidance of doubt, where the Work is a musical work, performance or phonogram, the synchronization of the Work in timed-relation with a moving image ("synching") will be considered an Adaptation for the purpose of this License. b. "Collection" means a collection of literary or artistic works, such as encyclopedias and anthologies, or performances, phonograms or broadcasts, or other works or subject matter other than works listed in Section 1(f) below, which, by reason of the selection and arrangement of their contents, constitute intellectual creations, in which the Work is included in its entirety in unmodified form along with one or more other contributions, each constituting separate and independent works in themselves, which together are assembled into a collective whole. A work that constitutes a Collection will not be considered an Adaptation (as defined below) for the purposes of this License. c. "Creative Commons Compatible License" means a license that is listed at https://creativecommons.org/compatiblelicenses that has been approved by Creative Commons as being essentially equivalent to this License, including, at a minimum, because that license: (i) contains terms that have the same purpose, meaning and effect as the License Elements of this License; and, (ii) explicitly permits the relicensing of adaptations of works made available under that license under this License or a Creative Commons jurisdiction license with the same License Elements as this License. d. "Distribute" means to make available to the public the original and copies of the Work or Adaptation, as appropriate, through sale or other transfer of ownership. e. "License Elements" means the following high-level license attributes as selected by Licensor and indicated in the title of this License: Attribution, ShareAlike. f. "Licensor" means the individual, individuals, entity or entities that offer(s) the Work under the terms of this License. g. "Original Author" means, in the case of a literary or artistic work, the individual, individuals, entity or entities who created the Work or if no individual or entity can be identified, the publisher; and in addition (i) in the case of a performance the actors, singers, musicians, dancers, and other persons who act, sing, deliver, declaim, play in, interpret or otherwise perform literary or artistic works or expressions of folklore; (ii) in the case of a phonogram the producer being the person or legal entity who first fixes the sounds of a performance or other sounds; and, (iii) in the case of broadcasts, the organization that transmits the broadcast. h. "Work" means the literary and/or artistic work offered under the terms of this License including without limitation any production in the literary, scientific and artistic domain, whatever may be the mode or form of its expression including digital form, such as a book, pamphlet and other writing; a lecture, address, sermon or other work of the same nature; a dramatic or dramatico-musical work; a choreographic work or entertainment in dumb show; a musical composition with or without words; a cinematographic work to which are assimilated works expressed by a process analogous to cinematography; a work of drawing, painting, architecture, sculpture, engraving or lithography; a photographic work to which are assimilated works expressed by a process analogous to photography; a work of applied art; an illustration, map, plan, sketch or three-dimensional work relative to geography, topography, architecture or science; a performance; a broadcast; a phonogram; a compilation of data to the extent it is protected as a copyrightable work; or a work performed by a variety or circus performer to the extent it is not otherwise considered a literary or artistic work. i. "You" means an individual or entity exercising rights under this License who has not previously violated the terms of this License with respect to the Work, or who has received express permission from the Licensor to exercise rights under this License despite a previous violation. j. "Publicly Perform" means to perform public recitations of the Work and to communicate to the public those public recitations, by any means or process, including by wire or wireless means or public digital performances; to make available to the public Works in such a way that members of the public may access these Works from a place and at a place individually chosen by them; to perform the Work to the public by any means or process and the communication to the public of the performances of the Work, including by public digital performance; to broadcast and rebroadcast the Work by any means including signs, sounds or images. k. "Reproduce" means to make copies of the Work by any means including without limitation by sound or visual recordings and the right of fixation and reproducing fixations of the Work, including storage of a protected performance or phonogram in digital form or other electronic medium. 2. Fair Dealing Rights. Nothing in this License is intended to reduce, limit, or restrict any uses free from copyright or rights arising from limitations or exceptions that are provided for in connection with the copyright protection under copyright law or other applicable laws. 3. License Grant. Subject to the terms and conditions of this License, Licensor hereby grants You a worldwide, royalty-free, non-exclusive, perpetual (for the duration of the applicable copyright) license to exercise the rights in the Work as stated below: a. to Reproduce the Work, to incorporate the Work into one or more Collections, and to Reproduce the Work as incorporated in the Collections; b. to create and Reproduce Adaptations provided that any such Adaptation, including any translation in any medium, takes reasonable steps to clearly label, demarcate or otherwise identify that changes were made to the original Work. For example, a translation could be marked "The original work was translated from English to Spanish," or a modification could indicate "The original work has been modified."; c. to Distribute and Publicly Perform the Work including as incorporated in Collections; and, d. to Distribute and Publicly Perform Adaptations. e. For the avoidance of doubt: i. Non-waivable Compulsory License Schemes. In those jurisdictions in which the right to collect royalties through any statutory or compulsory licensing scheme cannot be waived, the Licensor reserves the exclusive right to collect such royalties for any exercise by You of the rights granted under this License; ii. Waivable Compulsory License Schemes. In those jurisdictions in which the right to collect royalties through any statutory or compulsory licensing scheme can be waived, the Licensor waives the exclusive right to collect such royalties for any exercise by You of the rights granted under this License; and, iii. Voluntary License Schemes. The Licensor waives the right to collect royalties, whether individually or, in the event that the Licensor is a member of a collecting society that administers voluntary licensing schemes, via that society, from any exercise by You of the rights granted under this License. The above rights may be exercised in all media and formats whether now known or hereafter devised. The above rights include the right to make such modifications as are technically necessary to exercise the rights in other media and formats. Subject to Section 8(f), all rights not expressly granted by Licensor are hereby reserved. 4. Restrictions. The license granted in Section 3 above is expressly made subject to and limited by the following restrictions: a. You may Distribute or Publicly Perform the Work only under the terms of this License. You must include a copy of, or the Uniform Resource Identifier (URI) for, this License with every copy of the Work You Distribute or Publicly Perform. You may not offer or impose any terms on the Work that restrict the terms of this License or the ability of the recipient of the Work to exercise the rights granted to that recipient under the terms of the License. You may not sublicense the Work. You must keep intact all notices that refer to this License and to the disclaimer of warranties with every copy of the Work You Distribute or Publicly Perform. When You Distribute or Publicly Perform the Work, You may not impose any effective technological measures on the Work that restrict the ability of a recipient of the Work from You to exercise the rights granted to that recipient under the terms of the License. This Section 4(a) applies to the Work as incorporated in a Collection, but this does not require the Collection apart from the Work itself to be made subject to the terms of this License. If You create a Collection, upon notice from any Licensor You must, to the extent practicable, remove from the Collection any credit as required by Section 4(c), as requested. If You create an Adaptation, upon notice from any Licensor You must, to the extent practicable, remove from the Adaptation any credit as required by Section 4(c), as requested. b. You may Distribute or Publicly Perform an Adaptation only under the terms of: (i) this License; (ii) a later version of this License with the same License Elements as this License; (iii) a Creative Commons jurisdiction license (either this or a later license version) that contains the same License Elements as this License (e.g., Attribution-ShareAlike 3.0 US)); (iv) a Creative Commons Compatible License. If you license the Adaptation under one of the licenses mentioned in (iv), you must comply with the terms of that license. If you license the Adaptation under the terms of any of the licenses mentioned in (i), (ii) or (iii) (the "Applicable License"), you must comply with the terms of the Applicable License generally and the following provisions: (I) You must include a copy of, or the URI for, the Applicable License with every copy of each Adaptation You Distribute or Publicly Perform; (II) You may not offer or impose any terms on the Adaptation that restrict the terms of the Applicable License or the ability of the recipient of the Adaptation to exercise the rights granted to that recipient under the terms of the Applicable License; (III) You must keep intact all notices that refer to the Applicable License and to the disclaimer of warranties with every copy of the Work as included in the Adaptation You Distribute or Publicly Perform; (IV) when You Distribute or Publicly Perform the Adaptation, You may not impose any effective technological measures on the Adaptation that restrict the ability of a recipient of the Adaptation from You to exercise the rights granted to that recipient under the terms of the Applicable License. This Section 4(b) applies to the Adaptation as incorporated in a Collection, but this does not require the Collection apart from the Adaptation itself to be made subject to the terms of the Applicable License. c. If You Distribute, or Publicly Perform the Work or any Adaptations or Collections, You must, unless a request has been made pursuant to Section 4(a), keep intact all copyright notices for the Work and provide, reasonable to the medium or means You are utilizing: (i) the name of the Original Author (or pseudonym, if applicable) if supplied, and/or if the Original Author and/or Licensor designate another party or parties (e.g., a sponsor institute, publishing entity, journal) for attribution ("Attribution Parties") in Licensor's copyright notice, terms of service or by other reasonable means, the name of such party or parties; (ii) the title of the Work if supplied; (iii) to the extent reasonably practicable, the URI, if any, that Licensor specifies to be associated with the Work, unless such URI does not refer to the copyright notice or licensing information for the Work; and (iv) , consistent with Ssection 3(b), in the case of an Adaptation, a credit identifying the use of the Work in the Adaptation (e.g., "French translation of the Work by Original Author," or "Screenplay based on original Work by Original Author"). The credit required by this Section 4(c) may be implemented in any reasonable manner; provided, however, that in the case of a Adaptation or Collection, at a minimum such credit will appear, if a credit for all contributing authors of the Adaptation or Collection appears, then as part of these credits and in a manner at least as prominent as the credits for the other contributing authors. For the avoidance of doubt, You may only use the credit required by this Section for the purpose of attribution in the manner set out above and, by exercising Your rights under this License, You may not implicitly or explicitly assert or imply any connection with, sponsorship or endorsement by the Original Author, Licensor and/or Attribution Parties, as appropriate, of You or Your use of the Work, without the separate, express prior written permission of the Original Author, Licensor and/or Attribution Parties. d. Except as otherwise agreed in writing by the Licensor or as may be otherwise permitted by applicable law, if You Reproduce, Distribute or Publicly Perform the Work either by itself or as part of any Adaptations or Collections, You must not distort, mutilate, modify or take other derogatory action in relation to the Work which would be prejudicial to the Original Author's honor or reputation. Licensor agrees that in those jurisdictions (e.g. Japan), in which any exercise of the right granted in Section 3(b) of this License (the right to make Adaptations) would be deemed to be a distortion, mutilation, modification or other derogatory action prejudicial to the Original Author's honor and reputation, the Licensor will waive or not assert, as appropriate, this Section, to the fullest extent permitted by the applicable national law, to enable You to reasonably exercise Your right under Section 3(b) of this License (right to make Adaptations) but not otherwise. 5. Representations, Warranties and Disclaimer UNLESS OTHERWISE MUTUALLY AGREED TO BY THE PARTIES IN WRITING, LICENSOR OFFERS THE WORK AS-IS AND MAKES NO REPRESENTATIONS OR WARRANTIES OF ANY KIND CONCERNING THE WORK, EXPRESS, IMPLIED, STATUTORY OR OTHERWISE, INCLUDING, WITHOUT LIMITATION, WARRANTIES OF TITLE, MERCHANTIBILITY, FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT, OR THE ABSENCE OF LATENT OR OTHER DEFECTS, ACCURACY, OR THE PRESENCE OF ABSENCE OF ERRORS, WHETHER OR NOT DISCOVERABLE. SOME JURISDICTIONS DO NOT ALLOW THE EXCLUSION OF IMPLIED WARRANTIES, SO SUCH EXCLUSION MAY NOT APPLY TO YOU. 6. Limitation on Liability. EXCEPT TO THE EXTENT REQUIRED BY APPLICABLE LAW, IN NO EVENT WILL LICENSOR BE LIABLE TO YOU ON ANY LEGAL THEORY FOR ANY SPECIAL, INCIDENTAL, CONSEQUENTIAL, PUNITIVE OR EXEMPLARY DAMAGES ARISING OUT OF THIS LICENSE OR THE USE OF THE WORK, EVEN IF LICENSOR HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. 7. Termination a. This License and the rights granted hereunder will terminate automatically upon any breach by You of the terms of this License. Individuals or entities who have received Adaptations or Collections from You under this License, however, will not have their licenses terminated provided such individuals or entities remain in full compliance with those licenses. Sections 1, 2, 5, 6, 7, and 8 will survive any termination of this License. b. Subject to the above terms and conditions, the license granted here is perpetual (for the duration of the applicable copyright in the Work). Notwithstanding the above, Licensor reserves the right to release the Work under different license terms or to stop distributing the Work at any time; provided, however that any such election will not serve to withdraw this License (or any other license that has been, or is required to be, granted under the terms of this License), and this License will continue in full force and effect unless terminated as stated above. 8. Miscellaneous a. Each time You Distribute or Publicly Perform the Work or a Collection, the Licensor offers to the recipient a license to the Work on the same terms and conditions as the license granted to You under this License. b. Each time You Distribute or Publicly Perform an Adaptation, Licensor offers to the recipient a license to the original Work on the same terms and conditions as the license granted to You under this License. c. If any provision of this License is invalid or unenforceable under applicable law, it shall not affect the validity or enforceability of the remainder of the terms of this License, and without further action by the parties to this agreement, such provision shall be reformed to the minimum extent necessary to make such provision valid and enforceable. d. No term or provision of this License shall be deemed waived and no breach consented to unless such waiver or consent shall be in writing and signed by the party to be charged with such waiver or consent. e. This License constitutes the entire agreement between the parties with respect to the Work licensed here. There are no understandings, agreements or representations with respect to the Work not specified here. Licensor shall not be bound by any additional provisions that may appear in any communication from You. This License may not be modified without the mutual written agreement of the Licensor and You. f. The rights granted under, and the subject matter referenced, in this License were drafted utilizing the terminology of the Berne Convention for the Protection of Literary and Artistic Works (as amended on September 28, 1979), the Rome Convention of 1961, the WIPO Copyright Treaty of 1996, the WIPO Performances and Phonograms Treaty of 1996 and the Universal Copyright Convention (as revised on July 24, 1971). These rights and subject matter take effect in the relevant jurisdiction in which the License terms are sought to be enforced according to the corresponding provisions of the implementation of those treaty provisions in the applicable national law. If the standard suite of rights granted under applicable copyright law includes additional rights not granted under this License, such additional rights are deemed to be included in the License; this License is not intended to restrict the license of any rights under applicable law. Creative Commons Notice Creative Commons is not a party to this License, and makes no warranty whatsoever in connection with the Work. Creative Commons will not be liable to You or any party on any legal theory for any damages whatsoever, including without limitation any general, special, incidental or consequential damages arising in connection to this license. Notwithstanding the foregoing two (2) sentences, if Creative Commons has expressly identified itself as the Licensor hereunder, it shall have all rights and obligations of Licensor. Except for the limited purpose of indicating to the public that the Work is licensed under the CCPL, Creative Commons does not authorize the use by either party of the trademark "Creative Commons" or any related trademark or logo of Creative Commons without the prior written consent of Creative Commons. Any permitted use will be in compliance with Creative Commons' then-current trademark usage guidelines, as may be published on its website or otherwise made available upon request from time to time. For the avoidance of doubt, this trademark restriction does not form part of the License. Creative Commons may be contacted at https://creativecommons.org/. amberol-0.10.3/LICENSES/CC0-1.0.txt000066400000000000000000000154041443320625200160300ustar00rootroot00000000000000Creative Commons Legal Code CC0 1.0 Universal CREATIVE COMMONS CORPORATION IS NOT A LAW FIRM AND DOES NOT PROVIDE LEGAL SERVICES. DISTRIBUTION OF THIS DOCUMENT DOES NOT CREATE AN ATTORNEY-CLIENT RELATIONSHIP. CREATIVE COMMONS PROVIDES THIS INFORMATION ON AN "AS-IS" BASIS. CREATIVE COMMONS MAKES NO WARRANTIES REGARDING THE USE OF THIS DOCUMENT OR THE INFORMATION OR WORKS PROVIDED HEREUNDER, AND DISCLAIMS LIABILITY FOR DAMAGES RESULTING FROM THE USE OF THIS DOCUMENT OR THE INFORMATION OR WORKS PROVIDED HEREUNDER. Statement of Purpose The laws of most jurisdictions throughout the world automatically confer exclusive Copyright and Related Rights (defined below) upon the creator and subsequent owner(s) (each and all, an "owner") of an original work of authorship and/or a database (each, a "Work"). Certain owners wish to permanently relinquish those rights to a Work for the purpose of contributing to a commons of creative, cultural and scientific works ("Commons") that the public can reliably and without fear of later claims of infringement build upon, modify, incorporate in other works, reuse and redistribute as freely as possible in any form whatsoever and for any purposes, including without limitation commercial purposes. These owners may contribute to the Commons to promote the ideal of a free culture and the further production of creative, cultural and scientific works, or to gain reputation or greater distribution for their Work in part through the use and efforts of others. For these and/or other purposes and motivations, and without any expectation of additional consideration or compensation, the person associating CC0 with a Work (the "Affirmer"), to the extent that he or she is an owner of Copyright and Related Rights in the Work, voluntarily elects to apply CC0 to the Work and publicly distribute the Work under its terms, with knowledge of his or her Copyright and Related Rights in the Work and the meaning and intended legal effect of CC0 on those rights. 1. Copyright and Related Rights. A Work made available under CC0 may be protected by copyright and related or neighboring rights ("Copyright and Related Rights"). Copyright and Related Rights include, but are not limited to, the following: i. the right to reproduce, adapt, distribute, perform, display, communicate, and translate a Work; ii. moral rights retained by the original author(s) and/or performer(s); iii. publicity and privacy rights pertaining to a person's image or likeness depicted in a Work; iv. rights protecting against unfair competition in regards to a Work, subject to the limitations in paragraph 4(a), below; v. rights protecting the extraction, dissemination, use and reuse of data in a Work; vi. database rights (such as those arising under Directive 96/9/EC of the European Parliament and of the Council of 11 March 1996 on the legal protection of databases, and under any national implementation thereof, including any amended or successor version of such directive); and vii. other similar, equivalent or corresponding rights throughout the world based on applicable law or treaty, and any national implementations thereof. 2. Waiver. To the greatest extent permitted by, but not in contravention of, applicable law, Affirmer hereby overtly, fully, permanently, irrevocably and unconditionally waives, abandons, and surrenders all of Affirmer's Copyright and Related Rights and associated claims and causes of action, whether now known or unknown (including existing as well as future claims and causes of action), in the Work (i) in all territories worldwide, (ii) for the maximum duration provided by applicable law or treaty (including future time extensions), (iii) in any current or future medium and for any number of copies, and (iv) for any purpose whatsoever, including without limitation commercial, advertising or promotional purposes (the "Waiver"). Affirmer makes the Waiver for the benefit of each member of the public at large and to the detriment of Affirmer's heirs and successors, fully intending that such Waiver shall not be subject to revocation, rescission, cancellation, termination, or any other legal or equitable action to disrupt the quiet enjoyment of the Work by the public as contemplated by Affirmer's express Statement of Purpose. 3. Public License Fallback. Should any part of the Waiver for any reason be judged legally invalid or ineffective under applicable law, then the Waiver shall be preserved to the maximum extent permitted taking into account Affirmer's express Statement of Purpose. In addition, to the extent the Waiver is so judged Affirmer hereby grants to each affected person a royalty-free, non transferable, non sublicensable, non exclusive, irrevocable and unconditional license to exercise Affirmer's Copyright and Related Rights in the Work (i) in all territories worldwide, (ii) for the maximum duration provided by applicable law or treaty (including future time extensions), (iii) in any current or future medium and for any number of copies, and (iv) for any purpose whatsoever, including without limitation commercial, advertising or promotional purposes (the "License"). The License shall be deemed effective as of the date CC0 was applied by Affirmer to the Work. Should any part of the License for any reason be judged legally invalid or ineffective under applicable law, such partial invalidity or ineffectiveness shall not invalidate the remainder of the License, and in such case Affirmer hereby affirms that he or she will not (i) exercise any of his or her remaining Copyright and Related Rights in the Work or (ii) assert any associated claims and causes of action with respect to the Work, in either case contrary to Affirmer's express Statement of Purpose. 4. Limitations and Disclaimers. a. No trademark or patent rights held by Affirmer are waived, abandoned, surrendered, licensed or otherwise affected by this document. b. Affirmer offers the Work as-is and makes no representations or warranties of any kind concerning the Work, express, implied, statutory or otherwise, including without limitation warranties of title, merchantability, fitness for a particular purpose, non infringement, or the absence of latent or other defects, accuracy, or the present or absence of errors, whether or not discoverable, all to the greatest extent permissible under applicable law. c. Affirmer disclaims responsibility for clearing rights of other persons that may apply to the Work or any use thereof, including without limitation any person's Copyright and Related Rights in the Work. Further, Affirmer disclaims responsibility for obtaining any necessary consents, permissions or other rights required for any use of the Work. d. Affirmer understands and acknowledges that Creative Commons is not a party to this document and has no duty or obligation with respect to this CC0 or use of the Work. amberol-0.10.3/LICENSES/GPL-3.0-or-later.txt000066400000000000000000001045151443320625200176340ustar00rootroot00000000000000 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 . amberol-0.10.3/README.md000066400000000000000000000056631443320625200145060ustar00rootroot00000000000000Amberol ======= ![Application icon](./data/icons/hicolor/scalable/apps/io.bassi.Amberol.svg) A small and simple sound and music player that is well integrated with GNOME. Amberol aspires to be as small, unintrusive, and simple as possible. It does not manage your music collection; it does not let you manage playlists, smart or otherwise; it does not let you edit the metadata for your songs; it does not show you lyrics for your songs, or the Wikipedia page for your bands. Amberol plays music, and nothing else. ![Full UI](./data/screenshots/amberol-full.png) ![Compact UI](./data/screenshots/amberol-compact.png) Flatpak builds -------------- The recommended way of installing Amberol is through Flatpak. If you don't have Flatpak installed, you can get it from [the Flatpak website](https://flatpak.org/setup). You can install stable builds of Amberol from [Flathub](https://flathub.org) by using this command: flatpak remote-add --if-not-exists flathub https://flathub.org/repo/flathub.flatpakrepo flatpak install flathub io.bassi.Amberol Getting in touch ---------------- If you have questions about Amberol, you can join the [`#amberol:gnome.org`](https://matrix.to/#/#amberol:gnome.org) channel on Matrix, or use the [GNOME Discourse instance](https://discourse.gnome.org/c/applications/7). Contributing ------------ Please, see the [contribution guide](./CONTRIBUTING.md) if you wish to report and issue, fix a bug, or implement a new feature. How to obtain debugging information ----------------------------------- Run Amberol from your terminal using: RUST_BACKTRACE=1 RUST_LOG=amberol=debug flatpak run io.bassi.Amberol to obtain a full debug log. Translations ------------ Amberol is translated on the [GNOME translation platform](https://l10n.gnome.org/module/amberol). You should contact the coordinator of [the localization team for your language](https://l10n.gnome.org/teams/) if you have questions. For more information, please see the [GNOME Translation Project wiki](https://wiki.gnome.org/TranslationProject). Code of conduct --------------- Amberol follows the GNOME project [Code of Conduct](./code-of-conduct.md). All communications in project spaces, such as the issue tracker or [Discourse](https://discourse.gnome.org) are expected to follow it. Why is it called "Amberol"? --------------------------- The name comes from the the [Blue Amberol Records](https://en.wikipedia.org/wiki/Blue_Amberol_Records), a type of cylinder records made of (blue) nitrocellulose, capable of playback durations of around four minutes, just about the length of the average song since 1990. Copyright and licensing ----------------------- Copyright 2022 Emmanuele Bassi Amberol is released under the terms of the GNU General Public License, either version 3.0 or, at your option, any later version. amberol-0.10.3/RELEASING.md000066400000000000000000000026141443320625200150530ustar00rootroot00000000000000Releasing Amberol ================= QA Plan ------- 1. Initial state - Open folder - Open file - Drag and drop 2. Main view - Play/pause - Previous/next - Scrubbing 3. Playlist - Shuffle - Repeat: all, one, continuous - Select - Remove song - Remove all - Toggle playlist Release ------- Checklist for a release. - [ ] Update the [change log](./CHANGES.md) - [ ] **Added**: New features, settings, UI, translations - [ ] **Changed**: UI updates, improvements, translation updates - [ ] **Fixed**: bug fixes, with reference - [ ] **Removed**: Removed features, settings, UI; **IMPORTANT**: anything inside this list requires a version bump - [ ] Update the [appdata](./data/io.bassi.Amberol.appdata.xml.in.in) - [ ] New `` element - [ ] *Optional*: new screenshots - [ ] `git commit -m 'Release Amberol $VERSION'` - [ ] `meson dist` - [ ] `git tag -s $VERSION` (use the change log entry) - [ ] Bump up the project version in [`meson.build`](./meson.build) - [ ] `git push origin HEAD && git push origin $VERSION` - [ ] Create a new release on [GitLab](https://gitlab.gnome.org/World/amberol/-/releases) - [ ] Copy the `CHANGES.md` entry - [ ] Attach the release tarball and the SHA256 checksum files Flathub ------- - [ ] Update the `io.bassi.Amberol.json` manifest - [ ] Change the archive URL - [ ] Change the SHA256 checksum - [ ] `git push origin HEAD` amberol-0.10.3/amberol.doap000066400000000000000000000020741443320625200155060ustar00rootroot00000000000000 Amberol Plays music, and nothing else Rust GTK 4 Libadwaita Emmanuele Bassi ebassi amberol-0.10.3/build-aux/000077500000000000000000000000001443320625200151075ustar00rootroot00000000000000amberol-0.10.3/build-aux/checks.sh000077500000000000000000000274351443320625200167210ustar00rootroot00000000000000#!/bin/bash # # SPDX-FileCopyrightText: 2021 Alejandro Domínguez # SPDX-FileCopyrightText: 2022 Kévin Commaile # SPDX-License-Identifier: GPL-3.0-or-later export LC_ALL=C # Usage info show_help() { cat << EOF Run conformity checks on the current Rust project. If a dependency is not found, helps the user to install it. USAGE: ${0##*/} [OPTIONS] OPTIONS: -f, --force-install Install missing dependencies without asking -v, --verbose Use verbose output -h, --help Display this help and exit ERROR CODES: 1 Check failed 2 Missing dependency EOF } # Style helpers act="\e[1;32m" err="\e[1;31m" pos="\e[32m" neg="\e[31m" res="\e[0m" # Common styled strings Installing="${act}Installing${res}" Checking=" ${act}Checking${res}" Failed=" ${err}Failed${res}" error="${err}error:${res}" invalid="${neg}Invalid input${res}" ok="${pos}ok${res}" fail="${neg}fail${res}" # Initialize variables force_install=0 verbose=0 # Helper functions # Sort to_sort in natural order. sort() { local size=${#to_sort[@]} local swapped=0; for (( i = 0; i < $size-1; i++ )) do swapped=0 for ((j = 0; j < $size-1-$i; j++ )) do if [[ "${to_sort[$j]}" > "${to_sort[$j+1]}" ]] then temp="${to_sort[$j]}"; to_sort[$j]="${to_sort[$j+1]}"; to_sort[$j+1]="$temp"; swapped=1; fi done if [[ $swapped -eq 0 ]]; then break; fi done } # Remove common entries in to_diff1 and to_diff2. diff() { for i in ${!to_diff1[@]}; do for j in ${!to_diff2[@]}; do if [[ "${to_diff1[$i]}" == "${to_diff2[$j]}" ]]; then unset to_diff1[$i] unset to_diff2[$j] break fi done done } # Check if rustup is available. # Argument: # '-i' to install if missing. check_rustup() { if ! which rustup &> /dev/null; then if [[ "$1" == '-i' ]]; then echo -e "$Installing rustup…" curl https://sh.rustup.rs -sSf | sh -s -- -y --default-toolchain nightly export PATH=$PATH:$HOME/.cargo/bin if ! which rustup &> /dev/null; then echo -e "$Failed to install rustup" exit 2 fi else exit 2 fi fi } # Install cargo via rustup. install_cargo() { check_rustup -i if ! which cargo >/dev/null 2>&1; then echo -e "$Failed to install cargo" exit 2 fi } # Check if cargo is available. If not, ask to install it. check_cargo() { if ! which cargo >/dev/null 2>&1; then echo "Unable to find cargo" if [[ $force_install -eq 1 ]]; then install_cargo elif [ ! -t 1 ]; then exit 2 elif check_rustup; then echo -e "$error rustup is installed but the cargo command isn't available" exit 2 else echo "" echo "y: Install cargo via rustup" echo "N: Don't install cargo and abort checks" echo "" while true; do echo -n "Install cargo? [y/N]: "; read yn < /dev/tty case $yn in [Yy]* ) install_cargo break ;; [Nn]* | "" ) exit 2 ;; * ) echo $invalid ;; esac done fi fi if [[ $verbose -eq 1 ]]; then echo "" rustc -Vv && cargo +nightly -Vv fi } # Install rustfmt with rustup. install_rustfmt() { check_rustup -i echo -e "$Installing rustfmt…" rustup component add --toolchain nightly rustfmt if ! cargo +nightly fmt --version >/dev/null 2>&1; then echo -e "$Failed to install rustfmt" exit 2 fi } # Run rustfmt to enforce code style. run_rustfmt() { if ! cargo fmt --version >/dev/null 2>&1; then if [[ $force_install -eq 1 ]]; then install_rustfmt elif [ ! -t 1 ]; then echo "Unable to check the project's code style, because rustfmt could not be run" exit 2 else echo "Rustfmt is needed to check the project's code style, but it isn’t available" echo "" echo "y: Install rustfmt via rustup" echo "N: Don't install rustfmt and abort checks" echo "" while true; do echo -n "Install rustfmt? [y/N]: "; read yn < /dev/tty case $yn in [Yy]* ) install_rustfmt break ;; [Nn]* | "" ) exit 2 ;; * ) echo $invalid ;; esac done fi fi echo -e "$Checking code style…" if [[ $verbose -eq 1 ]]; then echo "" cargo fmt --version echo "" fi if ! cargo fmt --all -- --check; then echo -e " Checking code style result: $fail" echo "Please fix the above issues, either manually or by running: cargo fmt --all" exit 1 else echo -e " Checking code style result: $ok" fi } # Install typos with cargo. install_typos() { echo -e "$Installing typos…" cargo install typos-cli if ! typos --version >/dev/null 2>&1; then echo -e "$Failed to install typos" exit 2 fi } # Run typos to check for spelling mistakes. run_typos() { if ! typos --version >/dev/null 2>&1; then if [[ $force_install -eq 1 ]]; then install_typos elif [ ! -t 1 ]; then echo "Unable to check spelling mistakes, because typos could not be run" exit 2 else echo "Typos is needed to check spelling mistakes, but it isn’t available" echo "" echo "y: Install typos via cargo" echo "N: Don't install typos and abort checks" echo "" while true; do echo -n "Install typos? [y/N]: "; read yn < /dev/tty case $yn in [Yy]* ) install_typos break ;; [Nn]* | "" ) exit 2 ;; * ) echo $invalid ;; esac done fi fi echo -e "$Checking spelling mistakes…" if [[ $verbose -eq 1 ]]; then echo "" typos --version echo "" fi if ! typos --color always; then echo -e " Checking spelling mistakes result: $fail" echo "Please fix the above issues, either manually or by running: typos -w" exit 1 else echo -e " Checking spelling mistakes result: $ok" fi } # Check if files in POTFILES are correct. # # This checks, in that order: # - All files exist # - All files with translatable strings are present and only those # - Files are sorted alphabetically # # This assumes the following: # - POTFILES.in is located at 'po/POTFILES.in' # - UI (Glade) files are located in 'src/gtk/' and use 'translatable="yes"' # - Rust files are located in 'src' and use 'i18n' methods or macros check_potfiles() { echo -e "$Checking po/POTFILES.in…" local ret=0 # Check that files in POTFILES exist. while read -r line; do if [[ -n $line && ${line::1} != '#' ]]; then if [[ ! -f $line ]]; then echo -e "$error File '$line' in POTFILES does not exist" ret=1 fi if [[ ${line:(-3):3} == '.ui' ]]; then ui_potfiles+=($line) elif [[ ${line:(-3):3} == '.rs' ]]; then rs_potfiles+=($line) fi fi done < po/POTFILES.in if [[ ret -eq 1 ]]; then echo -e " Checking po/POTFILES.in result: $fail" echo "Please fix the above issues" exit 1 fi # Get UI files with 'translatable="yes"'. ui_files=(`grep -lIr 'translatable="yes"' src/gtk/*.ui`) # Get Rust files with regex 'i18n[!]?\('. rs_files=(`grep -lIrE 'i18n[!]?\(' --exclude=src/i18n.rs src/*`) # Remove common files to_diff1=("${ui_potfiles[@]}") to_diff2=("${ui_files[@]}") diff ui_potfiles=("${to_diff1[@]}") ui_files=("${to_diff2[@]}") to_diff1=("${rs_potfiles[@]}") to_diff2=("${rs_files[@]}") diff rs_potfiles=("${to_diff1[@]}") rs_files=("${to_diff2[@]}") potfiles_count=$((${#ui_potfiles[@]} + ${#rs_potfiles[@]})) if [[ $potfiles_count -eq 1 ]]; then echo "" echo -e "$error Found 1 file in POTFILES without translatable strings:" ret=1 elif [[ $potfiles_count -ne 0 ]]; then echo "" echo -e "$error Found $potfiles_count files in POTFILES without translatable strings:" ret=1 fi for file in ${ui_potfiles[@]}; do echo $file done for file in ${rs_potfiles[@]}; do echo $file done let files_count=$((${#ui_files[@]} + ${#rs_files[@]})) if [[ $files_count -eq 1 ]]; then echo "" echo -e "$error Found 1 file with translatable strings not present in POTFILES:" ret=1 elif [[ $files_count -ne 0 ]]; then echo "" echo -e "$error Found $files_count with translatable strings not present in POTFILES:" ret=1 fi for file in ${ui_files[@]}; do echo $file done for file in ${rs_files[@]}; do echo $file done if [[ ret -eq 1 ]]; then echo "" echo -e " Checking po/POTFILES.in result: $fail" echo "Please fix the above issues" exit 1 fi # Check sorted alphabetically to_sort=("${potfiles[@]}") sort for i in ${!potfiles[@]}; do if [[ "${potfiles[$i]}" != "${to_sort[$i]}" ]]; then echo -e "$error Found file '${potfiles[$i]}' before '${to_sort[$i]}' in POTFILES" ret=1 break fi done if [[ ret -eq 1 ]]; then echo "" echo -e " Checking po/POTFILES.in result: $fail" echo "Please fix the above issues" exit 1 else echo -e " Checking po/POTFILES.in result: $ok" fi } # Check if files in src/amberol.gresource.xml are sorted alphabetically. check_resources() { echo -e "$Checking src/amberol.gresource.xml…" local ret=0 # Get files. regex="(.*)" while read -r line; do if [[ $line =~ $regex ]]; then files+=("${BASH_REMATCH[1]}") fi done < src/amberol.gresource.xml # Check sorted alphabetically to_sort=("${files[@]}") sort for i in ${!files[@]}; do if [[ "${files[$i]}" != "${to_sort[$i]}" ]]; then echo -e "$error Found file '${files[$i]#src/}' before '${to_sort[$i]#src/}' in amberol.gresource.xml" ret=1 break fi done if [[ ret -eq 1 ]]; then echo "" echo -e " Checking src/amberol.gresource.xml result: $fail" echo "Please fix the above issues" exit 1 else echo -e " Checking src/amberol.gresource.xml result: $ok" fi } # Check arguments while [[ "$1" ]]; do case $1 in -f | --force-install ) force_install=1 ;; -v | --verbose ) verbose=1 ;; -h | --help ) show_help exit 0 ;; *) show_help >&2 exit 1 esac; shift; done # Run check_cargo echo "" run_rustfmt echo "" run_typos echo "" check_potfiles echo "" check_resources echo "" amberol-0.10.3/build-aux/dist-vendor.sh000077500000000000000000000005471443320625200177120ustar00rootroot00000000000000#!/bin/sh # SPDX-FileCopyrightText: 2019 Christopher Davis # SPDX-License-Identifier: GPL-3.0-or-later export SOURCE_ROOT="$1" export DIST="$2" cd "$SOURCE_ROOT" mkdir "$DIST"/.cargo cargo vendor | sed 's/^directory = ".*"/directory = "vendor"/g' > $DIST/.cargo/config # Move vendor into dist tarball directory mv vendor "$DIST" amberol-0.10.3/code-of-conduct.md000066400000000000000000000256161443320625200165220ustar00rootroot00000000000000 # GNOME Code of Conduct Thank you for being a part of the GNOME project. We value your participation and want everyone to have an enjoyable and fulfilling experience. Accordingly, all participants are expected to follow this Code of Conduct, and to show respect, understanding, and consideration to one another. Thank you for helping make this a welcoming, friendly community for everyone. ## Scope This Code of Conduct applies to all online GNOME community spaces, including, but not limited to: * Issue tracking systems - bugzilla.gnome.org * Documentation and tutorials - developer.gnome.org * Code repositories - git.gnome.org and gitlab.gnome.org * Mailing lists - mail.gnome.org * Wikis - wiki.gnome.org * Chat and forums - irc.gnome.org, discourse.gnome.org, GNOME Telegram channels, and GNOME groups and channels on Matrix.org (including bridges to GNOME IRC channels) * Community spaces hosted on gnome.org infrastructure * Any other channels or groups which exist in order to discuss GNOME project activities Communication channels and private conversations that are normally out of scope may be considered in scope if a GNOME participant is being stalked or harassed. Social media conversations may be considered in-scope if the incident occurred under a GNOME event hashtag, or when an official GNOME account on social media is tagged, or within any other discussion about GNOME. The GNOME Foundation reserves the right to take actions against behaviors that happen in any context, if they are deemed to be relevant to the GNOME project and its participants. All participants in GNOME online community spaces are subject to the Code of Conduct. This includes GNOME Foundation board members, corporate sponsors, and paid employees. This also includes volunteers, maintainers, leaders, contributors, contribution reviewers, issue reporters, GNOME users, and anyone participating in discussion in GNOME online spaces. ## Reporting an Incident If you believe that someone is violating the Code of Conduct, or have any other concerns, please [contact the Code of Conduct committee](https://wiki.gnome.org/Foundation/CodeOfConduct/ReporterGuide). ## Our Standards The GNOME online community is dedicated to providing a positive experience for everyone, regardless of: * age * body size * caste * citizenship * disability * education * ethnicity * familial status * gender expression * gender identity * genetic information * immigration status * level of experience * nationality * personal appearance * pregnancy * race * religion * sex characteristics * sexual orientation * sexual identity * socio-economic status * tribe * veteran status ### Community Guidelines Examples of behavior that contributes to creating a positive environment include: * **Be friendly.** Use welcoming and inclusive language. * **Be empathetic.** Be respectful of differing viewpoints and experiences. * **Be respectful.** When we disagree, we do so in a polite and constructive manner. * **Be considerate.** Remember that decisions are often a difficult choice between competing priorities. Focus on what is best for the community. Keep discussions around technology choices constructive and respectful. * **Be patient and generous.** If someone asks for help it is because they need it. When documentation is available that answers the question, politely point them to it. If the question is off-topic, suggest a more appropriate online space to seek help. * **Try to be concise.** Read the discussion before commenting in order to not repeat a point that has been made. ### Inappropriate Behavior Community members asked to stop any inappropriate behavior are expected to comply immediately. We want all participants in the GNOME community have the best possible experience they can. In order to be clear what that means, we've provided a list of examples of behaviors that are inappropriate for GNOME community spaces: * **Deliberate intimidation, stalking, or following.** * **Sustained disruption of online discussion, talks, or other events.** Sustained disruption of events, online discussions, or meetings, including talks and presentations, will not be tolerated. This includes 'Talking over' or 'heckling' event speakers or influencing crowd actions that cause hostility in event sessions. Sustained disruption also includes drinking alcohol to excess or using recreational drugs to excess, or pushing others to do so. * **Harassment of people who don't drink alcohol.** We do not tolerate derogatory comments about those who abstain from alcohol or other substances. We do not tolerate pushing people to drink, talking about their abstinence or preferences to others, or pressuring them to drink - physically or through jeering. * **Sexist, racist, homophobic, transphobic, ableist language or otherwise exclusionary language.** This includes deliberately referring to someone by a gender that they do not identify with, and/or questioning the legitimacy of an individual's gender identity. If you're unsure if a word is derogatory, don't use it. This also includes repeated subtle and/or indirect discrimination. * **Unwelcome sexual attention or behavior that contributes to a sexualized environment.** This includes sexualized comments, jokes or imagery in interactions, communications or presentation materials, as well as inappropriate touching, groping, or sexual advances. Sponsors should not use sexualized images, activities, or other material. Meetup organizing staff and other volunteer organizers should not use sexualized clothing/uniforms/costumes, or otherwise create a sexualized environment. * **Unwelcome physical contact.** This includes touching a person without permission, including sensitive areas such as their hair, pregnant stomach, mobility device (wheelchair, scooter, etc) or tattoos. This also includes physically blocking or intimidating another person. Physical contact or simulated physical contact (such as emojis like "kiss") without affirmative consent is not acceptable. This includes sharing or distribution of sexualized images or text. * **Violence or threats of violence.** Violence and threats of violence are not acceptable - online or offline. This includes incitement of violence toward any individual, including encouraging a person to commit self-harm. This also includes posting or threatening to post other people's personally identifying information ("doxxing") online. * **Influencing or encouraging inappropriate behavior.** If you influence or encourage another person to violate the Code of Conduct, you may face the same consequences as if you had violated the Code of Conduct. * **Possession of an offensive weapon at a GNOME event.** This includes anything deemed to be a weapon by the event organizers. The GNOME community prioritizes marginalized people's safety over privileged people's comfort. The committee will not act on complaints regarding: * "Reverse"-isms, including "reverse racism," "reverse sexism," and "cisphobia" * Reasonable communication of boundaries, such as "leave me alone," "go away," or "I'm not discussing this with you." * Criticizing racist, sexist, cissexist, or otherwise oppressive behavior or assumptions * Communicating boundaries or criticizing oppressive behavior in a "tone" you don't find congenial The examples listed above are not against the Code of Conduct. If you have questions about the above statements, please [read this document](https://github.com/sagesharp/code-of-conduct-template/blob/master/code-of-conduct/example-reversisms.md#supporting-diversity). If a participant engages in behavior that violates this code of conduct, the GNOME Code of Conduct committee may take any action they deem appropriate. Examples of consequences are outlined in the [Committee Procedures Guide](https://wiki.gnome.org/Foundation/CodeOfConduct/CommitteeProcedures). ## Procedure for Handling Incidents * [Reporter Guide](https://wiki.gnome.org/Foundation/CodeOfConduct/ReporterGuide) * [Moderator Procedures](https://wiki.gnome.org/Foundation/CodeOfConduct/ModeratorProcedures) * [Committee Procedures Guide](https://wiki.gnome.org/Foundation/CodeOfConduct/CommitteeProcedures) ## License The GNOME Online Code of Conduct is licensed under a [Creative Commons Attribution Share-Alike 3.0 Unported License](http://creativecommons.org/licenses/by-sa/3.0/) ![Creative Commons License](http://i.creativecommons.org/l/by-sa/3.0/88x31.png) ## Attribution The GNOME Online Code of Conduct was forked from the example policy from the [Geek Feminism wiki, created by the Ada Initiative and other volunteers](http://geekfeminism.wikia.com/wiki/Conference_anti-harassment/Policy), which is under a Creative Commons Zero license. Additional language was incorporated and modified from the following Codes of Conduct: * [Citizen Code of Conduct](http://citizencodeofconduct.org/) is licensed [Creative Commons Attribution Share-Alike 3.0 Unported License](http://creativecommons.org/licenses/by-sa/3.0/). * [Code of Conduct template](https://github.com/sagesharp/code-of-conduct-template/) is licensed [Creative Commons Attribution Share-Alike 3.0 Unported License](http://creativecommons.org/licenses/by-sa/3.0/) by [Otter Tech](https://otter.technology/code-of-conduct-training) * [Contributor Covenant version 1.4](https://www.contributor-covenant.org/version/1/4/code-of-conduct) (licensed [CC BY 4.0](https://github.com/ContributorCovenant/contributor_covenant/blob/master/LICENSE.md)) * [Data Carpentry Code of Conduct](https://docs.carpentries.org/topic_folders/policies/index_coc.html) is licensed [Creative Commons Attribution 4.0 License](https://creativecommons.org/licenses/by/4.0/) * [Django Project Code of Conduct](https://www.djangoproject.com/conduct/) is licensed under a [Creative Commons Attribution 3.0 Unported License](http://creativecommons.org/licenses/by/3.0/) * [Fedora Code of Conduct](http://fedoraproject.org/code-of-conduct) * [Geek Feminism Anti-harassment Policy](http://geekfeminism.wikia.com/wiki/Conference_anti-harassment/Policy) which is under a [Creative Commons Zero license](https://creativecommons.org/publicdomain/zero/1.0/) * [Previous GNOME Foundation Code of Conduct](https://wiki.gnome.org/action/recall/Foundation/CodeOfConduct/Old) * [LGBTQ in Technology Slack Code of Conduct](https://lgbtq.technology/coc.html) licensed [Creative Commons Zero](https://creativecommons.org/publicdomain/zero/1.0/) * [Mozilla Community Participation Guidelines](https://www.mozilla.org/en-US/about/governance/policies/participation/) is licensed [Creative Commons Attribution-ShareAlike 3.0 Unported License](https://creativecommons.org/licenses/by-sa/3.0/). * [Python Mentors Code of Conduct](http://pythonmentors.com/) * [Speak Up! Community Code of Conduct](http://web.archive.org/web/20141109123859/http://speakup.io/coc.html), licensed under a [Creative Commons Attribution 3.0 Unported License](http://creativecommons.org/licenses/by/3.0/) amberol-0.10.3/data/000077500000000000000000000000001443320625200141265ustar00rootroot00000000000000amberol-0.10.3/data/icons/000077500000000000000000000000001443320625200152415ustar00rootroot00000000000000amberol-0.10.3/data/icons/hicolor/000077500000000000000000000000001443320625200167005ustar00rootroot00000000000000amberol-0.10.3/data/icons/hicolor/scalable/000077500000000000000000000000001443320625200204465ustar00rootroot00000000000000amberol-0.10.3/data/icons/hicolor/scalable/apps/000077500000000000000000000000001443320625200214115ustar00rootroot00000000000000amberol-0.10.3/data/icons/hicolor/scalable/apps/io.bassi.Amberol.Devel.svg000066400000000000000000000152711443320625200262650ustar00rootroot00000000000000 amberol-0.10.3/data/icons/hicolor/scalable/apps/io.bassi.Amberol.svg000066400000000000000000000061101443320625200252170ustar00rootroot00000000000000 amberol-0.10.3/data/icons/hicolor/symbolic/000077500000000000000000000000001443320625200205215ustar00rootroot00000000000000amberol-0.10.3/data/icons/hicolor/symbolic/apps/000077500000000000000000000000001443320625200214645ustar00rootroot00000000000000amberol-0.10.3/data/icons/hicolor/symbolic/apps/io.bassi.Amberol-symbolic.svg000066400000000000000000000013651443320625200271200ustar00rootroot00000000000000 amberol-0.10.3/data/icons/hicolor/symbolic/apps/io.bassi.Amberol.Devel-symbolic.svg000066400000000000000000000013651443320625200301560ustar00rootroot00000000000000 amberol-0.10.3/data/icons/meson.build000066400000000000000000000006751443320625200174130ustar00rootroot00000000000000# SPDX-FileCopyrightText: 2022 Emmanuele Bassi # SPDX-License-Identifier: GPL-3.0-or-later scalable_dir = 'hicolor/scalable/apps' install_data( scalable_dir / ('@0@.svg').format(application_id), install_dir: get_option('datadir') / 'icons' / scalable_dir, ) symbolic_dir = 'hicolor/symbolic/apps' install_data( symbolic_dir / ('@0@-symbolic.svg').format(application_id), install_dir: get_option('datadir') / 'icons' / symbolic_dir, ) amberol-0.10.3/data/io.bassi.Amberol.appdata.xml.in.in000066400000000000000000000252411443320625200223660ustar00rootroot00000000000000 @APPLICATION_ID@ CC0-1.0 GPL-3.0-or-later Amberol Plays music, and nothing else

Amberol is a music player with no delusions of grandeur. If you just want to play music available on your local system then Amberol is the music player you are looking for.

Current features:

  • adaptive UI
  • UI recoloring using the album art
  • drag and drop support to queue songs
  • shuffle and repeat
  • MPRIS integration
https://www.bassi.io/~ebassi/amberol/screenshots/0.10/amberol-full.png https://www.bassi.io/~ebassi/amberol/screenshots/0.10/amberol-compact.png https://www.bassi.io/~ebassi/amberol/screenshots/0.10/amberol-playlist.png https://www.bassi.io/~ebassi/amberol/screenshots/0.10/amberol-recolor.png @APPLICATION_ID@.desktop https://gitlab.gnome.org/World/amberol https://gitlab.gnome.org/World/amberol/-/issues https://ko-fi.com/emmanueleb https://matrix.to/#/#amberol:gnome.org Emmanuele Bassi ebassi_at_gnome.org amberol workstation mobile 360 keyboard pointing touch

Bug fixes and small UI improvements

  • Ensure that the waveform display is always centered for short songs
  • Fix display of non-square cover art
  • Translation updates

The bug fixing comes in waves

  • More crash fixes related to the background playback
  • Minor UI tweaks
  • Translation updates

Brown paper bag release!

  • Fix a crash when playing in the background

New release, lots of small changes.

  • Allow restoring the last playlist when starting a new session
  • Allow toggling the background playback
  • Add a quick mute/unmute button
  • Restructure the main UI to improve legibility of the controls
  • Do not add duplicate songs to the playlist
  • Ensure that the playlist fits on mobile form factors
  • And lots of bug fixes and UI improvements

It's been a while!

  • Allow dragging on the waveform to seek inside a song
  • Use the latest libadwaita about dialog
  • Use the latest lofty for improved song metadata detection
  • Detect more external cover file names
  • Small improvements in the waveform animation
  • Remove the unnecessary notification for the background portal
  • Translation updates

Small paper cuts, and ReplayGain

  • Add support ReplayGain metadata in the audio files
  • Add support external cover art files for albums
  • Improve the reliability of the playlist shuffle
  • Tweak the playlist side bar to better fit on mobile form factors
  • New translation: Serbian
  • Translation updates
  • Bug fixes and performance improvements

Searchings deserves to be fuzzy

  • Support fuzzy matching when searching inside the playlist
  • Add a key shortcut for toggling shuffle
  • Allow opening folders with Amberol
  • Lots of translation updates
  • Bug fixes and performance improvements

Bug fixes and UI improvements

More features for less memory!

  • You can now search for songs in the playlist: just start typing and Amberol will display the matching songs. Search also works when selecting songs
  • Album art is shared across songs from the same album, saving memory
  • Amberol can now run in the background using the appropriate sandbox portal
  • The window size is restored across sessions
  • You can now build and run Amberol on macOS
  • Lots of bug fixes and UI improvements
  • Lots of translation updates

Lots of small UI fixes and stability improvements

  • Improve the consistency of the cover art display
  • Make the behaviour of the playlist shuffle more predictable
  • Fix state transitions when opening a song from the file manager
  • Indicate the currently playing song in the playlist
  • Improve the styling of the waveform scrubber
  • Translation updates

Brown paper bag release!

  • Fix drag and drop on the initial landing page

Another round of small, papercut issue fixes

  • Accessibility fixes all across the board
  • Better key navigation and shortcuts
  • Improve the consistency of the UI
  • Speed up the song loading

Papercut fixes for the initial landing page and the playlist

  • Fix styling of the folded playlist
  • Improve the cover art detection
  • Add localization for various languages

New round of UI touch-ups, to make Amberol more readable.

  • Improve the playlist management through a selection mode switch
  • Add localization for various languages
  • Make the text and controls more legible
  • Improve the MPRIS integration
  • Better support for right-to-left text locales
  • Allow disabling UI recoloring

Last UI change for a while, I promise.

  • Move the playlist panel to the left
  • Drop the seek buttons
  • Improve the rendering of the waveform
  • Improve extraction of the song metadata

Thanks to everyone who tried Amberol and filed issues!

Bugs never end, and so does bug squashing.

  • Fix a crash when manually advancing through the playlist
  • Make the waveform scrubber more legible
  • Keep the UI state more consistent when toggling the playlist

Many, many thanks to all of those who opened an issue after the 0.4.0 release!

Fix a slight visual artefact in the playlist

A brown paper bag release fixing an embarrassing bug.

The first beta release for Amberol! Isn't this exciting?

  • Show an initial page when launching Amberol
  • Make the layout more mobile friendly without impacting desktop users
  • Allow removing songs from the playlist
  • Add initial (experimental) support for recursive loading of music folders
  • Show the cover art for music tracks in the playlist
  • Show the current position inside the song
ModernToolkit Notifications @APPLICATION_ID@.desktop
amberol-0.10.3/data/io.bassi.Amberol.desktop.in.in000066400000000000000000000014351443320625200216250ustar00rootroot00000000000000[Desktop Entry] Name=Amberol GenericName=Music Player TryExec=amberol Exec=amberol %U Icon=@APPLICATION_ID@ Terminal=false Type=Application Categories=GNOME;GTK;Music;Audio;AudioVideo; # Translators: Search terms to find this application. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! Keywords=music;player;media;audio;playlist; StartupNotify=true X-SingleMainWindow=true X-Purism-FormFactor=Workstation;Mobile; DBusActivatable=true MimeType=audio/mpeg;audio/wav;audio/x-aac;audio/x-aiff;audio/x-ape;audio/x-flac;audio/x-m4a;audio/x-m4b;audio/x-mp1;audio/x-mp2;audio/x-mp3;audio/x-mpg;audio/x-mpeg;audio/x-mpegurl;audio/x-opus+ogg;audio/x-pn-aiff;audio/x-pn-au;audio/x-pn-wav;audio/x-speex;audio/x-vorbis;audio/x-vorbis+ogg;audio/x-wavpack;inode/directory; amberol-0.10.3/data/io.bassi.Amberol.gschema.xml000066400000000000000000000013531443320625200213470ustar00rootroot00000000000000 600 300 true 'off' true amberol-0.10.3/data/io.bassi.Amberol.service.in000066400000000000000000000001231443320625200212000ustar00rootroot00000000000000[D-BUS Service] Name=@application_id@ Exec=@bindir@/amberol --gapplication-service amberol-0.10.3/data/meson.build000066400000000000000000000042511443320625200162720ustar00rootroot00000000000000# SPDX-FileCopyrightText: 2022 Emmanuele Bassi # SPDX-License-Identifier: GPL-3.0-or-later desktop_data = configuration_data() desktop_data.set('APPLICATION_ID', application_id) desktop_file = i18n.merge_file( input: configure_file( input: 'io.bassi.Amberol.desktop.in.in', output: 'io.bassi.Amberol.desktop.in', configuration: desktop_data, ), output: '@0@.desktop'.format(application_id), type: 'desktop', po_dir: '../po', install: true, install_dir: get_option('datadir') / 'applications', ) desktop_utils = find_program('desktop-file-validate', required: false) if desktop_utils.found() test('Validate desktop file', desktop_utils, args: [desktop_file], suite: ['lint'], ) endif appstream_data = configuration_data() appstream_data.set('APPLICATION_ID', application_id) appstream_file = i18n.merge_file( input: configure_file( input: 'io.bassi.Amberol.appdata.xml.in.in', output: 'io.bassi.Amberol.appdata.xml.in', configuration: appstream_data, ), output: '@0@.appdata.xml'.format(application_id), po_dir: '../po', install: true, install_dir: get_option('datadir') / 'appdata', ) #appstream_util = find_program('appstream-util', required: false) #if appstream_util.found() # test('Validate appstream file', # appstream_util, # args: ['validate', appstream_file], # suite: ['lint'], # ) #endif install_data('io.bassi.Amberol.gschema.xml', install_dir: get_option('datadir') / 'glib-2.0/schemas', ) # Compile schemas locally, so we can run uninstalled under a devenv gnome.compile_schemas() compile_schemas = find_program('glib-compile-schemas', required: false) if compile_schemas.found() test('Validate schema file', compile_schemas, args: ['--strict', '--dry-run', meson.current_source_dir()], suite: ['lint'], ) endif service_conf = configuration_data() service_conf.set('application_id', application_id) service_conf.set('bindir', get_option('prefix') / get_option('bindir')) configure_file( input: 'io.bassi.Amberol.service.in', output: '@0@.service'.format(application_id), configuration: service_conf, install: true, install_dir: get_option('datadir') / 'dbus-1/services', ) subdir('icons') amberol-0.10.3/data/screenshots/000077500000000000000000000000001443320625200164665ustar00rootroot00000000000000amberol-0.10.3/data/screenshots/amberol-compact.png000066400000000000000000004406731443320625200222570ustar00rootroot00000000000000PNG  IHDRB׋sBIT|dtEXtSoftwaregnome-screenshot>*tEXtCreation TimeMon 24 Apr 2023 23:39:54 BSTr IDATxY-u%vdozUbI5Q$m l}YhCjY6l%56!@Z2܀%ݔV K-J(j`TJ5z=dG;mB+l#]µ7 6̅oJCB[I'v7!]4]\ }'~V>|/4IFRZp%oض9m@@@@W$-C>s|/:uM_%5+K=J%,=\۪f=|{Zޮ!f>Yg@@@@]!{>|^E&^_mBJ87 MmsIK>Y+YbMHWJSdm<F`𻙇: 3mSyI`z/ׇt_'IqNaoX|p05zK2m-uciMs&ϓ"o7M3ɛ{MM |G>MQdPͭU{R4u `ORf3t I!cG!=GK!'Y3W<9kNg ل/CȷS*Cbio߻_?W$\.&dZk"&y_w DMV '5~­9>S5<":Jgtrg"t Iё:nVCMt] B^Wd;\ q3ʥ $v^tZ|۔wraQ#N-˻w# g,bRnSF]Rm.6$ُx4ZB>3 Qpȩr$S{p>J a>yR&8Adzp!I/[K'ҵ"_QoTdx%CyqNFcc|xٿɷI.r0/΅x(3J]梩HH!uZ:$qvPǠ3Xt{Otjrqrj!:56G0aƈ3^y4XݣFxⲗ9xړcڬ 5({RY<˰3'?Gh5Bc'L"!j(6)A^V/~.&נ*TЇb`!x7Faƅ|ٽTwk6K-]mI~ k"LLMH6N%ALs<ݩ2[>@`04|_zay䡖˱p.$}dHPu 3\zߣyqmgGM-z6nOBZ^0\?O'7 cx<2`=fk! @/-So4/rt SP,WqITo2SUB%r\|6|wSwtls.ꃋ~C҃:ocdY>{bCmB,t gLX#ޑ(Y߀/IJFg˜kV XNP/?7ZzAλx'IoCpgdjK8WSyV$+[13K?` yx?tC@By,p"ڏ2ӧez+O[(!EV[#>SBgdPUsTЏX}2ɞ-Y~ kn.9]_otvkeu^"zv=SdE7dvylbAg,{R+ZjvBٍgߨ`YOwa8)>J'E"Ln\mfH[8an})ڜ0*Z'G\h{yl0ċwlYVj(Jyn}We(m 3a%㋰e sz W|R4IM f>~<< 5 N'Xe'_N̝K-= orZNtG{߼>q. |f69/͆a\OMbYRS&zz 8d:x<EJ%̑V8^!/ *m4?L^& !3%j&o۹|L =T"5` jwzK:7GeEYi<2g1 [oƐ'kw>&+[*qY5\n#H?RPv'q`4UIg7ݰJy4`uF#s<auwd7FΛΝ[:\T!W^.Msf/q ZMv! e*Y6om`VUBx֮vaUSxbw*g96z%q6\82۹}ʔ=O[bGn]s41zYsOx]Vd ^ >S!k-R%0={ _[ޗh|֮Bko+ >Kj~rIԒFBj%=xnt XYʇ~]qy].IߘH:rlsIm:kAYnW[WNwfxخi=U~\.ǻ)ݸvC{k@_GЇh6k 3J KE4ƌfqCiSOrtpZ4No+ǐhik,LHD),c/ ;/w> xRmjU{v1=. 7y3ٞ2nb7xh}pyX*$ϝ#E-navBf~2V6 !DF¼lm`iOG-xT\b^cU7 ̣=N8k\4}j7_Wzkvs7Z&]@Yh5Ye0eCkp]R( ik\M GmxyN uϺk!A|1[M}󼭯x /Pヘ}y?ץZT=1fm?ȽضZNy -:ãoxXk06fk_PqS=JSx$"+ZqY=f܇aSIӰN+g^Z5Kxŗo׾%ڗ}_x f ij]()b;>{ÿmKdNu)ICYjQ"m o]'CYLs\m_|1:*uw͗%2Q`42? LY{;5 nSN'C- ]} {ЙSY+߃w|/aC?z_o~ZT GˤE_ռ٨C쁴ZHZNki[h'ܾ\CyX?q[ 2к[s#t, 9nFʕ=6cpGP95X{`Z3\ڔO4e x}³N}V&=9Gzx$Ns&y =Hယs 'F-T"+nt!بT{V|>G ~Cs FZԘMC!?l*A+apm-wq[ 2nQE49qZUm.<<7n8 <-7|-҂͍s)d-"P Ġg:Mr~"6g849fBz$$F g(Pz/T7nT}m N-1nY\~82jeUO,u<}OLn)j6 qkSWXfrVX$ M_njyq޸rCY&Yh'>egE ` uWG,҄ 60֧K{`5<~ k-\Ϭ_)'߃p'"'\nW-,dFe~\/8:[vV~fQϰ 8^va˃ɛ׵䆐\$mMoץş6]p ?hh!V\6D b%,35$.6ʱںfZ(b2"OW̅UNjMԪ~qxba-w{\1?\UFcs4kr'u}ބK^Q70Ԍy{Cox;pDGuYގKp gdvA#KeIACaauf'y:)1oNl/Յid:hFQC293,E^cZ1__%l%>kb]V|mcp^K:Dsbm0E k|2o7`2<@nwȷrZ=F).eRq=jJdd=#ޗ;LŢ>+ڸ#d '.;vן|;P}Cw*_vp]:۠G(CHlINx#KjYrl>jZ飼QΔIuz!piWz:S ~Rnm xaˇBKt!D#u־:\6g\a2[ÎAyݰZ;Ih9uf'pH{XG6~x;{S!n8}~#m&Zۺt-&bl&TaζR,ᦞèy0pobuA0 =iZ*;'7 jkFCdfK43Jٺg,{ۈ$!COd l*o%v-9L{%,0 BGvo4Ժ ,"d~KMG8=SIC$%Y$׳LS!+~%9 (= n;n%J ~cv#KxuRFϊxϧLGg!:ְj|z!aާY'qI{0k Y)-'-8rU2;XSuWvQFb`u:";뾏ޏ-gT%9֋LX!=6 @(>aHI-S<~ MX+-WoڞX_ǥ4^i[cvJoɿo?U#%' IDATwfدa*},w i }~ϦTԵ,yzgdNZg~A0e4"ԑݳRX !uʚ:7C6~'7̹le76vgi8=Ui$yn5TȜ9.\5rLg=n@Sh%7 Z,܍bG7<ٸA6ҧ@t*BBu,ˎkiƤ]d4E_2V{D?;^L}IH ͵Rȗ]?]98Ja}McjPQ^SZGz&p]vlKQ:Y5tٺ+Jt튻IC6ϳ%m 6cǠ d|jΈ|=kǀVI~upq*kLa(}UӚhQpcL lhgo)==!'M5tUDwO{}8N4ҹ1۶.'XL=#t:g7,'=/ఴyȅvR0i~FD+~J?gܼ2s |ˁս=0lv5ډe LZV@W۱j}k]BM[1H0Va$Wdkaۃ5A)>WrEƘL.Ϸ3}L_x;Ֆ_,X+H;idhmr.*yȆChh3h'd#>aSa:ofXw*ؠ\Am4|[?R{kv#9Ue5z I u !hE-蛍t]hKe}A̔।?wf'JJCuL~TKuIW(D핍a_["=Y2٠ lVj |N"`˭SC{mY*^a`)cSK#8:ӈzŚp:^N- }h{L&ojD=& > $,j~&UipwAsCheNsR竇a WbF&FBR{KJ["N8^xrJz/m87@wLo{Zt+:zw(ȹ wD74y4d#ayLٶd#St$_iY{n|i xl ]9\k&7<&}zuAFpztE5 c;}svCkH{h\,U;$NMͭMn}4i5HRSW'cȺ$||T4躓$V^hUnԖ 䫱 c1tmJC S'iո!veY<|RWAT-"}_Ǩq9f܋b˯5ikzvʪ s7C`*^*sr:[ F}v֬F BvwۀIz5! zSP}Or\9U_ȡMmN{{Lv^н>k-.}BDՌ5rXۼ.]nUn O nRs;;ĪN\RCogrbucA[Pz,&_a1";2$\+àh7'@4yz, N.Cz敼KkA0W>:@4l{?7hUҙNL>+_"j%Tn1igfPq HQh e;iy3&u ^J 16M5ؐ|;i=M06ߕveŦћ :[24Bm WSk=4=to4>P8 y;oN-E;Ѩ^~9=az'`:Tm12<nMҥgl ) dVEahHB-QXL*XLT|%C耞+9غ_u c>mjLUݗNe|x=P77a$Nr{=\3T#\g#A3r.<:i,6 n]!ڃT0aXgmSZUA2 hlʼ3IBlg&/I{tXY&^oѾ+h8m}yi$\mI; ؐdHŚqm^'qZo5k#^b#˝c0krh<#k>W }%mb0MF;čݹxr+Ib`2 \9HB-= : B*  [ = rJ6閞!eb>Grw9_{qkgzn*!b(B.BW 98 ﹛G$b1썡xTnWaH.m'׳UyBf[+פș9o曁t*r`rG-|sF32fa oϽT}\>u&~!JGaZ`Bْ^7~{p,MoTNrA3=ye!\Zj+F"2{u8}<88sBmVf%7XMbyͅa\ۼԶWТs5+qoo۩3BfFÃo[T]U:I]Z b#Iyz "xW<wwju8o(ХiS0]rUu1>SZȥ+P'@]^x?'>۷O㜫 XmHE!һwݻN9@{ T%uWDԲOԑf_m{):)eh]h $sZei 10[$kMZ2~OO>Cܹs/" ot:EeuO/`;\XoݹȮ6F~aVףCQRu8/#MS|s|>ݻwqxx^x;;;xgo`^GG1Τ.s/^}}P՚$Dm5x AADi+~pVx h+z`J!OYs{`)EL/q#s|ӟWW'sY7W~ٱf|wbnRޒ0;&z{%}E#&Z.\QK79}MIg%UlL `34Es } _|eĞRxW~|& o\}ܮF<_j CNٗ"l=xE۹Fk].[y u 8D@TN]q,GW:J+9+j~3Dh,l^}:l[fLTNHNJ<7Dz 3"BLgG g:Xb1nd-Y>,# ~v"yzۀ]D<Ü#bbOSE9ʕή 7{@*)6a\-F'lt(ʖLMpLpٚ0.;[+`PBg-Ia iՐrH80 jB`~eF/l;he3;ЮJfݟ4dPG &,%;SKKzt$#NkX=Ogߞ>D3J{7]ÔIYw:梜.AQ 'Iƹ&.B8+[{S7{~7PCO:{>˅)Ey]C[5w\`v.H]a֩nB7fd/{QȻK>) )c6iY =}BlkXDa 8 7z|t.pڦF뺋zzMNvo$_7o ^!j\6xC[|۠,Ds"?cV:ya6F:KyYjWж[go5MeVMB ^?7xܒ3v+tMq%J"`_g.gyU[FgHyÕۀ&˙s=Y߉hd<}}@|~a|qcS{疊z 2O>FTb1Y0jEfDQOL\:ܝkCCF/2N%_el)O9SДn'R֔\U5QtASFb7N7 ?("`'!$Wx=eW۝5e+2DZBφ2;l=[nx&˦C{RK,\E-eVxCҕi#bNw" #.Fg$}vB&QIu3D)MY?S蹥{pAu$ tr Ȯ6&rv􆏧4 .jT"L\}O8? "?7. V5Tvtz9.ע4tTZm{~=E%$'7r}Һ\f; Ǧ o4ӣs^ \vAFu\,ў/] =9ӑ1ٲrKhqГmRK."eczΘTŅB|?pQ'˹ #vS z@B/rLk֯Tn9cBD&`u4ߒ=҆OvHl75+9 x`7{i0H.:dΝBN+d{(-D1^)_2c}‘_&>;@xn8gD{y)c}N7U He NJ0r40R`1KV}B4tr5~[ 4"\}xű e-|S-|GoL)Mxp}^i۴ Ƨ~V>!c ,"}OR*z5P#GO߉ֹt;3DP x>d~w囡`Rx ={c \Cp~rIY5hY%ISCL"]̭=f߉A$]`KW-26 }5Y:f6A8Uexgh6 \ǞX*үP1)ݼ:U`$gDN(JR%hϛ\.DN^$9eгRw4O. &7odn`K6Z2>$-s(xx/t; u7'`れOf>i8G)u bm>~gTD!ƎH D*$ӓ-.&~9cb)C)"xos/Vz؂zj\,&TgDDHiLX_rC\MKl*[RË2z-빙NoB!SG |xې;!ܗs'K);tHG];*^u7aܟyt X9thX0RLt0,@Gvy ^/6_{6HL)62%m$,r=u3[1폎p7ڏ7>hw:c 'k԰>JkkT`j:cF&x p)^huMd(pl/tc*M>J:Iu9^ iu }9wEdcZr%Fchb4dʹ6M3w=7_TVP_Ü1U І&FchOߵyĿ~pZe_ŝ3?|?_[c3F 9U0H)o=O&3w&xd#LLJ^z>C`4֋gnL8dz8v.q }KޝmDtۡ^AEcU8u}ԦOեY]?u["x%t?sKZgrrN5-፿αCzØQSH[uS m Gh{B&&چ[)2FUHvMq IDATc1X_!S˔Kstgb`>!$Q2FH v#<7$f*`Jƣ~OcF<ǵ9#&<;7_ыyDxfD +QLL):3D|[,[Vgn Sπسaf x 0$ZVg=-Tt<&TahC7QQ 9*ҒnJ jolL z7E1VxeWagF yNHFu2%ܞs*>xo7k5zQ59\+G~C` <ޓ4jzILrxDz_XC;XjϦP U4ğoG x WPT͛5SҋVSR1(a>!QD Iy)@hwWfz ` 93Ƥ0I/<'nAsg1{yĘ)eܹFwxIc#|ߺN|5Xzy˞EmCf zsIr$צ' 0JAȍxxjٳrkuRx^5;H 5&IXot23#a}Fw-ST)Qk>sI`6a'"BzU*YNsfBvT]/X.|.7E=;(Yk2_(FwzC<ؠI L"ƴpsn+@F:~#Qz5Ti8&&I##L93I4B\X L?﹪HA)KF(A0Fx>v& z!VXc3PI4 :7Bg3lR޹{1iҜ 1aE18J9FrLp-&K#݉ܘnΈHa<i1S|dg-<+י~]wT?<"­1'K,)D ¯u/듒w'~ j5η$9oڱ2PQ|NV/lUttodd*+ֺB.>,t- '^(?SQNrW!^%;cEE+o͚shOnU_="w>|rgxf,8\Gc]7"G =u`cBV %"qsNHؠ6`Ɖ?7ns㵑%)N]<5G).h>w:Eۈ1դwte}X>9nN1#DJ{)M3@1Lo?'a6VxƒX@P4p{tǸ${xkx|XYn)ƄboD{;;;9>:aޱK|0LVW 1exl!R/Z2KIal-5ۂ!li'8۲vYa6Է dRؾ)3bU1euGŤ4RUAf ޮ"=[jD,bVr)j/z2a)fFjFxJGŒ220Up|c P 1MXAQ j9ggoL{s2#c R!3':vvG9c#[`hG!;q##烽["w&\cId9)a.w6*T'@Jfą;w<*[}F (_֓1s^f;1feŻT9\z\`aCE)M‡O;7dW 1 3"+ES^Xe9VGVi("xxӝ1fs5C#[Lr=`9]A$\9E4c쯀5i(®b<&Q=g9#+j^![soDGO>~ ^)?w' }qQ+҆T}gx5u<ɢAm׹MzkQW=Vl-ZIsg-dG-'k묣=S4#)³c 52~,*E|p1띫aaXorV'5.<ִR0iߏ#ʡ""Ĭ B].އo1{/ )}_Wb("pmLBE >s;Lxjݥp5צEڮ֍ GkLF Ɗ%#ı?9!ucwREN0O=^+r[HvSaD_'8>>X=Іq;O\m=ø`Qq-]E|[e|xox/ /H&99r%4ɂR0V0Cҡ\aΘ!a aGSh0'u)śtH:!=Wȅ$3c>RvG/R<`br.0R N c(#M`Oªc; L(ׯ)>0q=&w{]^ #E$3`7!"pc}F  ex(CƵ'nj/$8jۀRsXhY; H"#TBqH(WX>W [IfZ=װ>>c͢( = ]̷4,wce$wkUzeAz r fL^ 5"9]"ho8R8 a v@ϼ ݌ꕵTN6ȡiR" Q#%"(rTD,MAE&1W*Vp+horw, I<3#%R~ox?)=+ܜb rƄ(}Ժ%Zm3/v-.Z39?W#B Z{םL,<aA=1D gzeWz0?rRc6^yr„Go"`h7F #]ƌ;K嗆:4>*&B^!Vz?WI{1c6=T"1Hd!! qbl|IJ"&=UƤb3<TL>p-F-"]Cr`h1R#Qq^!_jJ\%XX5.sHulwˏ0дنYaTb6JwmgtS[N\{= E C^rf}%c^0;ZZ$,\T-##[/pFe8d=5Y6yAA7rqn1b즄Tk1rR.ݴrxXa0Id9vcRT) )0-.R-\)d,r؛x6!,25bLT:!b)+tj2ITl* xjf^E+V8U콻2ax9҃o/||QvnIӺ[W@핀& hg6Р`@ F zk4ޠ\Pΰ唣YO-X! d'A+l)a4fe3cc=׶9: Ot1bE;CbbŮHCI Dpꤖj<Oxf`yxNÇ~4ڤW!ռ!_YwzN<yR0[+wm~ϩW>/tС)CXS8@9hIh3Z&'{_"nO-E=/:x.QٿB{/箞cYyK<ijTɂ\z?iRkF/ዯK|?+/hX>k Uj9imހ`$&} fWCv킥6CdڰDnhcLj/M%Þ21X*I~jWjAyRz&AOa0KcLᮡ=/gSKf'lCCL=1FY;d4Mpʓ^Lt@bTS} /f:06 F|PAn_>a3v%Wn_'ސkg5&Ur|[IZ"&C~<aVݣiG^ ۥ3vss̮;>=+^fg= eKO_xOxxsT#dѱxs3l}k$pW }i%q9#n-*,FCsXD<"RK IhѰcϴԳцB3(MJK1tVhUޱ<Az˶uэA]S5%JO`݃e` IDAT +ӒVvxo$ (F ץ Fu&1xkÂ{%|C4ОBHxo]X\j0b0 ʻcO Y>~2Zn[=~Kw|Iq>vy LTdԶ:[쑏6މvQƜ''Wu/]Br~òmr^D=V{۳ K9{nn~:GZ]j} %˛1kd풤Uj@d).&rEL:Ls@A:Y1 UtZ mNTYʍdN;ϭ(3n!zG91z2b/t8&L`9զl=Z-hJj Wvg~sls4.8 4VoXx*ڦjOW X"TZԳtELchcTbIM +BPqqW8^Y[[< 3 B囔Ҁ /uIs+L03o,|M9c\gjs5w<]N gx/PHOߌ2Om/>9UcX_ wx?. Lޏ}|,Q MemӇ؀5fj4olN A`VWX]b m7Ҫs\q &s0,8,jnZvdͺꠤFTj@X`#:T2OYl ]kd̚NغUbTHIߝ+w\]\cAIٍcW^)keUE8,WnZx+֍Nq'2 k:wƵuvf(U𨚆ŽڰWȬ'dy;}6o݇\RsNwyd7)7y{&۳ -sRbo|O,o=IYag>杔h_Eok;wx[<tHQV! b %łƺ/ϴ`{6pT|!Q!im 0|{MgI\awwy(ۖS0Qr\e& j̯\HL*%9EKLҦl-Z%DzQD:e!+eXj+ T5ym:ek?F+.д9^cny/΋ZXNu}TnCQ *ӷ U1LKFEEH6&Ź: Rƺoz=p8 (/e U6?;1-j & L3L= ,6TU#R51Fd$Vlt}M =gaZsnC6~Ϊ eN׺dƳ7f<ׄƚ 3M7x8QQܞ*(+Fꄮ$8W&1 xXpb%5&uta/= `:uU%u&x6cZzxe ATLP5V۽ތFۏuG *T*T^)4Ng%W1cڦι(\֤ٙV(WrZWB;zij[G*(.Y r'r (i$ ^٫RNjRL'eXY-!5k% Q~igH,'\P̱1WSL|<%gǹ9N.̽gd.;b)oK=tgXD-cYv!F8qPQ,HkL8&anp] b ~3ˍ;ZєT +YEnqx+rlӍtAL+DG+ ?(4+xdTyg8˫F075sjiI[\ըQcUyR){eMTZ.(%4Z}ݺT,=b-n"<"z!0=Ӣ UZ (JQ'5VblhtLt|[BŴUXMN=emk= a6V2K1 OM)O'/]<,rKhttObrz[0ȅseW۞I]f_{.\om$!&hԎkqK3hNѰ Cf<%5Zj50-=hSġꭉcET5kk9+="I,CG^jX ũ!M,!I2j&Yi?#|PҚࣦ*Uc1< XC꠨a\{BmIRIv[j WrVs;wd&ǧv=>EC{kv-rvZ4O{Zsxva|{&vNm)˵en ߹")sDc+ HV,UЉ4@ƠێCZDU`RN::4ن&T $m݄&QÍu 6RFfĒ R8l5YΤ^2nj^0ekpm{`j\IGI8o(ѩlCzF5bW)a\)#Fcg1, Fp6]5Y(д H@dZ t%%  }Ԁۘ1e4B`ZħM{?;=%I";1 ,p|T<0>p˜Dgc]'Gh,’ 6Β24+s&TUTJp)!Y\8PjK8Xp%B$&41('k&VRw#2g-kqµĒ,M0uEQLjפyNw>eXgXτ+k)7hQͨYc:<'% >$#5@/'ݕbf:ѤX`ӜۧMkSZ>x!TS&HX&uyc::it>˥)݉ae~Ȩª1G#!u 0ӂˠ}'>>[Y8- pF`?5OwDy{_Ōsh\{; hK*ŴX<T(4Z>D'xFXx"1!8-ؔͬB;4ڥnYq{Rb-rr6{_kor޻?!"0*@#"6CX Z6yO/^UP 1Gr%JkVhIUW #ƪJJKEn|Wᔛ'Zi{ Q36 $$$K5 g!$1#R6rL PL*;w?dΐ4VUh&JUoPpyGO{uXHО|~{OY=o2.<"'CρiZ=;_]`~OD]Jy- %RmDA $DMYۿA1PԭG/ԗk"mLtVȏ&tce%Kv%c1C XI84 ĭlu'fjHYLq*Z$)O8~FhRETQ2K,'Vc2,!U"!p*%۸tz!4B `Pä  x$SU1TDYs IXD3Ou}Rg0 :c3blq%P>P0;cz&6P5ʶ-( 2niIVwvӽNt8 (gOgKg=i䱧~?s( %:\^ho$zцGYbJt MAt*`,uQfIkD Pzhnj);r2hUðaZ,WfN_L":ZaCgnt?H|SMFSڠ;,㨪clG(ԗZbWHŪ5I#7HQH ;$n9X Xb ԍ@pN0!!K^" jMD-57~¿N*VRja+:Q:1X9:Bs(q'k:#_ς.b5O>EEԞ{}/i&ƳqD$mI|K$5OAc"KF'mPUb4vBijƤҀ֡ 9* 4jW}c-ZaFKo˫_x>UِMW1trRc0X*5F/B1s1z&ӒɤBB3A?zoPY1*EP0,TT-aT:2lH\j:$ -Jb~"pkG%'c(&C^g%wk Yk)yg5x쵗(6[󣷟w W1sq]eHB}LB M,=a C&:={fϣ_8ߩH=ūܻw;2̾Fb @ 6nTCp䕇* B|#UMh);/FkD_=c"ͽ-;W+1[a`^prB3 !fGanʝ^N| GeKYrfD%І6>>,b1x-{ *T,Xd!Eg':LLX=ɘ鴦̄k Jn;XJø2|_7,Xb|0aTʩGD 5Vw#u*:(Մ{Kh* KM:X?o֫Ng?'v5wQɍ~nê$<IJ5r!cM &H1u^a]A|a3gmk %ᅵag˜F#sPJ ,yMkj1@Zv^ذTH~ ?= HvDҡ!.8vH=<}S5vM[s`C]zNkډO|>?_3 m;8^"- Otm{jNk'D# )(!bh%h X9 8et.P^~~OI7Sw;ի<]*|ާ,+@0Ty&WhԲ"W=Wzd=R<2e`R@Y{]R w<7IYZ򊕕fB#r)œ{SƇG½}ˣAh$3"Nٻ?݂Qxԣ).11tI7Б8Ree):xX1c6Xu+?<ᔃG"VJ)p(WLabPXV˭OhJ= ,1L5EPj+)׷_gè|n̓*>b0:nUbP'-4'7gjzji֧ rnοBwV/9V93<./'yBgh8{qy{}غ [s.M*5?awcClb) I "&X3KR6VOԓ*wS/=;Y`m#cFnr`p&#?*" 5J?}{wG\K5W%\R/&F+[q?eX#X6H%)՜/y@Y-cұ>1(&cGScpI )9L`--oLt[n=ļδq0F)ɐPIcnš)8Vd͢X늺gP*Cj%(!T(RYPJЍ=6#ϛwkO4'Dq EմqZ4ID ࿶3&'Aj'X΃x䘋ϛKNƋ&~xgm|Ŭ&g-ݟYt1rDoX=,~g">F&1z9GMkWy`a'ɍM-s I ág08)F[yCC"r4$;=P??* b2[%9TF#Gbai 1HH=noexLqTBYRY IDATkwfő;!~ ^M+cGAxOjypR!$$.<>ԔeEY16xBT>nCCƕZ Z|]^9**0JJj>}|RF s)GϷw=;>>#1K|fDzVLfaT!TQ 4?k u]afT{bAEeDhhU@KSL%0 &?ślls:x3TR nKD#,N9[}ä1^N*\]u3>Rw|G:(քJ~1>DccK7 nFmsY#8w(K =:m!\|X^hh_y9.9lG?y85gx/hs{.h)iμXF1cjE%Tj4 BPC`n+ Mtڪ}`4AVQ*cHNǥGI}w(JC)KR#pklLpa jI $+]ҕk}HPRB8g 84@1#T Jk;F›Ex-E5&&H}ڕ5@$>4Z&#(Ԙ jjbTYӱ ~k=ICER&e0> !("s GS3]Ҟ˷j^|M+LJB壭%I nV@Pjj[lXChtn @Q6 9p UhyӜr6:oz,<ܨo&.˟<1bЖrfz ;_v&Kfȑ:hBIL"hCOؙZ W8 񘊕ZOcP5]RQS|!ބ:<{D'goX2.KD,Xf6cg-*)Czy=nRGLkaxV;,MH\t2Cgt:nYc5k/R~SN9:J)eh5jѱˁ W_\:L?9|ϓ}ew_y`RÇ@UӚbvYrfFY8 ̦> Pxs ;gg=ާO=h핿myμsuUYԏ9~'omN=)Ern5[/Ftb㈇k5'bDI! !RD{p/IȲ}5'-lPUH~Ǐj weYq!I <_ǿd!z6S0=z/<旿Lg-epoA/6o׿Co1pxT xk&wS<0xLbjtLo#u^{r0|߻GsJB(*38t2~xpRjؼk!)U!9et8ƭk|ލY͚" ǹFLLa@|hbhu|=.#s8l1Ӏ=|H]x/_FaNLy ͫ SPacp+oDpu=OR'k0I:l[\{U_pM^N!0wzGk³D}b,UfgwHU%Ωg|,?lgyMhhqRx %{|hϊv@:ljTf6&մmdiLS'{L`c:ZMj|#>wWїNTS,'.Z[L>_? F?0 |>=R "X53=q eI5HVG9?ڥ@(ac< 5RQJ*C ^d(>otc\ՐmQN=r#0!?ZcNݬ!VK2 fFP 66JCMP * VpD1qT]K2y̍]>|?qh[M|!͛Ș b,h=FMHW^%Mtz?eݷEspP ?=rl -4_[o?|1 A疶Ȃ"x zj<cZ5}AŇ)ӎ131E diJ"`{w_ [H[MvuZGoU䝜bR5"Mi+L 9u%t6 5LV' ˯rsv=~̽oIF0ih:%K^v!W~Y2]|Y2!U!".:T%%&9vJr ʩJ`+=Į1>aII(&7_S\@X٠Jtlm2## yCn)'v;*y7)uyDyC+ >?D'÷kort_X·#@QeAh@QwcPXMҬ שrФUI~t^bɿaG{瀜01)7-ً¥o,5߱Ym/|lʪ1R_.u{^]l Y6w *Nk jb1^MڀU 0؊1KXK{T_8܁nHj &#ULAI'XX}G'3l`/\󔻷 Ŕz:^N>[Qʃ wV1`<o0x5v=Pۃ$t {o=Ò iz)"kkw"d믒\c(_W`E-c.O!6E,)TY ҍnJ]AoO'GԅReo'~խ&qE);!<7 5nv(&ee4A]ILmk3s'$]A\d0Bn|0#il˸|aM1q;70?Iп{TUEØd&Xk{LG% 1@h A򕔗wSVk`XrpYKQ >EM:9seKsBHΣ V7gDЋOGGQL#t T8Y% H)"8~4*F (";Ďb˥-HaJQjǧy|ZmUL-7$4\Zh=hٵ .qZ Z\Wnp nyaYjs{E^sRR\t8*VXvRZTbɊKT=e|!|TheR!HE7# $*6)_ѽ-?'K3:9c5t{"x"۴LOrhc=Ǐ'ELDO(g],ڏXsL^AvB\-qŗl./qHr渺f:y{i~cn` ;dv~Tm5jpkE[ [f11yFuwOD#ZpU v;Q 23Ξ8L[m,J+켽d. 6t9>P vQlVb HJ1E9O{Dʘ$xޡ:9# t<<DCHT;=nTe8' aHi1 HP6G|3L~!dû4#!rzlnThB3m#Ϥ hWIO*FT)_>s2̚L#%PkW+py]^/NCF؋\C]o>8qֽ"ts-|-vE#&Mpգ쥰t-._/A$TSU/)I(e´HU/7ǪM+P2\\ (I+mI`EAogGk]?:?b]#1̉I`(tAgQ1F3K1d推gLdkswns1N:E-/i"mc3D P՞7G QdLý.ϾtjhmЙ"̾"NK|3ݟPۘROzHsc7QV֛'F[)0VcB)eeHdv0=f"ސC\uN]9 IDAT)燏{QM~Fo+`۶Bm PJEk#9BK.} OpyPjRY)vN`WQ*t]t+lY.k_u.E{-޵7_ڳ?ھW|PVFbv(q:n.xqпF+h5jMR) V"@H9,YhIJ&qh- Z@trw6!9߱4}~>~ "EO2E DfT|[:?B KH}Ƹ ?x&vw).>v8@W2B6*/0Y3 y@v; &ι5de C l2}g>{C ]pO('1/b06ѹ(e J{ rn1=ytB6BzOwv:)zw#z)9[̾P% <9B,w;($DU0M!ӊvF!q&wB{ɷdkDIj7,8f~ {:>_n7bϑuydX }|ވ(/AϯbjLKnj4AoVm;ˇP$͠LyB+F-|l:Ce;mIJEt^ *ChP6GnR LO;ԓI"[)RZIztn y?CfHEjF.U1kѽt7Q)pn@g#Od ʠ$"qM94>GKsTgR>ۣ;(c4TLh{4㚺 ĠPRfsT1v vx!<%dM{vz ʃoٹZ5: 0&hR*QH lyQ~I))7Pa; MN@htT=L?e 4cczҐ4Ý]LC<%Z3c yrrL 6^H2: 3 9ecXXI֊Ip~^\BV 7Ջ00Bϗ;kͮ Wǹ1YWuZmW}o-vYk#-\%zD fRPH*D!rIJ %$JE *9wzk+[hZ`SB@dL&T-h ޏ0]_3}5,Wl>o?my-C}vTV0O%;LyٳϨ J=:6 $A#3{'es}K?akJsaw>בLf(ŝh1[?/@H}Pw)/(zo F)gSm}8œ}$A&*IT"kDD0et#RlNpAӯ)_#'79EJEuN]j}E3pRpUi|ʋv.P[,$2N `-};"|cHo{% s4qgׯh enW\=_+/}XWKֵkWn^{^M;̡[5~vbТ VN!4B[ٲP s)gWBRD.^fH߶4*Sh+y oɇ; WM gԚ Xc:!bt$x:Ce%&2}ь;`:l "vIW{ؾ2=(5MVFݦؐ$B):R"%Bmn!Йd6r睯99"V?|lg0;čOpcf_CM;dû̞TAs~L`D*-ހƅw ޥhSTPTVdkj%%* " [MkR$aQ!ȥu7nk״u!_}!oc^q#_ ƋK|O}{xA(| \/ѭ;5o1E)RГ2@t+TZ?6Hij7rĀZ*$Fܧ kwF+T#TRPw $Bw1FYl՟ yGPa{[W\.!y @͟w :PUylV'KV6N#u몐seδ C[Ϲ Sb !9e* %*FL nNtĬh[uz`"ρ Z+5صzG!Vè/&μ|7틇zUw-nt2_]Y7\}A_mD(3Rpɑ &E>uR9JIH!g9/ YJTtaJP,/PBh-C5 R -Px -Sl3;ouzP5,iUƕ3BHe񍢳e)@P(myAVzwEgwN\`~}ߧ", oEu At'_@0ߵ~Hoל~D찋tr#37E`JHtiB5hϱq3UĠifb!C@ǧ4CƝϞ[%PyS"mA ~¤kD/,G!"b{?" I$#6b;=Cu?iD$۽Ky}wJuxNVRzA^Op!nj)g7RWb"h𔦉^"!F@ D ;91Ƅh"^ tD 1 o5H}C[V _OADw 5`@`cd&@K:p\-e4Um9}f5W65Fʼnb[]_QJ[ۘ1powy2s/}lI4RdH/@l 0P%5iꉶx+ZHzzBŽ<֧PW3ԥ5PMi1 qFS/^ߡ3$H9QMQF ]$H3W]5rrԝS9D:ۢkSs>3PZ$x\9Y^e nRalCD"DnlҜ >ՑGS4UE3:A[[}d>?~F.R>bDd?. -Uj yGq>M$9&;&L.j2)5D2fϿ##J@(B}Nq)n ;D &5^LT4U'ǀi Bxc#@ ESjY`rKJtRD2/`"RFuʔW|i,m"a8_[K^fK-qCKd=_Oο^Qz"{kq9OrYx龷аo5୮~BSc$_H}a7{@7&VTi7UVajG !!!1R5D,g̓D;Gp#qeKQj^'YVVJn#J),Bl2xd^"U44OM7"g0|I7yYlܰ+񲦩|A$J{һog} \0 h:̞}C=)quVB)ia_™K0V{L?t] Ry b!MM}^H} ޛtNuO,ոAIœˑE?YDRnT.qcT~JWw!ڋ)/B3EPxl7ߤ1mhqh-޹b/o c;*i^j%|4k֥!L:B(e&D &ɫʺ jLEn}uM_*^лxw7^)."^ax/7h/j!8b !÷ͭ Ȕ "Y-m#>Ѩ@:[[و0;f&O'la_}Ayx_)UJyq@$@0gJD1B i.,5khną9%}AA.X$`m01;n:D+n^#ם]ܮwmAnk^w}k{&}!zdLd^r)^J vA /;we+'^^+o,_.!E .aR%≨Q.|8g$@'Jr !YH3Tn %/x#b0DϞQגr"_}n{_Ed:RtU{&R H-(Oy(J'C  pj &cLѡ!ivcHs~-~w \S4 jxrkܬ"ʈlOo2 rIs>e'owꧩBP/)Ob7E¤<-! d$7}1xOT~!4 Q0 ź#MB.a[̎RQI y_YM8\E@- 幯R?).x"! b.Ghꚵq]mBwUbwJ~<c(X}+!z]k핆跟 ke=n t0zKH;o7yP VH$T-[Y ƚeHCĵp>O0 f5&@5ㆣQuiTHS;GZ*y?G:2)Gq-{y7dp?|o2/9?4MEg7cd*)ggLpFOy2bv|1qfMDPHM o?G &gP"Y)ɧ?XRM'O8?1"##mNpɢl ߴPr\@!|npqH!>и@y]DHpځ صfz^x¼FXs5c\p/x'\qU핶xh.봻P/mzZ+>VRUHSiҘ!OuPc)Ÿz>4׸۴%b"Yp6X3͍wO&&t7($t]vZzۑ͠)Yw!8"g}} RiN:`6@t7F*fǧĐᜧ.( gcopr0=~~Lӣ<~Fg!!gz|6L?\@hh_{ &]T%&hF|Y2JB2c%Y) @9f?ԩXA}5eBBunЌ;o%0gIakNRPB]@H%!:&S,` Đ~^s "B%pyӳةhsN'ENX^W,ɵ @ŸjlEX>\ ĕ}VmWwY7K[|99^w-\9uC뎆TK# Eo*H)zZ("Ԝ^eBLABx2 cMW%0AȇLNom9ZfUlVAg ռK2lJ+lfGߢV~cDL;&O"u-Qy<.{ 7dUt1GTgMNJs<3f !DAw%GD"vwSM]dN3)?=A B4UaSb)5$A$EPGy lVB_jɣߒo?b=_'W ,l0;%4V_zvg3bpfeRk);։ў M0RvyxyUmG)Cą5 ~|kzY/QWq_vu K-O}VKk GJQkQI \\rh DBDTTƔB s4 HB]ƋecG@l 1:7:8g6<}<.#Z :Iͤ  th(MD$o>j`dDP7'Ćj1=KpW׸`{QY/EG7 ytM}P^?(k(Gc=fG4 ޷43cZs_pRɊnh"dXFH#Ooac,յr+kO,KkQpͲ28 + ÒϽ 7WJ2A^Zݤ޾E1W%nm~GBka8&e2"D+>mn*mg1E=#Rn6 A<@ O"ED˔BBDx0N!N(Nx [Yq|oR砫Y jF[$*L1 BkDHr=qB1Fl9Ef!HpOs> w#F[BUהD"if8hjQ8BU/m[ v R Cb2n9W4eἤ Ua/(r M3mY1̞9W5A8twHstu?y#1|*@ 9581@)ڞd".MצƵm͋\ INVݴ\^^AZ/.N7k]n7kW}/xt뻭ֵ^ !ݶ]ǽoG^Y$aN/',Ce|k+|hS;Bka̋4[o m߈k-*%\2<+tpRDDAUK :9Bh[b@:Dl ;ifƕ#+,3;dvLWC),t~P]z=62|s=]OmZu)5.z .a9"33}-.RkB+RGVs3DxB L54ĠM$xВzR!2U鈧>+?l1W3Ri C&\9CiM5-ETsMuNu/OJWhEY j0 -# JD.D3/G@ʗ>\YT/h+c, v#7o }n^=5v (0|wn z8\/.3x{`ٖeUU{:N}oOjCKMm ?~BL;m5?FZ-4 @ORϺ}{|\Z\UwU:W:7;]reZ0oU=m,T-t1$ zRxOzŤ!Cs!#.ДՄYQ1媦NyCrYSI S8<[#6H(RհS?ɫ2oHdړ mZ\bxώ4^ozfT+7cw&F<֯+st:2K'8$';ָX, RGaySU QCD.~$1IlAWG&G${FW<ܾy|g7}ůa|7b.i2M@ ?0aqZQ&DeDZUs }W~e~W0B9nH1Rя۹[GB-%eg'ↁ{B BeJJU3 ";7Yj&Em1z)19C4fi¸%GsTwoC"V" !Zn;`85\wYV!S'˔l064Q$ h@ mR&i qL:̪e䊯Npeugu%/{ nPéא~Ϭc;Z}5 LOZg;v2R"b̌@j c()cxe5S`hmB_G]<I@Yv*It*Pz5˟5}Ւ?O+W {J|3|p޿K5Q+6OV.j; mx;?cQ[O@lMbsF#&̃lq=PI篑61(1& *Gؾp'9bx9|g[xɅ~ w9x\:!!Awi89Gی7qӐR^8#D%q:qቭ>I|˕:{DFo̵-vLU ~u1$.LwiEC`2L=NZ L{.Pyo{w3[ ap2vl?M|k̭owyȹFX ޹+Lq*!ڣmlz<ϰs~Ww{zHlIu\|޹Aq=Oy6wO%Hw90PcInP̔S!'H ]%1BHLBz 3 uVU7b)b?ۓ+sHwVs2%ݵgFyYA}ά0GVH^IS?Zw7+٩;Oֺ H]3KSK@H dI  84RQu V*sf.:bHgONS~|c>"g:J&6"} PYLIbK.aޚcmд05Ѐq;s .?FJ £ڀ p8v.npewsv8s>[%.*.{. >7#oKs'xŕ?y s5?3$L[٠~jmZPF GFc7? EJcTq|qg8%xDlru}s8;v q.7i&;!朼Bfg4Ia;Da8oseb4mR[x0q}*$_S zw;eN/?9Ւf B]+Ytqx.9JGzQ"m/|1sqN s&-dQ)l7$PfTBYO96)I\7|b40#J*i4iDD 6x); t!(dVI1 LBgi"BdIcW/oE)a2~;}0 ޿N sӈ~jSW[yeO{o~ax{wm>~sW69~i/}Пf{7=Ls~S_g3!w_ 5 ;=H0Il& }FwɅ!\!ҧ9_qcartL?9:xo|4/Bӣ:Yd*? NJ3:.oyzZkcII,l(eI!"g)UIǥdJ%aAEM31Mk$Lsrθݰ5W_dRU/{qh% u6L&S\*y_7M ?kKl]iy NmmQ[{A1gެ\cgy{z_7Ԯysw& Aw؅|98${!$C䝛lm\RL{[GÛ3svؐBb|4woOH;!#y!AγloxgwI0cGe{֎?Usb<DZ&hb6q#!kvV,9Uʆ ~- 1mӝo.n˗ͪ?,G<[6~s=%COi~Kۣz^_ec3)KH9ORLMjԒ%Ɣr8Dh|.( '.оW<_@?:bTEK5;.392 %Q6ўTSωN4fi$ ^z&|@][B[D[؜{NxRª2eѨ砷  6^2|kK;_"xID"{3 vXIm‹'$awFcVS"ڹvX(y1 vhPQ,rls969sGA:>Hf6G.Xvƽ#Iے =~z8p7i^fkk5Rb$Ixp9DM ^OYS*y}?m R/B4Ц\p$lڈ=u䭻 Kx!,< AӰ0 IMX+5|GnʸkQI03f%ǎkպ+g}~r˫up$ 8YZ|1ߩx*?Df.kQSumSּuiL@ģT$3qmLL`_֤ԩz7%2PBUHd,MT;P?4M))+ujhdTgh.$J3%ŻOj̳;E~-4%;$UB+9\FsrQqpsAMW1=JOp8{Dhw|鿀ߺpoLD4Fa,☕}OEPn;4Ѽr5s^a/@#^@F4\<ǥ󛜿i5$}WWl:wya;$NS[5#+Rʮ(Zq^(]BsT;ya:yAӵ4{߉]xTw q|LvO* ZgO)zUpRUcJRld`@4Uby3YsżMxLuQ|*Q0ۋ(NO؛5 ^P5ZBy^͠[:9GJ^岭뼣 Hr"E3ƤmkmäBUG&5^sa½Ƞ\]ϰL&lr7y8`D'N>kJ+$^c28{wG>%z~}}v_&W9 /^dxnchEc˵_oSy␺W^ImZm#\ŨAFi#/n3 o*zgܸKPӶ83k6MI2md. tׅYQw]zveŧDh/g/t؇w{](::*<@D]((,D'CZbEYfʄ`f[WTMDj]cFrzd R X]IsY*X<Ԝ8 cCY{8D&mB;S#Iav_TݝvIm;DaCk%||Mm>wyKͷG1l_m=%13bc91Z3j`kxb'c\/&a|3K/p壏;\kl_N|u pyx^XXSQKh3ERx}q˥w&L!Sq{lhQ8&Y\N9]e u5R=,_UV ǼhO?@/W=/^W|Ow^YɉxAyE3Rr!&*g9pU=I9X(HE+טߟ.۪j&0լ2ue!fb*W~޸գO47 Qu8TQd-#.]Ւ쬾BR7aK^y%pۦz~WCÂj$H^i>)<5B肩Y=<*a810lk!1*DOxf{m3PUiQL"\<<Ȯ/XQs |!w`K,@9`<üsƱޗ}}|Raz[Z>]V,E57u*"j8赓-7ColP'XM0@v;`S9CS)!胩ʕ"f pԶԑMHt\Ƭɤؒ@ڜ$Tdl l)B{lj&$9`b"S^6_!\)&g߂sۦ݈IiT(i:ǖgug&-]>0n7]n7ǝƒxyqhڒ^CPZq|AͷŃ! \ݰUKqp̋Gc o?{̭5vZ٫Wbw͡J4}SWgdezzw<UsķsV{Z T|}%sV88>_o^P5' C]4AtxowD)c(jgR6,Pd^[+8€PS:8jZs,!&*u 39G|N1K; J$$&@ i w`RΤXr,gcF>DZ՜Ф 4vd(1p MTem)RM乹7SبzؼE7x;}ʬ|4n!&&57|6_;8d0Ns[1_~{7}5bYlAZ+h,o`loΤX'tGeyi,rbb3/][kiZQji5ī^a}~bնt&/ߋG_i lIbS G}&JM$Q054[IUsz%10l#fH; 8(yϹzj;2<^&1[_eoⰤW9f9\Jnrb+y%Iuyz/En#gfcyҴ.Ut*ﲲ ߝUtM]O ~{k՛.u$&h@JLΡ5.W[(e 1>s5FPh L]8`|y+ xhZXvOV:I0n: ϲk=,zlWN1\#UI'?QouglY0X|yN)TUI>)COEE311i.LÜ k"" B-)%#PUMT&-qjRk@ݫ1cE '0 eSJDI YC fH$gzRiw}9 M3:)M˜ tSXߩSwH@OWTܠYl?)Iթmz.eu.ę\9M 1n/SN1,ϒbфl{ج-գ*ZMSRVw^͆7&ϗH9D!<8Y}^*[ǪO+%>fnYXca?byd֑.KT7WZ,#VWM\K/ɯ!5 ,5]W$bH/QO$ ;B,@ʶג~14L;́lP$ 95h{'BV[$yڤ٩)uvjvs%nӣ3g{uIQe+9h@^5vt ZHvhH)-I'rbGNVLe@1qk(-9멣5v4GhQd1='XۭZpTp8V" Uy \o#OT5*8j'T&d'|H1;gjozG6 TT<~k B䲤q,'GXN)SNwhoS, {1sۂ~g{#^VK"z8vwjuc+2xVTRvs](TJH-um ")EIc COv(10!D:'!fOLvM<" P PY, Js3)GIT!*ssQUMYS_*,(r6uM]R  Q+9>.i]dŪeB=բ&5:YqHKxj\ ߋ}oɕCLSU9tjY֑~O7/vtI#V<So_--5 m1a,XR$T@I7JT2G5 SV8Zb*1EױM#"ci c-Jܰ ),Vp≡0dW Q`RKG+i*_  %xMyN%Pvgofq_]L]gy9SD 5XȀ.kNT!lf0)G)1><^';?lȷ {vE=:`{LCvI1 X8]}y! ѹe!0> ӺKX"/c]IwhyxgJ7gкFgs3>Dk| `XfƗ~ 'JJ : FQՖ-oQk R]EF2ݡmⳄQ*)X[rrbs&J/gR*{ ɠ6 IDATkO 1C25/EYSlCM*TBlh)}!G5ґ0"bQjiLu@V ЦHȡXU Ź+DЈS)٠}yg)&i7aIaҜoΪ9)1PA yXvT&JnjVF dEIT3yzUsc1]>n2OUWVkd|,;tr:u w"^]'^%|y?;'KiY ]Og[+_ ܗEqՉ%.A-c0Ud4R2`쓒.KƒUT,UJ&P nJ=ΦRЦH4ø2ĔIK-$%PEaK|Q3;ygADS*0 5 Rsۯl̒s~-рhg|{۪eRF5;Sy4Qi2۞͑W~o߫/}w_UCOSi^x+W.ϵu_7 oQoo}7iWyg"pʩ?Lzr*ܺza!w]hB=ijnijHN0K-fc;fO*1)".F3ς Jڽ"O tJ**7 @BdSȥD!~QiچmP!G`p).CCsm r̮8$ ' r{wDhj.y֧tM#3PiΎD';.kbtT 6ơ1z_j\9( ~7C[Uiv-6Y]\yA2KN?xu.^{׮q;pYwvxF3wOk?y|[b[&TbʲRjC,u<'n_gbxݺ>LrT:] e XZ=}xWbZÀ_ .M-n5rt ffxBbb$9%$Ȥ$:*De&5Ibl+rwq"u*A<5-02.!2H:D9g@bq[-Yj/crH9*jev^-E:ۭR/"(F֤҆x,[''A2ত4" h-Y.LH8cF7ҩ̈s?hfHTN·ww???s??|~.lg[o X„ B=QT领JY.2e%rJCEȅ['ڞV_̋$G|rjF ?؇%kgYX_![HQlD wjlq.w /zUCCm(NRSaWCu` jx3 )#X pOB8@ }:, gCHs'ԳY3cxT-B^Ym,ysOx$28A(چ$1 TDyɸ6BЅ a`!$*Sx-tM2U]v]ʿ롅=k5d#k L}~ UDLIA,:fW-$%j6q2ђnϤJI*(lZ%Wok#J1k $>V+d6&%Sɒ{߯Zp")= hz^SyG?0VBPˆ4?k)\ʼ2m윒75 jѽtz1,H!h44ˌG̐t`;W49%&"sl<&X*BG9RL-L 3p$*S5Ҵ-EӖ߁kV͛٘ qf\S{ZBZے+|v% F"bqР<^ o菚ď˿|1'?S& xͪ?>IȕH/Ο'He/GYL[ˬ+vEZx˵3X=~GyuYe=˲u:gv;ZP%l ")CR(v#3ؼx-4aRR`L5m!J݁(Ez:=ĀchAFbGRyJLC&*ΎmhN4( V-RitN)?H%֗[avQdN;MjrډL$m E5 0$ 2DD,Ba>f?*&j%A9NNUSW{=AI??#ݜ+/D+PD٩*܏o2o}"H6WCt9uqL9'ȩ}⯓kYǯţWOvX~y:yGx\H'I8h]vsjU3{IV=YN +#/VDiTJ-,%LLh`%nl6e ?^5hsɤ[Udea ^%إ 8sjcؘ|LRd4D ELA:U%: /O?C?ko]&m?Iu ڍπ̼bNIKK@sȊu|:{9;Gρ`Q,$y=,Fɮ.w/P͞li̠ے4 4 O4"&ۜ(*a!i5˟,??;ޢBhbK? D)dFR l=&{J&KfU'* a)LU'eg[X%kO?ݳx :ϙb=AwM{9LT!`Q,l7=FpԒ ب3/51R !{Thvݘ%SIQB0o~0D:BB4Laj7iDCʒ'6Y sRZ=%W"`2./hPSrhURTK1a[EfӖ.yUofZ6r'>w ĞqbϚ~\o>uh/8eYZ ٻ+2 EfRC DmԤ"Z9dj#N*R:eeh<:m&\NMڨ,ޣ%ugL2;to.fE7Кe2l;7cqRۢh_NxgfF4i|9rف0à\RrT2 Y%k8I!,4f)aݣ5;>߽-eY[6֣_6O;`]Z:vzԩBu9LpqF|zŅh@hW K)[>,n|rYX=HdG]Ga S.hBwR_Os.MacҀʨoxPU%E m׊+t}N,0\F-.SEh 8g#,OZ6|ay>1,^n&*B\q&L&2/nwg}8aYgsFiš}&2@9zQ!l :?v3t.i 6908t);x<4%l؄:Z#>st^rO{ڋd89l 7>`G¼Z^ Bo~rnCHϑ_7mLJyZ?'.\8Ǚg\4bƈ^hw fl,)K8feNixq__C*Q;L//>RV Ct_ǂh<9݈u* [7mFeƆf,8;:.+v1c^h z/.~7t j-[̳߅]'3p1-"hra/^#e>L=/~ v>u#5OK-h^ܵ xrxF;8KeLi'_#(F(xΟP8&gz/ \0=?'f =>'nMxe8#Zw >|qcг]uX,XC:$FzF> 7%S% _ͽӺZV)ao+0(uJIea=fl#lG&ˌl6`|`hC6ev>Elv~2˄sG e>  ͠a^nmwm'ZSxv>ıͱptiiwS`;ӺQI/f#⻹,> =~N_a_.rчΑGaS v '6 vxC7h6a9Y},9%-Ν;'6zO'.X!gT LAltCC2b_GǠ2l.8;H7Awi[[ԟ:?{7ڮ;Еɿd9l݌g4GKN @TrvywGOu!It .GXa^7WgaS}e q=l-f% ك-٫LK|V/ǀP3 _mS,SwNԗ]X3g>3c |UCYKp7cڰo' eD#eWyVy5pe# H* ep^홓!ҙ%_Ą+ pFEvm#yXKX Gwfv>h&` tn w,KCcy.@8čIɟ pq[v 5{8;m KMY˲o6tf /h[?uU*`DMXK2ŗ@>D^Q9Faq]#%wyJ\Q_/כqYݺy~3|eEɿ «^*<9ϩ<ӧO 3_ĉ9|k>Ny)i&T6~jᓡ'WUQɗQȢ+5xEB*]ӸVfP-Cz8.gzp n$qp ܄;z? \{ 9 IDAT9[e ӥm!n\?yv> J;Rs{3C`aC \ k'4yq\3]⠋e6{X@>LxGr@+a$B~ug2/xG9@]ۗ aKK%{!_|?>[@)]IXk Bcx/s GR=s|O8=yxַwy'.w}x1>?r *: lʻ OYHOTHzA#|hU#ـZ3Z8t5\g$Wz4?:UT:-3Y7*I勶l]^K+ΌgL#Â[ C\~\|#s =Ëb{]860p.*[.yvt p.hg, ȃ22n4ހ'>.&?)k sX7v;8oɺꍛ1'w!>'ٿ<aG!-]t"pG ‘<bfbp`v3sسٸ3:ϚrU0'}'5y ^^5y }-߂c(ۜ׉ r,;S$hd5V6ND1||V2RQ*]*W.zV$+&1"Ƕf2lc f?0} ?UC4o Oo4o x.[ o:3GnVl[?}ǥ[plrpC\X nx|h63~YG.轹&aT oR;aVh]쒇=IO.XӭCŏ AO'=ԅ2~ 5'{\B{^s=x^xߌ{|z*CxUR&2E;H;ӷ o+.a[4x/s+cT'sE2˖ ӺZyةyGy?!g}=фA8KUCm(,.?@`âAn%aL9\M)O 'n }8XǏ`q8gnpׅg"9PƜߐ9}ڇ,>,܂%r\8a|6ރ}E~`3x@mI\6CY]»圌ʼnTCv#M^|y~___e/{YG4a`d19H4ot-j3􈪗peV FL  F+O^4PZe۩'n*F@sK|@aiO4+@DXprvV'ǯ}2c}(ptuK=^>?̞:`Aɭ UZBxQ/cӞܔToٌq́ΏS>\ߥ9vIUEc_rvmU>^${{p*Z'J&' *ަ\'u^{$)^*=SbVR nLh7= b& v_3SG~%E;l7]T}= |l KW]B]ÿ[G%˥;䊣e´Xhދ ğtSq-㩷ݎKO1\t>L-.ܑ`N1'2v"qXiS߬cp{~ʘ÷m㻰F.|f>O* E#|mg%O08vM?C?s !}*]]x(a|\7]FrST ({ ;]ǪJק4EӞc73e6Jd c"/:\:8?s.bޱcc8xpx}>"΂c 0[h#8xmCeW? !|ssa3mp 8=,s8,.8?f)@v gqK8!)&b{nq7 G,am0΅ݷ.y'^E@pFN@S<.HpM %\zrN!}sy4tu|t&_ܑ&cRcZJ$:2~0hkH;Ӫ73AnL&ZfFFuϻExMv 8w߹, pI9JE7z\G/OӄxRИK MEKشD3%?ML#}hsnqo2=KX||"wOᄨOMfp+F~&aJ/o:1'S屈ԹF Nq+3;Oy2h7UHI[ mTUɟ9kG|%tf֚oH |xRfPyt[b~qEΔVW1}ˍ7؟?k2" 8; l6+B@{a'&#<9IR@q&|-S8f- 0ah;#qpe簈=lp$7~N 7+ہy88}ƷW՞3ZFoɳx9evMMhQѡ)ߔF{QN_KtYWz1l[t:/xd.i:v)sc3"H 7_Kͅ񻧗n^SO|"fz68 ;g[r&C@NщnQ3$-$a FEN-&ǂ3yXnSѥ(4.y0 s?$0i:I{Ym_X(s !դT0w! 6L\Аl25<ݬPO>র9<_6;a^J]kpES0Px@;+9Y>_8nVG9)Lux8^ 1 mp,} s fmqަAJ"-q17/`u8DuJ`.MlSАHST#ppwJg`6!tYӨ^鲞"q[U_eYpXf R]+ (8 KUTagVͨBvJJ_O A\{mL0\'q{qU=TTS!@ʁ eYټsyful M{غ8:qy?IO`rsA@8c;~є哈⊷h.e}HMi:(^x+JMtEJk& /'h QZUMc+^Jk틕"-K+>2r`D؁A9#˼+Rc!DE"HJ"->9w'K3} QW7x}\O|>8 eeƅy #\b^fD Mf"O &7cŒ - 7cCO){{Ej׾(mcr ?z0C#E5tnGsWxqq,yD'宽JWs si't,wU+M+j Y@&IFۉU(BL`T;Mqt{ QSyC /DHwM$ .b[p,8t ϏF @7 `^]ߖ@ p8xт ;%w*OB< >OXv)|ֹԽ(EQmxOk>&d 06+։fO8yDJōmZRT,$;o]k-̲4j y+J+5=T8+ѩXeN#c?; t EMxx[l\o3 l@/SWD `C?+ 9`4a9BB؝c.rDʛEC9<,+E(sY#OϧP=5'N)2r:OeV=;jy+i%Cqu{SW,2=S5%eA`G\6hc'h>^p$/McVSu;>y>:Ṗ@x[`D,8r mkG޼gWW-Vd-9GZ){jwq:!jךAS~Nx.m{ML>7USN5]f(kԲ*lRҪ\J]?K[˒8I̴KV, V[%CR&L2M&… Ϟ>-O?y%+*e ہ 6S"Jώ ¡_a*V} -5]zq\-P?Gj}}'-E ?*(jn:~F|7cC\f{Ѝ#Ǜ\X3M)}/4Jv)ɽ;@W/ '3(&l傮Pil Ywؕ2 Be(4Q8p@n৽pSoe\膜I4&`YnLE_ o7W25 j}0FZў5[U2l˸W^ e+lXwU.,0z:YQ cLDgs9lLYW;"эٮ7 QF΅;|t5Fqd])CI+NWQ\"?g-d fv{Z?%R6nUt:6[b2:PL}Tߠbn3ۮӓrM\:ٛFa1ıP*0TE֍"sw))B#,,b̍ԩoW\?SdY$T<9M9 #ZVa4Ȕ* \Iuxy|xcjn|밭>!OYhM e*OW7]َg;!Tkn(%W3FZ>tF^nTwXG5Ѫgwm;X崎zNRvlH'LSY,.1Hc Z rڒ4[P/e*z]Xkجg VؘWbm ]k:kܤәEgrx6\`dly(fB R:@Ϯ)@k߀wl[_-:%`o5/((r3EdRtL-&t!.TÐy k됮n>)(ѵUMO]ReR{ΛTR,*zSZT$UXMo(Q{-NӇ&5 N JZA!{1,k'byJʞ7@RA°ćڄ6w hzbb/ S>VmBb*繑/:@a B\T-\eOįHi@z^CW-rHD \~3#NK4C3X $U sdeڸ╣Xo3MqO_2nԈ/VGx-8ړ#  0h5h+i6bB?q9E_M7bks\D! %|A&WUԼB&^k1ly GՑ;yg,a(RZ-8m]!@$JeFDžG^CڪJNWאPԦQ1@R 9hJkops)'DkAK@ܰeԎ#NHu>i(V @3Gy=Otڨ5q Z,AŸQn{luo74󉒍ǡXLduU:ZI^[C4oP2O1Im(\%lo$y-{0Hׯc oĺ[k. i @eVGyV1!pbڤ%_?)>)Z܉VY&ʸ|6iƁ69w>]/ k-L<)Fҍb|WHWx ݔ rZך l2txdZ:`j'$a=vˍ>o* :cO4:^F>3YG }ijfti Nbu}AR\itʑaB|Ek)u?Gx [xT0VK@Azfza*Cʞ/9 ǖSfG2FR"8lUkK*Ol{3%#گtwUQah4]Sn.`ziT$ ],ރ'BU$P- ӟnWLmDi;e3-ZGg6tR4kbVO;5Azrv:h-lҒj eW 0HwX 2U-Sz_@&OcⒽPK;V?;ݫ7R,) |B2gtlR/bQ.Isw54N.3z@7ݽ'5-50Uy%o[ht`aUCDD[%jixR:EKTe6{`ӴkE \)m9|*Ox-vAGSRwr@"IؗYOӨ`cϵA{% GwuӔe0ܠ[trY!Q@;)\P ,tRVpcQf+^9ޤ+Yu᠕CVr{u73_ס@f&_Rѓu ;,6J6ueDO IDAT[5Xml[ hyx[V=纚vIycVkVH#"ewwG㩮Gϳ]խ>qv wٳ9e61m0(͊W\.4 ؀,3 kJq_iH]U%o<װC*b/a:lqfWptv=@jE%!%xpsD9kWFn4Jg!fhРETUN@@L:yj Mɩ zt;iע53@V9U(#M}+0v bNEFX]J[zj`uΩ *%s|`uO|{]lJ|SYEi&,P`wd4L]SK߁!n]2dgMR6L 2٦Yjh`"֚v Z* e=0Lke♿fP+3M>]AiS_W.7$#( _Kqjqlu%i qW>Fr@&]L|eJe9cvg.:Sf+.k*l#헬7%տ<"ݕV y 2Es^uA"Sq#dhMVh*D,߀{ƍi)=Ukh(m$6)li0{5>RVmoU7,q{{4ReV_-{gu,l^j! 6x V2),Q< =Jcte0P ;@2ޮKKݪEmj뭈EbD)Vq1tߖKBnfh2WeHsO6pbK\PlmF09E>ret(0pF.քq&*'{'ڄ1ʮ8ўEa;yM-[V)m6ryg-oOrQpge)ww퓒4NNd2NVcQ1(M}

qc c´븼y-Plpۖ7F+ƻme7i= s-効*aZjؔl*Q_)UхMl@7QgcTl:PYε. MF T{ɚm'N^tCY9s؊r| Fj($%kA2$-n0qK5 2 "7TaUF@s걨HOY c5F!_q t1X`V:V!_߂ 3Ԓ2g>eKJ/h2CZ$a5?=&.G{]۔-D滖Cu.t},9$*ϲUeLjdS U+=Dxy^w|LSTIQR%ԱWrBr6]Kiμ)sOmV)N)Ib֜XRuŮaeWRgfUVlD0d?dx 35)9]OI'RE7 䱂FT@3N"uqv,o+IX9ylh'!cF1+Q3:({$^˩ nkjpxTڧ򉨆H=Ką:n,V'nPmGzRGPbwLPe]CT,pшXXɍQFJCH38`\Z1$vw+5=M[eƧnW 5f[ZH>X'> 4 1)Rݖ6ږigG݅ChBnU0]:R*}~J^mP_jЮi>AfXy=1'Ks)~Yw_!H*&&Kl.ꔢkLW=^h~iD8C]=zVr0/ 84~$ޘgܺB#fostG9U VK%Zn+=U hIT2y2B0_J댶lrZTcL2r9=K(FXL4.OKJA P4c}5q%U/㒜 eρ&BH,UVYA1ǮBMNp<9v7 (2[jtf Ch^|P_R~Šp Z[ )ے2[*}[ bU`^gs_3tU0>)W~%'KKFbMj++:\IH&\-9p_C24LZF_~XAKMriST6 &ѽ0eױSk5*KV4IJAAQ&~o"\Z%@DzV\(hV!<Oa D.XQTd۰Zւ9~]+dFa֒Vj{oNS;B-ԭcY rƼIh". ->f@;6&HhJ݌8+7hIJS<i3g,=ҍfI5\m`3ԧ&M֕J*mp mr-[&@JaS;ze?ZϬC2|=+@H;UC(|ݐRQW >NIdG%&q9*X[qJL v_95=.r΁u2 : .xìk2D̾j_Ċ:v5loU-w\=u6QLXNPu9hؤ;#̓d3Cb#gB(YU\,YQ3D> <}S$\XjxX-1Ek/|Ōi$FR8\K1gBnJ^#5U1,A]VNX e_F`V{E1`d9v_CQ[fS+S6Kھ橕ɯ5mjV@jZ|h\uBSysTuqi1Z2ɮJ &1R6Ųj5ۆs\TRkW<$\$2kWMF`*] NTBtXBkƮ_NS})[V͍ GuW+F]ʠa#Xt@Wc`G[ 6a 9Ռ˱Z+c7[d\*²ir*֗Pj1yؖ~FVv!"A}pe|83|e_oݧӧuSoپJJO$q=5ʢ74ePvS uT#e܀!\ƃ`yyKILF`t%i;iܝt9:}au :}!UQ:uZVdSﰗ Wxm!S~2rٌ iԌpi3LT,4` @ (hU;DKNRVPd/C[:H7Ym%q%0m ʍ0@g+" Ϝgδéٓcn:S#cJ= }W/'`;z͐^ˍěp=+WpQHi9h0;NKEajm+9x!wjraa/=VXyR4DT6RkU6]% a(n&wL\E# nf Q f%Rd|/) MgLde?n|)1aC0' u|۲9k" GiZVVV uj+` 4=9 Pur/,K_[ɫ ˮ_)uV_VR h47GrxYȪ26!_&'za*ӱS$`f:44Э O^4/k-J|}3Ȕ'lKV ]odrXPb*&±@[)hPo)BGcDP$emvX@o [ŴߞRj <:GuZAmÌR%EbH;Үd21t&Rh,z <'Bxnp*-Aci4H^@vp7DkDYRm_"(MwΜũg+:]Jɳ#vX=x]0T"% p pPjxx@(G6AUGɐgx?þ"1ښ(#dd.b[oZ-=p% uS4AzQ934K>YY x =+o1X]}[c(Ш@;يMzhૃHMsD@,j8ԸŃѹwk@%GQGy]XL^Vb(J竀jۖYA/%wiawz6`'ePPotJϪ ;XTh^)+MɿJ :3dFƀq\|l橩)S" I\PeW* OKP S϶ɭ՘VbUJ#\1Z_Z)J0vٱm "Me8 5)ꦫ//:[ cө3gpl J38ys Om9CiD0Mfbf]gD\ĵzw6K?>? F |uc3O)*>^S=ג څO$KÚ%ʜ 1B M9dg*o)207< \_oC-?KG& S&e51_z*7V0'OS5_+_hv뱇r,2tƕ"rl6uUoVJ fZi6Lk76񾷥:xeP:n7Ƃw4$N*Qp9o^T;OwI;N_?$N³Ng`Gכ F&šwfgTe|إoZX}uDU*z9Uu?~NUoCoALʯCԇ:e`›~0p޷ %ůy'UN5URMk!:ҽFv 8Vʺ\<\]jjY( ҞŤ\~iSxeyW &oamnͯ$+U[v|§yNL T!p~x?,եkkge?3 [_q\.lLڔL:u? IZ7HzPϻKSڅkOb幄Q_گg֌Fx+;xd+ڴP=DB&jPoS57( gڥIv ޹_u_(ySe{'4xϱA;gvvV0"ISu1$6Q2]C0#e1feEUOeL숞*c{xY^&mx9< +_= 2{KÈvteԈ~RwEKLU]OthRYFR Tj:=f[=) ^s>(08S vL+9u 6.j=KH$tjXF&"`ØWxZVר{ 5/šE/PYW]ݶ)۽諑~?̝R!D Inq["CU_ '+V#֦iYV\CdaBW39iUT5c1jd4.z=t2iH<~NW=2JYBBݶyWnEp_YN{rfl\]!a뷄[~:T/o6<eXk1}oOo&jV#I:Cjt 1sojb@tF ٚj^=9Xq6@d]㕓V o5h u"G L$Cf@4/,zoUvNEʯyWR>; *5N 6$Ќ01~e1B IDAT3^ "._!LƇ:F_;Y fz:k vn׭Ԫt\PjR)%ZC1pL.{n e{T C*=̢xm*8A DЪ0u!Hj ;.v([0#iw)uܓhFNm|<5^Bg%!wjV]X.QVyNj|[Yϣh="P|k~m9]*Cw_7{WPcdez}mތmlT%MOX@jR0+NʼnY #uyxZcDI5TbEʪTH$i+%l\j7brD;G@ڨ_n,|5oS- ɬ!4+J6VvJZx#h(҃+P?&[9_ p?Rbu[C[=e-?b~vUC]F^Јh2uTY%αW Ü]W` 'k] 4;SE KVI NvlsE@0m3T h6 `pJy^ h>AlsLzSԤٍdg]ɮceEe*Z}ߍ7"kr:YE3y .傮*\}:{'A#ٓDAE1{E5y55Ljew.htTyP&&L=}eq)v[*="_@*; "Y[Z hJ[ɉ`=/”x̭.W*{>tztGZܓKJT+e]$tYE )iV3Z3Vxe U}Q*&r!nG-HuTw^ikͥ (H0miMKzCz9ƍM74X`c\D i9K|k(/0 G!u!i!RNSz/R'-e*]k mS%޵ެ# RS?dO{cV0^?qQ׽)_ḴX4~i^NrTU0B[:&cQJ5OMK PۜSL8鬨dk| |ab1msQnea4r#5h_P%+!ڣyu lΌ8(NΑq`66#B{ 7`k8rid %6L^=A&%mEݕ]+6w%րgT-](./KʡQssI[*K3vT(N$ܴMG=Jش×e'dy2ܮ "}^ۂA(̝JY?XÅb8621 r}Z'lzwUPV{=]^  y:'v_mvbUku\5y,dT ~V:XXHm:,gRcNLr.nb[FXG6^*A+KF5l<;Zv,AI-4W @/iM pw@ ȕy?F"pϒjѰӚ/,nqslCD8 fmߪACFGS^.' tҷCj[~*іZGcQZv?;y te1%*Sk+9/xX ҋr{G#c$ Md, Y$Q=ezmGYng=h" L)L9 ]QĢZ>M^H &N ِOMZm-#չgTwY4Ab͐F2,d|ruiRg2p̽|cH UИ^V,]Dʔ*{CU䌾p"ohSu^Ӟje2O^Mgˊ+QdI^wjEAG+2r94{F?4UN]ґD&T]csT]s Vց\lei&9]ޘY1^d>Rs R^5|R5^QʪEHOƐB;jB&h_9v.5iцgĊ4&qƠsdZ<)؅U|1KL`멼5r;"߼fM6!bJcPp{xy 9 QTSttm{jA& T :"/3Wqn HPZ1^^-ikryo!v={Bh艼k^2TZ NcV6vsO˻5HCoM-JMCh aJKnFf8hpP%|&;X{k)@;_LWJ;+k|"mQތNBnߢW(Q" OaC6N%*UvG# Ƥ44gu»UZCGݡ̐R6ts]ef]}`zӎao6GWQ-9AY -Zq'n eIнB T{!"(jWz-Ju0y(ȕ:GMeeM_vifxuS+YLTi͕K1iרC[%p=`tXyFɇHC1fRaUc&ىW/;ٞMеUAi!o-t9\kޯ] &uZI2x;PǑ:u.Ft zaK ů! Z%6Es8vB~|3tUv*6#O9>Pkvm'YVu*oW 1E(QZfhOtJa*gOxNk%2)MUBxjfRo5fsQqS:!{Y5JÇd%:cS:S)6mo޷9FQo-o wkW}0mj[3 Bh?nNb"zpQ&{Ӹ5+P3#?4Q8οq%/T9$:4*5=3ɖN:#ȋj0K%GCA3^04~1S5HVƶ{a6PjP.[.o5FR1TecUY$n& iDlmո!q^#%؞R$0m+ϵg_ ;;\A If|uAeL4խ"د1r4I@L"qƘa6X+%_uMш0CP- c|u֪}\G@`9w~ }a(u%TX*ȭvDOV+~?+oqm> ~gTw?/OUm] s-4Y5ҜtIA*FXе%vR v3k[ J[Ծ*2sOu\ʕ֩q%jQn>q K?{^;[Nm7r~J'"{^W⛿o+U#o[S:-uƔXpW 1@Z#bʐYɿXy*ޗ ~~ / ej$W_^8|)'NǷ%/{7gx7~b :@d^a۷.7TܠN ,@eV~Z5R2rU셲j,SO{)¿/d]~l<<<į_"+s,/a?“o /}W+/I㵰4:n괪[){S3á+7x.H^оS}'~_5O7ވOW<q~_/_\ތ?{Ï|3gǥSQ`9z)@{&ƿ^Sh]o<0Bv|@~ŚaRxdn0~o3Ad1#5m9ֱ3X?9K[Eyq9OùGyOwIO_OǏιp?e_qҚw)Uݚ2V jlzU*Fݸox ydzpG}^_ys]q!?81c8^(mX:Ch]1 *ւ^x 9 Gc чQеmI_’*c5N IqCԤ@n |ďOlכuR|s?{/bL 7=TPd-\M;Y,R0ag%2.Jme~`UUް 'Uɿ`˧2 Kj\SyS@͒ivJLje{ ^ 7;qK_wmfgGOǷ㫿BAǴӵuagklzBXP7_*CTյ7à*30o*kmdhU\N/.1P 䊞x__JWm_8v|ҧ~ ?KO?_|N=Ooj?.<~w0<}oyӛRjvYCTOsaؠJjWrfѶTV\#$Vлލ>wƏ,D~ux^ ᇋBًrʩE[,!pg\dZ(a5>e9e]< >ư V!0ڴ/╗oU0[?}!n3@xC>5|y֧= /ooկ|%nf4- …'2Ujsfک`WV "h*5Fy ogwy;w//ŋU=zmxk??â4Jb_r1hD#W'-+p _VF+:Cz2C#3CaPETf1F-~O OLӄ3['==|;_O/{YĿOz ?۞t|>z4.o^o[9?5;]* N1̒B (JO9|W߆WG/_yw?'߀8_;عs^<8cZuTBj%֮-V4b6R=0@"jApm.kz-޿Gc+ª1/|̳fO[ĭO-o}{Ӭ㏝۷ ɀ૑AHHZc`\/z|1Z}RK(w/o~;wyv6$[,k ԇ45膀VòL#"Vd 3hd~ ʨWe>Zl5;94wm[sEg,}T~E@(,:b?Fɮy 0{)w5<~eż?1UNgY{*Y#եM+NWϚ2ԕٴiZRSvS>֖Fǟ܄T[enR~%^Yu:DG3ܶL6R6xmx賠2Tܯ4;1Ժ8n{?դjV9.sFUuGo;Xm^urFF;lN 5YxFObI oIJQBbƅ7-$!M͘=H* Bg@'άa\O)]7VE|ԧqKTB2lPJH/?.i]1%oNIT-\KGvzl:W3inSFd:|Y Yxm^'#nVdb9.FvY7"e߸:d$9՟SJw$9^n}m+kS4V,^Ԫnq5БثGvتaiX-j62 3rmw 4tuc6 VƐJZn d..v"齨MlO.K9X3gsjĠ"M"6n~";WSS̸Se#'L Bصt& t ]WZZCl] twd:z!<ʌڛyKϐ I/APEM?ì߹(+ +JU#`YIHwj .vd}fZYa*0٥sl EBEu=^TroOyAKeWi(myY)-,jCl]SCfC`RY\tR a{_ǣm~(CB09#[ 4k.n-P.C IDAT6#!<d#>zG~JrW׋8+\Ӌy_Y0\nQJ7 knHL@!EiEz 1l,4װܡ-<;āH_#3Rd.?69T-yPrC${*SUyit'7:BuO5X0֋ӤڐOYֺ mp2ǝю iv6 יj3/)hԉi!31kDH7Hdgsv:L cBj#C\SeԈsWͫ*~oB%E:Dl( EPЧ|(E$(M {I(*HH/wmYν~fŇs֚53wf>{ hW"燝=Bb3l|4HsR_,|!3_&ϻM K\ & SDlXJ3#^i9,uڊw)3iL궩9[[~UAܙYx a[H3%vf'/!T-U$(YxS%v@^hgա礶27K:󔑳.zmV̎~K?wT<(53gJ VSTx܈igW|I ,z!$ѭbS2;%Hys4(j1Wk2J z}u}< abЍ۪2X+D7 ~Wy5$w'GϘ%9}?* *֤ifE|t.5:ى:XF|esz*ㄊA5eDE \}ةOęZZtYAbVP}B#CmGf3z2we 23d-3dh[0< T!IHCɡx'N#?P-wOYsOЈ7,pVK6t #IЀNjx Ctc@,t :S&,Pä^=J԰)N&P1N6YcL \ C$"i03LD$UwwŒ_lS5A\tgd }=QF*5Zbwڑ th0x !8ipQN U"c Dg+Y ֣g:=&ڜdGS *\dM* gu˅@nu :WQ: j../o.|sQ.gO/=v_F+7HEʃRTG+CXwfdd♉O:'#H$ KHQ;;hvQ$ݩ8+# v&~ lLc{UDk)Z @hBs`i'J=M$9.CշAXF+oN"Rg*Z ۰ፃ }h]* 7z= bh0T!p-&wb,Ǡ2vD:MRH?"Db[ W?e |/,UxwH)Oiᖴb@B E ;<#F/sԬmyl$x0dW'ai שX_J HY RNCU Wu+? _EMG>h\MdU݄1 Nr B RrWE)џO3 ddcI:̢eՈ x:Ÿ4€D._tA>Cɩc7:dž8aT_QHAK"ݕGJo^*^R֜+6Tt QZWVF&@g\s{; 7Jo ܐ*v"_J'WqC*v$dYVIxkdi[Ap3ѱObZaR[~#_;Plx_&L4s BxNDmJP f7>΍8FUe5)5d=YW$VϘhbrIQ4[ o@_C-p<ԊDݲnb̓rT SؔsF,h  f^ٻcE; yHYm )3{pV֐~D}*Ϙel4EpJYysTt;35Uz->l;^Ao+Z'\:o 9*[=߆p#7(G)?eRj @!mψq2?*a_؏w;\M7ohM߸{U==h bbC UFpEz Ѵi`gɃffڷ";ZM~UW{Rt}jZ^~6ahj-0''FLJ1u 6e-/7`Hb72ROp&Gw" < l?1 a`>bO TA/qpe jat %0|=-0!vUq\޼x őMncmɂ Zzܩ@Z{P*4CTшl fu  ~dȪNi^R94"4"xѓ-#tW'Z`gk }9↶5MD˨9Q_}9F@!Nf ei]Ux%-o*EdXE"P~3A&AKG u]M3х~yW;F^H9MćѬ/ ^SGFVg'4i}(,2wr$_7Be$XYur(S+-YG)Gl Ly aJC7r'74'<%AKS;٥%R2Z&:\J'Y !F[MwF`==)O#q 1o6ϐ8fv?{->yFιQ\||{4tsXzvϫjlI5ۥcS̽c6:#Xix_-%#TNh 2T4IvaerduZ&^t'-x5=KO>+~m tm)OA׫c MSiDskcCx}'~=T*r}=饡KCnɊ@\r'# U;? 5e7ݶ3Bp"v(J3\A.,aV!M27=E]] >4g }xrbEjESi%=?9 ޙH 0jN(;&7n_4x t/h]iDh;R)R&Á8o8h}]|]Q3 ,xT Go;aVs\Ɉ"Zak01^T'y..Ҁa[3^Ws'I863U[(nD_J3W%Ģ-0w|&Ks8^Ol }ֆΎUx /8WGtƘ$-+*m1W%)^Enjc΃DUv7@.ꄗif<zG%,J8GJh16GKRw;­ZsF hN5aA/K7^Q8#s2 =u.w ʱeHZvyY\J3# |%C{ C_ɶ >J]`ά#*R/֊ѽ,~\w-HKU`Ϳ~D ̘w{~4{xNDڋ e3KG^Kv?q̬.8mތh\Vi.E6LAu(>ȩx/ 1׌_㟮c!uDu㈇Nl bR6EЦ_&R!DFW{C0t07s>T]iׂ⋤q m-_"pKQΐ!>S"rv9H[JRו948>@+eiUkVhk,lLp K./unR j=h:\Ժ`)c͍|2ea{C7P '1:]`vٍT2HՃ-lLگYݧoE%ªK|>7j Suܸ1U2]b{VUQ#au5\3+7C5~]MLW1M[5`lC `9!MD"/=MM:Bf9Z8ιeI$@J͇8eԇB&!#qWQg2ߨ2kY:)m%rC5Ϭ$f|T5ȂX-)CM>\NxG$7c G=Ai(Tz0!ǻ=zR6':RZcnk?toIg#jqL?k+ 33NAQG>e4 Ecq2@2m'WiRHw3G)п8:IIGMRh^2H_'LuܝMp|&V 41<Rrښ@O%mud nO|czb;t^oçr4 pw5vkz^CmCN4o(E/ov@.e/(j *Oޓj|5A;jgIT[Dm+#=7CFAUpbKN)2.w}p\?E%Ǖw߰\%왠Ʉ- &_ٸo͊e&iJBuQ'-r50pP3そ7ԝ~=Z~&yZz2QUO~JRsҘȶČ [tErY;V{(t82BP YYL!U{3ζoZm -74_O6EբxGN`#D)T1>^d@s9kk}#B`|E·bb.h-0F丣Ѿ)W^qw=?7ۿ,?IƛusΧpg-pL"sO7r)@9J6Qtzɸ8Z/S>kᖬ8o-@܃y{l~13u!TM2 wJT> fodK:lWzѫ\ۆΖ-XȄ)%r{ cj]WP|z^qdP Epn p}.Bs cő#E):6U"f&(|P6 S։g\"-p%㬩%(:P)MM6aٴV'n>>=V?.><5gl9V]}5̚9?~u/³Uucpp{n3`]?-;nu`#o,^xY\pcɥljR ajbYxpم³U#=C믇wߙ/iga+՗^ƥzqgZ:>Xe0{LIxE, $*pJh NSEਪ hE! ᲌oQR71cpE`ª+Qq薛[G'P)gn~U7w\J̋ǒK-UF8 j?XXbs1a/9lf8`إqʫLq?1~?l>% 'b2-7;8O:Q2B6_\- $@KSoo\.dދ2QNg@; FnܟY . /{3O +XuՀ hY?< v\gmw/W^M 0eY?\;<6y ^fߟ’K-Mܢyo3VYmUGQGcT}?ƽ߉5^ ?"9 /o}]]bW\yoyq>8 scKὩϸѤݟu)Z/rsV*9-tJC{)O ]s3.K!3fi )xƛ94&ʳcT*<-)>_<^ؖA`9u8q/rw(ȋ8U@LdZ19V7_WԜjt]|Yh 'UeEznji,E}bq]^Dk0yejfuݗܣV: G5o-ɓz `N@u0Ü*Lɐq+Enc3?[p+U IDAT===N]g'w )K3gq挙5a͋كu.ʧQk2]Χ?:^ճ>,e}j%,Q, F7s kb{q,# ,1N&:0$D9X=hBPRX:V$ 81Ơ+ ,d#_<_ܱ\n ?6{#W_swuLtuwcqn/<[oi;qԕsy{8^Tqv"ŮA0z7SRݪ2lvv8V_kM<קju`&⶛n W_ϙ֛ =`m]]?}:^lw{oh:0a㦛k V!0mߟ>s/.wj%L Vxlzޛ #o6IqZ@-*qtydN<=h9(z7]3κ ޴EOf e5.ۛL='hA'OU8$\ba@e'!V0`9qU1ѺpBpE̓e8'gG]9=>TqV[薛off?Gw >'͎c+cc'j1ib36s AyݰaإyWbm`_f,E1p,$eagKI4#'|%K]jZYTÏڍU_mmկ^Q,>l-&O>]9Bh=X_YE䐣YH9!W3G cp_`u򻞯ո쟉{-{P cV M= oyueT#Rhb=IY/`x&PK]iX`,>ZgwXa3>s,oiK395(jNEf+> Ŷ"?fnÛ_TW9$xᅪnɛozf}O'SԬ8l*}>SO1HyC!#dz j}kϧtuu%Y ALL75+ؒ~!ߣ4;l§O!Z3EQFRx}u,ʛPKT3&*W j萤6y2cӋJSO8dW^Eo_V0j[oa bab@7k05 ?9ٽH ePjZ\prܱ 9CۢqŦ}I+ޔM2\kHָjy2<+V:^hDwYo5p* /@#|?FiO_'L1K- Zk:|g>N1sLvC7 3N̏\iR=o}qrDo؃8v&êE9k=&i54x&Hv>gS'7b)  R5KopLj@5*H2t&A3g7W\M6ˎ[x 2L6Xv7bb^S3ρaNTeY074v>aJēTaԮyK?+ ~i$AWXI!bG=dj(d\ЉT^.oʰ* sI0=mPcs~ YTD[+-&5AF8^C%V@zny+{Ht}cFds|%]#p#/ZWsڐ rL\`1e7r9ޡ3޼Vzf˫YـEUyou#WW~,Bds relgȹ[<rj9&xO/J0n[V׭&9.'w^2T-K3jAnhKzrCZ]ϴ̯Uݐ9+$e mCz~ªQ؛bIwQc[TyuSRt4?;p8jt?D\ e3rRbkaKv SJR;!MU:}%#x3ք(T7DUBh;^c@#ٍ"t6id 7)HchaMFhDC<8ի0>@YD(Ä'U?5D_#~n3`QO^ˍ@:Ib`S#;ֽmgF]8n%sSUeȚRF}%ٰl8ڕk?C@vpR iM iwz?dG_bc I?˗EH줞C\*}_ЉtSZ[~-<)ִ2QR Ob2IJgϞ]ԱɊq-]`jmeotS<@ uwHdheN2wƬઃ&!2#K;{Vw2XH, :Q@9 jwus@4$MT^E䊝yW Mrܘ1v#KFoy)qJOwVSnl"OțAg(5wgG/Q <==FG3I681WgomLc[WM cD z,;{Y2 ,͌xy%hە+s=zK_)ie Q#." x{=e4%͌}jrW0xJ>tig۳DD@ڭ~#炔C5_!y4:glo:ZY ,޸aB ci, @ķhVeG TMcySz6]j&s,MjM-^~%7q7>6ܗ9;œsqxK82vD*.bb0G:u]Mxe@bdyh[LZ$H)@ɻ)ƗHkbBTr B/cPOىݐVt3Luyŗ===VKˍ(a^V_yeWcԒvc`ɱK += 9GAk30 /yf3ԉhwnlz?k VvXdwo/^^WQXhLF'HK-j|;J7&I{3u$B:يXB.b*$;/ȬN}8kXfeqŤKp=_Uڂ*3y/C2ФU/]9Z+ yX<)w4Zu\t7%]u\-6knXL!Hޗ9!2Lq"= ޯR Jk Ln&LԚL4i% k63{^y%̞5oja͵תִVx|‘.Uӥ*'МD"L| VU[ߺx'':! 澣o(6xy,Em&?y48*5fӽi7z>Iiso)b&bzm'#?ɿa;,O"T {%\}|GUi1pqGc*7M}}}N=Ec%bN"2T&luhL1d$k!K d,d9%CCS=Jd+W5-e$c(-$5Ы^ [f.yG3gxɡ ƘvV堽ʫt>yNá3.):s^ٳ+y6S %.h[nw_x9 3zo1ɳQ< Y0Ӱ!Ɨj-KE|iZV{G\G<}ڴ4 ;DjY /HyQ Ez :;P3$5ksJndcSz=1i.NC`H!? SzQ['}8Dtt9ָ N//0GęUuUK۹uR!lk;1YM-^${RT=;8fF .`Y})ut8kuD1^2o@a8TPX=`p%P]BS՘h ]&ZҳY9WArR-(QLXMwbxI[͂?vٿYi.+öydlj c6ju| B(kbXB1cBMSPUG# +Һa?_ qZ;{nz/1}4wR2MAV `5wX X@ebѥ?'"pU t voGBJ=N~b6?^vM0ŭxr0e3quKs#6  X3ơt!Ӏ|W%Uli(ٞ<AK4Z~jY(E_bR\o'+o?HV15h0!G8O/gdp*xgPP9$0HR R'2e*ZOX:%ñI\O~QovSϞaK%wҽd*r洚W%i2TDN@ɤ&ΨԝVqtY1G+ 2FR{_K9%*xg}I #2^˕bUDz4TMj~d)# L@1JQhO\Uo, Mi÷ԆFsh>DP(B@ IAB-ˈߜZzff81uEkRu+ vmg|REl|).eXA7꫶_*CkH-3[A]yȒ)AX0"h][T'b:mNwɨʼnxtitxEt5sPc<(z.Tj'1e΀/!&j`0ޥ>kR0̈́ۺ4x]3EʟѰQJDcʊ^7j.)o p1}Vu/2V>+i^ī KI=W]/@e kJ= %s9855NK@_ Q?"Ѩ 4>M,ͼ(_Jh}3>,fc }hM)}5U^`{R3O:=c wބ~V0wA,1f#!(]vvk@78ҋ랻3=}o{qw^z(i OŏOwWwޚ r|N Q8cpkμl͖G0wg{xj]EE!:-}km OE< ]FW4̝+RF ï46"uY#}[bѣVo0j(lG~d#<׿a5uw>_EOT78mo{eOK|U7e|pw;PSاࠣǘ% =f g}Tsࡸ7{ 4(k,nkYH8N)?#KC/U`B@Fo\CQ/+FJ#W_ba9 3* y\S0׼BEBzѣ ǣt zKˆMy$P!zmL`|t?̞iM#N﮹n)[Bd"g7k;>Ƴ=L<׿W_]܆_]YF6jej׺sV>z'.*g"ߚ%U౓gjE!~3vX/'~u7Y9xQ| k`㍪n9yh ~lE4 7MyՅÎ*?'|}}mgW=\p79};l20j.rwo|,\/~'~ ;r{l IDAT;UCgW>0\kpͭu\:p׎\ ]svu fpwodƛ}g_|~{-t(0j8G .<pDLPD@Z")W/ Wfwx5&we,#K8`[ź>0ęwo{#wyΩGV7rspnűV^e<˯Uyvj{Y=ɸ[=?y?cW_z~K]ߝc-\kqot;=J}M!4fpǯN*hp:fĥ߂Ӊw)2 /q?:nV%{#}+msc20xcӃu7X=͛~o% 7|q,\8|?%?M}|v 3$.h?pam0qG`gx 4<:a,>CDӸpǣ]K,Y3g k׽v{]?qɅcmUqҋ/7՗\| k}pbe]x)1}xgYϰ.;b2+).exG/z=hl .lNU4 e$ת 6V7ڪ'W-τ: ™ NG6|s"}X#k?iĎ-K~ b'{}ڪXvrxo`3{?>0 &Uwǯ2V 'q ¢uvv`r~? ˲auƾ{|s'mܹC|-SͶ?fΜIW^N;Lw1;wZY,$y|hc1cإ˯/O \+<ǟh8|c WVk^3O}x ֹ&l|߃U^Kơxvjertdfj1Z/t:qEck *#0dfl9?\<* |5D^tUՐ3{6zX 1a<<|󿿃W\lOd0Ńnۺ7ujHǞU&`} _]- yʴ .ٳfW]w[n5n8zI.?iȯ!o`68NIOo}סر8׿^spo¼y;S-)V_k gS1ɦ/'?jP=񢌀3,k*:E#5wpde@^fN V \zG7ɐ<5/:a,XeՉXo 05`Xw'O{=̙5xm̞5 mk%ƌsW^|gʯzHON>_?Hl͖Xze8[l=ީnﯹ{n3nM?Ny[n k8֗%[묉DY{iqr-Bs/"J7N7Q*!MN6U6_4R34W)>\mO&|mO2xcf[mC>]{ʁ` |xӏjaqa X`*?R˯z=6Q\6V2`iX~ϛ7ԟ3fV㬦]=]%Fco ,5]?|tcV ˎ[k`;``v{OYrIl[ep=,8b`ˠn>̞:Kka W; vXjc[awM&R/ (=b뫂,^2] e^"`W&ÅQ#%/ N5{1ᰇ']ֱа Jd/E m8\QvFN6}fN v|q_?`kwN+/v&"H%Վr#u_M=ӅRƥpY 5jH]O$ofYTK"4-_Y|.~m&O6] k(a4 TRw0Bu%3ş{*YOEUO gu4EaR&M8;qcDYj#H|G _X`w5Рh G"q[wg_!tK3Fz'ex1 & UubX&J4x~/3ӊԙH](6=Om|;l#R몡qSO!{EHBntM X+\xi-T?#mozԋ==T_:U4 1a-9`ߐ`R,; ya̚O=;S_!RQVJmk

4Xwz T4↮NF@tP F(+zdpm |Uoi&NHtlJ (jIn _MؔߙZcgd/_A3"cЦ6ʊ̅EHE y].9V2* E[y*~ufWzUv=}-`pK3596P hņQ#CRV1HXgKXF}mcɩgZv$S4?"eF]is< %h5lGS'ucjMi.@(D)kU44xTo\mS :Mգ֗夈a`SkK_iSrD"^1E Gt__AYs6b/B;P:9伒jǴe|FBVb3G!^_C' TB"<vT3VIU%Xjw$!C`"=YČ+J/5NAjAdVT7}QexoSEA=ucb)&j"̐y? X0,勡̛׏<ĊޮqHTfMij*bYw)~"#ˈ̏Z{MvR%esZhiXPz|27ճ@Jk@*GB͜!O5 qƚvR_@E#! ZС$VLjZ< ;B\UpM2WiPFN#z&z1_%n6s pFvh#^T 6D Ro(#M<)x+3S֬bKP4-Jކ P6UbTJiا,W{|URϑ"iߘ ZXGFu#QP zK2iNT#okAJ'bq$q1,޶@m6܈vwdZ&zrW2W#^_*? P `Uq!Ca դB|An}{VY(LJ}n0Hg!mwƐ7b2% U}O===t ag!zg9/xӚ4*l'eI?jz3~nn__zGx#j!falQۧfFjAW:iFζU82)^69Nj $}}}gv|7PU&0;{]-EQMs>1͹t&= {E)m \B9B/  "!?FZL. ^ t\oft]PIBgg'ZLl0 ,XxA#/jZn3(}}g,!aȊ$е%d 9av4qGP~jܴZBgg:;;j*` b?o>3ʨ'y +GSb;RɅ }.^vATK<Ƅ87lK'Foo/{y^-V::;ۃQfǜ9s0-{p6HQC&^A( BDk_>97kF5ini$Evu n~:<ܶDxŽ K*9vt Ǭp6j0yĨ%F|OIN눐3= N *tb|X2Oq KGGT\ >=+jHYQ#F#0t5߁%l9NhnUnlsD7iwQF`0L;VZ^ fF#Fww7fΘ9sp1-eeF >䖟hhm,"ӦٹEQY2l==@9̙31wJOL=;\h;JǬZ(I\NAy<$ Yҥ:k/2.A$GD\wK5jgӤq: ߮.tww#ޜ2݅.JA4zkQiD2𵉋vH >-[mjsԛSs 9W!h7t`zz##j#2(A+\zv /`\KqW1KXb< VV"(* {zTȌAO|9[j|E1#(,1Ѡ>O ۶OOi,:k/n$ p#4y3017@GG+Lg/eյ{瞸_~tm]K\WpJ4+c;m>8b(ɃrBdN)aj}nZ"o}seU82P~&pzѹ=g)jf)llGJ^#SiPF#eL +ʬ&JVSq*>Qexqht3IFie+aCFlDItvusr bdNx4+.}_v^yDCb8 a&X)B%'9nq8.ŕ.k/J2:0s{}\3>g>ǎ| b5ԓ YuyjɑPC NM0.y-}S'`Q~.NP::D6<'-z)眆yrL{oܡLiF^eW`H% >ņ nu N<L!\+1iettuļ+EPm]#PLDL[ݗ`7uobR :Ź,<}X#-x j\ngg'v>JS::Z᜛;Wo éko7~{uEHGe[^MG8~ ՚(- ~t#pnE1= L⥓b$'QpHg!hRbl~i44xt]MT\ۖr'2U%V- {~ %Nj;c".o{[x[H-6$E|6C!Yx _ mp:c1soNgdTOSk_/^ WٌUm)bTXzR̬-`% h5*2Ido'C,t2>/}K_U_Oxq 4h-.L'3уzXX=L I-_~/r+1>ޥ̿+A,[؊⺯ 4>٫yJ삶w(ssS#Ăusd'.?(&mZIЬˉ'b[ .GVG$lUa23R)\8! O<EdYlcCZj:;Ȝv0LVo7 YyA<ܢjb 2]m'd<12Ot'o;YhJ;.<0P+׿ހb3T`O^R45X/1QC2_w]̓?x賗$'z(KBY5KnwDi8]Ox&ϩ^~A=d~w=xW)ΟJ6=.p%~?=+L.Y~-ͣ[Fm & /'w(i;L%cezڹ_>Kw=ڿ14M)@SVF"]ahA6 : ZǮBpD|~[H$JKEֵ|t~7p?1[|bk@<=NM]fۑ2^0:eu)w){= aLF롟y8pEQ?Px2`23kBFp/%m>_1k4BO(9m%ZhF*6u (@)E*a#$-O!$JCSҦˈD=h4^%0"`\ËCk2a m8c 1(6aRO" }R\Y(W$fd %& w"%L4dz Ä+y>f3s7T#\s ‐P )y#s'VrQRAy6a)QډpmGEFU,oe S*<,Ja4aׂ][ʋL8CUttk+Sz wCyTdpyfi)=<3#`Ik888K#65d=nݬL K!m-?xERq&X]թ&,^:KdIC{7Wy@\(2GnߝJ;\.-@69!vww+ְr~".KpxTEQH[q$ޝ׆ gop5X [[[A9SVQsCS9'LWYnO3dXUl''(sٳrb+ɔ߿w$g9hw0<`p4";d{ ~#r|0<|^.#=}G(h10NDH*:IVlN$Dg멢3BN,HwF("t|xxdݽ] ̣FB1̽ʛdl+!WeVU' ς)ѹNXP_ėLpVrkSB+w ]LŦdze_JF;O0Ot0 t)?^^MNf|օ)+FP,*ϑv*.r )o)F)-$A`lNA^~Ngt>|:tû֓,]7=;b.؅@ e=}1o{EO` M%ڽzj2XN!I5B6③ӽ) Ą[Ɏp6j ]f4a6ar.N(ҝN^.隄e >s Ph-%*㯤V׼+g;:g4'և2缓AhФ'7s1vcڼΌLAYYOcx/Fra%Qs2%5)Ν;] +<x^R 0bGRRB\ 89Nk3}^Bd%CQedItN[ Ąl)g:g[/CDD%&"\A)6(bPCΉ%kq03B1Qs[!Gh" =jm-z $ ZC国N?2Z.hr4Fx^0(;ORQ pm>!tutt (01100L076}7u={0+Ǹyg77]Xu ke7γ4y|{B%^9Ļtv[ 8l4ҕRuAHVw |h~>ψx2)*F2R=, ʕt<'a2go Z@.Y YΝlE7~Di6I H2 ,}r٤"Z +'I [dѯTӜsk3g[{;Wb (PDZk+ZK)+RƟubp5Ȳx)bIxOU7H茤;' ٲR*gl% K1WlE+5t%/)! ϶1 3JU/y^|ʩ1:RIfvj+ %鏐  FDU-K\-Vd]Ѥ 9kG?F=v:0h%8>R\TŢ^.SmA+7IOCTÄ ;g c'UtWeir̷s IDATc X/Ka"dP~rsY%e,k"u[N'.A8񏗵pKxk"2{^J J(UKT8:L< +4ip2;J+nKۓXP$*c{;\&DKv?-I}QJ~D&AtW:z\Jg :~R )xǨW|f"bDWbwޖE9z9<<ˈ~ndYFO,j3rp&^bWPp'v  WO\kD}J$ź)A/ZIO(x&cGJ> Q?Umuy;7X i۫hk}SL |9܄)jUжWMF !&'TɏUF+`cSKIJ%Zzҽܝ M^ӌK^NBKi2?9Zѭ|_UK=ܐ{"˯m:szH=e(S0Un2{a ֏썏 QwB0RWLt&% OxK4 .D3U}.[pea:>@Sj]ZNǪ2>.d~36>xၶȻX LcF`B츱]OFdbPtd~E7r/7\艨LGz71/{^DR[TtIqvW@$ifdɕ쀗JTUG+٫@&5?"Eّ&x'F.v('g"Zo+ #T!=)i#ZILV'  kI#gRR1BdOB]e鯣 *a f&A-ώJGn𱣸cr˴S~27 uf'MR3h%QunaҪbzRw1~F5uȚt"Nt,D=rP3j9I>9a&/OG/{ZŒL71i;xX;&]HG8)F2M˜qEȆd"D&ύ2 !r2H=ysq@to|@޿ {c[+yczd&[ c֓++QQdUz~l{:W/d#Fz.@-=8OG1ha4}<.wEꔏ &H \ 7Zгȹ.#R-Qڿ3 _a nt~҇n4y/<?ՠ?X )WiKLA]AH|l0#Β2wf^@[$X h爂Z y.i Hꦍ/S!.Kǽ~zsmrq棤wVW:Χ9;Em 7o?RT\Dolxh*/f_{v6SۿrAV0э~is&XYx%ۍ̩E&(Ki%Ӟ>t\~x Õ^9?])+W^o~. yߗ6ɔyhvEp|pQ4c PK?{~XJ)lmo ?$?db<&52SS U5´&#([yh#IZ⓭\w }*y92 _"}$a$]HA<"}ִ֓Sm_qxw?'`\h%n#׿vPh5U{G9k/z>z> 7~wo]A* Wb&0z3d]g)V$!|J>x[^w~z<걏& 9ogC0hDVOHWp4n M/h[W\y9y{x`=^JqHbkkMy~׾{uxNʜ v(*=M9wE k7:j'^ɑ< G CPJ~W~^/\o!=X*4Y4kAv $\7ioK `3+@^퉊 g~W\y{𺗿k7k|x{+P-KT&g"`@:]&8h=^ҍҔДS:H@߿UnzP2oHF!6p/O,6lP#6VNW7őn)Q?~3obo^/ A{`W7n) $^z董 XA^vGQΡBzxJ|J&jDžsΦ;t{cBD&nc1k2֓y-~zf?G^7 ʝB.za{v)SC艉O7ZJB0&:*;1}wᵯSR`Ox|K.ݏG[H >cUp׋_=O^CN!bϦ4ଠhɅ}'?xw>o~u  ?Vƒ|_9RH C?_5ᶘk }TRrGʣfF߿. HyaEp+W(z=}9{Y|qnO| (H7}@&V{ 7inskvΆt Ԩ[ ?۸p~/-GfsLcbL'(¥m}*~%˅(ʶ7lKWU[3No$L%O'|]sE#@=v$Q/={KYK+31<h/#n W٬6$/?Q nz_}r-((H7ƣE5ͪ2FrE.^?4UqI'$\s8iSΣF),f3yBJaFvy7V/d1$ϥ셃!XAEP7>ҕEa7xuH2AMm~d./!2KfTBd(\2եhFT܅RDϟun;)FGFRt)ڑ)%7ֽ͔"~ iџR>GKW (il&h &/,ƠҺYp/Ng;VGkׄ,ʌ z4I!Ѹ!e;p*hbzu@c"hdƳY#1KϒIfKLP˧KUAˉ5 VF&8tEmdGVIlw{$JUW&NCl%:VȚt|-%3V"Mod0O]/=V~>׼vZKWƏe,ZZf*2;z儳 Y@5F%f#U:[/>׻gmΒ|͔Y?5DQQsv[BkX Vf%9Kݲ^ԓ {SGj>&­p9ҳDlC,cGnX3,_DcGe913Z \*2(,Y-пN"2INH (rҮG"5nMkzi5&__Jȗǎa/>.(010L0O0υФ2(H_dt[MLCnHwz:~ș3LS KT8)u t:Pjʢ/.d{<˞:o]z|$iS)CK䮸KNaPɵ2A  8<E̙3uKlvvvwޙ=t ).c6V/Ӱ ;;١oB hEv,ځ@ 斝lIpT`wwAD %XM+|h'p!X9w9ҍX/J`8Hͭ00L@8 (6H樑tn|儫䖝ݝnRc:xjw.;{>+k='F 7zzĪ>n9c"egwXSCN Bp."(l ʬ8 $G޲HZa{g|V[ز' 2KZ=Y~'[Pev3s'G.k*,,tng{fat]^ t{g΄ TkJ3VK~JHwic*í:JPCv{ Z"Ak)/6.vvZ JiQb^.˭ԽמH&B6NFn-t@ \J%<*5m" 7tjJ֕DZGѮEc[jz!W@U)U*+5׃].iPWi)nRU\xMT'Cr2僼H2?c0xB~hM0@{G.>~|:Ʈ+ sn#Cj3n>~#C%JR[ͱ,産>⌖[ Wa(b*L "~ rl&)N"Jk^灸E~,Wf{{|F.C˯{n xλoou,"pTpm5U5hފ-ŵox nMh[[Lv.̉#bVW~*_c dOZI GHWN,EC(_q9BQ~Y`Nx=_DYRTBݾgן\|9T_-#ݦ W: 9SS G r}:s La 믍лO>62"V$ި-| jiD7J Ή+.A׾5˷/ ~r{|+<;Ļqԋ "WU~{şo{<GKo画_3AC/&~k|#ܺ[VU7$w3~iʕ yX3b#Eo9_:jq0+B&^d[_Lk%{T _,/3 E*11Iwa7q^v)~OsvȎpLppb9Tzhz!~'"'= ~Mr|lj 92 /|SV4$C&^2.N&-;~O=ј [l#$m ,<ңܟ?]_߇=: K7mU׽"^=鑏YrTHEmc ?LM7,wo;bۇ }IwܿKG~WhKqh[_Y- E=ۤ|R^/\u:(P\~#t&D;v쐻~;q˗oUwxU˷o}Sހ_/Nnv#%g)Eb.'߆OMM#Ds7y7pB[+L 3K;Ͳk>|\XNW/,PW;/ x-}kR撗HE\kp=QkH̛fx߀٧?ljn{ͫY+TMKG()'H_V&i\?0UsMSR IDAT7lj#U|ݿ-B963I_yڋlEi5YVꑋw77AE::DZ+$|5yHGͱK]ȥmc jJ cɚQbI4ƒ-[+JVe|Qv]<1?Jyc~Ʒv_~+pno>R3xZxHl[QnB1LjZ;sBTG.]Kz\KlS|bd%RE  d;9c63ȥ koZ2oUw\۽K7;^Ѥrw]>p;1# NQSj-',~R!%" Gnw/>Kr @Q̣ }]ke|~]Ť.[R.(hNuVF"uaYޚhl^_GQ-Ql6cweoz3~{'?ޑ7?Y?IPf+FQ,tn}LWQRw?<ǫwt䇰[oIkg4t>C.=[}-0Sv1{L+^Uҧlмd:^<{Y\~NW/XZ=uQk^]Nje[NyUG>a(/y> ]~Zg*L.;}"V]';-JED1q&1Πx!N;`:be1^hxzEO߮˥8 ޿>KrNM\r85d (8"gd>RXR62y񞷿(^-g,j&c!܄Ib'_M.e9^j5! ~U[ ۧw 8\b [5ZNlo6ÑQE239D4^?<{|U_ }Wt<ksQ4{goo=M5a<`;}֯آ$t*sLc+?Upn>wpye;ah$~cAz˒&IO^Zh`Ӌ"1iǺLG+W˿?Ocoq8ȟA]x3FWe}\rKHc>o x& QX#! &ꯉpu}YD]<Qu"zUf8մ~ދSYkW,-Ĵ3K93S|{+1chi1Yw+yWŽB2I7 lXe& [QtKxLژ'kӥHw?\vH7|#\>? GntNd2$Vc*h2Hw1O m#oۮKR@ZgB@&%dcKGI_6ay6~|wצ(ơCAƕsy)R5^ 7FA!GwSMBjv| 2l$)tu,0R`z7~-(6(G4@axŋ"-./9^f^"xg~{4lMAk Xgq+Tph_STטUJv?t6~KMGY?eڀ톅N;;"J?a`x|T6a~wGm'?~6JK(`NLGj 5*کwv1Pk&٦`XpUM/)楤'z.~S-C+7:$Ȍpa6wh qHN`  ؂G]x"]+o16hl /?c{g&1LJ$t4pG}lmo/hV.@yaNԢl6 Md&` nL@~OV~ڥ9v 3w- +Zpc\ۘL&Lvvt;OEl|z>qfY=%u[}",`0@u~ sLSLSMD J\C}~䄡đD>#;AAw>l:t:[fwç;o-ƒo^-la':-%^9n8NEt|crG2AEN1|y^Baz#0~s:/IH @FKWmML]+-=/SۑmE&^$ %~pd@4• ]F3Ecg סIMlVq\m*g ;ocv=Lc  O92j0Z+B@.4JYu)kDWf#GEIƏp'[Sa3o#L}nI[X&4N42p$ǖ𱏰zC2]{isfkpyM6IM&#|#\` w=3H}xi%h5%B5Rгo6ET[~GSVպ M>Mh1RDX}P/\p*6%7ގ<<>•>TqTo8.7mAq|E莭y4)mURD,F "P7K󩃼gBRTu2r[tdh ~56A&ۊWsL!/kn)Rc`ea>K/().h͍"!-2­lDh2̈́ۘZǼԛɿo&^)˳|e($?& 0 0OMb.#5dMk kW-*lp[q i"g~׺׻ӺadUU:n6U/drڧ턊+ գg5InSd(޴ KWK%'Ak/H Gn"ٹHJJL'Zǩ9Tc4IAN 귌5E>P*} %9W0b .Le E ##6IM}2pP$IAnF&j %ͻ{q6u>6q+WF"x | 7uAq\Iu W­!9VlHx.Ըto*#ޑNm'NO*{v pVr<4IAGM 귌56ݚE RtVek'xTBaY έSD rm42>V~Ol(ȚDv=cTx卙p+ a> fd;X@,jD 5­9T6:e7,ឞĶ̴ZK H,_2u-W|{Udd.nꤛ@5n2q-cņTE߆f XJK(6 ZJ %&]i'B=!x~s`8hXndk*lFQB'f[h%Jm(HWWưA;\8G1X3hp:-oo# TUH+]FVOz[& $1$NɣO!wBHTYOʤ>*߿ v֯:̤zE|\{s%:,ujvcse!Y?R pWy"=HX!Gឆd#\h--TyXE\6Yg@%A1ٕ 0Z0!8mlMͩvQi Dk"L󉊀7xS.Q rɕ]w\ʃY~:S-|lvVcߍqBR+!Loǯv eG*8K/vX6 5n= jC<5n퓅2J!tAM!p+oGG- ~-XFV265AUB3|o>5><D40ʆ\pM$J8$Lt}!TOqz@/ EPx'\ZsPߕ&8O\jEba#I,_$o[[v%go3#f$M( & 21gEvO~z(NuE#\~ tK­LN>Ͻ%rC9R7:A*b}y2nd}iaM%#Q%~rKwWd@iu/a^Z-po.wu J)7{>vcε}^>XyqI!}SzZkU7}O|޽9@>_,iMQ&2WQI^#K!86![m(SocT38:­%uඋ׿$ڒ|U%B1QM GͤSzH*3/pKnw_fUԨ\͌a9ܦHɞBzGjZVzx j)*Haio)gobAz#^&`18V>)-#!7}Ov:ݿKٻ*(P"`m#\ߒ% Lݠ-rZvGKTG,dk3`^ڇbk+gPfkp}vyZ$ϥDT ^;8>77~Y^Z.ɗzF?>dV.O['O;]Ou]oO;.u{NwvwݱV-^FOj H"es_7BSf5Մ EOيj4XOSl6O7_7TI$)L".ܨL͡1ox%6hF.ko+Ig:8 $ڿ V.I; si2B+t9Ks vJ#*tK-Z-,9;՗u; PjhəhmH'":w7z+ZR;mshad|3Zv-Kݍ\b([~Ql0uRoFFFF|ooG6KԶBܸef`"^[.%=ndGztKף\c|3222mNؾK6%"&n jUG|ϜNFFFFl"*w_J+őDț ;4! 1$]=!d28m!$߆(j99Dœhwp$QrzԇZ6Re2Ȑ"AjSl,YNef$؈lsDhD1sP"oFFF *cH#ǪEGM()Q~zt,B&ތ )%bi6Q./%"G;*EopFFFF nc-9tO#k|p˕ZΆnj eW W!ݍv&^JV*VqRP|Q/%֔ T; EuGT^ 1SLFFFF _KɄUJ'"6x)TeddddРDT&XZpr[<fHVO!\NF±l:]6"_itTxFFFiAm=nMEb}9H4ҥ䫐.ơ T'_;*yP?'ܽ^=?[K*[;6Xb}H%ߐL%rme1jSe$h=WgdddUu po$h|zCdIEKc6PRib8Ȩ}^JK}4rIm@LD[l*fIe*tEXtCreation TimeMon 24 Apr 2023 23:35:56 BST_}* IDATx}w]U{gN&ӒI/J Py "> (?"J'JWAxC)@BJFzrq]$|œ{k.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,b a¢`ڀ= y擅K6?,,,,,,,,,,Q*b &H 絰0!H ghr'=,,,,,,,,,,{$1HÞ<{ 9S@|hHBMZ|=!,,,,,,,,,|'Q٭IWv-,,,,,,,,, %/%1J؜N |tVhw#Dqkg,,,,,,,,,,si!E)j۟i[XXXXXXXXX ۟i;vG?$*;䟅Ş*%)qMCoj.R=F#T{t)h (dHW-,,,,,,,,,vW0LNGGC%;&,,,,,,,,,,2TGN!MQ'  DGߔ J{&#"rdJLw 4*ŮFqthأKxDH7QAB]"#Fq"K8%Cq!Hcaaaaaaaaaa ެe&Hvh8"CEd %o-,,,,,,,, Ĺ_G5s<{!Ei ɈLbW2#= ^RdHDT~bwjfGDxDćJTԯՄ(n2ܧ!& T2KȨHѮvSʖ! 73D#d%Ϲ#FHgܠ$DQgLȐHQ-XXXXXXXXXX #kItQHр%U}dHFxxaA"ě=>gI@mqQ hR4 jߐ %8r޿ N\> <³8<2^HR絃AA!"䍗_ Ƀ?#D!FQHр%ȄJuPs{o /.}#L~B(ym_ Q?ީr0%r."} ^pq^'8a1D.7!wD)d(렐'U{ !.XXXXXXXXXT:d!Ee{NKr]%P@?((.&'d @Ϳ͚5og MgSd2KZi$*Mpa a-;EiP/ɻKEaσ/"*+I&DR CS뎲,I%GIHNU>C2LAmWZajIRlXN rِ˃!Բ\Fm95궱.N~p@?YDme 2= +1+.9Cƺrmrwtv>^Ћ9rɐ2Q"7DdK s6CgoY٢o g~{Cm֬æyeS:=3""ˁ1N >)UOƸ"9]fYI2m\+12,[Aw WTΛ@J);G{&+ d琠XWQFZg<%thӤW"'NT4;4KQ[+wvkQS=ӺüO*/j-$S,OH+κKpHBw}C" L*DUU5r-j1ByY]$R;~$@}\wL!A!DYhY8ޞ w(2)J;yߚ5nK#{f|ExܨN8;L+$:E*ur yA6cHClΌI)#4ÁN wEHy4lW/I8'JQc#Y=HFV  n߀ Ibv6U0O<tq͚*Cz( "bE'Cz鉼.:"CaԐLLdHܯ 6Ҁ )o^~X yRlN(rRމ.gudb;` tp0ow;@(PE}71L6-Æ7o* (@,p< E7oU;ka?ǷP-keC:{S(-!Ij9xFpet,0K G#CIK`Oo0YW'5AQT Gظ>MZ_}a@^H0qnV,e4 ӡiGYHvx)DUY$C::$dqxb\'k*Յښ/L8`OZX@8kxD"^}ƌJ\$L#C4G":I($2 HVDcO$ܟQ0q,0^Mj=W-O32ތڃ[TM{NT2Ti$_FQ` |MȐj?"/q"C; "ϘZ^>Фd= o+KC4(* 7^1.^rAC}jy>v!C!DLGy!ANH;sML_ Bn'C/qoHZ()&l;-s'jH)B[QA /QRr:dFC' tYTTB]vADdG2wcZa,dHX6N2$PˈJtzB}KJ,Q=>hPXFv ?eQZF'>Yf,Ĩ?QzM_zOPjE6ܑ:JOS9QLSKL:0F#Cڝ| kM-Pt6ASCJS/taZgM\^zRf#2Ƥ % Eө:S~"eIiM z^-q)d(.!RY=7Yb5<iTT?cgLuwM4Lh&8i(3DTdx/3Y%DMQɐPsGgߐ |vh>.21FnUFpet kn9Q7H\w Sl@' bC2AqXxz A\82x<: yhTDNLeT_F@*4xF)E[ZJ!CE2Chs'u/HCX5յK\Q(" ח31xo@&Dɸ/lCjS!y0'CDqp&PȐ2X JE ށQ;<98^ Q#[;eDd"<^N/7)h:K2,tL*V  z]MfFxw lvBw6UoI$}Y/;?% Y By+/C2AP&J,!}Tr$dZE ρQ+Q4N_NKtddNCl4]dH';a1=Du7!Y䒶xLLŽdtWK|22T2EtP2dZݙD_QݴddIB:sxe.DeHd2t Lp`@C} z{{B,UkKgP w17T0Al6Dze~n~_(3T4q~ 7Ȑv'FѣpTLbRʾB2bzQBa>ixL@@|X9o!uCdx);c@}}= Vb>ߙUgbcW"L诈[Rk9#GՏbJC գ筚!<@AEQb!Ca%qg @P-J6"!K, \W7D@(va01dʷh/oYOxofl,Ǡ* J<~8)B ^6?&GOS|>^tD6D(&\2%X.n2U|*&Dc= ?}Bybq)2$2`+-#2Ƿ r& ՘ G/RgzN5:cdFY݆T(A|FCh8-wS[!e~]I(dp>8e)j5Hv ө{.v`Iݝx'&: g^|w'<8/f;g`Kqμ+6U<$n{y;pOe7݊F|;9_wރl@iBE:}2mB$q&6Nڕ8bF( =Z 2D& ) 8򾃡Qxr[bt7kJ&'҂և\hy|dȠpbQreLT7^$2#ȯȷFi xW_Mͥ{ c+3F2XcbW"j>ȡqO&=D^bΑGbx}H$Yg>XLaFi.řy~?زv-Wv8MMpu `_[:w<gVڰذj%=CņUoū;?r/- šyLO!{UJXㄱ:Ncn 7=d2*O‡#'ే=7߄\.J΋<+$ɤ/l)8e N9Cݷނp,yji6suM4(tqeJ;qʐ!5ycD&yadȅk>C@?#'e]d3 61x=s%)=)aJb\FMTlټ_|Qqŗ6]@I"\V~ޘ\`#zEn4软7GOg'[7?WsFNKo _x6Zkz'bCEg[+҆N>ه9G0pwֆ_y9Y22sW'A5*Q"!C.j< +2F+ -Dڵqds7<mތFNL{X0\\q U7?A.[M}z駂IBM\(@HS.SACN@ΌsKd y6[l&k;/==8Sgb$*rnڈ>s.GXbtwK_F\sm&00|&8rTP\WapcDɐ4,4SxKƹH#+A\DqT쁸9C"! -b:E"C&9L\@|XDaa-q١իVaU0q"n6 >,IOw7 bBdKcN77/r N˸[ lj۶q#V/yN< U55X3%} %<~4\+ο~ w] p楗 . ,%W'N$z{qeb=+.5_L_N>l4d^e%Tu7MGI" < WⴰEtM3Ɠr v͑kHzeq/eIx_p(@cMB!C_)mv0b?h۾G|4܋\6y'7,|i$S)tc颅mh۾G~42qa*x8Oc,}pó#^~ 5 QkoYm 'bBN,N׌(FN|3'ѭ0-+p `Iu-xq̗tH@#:#L?<"C^s.26Y'G$I Eu!5zb~LT6b qNtVA>e8P(xd Ս|d2T !e=d3QxrB p1CdTR?s%Y#$K[s GO_&OKLg,[_r1oۆ۶K.KbK2>e $*ݲM~;{o/Y*^qG_jo#?Sv;e̜w.FcV9 # ʞH8a).qgdr  =qHdj''WE¦^B >|'WU]Lg~fʍ&OU9~+3vD\҂>s ?>Zu&7N!]3GsJ pXo!lb(dHSaN@Ї JPtD2OKB/ǐ q6|卙{,St%)/ƾ'#H_/,l)ؔL&1e8&l mۑe mԄW|pruy= 1cw!i~@>u4M)B"ZSOV_RTroQY0:" M4,>jT o۹3"-J׈ѣkV/₫d񤹑c --`ⷰx1cUE ݦ Yq2 3 Mqoh#Cw18Ȑ_N--uA_Px[ag)OɁ~|==dCs"#\[Uhgfct”VHVUcE&0m=W0uw+oXP7 h'u/F2DK@_|qDS\fz 'Jc}Iw__$0u4>zo¨qQޟ H+M ?{ c-WSߴU h,tCEHt$IJbQ3ԪfSɐ:cd\M H<(qe(0LJg{(<gYY )6ObWg%ڜ apm(hFjS CEСXګ tTAu,մA[RDFQcM)5t?Ѓ>{6Wfg?{Tvx2[7mL4p׾U˖cmF0J&L.nٸ!7VRH~Gw9cR0OJ@rAiC( oW*.2DDqT2O]+Nzd2BmRreq 1f4qɅ$w+ 3¶GD(LxK(ygr]?"D?SJN|19R= `sأoSk5/+H)R+EQқ 4FseeCJ6EH&C;!=[8os?omantuvʟbvvvxf)wYc@E8FJ//[vܿC o ;兮6ޡ LRRDSCjd⋰D6"wPK>:})s"EhRZEr#K&Uo"!͌m4+W]cC˝ܺ2qCrbҥtm-Ϛ^{|}ѽHO}kV)7 ˨IhdHM$,t(; 5aBDdsE),QPiVRrxv1}C| 9 _8a=JDKA=wj/o=ӵyla( ye١ (PU?=\ɸ! ^%&I #Ob_ 8t$Ec⋘!9@s#0夈/A0) 2Xեu^L>Lu9 plV[7DFJcm OFÁ3&IԤӨNU!J)l|l} z{{)^s Ơ!zn8b؁~t#ZƏi^&cHC-ZCt N՝g]J=@<B(j8;;w݃l7w݃ɜ1bN+“1Ih=J9bEo! &;qDÆ{?LŊ%KpyA*'jK篸'}L$\.'ɐ(-L.3 {QRh "!ƃB dVau4TG=I;zlW)H0 )^Va ~|ʑ iQtqˀSOb &&  %sЖ̹)zs5kCu:˖/%/2gL,-G_O֯X o j>qشf }H:AWBӃu˗cRb@sc))#TAY۩.hCLUPZg9"m&d(lV}OaAaƍxOB c ㅧB6Azid3[5dzoO(MG,Eaܮ C@Lx*2@XJ9bRQɠԄ~~rdU''[228];@e:)-,ocnh(Mxt %sO:(hSwށ< z7c,|8x:h0FIw9ˑ;iKO~:θRt%҆s,_M-q׾t>[w's./~ Ws6 k;*-`}‚O]| N:<<_bبbM8K~|tˮ~F؁;;lF}cx`[7l~ξ2\E!#w9K؈ l^s,N?n :LU,}J͛X-LJ,#W "; N6+LՎi&'t!pF$Xd  7!Cdp6.VƹoBOo^fF/ؼ_Ne-k Ȑ9a4x(&[!@q"xc)ATFG>:Y|ԓgd*1s,Xh3|ϟpSeVZyG\Q0eo.G:g8VqWl&Ր-(HM=A~#L.FO ͕s3Ϡ\8)CС83| \M--a `^})pY6{V׮zo7R+7Y^@Y":!3Gw:k5+ĸ#1wh+wLysL/ 4|͆atA&r udȅFo;$:FJU禖͢i[muȐ7dנ.w/S)boL,dHE%'#3DeWX5+N0%4ፑd}s&Y%W絵;v_jHs#qg9~ twv}+} ?f3P^gu?†իЯ/˹[5%Itwu)u)HQz\~4]9-=!6M&{( 9@Pm?sjȉ#dbiIa9LOXF'a8483U%ͤ)P Prkԣ*Qu0 ],+5h&/($2h,Ef & ^_w3 2 Gxܔ);i2 YU:|;l5)}4`ܔ)# @V 9h6@iꐮūO\-͙S:מ%(]$N6{u<۷cuqaSpR< Gp0O'L$کqɠqZ~뢤JaחzI:c)['KzrSHǑC1!K>׾!{NGz\-MІT ypg ]taȐևc|!Ee'XƍKB#p?>+%$%P`Ġ!oI,FD*+o}wdL^mxs,&\~-hݺ,]ǧ|):4oo]O}2|3C{7 >~kh@g[&";;?߼ geg?Lo/n,}u3ps}&I=ܶwp=!b5F"\\vE$)R9C G~KmGNk1v 5e$D\Q.#C,n:Ok@g9&Qjc,J4XJX, &ޜZ2Sߔ޲ ^q(?@JL=Gვ@x>u3 H6k!E#y$UF8{θ"կHdC*'|ZFm謇(8UW>IQ|J9)TUt@d:2"S yk"Pddk)-ZBiEu({s2DIH|RC3:a) TGrk'&Rd8 /e Jʗ7)@č[^ +^mllj+%sZɔc,uPƨ,S>Fڲ+#*w-h{\ƎPcZ &ieo;&eyVg&3z%8<% ډP[! ˫vz#)KY:CR }hA:#ۜȱ{)\%C>ߔ/|kyIGcSпp¿|q!γ^dP䀻ԋ3,g˯9&7j2=r_|~2^\+-!,oZd %sZ 6uj{RbTv7 zJ!8Q=\.˟vjx\ 8 M4ZO ug~}3^ALPZF!W]2KB_K. qfugM]-AG4#]JO5 IDAT!o2'C"NgHpOBhkT'% xY2jw|6+*I >/oi^f2\/GnƠ$D*NZӑ "hWMW0O> |A;ԔiEbD#DʈIzΐsI p"FRi%V$za=) i%pսyr~>=hd*8d{4AP#T Vqq/@T<ñ>|x/'JHVRʕ_zzAn, "b M ]d.di#]}zNQbںq3D7DO/Ap}=A75p jƷoHM|!Wozqg)q znFDy!T"EvdH2u3{ۂ|Tì#IHD % #4N`NO(IY8i *p+#!L壹DQqȐL(v%DPC!X i/<|&:N15C K(S3&C;vih֋b 7)s(dȧVN"Z~xD1!Fh-d^]N:2̆7'8}7;=P Ctecxq=Āl Ap olX/qD6Eg/S:{WlS,p!">brK5"52@ĸM!o(h"4fd> N8&$\ܧ d8OFF.~qL*!AF1@Av!tvXBT}ǐ %D]Kp9dHD.$*|̛ > 鉈WNx2ۯ/@0OLAZK}B!dHMP+(dHA}P\˿nҢAMJ㌤"4RbJ 3r*q&"NLv[-khƚNu)//T%uvR<]9hVzWE"CT˭m(FVȐ?V0odTy!?KB8 !t1ic(-$N #E ]cJɋ A4r¢kic9q2e rҵSiχc'MHsZrO "v N + b" y(ycmį(~9eG  S¼!!C捐OU?h\R@^$CE?ChV.-p&&{oKyT%8yo}EVLhWIm:_l#x w.I7qѺ '/zWwZHԦ8 :+`<{kb2n X>W֯^SI1cy=4m zͨFcU5}!܈ÎABÇGys? ?X"؏!!};:v4݈ f3pP F708HV"x ˷ΊnP}RkNIIeG D!Ca$vt⶘'jdHTFsCMc(GRD(2~qґјߖQZ`F'Wg(ME6x׀BVi;bJ:R+_!2dB5O6ApP񒡼7njaaY31kx3v!T]M+ah<⨂,sTCG>=p c0h>08IԪ8~ޘj5VcC[766asO&76vwiX&&y۬0qQ$rcb˖ho@}u, +W+Pˢ>,qV#ܣ/-@ks>_ZyqPlC\?qgg?McPXW!G͔p a8z =xn>|{rOVXշuڞ} 7bܽ/5baplooڌT2L\-7kP]tQ]@mU: 4&55éI!=u 2K`Ǡ{: @B<P c`Jث)z)̜:;:1a(ꫫ MkW 1={h͸u*|dh#t$v ݉a@Pzap"3O>jB餲P$ICRΐ\b?Z6Ph ZD).e~(R̮T|*IO"VH1o8_uFb9!AYz궔I C>pppƣF;Q7g.U?#"pѴa !Ԍ?OeݞBw>z"Cá gY8ŕi޼{coҭ9ÿO O2ՂE"pgy8uC+/~ nX|__)> OB5nX`r/T2D)2_eft98rUK/HK ڃ 9>=r18 uFtɐ 4eGp:+uE!'Cԑ+_G|$*B_D"Ceߐ N^]ʧFDrJͦ!OƐg@>p8 C>oLt-r89$jMcmEǭ@$XS(.3sS|'3!>=о[Ѿ-rE8@qKy$ng F3i CGƵ@Z% 6jܘ{] C<@M-?8セn4cŦ^ԦRH:Y5$v0*^Ljjv̝= ɞ2;.dmFD88v{pcX07jj0C}xa*NIQ/6JҕdisE}3B [4MOyfh>/kP*!s݁uq!cK'SuT?.Di(FVԳB6T6ʌN(FD@"tP܋;\ =*a)[TWox= 9d8]HAm*iヘ *y%ГaEছ7߹\lۆ޵/5;:;Е1q0,]1tcC !#;T5??I`UIԍ:{|j=5U)LjjBo6;wpFM"1 X֊Wj>3kRX9}|qapk6bte\ƚM[1ghi oia#fh{u$Lh)#0wT1G.Gl"@2ɧ~w<[pC\$8 ݍ-֖E%衵X֎4ZpIxbJ6@W&FmewrH9 Ob'>#͡+E3F&Y!^e#:$OdH%!aŽL>&%}Y l=! g^KA/s2'N6 $!$w |o 5frcL4PD ;TdC:2)J1?JNOR.? @,!ZX**{^ƴ)B˺J'*+Wo޼y%#8rr A>ͦ : Z_/\fW$4Afr\r!:L,XNLLÎ^vwiH ;zI%24 FO&|3[cKW'r0t6uvb!3 r88q$ӽe0^ckk0ih! UwyΖ DH"DR~$DԄh7D­uQhȈq]W''iȔ@(>;#CTP>J|*iP9*Qe~.掦}uy)EOL* |KLQ1`m=k&H HpoߎSO=GhѢ}ฏ=42CaFI|+#er'y~Z^tP0}&2[K,AGGWfY%Emٗ"P ujГ`|C#=W}Acu1}X#QpШQq)lCɁ!OD2(-bgwO>pV~EE>( -m /oYGlB yѢHKx慘K6O788Z3AMW_>7pWB4R(39$UݯͰ $ t͑NF۱(k؍X r .L \=x ̟?J@|lĊȼ˝Dȳ|qFCL|LQIiOH9E JOI,"osʼn'ȝE5v42pǷ9׆MH9>0a,يtL{xwwT5297bx̃y8>6}Rc^m;KLJ6ntZJT|((d+ }ǝ .kڥ5*!a[ 1(Oov0?`ZV} ;@4%o}qȶvOaKc뛑_Ҙrؖk@Ca˾M~ys)4іDA3 IDAT/a<άHhBxE$3;;ys Psh@WWm󆞋[NY qO2x*b% $xY%=qFQM 1%~ur &-/< 7!>9x@fcH$drYxr1k,|C+O<,jjj0tPtttHgwON;s-<|ad{FPwq$S7: d克\qI,A{dK /bʕ>}O6]Tm |lwaO7oAwaf,߱p K7!5nr,>ن|!8r xnZ8a;LػO1;i"Z갵 ,Wv+v"y;NV yY9'Qd &glL6ؾ~q66L$r2Q*ͻڼ;?zfvBL8|Nw:N:%Y0"A7+BIF8ɊLwo;(iNKO"M}=9Iid'mr=@ BfCQu%G/!FִP @fJ1im hPZ1!6}d jkpao=J#%/[lCLI5HS*iymj2T43;}qL尐\ʝRLE0@-`e6R-ɲ($mBqa /ښ\4nԨd\4%w猈;Jc O5Ʈ8tutNNEEE曼[,_UVE2`1:#Jb .Q$i#<ʕ+ B?>gxxg{ y'WY!Fdz0$"(.E«;[eO!vnD4Pu.tTR]\@ɛ;H@"SN _8AUs޴}\${%!+:q|&$y&v{yу“HN`(1Ȱ7r ăgR5`$xbLQqa|zeNi4oMhnljӊ`̆:fاЧpbF=*NbhB8!܋m@>;nxCdž6Jvw3kp7˴:)= UT.kF+R7Z;VeXCTy XddRYیݙ)YgaLǒoo <.,9v#l(-C&7Sj=1`&s-=}(t!ΐnx*ġtz{q @qlJt[\Ea3"ȴ  =|~!|dv6P4Vlet/GP .qشO2 Sa+#u3f DoCE'ԇg $ h C2 M"31䒽ǻm%,_ U>5ZsR?ic=6eJ*=#M3ȵ=DIǀL!i&^{5AFUU&MM7}݇]Rɂx1p ip2b#%A#]O l(\"m*@]bˠ( Iσ >5BlMA#(J6uPVЄDHsgOm.աBU DK*˙YYA>&) h!67 $N/U MLXɩf;"v~["ED3d4jD*c35 F4 BmCAOSm[q~Ɗt餢 Xޕ(|d"`NzP׷!F ^S< -j ++GOjni7w6Ye27Ȇcɵ)@i]W *RMgc>$)ˍ$!0e4mrzEsis,oߑH@gR|!_7b۾!2D/poNm`7U.*jg˟e?OFB8_°_PLIV!uסu||% 9ݬtxY)f>?Rw|8|_GQq3 gJo$W2wE=2XR<* 94crTYrebrmfһ[SSȋbg':Y1Ԍ#}`(]ƌ!O(g2d%<ȨZڒxLtQ뮻뮻x<̚53<8^ܹsM`%.v?)BEU+[;p9 (,,4ߜp k'p! ""x8:aLP]5+ޥ2y,XKWT$䥗^Nݠm(jvc...:SJߏ[QS&]tCEbWJ*l#P$4E#t<6g̘?ޔXjC *76q窏Ѥ0E -ëf(8{|Kv Eҏ;7+YR"F~(@Dǖ]:p(n>8@kݍ粣AS8ddֻ8hdʎMq{rql~bg njŦژ6{;>F/4w]Փ_mw>GKX|BVn;7wg;N÷;*p#%v#Y֖d)/O0#+ ($)L(eWij wgI-š S$R[2q%ca,ie} EX ."^v=== :p \M4m0e˖q7peq'oo*G_|rx>nm4]GI/@ vqPb  v[Rڋ.+V#a֬Yy%HE<ի+⋿kO= o࠺:kFe~_jTF/u2bRb{OR|~4Zߌ6_&28e|meFO5^| ~z%mŷ?QFG=.>dQoMp'Ӫ)a{1sX#?) SR"x l#~ L,ڏZ󿿓/]p$%En,WKO0.I ̳c^o^W?`q ط7 RLE(t;&u Q/?NZJ9i[n_yљ4v̜P*^ɲ(TN̬~9!3s9X*ָmq| &{G)VFRIO}FLd#"Wb?c ?}v'+%)˥(J(IQI.g\Ф k椰'QT5eلP )k*N;V"m޼9:[l!^={b -[ ';"y+ :lE:n'}~Ky}w Μ͜8άRiS_$#2a-EUPCmcwҜOэ8sZPLf& zK T*P@hx Y2JATC̝ub  `j}uExTy92iA#40м]pؤL=}lN n.5a }lqxڰ #( I)b@B?/vIJIaaaR]v18<̔R#3oB9 լaaMk:q*U@b+SQfVCBplS=UU4Q3 (%0zS5IW g7%Će*nT7ng Rc$ƞF`M5.%qB!`@Δn/U7CcsۙPk\tM ;fz k9#gҾeB!V~4n'Jo{/n|+f`OcϾAzuK`B^%÷FA{oCe1`rhC=)VcTUKɲѴq뭷xv% Bz뭀f3"'=Q0btTms=\z%[*K=܃߬v=.0VTTVJƍ } 'L`cw?R OrެWgC"^,+?BI) 27Mpxf .Mr#5F>FGAª{d0ŠFZ=xA}VP{UϮyd*k(^>Jq<[̙5Kʋ4X`8P6i-S4cgx'ǟ@Iy<{onhYϿs=gxϷr䩧tpy_fDr͵L3> ;wri.(cnutwtP7q_k:w.}<|t׮I3g*>\=7Aʪ*3_nϝ{`Y|8m*;wr/{n5kICyU-{o#Gv7W}'qcܹ 쁿SOQ^Uş}COXJqi)o>,;7oo} Oi)<mB'Dcnt,)E^j\^U<b׶\Ƶ˜'K0d51)fyLho_l9oW_}ȡf r"z?. EQ2h7?O`Ba4AQm*(hB)  J|! !TTf:u>]|ϳ;C Ѐ5w{ !("i^u~z\DQ#K izg-\\Eo}Qr}C\.9%t3ܣQ]ħA0&ʎ8y'98Y֛E6 tz Eejۡ3gV2u[Z+0קߡجuh)%78.N&vnntxE 2sKi`syr| Fh=Qtɹ'-@U5⡭G瀟"B03Pfw{;?{=4Nˏ>c( zy[c;o?ZMMeE??y?i]NiӦR Lvx|ˤl޼}1y2Ol RRVb߈N@=ܾjC 3++DxYYNMe00ZB5rh"2,RQRDC5Y0Y'P"1G2)ii ͷI]DH'(r;hN.6 :2g$>FKG/S+vBHf.EU} ذ)֎|ੜp2&GhvKA<+6wְ Cy9ŔYc2}PK!o>֮]'3*_;ml:OMn@ '&Itgx<himTHF:`]jH-4z `Neez#BD6Ҫ kmrilAr&fGFyd(E:(Cu$Wp&kl,fT085?rT!,A nJӮs.ŅNi-;_fowox褠)iG蒀7ĐOAj&5ֱhbv;=|&Uv>Ν-ZO{0@Am9vUv9jd (+P?8fZ[EmX!- " zj[i$z8nټ}uoQ M|SxcƂu P)˿SU?kd* ]VUEAq1::61|âӶMe}L=06 -6IO(Jϋk<*Vge125ayfkZf=rLY< co#5%/r@U|"@QT`.Myq"At.ut]Oql}͝؍2&R5EQ3aveY &vbxYPC:j30I9eJTTj9S Cv P"Dah;wڊ淋@f ]G"HvR_a$D%H̲Oe `d8hxjbV]rXmmIʽ>rԊ%b4%"IaON(17#k V*_2+D|DA[H_T}dbWGaw:(fC h:2FdhpI؝ֵ`sX/|: .gh\!T~"^۴]bx{e n騷isغ8e!B?xbTu42T?iǟuv0 SfaѱѼv RFٰ^/_j.EEl\°R1c!h:B;d "mv19\bSS?}27 m(6oh.흦S2RTTE zr&Upatg:Bp#0vqڸb!?kZ4CTE(*.(4EOfWߣ5| p} =U쪂@R P 9GxGq8L)%=~NMÓ{P<̔_.nV,2Ì`(E-X8e$ص:?L(@ASk8ad**?1\&N6PvВ`Q]-6tE[93lmp>MJTE`%;i" ώ>mU6E @P0IJ\E41]}?cɮzFFk)Fc5,< E.#ݻHP.<*ٵG~zusWO+o~ad)) c\†}KaiבBgƐMEabBye=]p7~6jb.\߿]Q rQ9¶QVI!cƗYQ5˪3~Nj?ZV.{$,([2 Rܿ /}]ˡ"*KZ:,D9JL|W"cRGOk8K H4PPRJt B%gWc‹˵H8eUGӁD А^!kT؜D}* cE7K](0BdB7" Pt%5N(Ep"?o'1H-.dnE9IS&@ L&k7gϚO= ]DU8KF ŇoDJ^ܾ_}à#E!usIȸSo?:ﶴ2]`*b&50$m.Y-'9"+c[epDx"TRR}t01d̿51ױEIWgb QKbb 5|7ZR{k=C>/JxezdhBMS@j.Bo&ݍQ8pP\XHϚ5  `Wt,]DE7fuE%.M9B]0U5|+ T6wRx_AV\UVrM!8vj9[!0_ٿJo!ckd=[/Caa 6u`(#!w8 BWPlt 3BP.TЄ(p2pDb(h(:EbE`M@H_E1BWPT"@ E@H Hb=LjW. Dw& 診:uEamwhU yapQUc8C:98gU'N+$DAWDFKDŽ`H(TRM }zdvoLvy5)\wDCI(0P.|Y.H]8Hhy,ϤO T_@Hg4WqpмIy96lt %NÎ^D8poD(3fMӖ̠i,6 wѶu;MuL3(NUXCX+pr֏.GA (rc$eM+RZ|RGY` an 1(Uod f`ħw>sg?L{oJa-CXV9t4mXO &}C6a\z߾= pظh\XO ӷޣmpdJf)5U͙ۻiį 0 <-%vpmȲ;␃ض=aWΘf)yjJ5A5$`0 *G4L>'!w+ݧkƿt*V2fF 7*<"ؓ<9 !Rӧ(}75N법t S\dd˰g|H)sft4UG{ J30a7Ԣٹ  z,5UO@称 v TB#xs ;7^ ^|k=rxlE̊E<(I}|%eHrOz ȑTRJ84IiU2uDX7? z-80HqiS2ݘzOQ,e+v"'R7ŒNm( n[a4&ϙg>Amc+)y})짽N`͇8Y8 ֗  Eu ,NʩtkmwS %$vvRJV݅bfc5 EDXj!'Jun*'tfrԜdL2~Ț,QJ#w xƥLX5_g1d?P|ۚ[;b7ʒdk{o,秿%߸¨ ^+BAa!SLK/K_k|7T)N<$ ÇRg, m6N?tu@E8@;kPLi" _(Uj833 <[u#0BAA~zZ@iKNn'-vqꩧcRrUWqrWǩ4΁ [z{ilW;n#4nd$ OʵXǪp#"3dstD2qS5pI@J{D؟ɳ?>DY )(t:Xd',I[a6 nhUB4XjR Lo`;406]0 LPU:ìytb3%>^B_QS49>?* XA mߑSYfٶ0{˩3&^Y 6V3$ȏ2xe>ϩMrYFҭ&?0B8[,TWܿ^U]υ]LRr_RRmʉKORFRs7i_ppa(IFupƆyM3ӪMH:FGU#إ:Po(M(nʗHB*·/6?^Ͻ/?K.@( _|1ׯf``hBl6 X׶,kB^/k֬@s8RVؽMhz'JX 055q)GŰ05OT],%Ѵ$7%i#X[8E^ =5|@[Z.B'1 !0==Ft9)@(A_O?t݋aSe54:AnP:\bSaXqxn`V:%)tuc˘p=c}C7CӶ0e=XƜ*? yTe܏eY%+}Lckmd`A&`h\|0vKCQB:lgu] EiM(Sc]M߁{PߘhfPUy%R1 * qW\>4HUUضmi.5|ܵƆfwEwO7EvuVG5gXȒ*EE`9دȘg|, hY$:= IDAT1+VĦMLs='Me&:x2Ч+DX!6vD?PR76_J77E BvM Tpunk`X Q$tw=@M0RA MtԊ:vP7Jui cKK9Lnk$xKNcez#f|x.Ɋ%&%-3ˉD*Vx݊0+5N9Q K# EŦ0dʓ,ۺo~۸\Ut) R4YJJhO4Ba^Q8]Qۙi" kDYmY<͒V{+a8bSRȕ vO5c1Y  Yg2f]Ҭ؁أ(C!]'kR*.QڇGhljHj~6olR&hll}`@(DHeId1ܼ^8-DK,aIBkѥNSSSJ~08]؍^4ͮH[dd]v>1Vub٘3&/嘟?0 ƪ)DeAm=-*EcrRS&R*- t{)ՑAh̢cV(ቮu88/㱿=O>KLcuoOˎ<|۟,>"j'M;2̺Vz#cnOJ{Ýp߯nf϶u;y޻ixm4o}_}ZvGM߾3fRPTHWk;׬w>Na' à7[÷9cԆݰ&OVjqnRFNr O>3<$ nu$@."oPˡA,YN+-iAJɻe]WU~%BĆ Vm6%=3 TUME`]_Nid8uА$hj R~-[N0 0m4^y`e˖r8SPU5} !:u*wi466&UV( *L\.$5% D]ET1aXX Fӄ1AF1FnjYfc(v,8,i،Dbh@g)CNh`(M((t{fBZZn7ޑQBA$b+0ƢiXSذe+%e U8*qPSBnBuו3c) n*H]?lP]9/֝;;|樣_r׍?c{+mssnjNWx's9[rh,>ι2عi#%\+wrF}g,\Ï`)M;Z惏>knw?]7?렃~n{8I{L䙝 I*@B D%ƤW06NIŲ:OzW?7012Uҕ],6kgPzܷZm<7*gPn%m ʩ۶mC|.qB/}G|[n H)imm-]Ia;0*gffM6)uU m Y`1]$Qt2j@tYΝ;W\6/A]moI&_57tS}{Y\\OO>Ve+ԩSLOO]~~="SO)lrtB̳f{r^WW\]Զj{!V㥮me% `w&W2X𔹡@h՚7-Ү5Z.s;dCo; 4@Ytp#$di">3L  imkc) #b1##,&3sniffǙ9GH anbI!YڶtTJ֐L 'AN}AN0nmzӦM]\B0鮻tkF5A---$I>\"-?z(xm13BYUqX @k)W]KtΎXZPѵ ДXpfM\OS嘴D. Eu߶:X~jm!X;DRLL-,)[{;"tbt 2Fr9I(d~rX,aWijg'HG,^E1*I6yˮ!12>% %LbUQhZdAq^'.97۫j ~ӄ"DMy?S#ɲi x$;0@6g"%{Cv\| w]=w[~_pUG}ӿ8|f=Pǵyl \%m M]2?7iBCUdGّsCx,jN4M# q! `vvT*E$!&̐n}N#፿^\Ji t-裣qFGG/qF ǒa*B! `rr0* `߾}\{e{{{!  { IO.h87$km|0+(@V]-b27|*'|q 2Dջ~X=U؄mSA< I+f9"7[f"A7cYӁP GʎA,?}&$`-Ln9I@:` @HtF&CqDyS]1/܆qtT //eחbzL d\$fYZX.n'>#uljl#O<կ~-oq"~ff,򗼴߸˿ݜ8c2gXZX QzX_3D?RU~ӸdW Qc3j\r{YJubNZw*}[U+.`yCc?̰-f$IMg]׹v ʸH$bȫM7T泟,w}s|t>w󝢢sn4jU2<$}7"ݗFGGu~ !]Qfem蕲Y糹=XճP(ą^X'K.N輮TY h)lG\s"i`g]E8S Yu&sfBbV‘kTm5d9ϵJ"$3q4a#NfR.cd1`:B7H]GQUΙs+YU0dB:PT01U$q?r+PFPZ|+93{tI\i`E#[5ĄE!#0=6V|VyR)+/sZ8_ oe÷uw312\Lf_97I>s{,Y:i>-_2٩)z7lYϖ!{0܃jrmݮxP VnWcI^V?m5vYT.!"l^.?z[dR HQ}-JwmŋT )i|_;WvJ.'B0wi( i_30-RJi4M++kGGpdҼ #v~Q!eT?@STE! ں98pl6/SK.\.Ǿ}O ^k3HA1±ƿPVЀM=,|x6禨C0gV H30cSJsޡykڢYeN 8) `CѸh6QOo(*9t@E F$ TD`P$=_NZϦH4dw|D )[ t'9 `fXM$pú.SOr_ ?fP_̱',K^}?~r.0˯ G﫺lo,o/a۔45Q-(fvn"ڥ6sZl4-8l<`Ȥږy9{nǵO*jlcfi,xRQlsEޥ(^W¿w*ZehjUa]ܕ*9wCc$7b(͑dhii)KDf< Z~}E  ׭g"pIY9 ( _~y=Sd##d]kKFHJ@aϺg!5u2{ORbPwz|F(/njݢ ĕ^n.vk{ UӚ `GNR2{:gZ4JB!(" $ D%v{"4KOcJi'$9i^KA8 OTjQc eP1擌?FI:V6\OORnIQU.yռw~?'<#Uo$1 {?)~k(AZbz$R(RC. 1lUꉫ5)L3@5NRՏjMv ۡ$Vp7Ni; Jx"Mk̾)`s4Ea1#b*B-Ǘl8Pd2fffHR[ن͛Z8p-oyo96PTxzf3@|Lg_/_|胶B*߿7| _*{ɯYT3~LYx䞻Y[6;6ru˩|!զ|(.yӦ URKKfԩ)DlټY)%h'DQve%*wZ[Zh4Ν;-yΞ=['n'`TvpbzET& 004F_ř_cv1$N + ɘH(+x:NX P80c0=warn HVGo67T>r9G>{,Zf.+\.3Tkduq ܀D(Sx)U,,w/IE+Sm4@E==E/hg$ `?BݟW|[' ~?q:8;`򭛹 (--˚Gc87lj?y,ׯ'dp ǗAv\y啎GUU]6Fؑ}\[/)z5ɼQ)qtvܚ圌h7+AVevh3CN=Ķ*APU]zɍ1Lr@;cs sϾӼ청|8qefi`8lET+ff!a1X**ʲ쟆d9(4 i+I6Umn&=ץu۽wku6q&y[Ә[9ܐT.碔ooc=yTq Au)Uܨ>OtC2;3k>wfp"!yV-e*7^r>i{P%Mn;<_gƉJ#مHfsdݺ*P(Ļ.z !2BgΕ,,,p(pvi*-//-ƹy8.O<y]egEXdȦoT-/{8x 〠#0nF< 6[6UGɏZً`VYv=(|ŰK'Hw?2X>͜ڰ0Tgemnץy3 y3 QoY]0B$yl+6eC fQJew9]'@,'+)@J*5Mcppo~3ǎs z   p?@<:CPw5\u]7 kЮB:n-Lld"ɺ܆?ffjXhQ&&mq;FH&I$hTXMRJv3PC5e,QmSXҁTq>8XL0%*l7Qj+KHpjt`@5c,gr+[ 9 :R-L554cYo*ɱsH IDATH3yۿ31,:Drdn6r4u̟‡fZTi<5G1dhIMJ&E\V&\y]5.u(TPqk;{^yx:w#[HVN7{cӂA 7 9i.\p]R(GA8fϞ=UQѤLLL8?s?Ή'8y$gΜ!cd1@q' VBJࡇ⡇bhhȒGAA7 zz G"A> s"ThI>Ϛu攦g>!%̎2LqΊThڔ$!7ʘVyd2m{TE%@ as*P[0LXKR% )c P'ɊreɎP Tkּ˜Eկq+F{Kc8vz.lxm)C Y~q/ E#L,3SF#;?3o6Hmh_TEmd`Hb*F*?d(@0# X)Ոe EdV(2l+GrsYܨ<~L~w'f7eϮ4۶:g`dS=`͛9H_ OfaaӞ7|3ر2RPϝ;g{"E `(X<*$4\Sf͛' _%ӎC=M7ĩSj֣>7lIX  qx^IBvuu Q%e4N%M" [>22¡CȜ8! _J0\HD0fNMYV5>}p'*:qF_vVhM"VYbjH$B@8q|NyΝi,%K~C>CnD;ʪarL0dW[}\imuNS3G߸tr쟺]jr<՘XGy<yC]ueX\\\e(D"~~2D"@40莊 ,7ӿS'ݨ-[X)rXH_%d]י'ȑ#r9G&?3uI<ȡCd-p~g'|(*B(4]HTTƖB7M~`~>o_Z?YXP֬|6Đb- YJc37oEZ LpL-L&Bp3<<̆ P .X[~[T ra OOr^6E"< n Ai \Hda&B29W,,xo(,v5M1=; twq0Fr89Y݀!N'kܝqw]`Cs.r-m! no sꪃl&)1B9vfW'. j1 ;=zJ@Q]EάeR2;DEk ~uV,[KY!UUmQQnV*]ڃ"g MaL찔(I d<:6╯|%7ٽ} zT5>Ip$Jj^}d'mٗ9밭]TNkRYqɮmDž^$q%'N:غPǥW -&,-H$6Mi lo#.TA?z6Cha8]%yAC)Ct v1{ fY)"۷%H|G20~ -DYVjrEMi?K*,_QS+ۥ2ַy[Yߴ&-W떤}hbi`9QSB+KI1 [Lʒ#K-%nv|S6ao&f[+ӱ4yMUf_[@$3&Wm/-m۶YĉfD6նnC=djeu{O=niJ MQ@bZ} A_*aH!0kGBJr≦.?0x;ؼy3O=\H?Ώ8L"uu[w;4eí,=Gib_M2!ɺj V^ʗ.?kУkYu9ܨ5yl+7PXʭ4 \(Iq5DأGVN?d:M40;3կ~6s%=#?-SPI@UW(²]ʕ*tR- Zr$ [288h~چRyf>ߖ' ZS#a~ҋB (TԼ\ÖB/Vnvɓ'xtl4v$/cNW3U9^$,߸.}="QGqvS5Bk*{уE;gjje::RTܺ9YTY|7ZedKiM23ꗜa'N& StZ96<2?L}w '{#zHgė|*233> 2 [ٰ芢>9]%"Ir`T`;?~S>zXtRV5"\`ȍ"Y%~xɹCfUZ̬ә+/Cj ,E6 MXDrVʿQea6c ",iO}_|.#ݼRq| _`ll ߏ>*Dr؉bY!9{,wuʎLpcHO?mKtرbDsαUp]vW5|/RJp2Lٹ`0R3U[C*+BoNWWzS'3tY6d Jw9\D[Q dU_kNJ.V|ma[B d *!Zzגk;U,~(% Wj >W?X΍uEӽ69nΒG\;#[W9'0NBP]PfF9ņǍ ܼvC9Vl Yʭ~{+!E6l0d37ٹB*G#i}SnnۄbC6ecT ]] J+W0˕W~>)Gz\;Vv 8T||c?*`\ɿFoӠQ7%vqw5CdMn diQ 0uUJm7|%Y=Pxl<Vk?#t;^ j |\lC&oEJQDesQ, pͦljoFeʽPE[hI/@,%fao 4'yHPx?~sjU$TGG1hR™3g'?iNbegN#UI ڐHi+C"jgN/.NB׼;$^uRiIw\ .*d}5;V]({RW{YQun5洂hyjLq8@e7P{ѫ8XGzCߺk~ojEGY=iujୃr3pҪUbxj6ٗ /DUi0yHs /CU'J܏k6lvɮ"Mא>U [IRp b^X&C$!WC&gϱf"c JYOD;e,^+Jx3񸵋:R갭+ye("!#g}!YrijQQ,_yB#(#P BaH\Y$S5t $OOM1DHli -EE" tiF l6Czx >nFFfeVi(gHx6V,0X\\9缋nq)Ϋ!C8GO>J.[PJ$Py}vAu'0vy9Y܂!7J =]4TcA 9MYNDՔTy):Uޕ:ȝ<*3lU7_v+_Ś6큭omCt;(Ur JqnZZң3Vxɦn :BA4->霁pp_Ab%Zw C"#AY1B"hK/G  $]k2X ji/~JϮ4!X3&i,rw-Q'l"[I$wu2r'dBE VRJwޗ^ˡd`8H_=U !M#͘1U(85~xZS'OgϤS1\:Ύp.hqyCg$H 6Qb9-14c<h"7 K ԙ@Tۍ?kY`)ʜk&w_޵CEɺvnީ혦 i 5qCu.h0`ȎIcH؍RS{X(Kbn^]Y By\y=RO pr|Tb   # mFϒF etiRc0)$Pw;/ŧ~H!‹wB.Γ8|l|"a"֣]y!O9IR7yp&l.Q#H|6Y%`=] 5L/ 3.Q#Ya}\H"cS}*|]0825OѸr΍R._}Cgāq =/[o_ -.WA͇5HI*E鬋 aTD"n4a Mx_ΝwGG08aLʙjִi ]"K-svRoex0Q:-OXnFUe:kq󭛹C%S}B7cr7jpy(f}๤=<~H#bq! ɯZ [9r0GR`ʕ7v -kZ 9om6|0[?@d&4l vB(~?bzSЧ@HP]Ńj(_W7ݝlً8!R#H`i8.["AjztZ_p9Z{;B4acc =zwGD6 fX;Q+7=F@p?xfjMm16Eoh7ʏCFX@#c-[xxdE(\?8/Ό>^ceyBcG{m-bCJ4P(ștt) I=2 9xѥ[~W+je;:eFZƏٽvSM\́.{ˍ"s**КDEr w:ȍYyԋ]<ʼnٳy&+ywY&owrM*Ǹ͞vDkr7~lhuVj 1} q{~T(~V}?F%VZwo: Fb-Dh Z_O7{P:@S1qr,!&@Nܶ'{dL'yuCO` EuBV*4dT؎VWC.6֫QۇPF6I9Zv·7 UQIΡa,ΣΒ#~8^_ZCH|0탤EH/D-'̠4KN'xAB*iɇ: y7س-Wp-:VOe†HVњDV, IDATJ JyȑD#p+CMQ\3E)I0wV6ޚk C*YgnraHz*GG6{ Ns{-cXv*WZ峜?$!};Y8dtrPIr ' t[K%nu(mQPͲJ @+Bzgn_EhGYl\)F2IzfSc$&'-."uiͩfݥP$3&#_! ' D\O:y$n"3gIOx F.'>>a`l)5L&RH$qprj%]^k^ n,RJ!IbdRDvP|AzzV0?te:efJ]H>" LVa}zٌW#Y}lzATs-sN#*W c'0䎯c/7)56wkhm<իغ] ՆX+g0oE%jsCNoȵmꨁ} ICvb܍\L\F6 'K7buƏ# 5Po^ !(Y=tWKtPb*vjeh}?'B&'@Џk%;=NXOhtuhP@"a+܈ùfd?շˍ Z@F(33irsdLL&3=Anv=7w>@3U!`5@jAL7AC Gh~i2s&kc%9}# 40l3jPw[namh!ͅ, ( Vޑ!=@H1}$/Eec?.u )D"o0Zhs"Kvr"-W\IG mF'$b)ͼʴN3XfӅ -Ozuf.+JَٺE] ơBHjl_\sƯŬ[o+ɡv#ƛU̽)mztJ, c3៷THQ:T0+ nR8;X< j]*m J_NI;;o542%_w= .&ߏ/1/fj!VmAu"  .wSxqL̨xtE.ŋ- YS,ΑFRHZ.E(~DO#8OqӇo|k_chJiI9RCC7a,-:kBiAoABH0lr로!H$p /zq Rq YuHi]GTg:= 2KI=׾g&9pOxV!ٍ] ~( 'Oθju{563SKZezcnyL>`@ź&)U?@e$hQqaJ*elK\2gYwC jŊ'[T>JP+NN!=2Bjܼ+(=11=\6wrtS$2$Ѕ $ӧH>alH?`o/~={z;FGة gB*!iĮ;A~>mtH]7Or,"%G{v[SfSh>DfR`[|{n趂td҂dɷ,*3%gZY2B`ʀT[jOvɵ¤;Z5 ΪEKdr&fTe1f|4H$CĒ>gN񒝈軙1mNTas.?뾑m.=cI}lZ0zzX>?qyCXyiɒS#5M" 5%YtjL?znLGNGa:7Ǻ;(]5AY=UpWj!5 [Zj7Yݻ˳"OVf!ڂ 3&7/XJKb r*!%"ri63]8~_ދ#Sd16N\ sd r8˕bҼIAR ^ [H:SŰ@ yӋ"F4w m;} @U78c9rbE&.*ىt=Xeggト0!EnK Yٝ~a-ٯ;^UQT!5 HQrFг4m=fdYl,#yiHlhOM䏂֭Xz @zcII0Q#C$d/po^}Nzxf}5N) GlCx޳ḠJ/;H̟ľm&A+_͐ϫ(τh<6Y`AjMoڑdKN#\g(MH(P:3+ͧ38j;ᕀG MHOc6e/' SWՉdL[]KBJq,i~d{hKu>2 $"aD 'Fd"-{.+\zpUU>m$6x'5ᩮ]W.Pqf`$##$ EU̓O}FJ2ӵ>RfO)#0s\1K+ӰLM3edW)X2uH)mho2HfYRK\D92}xH;ss,{I-O>TEdE'uP@:oIRb"_vb  &Y-JRGs!o=իEH|KB6moť3}2{u0wf s ߻uU0RjPiߜB%,Xe~\UʭӍo.}D)*)~} \;Q3e,*DA[B!KI/ꡮm(w7 ?yzm})Q]*#Ogp8M;me^Oy}SخN{:"DF> >iv7yd;GgxN3Ιjų:' X1:QLlo#Ka11Y& 9)s^ h)خ9LaG}:kn'_^*)}T!H\T}2ύgٵT>Y$'f_7xiXG0JU%kCKѺ:⮩@.!GzٻmpAe8g\Ȭ~jYb%C~^vytm݃wbpxeR5Z yS*yeIlɦv4 B!~|n<w=Og~ ze^v7Xsɥ\5')C=~~ӷx&%"\[kY?~-_x,ơ{m?eW3P?}a?[7uH(0 sPM[QA5s\RŎA4cJeь$CԜu6.V<42!1 uEU.r|1l&|JoDm:M UF4oz6[U;=:NkB`56糧`D}:e&.-X`eq1B. K.A}Kp4V `$]sYu?C#̝̑!}z~),Ķja{2I]+@>u~?F:u'i*Ϊ`as8xdÓe,Y0[dTLԇ<]u*]oɪ3`k",Yg6vk& g>q [z}a.Xly:R>ڼ~IӦq?;/fg# {n߿yŅW0ȳ<6yu.%؜Ι~ƳoSY᳋9IJD 2Jg`ȎAPfo+2bۉHHrZԸ< c%3EE8VPdQz_/R"^F4'Ρ#<ʞ!v9BHDnme9j`= X~u1S *[Z WQTn*GGmOO!c?D׃B(V Ũo?MӉDcD# ZaAtRF6 Jq$㉀B#?*-=gc<Gx$={|E f# IM͔[ ' <&"uBY]I/LO{;k.}' F ymHToVnWN^w.os2y$P7i}cܴ}֖?F4};7pʹnog;E0dn;BہLRY]7};;i |ӉwoȁEcxD!NyL}ӄH;?C"%̯|M^x}F5[]C'1mmK){Rٴ߬9I}GKӃ  zRw|"OI/J-m+U߉Xf#;%aZz10#M1$A!J:1 D5I,#R C/F@/|bwkl18qjظm?a.eP› `'n@"y=*?mG4=$}!v_w]grCPOa0]# 4Ty%kkYr%-X3xee.O{=^~kdتjkYr?tq޻3̀!TU[CK$hٹ#Gn&]mm=egtNtK2oRO}(C+*6Xۙjār ҙ1eј=V}nkg7}!mŁˬ<%Sl `iu~"(;tS MF)N"OYtllc+ O=( ߫B$|"mlDd.0r]֗HH"DKW4J7=Ç,}XS?G{SOeŊ_>3B!.r?xTutӪҧ%?iӦqWrW=-BkkkAiA=ƲIx] gCxh}As/3OGQEo:<ϡ(ºsᄇ_͢Q@q{^snod 2 Tz*#7il¦}=D\.y$5KgKjͻt'wP 6F+ƳY~kW.<˰$X;}Vc.ˮCKXCiF!>QגtGDSGfe!8Kmx=TT(B`Vu"cTVTku5(Y|v݅Z99#]$|n\r:CFC3n~H*X5-)шĝAS';Ow>"Uuu!=vm+V+?,->ίz]^-1<8?yvʺpTճ*r !o}_F"CdƨDp^ 9![YCFpqPVɉY i8UfC؃b'odV!XD"Ϣ`Ȋ+[Zm/lV6icd#FM]TA#N;މK Ц9?٧EL-Eד=a*c`HWeH´p HV$%u/b`/M_[YX8NeEt%)ۭo,2?Q,`%کhd{ 1!*Ev~hUHtX>şPno2|2mr({!Y!R)%`Ҵf -I" PUILD SYFuׅY|bw{h 5j5@s nU9mLMlm?btO5@&fgzwPSs? ?xbx5ꛚx1<Ҳ3xDgdw>y$n񿿺+#3xSߦ%SU&tcCNsX//{YR9%ꍷNe{8QV\#&+Y8\fBvCan,/ׂ;σ,# (dh -W-U5% kēI~u31h77x:~\y\p \|`]<@c먽"TJu}Ѓ <|gon:h@ +cpģ1wU iSAHT_t ,f3/pn] (E '( F2I"{y#PRGU]8&0#Ó'9TX5WtiJC˥"`(39ll8,.Ri%J8`iz 9"RRu~i>"# b P]^!xϻq{=rе$ ڭz`Fd^o>cˑK|U2AХ 5|~˦xb|n^Ѫp:s)vuݬ^6K.+tf~k?/_򃜜}?Hg'Hpݜs;9iڢ(/\᫸3;8av⤵kjk=^GOG( \ΌVx4vd/q߄'}C%?٫4(*<<,wc5/P&0ˑWdvϬrZ4}.+UY?Jx68L(+.Q]DZA'G÷yCFnFUB{BzPzOcc#k֬n馌!. !CC=x<5$z:~b]4]aT_GC BHX!>P@Hᩩa/}[oDOfA(9asrR C喟O}O~Dkk@Af@G"I`k?H׃0B!P\.t@ "I0Ǔc ɾ\jR=ه4$|s *BypY$(d^vt WG,V HިY*,-Xj|+H-%\Cp [(}>M=qVڲ?Ҳo|%OEQ4k/9^~@4nCێuFYLž۔1Mu TBRӐFdU./HoU5Fo@/s9?RBAJ&Q}h`͉zq_<3}Za0}T<7M`O_fԓlSOJ<{m^͟>,v>pO_HETJE>dzqQCaf^qKPv+3ZRI>WQƝwމaP9gTfU P%y7wawpw??,߅4ie?Do ~%#%z"A?oP?ѝ;-e !x źsu:aSe'\G)pE(k8#;(N=ڏS0ye~i?nEGo3dHAcKy~C=IP,FFVV HׇD b۷clJ= D"65ٸà(b#kWRH #>ZPCUҐTiżOEfSGZ?`SV{Q ;Yy%{]h+e]b+y1+g$EPI%&.,cuVS“, m,5X{_5^!b-sj6)GUΚ3I3 ׬\Ÿv37+W].k/S_XBG^|x&5#{pO]Mﻊ;EߤI`%P2w_i.o_7DEѓ [IkYx>_=_tٜFQ@njJeYO,4B%2SXŁ]` g屹8F.1Z40.=[K,U$e-l絮R(Ysr:đ#)qˀۃ44PC* KXTGRVVT49132%n#§IE U Ã$zzut^OUMjC{\&O0mlTUUŏc֭[G,E"8Tc­P`q=dNn[AN:k OSqvC];vr1ɥ g"o@h"hmb"˲ <1mjDȟvK%= k%s'p1]?p H9}~,`HX&fdNNVcüoΡE[Ȓ{qmIU^kW"e$e83!\ϬE|h EhnDI~*a8,c) IDATfNsp p-Cq.φyD,N0\{*cI6wD4-nLmg*kVͣ2B y _9HRlL[KY!W5vt(LSq#*xZ9CcV6F}a3*Ub&6rA9RO`ӡҕ1,/d;~iqn_KU~))ͥl»x>P&rEJr)2˄:˛yl!Μ:v&昙28?Id#mq+n ^uBNsDm3Jp'req7ӧWѓ.kuu-g?;N&CLI&,G sk>|i _2:5IN=˶,2c:ClMo"@# JezM9Z3| iQY QEHlZRcx<6Py@TwԄHgO?ذDU̚E0$d00t.6=Wh<S1O{xY6o9[j] }\|e# <ǹxlC c -Bu'U^6Pj)yLPxZQ>4Ď+)2)Tp!sR(>s3Nŭ PBґ.QIvr }•:&7E<ΘȆ[u<jD)( ^9Keːq)ůR dxvZ}2C:d{0m 3׈EQ|qzR 6bLoQ js_aX82,29Aѡܴ|ljI/;͗\0vDur0{=Z뵓`]V?Va1 ;T(A14<@JAaY5_m+*h2_ xRH 1w QCø=YN=$Tt ,Z )Ze?%$cܡJ0IMO9*XP"vO O2Y\股ٳ ܹџ%`ŜyM>=yCRDVB1I+UW_^s#z mwDa@ qJC7h€xXD2u4@$`~]~JČbey7oXEc tY&ˣ(*>^ cOU4Ş (OZBCb"}*>IjϠq4X$BOGy Tō塯n:q_UIL0AvGFeix |D"TJ!XaܪYz!;iKPF7 28a\p~ٝꏂo#ẘ*A7D uHe++{lߡ% ie~!K>–OHdkUWfӗ6]KbDF A?0R~U򝵧r(v,R"u?5i1GbCV7ա038sV +PjN;k>RS"Z,m$5R>d<8 $EΊe GMG>ITVOIO)a~O2Gѥi0T _*YiZ?ԼP>|Ga"?b^ gHi~(ttMkaZt24#OPL2t@w7'ªǶ&4 ~ŅEWt̯m7J]xnp-3++6keR=BS!Ssޛ.|RavJՇev Cxf"LR,  qU #'q߯1NY6!1ƜR8"gUxț]84 e#;.KeB"Md1浊]g.`el$&|o7a?wK{g(̯}1 $<۹uGͨUD:VL$a0{u Cg0A#&ؼIxU_{МEDvo3$KQ.tKͼd2qZErdOE儖9**<7h*1Mйl/k`!ɜ|Y;s!&l]_9HKz^1 Tz{FKnFj=#5$R*\>*BLե"$srug"Ti݆D5T)H(:5Tj›0k:~cU~e8;:HM$D EMV??@u àu>tڼ94Oֲg|{o}PVٱu?̩Sond'&{4O"S0Tn9,bO.-Vk+&T*S04c֘;*LإL{])|(= Bj,= )1F")Oo7\zż1)5#CT5֎cc=_3퓟=]@Jp{x OPx9.#=߳if;?h9|EB ;x=j*:}EǃJ !BMBKf{/ZY+TA0ަ&]GTCi1A'45s7%~!n.0s⟴܄lNeZZ8]lc&vb˅j!K!f7I*J[ zؾnd~?ёIMzIƢB r 6v0,䰇A`@Z?Om `Ir4TxS Qjt !?źؐ)@(H`(M7}:ZӹϾy^z1Ə_K}.y%FBpKVȡ}yVw쟸[d߶mTO~sruse8Syzu>̫N?冯 h >_-_EJY9ՙƵpVYi?g|E"Cd4M'$NdY˱ (Ga4MZ'p)qGOa3ddG!*t"8+cq/% 1(c.3$:8f|zKY] SzכCx[!h!BUO}w嫜|ʩ6p77+ۍoqhmx"a$H \Cd`F=y2nZyt}3l9rT3e*(Ҡt,4Vo0grr3dɗ}RI?+Ba&{cm`:&̍Ryj3!׍#A7Zn=}ģ1Z 2Má-uSvLp }t0Ӆ4$CsA3t.__L+PT854 ^z qw,޽u9i\u5>TrO|ݺ)%}==o`HYy3> Ku Dx_\yg E/ ?x ;+I9.ҁ's_):zQ*vM]MkgUbvait`pe,8FHPq>2Qv@/#(fIX<2MH/Kxk/Q}i)"vZM0fDEpҥkDžn8a !eY3)!C-N IxI_0 x1C[7 كO!A$5 l>EѵE(Ҕpy?ETzքc}d>Y(;*`d4roy v{ $f2?!_@^gQj ʙF]q@THv!0/cuFIcMpښ*y2U>bÕTaTCèT#5ׇg+@ "QflZ=n-/FE_t#I''$A^=CBPĴ O0yT}ceN.xnf̛g禍IS'8kWN^CChB{$)8 Fo EǛ{x3NT:|\zlٲMJ兖E`!*|Ux&7D3uh#?T\J2(dRiI[h:Ys:%>/XrIATɞkOC X://,gj3JK.  Mg/0we1d3^ˊDd JB᠏Ӛ̈in1&VDQw9H$H.BH~@<` @HtF"AckjQ죻.LdCb$#2@d~=ʹtDDq140@eu5ёarm9{l~/w 2غa=g\p!O䪫/9&zsCi휸fmγ? }ׯx1a[Ǯi ?{goWUZw{y" !@ DQ[qhk־mՊuBK8I @B ̹fm^yuQr5U  Hh^U= K.Ɛҟ ?^&J<+f=>XQcΟoA?3f*#Mnݥ' QD.̱ BTQ$tiM#͘w9J &1Mjr!5bi+$''9s3#ȚA6,'tFSd CWL )e䔥7VrqG@TIī.<KA36?ήݻmh`׶mEhx`펥kjmM&?>OU@(:0sgzp?C4; Vj*ǁfi'_CX*RE o`GYC/XT=T @ ǧ-Rc"OAA fyP`J H!Ȥ)d`8C]Ĺ6(Xl:C5'͙˂BFEؼshs 0 ) sp_IݩXzuuuH-B7Q0mdWTe h!آtm }|ād&rvw#"wԜ ^6%ILz-#MTV6s:wڄ$N"]vbѲNCA6OsA#l+ y`2Frd8suJ :tOH B24f6/BeDFV' -VM#:̸0nL UI!d"ë}uF IuK=>)[,|Cc(@*g\x_^r|O}Dc1V[Ǟ;K.?-͞wk6~ǻ|?MھV#6u˖@:{˄>^is$ܤRLW^ 5V= $QY_Bm\ e){`pߤ`K}?a8 _P:N1#s{JP'C@ )\ t-cds 9.B>&>b$!͠,G_~xEcc#o9,z &$$ jb8spQK=8|0!s_E !$ $!ƞjdu2@ԢEb adv&QuH #Mq 0Y) @'$4X4(7{^Up`-Hy9*Rs|1HT~jt}?I"Uv'I0x⥣lXQd|^g) 2 `, Ba&vlcѤ49eR;LoӾD/Bh("$W)jEh{:iUtI }MM8eټuK7業Pfk՝/?{Rjڵs!Y w%dHjםZM\yc(X7/.(WJ)FF8'59a5KRWdX۹#Qn=Zu 2F lP2E6Hg04j:T!Bf*^8.RU$ "aD}5`HPx(($@BP ; ߚ.!`=~3-JSQCڌy|CRW:0 *f:G{t `(OaiZz'{tU MB&%+[ MאX+O`* IDATY]XT7EINO3uYyô)"ziH*b r"#$''IUF'.coGfI'ڻOF{{x?C^wvL-?o&'yne|&|/??z~KE o,d{v=2~䗌 qݟC(Cu oodK!p; ʤ6P~¶Y,JsJa=-,30TvP@O(E2XHe {!Ra`K(Q䒑w-ۉ+ᶦSwl4B's}9 IƷo#޹tNeK$c=iBD,\z٥?3(š;zP 00$c :F4AJ K b{גDHe]wF6 F:W?M&v>0k:uQ-3(is ]$Iw DU. H MH ,^M9^n[(ylyi'K *舷qod)S },+Sժ[)}}o!<>P)׀((ʳ{{G\0';}#hB󾎹=  h$ٰq CDM5O`to:|Y(tL\E )EabLMR"TjG٥ ?2@09>Ax]I"Wo5}Smb_u˯\kmv<o;L|ݵުѮntdP oe }<V?|sC~EpX,J|2_y5m^A,2b5LC@$"kOdZ IfRLڇx98~)lx,B<"SN۔XkTdT*M#yP0)m.oU.$P*1͐(<0dIX.@fT-B`ȩ݀NY׉C^xֳٔ?6[^zg\\vo4~_%X 0UDcT^k 32-1NG b}"Ab'h%(!)06ep^ـZHiHRd2jkkgd*t2c() i'CQVZŭ ?ϻRs;8z{2A]$h2BQןsϙ[ٴ)B@Ѣ!Fhp&cO>J1rc] A d(Bf: HtW{@˗0<6B*gM&YЄZ!Tbė"tXSDǹufry~,E |a-Lg@M;UwO@hڪ0/a:, VSXQcpjF %Ci8L =DQP15J3̓2c],2RU@6B hÄ &7$ KynQF,lkd~czGg0/>+VOmw^vgu&O@ɞݻ'; :묂:88M7D&k1{??H| _`r- n:/HJI;_\q}uo.XD P@\Sѱ@WZLssvvP#0Sp12%+2j9EK}n[.Ai\4*%M_͊ 5W: ic*Uf:Ε2~)IY pO3|}"O*w|¢CGn]z6}06f#n>97#!6ep/#}#<$ҫ=ej$i]\$9i|%E.zD$O;qz4sNaxSj4M;\WE$2e*49Qlz M5+A~z>[5bsٯ*?p\x+3SO`)hn]CA^}lIk H `Æ tuuىO<ܮ AMu]{{xՙ$Sϼ@A-"9>,$c IdĬ\l떟TW7KomdMk#gEBrxQ AG=9V`h3FB0`[>!:g ܣtYiAhwK2 O -awl2a{In|UsxO@9o<ͥŚIQ/4#\IfBZЅBEXCHeפ|eQ,壄b5d 08wuW c=|oGQFH&_߿~ٌnFロۖ]wU5ȟ#R]a$NͿ sg/^O~y!~yffyS#?xԆxÉk@R#\[XV@HMNVՠŢh8H-L_*v:|2aK,[Hj6|iW))qQ,PXkS=G6v:A{h0Yᙗl+˯\wrG֋JͱB25+xY1::9y'ͲS8wu4Y ) IUQ>A jl`RhbL(b|py$Jzl0'e:c߱T\atB:ܬn `|73Y \zJҳVtF2-՜N}R[X- C391KZc r,Vt0j9{^u"8}<`^U?I 02T&tw YƢjM!$TGü56^.ߙ0A)Ej׬AjosR(݃҈ v M녴^iS͋GюN-?G *ʫ7CxUUUkg%Զ'}׷z -ԟ ancuT&2:zɌ 'fd˧R$R}v9}JI_*D4'xbn*03UZwb8Y H]QLZn_A;HkN&$KBA-ht\"7L뮮.zs*гYzvkz9Nja\WE䇿Ni+`S ]'\T#h]T u0: ^!TU\'_a*yktbZ&%u #QUM,Uz j+ͭ0+YASiN\ƚ4g`my=%R+jA,V RƝGE˚ZYyhu}SU (YzᥬXA{1_q_70MB Ԉk#[@5W\j8ĺv*˃򳽇Kc]KK "۹|T^@fxoHM %靜">H2L0'&HOLGڕנeoҴv4%K 9R0c;#QZ4 DhRH#E!ӓ=x\!AD޻۽;H*& Ӿeg-_I*5E `ImK>VzQz(sKQo% ȗ]εN7Xd gDNd}f-2004^x!/2Dub(#Sl~%NZ> is)6F'ij# ̋IHNeSI⣃jS :&չs8PBqgny ӖppZ6J&M r2ERr40g=^T2RR}u+TTsrߐOI':{ZͿ*e4˂[>Xz\Bd]+Kb{4=;"yC}Kkkx᧨.w9<"e.$Ph<{vX%Z&s剃Ǹgazc|[[1BJ g@)s/b_[Y;)%guT;vh"Ɏd2$b]|YXCzA!sRB 4m<{G}|?Ż}%jkEznLM󮽖p|LJliTFG``:J(CD:yǜyRdF ֑w-Bv$]J2?R:ZV禮zμDJ$VyOca`3?? gr3cn *|u+ͮln{ l_U+T"IxL:ڥI%SB,hgv10,Xx>]\9$99_O'l6 y 9U<ŖRJ42P%JtWձ$ᥠ;+1t TRS a-Nq2<ǀSr y[JicĮ(RdlITQX@UeXX>!!RX:]0-} n|ə 9D(YP>:q{Ld7!Xdg1/r.(/yHS+z&N57_Ã~q۶c820& s!dHtS ]]4}>×^e˂fY: J 8Z,02!B!yB9DI}b"[KEOL]ˢPtl p1/ֱ frrvlꫯ;NQ(Hi ]Dw qx_n{ =ůE9E=,ȭҤ~ l|ʒﳟ0PkUो wcR9_(a@Mjشyjf9{vrI(۔2(t6ULs{3!> {k{*jSV{#X`.KySE!ݡSN5\uB;r ]%` GQRPqtl Uhg ;m;hsVG;-_̹ ;i!wE72Fˊ+I4.~.PꪫxΝ;w͛(7xc 9Wa(oIktVM#fz^+V2w*XŊ7_?_ρQ)f 5(f12Y5)]7@78W\MB(jB)0婩j:Q:D"K+9xͷ̛&w)g6t \Bȯc-7V2 lp3 esgOqc3oZpJg宧(ݣnȻ[*T)c@\dd 28Vg $kRF_sC90G>rg 3Og& JakɃ,~ʾmA i]ǺR_a/W1C1l@;kf9->6ց[T J$v IDAT%ؼ6TI|#wH"n.H(" 1>;_dzn!96J6*$g)fw|B0岯!I&֟_ל|[ߢ>91/ Ä#\1;zJ[+.!s<9f'C_w9aeMWxf]Am{p3,2̬q3!r3Q[_"uY-,= A9x/@ &)+ h<,nI˺`+^I|!:M62SR%֩5*?|* f18BQ VWOr/ ǜaj V9a#\:ԟ}.ӻwgyJ)X|9###(en7owy'5553-i0X,%\R)vͽ;路00Q8CtI' ia0u(SRwD bD o/wD4)l JJ( uD"hړJݨ ex:TV C6d9`Y3JʐMO^&V%x{?=cٲetMLOO.j5!xYfIeR?tkI64 ײc-~{.bq 7bŊcN;O?0f\qmoСC`7 K}"3YlV\pco7_KVזd} $KlIiM $$?GSK5=cG`$z{]+"+u]o~nvl?̏c^~ev 0Z+WzjJqv o{[mhHtgd9iIzƣ#<#;i~# H3~_jsvũ4 7e@ڥ^V-:{0r`)?E>喯BW)h=3㒛)=!vG0d>䌳x)"QmQ%(؋v3gAf|= ϼKhW7,OxSO=)h! =[\ve|+_A)U8krA>O|ìYuֱlٲ )HVz``~8pHRrWRzO?R)MW\f+/o|N9,OR$bK:HtTtrȝpHR ,u bɑ3> 6p=0<<̂ >Fgg'qQ9d)%555μyD"!H|{ .K.!2NNa*;lgu[5!xᦈj+U3yζ5űY=yvCF"W0La\*ɳrw d3ͅ2dEez(A+[&I>xK2 AB5mur6`n Qˬ =8Ygroh0dky>ЂPV~~%q/E;#!o(/Bi,2E4p/ Pc UM-, ,X@GG%t .5kְk׮-rׯ&k׮%H3_H$YgŪUFEʾR;wݻ׶nڵlذ s0NK;O7C_79_~DrBT3b;[>Bu>ȇ9r?38sXdXC};O<Рr3 4d(b$P@X~z+ZsH 6|*:Rt xQ'/R([6l-fӅRSSٶ+L4=B^k@9 CVIRXV-` mj.6WiS /Oۗp`z0FoWgO.!ma]ݭ PV\SZY1GUN Hf`Ђ2U5I a*^H5ZC jd.@B. ! %OyL 9;^رcw}<ӤR)yyy9L={4UVqr5װvZ*4McݺudG41y 65GRo/}_{~ sb[Fg\LMU'nzn*# Ezx#A ̰_(!"6:DJ(52 YAn9R#$R3~%@J*B!_< l?0ճ>4>>PH${{P(&w\kt9p P's=!Τ,Po|_A*(P~--[BAiܦ'=Pd:!!?}9Y,mq ;yN?v*z>çe!28K0Jɫ]\n|^`2 wCP4Ha2D;2 I L%<_`ҥBDpͿ˗{2'H)f`w]H)Yd 9vO<[ne۶mˌ B,]N;3< .u!4HO~hƱcǨG$`S7h-y|ٲ|_+{Pe u_{v;xŴocl" L&mǺB6NGm5G]p!/)M`a,zXznY- x)s[ZSA kAWÙqu*q e"WٯYG[3rPAU%2ɸD@wPZ!s x+*[+ɵf*>MW'`gRA[._@RE zyf ts~Q-D0)Sy΁*mҍL^i9dIdK+?J" HP[[˹˒%KBpAyGuuؑ, kpЃ47'*I9'yگP5UF)B+DSB&xR=XwJϒ$ EBvb-dOf'%Cԟ|2/$k٦ "'y>X7MR!"qU6\eo 8y-OcvrPY$]vRDnkoBlw[Y27H?c)\+xY7%X=nd5#t! BBD+$vCb|J QD4ԢDQH8V/^l;JE"9%Q /f֭NwwwWJO?͵^RaӦM\wuF Î[?vvx[fQJ݃@W0APlN ETX'e%/0 ]<:N ޸U֔6wEoS ЮHA(BϠDb`G?DTz!mPF*$Sfd5d%X#ԾJ aF*tǟ~Ӆ ?8Ls71 T2c͵o?3ΘUPi_m H;JzcL!<+a{kݦlxTPLj}NRv*(5nlۆ`چfg0Gq /a๵M@$_`S9DA$)q40TE9ԓ"Zi]E:'c/esRCwt2tȢOxY؜I{ 3;S9y34i_2P"W`KU-]S?L̺YjAhΥb=GLc1{@]Ba PvdթB`  ֣tU:苆 yLlI)[8YzuFyyeiYA7ˉbrjkk嗿%?hhh`ppl0qF"k֬AJC=DOO555": jcBRq#uHԐXH{yP&ʥ= =eH]=/dBͩC!܁:Q($S҇Hwu*,iĎ:zVY_HyG%mƲErsF^'I)ٹs'f*ރ^Jz7yޕ2d*8 :ǸmN` -,S j8T*#]}T'BԈuwiLvc#M}Blz:BO#XT*8\:>!fAIB(AQ ~TT.QIH!h{ԕ 8-(j*O ӕ@[PY h S-`¼Kx3iR\'G,XIi"9Np˂f_LF7-1K7)ƫ\rҙY)}4: .r"#^M*_9`H}c`(_2Cl8]Pg2EH=ɒz>t1QM#%%h+/~V>ObWTFFFգ܎g"ckPX|>{-Բe˨;3gԩtvvR__oZl:v^@ 75kDjI:iha:vuQp1I#5r׾)R_ߤ<:<,д$VZO}[KT]zZ!tF]3F~%]`w1SQlUUT<͉*(P$U 'JfކDAM8hwI9N;FCCCcѵDjMx,jUI##aL$J󖥱ec ]yffˢok-Hfᕙ*g40uɯTV+~edx7ODH}*mXYY64Bgˡݝ|լ 2A$Ip A | u58a$$zU(nz .~#>,>(FTWWQhjjBuzzzxljs9؝NΛ;=\1 syuچF@J<+_2 $Hp_OHI]GS6<`S@1 #ĶCRZȣ2v 1taKH@"NX g]zh=&Es Rƕ#S9m*QʑCSsEjM`{)%r)ٌ L-s0\eؔl2[X)E ,Y.rWvO?gil\ke~}@4 ]$Q O +Tgډ:o LT?neWic +/^Eh_gg( Yj6M'tK'.d21fMq`Wcm?@D`s aޮ^D$I` `0C,+O <7xӌ$*6嘲b,DpErwm wcz3P[N7Ar-˝Vw0+oΏV x+sx ᰣgLH`ݤ98@~aO:7He9&PL" +;y3qQl`|K79ivS>2;* ƚxߎM Ym+/oNj #Dм|qWR fvY+X52Nh*&Rm3W87Hd"PHl,@$ Xq:As - 3g/Vb@ κz*EruIxgGP;q}F5t-ӧM-޶)Phg?QJs7p2jxjCK0ޞ4$.J$g$nņK`${goSW7E tbV-^GLߡ%wq9hDzU@U(EH@ &.6Eb- `W&I@E  ܇5U$j'/J:O6mǷ;I… p-pgrˋ5m۶`0HSSSX,F,Vh|-I&sqmQM|3Vڔ;er -15ZT"}^Q$!K!q;3Cq3ʼnq4>0%n|'=CT.nE}wםɞ%_0næژ5;iiТkcnzo/66owW.;6 Ɠ{&KW#zKNHe:!0b)K/9c2hfgo0_1=jd-g'SgH9eX.@&CӁӐmhST@®ʋ-HLTHoϥOBMCK&>thO7I\Ӧc[T@&Et#r⮟R]C 9+T$[[YBFݵCP}~xh(]OM$t)n# H I4Qa#q(xR.2C6}Ϊ8;=ƙ]d^&)%"C"0<rRJW@vԻg\_LLSqqzhR(DjhbÿT9OT:vBխO?ͪO; q(*M //ЁPS8|[)ףWf+VJQL^Wd;Z2$[c1mʠ׬mrM>.wӯ5|hTe|vZ~[˂+y'1phJIMWa` KVLbIs8u%Ol9nt30azzGp]4Nobm!Gt/_ɖg6rbaY\M,SY f8@ɽL?#~a :q+h4e@]-߹n^,ӕrKo1y-M^\"9:{۟5Y/V X3Ir,6+w?_9e&L' E1'壣55fJt+Keҏ9ϳrGFZ67UL QbM=Ư>+8?(]|lY<3'C8,: EO5vpVU3tp3KtX7v!(uݏ?WkrvbA[N@*6xQbHՆ=> F6xFeK:᷷;q56]U'ddv6>EPWp6$6aC0> 1MQR5%sFlHV&Zk'*`:b+ Cc.G(۸[.H'L{^q8Q*+IDDQlvlCHɟ%48a|pwvLpt:`Ŋ<|k_cݺu|_M|bހD"an[{L'ؼ$ҐX:dj"A9'5MXi"q~EPY3UxL=TEwˠ}@dJYVlDTTΥKM`+# &y`:d#qG`)z{@'O_fh$ʾ q;uܖ&#:sDy[<}!]<6M+2KCav7Of?^E﮽' .^E]yuWE?xsvT1֭+!c[>̲O9~~.7:?731pWv:,j1yA~sm3$≜56qג? ZdBW[̠J-Ԋ;*DۋyR=Zbr;]N?e[Z!ߣcΤKx1[rzMX2AF4/8AHD cSI ]ohcHvtg."fwDOEJӆ",Nfz$lKFRU_g|u DR#>8@!"]h}ȤH/bĻ|%SN%r(H#W U"[;V8Gpb"kqao0B$)K񥎞zoCTt PﭤctzoC": VcSC)_20&ZFhvnEEhR`OEUP|U #!tt܍i̍3q^zUVގi|_odxx&5kjMRJvx̴Yuu5D" iBkdٽ&ff3U[Ypz)3odSȁSe幨,ny ^-Q8&5T&4w6I^7Lv=7w&4:BKs#}!~.j9]sw$tIFЕOBg" aSӰx3M&pֲY~Es ջxp @kja7Q[VUm{SrG>—Cы l@z{Kյ4D£a{ËO>Iԩ os_#ׄ"J9 Cg/x\٬|fz9G#|`r]sRʓ>FqFl(v;͆p8g a!Te̳ z2Ib(DlG `Hln' u#8ƛ>&>y 3{l7oK.dttN:p8LEEWfɒ%zgEAӴcUVVR__OOOτ-pm(x`j+j䗙~RL̜>92PN51}QgVZbܫ{}@CYdE%D:}hKsp9h:F>uj p$Jx$]OБV:&\ETz}D"a}(zQf:,䊕3џ݉4Pl2S>xsg"uINSŎ8#qcOuF<, Ģ.zMc79sPT7s筷02< H枴_kld3gIg?aM'x?'g>_>0 O>ν?Ȩr>3Ő+Ӧq͗D󜹨͛-cdx[o`$H)YwǸK.v4k%m/R'ob y7>8G[_ qh˦M IDAT'?{;|?u'9`naA V\^ 8EDAh$iN W&o20U3qHnbY#2IZxe%(N4U0/\*Tp&c9m5-0< p]siRl*6S@hTNJxD " !LxI2l">. (DHw/H$R2(a!M1y.3)%ovt 8cT,XP^G8bXTm۶wYֿ&逜qd=Y;wr͏*f[yЏcheȤ)J{Ď*~Q$!jƄ`Sq̫w=!|/O^σ=OiA4@Q uM]dIK26b~7Cno^ejoJW%]f5W9ʼnĒ̟RE]"A,Y^X\D<Α{EĢ_ꆧYyY\z]K?~~U U&4S[=JۑìJ/[Ndt'x?G()WBC{FE"<_OꬳxuΚI]0FF/?'}6 9px_a'i:}:y䯴>W^Bf`py"`ȂRnv޲es4LY_. VL-2 T~^ i dJxIlrWlɣR lKCJT~%ſK(*o-{HhSG-71Y8T_Hd.uѤ1dW7Zh^ByHB5O+Jb5#(Rd,BF[HIN(iĤ l|[ꌠ gBZe+8:ZY> JJx s"3f\/Y؟|R5cKk;w]SOrR#4Tt4BPWW'?I֭[5n_o[J/^<^GuȐ?f鍢 `(?u┻e\qKUf*b^.O7}Q{avU8Lۡ;G73Z3 Gi0Ƨ2f͑R8.ΔiS9`*j ovU9dO`*r|,Q O8α i.]rٹQUSfh5ҩ{Xwκ"κ" b1oFE:WI`rf-\O~Ogw{k[wʹv{oUWqEsEg鷿e1eTg7}+W~ WEN񽝝c._=>v[ラ-x*+ϋƞGeḤs[fcrjY,[2k7[ճʞx`6--xuJd7M!99dY*1PI3s@p rJrC()EYQJ)&2,F_ֹrd-ȦZ'AҟLɤdJ]b%S!hJJ8dZO5ͻ ldlS$O!!ZxH$®^aMHӎSuP_Yf'G(cjp- 16afH]hR-;ViVQYS[Z|(=e.\s g4WO}l7ߤdYip(ﮝ;{H)D"^dXxwXh26߈w,E)0d!1=ƹ4Y;EE-Yld]zq(!Jaƒ:dj$H{-ٺ~fNLk`jk)d6NFvZ;ٷkUP;u d͒fNg}cWsӘۧ^/0<؇pŚT{ݬ $j8 cr7p:+1]X}ιx~~? 8~CY"%ڲg+8NzeRqU瞇#ۍZtvZE^-{wOJ^ZuSW\ɣ˩~ۿ56=<_ߟdpzy6˵8m:>yMk_[?V4y8oI}r:X@xd2Mq?ID8\!cңcŻaeB1[Rb@H^'Vy)Hh;TYIkJ#{G5*TDԘ+dyJ*ע}#P5D4喯S$3R u dPD(Drh9:wbE}-ѤNɱ!u6Fbq<6h2 l@e*\nvU(Jp9%Y^W.p1!EaD"A" H$H&hi9(l6v;ә =p82R~>Ow^~_FRg?1~(J$<=zիWOOJ[[z+%']]ӦM&STBf&W )b1a_k=gye +z3C2'SqʯhRT΀Хj*S.£qqPmN>$߿ȑ^@t bIFFF@4TE]#tbzc=v\.vY! TX\gVuu>N=¦ L}] Os5rѧG`"E>e,FClXKN/6C/?\{_} ,WϜq~ZP^v~!@h[Η]w=6u>KU9:{&Ak?Phڕ=q2jձ gFBE*mϑ,h,2G{iDЬcXP8V =w,(iIys=F` UU}~g$ѐ%z4id0aA!!Ch#!##h"%(E(- : &N'-T,Xwu8PR Boo{`C"$:6q0E_$BbS$IM@$4DQ$sƴ{HNÁP]]Muu5@׋`ppҥKinn'vFEE[۷ssW|)۷oga͚59[appI'"b $Ye2odnZ2/YAVyV-a~B:Pg/ӦвGq+we]w.\{YS9ҏ+&>~o+o,n5ʰ4J Su|we]σO=>zVd1$FKyg {'X~ie,N埞7雉5po,i D9'u6p_=ڎ%P[[h\Y) +kXRL"WXN% Qf`qAPt*)9+2BF17_!Ga*LdiVmԜv6(P2QۆPThj2P2A"qQI 9AO$P=7[ˈ%-C8H&nDǼ`̬r>/C%ɔ )hJ=RB(k4< nJ$dJJzigpteD[װ74xx<>֧YuΫ(JsEAcc#ǎkAQt]^Zl6^z b1~7|7IP[[KA !X|9?paV6#O)XZRza>OƎD5gjQ̳0H󉌎uIz1$k Gi@]9t)B(=ɈP#aʬ6d"ˮ9QF8hC[ZFaL <˼𻿐:ܳW7Q£T'?Ow0u͝ag/)>zUk6چ [yU F6>r!+N?ޮ.{z򔕙tW}zF|B0ez- M2_w2i[V-fXN̞_B {7׃{, dCe!0M4N/\ВTyuq44Jχ) 5NNwJB'{7D%P8hwEފ z~V#ZNa=r ~}=* g,c-gK]Z U{Gqh$>qz::8kx)aZ)8}YL 4Ȣ)&P^aeېJLxٙ$:)z%DjLe\CDe-f+J¸s1e1Y8P:] TnIB)r  È[8 ӋhYXd `/vZ6lW\(\}s=$IꪫxYbŻ)B 7ܐ ]%KO0y67uYh˜K+̟ <;ƍIRxꐙ4qJiʜqL9YAɗQz"ƻ&F",mEJI<'W,]8J7{eG :;p:H 6EoH?aA8\v2{v&[9+{sH4/ 'setE  V:\D:sϣ};s?&Z[v}ul|&2Eg>'-RV}Bʛx2W;Yٱ r s2XԷ [,%ִ(|%^&#`3WX 5h"m*¯2)qL2'ԤdGW7φCSJA=ɤ\.se$ c7A"Acc#?~[>~۰ AEeUj&QW[Gm] L4 x}DV|>lڴ7{nxHW[Me:6]phxe'Z[R$ubN:ёإJ PQ$(Bc!EaF]( +FT_O85#4.=\^ul‘#GD"]T!.7)ZZZ2 @ @WWH >r裏:mmm]{UVeb"(O _L:͛7f͚SN044T0C2 n42傢µ||+[?Ϧ*Ȣ|sMOY@Th-.EA~'f:{GV: GD3[jk16ND\CQAFq f1DKS=ͱGGqWX8ر[;sӓ 7pB>!+_ib4p8hhhkE꫔] IDATӃ."n֭[wBq8x-7#ASSSLdngʔ)"wwV\JV}k0T .9 Ą_AXTP6gxۮt"u24&y$UQh13е$d5Hml;[H,c'8{zX2{);8.2TJ_B_Os.!̜R!y *y#8.LW9 ҩot倡"heb C1wVtlUr1˛^X=nxsUX d9O3P2jX䠜 1IAɅL 37Ja^". R{ 6iɋ\ ?^G(22BWL"+sH<755L6TRrgΜE>3\UW~;B{/UUU\wu|f˖-<kvEadd$A-[ EQp:b]/KjQzٗ:J!3;42"[ƻ"" w9Б@ۭؐRa'#j'(DR0]A_Vv`v[3s$v^zW_}7ݝ+ _s5tMtvv޽{W&gARWBP0DtC :gHEHv~QbS$a$^B_HC'-?eE"pm"++͛A@E?"uNDYbK,ᣏ>bÆ D*… OXn]}.2:5lذxs=| #F .m۶q&]8;>cZ:i?8W\qŠZZZ.S>{D4s)CH1|MIANDK";miwyxf4СC " B@~?yS tJPTB((nS߱n?m{PZYMc|`X}hFO]Xv.J[{:%*t]cƽ|6*8kc4 .q-CVp^8 ^)-3A1Zd Yw]&6ATg+ 06aLP(WpJg4FHK,xd/SY_JQLĔjHt E4RU!C[od^/sxrrv؉?O66l=O?4s?wu\{~!gʕ#Z˸?1pGi+;9T* ɐ<<-M_7X'Jm0mN)1N̥337=PDdѸ;ϴTG(796B4pi:Pʡp8]H)сO9>-JiogzKڶ>R'"xM(Qtʡ4uRұOMY M\*tTLCt0 Yizn h^0e 5bɐ? nQ9.e@ډi8Cd)yk im^Y,!2f7퓱Q0q깒H$oeO,Bp~F֏%aT zOܢOO>1P}Ys=Ǿ}9I TBDЉ]FGplL(ZT]{q:>)Gys+HAEW D`W ]"ΰ"Z|T<(HFW0ODp?cɓ'3rHTU巿-oaϞ=Y|5RZZZXp!W_}5o3gr 7}v4MCA__%dҥ 6cd9r$刺?  :Ԁ9ֻRVxO (ό\ݑiQSi RL0 2ztJ۬s+@AڄK"")>;|bԥBw[;- 5 ;: MFƍN]IQ&3WE~E%,uB0}zjn.B}i% }!jJ Kݪc%0tP)ؘU@f e6dUf-~u??<4Lfv`yEl.U(t~s5:mfPц!$WY4>wen Z:&ˑDdʇybŏ)FɌX_$ Zv$wc=vIT9Rcuk'/mŠQ@ te{(r:)BUH8Fw/E(""b](`Sc#U+Xzoq) !Y^¯?mdD/ynFŸJP(Dtc]jtP 7Kw7QdbVb_$0g1ýl茭%NCKr40|0i$̙ìY>}:jZ:P pwYd MMM9ҰTUEqG3c n7sssCRJs;l6d 7L/),l1&  2e$yǹCCDݦj8tˏͮjQpD#I4VTB_K3GŚ}L?-[+u+Dz^GਬPq!'Du ;@־H)pEp;U[bPm=~2YY可ǟM.|4_͞F>y.ὗ_"'Y2GMS'Wヒ7PVY%] rOe4pvq$6~tUR棎? RnҺ ÀA!b{X]Lb@m;iptU 5Pt'ug=|{7ڻG$Q,):!c"RH6Ab3K]j "jîH@uldu[;[#* K&,!$JvNK@},jˊ)9PhRpĐ ַq c灄 *Тq: E€*Pt4 Kٱ F@ڢ"PS1Ʀz< ۴m۶ظq#SNeڴiL6SYY裏Lga޼yY( 38kײvZ.‚!l߾TK99UV%="<֪79VB2H!zbp?,3=?KRK" O|@&j!ǘuF Jw15Ak؝۵׋ذθt:ٽmN!iދf}{eu*"zL=b2 :ƍDt MU}\Jkz#Ş6_n"0lv;Q价oo~w^|!+Ũfowv;l`G;~/-pOU ^K2_vÍـHQꖟ؝А|߸iS~K0j!aIuKOPP<͆RΟMҧxh7T\~LK[A1F9ʬ@Q1{ Jgec-o< 6R^04(@Z# Th6Hz^WF1}9KalD|;zٶ==4 FuPӡRtRP)b<6LMbZMߝ<0ݽ#D3 PTvrRb):SG%ΗvzavzA<6HbP)BQyrRemކ&%Up}>FH[-bRe%A=ȲJ %s&KV) 455Ē%KҜ 6ӧ'-_Gy$y(B`~P^^|J G #Gdڵ30c fΜt|I(**J{a҂n'y?VcvSYSeG v4Yy%HGi'8:$!C_"iI2?5e4+ /4\nFqNii C4NiStX.AQbF\OϑviDZ iSMRtUQ(Ջo~/*bb%&ij*g&;q{<ÏB$aԄ8]n/_NE|qD$Jr|I3O7q5y>[>yWC EQU!^9b+OYUr-g VXU2 hF́bj`R\m f3RA22˛1W/# `-r $yE$[soͽ}lk=6]RGƶp:R;q q~(PБ؀JJ7=BAO*t 6J\* Xp#@Q5942ݽ>Jٳ:6! NB(ZѰiCjŰR/-.ÎD{زM1@9~[uV׿&Y ڷoO>$?sSUp xg5kSNaCoe&!ôm`HE"O8`l;TAP*򀨐a˴QձSu1zPt@j*eحID"#](y?0k?gWaDYH{U)ơo VUa5?}x*v"0J+y~m4XΉ| ]^~?.fP;; 43SzO  MiEE >δ wnJ[QE06Zn-yf4O,f&ɱ#m<^B4Y*9#fsˈ'#X{XR4~VںHqt5k Fe(&FlM'Ф"QXÆdv]c U9w~OAbM9Ϥtwvo %3ٸƌ7hE$-ʌ+)N*m_?ĐFݝ;Y[KsNIgЏ*iD(-ŵ|{7Hɫ i$P+u 3l(۱!cwyEPSwJ2 BU"z%(3ϤŢEbٔesI'o0m6JkٲeTTTdm+Dz36WˎPǜ"y4su`̐)1Љ#z|۰CYD&b)(;{{#!RPTO)RUХds&׋PءQ 1y+}}4=$ ҼΙcJPQ]C$}BAHꌚ>r/ ->ʋY() {}ݎ륽9.qȌ^yȣl߸26Zۨ3}{]FaW\}mKfd1ۨ~hwUg 9I$r52[5W g5}If͕{h.Ƥgl>AҘYa>1v&e8lҹ'\PU[qU&VsθJ{};X$Rm*=tA Ukp.u"(N:O68UXn΢v4lžH!55uQq,\YfvYz5v"sia]oΰau|ک߹裏hhh`̘1444p3dxTuuuq73`/++/w}Ð!CXᲉd IDATl>A4EUUTUeٲe7!i CRJ nwG}4>/&ƘE"GӇdf2jY2d*9fQO>sI8Ѽo%״B,`ҀJ[Ht8ٰ1kИ7FiQб)C=TT h{D:~*%hq)*)nC Ds̨=E(xJqMJbyK'O"lՉ4,nf4Wiy}{yC<~Ywr3ilZ&-SOceeyZ6^ŷY^>i2qB s2˖,N79یCxjb֓b^65(e֮]7ߜlms+Vy/-9(@[L$bdFa&s6b_I=,t~ 3W(I, * Ad]3' Mn/-u''dL=6;=TEYⓉN~)c\"h52[)͉ zeb"eFXư~GQlZ;2ckM7ZC z?ɗ> yغ~.? EQ䝿c*׎=1 Yh?>;\n/^B$fh}==]]zz,s;vk .`<9,35l.3kt;\)xK-$m6)hsSJR^i ɬ|(;5x ReܲT}w|8 fDhKSTdsq8A<+2 `L<3 kz;>u_N՜S=w?Puqx]-q*(:4MrpqqqҊfc޼y<裼ݻoH$ŋB0vX.B.= t]g?FO.(mII 2}TE卥[ikB]= ٱy\c[[̋Io Ho_~_/p#Cja'su"uc5%? "?&Kf7~tu1 H]ğ0q@tH+ߒ7'2DHeФ$ʹ3h)n9 ':_؍f02]l/׳`n7])q8طgo袋kkMPU+5kpw yᇙ[&.SN9)eNg du^xsy PH$»=ztԿ@r%wp ۷zsrC[[E@i̓E23ÙxZXh:Ue?f37|r 6CYΗQxjkNU S()ωj-;ڳXۛ9[jο]|T(]q̉: *QN9A/+hdX_& A8Dr D(2P K'PcD u PcgvwnwmޙUH#ʰeG3kq!LF VL.8`zlLa<טĹ, z*3zO`&=82ХM&$0{kэOy)E6"-I2'(Hrx_q>'k2nL¤L"YA)`&AތRY剚$ZУih'N:a=JTJ(pMMRǥQOtZFףDBTlB!n^î(B"?awo/ :^7.J"f#tUp kZ MQk//AC`Gq*O8S)O?.@ ʕ+yWy/Ѻ5VW;un#.PqR[\DFnb{ E]'2;;xj:**FJ s`ܹ]I UUWemf ( I~^z˴ HUU<wy']w]3:("6nHss3eeeSZZ̙3q8I0zjq~ߦݿ}v>Cz{{O=r"SO˩'EUɚRami YH e4edfq!M|iB%%%|G=NxDS$N} )Ϥ<[6A(D`+ȁ7ϚMgks77SƖ^VDouq;BHJ(al)-D p ZJ'Ocbx wcWv&R+ EBϜ/h쥳 x6. o'*r>@$ 1[i\Iƃgc12)2;]<菁l0Ժ1x|NR (Ýb_2fyʘޓZdyˑjFH3L7-iDS󟺮8-D4z$yOమ )@J\Z"eQtPlFH*tRӐBE%CBעTx<88U`$BO$D4ЈRT]q~p5;XK E/#F/ٸe;v줽> $݌hz|B(R"]![3ffzn+͆q'RVVFuu5555ss7s7&D0fҥi@˰e}k~q>NJzzz())a޽|>>ַcbI4>C"l߾h4㡺ڤ3_3+"Y466m6Fɔ)SxW99sؾ}{"EA'(6?KFd@˩`8XԀ<ؓD d@ X 3r92]R{C8 C*Jٹ7?Ĵ5ԕ,>%T56Ǎ2؏mOG 67C7Υѣ᧝Nzv6.-BFAIM-n' ۺqvz"G]N\aй ,JA`c,R7(Ɋ'`"ܰ)|ULjYdS<4'KL2?vTT P>DfI30V~SXdEn})UԜE\}kĶC!(%(:t>CU\6;݁==en}0h0; _82k?Do$LP͎f.TJvfVenvEA*:JJ)"(2Y Bc/#ko*y㎤Rpظ{k83.FA$ V.uy.FE$ᣏ>bΜ9wof.]JII &LH:A:u*ӧO'3c n6mիyx+VsNnV|M(--eKZHuvɓO>ɂ p8L43gr1p 'PWW˩M6qG0rH !x<|_ۉD"l6n7s̡.yPblǎر3e Ō7.7I Kw +Ox H3!$2Y.]Ȓ uЯ@9J3WmEuU–-r80fd 3vfr2ud^w/UzBaFWt];&Ug e}[0c|Njm:P[K6#.ۙ3`ՃQCcԩ4551fFaO Rqq1gN`!5aԩIy;;;q:cΜ-z!@a5IzNL594/)I(`h3[khCM@Dn5ɬߵuQzz8m[>|8۷ou_F7=ƜqŴj[Vº]ml`߅ ,y=$C SH|'P$֢TQlA:MTNJ݆_]r,wz%{29qVR2'>hc&ubDYM3O̠ ]I}e\ ,Rs%s.4bf\7g|s52~[N`_FT-s|y;[XdMvAbL4T$R:ÄQv{nAzC!qqā`r'WG*:}a !u> BGUZ) NUAu1r1tMҢbt]ā[t]la^Ro^$ta~ /UW]ٳǣ>~;|Af̘+yw],X;v~zfΜu]ǢE0vX|>RJ7`ݺuva%Ϛ5 EQXlӦMxo 6}q%Dx뭷ҥK;w.l޼o|<#Y?OY.(7ndƍnN=Tn7QYYyPx|n/_ 'F@((E41hZXkgf_f'/1 1}n;I$ ͆&# `̙ٳ#F( SN,f"nVvjOnG#A$Zˍ؋jz|• mSP'5ޮnV62cikt%L.h fWK'4㎒Y\'2%ay =NgfBiN}0ӐgJ4;Xk`XHft@`0 fA 9 w˩1rQCd=Y37x1WYbdh}$ rtoVH Q% m2yLl,9'URx N}4Ѫݭe St.1)C퓠-N|r&A1@[o{sn&n.b.rN;4*ߏ?䭷⨣bʔ)viIn&L!7oNzkiiaƌi{a駟r'sNzzzpH)q\=ŋ3k,ZZZioo>6r sNi Y!#k{\<\uUΈt::u*hnsΘ `5La9MXP03V218M!";51>iC'r2i$)--MlkޏDv19rE'3(r|>cƌ^3d޼y4771pPRR½ދf_>C B<;n,YB8NnQ4"%q,9cD8銀g>GS`c6Ne;YrOu2/b9S*:$WrRKN0uՓyCkkk,\JhR/ƤJ:b Tx9x5Co^dUD4 g4BYe AzP(q{xJkq{] /{5tԍDtz?~O1Mvt x8BaKO5S+ezA! mfViL<e3|s0`%Ёn&s90*tԦ05J{({-*Sʎm-4;4?o+,K0$ S\1$ң$0RK*0^i8PV&$jl^7nFϟu]ǜ9s_wy\}455QVVٳ㏑RGDh;&^o]8f˖-|Yr%3gbfΜɆ 5j~^z)yw+"4?%龍W{ }݇-r`壊 ;UUٴi16o! Ѷ_DztbKLn%5njv@ qww"DmD':Îɣe,d+c:Yߦ+qԝw%vܽ}Yɤ EQi2X^*ni-3#@eZc2f%oy5C15tml&|cǑ18YIόxC+SE3W)[30Қ6ѳLX 82'a.+*#UQI֭[y'jժh]ill{2>CEa֭\ve| `Ȑ!+曔 MزeKr+ݸqBs"d׮] :g} /?8 ?NnO*WI)y衇;,] {0(qѭp8̶mۈD"r)~EI=۝6$ϹCq"3A!)|U,0mYdA"G B BCzW+D%ò∶. !2m;6tCG>ʝAJٲ?-^ùGdDMp>]EF5:[;jDFG0bpjF-N_%kw(rL]K(ecrl#]IHeG?@7(m |P 9"4'iɓU^g<ٳ￟Çz;;qFy?~<{.~B3oT%T*6˖ F :ǍHQ&};&^0ޤ62'Ys|E J!îed Gێ;(Nu8%97oXc]x[fk]3m{@ YxGcIQLa6s30S,06_Wi* ZyF\ @3Fl+`&٤\tr"kC4FdZo@Boَ3>kDT>LCiI$6av7"8R@P@vp:DC %(Ѿۙ?>wu\r ?яޛQ{sf3L} ( ("!dQu.{]+ (ȢeWQLH @CuY~ݵ|_ĴiT꠿gFw}( hmmE&fUWwʌLx?Gc4nc̋hVp[ [ R]\tPV#sG]rv$:xA~Ȕx++c.`(`Qy]):t#qLnhES7iu.dl#Nu8ka"o&,5" :yӭ#t<(!Œ6I)"*ؓk_SW՗9Ex`H2<`kV1)c[_tM7f›&p1o7;ӽB|>|>ar-]opp^0ݿk p>NdA6?y6.:MIҹT:q(ҡ$1Rv@k<&*08@W1׀)GɲԠil|RV4A-F lpczR7*/ZQшRS:=:91頞JnX, xt<0QWS MMسѪ7^✣> ?|\y<ǏGOOSOū|'j|#hooǬYpmWb̙Dee%4PWW38L@鱸t:m۶}EKK V\ .s|'k+w$!׿Ɲwމy3'#8cƌ #l}Xf {1{ؼyycP":eF3yzĵH |u*.m^M8΀Ų4OvMb <YVJ4ؽ$Ksr]\ 4(3x^ܶ"}2u@ƌ ;$q7GoOWNj%n: !&HYZCTl @WJls>}mmzhXjR:::ڊ'8ӱqFرmmmرc6mڄp' M%76mi|K?x/}=}ֆђpe'Ě5kO M.Az-)dPWWEaϞ=Xf?ŻD;>SU ǣ6 $0- cѹ `I¬ӏ(*sLDk<ӣzd%9!P =9;h3m!<;1'F\ł2ihzmUg_ Ix:p-Ü$G0hKI-lCqADUAP,`H$vxDK*I:Nc4Nxt65K|jgdPrx`>G}m Do?:78pZ9uttGkǥQIw9#{{{k׮ϜC:Fu&1.}x D0X逅P#J`ȸRvB6".Y ^%Yv bu~pFso4j* '4&Y5\KP31?3Of!nsZ_ՒEQ`k5֘^ Y(.嵽cl $#n^-|8YIv=}e,sfm*GDq|q8|0sZԂ㱭.ĂNu`1J w<~jp"o%׽l ,"~x}\#cM}(B PHRcҾV[Gtɹ.`\|H&mT(I#PLd7J<‚Y`[xM(IGkW YV,E~|bt9t GA ӛ+`#Db w T\H'cuY#:dP/A}Ӟ \CN/3($B?||yD.,!f4.9PTb w(mB#сP0Wʓ6o4*SrCd9IX$DP5 LD˺%ʳZDf!Gm*vM"#F)&eȊ` TZhR##Hl.JdZdٙXUKJvDR#ZJ/zeK(BDqx^>g/;ܥ"J s(q&H)\lXS8,!0Q)屣?FX$/5Q7e?I &C :5vSIRЏJU eTlCy3 g.-ʏS?̈hlҥpܶ=JqP""4Am,~QAu0$Ek% aeUz8+HTIڮ+p3qeH$y"պv6?`1q*?);5]?V5:2|+~+Q][Ma{GX>) (m:yPMo:>PO ,І*[<;V`t)ӹ$b{k GfC<{CzET]IbT("ܓq`HWn!u8^ͭбouLH(ÖLX5V,KAZ,`ˉ_&^pW֔[t!4h]`0tݵ Z|C!0`ApKt>Ƙ=5Ι5,Q/:ThU#>1Wu/W;eBnSO{h޸O2aL;'ZA5/P%uIӖWby3#i3VPR:Q"!l0$ rcAD6!0|0@X9tCCyŞIiyal+5$JH^(9Y4&ւg.%ʈ%G{CGv9 8$ B3 F^E +=t&Z\^cs2џ+e0~iPAeY\ns%U#rW)/@ fJTD66(qй, V"(6xsKz DfgA~Dq$ȪbtYqBӨv3&RJlzHM"͚qMd&̚[:4v4[a+[P1&q' } אØ1wu{n^Ƀgoa#zeT؏)Qxp-P(55 ,ųIXS\GYۧn,/_W)pư^rn*qwZMj]&aR^L`&1"P3,~@~|aI`j&2%QL$gOi.dL\VhA'S9FfwgkòZNc` >V\Sr M[$勱V`+@LKCmB-)4 "T  9!f 7Hy!VXm#o GY$)WH883JN _*  (I9bH$11ǃdO$v'mh&R?~,&6c=G~n_ޅ^!\֬Gn` E7FfmZZQ10![Fӯ4vki4KkY=?|cO:ջG7Ŏ-(u^N@]KsWckL^nMX);?!p3I!L`u A$$RVhnLApIGZǐ T!ir%&?9"OA IDAT: X?L:tV+DMƱOHջka>,MĴ!0A0hY+^5pG)vOc(6(.eZ*t늱ge(9!}%$:WcDyD{9F)ֿOӓL2Yt=*e%] Z;Mm]O+ucC}>jCAdl,-t'rJL7)(KU] 9gBL\uQþa1*\SS塱06݄"Ql"=~"&߉mP;&N¼w!0h~B{{ЄjT=E6 <+зeZNĒ/~Y/B'.@|"ڄJ.0`(tGH#˶bd xU^SMJ.9$[x:B]Xt'*7^3(Ul)5cD;K5V&vgPo FT9} , ƜS`¯؏|ba!Ui~#UeŤ,ו$R$fm9xW>KUH IG ?Ci =Lq%^Fֳ8 & # 沠h)i ePA9QmS0^T1{}%W^Is]n|$չ&7io4+N*S(tt SPU=@:lfhK{]؋czo xC}Pދ߃ػlv2 Si.8- nEGo1ȵC2 }HC{sCI-5Q[ȥSdɚEҋ9 >rQ_4IRdf4ޯ)`]R3DJM2%3Kt$gw'7sJ56g+ ĩukG7:oўeUY,RWa  VUQ*XAaM-CI;fN{(}H'/f1rKӭֱ4. Ieu^QqRuq3)2/!ؑ&7,ԚmUK=W갮V%0x7ӨD.`(H)aT4[QYPrmX]~1C:Ԧj_Q9}jj2ž-P,ÜǮz8|DX ڲ}ǎQzpplށT=77!x_ۉؗEP ^/W1yܔ:JmX^& NynvmI脅6h1ڵ!ҟr?GKif3 iVfhl`F9^G1DiT4=9TDu{<|;UM/Fj`v4xwgތƆ"r=8n؉M~L=8{o@mu%2>~&&`s&`ezl%*0c端cpL01j*20?lo III}ʍY͢ 'a,fJf,kDZNCϪɩSqmD!+NRz!Opr6Wo7WD #wmm>N|Rb1DNKE"u);xSij> LbRX'yҕ P+qŶM02ur $KL͡6^ .-BgaqI9 F- t4T9^x :00uщb?3.q߇3eHF Q/`?ʏa:PU_w"W(bI_DGv"&NoPcοXVe| ^?vR Fs=[B'&~G_62nU92\l`H Hg|6t!vU5Dɰ:`6!KE,6SkӀ[,Ol13榑&堢HHڊQP4^C~#2Gx1Ma"mkQ7 ODb31UN&JKŢnL7}N! ~9H@$}jN‚(C6U=F֑™0SVEb2ˀd8҂2J*IG-HEEg1!?(܊Ϝ=yL99*F31ñ}Fd'cE'cUkw"Jcظ}l\WwCvR3ZfLB׋[MOc7cv$؎*_،9-yƺ&'XPSx5~j[^K0D鶾Msh]L;ѽuuBBn@\W`Y 4=]ɦꣁ;Hf%ߨcGDZ6 d\ xY${G^C$IImIN@AEN¦ xaqBdn@(4x4@XwYAΰӁ4FL)ɘ_nD .˵PʋM4I8 $GDg,lBX15cxY&] PLҺ5O*c *21m#=E':v?0ۇ E55 ~Pxz>X<㛱%V Ytv чL63`qz1ua+0#.<ua1VaQ[ӄ1#uYؓ(߁i{'o.& :RK౬#4/\I|\fT?8rCpApMr0@ָ`feABW9 fGj$O>j5YaH2%C5M&$|̲x@h FÎYԄ9&%Yq.|g$x܁V4MгMFYG_&R Wx RG1YkPZ{T&74$>i. A;,xF": XiA"%bú$6ѲLfA^PJ6/F_K1&BQ Ж*F8BR&v ^B'ʨN bu\2͏Ɨh")9MaCYLsYtb̲gi049(;0IT2ʼn|gA#)ӹ!Q!'>P R㢷H)J&T@‚%ӆST^l$r ;E*_[u'2 CEvizO-.~!#bGE7 mXiا,`H>@}+ƌs\an2 Ae@+]g%kuzŚ9j(DdC"RiqY.8leQN`xafaًGYx, [P@ks-v0 Ţ? fq頇"ƾu &q8NC_xsmnI#qV0>16#Dq\LW[G#\DSeZqJ /ޑN`Dĉx>| ^Ye\ez}:m܈ͭ5հ,NRr0d d诏LiZÍlRCDCB(O|IT/>6eQDyR#tLZV^ D\h] (($ؔKwm VKxh)qQ %[[PW5B3If~TTz%Z[# rձd*kheI̴D† OqiC57/c4\[XZq75i`&vFiIu&MHt )q`p<ƍAXD&3 }hMMG>_PqXf%Y[Wylݏq=^;Ql;&D0pE fMҔkrj9`RAbz;DqV)1cp;MXJ_8?o|=7is 1nڅկf=ol-᷿ z<.J lرe3鋐C:O Ql`tgAN4^"%dGBNB}AF9$Ł"}8&HTP< 2-$PÀ(^iՔ)n@EH֋1 Dddٶ6(ne"pǀ".V%^tuZmi r9:M%s12Zu3u(;R -@Fj ifğT=C dYDa67x:0g}GwWfJppT޵+*yL{vd&mȾYLlDgoES }E4Va >O(?K}F ϓPv uVz餺|q{-[%2vOo@g{Q1T~[F{[iʏ\|1z[{|Kw|^_ 7xяjꐮ@A90ׇ;v`j5V0dgc511qpB ĢAB8ywN-$s>/c,0pSaՁE2>ԙt;eժc3d ГP9- :_ ԅ#GX$D+4h e|YlV:kF#A2KDM6Vm0%lOeY s-qAF9Rrr94Ty)n=_> [70aüIPC%MiƺiG,BO= 15|REuV=vu{U<^J:W^3&N~|眅ޮ.IF!i b4f077\l!'6L3kV/gmTjGRK;>յ7_}L<uupyyx?ੇ4^Ù?yiRK^_|8ױcWW῿/ o>D<;r)|I0B,5j $(zm)(~du%X*gʠPwErr W_MKH^&T9 Wu{#6 iUe T"@x`+cUJ. PuBߵ  4Zu>LԑF\ CFʇlUҸ7 D % b&GP6)!!0sڀ 5&lp]qYpoG2uvaǞ4פŎ.0V ^dc pa0{laÚu/}G—: '\vf-9{T`Y'FGux[Ѻe?y9Qb8fF<iAt@۹e3/ރlOǜ]Kw8g஥14nZ>Kq]G't\{}_ǹ_@3\{s?N=,@Ӹq{ry'po B0*]9%q.Z߽VSmsu^w=n'}^#L2Kv] xSX/aUqoA` (=7{B묳q{U-'JpybۦXb/_",2YyyxϢmNxƲ  @aDD߲%^ Z9E +MsV0d֮륵I,#5aȑY6&)pC!aWU){r _p35ס⣆%Sұ`|0TMk={'3 |+AH{ a5Bm)nYoΥGXBmBZRZDx2+X>&-FI٘ۛ&ePrb('L=o4kըLGMɖ"cPU{_jo &67?:v|c0m2ϑ,wpՍh؂S'aɱǠ{|4OTEٱ Xж[VN s؄G6S̄VS0/ˣ@f9l16_OJQ^,}qݵg|\ }{v?9CU&z0wFtv⒯~ -Y9+q(r; ? p[nFg{;^_uՕؾiSTN83q׾/}Ep"s1c\|-&^^uu6k6^_rq c98긷2w׸gPQY7v|]g}cԣFr8r:UaKOI|,51$Ds&0:rY#DP`2Ϡ6q5AÄ3@n;]3ZՄ[D֣egGMpƮ)w]xGMcbK# 0!揚́C%p2QxID^n#j甒qC,K 9U^lUJF3DPa]t U$>FQEH>@~C9`P!1ͦ09r@*]Mଈز@Uh׌tE|}}}c(@*"rUUƌQQUWw@:kbmW IDATs8r2T9s`oK*}8S,ϡ&<2J9OݏLͽ_t:rWАc{/+݄͟;uF|G?s4v[Z| }XE\;wvCs'~{冑 K6[> ρx)a\+ϯ@CSQЀ=W5x]|8cxhݝxysZQo__P؈L6g_!=O?ⲥXj̥<}:׿<xJgK/?q>=fΛ1o;~kIӦ!JX,M?b'{ qL|IAwяЙN:YeH9cF"L> lg#@`I`@'oIԱEް)-ϼRw!F\LshK >3Ap(1тw|k*c 8MO8+wH-LMik7O>(Z6wPi>r9긳 FFd :d_VsuSGUՀȥ4}f28rj=}bV__@ͤ1xr:\ qXxbx)NE ~=*ZZ0}|`wG̙ Xu+bGހ]/=<DOu%LlDo ߈M{1nT=r&fFd33sŕxO_ʪ*t)\ٱo_K`4tSmF7m C9}}}'v!5O ))TWgw>w|Q}0tu&O6k6C> MCw>8>~e7a dB' >lٰǟr*'o[~?oZ|i5!]3Hs ѧ-8E'ج͚92 N-K .`{ʜ"P.7"_cu:4x#Nw $\# FC (](jΕT%'_.AR7LlҀ! *6,iJ ]-XcJF&41Rs׿ٖNr*:#7b}A:r<lu5 ! n YO~J ?9Ǥi%ylڰ!̸bV/O9"o8qulg9WBpA1ص'q1HgE ~LҮW Ly\Z`?8D^uaYj5%I׻YFľ^1JUo5Qk!S +GF"ѪZ :( }wlqگ*CAbDRv>i\ى2܈ؗN 6Bxa"ZIr䶜)v- ɱlR@ RH{7v+0kWGGlUUxyCk_۷b`3j$dkju55hex qKGsu kGY^E}Q| >' v@!82j"#1ߏ?uҩ4p|3?D^;# E`Tr^J'@qUW Jak \i3(/ *7ɧ5Ƭ.>r{A$Ei-`DDP"?~+"ФǿGlkHE&hmC!`F@D7ن &ǁVmNǃ)Eh /UPq{o32ݧ9VQ)QݶoSdK'UbڑsPS_?RKOzz>>/oCv+Ȏχ?a ֢zKQ[6uF."Nc¬h> yl̘QX:hfq/ǼCEeCsmsN"MF[^^~QQYS&?$Oftu/ ]]g?1Zïk:"円сp՝woc׶8+pKu!^]/9ϓ hYM*$Ds%C _pARՊIt0޿6*#$>D'8ɥ65brKBrY˫CZ"RXɄDxЪF+c͕I12vSZX9;€fHdL4Cӣh:p|H T(gДc+#MOQŎkѿq-x{'˿.}ϻ3-8ua3&4f?[{ӏD p;qf-L\^2ǒ.Ŷ\6v BpM5՘;e",lvdyp̉xb֭> ;zMO`ɸm&by1}|=kHR8ỳ1wb%om_7/Dy3&u.NwrT9NucV'Mdݐ2||xܚVf+,/h8eILϤ}dlN,6]eEA/ݲT)ЈNk KIkwŐ%1w*В}ˊD*7#R E0`cұbƺw$F/KIuĸW{G\WʨiA(ݸ/7#b^lz}ٲe3}U|d S)]FGAK2( UH <)ck>o⾕*qiK8hѯMסcS|%ن"}3)Q-'.Ao?ڸZE`^lEW=@g!ٝ% 9H Q^X5 Ḛ"X¶(!ys EEyD̨.+^'sU#Lc!4s4PnX ɱʄzZ閈cGrF$# ;Z} :)DJ L1pPSUS]S꬇W[w-S SAXD1OdES=`o/z@a՘=܀qӱ&hƽouhKCrKE,}"ƙ/PS'ԃcي+>-ØЁHRԛT+.f-vljmZfq>d#A$F&Fswlyu 3ݢ*̮,$>p&fE.H\I[Fb~7D1*@+3YYEL5a* %t$YEvk'C WqA$]2bGQݘ|Ʒ+ q_hWLSeSZ/iyjãfY"!;G>G 5Jxg&} }G]]-TySAi৒'$x ;r!bƾXgvr{!+Ս IE a`Fajd.6Q,fgMQ9i襹_Zِ&z]`n17T:0\U(}sh4Up,N޽}jYs91@Fe ET >Iޱc h@Kc-usw] 8 gZnaD;F(|Ff0Y]*qoz-J' L&GCn@Nq=C BvbJѩtQSHL'|V3DƀfK[])}/bn9bu4ҍdcԷStR-h%Ip$^Cs͏y#A,=*AHa@!,qu4vAu^MBQ/ګtD~*Z}  IMi)GBo Ed {ط0(JN>W9&,Vv)I>Ѷ׬EOW>͛0vo 9TTwzg;y @_~`T"]2qOePQYm=|QrbLсiQL5Wp"[+NSM"jN̠>T0 <{@&vD Tf氛`JgTDE 4/%B`oQR؟*[pD}_1"FW>eΚ#w0=c0mEZQVOhSиtS&Zb<طL(0{&̕z !DQ"unݘjGm&hLeQ$Kedi߳M&vH0}|isc$/-[e2Q)ı_*kd$othq 't> !8iWRC:PC/@* oބq+ֿJHCM]B(n}/}~<|h8_я}&ׇ9| 䅘$\VS`OTS EUf7a@x#~d)T{7[J?̞}virI*cQJH{.Q*U/"+;bu( ;q"Y gBahzޅ%sfv̟; 7bbC%zx7MTcBu|4ԄA4UcO_'8g呭Ky~yu10aoYDr}eؾy**+q 'K~o疅T߾rؼ3;~rѷf/\#=7m [q >r%wkע sM?/b#q[K-5ue|xi2: pⵕ/sfa[$o{|ΊRn+; /<0@HE~ Ĉ֒(J{a\B g:c >,P:V zhbU/Kq1&:I? A ATJS`4.сRF]'ɇ]VciY!lBHiD2XPu|Ds./Lw 8Gі#8f4S|=R1M?}%>=Q]UQZ$)4ڶn@?èAEel݂};w F]c#voل!tډlCvD`4Wbװc:w)chtA[O?skyt ^ yxtRlm9v /7:N']?U _lmFHg"xp@i'wf 8ܿ7|[>)gF\/ ;|.eO<_]w-.Up񗾂-l) <6_.0kDWܓyS0*3-JA~(YºOSq'!|,.z5TyBd)ZRvi dl~lPN" }UcV$YQñ&0QO-r~ $qH9Okr2dF0teƖ'^]z''sk3%k*eaLKQ3Ƒȫ* |B[[#2kxD~ѣ)C5ռ^~GOqm/HfD" 5H7XxLc_y87ՠM2Z0iDӈluC]]hhG)#S˜ZԎi@ythʠrg00[^ØGزEKY j,0 HmA[vWlΡXؾ[qQ`[?$&NLMCW8c"]QaƼfL20 JGTsf<4u*'M5J4'Kt2W,AN9$TR`e D^c@PSW5ɁgC%-j-UsJJn++A1(/BP9ַ102TYԧB9Ћ1+W]:m .9 IDATGv[6-"/ J7p-e_CQjTAjӊ f2<< A7ȷS1py `a 0X`̮iq< "K;NdG1t2f5UÑh"29Ө~d<| JH&&"?;ή{;wzь4Vɲ%ےq LHz;;K_'ݻ?۱r:EݒSжp!e3JU +M>2u%e6 R ;f>\zBf^i/♬.VFE:E|js$r&`Z`=e؇Y{7WsLw*GEsOg4{Ѷp\U(|:zGJo#41cn*GsM[cQr%wi8C>@P,t[⫷r1U!ZOQ~i;uFCu1B]b&s1ȸ7\|Mh:ĒDn)梍(t/pEI^hQ:'M 5֒>Wǐ~Dͣ~|-xhki岍L9xl@> >tg'Jo@7c%]+ZaĬ vwm u%~{\6U 1 Hd<2a٨{QI sS=x'0#OF xT|DNk`u~5QY鑷pnlQJ4wjrnoG{{T1cM2rkSI+WԠ(xt6E5lm6)L)W+bWô9 VȃP"8``6>xpNwE ۞A2(Is !` ?OAGaO"͒( (SEC=*bbbJ[ VNg$I"qۿ}Yj.5L?cO o>ƪ3CGH&~Ws#rT$8oExKN|/}jd*+H$𴥨jBj7,E3-uĤ=ᢔu%X3:rw,HB`C,+UcwHÕ;ȇ{ʈ'?P%bQʅ Ӽ: 3^PY|dYz&gc>F) -[_/rnZ)*zk?M nD ЄǪt0ȂL̓S#=5lVni-hI$U$ RRJ5S#\)yf3 J0Ҭ|dmX82(=7bfb2ʖ v`oh0PdE8σOG~l #ǎ ǁ"JȂS80\X TSB% 9$ZLcû/C2]OCj"m/}l<>uWQ199C{ zN(_;nѿ]ir<|ׯ1:<>4ϝ!āuK,[|>H;Yco˿;>!b'm|Ã!~gI_Ij%,AujTmeXp dj#% ,ah4&Ey}TV_A Cۣ2>Rǥ.!Z0B(hZq0ty֓1#rspƊ( OW)dSBˣЃ7n$v+M/^V/1:a\q`G6kc΁tkf(o8Ǘ pXe}m#:y18J枮PRY 4+TL}I{ݒl;Љ|ݸ (9<X{Q@ Ĵ9PJ$Ŋ8}#kZQz ~G@V&|68G""c:29 X{kpUxҎý8*!D(kXY-t{ E>6F(Q|PTzG#Px[7^И aE/}Cd-LY̰EWW(k7Ä#'ʍQ YI'9۪ Y-P~oP9DBA{9d*"׊dB5…4B=HyJ-hm.'f%3v>(w}X*Z/PR3 ǘ!8u7H=0ӤEFT210rDN .SO2F@c0"m0%3?f->(s q]؈Q.+ W&+pV[vQ,,QrJ(VbǮA_s I$gR~:Atag1]P`HeRLePSdE ? V/*z~{LК̔Ly)nx^i<]1ҕgXjr9Y)`&i2PsЁhP ?Fg;4<_..ܱ̿ {83T$ ȅ.uuFk5i Q.^I׆'|ȌˡGDkeM^ocAށr4=}w:ijyb1c)`2ábqȥ=FU挒uyfKct%"!3ɥr)e̔ f,$R1huʶmvBY 9{SXF'I%0Oni+kl}~- s$QAd {$Jchzpu%:n d]{=Z|`E,J9Qd@:P:2&rwҸCH$yd+f*0,͢y?6UMi,:&^h ři:OGM'%Jw*LҸV)YfmT%b*K+Y0x6=e{`j#i$#/$/gѮ\̃Q̨e`-'eÚ![498lj/XHhܕ.U֣o|+3pbQönѪ^?q#j9j̈TDFc3&e.%@N3[=$Y b.A!a6;zQ@w,ƁKV%l 0Ƞjsp's8v092 ^Q6:;ԲH56!Y[Lc#^~%w `8*@6=Ԝ{JI=s[$cX AcK-a31+7u}qW>=#bNeαHt>-3BaKӎ`Y0>Mnz3&1xmQ#Hh"cH %b8$Džcu Des4yERZ S&~CUoT\q'՞ѐΛ) I|CW )eI3!-ј/(d72)]^Ba(Lq}tE? @ۜz4d`'e8lq+ҩ \lTfpcU$'HPL$P,1;PҪIsCL$oQ&rH$]8=\ =8T)-q&xhaKC^{KR\L~'8U& L C.ZvM^nb޻C j]Z8dj1fɶdTJhzP cDk I5%5|!;Q)ziWc]1& 9>֓ >_mrhZI1?,e ϢSD0nb3"@uvY 3PFuu52,:pB8p'NqA|on҅NW>r u~ {?Vd܍ ,J[ s$пtjxPs$PFr #9з4+ KFUeZ0T@v1R'Ҝ0ٹa`TZ[ۆib9^Nn/K7~qujb|u:P˻lk0E~2L[z=!%mhytQZG}]aU\-A,/C/}g(dSFHqh1L̈| h\y*biy>KPf- DCu8c8q1,ZD~:jCMu%v9xX.M`t|bҵH*014BX҇q .XlEHb<[ g-?:зC-hoi <ҍE1T uvZӂDj@؝}=H/;J=Ftu 4]VTrq5o"Zc?mٺ\˶AK0 ^~l\݄ ͤpk94߹c`‹Pzz0V aITVQM!;864bU5FS@ HUe'9T#kDX\SsS(|0;ĉf&)MefDYG#b< h&NGT_L+`LKɤ?68|9 kdQm F/|G砮2B ƫ֏J%ƁٺѶ/cl| cU> &Ba\TqTbbt<ʚsM* *&1p0~x|!ee"X$L=NUiϘxzrg|Z]8YѤ}'Jh5[҅Sқ\7I^n <'ޥ:C+@(bIm=sfvkOgՋW_m>`XMPJT@qjޘ8)6QabNiSFnkT (1!ѬD%&t ߿'ݍ1lڴ ;v2Tf3mǺbA#ke10<:8:fh dzPVcjtZ102\M߀3]8vlv 5-FĜ $7]ET =Mq=1SKNrQmԨ X=Nz<e[oi '/)Zg>D;x?02{lXCm#hF%ڙ@8sU 戥A(&s!0ZIE)kgSsۻ(;R;5ɀȟ&y3MɪcGp㉎D? .գl"4Z̒PLLDfR0~H,:BZL;Nؚfb||CM33U'I9cV*tqpm8BjqFnU*B`x@ %oeFxD|,syhUc~<^Ab0DvMQy$sy:z@pj}Cm?4&ۀ{ _~ G:0NAsY焛$o ,LQ"kԿnync? 01dC5} +&ۍ}QwVN%T6!Gn&IJ" ܆ upprӪ\#WYүlN|֦UC Pa%([_;# l\>x:;Ivy 13!;@%6ZD ̔xfD>ˊR4; >#R؎eVIt&g߸X|8 IDATF9$ׄ'm[Ea'[ Yi\}rɶ p3HC\U ":&1D v\҇qc7d$yMd;SQm E!k;zMЏBY]_#LOB>)Extx 2!${:v}F{`s涔(wb'79 ڸc vlv醵 TG|n@:n0iM}sR @`8,LA3ch[ piqt 8Q9r~LSX6sa |2Al8lw{7NNN)`-OrYw,//kSAz4%؍dӳ\`"P.3*,:3B]Z.'9a/0 H5,S1 2M̨Q46q.Um=dy0/ǟf- 31wԸ\-^BJC9H٤ 7$T^;6OͲ0D(T\D4 đ@KJP罺N8Om0&gf20d #ꔞsdF9xCa19BsVӕ̾RҺ];R>`ڊw\m,Z{,8c^PUTINLƘ|k Y=L96dR9@9mk0;"BM<utqyJiv"b[mG4ո`ď"S4N0cϲ QgS\Jz²ඉuL;"=^$UUǭ>nQjp,cɥ4s`8\ToLMƔ3r-ԕpNo贱'"~dDE Ļ\Հι97m6S?k+`|Hտ.]mcfd^L|K1l3\Xf䵞OvI`VZ ػg`k̈eF `Fgis,UV9PcM) f tL͘>̔rmΤYq t81lXhJ;RɘQIqZ,)xycNܲNֶb:R\րotOm6MJ`H(Ʒ?ͤ!*@h:i:+G=L6] GOUJgQ_fFrl;G&wʾ?2&\1yx?l-o΋K.So5Ae`(S}U_݁5$z H\I$*۳Mzw< FVb,5PdkyWˠt) mki%iV">ϯ|0$*|$ņ2lu ~\/ppŅꅸȈ߉@r-ĪwhZ .` ?w9E~dk``I^\)K$^1"uI f@KdckKi o5RnB(H*h0Rٽo[Gr&Gx:@Z#Ejd N.םbM1X(zSFAV[ Sf+ ӬD ]yb&@F*b*n 5c6#)C'8|*/0!@t#L~;NTqT@ؐV*p(>qF"+1mۆt@C m|=˨T0/zެa[RJ4 g45:O|i7[tZ (ơWƩ2WEQ216iuڇYy+'@ jmDb p6yR &wJFC<ߞM9m}3 lEJme# LcWǢ@l@<͉jH.norSv0 `ɵ٭R`! $* WK0^G @X^En6SD3@qYS1B`/8V=N |CN(Ucm7qDmQrq[yl'=Ik@Nذ< @j~Z#rS)r4-"4v|@.N1R@ ?7׼ֲ(I>sn eAz$&S44"h ԥX0V:@:CIa^8s2aXU(uQ;gf xQInay& dH82UJyо8tcѲ8"."sob ɩc=稹䫘M4N`vJ2][ A [t]Yb/+y{.R@'ST sm#&d0PLsLTd)~Zde4O#\ԇőK$~; Pmzhfl]L$t.GZYHF(a^rK&5a9,d@sQ&L+*!#nPa5dIjљ~R+eW,"+Տkל;48uTW;Jzx$R{,5<'+J9 L># 0qbHG 43$7 c-#b@ĵ_!e?T҄ec69vsڂ/Fս/XZYtOŎ kwlALcD%*"z/5#w2uPYDCu S}I$/YU/?^RIp^Nڛ! I%$"NVdze~$[ޠBw#:Nuo W<%};^taE &,%\{G''y9v0$𷾁m["FC.m~Ŧ9(଱k{ "9[w{@ӤRF;,NJq[v,#AH]ʔ}^7،DDfy|s$JcQ.OG ȝ)Z4OXȣ 7ņF Չ‹88?>U@`#;`jl r:QkNCj860lG_B`{p`+?m `=c2桂U``u{Eqb`AU8vq?N PJ"x Fd؉~t<4n-Mz9Xu b7)eSm^a:MbXjȀY p@%? O\ ";7 ; `(pI 1,L: e˃"(_Vw*`,W]Ƽ6t+b[&oR T#CR_(+n2ac[I4L,,-"q`P\t9O9\xʸs'JfT# %M[µer/e1gYIr)f(NFJȪ6rXϢ"ܙZ,DtT%HVێu)01:U@nw'꒵~q7&-uch$P̩hBQhȢbnzc4V s||'ʊCkф<Ϟd= { FDCuenB6Q|?ִ#Ɋh;sy&ؖls4vb<.s2.bjsiOٕ58HCff:d{j)W%7t9NB ֠ c6&!D5&L;?#=!#4$_*kH^X5=#0pP[yIa.^.:G5;.YOS'u!wM_)O_FE: 3E31" ["(u shjZ>ð Li?2hԕ9*`:ʃ1ځ&NL6W00љ\,FӿG}k+yj2 0?ًN$^oQ.5W0?Gu}%mى +ѵo7ס0CSF=~\-j:z=@׬_进MiĉKF)?ys0kr}?㋔tN $ӇtMŝU$gAEpTBRr\rāR:F:FLhjMu@ݳ-~LL̷ ɍ{>>oؼI"ҵ鉛CzGΡq]j:W/]>˚dN7_p kBsfٞ,-l\faN߳wDf!p5 &R`{9'_Nx4Kw o)y8GSpc(N5 ڇtm% N=*pΑ@jQF#!djnšx iW,ÊQ(Xۆ$+`8,Jűg=80y 5,B&@<ƪԼH&֥a&י~γ-ELȰ\cCS0ŸqPXֵ(S(Unp/DZ+:5kP,j'Be1%־YRH0_g&` |ݱT>mrAV\ 9\nr.{=2)ތ+J|9O }f)\;S\;(NnT烮/+A&L8)J11?[cyBcwEUAeګ1sUՐ.[c!2xb4\ ,&pr8zF9`qf>?5gb$~s LM&`xql:چ僣ޫ!q-ׇ4* !gIx=a+U}jNzL'q|~_&9,,B d96GNPv5*hN&&- bC96Y^V y}3rhnqnDfbo+G*{qdڶyUc\?^K8rO(4eslS+S)5b,T )==w(fidÝ6c# Z2=nK7n.;b'9L,wYR"q3 }k;en:xLcy/ ǮQ l1% MUF] lӷLEL4]LϤ;|EP ~,8"e1</ʱ T `l&~ aGYdzlZfaˏQ9UH鬔2) ef4팦1ɲwsM\Nɖ]%h,C45CrK9r Rd":(v<6dm?ܴSNJ #,q'=݂WnAk?m>` Wl {LJx+ta<<}9Nd\)XIm0#i@b>Rk%3& tRfD"Si<%U@&o Ƒ{'Nd_Dq P8~u7_ 8R zQsR4n>::,{fxހm"YKpX +bz| <(Xpz,.RS"<*YLs=`U@<(f+?2}'{&!q2.^dw3PZ+\N Oɽ=Սp[w\y9 K89INLuK042vXӊȯ}{Sb cSxE3tO}@z á݃H߿ ȊVT_r^!t-ʼn7Fx\dC'M^$.2|D54ȔCS EofLt{"q,gͽaC ɌQ qR37Y}>qr1OQC3A#{ >&v*FT.<\#f#3Qq+={C32dyk'^m9Y1yJjS(F W jsâ$j`9DJoď+ۄt;gB%Qyt Z O\}`&-) xPxТTú 6-G^Dq>PY±%u8o?*ưMI qǝ06{;p!b .mDu6&O6bh<߈W~0{aqWF&1u: k_#2M?9ɧ_׿{~qL]g vp`sj+~pnXXvlHZ/s|h;' g@@7Z֋[ET' 3!a;=;#6>MA˒<$"VzIwp ׆LerLo p Xp&^_Y7*(z{Zy➦3>]m,E96Piꘒ1W(ҙIժG>NHB4fݳG*͂{ RC9f_${ DkKèbjU@dH/IݎUfTL%HTp^zTh@}/#O""" -uY l skVΫD׊xv! `ƃۆ?n`;Wsa籯ދ|~{9,;Ps.<<k1:8.=g0th_lጶJ<{h4 WbG?4M=ms,Ǿeuu;7*R),Z ==VsaͲ&# .UۿݻqOVlM(bZTUHkttϧL<{~w}~3AK==🿕ITE tJ>LK~3qPɩ)WFsX_Li$b&bec&R G/JshiI/XI#K7)nG:ϧM? ,ҍr3@|kY2WG;Rt_yS],ܱ~3-:svj_Oߊ}(O "_ I @ц<2&nz)M*yAr[$P  1ex6|ïWLCccEXB$pzTfR(щ 445/݀\ !UΣ(QX}=7CR9a#}7Q7ؿs'>#/c",V]~[g[~ 6jħ¼ 1oBw[7{ KWB2gŷF,t==ƶ`ix%1x{qUGUu:^y_'P(gp?q|V۰`ixG>k`pя]FSK q/p͗ w{WLCj7!g-mK7+:iY0  J~#ՀgM33Z!)HT1&@YLj?!TSz[!cqtA Lyq-):gRR- emuqpd~=l!}Xz5zNg:~/[]ɉq;ep oD_w7n-dӴ-Z˯!xvw[s7^o|;~bp2tu0oBWą/Uoz3ݲg*+/} SEW\p1t{pW_\ ׼Oa /M#9RJŕ;1FnE,kSy# &[pC󉂆!!2yH;Dt饹\+r) ,u||86֡(EY8~Ae0$@&M\ğ 38P/G D +mAdm6}j6Kte* b*v"U$_F6JoIf ʒ.ۼП=!0d2i35zYD}PH+1yln9NăVSH'̮* 2&}HLK! X" Ed N⻿~ѷ_"F&pXwɦ&=9G*&d(Xd1;Pz,*0U4.lgEBj)͓O݉D-Wd ա''QI Dٍl4=n+/ށw|#yUޑ8hnmŷ?xMsZsM7 /=O =Z8˖!P MC{bbbCSON?\{+֬Ŋ5kODN? xTfL6'K?;~ -Yף_^ot3~?_?V,Yktc+xQ嘘A=#r%_DcJ&G<޿gT *gd4d*~TZt $RH}$ϵ1:˔ >M WnjZxZؼ%0b(۠Q0I?u8Ѐl.PV-; OSHmPmo}'60;B`/#A3*Y76U]Ug9 ӬDN79o5i@mErE]y^فc'||-83<'LCƱv,c@ 'ޝQ6NE\{r\uR,h? ȿ|qch1'w-/bkO@/qU硱6NŖ}CM' Q+1sgx׿ęWMWcdh(:5ZJ];wEݻw`Q jioniA(eU.rFg2?;6\vPЀ#|_geVoĆ]چz54=u看˯Wس};FU_OɊ$5h1იGCS3DC\Hg>-%,;":2ɥ@IYgYƘYLljH5) ^I>1Z5dk cʵ>.fϮ :Sp0TPi_ns&sl#J)5(q{;k*`s} OYmeVI`dBKbeQF WvN`=![Ln|lZJ]`$J R-lBaJIfK=.$ǂ9UH'fK3dR Ͽy j3o=WJӖ!*9-; /+rL1<>:4EqIp텫ѼTsv;y~ [_Fg)T5!VpѹKUhJ)-Ox A)Wzpa\7bPMݻ059+fe~ڵX־/= bįI<L&՜^_qnoy3vo&CnL18_y%n}"MMn Vq6jM'B `0g^2Yt/u_TTPX`7#|D"0.k0䊉G عT$e€S5h ,Fy'!75W-<1gZy%vνHOLJS.~7%ň_KJ*KfH@>5zMd F3!sC䔍*fWmQBJh QD"S7R&)" ;9CEaN6͕Ƞ8:w^pV-?| O( I ryPJ4 d0<4!Icc˽S8#= !YT+ڄ#6!&],BuE 0LNPME5xhW/*SLX?.QL7m5o}GGq%gazg191Hg*QU]/7[W|c[>@_~~܌}VQUSˮ}}oCW1s9\ַ"]&{ +םlžc]½QSWX 00:9KJHTQVaxWT22.xHqASޔ/ѝW)qL8nT )SI$R7]orVH8eA(1Қ\]dsnd3,QuO5/o~tYg7o~M RE~o›.x<[]e'?+&<|]ұTG x?9-'>ZyI,j@\P331u>0A?Khk^;o6S_kka6H;3ApRZަ*U jbkJrOuHa!MO]5uRySc](uظ+\FNz2][@P;|m14ů{Ayo1]EC(qA>^#GHX6ġX skHpo+Q?<2'Ƒl(P($^@6SL\vs_9ɾ -]VWj8$` `bdD/;{k;>q?&+n9xsH $/r4W%3ת:R AoΣ ΒV{-Dƒ`U T>e="DsLm&Gg(cLs?R 9e;Ęk!;' B# B醗^aFy*sFkjp9悓ALל[tLy&} e$KT+ A!Z7q=)t*Jw0W"S4klYQ{:s}@"FJڔrEjUk#ܒ>2ꈣZ_ME¶a¸U[-3L:ӓͫ+$$"'#~ B,l669LdA` "$& P+j6Ǚ3}pNU~`Tz}뤪:uuo 22c):rbNqUb*>9?ʬD3Zw4]GgG%rsʳ֢ڊJLV2:"SƑg_%1>]F߂%Xd!j"ً qrlׯ}u3Sh(@d*Qڰ_|?ͳt~nm3,yZtu Q2 y I| C!3O ~D`uE pV$ւ晴PїJέb. 0pRKTPd\`AZ" (ϛ6JH|h\TM3?C}޶(TDz햺j&>!,ү;P/i`OR*\`dYf2X#V+ON,^nJ vV0wFDZ! av[C[VM{Q(byHBr~F;`0Y}g%WutQѲh岗+k,-B,ɴ_RS4)Y'u0ĬoO}؅[pl;)w.ES0b}";5#JGLzSd7:`jD*>ljJ,%MHN!Q ⡘IӨOh_J٭ȏ9(zFؾ٤R3$ufխ"6oۤeB%j IDATs؛.U*NZktb9Q h|I)Nǂu;QtIN4kQwn4J^AKV@JB uzfDCD™_X|̾2+kuͽJ [[_~)159ds"LF `hp#Ó8~ 砽\ kzOVD>kX>tH}:IYAKm^ƭpY 0BM27yŏ1RŋTm 'ɹsr^5g~Hñu5s՛==g?ؼy338JƎ-|ccrߏ2K_(>0R NdxZ]fpv?è%yB=@Mh>r j,. bVdIWj@`U\te[o)`ձQAxb7=6 {PP jշ/R\>0Mx^ ^.^-Jq+fxO8rCT].A(i AFi %JT>դI$WHu:_:uB]AiѴ#Ʒ| ^O:h-=J\uTM7፯~5^W`󫮂;64x;V<ʄjw'v+-&1j]d)C̃*K_c.۰yͤ4WԊQ@D\S~S/58g_ ꅦ|G?Gx+. Ї-r~կ_;v/Ʀ3^qew\>9l*=SU|EΗU>Π[f"I8<8Ǔ4]G\RYASdXn=,dū ˡVuP(bU= ZY)P0'[܃BY+X߄6E2J;YT+U 뿉Nj5kuܻbcqDvMu_&~_M]x ك9?|X|9&'pWTob֭?%|S`߮]Db{ݯ+o~8k\^ܻxr\5kގcG?Yl{h>b;o&pW>uxYyb6 J:\!>Y7CRP(E8MԖq34iA.4k+Tfp$y m?)+٥PXkLNL?Uܾ|Ibkccؼi`jz g-o5 Xy>5 )ڇ/R4{WFT&Єz)]u%6㿙t{,j+1˺@$3N&-g7[X=Q.o~C\˱zڵ+æMј?𖷽 @K>BN\P'D0 N/౓2+YJ|.j lde2Mdd Eۺ Zs.DXDibՊ@KT .9ǯ>ĺ5+eN,n,c2z[.EKmX y2d 9L/p }. l"#p|dmp}{ ҂?)xG>/~#tם U.Jܔ.rzlBؓy'>= /xS| _G]6ϙ>;,6?XbN?ÛL H ^YNgsD{^iqTەjP ZhZ"/^N_@Oّ[~zqbE:)DR#yBdfN&|Wz-_%5 B}KxGo߈@q  U>MoO gn<D|6n;G枃,(g" 1}kR:x,Q HB!, ֥OGv֐3ӧ-'^|1l>޾>돲C㱼ذa#ݽ<@<_>y5صkn6!* vLjiQG~, J Lݍ,׋hB֊atwwXhAVڒEow:zퟋaJ ݅Vl2RdػYbK u?r9 z"J*&e}g< ˨$ mæJ<|%KQlowp$_^ryk֠Zi,^JX햛n};w_uM="->w5mn5lp!2 vmj`ֺ2 "\Tdf3]CUKT{AdN*UF\Z6;G[`q~a!c=09WOS#orCme88oT*wR C&'&0q8 LJ8p|1AL~[b"dd Ad:d2hsiW[@]БkCu/}ɠ\yjt'z(tcrjԷj,%N`N 2k{l,Ɖ6Sh'T*Ɲg}`֭8r[<ŏ~?^]#'OV ='<ڵ뾆gl喩JQRl`dhHkϢqWz#ɕ,Az(sFjiu W iFo+OW)R8jvr!Lj56nf* Ivى3=m^)똚֌r;~k/˱uf]=7D-;/iIB++Ĥl=iv0UK$Ak "ԑҨ>fM(n)Zas~; 7Hf-9uH|bkWo@Zv-u7Y2~_/DzՅ={bm$n7qǯ~+0Rz2N'%).fM"jJkof 5 rqDwD-٬$+Ck5ZdZ l"t|@J͠.%}dQ7#qWp⋐9>iYW[h">ؙG1FIBJ.GG£۷<1g|o;|HVTp5k CFl>v (6 CXdwQ (j^\ \mTR|3oHYdz ,Zq"97byؿwq+TNx"y5w:`aY$ըN*N+jbА$Y-Qf*(}e{Ts}'U:z`> mmxӟ_V<(݋\.ŸׇNl߾L7nļyo^,^֭u}v̛7k֬i@$7֫UP5X`9m[i)Ee00SZ xd6>-hZ`iOȠ\&HYBV(df:ȶcl۴)> ?|;~'Taȁ(nFQ:x3[Kcۦ+^I@/=lmڬR9pQ%H^z䆌nӻdtyدJi;=g,0ɅG wlպകl+Gr| z2Yy}?Lͣ80LV?O,Īk?>!+ctdϻR-oEVþ={tmկ+fqa|CI@5 ׳(׉  DPQ}NAisP;5xb Vj'`[Z͋*/IJ)q{ރw]׾ć>@__?^q+q}#҂+_hGCǎQ,111/} xtuªPYrp ζ2k_x+MA:~\~[{d&:2;w5Y clf2hu5)!KH*zr 9Q9Nъ<z e ҋVbALLp.lD\~gXw*{o: r7|x?Aܲmm?d2Yg?55xoW뾊bf8 O}>wZ[T3^wZݷ r-ɓ%űӪ|Nc 4SX%PDTWHgzwƧ\ Ґ4?pp*N)j*Stjvsƶ}j*Ɂ! tNwo{' ﲗş?oX(څ]\m90I<2dEBe/pM3lA&kvHe׬`f EcǟYFViz!5?Z]PվLaqRR6ۍN[=-Wj&5+>XǏ/}iLz{cj*pM742( R`%> j*Y5?i,99N`-l&5s qLlGR :jMYe-8ZB ן$CEuH E1Y;LL<ЊZ̹054B6ŏ~lOEm ӨUkޝ;ѷ-^[nƷUMαÇp×Dj~cbl z_aμ->OJ3ԮkQV1=5=;wCM)wK ğ^7BJc?>ݵ[nƍ_TAIʩ@>ido)dN0;4ҥ;=!a7~=2 zr+bIDEb80jM;x222|0]65GIPP@ YT3yb O^ށ똇ugbDjXԒI|bZVW]Yoviʏ@)m{|iwM%~)mمJ_/ eHEs#)&$H4$[?}h9A||6x}*Ph&poDB"S9FRЧ5 d$& BID2U}| ChvzF ,f)ągHIs;.K!Q5RO=<RBi3Q96 IDAT$&է&4]lo|IoIrVӏӀ.kƕ|*Q/ҿ7L.On~Fhvx2-p=/2ʬDiщico󰰷q:qp$g (m,*S| &0617o _L>Xp19EZDK\LۋY.y 2A!Tec;AQ#^=d*-(rv\?x' bHroKSifbdQITX`o/F=!z}z1B)R 맗&DobbиuatsQn~ߢdZ/]0kvr ȭ״ֆ+Mj#S@AA@[ꔾRiAI2M^eR6Blv%-"U:B%QWMАjy$0.af4]D^CmbiF$Z~ZsJr!=4/50:W<},9W=`IJ{}iS$.v͘>B%tl "u= 2h319~$hooGAka,YwcU<[_K桽%ghcP COQQB9#J//R"Յk!> uGvd@F֑Mп~s7^;8<֖172G\p5&`4fFjRx=Lia],4,9}E1߅~= Iqc3k)!i#ݣ4KR9kZdhʩzdאIAFx^'l1ߝ *C՝ɽޯ.+5_X![m&$R`TdLJjBfS0`ר`&M?@] (BO;f1 QlIsh0oɝn=瞳GP* ^bҥd283!ފb 8-DZ2L:hlG6jzsY\Ckuƽ[qca\яѹX?Oh}<9}GN +:\TBsFVSaTW '(dr) MdO9Ai /ՒSܿ:Y4`.| %WBG#/4}icl?h(=rHNȷ )d|MSƐ Ar>UF`ƷlC@v&3GVى=¼G_8/ؚ˖@!3Bh\Ed3/ËDLJDFBr%K9~XL R9s OW["#4ǂ]GO%- W]}ܙE0,X 6ࡇQVqۅ'ê=(83 l݄) )eAL%doE-U( C֎|Nol"pwƯZY#uQYeˣT)^wD$2[ E&.fO؋LUKBZqt4>`24m`E5z!ȵ !j"v_5!7sYNq-a`@cs.Ic *b;˧ȾTSh0LhS%݂&MrI "IǞ(a@2p˳4BR c>>8z\"<M "P4;PTf) 7عyk?0Ca:NS9i.Kj5PON ? ⊱ TFze ]]ȶHt!vy"08| >LMNaNw'vёI5KpK| tiYj 'եXr -])LV~i~v.tK8kLOM5zq][1pR`8QwPD_ĔF+Z_HrYdvkhaJ٫.h'Bi 80Ճ02R۟AX39U1A,[=V<#ͮ(䙅IA-^hA&^]2:bTjԁũX[ڛ62y o0i}9;MƊM>KZgZHv":٥)N{uy{bmdf= Q(챲M񾋏/(ImXG3Z'gnX.[D QwAGaUpVNBug_B'p1o 'od{7~㥗vbl)rѥ$i!{PdD^\]j17ǰ9"ȯPuWn%/'t'v5`Wp _P9ރtMw 'QµܜəE5=Sݼ7*W/oLSQMLBꋡ\P"J0M^VFg& f]b؆=ݺֈZ*Z`ƞ 2VfHH"qnE4p+oiI f%W,0C*pW̜W%ٚ-'ټX9lwvv'PPU֛R*%})!Ȭۍ%q~K,foG%LqSbiגeL !En⳶P!ٌ ̤I6Q=a74/'_T[}M?΍ Bڷ7SEz$:;M):* 65*@'̆GMuA@lii73%l<o5T8:7;@GdIqnVЙ)^^oASXH~dGHk荄$djr܆XE(06rx> Is>n@$ bb9XU0S+QN#"f\ץק2] >{ZAqNl`)d~ ȜK`ũ<#ZK10~\PQe9,8I`5$qhv݂|GR;;Tװ޳ D.eK+UDV6@ZI!'V!7͖IW¾v @('?} *5><$ID{ߣ2;Q<\c.yo*ФP{I | .Ya."ebeZÓ?E`%q$RTJx2W7ݬ7yucsѥ=f`6f/~˹GqA#L<: :Iޒ#N3N XCȴ^ ;f&m;u"j$@,p/(08=^vyh`$cpVٳ{B󓽙lܐ G4Ggӝ4g'i-rJ@!]$J+ZfNw9aZh8Ȩr`!PAB%3m)uQQ%&IC%Dn2 ;!ܕиMMFQ6RwB Z}41]!١WrXBw7$s7) 3QML23+Nd49)E1]a ҤVsߞOw P-Fk0u4Id"9MIh:F϶E3I# *Br%"/e02h^$|Ḧ́cY 5 7XGr/a->7a" ''$F[q GFQ.v ̲ŚnT &/7tV@ժaީhiD*G{F< L}ٟ~"*ߟ9ұz,^MY^^hМROu$&@I"IA މf!KC Qfb9T $4TOk&>j{yA0Xa0{ʬDdbʭSwuBn*! *nY:YE,Ӊ.LrCV4 lS&Vu`׿%0v܆T\j7/\x. $@6FO^ש!f+cteRBS /|}$S U|T6Dv!Bkԏ"2_Fi }&UAgS3oR}N ff.|QSvJIM+G٫-*uXˋfиq×F燑q fQ U$ȏ:ӂ(rA =2kBz_*G6wmŸ:')" '#|াzUNWv[hqa }YוЊlvCj,Niqm6OG̚4ŧ7dZ⪬i#c_L Vm_"p0h" 뭐S,P zdĝh$|.x䅪$oJMܝbdzZ um̄3SFko"*įm1ۓ~) ?FE73gō/DNKفNb@;]h:W7U1EZQ )m%D$M4. aO7c 8twU$}`gVcl}:IP` h t(ƿZf8Qiq8Nq r;ҺoȆ@kvwƼX@]Qs9h'alV0z-_C&fvq53U[n##g: k)Xk fuS+c4 OxTaEEwcCa@I'׻Xzr~؆ϲ2k'g+ K*xmͿӘ쒻º\afn$#/Go+ / Eڱά4)4CC aF&Q'% LdCocRT?+ \qJ ܣHQM&2qX QMPdXBh-= M1?sqJNx1/]`Kv?431̘C[\;)֒eVieQe_4OGFT:,c*|ZB2}sߏ2+.FA  1z`&`Hsч(eDm}ď99I8/UJ [O^{Ϩ36 4j J}T#1[jYED]\S)>zL*Ѥp^lt7eK863v] tL*fIVI7Y64#MRf35`DC 疩 IDAT *85m%Er\dN o,᱓R@fEJMTH(B^fu"v)mBKPd2xw28 4<. !ͧPR)ެN6M3nsJˊ{w7a074%FܑM=M=@q6۫6^Xy_۩3ɽyѢbdFOSNw_ԉ #j4E㏵Qe9hMBg$f̶3l3t{4M = }>=bC{vӃ8;/z#.YӊUV r1pf>L=?V`63סí@׍+!Y\=yOc;d:׮@y#(lɯM\tw"Âm d!qݤJ[lK;SmdXL(qw_S݀"#+HMl+鱌M83p:yOZ $ʊS4C6HM:P>IK( .s3fiK 'IBc>kxI_8 ǫ^ߠD*icB}#FE[(mũ`~3֤]eV"9 Iw2Xܕ@*ێ+ۉa*1ߺ-dCMQ)"7!897ŋba} D]]]Ι/@h?ozݘs~89 hr]c|)[۫Q̴b:3#+Xam~R'}hG.0naJf q@w2Y 5Gdi,79,,R*kV%mJKtw>mjP?Ɛ},lJh|i(\#C׫ jՙmr ljLv9"%AI/sk^IPwT^sS1h.OZ~eߞe !qzeYv }'Ƨ1wv` SGF0ybmԞhp8m-Eԧ%,dN+_yݭ(o݇”Xm^wnC% `]"֬DH*Ҁ8޲3P#Xhj >Bq&,B!Hk(W< _8ET$I ^*xFp)W?NBH`1~|GD U$H\/|Ka+ݧs!r3Ow5\Ȱz!K2k|*j/15ZؕHjˤ1s?Ȋqf5B7 }4%MI!c|&Hװ+fR Cnn, cS49U 2ۉeV"k]I!j)WASi{vCO ȶ/oC8o؍01 ]Xu8ܕ6YQDcq,7=~vHH>lXSȠ*6 `%]-lh{3.J!?ĩ7V"XV kv(W ^bpH5q$X'#T8%)k$PeiJIY轤fI1UZz#!J}B'1 v}z:.Yi *lIX[Dh(\R![1NqüE[jC3^ԧ)ȱl  vG lㅤleq`Ƹ1ea{#o?&ۈ>A2CqzƪmpY a[=\ ¯߃\O؎CxX52E<)s)ym-hJU̢czA;^,iAizxJV`nz+ KA: B;\Ʊ0Zi4٦h_40OBnTw8{<^/.BD { yi(IJdJ#e)n)oQݕ)$žۓ$o&9CA >ڟ4="_FiZ20.cW58H@ADtf0/3"i336랢=+IxdF ρ{:R`c %/^ۂ]ksM`F.ʺ]_ cH~&HbM=DB {\|A$t.8+ϮʝXDG$&3MU%!wb eYEwCUB6cmEuKqΊndMIg6Q} -]iNQ*`C(WkXtIXx2uLt"t,'_@@Du7<]E*@."n5&x qзrԥJL. )}gӔL'-/!α1sg=0Iwv.J {I/,5<ǀ9ɖZX#~W p6%D%Tx]H,A >nvH;6k6C+~ Tt3FߙaIsпY`F76fϜM5As4I#ᛋ7c$ wZmi!ݪ;i.R݀HZD\iP.-;"wt -"jeLڡ}zSZ]sV:6@7(.?:}ɻ_M[!a}(֬Úz ?#dEw" ߿t+c.O>Dw[~5(;±<7ׅҤ@kVR&UDPm?j}8ss!Uv@ZGh8awݭE0ahdS)5RA߽L]J; m^;v.gBbo!!.q`6GFRMThL P ^nST‹+" tH\)^Mm TNk׌Yv" ayPZ~O jy|_ıcP)b!)e11U,x xaxp?B;wbj1LOȁQ=>G!߂yW 瞇saO 얭8?[tU؍ (`NpILKLTMUmdk#>k"h.d>t+rImKJJIFƨB@)(7ᢄ`HcIYh ąL 8nK1m !ܽ>mj!xy1 8Y|>0͍=xMMlcng/fgN Po*$s|j,"*$xMUQ_iK_1å@$|¦tjWrA;f^ < vv1 0I{P[}6~ɥxds`?V&Kjc4}Vt-[O7] F ˖AFq9 ђ:Z%"w;쿸n<}#JmYܴeGNLbNtb.^߇6DڕX?Ɓ3J>yd);X,?Diwlj\[g=cU$w"&*mQj nWIT:kWHy؁5qZArNw?dY27Pͳ !C9&{Wo7YyW NLa:>V=Fdֻfw1 q ٨cTȜoB^1 q"&(qW{嚼Z?y7~Ќ57#ZS'jgT0k}LlBkx/L^5@˴ڐp!铑!c^Ee>27u,[c*^2;:Q.U0 ظ|~;;rsz?}ظ<#wbd^uglĪ>#SرN؂z]`%@CR-P _rowSܽO`=DwKktᮽch[0vl&o|eS9KWG/_KK/kl|_¥KjQ|#Xq#>`}gM;|oÖh֪s{Ɖcp׾ۨYidKWǿ5|_‚KK/ŕ}6j5(: k iR蕨]VdqR봊8@/bKeEjMF2L?I*!LҘ|10i5^a=CmwP>'~Mp%WM[.mD$m&%yA3DK<@f?d`ܧ͕}+nbrz 'm&6Q3G 00>`:F oyj')!KjH7la"@l7G"Y!K54Nw6Y Z"5dss[b;hkŸwMc͊814&EO9}6#pd^lVG Z f7sEe)\x,ڸOTJx(/𢧝 뗣ذF.ۂڒ5X-hw4yBT*J*MR.Vawa٪UXnvnقB.ċ=)laRmЃ ^&ۭ F[přbsxJd9Ҫ.EhBJyLǧZԯ^>jdScX(䪕TZTBXfC@XOTdT Q知/a,ԿVE)f+g j'UrNmtkD3H8XBJX g-0Y% [d0%ɳ`woLgKeycn98V(41) c>s&\ :ءQC/ >inv"R|Ju`no;jZZȣV&ׇW]$T*5L09>|=ُ߹D::P*MR~ޖA{pyಋV-B8^,wIr6`cmj{sSiZBzo NH 4BI`\ɖ%Yu$?Ξ=[fvWν}ٙ3<<>d~ fNVjX[Da!CE8~ۛw,F_o/}uk/fqٳmSg&PsO>%372rX.0e*`m6M< ϳ`ƪ7هƨJFUVrUa֭L6K]'Np]ᅲ0}.w(>={}3EenP-[<.;-  Oe8o]5-i0ٌTd;iB׏KC,(v˒dqm͝f/`Vv _b[ʹUɪOJeU-o#L1` !|ɮst4$9#IˤhPv.Qiy(A<&U gf;؇gIGSғzץ42 TV2c1'_K}0t?%9815R +/0ӎ1xܡY;Dbv%Ţ/џBA$$/aƘtn;c\,>{!Zc΃Xu)-A o:5\Dž!lhun{~-/f\k"_5O}S)o RFAFџd%wX7_gז-@{m/˴9s=$kky Liy9cǍc畧b;osŜw}6W3c8z};wrn@CPT\7o!\sDQ~3¹|/W^޺-M=VkW=59R!rw/*=Mfr|Q@ndJpKlYi5'yYP*S`^TY>8MyoZ {$ |Mz(2[Yh|Ɋ0yiq!{_Yrd5kYϸڛ:iŕy+#c҆tB-ĦܽI(tQ~$\b&7c$sՖ1[?{dM>NN9,]Gcd9-Vo|s<gGC;DYg̮CIa2,M~$@kOiew=W_xX?q-LvM4|*#LS=~5qvO˅fVUs893iۄ{S>u|^vi ?1`0ũJhhHE@& kR)^xazǦ3$?sGqe:>^K.86[GkK3,Ag'P3c׊7^6eɼW匿-3))+oc %ߠSPX=-[ǍFZilGsYgS\RJqY-R巵FQ0lHnNqT*E~AÆN#ӝ|\y@3ۙ>̭>(@9Ʊʝ4G,|owi KRk@/ZJTL0wn89?gR d\ pʞHfJ$j9,qiRڙ`!o,^$)OI%MErbkV)]˯,D5NY+K.<]HTp5\ZMzHd:[ԟ#9 ̵0wɕKl s5)ԨcMHubyڹ࿾~3֭\ﺛaGX `i'W \g{;N3)U{T+V27hSҝp,ýPuCDLjbЀ}rwl+]f2k5T%fw dTa,!b [+G] ]3-+?z@FX2]&̅# fÝ)߿*RIGٌyκnIHRFS<ն,Uů N>/̨n2D]p\|=LYH^M.$KKq&2Yhkα7]P| _R~%r: 9'L''%/$96KwJE1C4) QxҀҚ  2"Xo8CQҽ\D^XAmS+"0lDpT"IOOA* `hN&T!P^[ƙ@DCaij i9 N*Ghq CAG[];vO _$Ķfkk9-Yg;͏2EL5 vޙ-̜ؽm+[6 .2`V Y|KpilsȚ&_?)RYd D.L= -fީr#+PWi96gpܶb{FW?!,cnvY%D:wɮh*Vk:3/l Q 4Vܔ4j.DHN\ jwGKQq1'M6B`>;s%WNx$C(SslDYAڌ+'-?d:U=3i$:!ma!أ%WJÚH[Nb_ZGNHc&b&l!cW>]?M^_sȚP^OMV&8qY- rv n|Q}eh'D.EN#?/% M[pl9Ɇ]4#G05Gj 'ڵȑ>.:$(عa5巷 GPJHWAci>72b|5SNdˆuf DlY 2{oBoʷSN~NM69J4VA^zXrn`K__[Bow7;7obޢoKr+zղ8^Zuңd=4hxb3ֻ(lPF_Z *S7U"7 YH:& ԥ519\@[^#|$TyV <ثm{Ǻd;TGg怰I(lI ,*1tVx4+YrYd#BT(!4Z, Kr0j֬G)}W+ډf,ߏ[4qeĄ̈̄=2sV\*6 t?)lUcחhxNV  Ofr^+6:akH0^:/ 鿳KϬ>s&$|ya5Fü;} g|)]wx>46a%$ tHXeT~74 "ҙC"Hʷhm&sw`#S&. "LI O'MuC>iksR>4':dtK<`I aNg ^3w_`g ]w'L= m^4ӜI)b5z75g,W8M==eeڱ_w-U3O<_]p^qG׿ETSCB!زq#oЀ[fΕ_~|N[1< <@,elX[:5kр[ロ:%]?e:x_?47n4@YY9_W1k%߷g/?9ee|f w|IC͖2 R˗ӟdн P(.O:8?/<,aB77-[ƅ-cݺa5ܪN^~) .ble%Oq& Ҳ2.W5keۛ㲛2}`n瞺}tܱ};_ͪj0gxC .ĕ_s?E3Çmsƍk$_~>x > t߻L]f |78gf'2~KK٧26gr|mp_K#QPD)b^|ӀN $Mftm~m ]"ۂ֒4r4Teb+}ͣ^ KJHȏ/$Hӿc;T@[+b4cǒ֍im@^4 ΙGQ쨣[ qܤټo9S ZZ D] |UOgZ.ɐ4h̀q\b'Οc6ْc)G~etn6j]6͙;{Ѿ/IӼjmN:H4J|`yoSN=7\mZ~gl955q|K3Id(U~O6[n]}5{Uý,Jok=:cr]sp6\\t8%TEAsɺ_LZ_AfJehH0飪<Mӈ'R ͭߊ2w44nIOw/tTB(7$E(#6~U$v`L(*nnǨp?'.NC!FOHbL;*9YXDg|7z,‘ (75s 5ǃJpUAZ5 bxAQ|]=+]>kk)Gn6b}-M+[5 6aWrMVݦ鄤p+ɝ7S% `„+)+R$W[VQ5^fwߡP)S'̟o:{\yQq7`ͪUt R)ݿD"aT^zTfs h /D#sת~KG׳~tvvf!FeE /4d%GKezMWoPxG;W~[ܱø[-֯gڵtvvsvvΩtw~Vw6>r+m9uT'd3w.hP(dctwn #K"+U~_p`Rى=T5n͂J.VrpǞ6K mtq8%4Dwt'˚C (gtY $xhj(Jo 1#4s*Ѽ< AzFϝOgU =qbJRw6tNcIN]d\gw`ZU:lԬ};ːLr_WaD~8Ȱ(Z:rZ5,m؉F0jR gN"JLfL bYS70@|:hl ߸hK sa8h]| FMYU|hڙ\]HvA5jFV=Q ׯTzuqL6tz=wg}5Ҝsə ,<!;; FG;fk;0'KEq}c aӴkJa@0>뉧hw$<D|& 0ݷp$waYg0o:c>xgmme'rәTSCY0ˎc27546+*›XM 4)@ոj ;t.%DYFn~*S]Ue=0aK+~ eQttvHEAF`Æ |Zݰ P]m;FWW}tPN iZ9ؿo6}:;c ,dW2h+'x"55&AQIRhll"Sύ 4ц *vW~xv_>m6 qڜQMznJq4tȗ!势8kltHPihsL(eOŌ" T*E*O 4T*:uwC(&?,vJQ6CGzToQ҂f'|& M4@kNԷ|fLT.AKasު`ϬI"!(缱V^bŊhƌ4y~[#!`&\j/{|d 0VO҃6ˊ6%Lγz%|tmCm7Nh{bXW?3ʉo_'.CIh㙂¼%y%?Q!b6fN @p(B{kGp!B0%3|4ՑatzIC z)koc-t B P'q#=E'L3(ok܋Zuo|1|BH %?Lߪ~UTT4seTwXV =P\XHY;t׃7Qi*dHA%3ujA!BHgr#j5"wmimdb+}+M젙p;=;w @~Ag{._C<@L9--۳qdk?>TmH㖺n(!Odw@s!Dat] dݹY:h$p] o{'wOp}= Q-}XG3N U@+}<[c8/WP];wҬfAA趹~znÇgn--mz8#?\ʫ64Kdl}MMO_a~ pWN#k ]Nh˕ SK粡2_[P/Q"ή,Ζx2@XE#t MGOPDdi_new+mjgGLr Ͼ2Pp8,M9sػg7\}U.@*BU8mB8,&N޽{TWݿ'4C7v;w]7Y~mܱh+H]e#G8?|)eqstٳkJhf wlWf_[r%r 'X{:mvۼ٤_It 4iL8ŗ^rѯYj&vE!k/AUMD\2\ ;Db 0q: Ii/B3AZ v}wA*q~zzBX{RM âR '}tíR b1z ȋJA`rJy#Q&颻o4L-V`{;=G2$4)k;Bf,0B|gA#dȹ e`x d>&LU)Kv4MfP-<^c>l< F!Lc0sxElE2ds3rGv#x+eeW Bgp%C* X*iD<͛Ze޳k'G[[ʪjN]|k?Tk IDATWǺ>0jUTpEt)ȩ& 2 ?yJ֖fAx=p7~~687o!Xir 2wZMYUU… )ۦk| J N9EJȹk=6(2QA?Kf+9b_/]w(!z(` #Chh2AqZ̔@|8M#1~t Z:IeBT&Q%l,9 A*AP):+6PeѸIOo,|'ami4;X]$ZqsJHa֭YSZ ~9y9^w3jgp"ƎO_o/׭姖yYɣf}C}̳e~r2̳ܿ`q\+?ByGصu >3キ'gcȦ ~/OFA8`?O%M 9n HlE5{BsS^YC6@f6^ &딇XnJbec.MId7k >oJUij2j;z=v*K.f 9?}Y>Ypin{ .pEp!#F|wL],yۖk/S3u*=ݬZ '2oIlgqiA%G`xݵ|LwNW?B|k]'8}"Ǝ|0zilh`֭9twsEq…9RM!=U5@d˿̔SfL88&;n$ }}464֭[ h6=ʮ]; *}G?/g69; jM#Q޻悋.t?=(|-pu\v~9U~7r oBi)[l>$b.WC_ڋjv 0eߐ;}fuowwEgg% ֍;i#/MvqE9s'Tcϧ7X]$%G^Q ͍Q3G6e6ldN8VlQMb.Σj8 ed !2 у~B}m-HO=˾sy;׮2 ~b$q_<>q4~/yŋ_ᱻd] +翿~%&[$Jq3 yظC޲~S ӹd'r⩧rw˯ÐSB4}\5 /[Z&/*53,I$CS ^8k8'yt ȍ/MWDKɺ,OV%Z @/xy`h9Ya=H7;Vj\8jX9كU_M:DZ/Nyw LO˟  ߽b|ooi zjt|UZz)XsbZt, >mcMLW_eO xW~Ѓ6Jι&_ZRTτ"hrVzrrS'v@_vHd͹u^yȢb~ߜt) iM4ӿ5k3cKR`&Qtdvw ̈RhG%10@aa!HZZד_@qY맳0>LW_lh[RCki?đ^zZ5t HDAi#Wt5H:Ao좽ْUS"}KM;555Q=tg-λR֛- B\|RV܉imWwށ8Ä/o};xe+22.R'T@𕫮WwƵI&SKwgK=A3+#uŐSf&o9DQEdNmF2Ӭ0qemf&͝vEF y=fIT]wVqif[6žC|pZMU:m>)eqoّ0fC -Ёcgתr.*֛Ym7LZRq4(ms\5}d;Cg73ȲB˖a +-E"/?H2FA^Xyt4PZZB:"(D"AKC+*(@ ).@QXj9o0-} >-R$E|j{ ({_;A!AĴ R)C-t嗗u+o> ://]w=$jj3jX8uZE4V&gݿڽ{pWsrW;QV7ٙZנͳ:|p~{]8krjVpqXcͺK}:;:RSצ!ğmW.4`Ձ07K(PYkvBIiܵS@Ѥc!PfBVEC]7!kjWZqcI-Ea Nԉ=L2>s/Q( H  )N\BxXi^Jlv ݴ"M\hu2,<53fwcl5}}9M#:,oOg<- ={=+ kSWdXӧmȢ~L`mkӜUّuN>3O?ڵ8j[?fdIG1]|jmP{y2"CeB)kؓ,ȣFC6Hfܖ wC9CHH?Xi) s+NLT@0H&д34 44=]@1Q2p9rvE=i2I-E@ttJGzzZL3B5vS^OJ?/,/! h9dz(;9{E%شɒR1rT9`iH&<}|k鷖ʻd>PFV homeJOp˵P_W Ҽc)IrU:n5|=Hpg{挼}L" ' [&x\8WSq{e֔ff&*m2"_ɋTB]/ .;mPR r;3[W-9/A7Ɵ^='̛Gifm6nݼ7,ٔ9bsnCK/ӕ}W._˵w˚@"C@Mݯidω1۷Kelu؅xlPeZAG#pXr?5ʤ(SbW9q<nv~M XSuL%!aCdE6_;Ts!e`D~M`X4 ezAuY4҄\jH Io 諯E3L[)}TPDA[?{^}O% /%oXVnT=d*͎E%1{-1 tڲT*-![ٳur+uѼ<wM'!37^Z۶s&>_t2uoEܨb…wE_2j?FkGz [4=Ns Tf=7L ,N6>8(DyaRA?rKfdHb*!U]$y_Ga츹E+9\h9%Ҝ {(wdzְXp:5_ hkkyfr,&f ",g/wk_J(/i್* RV6zr9O=Jӎ+dܚ{KɫSBjgxjS*9,7N&]X+Ln#,5qSV\e=Tۋ`}bt#DU[ezW#RI4-i44h̷K44)PMѵoyIHj) R k l鯣!}tiDDtG&NџJ^LIl=@?^+=\TIOWw~˱np]J%Pwp!]]wɥ\Jt# <دڥӻT*ʷwO?%M싅MJ,jpa-m*~fʣ%^M(υK4% u1rȈ [0>~M3NSJX`dQaWdׄS^+_vU39BC5Mv5{)3 gcND=H2{mu˥냏vBao1b`i ꥆf*P1VYIgs@~Ufen.ݓ! n_*t+:[4EW.LٿG!l~@~z5LiDp@&0JM" @J@ @r9}|oMA+i Q̝M4-#lNedT| ?4USǠ3.m;x!#[YւGipb]d yg#jf0;t]4Mxη828k??UǮs%L t*G%.$&IXnC>Ē6j@T97|֡'qʔ {%v?l,V@8£HerM3I0cV~O6%i4A3{r3C;kT VHpUar>(fAϥ^6ۣaoJQ>Fא5O8R)w>\U~h mcK1q}/(#QR*\OLTTT /8C44YcfU9ipɈt=/b(h@4@! FylI5JOGє8oE{H^qBA8&/@ 3 tmQFw1kg02cKwpY<)q%p=fl0YPľF5c_쇪)K"IM@5$OLߥ 7VҲ|.OB6Os 3Lܼic3o(wI~[evP>FRf&]+u9pM|N[,q%+ԀeNpp'E5}$S6s=INړg!k/+ K4`vGdM69PEք\݌X`Y}Z0q(< wh8a/三#S^9`>6{$(p D8BE/ݽ=7R7r  ?џ#?I4U$Z:k_ZHJF&  O нdɆ6GhAd.g"CM3Qpu hv\z] GEv;^Gl,Td ;x*=r%[YNGPcS>2SpsXd'Ú{-9Y"lo]؅n^GV^$+] PY9$OW%$&@clM_DlWC HfDC[7F(y4mtn>׶uБ2(Mq~-qQ :[̾$Ͽd-Bvs'M#\>`q)r$Gl8L(evGV`v5:b!1q ဠ^{>{ =ͶXɘ$1p'uT-rEFs aɐf {)QTku-кV %vl @It v-74>֕Lj6loy6R|c:0$m~lVIJC!sBɈ$P@){ILBIireSj>;Be˫gIR^ʭ˂kT 4 IDATU3~He uYe`!DE{b߾}4I~nLIa$Y5Ŵ5QXV–fv#=ݿ' qBdy %%OJ$ei(9[M>Ct#E}33Jq^}/7 8%J^ةpܖS4 |Zxv"HRɐW\B-et햢1)l ;yIx`K:9G#漂/gL.nV^6 侠KP}9} MHSx;Pk:lݲ\sT5O4{xee' pp'S=no&?̴D?}dt*Hq!pnRXitV'? nȖNj`}NGo}m+Q ֶRy1I\江 6*Չ_΍rblE*/&p"Y29JS2N"CFy$C6iNPB)Dȋo,(|m+ȏ9^/+ݱ~ PZ[52zDDDWBzQFuwIh|F\pkU%)Rø^&Y-< i+Mr\ni>N`eW]J%%N*:k ,g@cK[rٕҮ|-TWK6'>y xz#AǘրB8`@ S[r0dV~O_cۦW|ߒR`ƍv*00` _ozoNÅ]{N_*uǕH$}6 8HD0`@lXN()&ŒL&9Y4GY% Q ;+|a֙C&د kNSXT V7r%4GsZQf|ȉ'I`o*rL2A8 4EuX}*˱aW#c q۵_ǐ~UN$FQQN* Mh޷Nj~C4d{_l۟mBY4d Gԡ;ލH#V㍿Ec3auصn j+pڻPJ#cV/4Hd"uuXÞӕ|ۺw$=F gBV-"%PF>{4վ?`Yc-EoiB4*OuA/C o,~"v3@uh&Ñȕ6jxoc% ݼ QT1kǮ:"spkܼsY#G~(-xc.>bm݊/6:::1pՓ'N<GG{;jjj~!}=QgOXgW7Bic ڍsْ,;WBL\,KF(?edSR~ޒĜAklr6jCm~KM y4wAU<ֽ?P F۱\[,ȥ6XiOq&ɡܷ5- >A(|a؇Yzw Kd=2 'c;<:/2YVFuX@%$4Rc[VL@NpG3haI0Ą-ma$mb|Q:BբLuY}&rB-Z,]$9xGh9N,xc>.ESN?G dOXnRee=wcΜ9kŭ7ߜ}L͘ap㪭gK(ӵd_ævVsG Yh'C 0s2C:1NHć-ۮ뵙[-[\ m 1R:79V-,V{dQ-NS'IE=H^x~E +R1Eh羼mbC^+JcI3GB3,̊Z/ݝ/T yk`M|,wQb;izEw4p]PlKB~usxWf.RQ٭vm(>8LG2C Îz 3ys^1|- h[[;qa)m1c"N~OJ3grp1cX~\b׶6ɓ9x ;z4G2\zMoph-Cg0Y Y`9xX&6^V7yw&D5/av]@Ux/Y; ҆cĚ1$Ju;X&{87v ۱T>! r7 Lܛ2nR5"] z͵"ӭժ=0x 0$P2"V=YdOaoͤ1IWAOo'Rŷ6,-Ƿ֏%+/jhB*Zk$ߪZ5%ϑ|G ;/T|ܘu3q[yxWvnyo"ZR"A|Ƽ_Gww#L&{\^#kwP'9o\x! p57 KhHv.MZfuW_ ǎhԚ1K)m^JlÌPIXA T_ ŧRȜRlav7'[#"\4!hŻ#@p5ʪi~A$_K;A J%qqX>C=j!׏L&Ý'?O/ƞ=+z{c-?`.Rٳ!eX83s>J(B$נAq'3p;7.Ys^{ 'Oƽ݇< V^T2QG#Յ%K>pUpaә R,l#|d</[gdxKi jMv e}Y:WM6{i>UBd/jv/:S:u#)T(q1^->fYRY$}EQ46^س$U6UG)v1- !uw>85N>ZWbg 8N]qӮC:4fE:M +hc)h2~1qӇD"ENEϜiD6p)1#ݻ6~q9&5Qb6V_l+!{@^긎;檤|Z5Z/SO}}'Ti쬬 O=fr3{ gJֹQ$W!3/·R]Lל ɗFl[2 TiC}O"8!ݵH l|#Ra1_24~ =ςdkF-jY s(_{eYᴌkOf. y@<+t;hڝ!1xZDa,l[b/quԏ݅fϿ-ݞS@)\u&g\9ncUMa+aK>Oiq[C%__v=hM~ajJ,)4DW&D|nL~!]w7>099WR+$]cb?]qM%0#zD/׫B-W.V"5zĪ mI PBX6`5۳;mt/txXV;$˨N2D:TU1QH,㲆 MẔxN Ŏm2 La <@i]52a/ !?K4WH%"ZGeA\OfXE߸;\)> vXUX]}Apuj7kb_ J^摈wOzr [! n*IwPSW &7+_5GcIasJ̖jP1%_IkEy Buh--nMį.884z&)b"a%_ǯB5sdL˷I):q_7LLWE#dD<q2CXёXx˪YJ¨,W7==7K'+ ^PzuBuj;Tʺ8e}eWC5X+%0u4h* ?ptP SqOM]2.Ί=i4.Uo|ypdUpK`"Z)$fRCWgt@N<V;Xb/NU6R??)#KIC`лYYSz۟J.ISB1ʈSĎz^5cqcpMTo?KXÎX_{+ y2$5dF?Ld*$Ika[;N|xmQVCHMr5^:iUxxezU rkW\XiExnLtHYTczhx+:y쁶7;{;dȯI-4 ` tu^ZI&!sY|<, `2Itv_5aŇZ$B5L`RОӘ(M·"^x :JfKƾ96F 0ER*XnV!T}EN(,I-$/!da#HwT{U:@Yţizo _飦PzeBD-\'6"3E噉xhb]Usމ!mQ*lnM3Ix0lt}mvƨd} J X( #_ ɐq|mNH6GVCz;M K*DS3i3EJ'1j׬Zv`=zM 4 t;X$C"]S!Exv1ɈL6hOItz$[%{++aЖfe13L/A^z>NBvdUXCبz/Κ.3t9XٞeG%'fXשo~kTb&U#E|n,b3+"0(Ҧ?n{imMcv/_'__[ %o|] = tX@uy52{Zq`Lf$^ U{扈؀؇kA1ҝ:9kT)#H("$[1{1'EhJWpCjt$rdE͇qbK6-.b G*`W6CTQiur4/1=g %X`oXsddMr‚e?]< saw &|(F;ƙ%lXRYn@c1ăZ|"H0g+DQ(7X55af6_`W姴du;I._tv?KEC>lhIHd-~ U&Bi<LST[ҽKO z)5 kSXG5;+*q Drm=ҟşa{KN"ȁ:֬G"4Yۊ{7ha՚@4BV@ cƝhXU`M1_:X-hqPj4i q|%{v4'QZDxhj݆f^ MFim02yMpe$C!!g.Us< z w{W%M^tY {`\gLg<3ԅ/v牁-hY($nX7/xP~XVs* Obd՞'7t0$O{P’Xh8[;X2nd?ZͧeSJ@gs\ UrGq8][[],%j Q 17 ˰gzlY1-;ƹ[.unGe KNaLѺTh3.] >yHR :ʯѓF:LucPv[FYg'TA*PߴbtTP4m DK&0+GgT6@ AL4 ЕrPz۶`Q @{bOb/&Ge(t|샨լg"WԬ\8J;LmYꟶ:Mc \q6ִK'WEdMwτZf9};X'wڲ!\s~V;QnTnJ'I*}$7r!lB5*J`6EJhq.äBUU8kGA{G҂'{,o#/Wtϱi=7Xb@3ɧ_? uhu~=w篟zy}or yӍ7 bt*zp!1L"O(N8v R465eϡ v >cUp/?<cn@KK x1^yqؘ#Ϳ-Z <9SSZ4??'z=?Fy~z͑n[zUqL'VZjl9E3x֨ ~U&D^oPGM] J8PD(kK145p.f--Bkw8> ,ahTyP\[t8ti69z[k1p8dg:Q˪e(`5(;hOw6T}!8pI&#T  k*O&hIHls19@wQӡ k891P.6y^`hwT\"T2efKS)y,Ƴ9/&G~+\֤Dpp,*gge}?tR'.$`pӯnŖ͛p555pam;'pOo}_:3w|01i$+;>Ut=Ì'b_)SPTTd2)<xr8(\u5D"xŗ.Xg~ᜬDKx?OO/S୅ dH3u== o&aKJ(P)YtCp; f92,/sŏeyҕJ!8lkc L7[7<0; -GY}au(;ߌY+Ci])* Þb8bY.v`H?v}v.لҿw,EhnO 2v#+"`\Qɱb{ DdX"&}Pt5i/ngA.>ǫtsJ-}U66Qe;r\\8[vt4 Џ> _'L & ߍ kh H S L NS5? 9xCؑ; > \J2d,&/s(1bh'ڱZ[u1wrge 8_÷vuu!!!H N;86<%Ituu.f?fw/,_;L 6 7E{nۻ+X{۰aH&S1b1ĺb_<.b]¾E^&ƢP<})d25hHbhnǬYe}lNdZZw\hiޏW_}W\q%B&M:FƋ/@O,)aC4%$TUK ] gFUxlѭ&tEKW&g{U!O|~[;Zi4u $7لشl5D_Cx~Mފ4L8o؍v x8!0 K66p$S ʿ}>Ѝupi(SJtg{&t $F m4mJok{S(8! SX8^Env]%iw5;6 moh諽*a[o3!Uo ̫|t[ GB멞a>jOk%HHxx H;Pw@]G@0b{$6Jγf&C1l5kP D"d\xExǐL&30mTIc jQGX,-[`iӰO ޿֬AAV3pgkg+K/vyx$(yKF[4-Ј)D E힄3c.<ޛY )ݙlߎBe -)t4 d#FP;`~{Q/Fpw7jNtg K _2 H \H1n@lL9=/,ÀA ^U+pKP6Fm mv- :b*+hJfojaVc8 +!!;֞ZɈ ]q]vA[ם+eaIt|stu7G4jG|hQ>ΰn 'R_^icU?Lϓ!}Ҡ^ = l=je.Y1QM6`w`yXhٿ_ Gy97xb-Gʆ1sq5hiiA< eƹd ؼe\‘ЖJ%J=Btqꎷ[fx">[M-]*B!R)q@S-*H'5H(-+Âoh21j𛐈̈́MؒB ΍1cAQ:zH;4%_YP"CzQ.3!2yr4q`7lCŁ(Z 3 @zvTL cGAQTxeF#sfDU`U'c+s.X` 3c2ik.gEt`- e۱顿[Ǡb#ds*KXt=Gxo:TC$ȐL ׉zL ^>@Af~r*M5NW2D:{`:&0&)cjxq-A(zxteBMʭU]BW$ D +3RTG+D+>Ϫ3eWQZ~_w4r2pTP5wuLvV$ngs?ߺr|ǘؾm[:_;lz4 (5ٹ#P9M 1t0\v׿aZ@<%^K.4C pYgLI{/>hŠ>Cf& cʔ)w/[~C1i/[`C e_9F&3YY ŷ/s_{M?g{._=wKN-ꎑ%MR!5K褂zt'&Aok"YYq۷ϙ[a 0mmG^}̛;p/{}x*\~G(,Ǖ_yE;vT86oقp88v؎㏟ϗ-0 Κa\`gܹxs|1OPWOwibEtB#e.rCR7)oR>PJ>Xƾfhۨj^WzwB#+*"E5{7nBs(3OBGQ9;a*f<X{*"H3(-n8/|)11o?0DK,.L=|;F0h`:2qO1IؿaX݆r$p̈jFdPVZju%ֻH߅i :)~Sg"ѥS/ ]=j+ b|RϐGl-ݏgۯ@G0)-)CW큍Ms`פz&YQ0 ]Ma?! !Qo/YTjm;O?3^#ܱ+ZY (Nr)2`tZS4>,]ww|BjXg'!s4EG{cHgg'*˕FQ c\`}$IIoǻo>;e 6_ \* 8;iz$V|ϧ >c"x)~a3Gy$jYO# T*( q,wđhj)1(Dl2$x 5:1=1'$L_L=@rI/͇:eN)6x,:D;s_QRS␃%aۋ'->i Ɓ;p`6TT0Sq#oâ7Eɪhh! jV`hb vNtQ/y>ځݨ pRQ2SJl Aä>ux~z7n|  Gc2x<`!ξb0Sf h %xxyHXT1MS_~|u7ҫI[ᝈ)H C#Dn XYR=l,lQ Ebp@K{nIJE5U "\hYND멟cm&F2 )i" Q)j9>E4tX{ڞ Z@:o}6y$L8[ld y}ض G}Bk غe-J+&2q2Ι5 Aab#q:P⨣mފKM\rᅸ Cyy9&vX{ ^*Y.$St2of?L*ݽ>*3ubM%OISlJ'XIy;P/uw @T| a2}:@k Μ. O雜0fD\yub~q8^}Uc+DB+wo>싲L|V360Z&/ #ڶJ^W_-B9cƎ 3gbgaoCN9#Gƣ?Lq/v|;@SS#SO1cZ_[ gqr*ƌf~֬^{.;oc1-/Xjb13&NIJK$B"@/HZNU? Xjcpu?[ ,k'x܏o ]wqTz/?$<~8:TMdJfm">O*r,|J.T IDAT2mp;$KI͍zcatSAAꋐ׎O^}$BJ{I)%T|'F&Th" ^}5D[6m܌={vSJ˗M7[n%]ϝxk׮<-]"D" ƥ}gϚx)Gp/4tjcWˈ>dLy5h*1!,rFZFu2[Oys9C (U"$q򥤬 w=8vlތ@0ʚA&Fq8;y n_q)`􄉸ƟLn_mF\z ށyL6wĻo{@2/1˯/apʹy(=,y2}F??ǺZeu5Y}yV|Ly">z- Y. A޿<W^ >8v扨w߅˖^s *֖Ǻ><[x0ȣ0jaf?X_~ WCGT3OD&X'ZDZ3Nćo#}{L93=ŪPQ]o]} +J\;}+a鶎| JJKԃg WQ@b@u{ghC]?37%zb<y(9., z!{m|0.U1pcBmGG M2II2j.9&yB&&la!}Bv12"Gzc%.1^XPm_( nZʈ_t )-ʔzEؐC63}vḼ?'١瑭tָ+s(V4iAeJgAAQlM2^yz!cf0 `j8 V߉cc=ЌQCO-® 1&GAu0wW6YSL&YG#G`hӂԪVUDDg&ޢϱֺT.9s ˣ26%D8huH__~: H>uu]۶a~Qӓs߾n#NF1s.ǝt2**QQY(*.Vڦ| B||]Ye%JJ77- 05.]䱤Gaj|S><̺R}ywDn}O†(Hc.` 5ضt/-:DM{rL.5q'3^liD ՝JsFu%)J4S˯.t[+-P Jꤢ=!OCE#->2B9HCq*E#GiO8xdƇۡ͋M1Gj[ɰnk: D dVZ9pMD Oj} v Ks!_%DbhBaDZA3xt;`[C4Ũ[PQd*)cHg`040`( c]E"X?#Н`tu)NB5:UDJCAݝD$Z#᝵)h.VdmZb1ٷ p#`[oT g^x!"tنU˖\q% ZQZVy[~=0@CF Gg{۴zI^yiol  sgaꌙxCw<˾}#aDKJvyqChnjBiy>zWT঻w_ L$;įxF?\r$8[B(Q'@;GNv嗢by6ٵe^Q +"I¹f; }LI8{2#`QJ{#"XPVD-t\~:MJ/U p;Qjkœ }!'$bGwg椱a?Ɍ{4xŚ :`4zvD=τDIh4醑4kRB!y )h/1Q&%'ɶdF )loNw6Aځ.Ļ38rH&ǫ~TGJKt,]@b)1q9a$FO#MF!H1ףÆ+.F}s+S')9thOt%UW`W&4 A[I1 BuY9cؼj$-AMIjˋAZ|l~ ^}TvmۊΎ?'u6,Z' "Otv%߻ W\CL8(eV/_S=X42wIسsg>[j%<qtJˑ]  %^)S澑=eNǥ&ztR?P1Wcpg?s6:]d2{\nIBQ U` 'sî={ e.$Yv>\}H&'Wčx?"Dw/kB(RgoZ 3Ǟ=eQۉM{c쥷"8"J`yZLX@J_#"["'OnXεn'CSZ/\6.ԤQ'>GmyB1TȜ琣*.5YtȳA'}~kɏ2;_,IQX38+0?*,A%zH H XFq{%eL6M%Q`1凞< 0HM[!zP$*\LwJD1Cf7m-ݩqD?fPeeexNŔDq doAuO NO} .rHF4A8Z@2ڵȬY܄؈qhi)M=@,;:Q`iǠv`4ݎsW?2GNƊK4 qP[Ě$Bv{XDgTԟ=N!O =.]mFQ-0SG{QjC%BGn'B.R6SY!Ë FFAcߔzС C4l l'-vt mga'e=Sš$Y|27>Su4%3_=`TdD?fC HDЃ;`h$\jfe"f9I 4"n8 iQ H/8>y26ؼ-*|rCQX-%΄ВӍ.=/A"A,DsG>eQhU,6^ p Tfl\ذq`d6EU,!cӵkqԱ:u~wFբ6Z :I0Ԗ՝oG.:_|&y%S 7p>{6^=LX ߃z{0$Aٌߒ]َP-H+\'!W뭁iRJRP/ kC.@dBTź,.&棾Exl?J^Kj1 ?d$F`.Z/o*! "V2I4\ӦǩSơ$ʍ{PZ^~#RA:F:W.q$ Ɓ$ށPqE ?]Qݕ[5 ;vA4uuŭi8nlx*q,t  ڗ'bWK7[Y'NDWߎʆ6t"ɠ"4;I$P dҘv7O ̣G!$з"jTl;äYlP&(zdH.""`'-`NKXJi#cbȎTɑdEM@/?%^C1O>PHc~ .2[6?rO'E{9Ojλ(lCf$^d,GoIr1$`iw(EƬPc$2Jvə!Z{ӃLTV>?gP8mG ]V'SA926 M Zz1bdo*_%Db_ULVi`_k ,dpr*B P` NgNv #p tS(cE(ilĤu d 0$@i H@R2 jbgstC22\nfT?\g3jWD)00ir'#_ۿBt>YFӋxnAbO"DUB6Hcщ8xZޡj ɔ=$$3Br1~2h*[1>դ4٤iq8 ɌjL$3Dd{SB'/Uو`he"x[sBAmi7ؔ$<1pWP!~hƠK)Nɰ5H%~YLj]g2)w ֝w#c '潍ؼf-Z[8ؽu ;:C@ACQM5aAl7Jv7!N"N=CG20FJ'Q}Q8Q{՝_CRJb.^!Ȑ5&ͣeƔy4fx-`Z h dĂLlu-с/J{8#waX7m HhTDD4W&:a2 B+`4ʼn˳GIv\+fߙ} U >'94Pc BJ\^t@2gMj W+5jZfI7|sx_5ppc]IjBw!q7^|)uݔ=\ IDATԖE8%=A@(A3@!ZVa# ɤ0hB!IL7 pYkF1޽$C"ƁA5h@hP h TEJeat$hjCMsyV{WXyȻy8ſ}nh4H(g` 26o p:k6llA$ad%4H{'uwHUթOTT+UlҊ?tֽ&s5T*8~}.?j=x V_ؾy3~w5q/>0#ԃ/= nx]}-^[*{Op[_ۄ*ΛoW^Iuم`VqsPGۮ]n˸k=o~ZN)rj(J>Iԍah)tʃB7gƶ; ǭQX'%1C-Z'=$ne}k3QP9ĈjZȑ]( 5k$K"ˬabIA!UFm[N͕JnRsj)ejkr;l- 丰jϒQR-/:O ~TnafoCfN184$ߍzW2|Q96%0X " Jh]7+e2R }( mhD8bL{/̛5cJS]:P-c̈́ȷCL!яqF( TCd|ķ~|ʗP yK#ċ<Ͷ|B_6|՗_y&ve k_\ RA3f}o[LsR<"#rҌ7 Xf #'@; kj50[+.,)mdxӕ-)_C̓ac0  \SDI{˘s;S8ph{My*08&i,_mc LS/h%׌R75~NnJHw~igYS~c-3UZ2NΫvr8?,WdgUP3o+j:2 oCh,OjFg`-B.XeT{Yn݂^ |Z7m6Ju3v,vnބt؎RSzoGW^lck׾ ouOb`f߽ zѳw1؋jly/᪏> W=MW<׮};j*ED[f%  GW]y!mk8'+'2,>3q%cӺW>:/_D /OP,Eԣ~yu#hqg2Z7n@wgY_5䠡Amnѵ.,6,Ccgn82yE#[2B@sa7Nn" ɮT3mb8ǤdO;EɔW=իCW!e9iP/lRxٱdC},)d"ST$BI`נGn'?d"1oWRBz'{C䒦U۲M[YF}"_ZY\]E9,XvyTmXnj +slÚ tT٧1i\=55eXL،0)hnR]hjjDGFTQgԀ&dZ&pM">\ 1sh(sh'C[6u@ZFCJ}~.t?݊V!T*>I=[axG1PWWGҍ>TdsY@3AX L2CزiJCb%1-7GNtQ~RASLThY Kdcw O.#sRpip=]X:sBΚME:x*<&*o,x` 4S7>Ȣ![r_?z7 + Tм8-g!7˛6 }n *|:1Ԉ:*}8-a2d[̗00fl3xg_r.8^}ж{־{> [0}Iѹ?wxq+u8g?ǜ o3da˜돳L:]MUνTINssZj:3oJ@ س6N񋎌)c+X$M\qQ~tII]a$nFfETn]-ak ;UFv8Tq*q(M–, Dz*(ԃMź4-͗E):jV%8k=u\^SN>1&q)$j'r5j.m gœ]vry 7h}]=Ȋ=|&$>4氽kBJ?t^&`< wP}l2ƃ=󁁞l*}Qvװ_A` =Bg/*f2 MXcJ%D6C{wӣ(%%ׯGCS#ҋCaĉ$سsWƯ/~*Oa6q,=äX# j |=+*EJ~pΐI]oG2,Є@~U>U& |?81nAE! 7ah}=Ԓ1+;/Vh&FA0h|#cݏeNF,aTN)Ba&N֍n oKf3.d1,DѪnә3 KYW$FjSrcf.9ABHB!ig9jZ F(v<2g >Sʖ6޸[|9/gg3(f{ 21\FAddfȖѿms-#TTQQЂԵbmP? NX >Q(WXۺb汓3XNcyıb/ŗJm._ |vm߆ByKu XzY+xp,$m>q̱xu.ڶ ceXDD0'cp&Xu~p@(п u>Z"+"/2vc0\`RAaL?j6^~m/nxNf "L-_S?+ &[nV3X g}h1P< ^_0)5~b.I2i_9*2nՕcv x^S1cR3GL/}}b S _i!<0X A2D=9JdW=\RSZE ObKD*4Z [U{H`W5iƌ7M:C"m2 +46 L߭5v) VGBHT0Ii7(${2|H%Ah[T#`LFzZ4HwHRX(ڗmT`\>Ccic F9i+Ar^pfg{7m݇Z?xM(`ݞax"Z~?"#@U(W| ]B_e0d,PDޡc`zq@'֣c 4):Ifo\t* Ѻa~|7oپwl{Aqo6wO#߇ޞ|̳0nvw'KX M_=J7t*r [`o(>~Qtu>q|}޹\} zgv f!S.A6Kr(xH l׳R8vEB,QIh8fW - v< $͕;ZOg>q8ٌIn/4;+1P/$aDr.cY*Gѵ6= 0/Ȥv̆ri< `z _},|ҾiD,$-a 1ެlי9-#`JdklDySLa^*Vb%R3PZ X!=o^-ILޯvtgׇ.JrOEL6Dowc'.ðzN+> 9|{D`;WD5>u* C3p\&a"t<6(P &\u*#%Ri>&f[Po͟f>\uNvH&Y9vjkv>3?a)*~?G=a4"'C>_* Z!9Ր,Lؑl"(31FiIֱ3cV'"[/촲(GWAj-uYF e-qHIS {?.HB7$Sx^mDSf I(RŒ5`La)lpյ@@YJ}o YHAKfV(!r[KC?OkX{ r=UĚ(vJAxM.&OFӢؾ*TQ/恡!d=\!b:?AQE]IU˭X}ҳSdIF.2qjNuhnȇTdzhDҌ/#9x2KƑ>XHAEbIr \%M~򏛴czf^i U]YT7-"2/Q6;aa6t ;¨u`1t0i\6= KgMĔ1%NmNP&(/"G@/{{^NW ;4c6&}B\D]k݌͛Pjj?\FU@y(rDϿ*Q*Q*dQ-R-x5b*D;(@F+M _JJ/oFX$W" ("eO2E"W˃v&AAċƗ+$2|U?͉](_J(ˉ槐H 6JRIXԚS"cE{ ?R% :U$6tC\șmDV[ye[O;2); ۜr*(ӴF\_&M1IVR % kCm~ CH!?r'-NC;B:odsINHT0*"j}#4;ڻ1sr36؇b! >^ڰMPgm'mŠ5`QCcJ9m^u{1k6-c~6 ہ=ހ5CfL ͘w!sm:wlGN-ȍm ?WwZ70!͚'uBXA!^KTi]:2YFzv3Yӏ*+7()r])Y)<]Ր2>%#t>~&k[r2i=.>٪} 3@tY@ꊰ'k;.oSx3GSH%U3d]&uADbP5[A|Qg.#9nHS+R-[dR~AKȆKӪ͙Qepqf} *wUe%Qaͩ0rrebN$־bI)-ax$޵Ư+_V^?¨tB*<}n=)PºM;xs}DsY{XX݆MDX;A/f98C:Zc_h/C)y᷍ ÃȈ :֍axJBQ!Pt]4xg;\GHgmL-2& {eȁkϔ ζGK^8m.Ow)mKݥ ̽DfS2=j1l< mp&hwGuh-!C*X= 3Ne`J15G8~FQrq VS$bŧLVݠt/K Xlv #D\4֡OvQq:sEIȩ鮧g ǚ4LY6eW i|58F _KF(u{:DĕaT{)SzDiӰqF]ƦMpWߏY&>?]ۈZWDuAupCȈ&-2C0Id|4ed^Z*vnX#3oh_- bk.jؽݨ+k޸5!/\)Jf˯SX0 v")lD,7a1-4S09 9+PYIh5DPԊ\8O\WђFML7ҡ}( 2d& 9XrGƆj$Pk5a5.L\2Υq;C:(+(^3hiupde6g&j_vUˑ+3IlQ)Z r0s[)ԱkڰIQ8o:`T+aT:DV{C.DnC#<۶my,YX6tڇA) ߋPT!@~L=2,QV.|t4o_W+UtwZ:nہY-Ќ<+mށ֝^,S]*3CKѤG5j^Wg(2 7Ib bY۪phnAHZ%e"m-2ݾnxۇj$umjپ6lpkR82TTm+UoKtTڱR $HS؝Rb#/WO3Ó[Fə1uYs, $&8BΚ\Вs6!\hԄen`)]0G1Tz QFCD˦ab؍L<˖-Ë/={\.ß݀cÜƢT IDAT>pHW/_{/_W@alE_Շ<="b1J]գ7Wvo#|&>׈5[1sR Ã-28R^TJ)Ӈr'| ign|Z[fǖ=M]90~LM^8w`=(U쏿5zM(Y;krXpDfAȘ'ly Kϛ>Ђ90f g-`hCW Fc)0VFtB ;IOR-Fb-.<#ZhO-ZӔ}ˎ5l?bj:cQj8P)u{z (Tݝ1*/8:#,d[8IaƸXBh,U7"/ \$W9/X nf6=70Z"|>00JnĘ },>^{c7 07Mcn[vu}̛6G.1}X  o\~}}>>{&NOb^F`_^݊ـR CX]MV|5&m ٦ I iu_I:Ҋzce'̦383Ԫ!6sffWdPV+T((y!bZt#̖3mQ@sHsHxY }$bө#h" FO_Wn74ʫ>@' 5]ߪD4zφ:$10:whJq\K֌!a55ÍH!QzHISB >ǒ+Q Z|p2&&8pHNNφ3l9GHܯD-ƉSDnfY۪0iA3](1yBfT el_b9S*eJӸMH8 3޻)^V[\:j ]|| cHxY >j! FZ[?SGĔ( Z?D][uJt@ԚcOCWi†u g<Z2R(-8|AȞKgv|KΗ6|6>Q_ +nWgD\NL|" eTGE8ssHvӈԕ֬Kx ٱd5o4^03+is*5;CT;"Sh|UHDq/;o`+W&z8YK A*^-ΌND@/QwCeeDY2JJu ]#Tla_#-'=WGvqthLǂol]P}. , /eFwRR@h!?i/›j8Ei \˴4h5H{uZes|GZX֔ӈh E}V!&5-Fu){¤b~O#i9#_6z[yW9C9xW#%JoD16Kl;%*VIIeGZ +.t磏oSԾwd%̞;2֠YN9?uLi bR-IU(P(0ߏ0rh4!|WKIL;4|0>¹}X!6&dN?͝2o b36 /`1Rfһi&77"&88'Xc";j^ rQ>;)b-`N@8`N6RR0e )}TpQ@Xb /BH% bz  e>|S 5q$'w%/~ZYG0‰hN.z3}6M!QqSD1I?]]͢O!ɠl3cӮ\K%r9R]*8J2c@!hi$EDŚ.X`>l+۬BɮijJ͕Y4 ִk͐EsÛQA3x):C_AmX{~WO4=/bP aDV+#li$б8,m+>ݩP#tX3>gT>ɸ2Ӧ#_zݎeLi:q y8OM} A\ij81ݡbwS6abK92ڎ < YVm=#dYilD_o/ "ԽԦS9ĴLl}ngmVg 5F3dj<|vhAvJa"o+lؤ<r27"g5ITZk7mwNa2MžnZ+CR#,KmXAoJ_ӼW&LR˚FmZ82 £+rԮ:8!$NN L[}eR #%^f^c)ύ~$OF%Um'8>e ~ƗhI-η8dSH$ "Juu):yӡB  Z SO @_ r=3Ĩ_X'F@9`EiĂ1+ %FC:CäKmX*$vىj ?wt(#Wف!>ҳT(TjP(Q|PU uUO* 5yrfd2?FCtS_{?ܱ# T#V ]ץB\!ws.]fI_M9X7F&挃3|?,du~Hb# e8E>oѴl+vuK3i)Æ=GPٿ2݇p>@ ir s#r> app&S$@%ͷFrNH%FJu}CCCFOth>IV2F.CG.g'~ py(E$@.YP{wKDVN\ a/X tl+ k.Q5kFCDp*Tf,a0 6R _sƲ[%n׈CJu:d^#֐J[AK>)]ѱ4:a![=},x4aX Q975Ƕ?/-%0Rn6~$K!6֏~9`f}$#yuMV)7@kFs<]PL&BH8BK1<4T*&n ]KP3f2ק`LD׵E)^zT+UT*eѧ$%6SԈg2KE#d)!axxa?pZT\ⴈ|U~c#CP[d7?Ru9ru_X/Qw SoyEPyec]7t.5V_5%+%3g`'u֠㩩<-} ^+m7)nAf(r6A 6"l".@-*?9]2 OhR6Re+uc3 J> ԕ$70ej|sM0$ s FruPBhWW qb݀lV5zi]]StTCI#_,.1*6~Uw!\v*,h"ҼI]cFݠvtQݙg#J}v;vdƗ P4|.rÒJbMW+=NnRmc[x5BڮV'89^i "+Vs|PydŨ|6mooj_1J E $i%Ë́=蘺:x~+Nwa&ά6GT5bLFƨer a'pGX&gʡZb)s='QW*j\)NAY5DyJ pم8)Nu}4=bGgQd ڜYluBJ#hZ8M(T7 Er_I2ی(KEB26}9ya8c#3.8D08iR0LO'U].gO7X664EJ%TeT*U8B!ř-%O;cwF,U5Q)bg&A]]IM8y[u%T*L?sj)kOh]ѥ,-oadWsz k1w8B TgqZ10ò%K18{>^O" cxW/^<  `Xu֌Ǫ7kM+žX,֎qcqrC3ma/uzzlb vC'ODsṊ/GES*%%B)rg9u SZ&dg(1߇rթ,CƗ =31(SO-Bc}lʈID\` OՍ#6:2 M)ׂ/~e+һ5] ]$%նR2=2<tn.`JOR_Cf|(ЋOIddH ~/IoCXG5GbSak $+Ǭ-PvlB#S%rY-w47(Ȋ§'9}<,ԧqؿ~{ί3paoŇ~x 4i\*>x/5׎^x14Ň~x *| K/ǎiQߎvR!G>aR'ϙe-ף *A6Jkq OlW߱b˚RJ*33FZ_ W ${"ީjê!._,(x1NJ:\tlԶB0mhV7q] bJi܉Z`H}t2ǡ/5`yLd< rlXEsVI\.\>3d. '@>́3#)/CB<5 LjT3G.g,)q4G.Fo)ZL2xZKS)xÙki.6pfjŚ;z¨wde.6&ϝJn_r U 8}xدV>ߏz Ѓ #+q~}}3mo{10-Ƣ-<_07ۋ#NF뎝iUYh3Hs8b"XVmȱHI@$ți `I ߨ0I- CNΎX5%ɐ!DPjfPa4.%L)JRZ8dLt9yb 1!¦2,10BAHX!w@xF;Qu,X2o㿞7IXӕ?~ŗ^}hhhиh8՘L&/ۂ3x P QRTǰ+?BgUhNx98]BXL0W_}5%,7 !PfqASN[8Zq`_>!;*MbjY Ok$Re>H=`-`I>̃||Z&1~ |` &#bǖsVHȞDɞ>Oyҕ ҊQDI"W3`>mgm X-.rDUcaYMpq1\WW+13B|sSNEØ17Lˑ\.904;w%K5fpTO9|;8pBő|1ٌZFڽfèa0w<4Ood[T_MO9aCht KadTѤ/ ֜MM,/>[{UrNFF) ]w܁ϟ}Jrs?V\'̜9Gy$}Y~M8`GVϙYf'tᵧ=WxzUkifqUfyOo&7V%ZIw< '؂5dr^='}'IŹy47ԝ*(&.چBBfBBЗiKTS l}ZբdFU^3S2vr_1QzѦ/՘ L>(fINŢKܱRR.Phd:Um=JfebIFFA8V&gc֯Ýߎ۷+3:sG(! ]p3P;YǂJU.]ߎRSǿzy!V9LNj?NyNz2eކ1P4֔2iڰ"ʪ+F !RA|ON؋1XӰ}CCX8߳7sK ?ޅ~u>t;d1yxg?]=}܄O9{}'+Wagw:,n<+0\|&^ZifyݰCfr jFtwK Y7.5js')Q>nRiܭty,1VFJhl`M+s"ȔQwgs^d'S:Q)!L3|b}ǾuwaӫkOdp!KԚ3sby\^`7 qxI/*k: QBU, ZeN~6A3XG#ɴRjk]Ҙ"j&wj{?X*D "!D ~DרӁ+2[f&0q6 pu›=;h'9s| ˌ?}]/cfL ^&O< >dl _y#4IMCr |XK= *ҡrxGaerh[7 N84\92eIz,HVI)\B!ANF$2D-xc:aHƢ#HbUqf›1s{u\+ }?vލ{bɒ:*]/|{xg]_/?{`ƍȊiUQdv1vT{P*h; --~U+V8`ցh+R۰O+hk/Rڬ>6kw.1V~VBz[Xơ]L .2G춸a0/î0Όg&B J)Im[ SSR NCa ɏ(3}N:. $Λ*81 PJjQ(dܝ8٠cyRXϜX*8CCx%rL+{EF%WL$ #LS0~jbJr5;#ZZvBUttpX :`kÅ,F r g%]ˑ u)NK@',A% +N'%)mʗJXzdF3Ġ2F KD/ -Dҙj|MGⲽ<ljJU$"H/&*Zǒa`6xZA\Y [ )l1$ =3H3Ʊ~ˀbj {ZcUG SWfٸQL@/JHNj A*UDx4@3 ܱ"‚q<&4h o! ƎE\Ɵg!eҥKqgw܁~ oBuׂ;vu';* ? *|K/N; w݉dƷv2/?zTz{x*SmG,@.~hoǹ?s䄭#/ PKnz:Sj߂R"ɐSGNms15LR7ik:M)^W임!UQ)3X٠^lZN/:Nh) i@ p`!ّR8M69eBX^~zw6۷zˑ9᥷q.YPH䰎Cd"%?XOʠCcm9r{~|ǃߏ?gSt0\3yhlD۹rw;nz_p!qgӃyw⳿?1c\d<~FsK .zx|JrUwS`)ࢳ}{v7ހW>bbUpW^?,L<k/ﯿOZɖwy[xbJ̘386s&vlقsl}m3&rG\t>Ɲ{6كˮwt#_]{w8~ՁK; &MƚǼEZ-K-h~W;s/7z{zϝc[#=3fA&+W_===hni\+MPHW4$sug+)KŦ^X`VՀ5#GD-Xc.bɖeaTKNm}6d[̜9!3G׿ubZaܹXl6 }T,mmms؆A S.f̘RAR@꧞DSs3O|>˖X*a!.^W}]7߈'yGs,)x}Aܶ|`2uMߎ֭Ovli%x"}ܶ |{`2}kɨgn҃Mg[R +ѥ_| Mk4.R(+G)# ,őel֯_R|R}9ꋆ֋F~* ̂3t_P|J6MQFC4Xyęg{⩧,[ wPw2~p ˬYp?9rf͚qȲCpя.̙3r.η Mv3? iG j>|/図p!.^nܶ = bg‹>m~U+V+~]۷a z~nwwϜ֍180s`oOfa[ނzŪw㦫~R"`2tՕI[@cSf߇f@Ø1/rqxy+}w܎:,L,=,wŪ+pSXHz#g¶Xs-BoOX,aYxgֆ_|V^pص};Wѕ+qߝwpwgYh/<[GWwށ[6.=<+7]} %08 _ kiKwZ$fPTW`6]Ӯ)׳*BuؼQ] ީkLzy *xg& rY3Tkvx0j=+ĕvڥ#񒰀@94tPTBsZIF7Q&}H[C[[:\cǎ9.URk b/u1@mo~}/cv Cв + 8{ju J E]b:dOnWs8+7xGlAߞ۹/ŋsab.?@(dqaZuǘz044zTz{pע\pO\_v.R\pxxWW|eTR֮.2ongNr-7s.@_<<: @}B|i80cж{7Ic>@.O]a yxpWEaf yq|RATBOy 4[Z9ZZ5lٴ)h ׇ5Ͽ|9fϟsa[r :-ѶgAZ|) !alaUb[1h,| LHZJ!}:ΐ$PVO IFO PA>Pu&w$v-,Ǧ\իr{fT׽~| ?DΝ;%nQɱ`v; pZ\.'&&!9j7xHyFq1wndgpc3Oc-V{/8o;Dlٴ q'ჟ:<_w>[Z`(b=]љ`f쪪;wdJ2:<$@0Qx>:*!(4Q{,%J'HQHĐГ@z1}s.ks'ܳv_kٴȎo.(;O,|YUvnGt!J8B;cPj̟EȬ79u#Dɕ"m-Y!?2B\. (Dkߓ)]~gLgeGSP/*KQʣbXҜC⟴Ό mP],}@GS? qKKLVC: Vر,%=8{Ǡ:\}mXxW^1>a ]]8j< ˙Td3%)%P~AECl:|T}n}Ai]ʌVvGSIIΌȘzptWRrY Qf1A3P=CҙC/Lj?Q|?FdB[oבhGQ2 >Mǝ^ z IDAT-*+wٕ~٨=t9lziO㧋cDUQ=nxu @g&kƶv27_G>-ކB>^]x<7/,}YzupgݷA,?)Z[+CuXp]>}rY|/c!u_Skg/"hb=%=P[+7,tP^+Ŋ?Uo'<|ۭ@" B.Q Qz:"XX$kb,[L?B}Fs ?f=[03B:L 1?$}>oSa$Mr,1D,B2-(s6E.%؊$$ %[=8+hobS*`ES2g/Œ&EeeMcl,wn,x,Z %Lr: S챶L{k_[S>vd'"J!?ݻqa?G.W}76]N:=\90tOٌү9Xd2( |bnY!N#URm}+93L6)҆/<9NgDb +ǥv*y<œ>d3d"gjbyꨨZsI2R5RdآZO#:CuNɴ- x#7l[+p љNc_o_1_< g{.9:1g?ov;:Qћow'ǩ7q"***pwAߋ#^]!cm!b3MX}'t>n r k^O.zO.z,Uh$Ob/dmk"c$}ⓏO>G@QD^Oi~ER &GHHI6˴B7w|~YXb:c8fa…ˋ/bҥ8ԯ~S9GLBwh[u{2ݿ3$qI@+ 07|ӛ_۔AQQƤ)蔶ؗJL`#{ tK/ [U0D^[(xC* kNΌmДKnߣeۜ!э5:sȗJdȺC__Z㕱Ƃ' >8 DEQgE(68 KS5xIuvaK{nw ṪCœN;è,O"ݲ٥KozpE/y$x>y8م]AP(tQ#l+擕 @N`MOmrKI5&j%0ҙ(aP,G%) R_&GoT)ZO(8v4:j6p`S#j__”ɨ:`8^\M8߹;X"?|$ ÕW_6~g%5E֡pl2$:|pܧQ"ǔ!_YCKDlF}}Ð($WWkZ|/kgn;p:hW;piBxvi \" /.-X? y"wJzZ.||ޱXi-ba)S{ֽً=OlēIRQ!KN5n,;NJpnhr W0-@j,TD*w?a,CC\0k1lްSgwWœcSBڊE bҥ8Sʕ2}:6_H0;{P[` }"7\/2Qhրҙ[#vWQyɆ!/ TV& ˯Jg25.[Ćhz CVΏ1yÀ2g w|o/1g/Z{(8bUUFc?{o]4.y X,qbJ$4R!c(`. T&25#lijWViPnYaJ:{kNhD.rY7 0]p?_}P(]y%--/}Q/}?瞋(Ӡ?iDY.McN5uēx_RntttlB^ d2a;F.~?Ȩ-NQV臖ڇkaє}HG=ai>zZrR[VC""xз/W^󰫫ٶ'M $Getzr:OS0qT<>?c vuwfix*4I[QR)lT;v ~:NHcz7t2 3&^tj`) /B–r_3QeK0&M{N i[\E.òKP}FDi-{+^)m^ .q˕u5WMz }YB8P( Ɉ N<;"'ZhdYU]@z3mJiy[Ԥ.#ەljK0 4_Y͖ځ. A:lS, zY1(XtB5 ɀ%UV-n`9D|#x\{{T!5 1r9$Idŕz2$?1m܀7W¡#Ӑ1qZf>!L f5U)EA$& G_E7>.MђgZ[p?x_+|Mضe ɏ: #FAoO7~U~H-H9_iGS+JS/0TC`G!~9 `?_'aO{ڻ0l0lݺrFTjcaf b=8rnZ\^d%=brG^ῥC/AՈ1}D/|ګ}T$kǃރVhl/'N; /idˎ<r(9G?>)?ŦukQ?x08\}U_ >D9y a|?k>p\v͵x?[:aځ3q.Ţ=w| Qc%kɗQt#x_:拾3Qؾ^ }}c!,S ]Sb.ef6F)BS" ֱ) ŤgW W\o٪m _j+]5^ .(xg3y/283 Wtz{{*'|ɡQH<>I&y8 {"hxll%>줷/CX3`8N稯,3Y") 3D}$* cӦٍdȳ>tGۑ0mxލTe%]m(xESO2\ɳQwlTOݷǑmkKن!8")]P8z"fhLpEf2KX8rVTmfN>|{!O /w߅k<ۇ. ?TJ l˖E?zg_xBc J^6A. Nq+YMN`Ŗ Ir -X K])V0;@Io4a/= vRe ',)DO>H%| kbc15т-CTkUn·27"'X|]]HqsO"tIM~|E8Cb  %C#T!ͣ3'X\RyfDDg 219FlؾBa~(ap\ K'C+nV|wO= /| A9s _^y5jËF-p_|1nfs=@,Ò%K0k,4lۇz|p.QGYg#UUl[+R`8X,//%+v_0}Xw}( Ŗ-[0flyXe+w4̯qr::PW_zpo66]hٵ zs>t㤳o~ ?.zhom#ލ-h_7]L:ּl]G/a#FMs\do"!ޭ(`n(tu=ٙ=_agDeɠ8] S3Y'ڨ@U/gpHsʏyiuSz`?k@Ԣ̲Ō6V1ۇ|Kǵ׋t*ITTT o3l lP,,2p#FT3eeP¹'RE䀧 fµ qR{tjoB{~J̠oAE8O% HLC#Qf0jH++ўNc޼y+زe nV455ahllc=^x,_oø_݇mQŦv$jkq@LX *A*TbĈ ٳjaR1mT$HUUe ;]͝S.7}ׯCm]}-!jۻÚHFٹSeXx/\o_uFP3ۋa#G(Ò\6w^]xƈH@r!/Gd,ahOsXceh;q"@FGiɶGPG?*F$ʎoljڕ IDATk<e*3N %St>YgOn* y4H$ŋs*P(x yyr9#%|_83Z%me÷i֖ ŃxpGZdF=x\?˽+N^v n4>ޚ_,hewl`AAuXg ƒIP9|dqLg0 ][kWpȚY5+Ɖn#šU+Q(䅄۶鯾סUf :xp"ѱ6"[N $*Q6+ <|$܋iHW`.[(`M5hD|mOZ ?a 02֔X/Pk(YJVڅ%J6BQ3`wbTš(Tr`ՃA8Ve,! /_:bv2Xuw7l/aU\1ZG."*0 r+4PȤЗ|XԮvO"I1tvv"UY  àAP<>-–M{Nz x(x3T=~" ⃊o%lڵ/߈%h.9U^{myk9|0g|$++0r UC&p7=ֳn,}Y?hv܉?VK֌Xc?$b1jqҁItYTHU9R&Ljg&g_˟8giOЕn&LfFڛA!Eu>B^.l1|*bW}S>)bI**!N,Q^93g¶mֆF 6 XP(`ժUHR/`hY\LF'5'Acԡ2=qy=gvɫbK:JDJ]Xe < 0Έ2CuqfDӓL`3Kf2ހ2f>j9c5Pj<̭3Gx@nǓ璌uhxfj|%F(oؚ_ߛ@@P]yܿ 2) 7DAP@l wu"مlG;rw#ف\{m`8RcQ3ej&L? PJp55BJk *|8*1T6gTg1:ڙ$?Ap jH1xz yaf"R`]Z+,e)'^Ha@:Dd i_پ Ww>P[Wd2D" mơ8`0;FΝ;%Xӟ}Л͢" ňA! 3cxWsN :vTWWc۶mعs'N:$,\s t+ ضmFX,;v a̙x饗\ O r 1Uр2b*KO)(GX!=hd[<2Յ"^iՉ=%LXpعt5C:FI>K RԛגAzFܡkHVϹ[jeWoԲ#j3ƑL!*8Ǒ1n8!Ry72aɌկк&" GdUUUb5 QjXߺ1!ތc82s[~9 cMN5}犊D.*f ũ0E[ܷ8YV C?eh`:0092J`5iS#of jH1O\LqBI J[G@poIҥ ./f!D0ATSgDy {MIa麧[um$p.C6꣏@*o{{Qg:d[v3>UqՃchHUbP_T U P@W:TExêPf/~@q橧s=ոKvZرv^z #Gڵ #Fn~D&Accc@v+0,H6LlFξGشi9L3`?Hٗe-&.}REaR>;/%xCP`s'])zȫ&,Gc٢&1&)O^PiG)g`8ԐҹcjpY&6 #V; TBCԯGpI 7K;.f8So\̰,  ԌD6M&?FKr#{f̝0"36ត)S'Ӛퟙ9Ucǣwk7e:;Xx C !I,"aڵx |of? n:+7Ό?^P^4V՞#%{9h3 06,r /f-Jk`.Q!W]0c˒!r1N㏟L;c *bq@e<>&hOݻxsXܟ0.Ya?m݆!udev0|>0PSSz;6lΝ;qc̘1WI&熦LL&kע DKK <@1GCW\fmTk˒7SnovMLNIXtŚ(:+.22Qe%YJ1i ɤtljL2E'7:EQ'PIXG45CxL-m|c4qCS,#S5(eC;4\erxe#CQʅ*_N^ tĴe٦)?_V,'[XDPǺ| 2CFJI2 h5L_ zzݙ2ryBu6ۻ[0ody<>/\}ǧ B6EMM PUUFTVV"ˡ d/2^}բ>믿{/Ν3gb֬Y=z4R&Mlݺ 81zhlݲ<*7ReΉmP7IbxN Xr (#%U N#g,1|['ND2oSbΝBKK :zoiiO<'xÇnj30i$0Ԅ BF9,F6O&D@XdmZ !D'XtF L@S>a.fٱr.(8G )K;cuӎbJH_ :]o\T~-5i#KzShN\8JA 2OPPF Sy̬B.8euhV"+uJH .gy9sD"4x&.D`y(sHD Kv 'FLĘ冣!f'!舥qIj'vMl6իWըkX,zTVV /W\asN̙3z+lقBKo~;v`J ;a)R`4 X3b ɆP^R-h5E^f_黺VhQA}Cazj䚉Iz8-#cݰN*K,CY+aBE_XOƩ,rR t&JHVtu`'j,5oSDk0+ٸPF:4I9=bUnWp?L_?H(&x`GmihfGΐs|~kBY|ļ :b(Úƕ`MY`s } fgK r? ׌C6YR2 ^Wo s/(,,Kxm:lܶuwJ޽v† ӃX,l6!C3gĨQ#`۶mvڥ7Dfؾm2Lƺ:jIm D^E,,}\EuַILȯVLee:E2- s!e E&FE@U*e{jr9 /%l#魌W#&3tm -j^C +G c_Ępݧ+d\yٰ5O)H[m6'wI~(noD oo:e(iYY<ˑUp(ЁIMosyR)D5}DW`K cJ~Q!ֈ#^0vFÙFg~'![iokP9ʕ d4Ƞ_RYWG_qv`OډbΓKF!Xr5L)墣 t'yR}lTglI+23.Fp\q0lX \-ӫe2DۏYn@gaG/uP[%6pG1ӣcp(]3XױMvX`*Zjj[ɠtV e%YͫJJ/Jj)os$DPpIMAx8gM7  7'3<7@TzO۟Ё mMJRy _i:Cxޚ_5J'єbRN̨1 O Ȃ6r ebw d6Uګ^Sš < [$VTt+CأduHy$.Jq(yFnPME#d8`XL ׮N<9 <+Nѧ-}~{Z5XTU\ YGoOtX]a8.py5'/Xa@!60=X^h^ɓt\ҌtDo uh!VK`/~%ƺM0Nʢ8SV֯k:3 N>E.R"KE'#~!NEo92Z%cuA3CR|J$ƏװS— 65is09ͨĺo0cJ?Ϊx-QfOy4cG]}=FWW,GwwDuu(D VǑǑHTBAR+2`Wc8 1y/cH&8쳱jz6̿-*A.#,eltc8L -s3ΐ(46( IDATL n+vzLΐ _T!Y2xTPI\NV4xrX]4,װ!R]OzKv lY :WD@)(H,Tm[lsCE"i ]z$D:y+W_^{-≄v\Y퀉y&G]3 ՋTY?;g}lF2=Cǡ@:S~H8[Ãgd|,G*UCx.S}p8C)⪫kAgO=9|9j{,^x9,y8sC++&SMu&[kiZq>sy3BK0@WgzS!RKvI׃AY2TcR5MBo )8@!@0+]aƬ"Q?\ E}> qЕKISR\pOr$@Qk(N\2[KmV/1Zboϓ7];&S1ϋl#E@?^!#c+Dcrh`|Y9B^6N_aDkr(\tC{GAKguәLEB!-ams7/Z5:mbc :t(=["hǔ,BXLh\Pp ԓ&uԧ$~t+Fhh\l:PcR ` gjfa ֡8 T'XÅrrUP1Cjz݆Nѧ)MPFNAs+'S#„WQ.ߟ3f_r ĂsE4>I=TA骼GK?!"8׿jШRʋԶCllԧA'lx^^Qq:>9eؾwv{⠛HHXF\NjLdh$<)9DW͛7[3C䊵`qؾ"z! -s`l  ?\ co;k#NLU<}+x匈}KDt9[TsFY*EA@ WE5< h3r#Uq\'4mxZje?C\~ӄ][ ~XLv#aW\o\}5< ;N C__6m܈_zqV{UGbbYr%cdwYOXr0g{7I_[ < lYJ3^7\{ 3XJ}_c Gs ^ꭍ l&Y0nd25rZ3:P0"''#R]?͆=D]rJiUZ"/_Ʈ=OUb|c#n<$E!ƫ;v_?mرcq`C=XWg̫h0(#ex;Q:3JJ6j Yr1Q?mZD!/יTNn;B@4gF6gؤYp8-HX2_g4GׁϵoŠA}đBwҗ6xMg/)t9h7 V2?7G؍C0P.[h+V1HKH <&je*s2!O< 8w#Lj#w^曊z (b&y6b$jOV7T#_fOgCJ0C+1m*Sx{ZtH 0tTlYkZ < ZqhcG2۷bk!Ccͻ1e*e F77,FAS0c;6$b1)ٱ=Ç {{z9رcN9 8m|4בt։j (&㞊vZeRNP8e6t/ MMp'hP9 %\Όdi2΁aݠX"5&pΫ:5{S|f):n$Q}-|u 3 bg"?C^aBGg~81 "ÿ:::}6C" t3V t ?P( ˅"!#r~-Ocb) dY^t!t뮻pUW!͢"_|& ޹wAPd9RNqp[d2SST"֬qկ<9I)Qc.Zr*E7l؀B`MDR|U9BEL9P$|q/cu[$69B&Kr^p,@bu Kפ\nsj8>4Qh$Kke f߭ۛpKcʕXr%5=Y4~*gͧ0%BԴC`ca,Kt!CfђArx5DLs;$ry,p ǮX+/ ;N(II쭹`%$.$ -,0/UI0|=n  O9y],4S'Y']ݘ=r86nRA^uQQZHUGWMYH %f,1T~Q8iDF9CQ>EӵgA5KMg&zQD93Qn[Uy\~׿K_ܷ>[.Dme2)ŊUp"Ja{kkہ* 0(Y,->tlj=-7v8, *Lk҈Y0aǪ]'Sx@xf1rL7ʖ+=6W]莗^)ך eXaun<`/("BB8Xc?TSX P U ǚSK| y#qT.X s(Zg[Pz̸5鐃rC+7 tft$vp$ u-#-0hZ^0]5/~0W,>lDUKl[6VמrkDON8Ig\}e !R*pE+Vѣî]p%(zafS1`᫷)``0_æCU"G/c8}c.kFn',#Uh2NL NBŧ,]JV-a"JZ}Z>E^Z.u+_m,a P8`5f[R(>Nb}`KG3 FSgcGF / ⛆bm2fL(fsڱ|BΌGiwftTNң_Si@nPf)Tga۟_f,̓q8sIB;+EDWb5xv*yy>Me˻?~T/<6@l8Bxa@:DM`H8}md0mh#}mh_?kq8ȡ󱳫cQ8qG{};:;֛F1$h5K&1tE.dx5\Sc` 3T)2#՘ommš6O[\ƥe)L/.QcE:Ό0bՔuIkDy^#L<&[4Pֱa`D7٫+uƵmcqJ(^"j HtmJ0 #S~9Se:qh+D0T! /4a0]%0}*;)>#3?jN X :t̰XqATV .B{?*)S1uDTmў,s8v,xz3}u#_Uvg07u ۃYwWc/㠃fb՘8n<:kfwIL\q1l\)`pԘXm"Y/`:BdU"R_*8yQ[XwcKQe}g,+u_=ӓs a`%FU]]2T0+ ȒA P!0 :Nzoi֭9N:VݺmbL8kU+K+qp,xP UD^jq<Gy}-ʞX{Q޸ޢxE}Jն]KrQ=U_5 $5l'Q -6ML۪vsGF !7.,$9QilDZmй>=k!ˡ_r>.я۷oGww7g5{{pϯU,O;^]=.\ uPCX8s ׮1~x|i̚1ۮIUESi4`8l/ՖpRNmֶ6|_năgX_,kkw|#~l: _v ȴᛗ~ͽxTxLJ Qo3UNM=arI]v+m*wBl2\\Pqu^+c+2i{51ɫ޲`YN|e?g96 uX7cHcoD}toU`FlK ЈR1dơA0a(׎xe3J2OݠWj1& z D)f鱺cv_Q}p֡ :3Z}bdY?Fcc#&͝~_(Wp+ȴ7oFm<2n6̙;'\.[oŜ9sݍ)Su$P*Qg}3YQd%KCO TPS0ĪXϒY/tg:1rx8& 9`OX_|k5uǪʽIh/CyɰǬ1L B+!<{#5qpഒ6u qˆC$Pr>J i0 7.)B+ak⮔1˫ǓcXU\R.9U+AX@`#{Rd+|c:A _+NYmKc6 )&(Lk+Jy'?/JXx1o}׿Ɗ+ŗ`֬Y`mزe 6mڄ (W|e}\.J^/qaؽv-30= hiM1mhi ,m$ĭcꌙBIiJH#ݻv;g}F[cdtLk5.?ljsKq5Wc_ |k-Ml| ̜3:c&nڈ[]MEW粻~?;:vp?M--_r3ŧ.߁}cx܍SNÌ:n] Vkyf/XI1i]|xWmkij&h/uXʕ'`9;&k~@IP+66hu%*! j8_+6̋+r!)b sM88\@ʶ8CB 7VN-?$D,3I Ai2.ʥ򔱤`8V?J Owq iH9'q0P|K1B`xe'7!N#Ȟ@{{;f͚S'1 8f֌J|k_QT0~T̛7Nj]]]u]~򓟠e "HY{i̙hˑF_g.[W^[7nDax0/Ɀށ}R2zQ8pmbo _W;puP؈3>7…w*f5blݸ1:ad<Пйu+~o~;{puzsV|OaPFP}wމ?[;ʶW^v)n]ot72)BV+3u22(B j%փBDuZ$y$ - V#'P;Vti>Y3BK;mȘp$)VqB,X's6 U9 c0 UZC!a%I) WHv" 'Q$4aA`Rx)C,-,1j:蚔I7榊Uoy:bc?ĚɌUyX7(MX+D{fo%yƓO> o1zmI><ٳqM7gufϞ ~W^u%`G>{aUgJʻz{{~wrqZ/8Qә kעPF_OV>`ppW_^9 RƏOV>oshjiW^xͭ8 }z{zg6ua.Ɣ3PWP{%V<[[pgOACSzX X+EW\i}1g|@mx*[oT2>(;..}JgHglD3aTyUE:aFnͬ2+׆ oD>&Wq3_:11>qJ +&I+YSɋ܋aG.mTqpFV* 񎲒DHE-ڦ3V ]OY9)^(^vXJϓ0rq'kNf v)qGrG@dHoم b…xgБIeK@su^{m5<@4 ##444<Џ4믿Xt)Op&+tRp/J~gW%DNП#>O<6g^zHho*RH U8g 8eݰֶ6cX|I'aُ~g~|kT{ru%Bf&qdJX~ ؠR[K  r $ fےKxrD+2_j ~ Id|G@|D WXQVS"v]mVILC\rw4)zף̚>c❦ZYd`qjtA+XtK3B1D.ąE"c CY2/bBĜH>?"iЙ\.8[ZinF75!1 TJ%tnä~|mEx\prcH57cQމֺ *s0u  F-e5Kpꗾ^~O~ ^*];v}DaWw7,yƇP/<|'RؽsGJc>AK%s@'0}̠N c Sg`?jkG7,X]_}Ȝ3Q{P,rK% $}=uNqx̌z8 E1G B&~T$T ]D$fntX'Pj@s-X! _B *w,362A dBAm+5to?K`Mt]Iy `BqڿZOc8 vX\OBm|l|~tmG#?m:r"؂ơ߇}x׌y9C/}ZMR]^)Zk0 *Eg[o>;quX#E8}fR W^czG{c?o\y8SN`?^{e! Ÿ[>w\w-^yE|t2BQz}8S~yXJl^t0z{~ᵕ+1mL߯o },vٸa_%JƘh$ [\Fl\Yyb#y": u f/_2:66>mr <:8EJ% fxpec.L Kd3L%8^vրv:li>?DJ@߫V}HǛ; Y1x>ԊJ`+b_<[p@$7sEӛUo]>_x.OUÿ-~IOD3Y賦v`O݅c(l݌А-UWlDd# /_/K#(5G "72(ځ? _ځ(wxNg/˴A%w xeruNvĸ+eεP$5m4`4i|Ώ+2yNw[+4%8 >ơf$@x™ǿd{ݴ1^H-@S-5^>RF:-u>yq)~سn:Iz<=k䆧vEPgQJY2<%h1pvVx"4`,7X7mgW__.p=JJw]">hqmUu@h^!@7|c}I<2--*P.AľR6!NdtL[q_`SGg72(VX*σ_5CICҞkV;qV`h=3N|:Ptb]"\@F_ $AEXPiӄu©L\k fjƪs>S:[fD+F"L&Ʀ&#C6J3188>ňz>:3^ !N#J#Jy^J+(K((JT*N(*,!ǦD%Ql/ ʤ ;^b@r,:&+M y" Jz@*Տŗ+}$O5at& !yHS܌_ Am%i#nQKS߸6SZ7dIo! n,{SAsbe< ذ##)q쇏]w݅\k+Z[sќIcpG7ZLf0>F MySX,bӆz.>4y6 5궱8'٩q I6.=6K/DAM~NNbU%^K8i"kZEmjjFSS3}6 !En& ~A@t̤33%Q#G); >JJqG ҡ!yPZ68d`]ZC.d{ݐ3d2E Rpx .)?%MqrG0,'ߪܕA0'i,Xl ɓ0aň0F%M[1i@ q( bw_?6bBGC=5c8htA7=UC(tw%<=-ڂ'z;{Yhڎw߁t5 R("W4:u3ZJa:Y-iƆ}*;f']tсq~4Wnxӌx&c'dsi$ױ$BVgi1ĒˢVvֵjKhO|Ձy fn3&62cI⥟peM'1ɢQ29<7w8}-#6"jS@TUte2#ֿ|>_._@{96_#*0ovTgP?g&n>O[wa\G0w@ךW}??l]ҭHi3Cx v τL8Nˮ7f%e(Ǫ}R:rtkl+̴a"`0b?V)n *b] >:ěWfV;;b=͜m-dItDPvlĉq0}+vT̄;o}}xSZl>\>Wq3DZbP?(Ad;(A#Cǀ$*Lbk*XQ'0ԇ-<s TS,\OF`y$(7#e|>^Fm+vZQBqɅ<ɚZF2Lw#6!^ځ]C2ȿm3~QɥO<m}R 0 X!NʧӘ@;zt] jr%i/m-? ÎM2;`]zM,cQs2=BnB/ r$81 8B,;)6 WvZ=M-QӴ*_Lʈ`pPb\[[T衊NK&L6ZXB eQz$OqLrs8=+6n>j>qȘZa oa ;\6AZqrj%,_\>olVJ RX%*V H/C_bZα wy'>os2َh=0#_ď| 0w߇Q.KcȴVDz5>ϑ37<ԛNɞjI"X8,A?c n-AdY0s$|tRbM3Ԋ59VOX50PDaOvCXgLUMJ9a))zbcaʔDa`+7Yy!dhqUc`Q.i%:m /.W2Z5!GY |HQihbdqHUXh,_aI[:ʥA #祐OjbLhhrcL̲]v* 8nj4v"5 DWrK%t [Z1{7'1Rl6b22t8pō7`kʗqL8OY_B$[}x,*##c,kp& ~ _8cW'PQTuFOc٨G󦛰UX+z|yFcD\T¾NΉK`YmL>5+N^06}DŽ# 6@wDS0#2QԻ@l[4q$zQ} rҤIذa}t7]B[ߊϫ_\R@G f<OSH+tdzRu (FYU0%D+gLj[:[U,_SKX51Rn;O/ا;=&`hL]q46"1tS3J==c:ƾ硫=ƍq'^` 8x"\{c]g9C^GilAxT >pJLui,&5c v p cƍd2!nٕXsQ^[6lazG_ `Xec9?3u4?]t1oR H7= Uj xغi#U ? +{rZp!NqM7╗^%* IDAT2}:vBlٴn*6  ր%$R7簾zS)i뾪nkA%ŏvW MMhnjrxYr53MMhllDP2>lA/g-![+˝NWS#J $tOykoVOu!I JrSjsd+MgHguz &2Ԡ—: >ܪU5†r#UJ4иpjI jIkØDc8̀HJShMb,2mmE|hGqkTǔO~}?[_^nA57c9O#ˡ՗jw&x>q|l͝ȴy)1v J{7US xk1­5Gݝ} m"\|EqʩJ@g>&nY{oXJoKJ tƎOmqw/G^/sjx]%]IVucvgv<6>chko3bC P__oXz5^= b#>Nk'51]x%زy3n dY% Iѱ4Zwt,,9h|a_ňkΊdزy3 \r A 2H ClU EfYR!\e݇[n!z\3XQ%:hO,H., Sc+Hvi7S1Umlt?=/~:~s똈'Nėe\~ºu';#]8nIt:mG(vu!;(GEQnOmϛ]xW088ɓ'CEil(W,W,>waxhD7_2ӟP*0}lry ko1i2ő(?(( ڸ <8S]7`WU/rV$s&LyB0I5NeK )3_~:bUTX?[k0Ï݃4=PVu`0x4əVu)L6ASs0؃9p'Ԗkj|=Ճ0ICT $:3MSN>nq%`&Xzpgn@_R.g+V`Æ 0a\wuhoo=܃Gy<$V>zј5{6ϱy& WºR)@<σWWo./ 'O&.̘1_Yy}\R:F;?p F?ksw~Z467ᵗWbz5 ;w}ֆ" As۵p}V3<ߎIt^t!j!ҥQ}?!9r U@( f3n[@<B6)L/ $P @(! S}CXSɁk76`]Z]T;mCc#G008KCP%fJǀH+͵XS@ hC yhD;{IZ{zNt3Xc~곈Qc Ijp1ңRuSC*T0NEDݳEf'UrǓ3xG@dLpY4}T #P)rchhgy&.B~xGpweZځ|=sHӘ>c`URiC>Bfjh4RWޝ;pe68/_9٢s;^|M?O۾e <7ּʶ _}_~;co]իd[&An"&0leqsG7QSx iqBE)ApW5ao4f?jNsuik2R-瞃~.\c\)1!a466e8=%6[۰W|Gƴ~\T#H5FFt>u;CQ "Y+4`c`ZkpbC Q]9(Ѳ%?VIJT 8RA)خV*#Ÿ X܆Sz;\gc+/bT̡A|u<|g58V"r1ޱM?\ R MT}=l>_WG;0R!!UP+]r*2 #l\~B.;X#Wtmߎ{oU??~p)hk~S%KOja[Ɲ7ހm8d ʥFFFKߗ<p}۶[n@s_r9y+*~$X[SVK n\\09O- ֍2i7 Tk/$\Bqm( )^)ޫ" T.1^Q\}ۮ$=#}pںiϸ-^'~p$)8m`&+$Cb H 4Sx&d?Jnꬑ(Z26C-2N$%N_u!^EJ 1z˜ JJꃏR_c_F~{{PA^zv{B~ 4, s_ߡȥ)^Wbӛ-{GTxhhhqى3f`yqԩSE|7ny… ڊmL__C;E=xGm/Z-[6㗷ފAiQ2_j#T` "tMGq,K=f*}2X{&tׄYقFk@Ţq44&"30pŖ)bMfHӨo6oĎLy1sLL:۶mOtڹC"2i42 2kkM>Io{VXm۶a)Eؼy3mۆc=7|3?HJ͛7cڴi<[nyw}cq51s +V5@ K` <1gGw,A2QsJ|IS3R$wX"QĪyܫ# SqT]Jqތ@HFy;zӃ)S`صkZZZ?!?xxxXnfϞ T*rYf j9I"9=MJMKF'vLx  B:;b?)N/':Ć7i9!c[71㪗P(K_˰1#BB,F]ue+rzƥ?DR'?i|ccUttt'|Fxr'_&_:, m K`5$sx"lWs@yJkWBĠR.#%QGnܟEZ.4~xkqA bP ec U'&__r~"J$Ƈ$ߪGVj{ͨBqUW|HP\ 76Ә8>os1nޥBs*kPގO7Z9ZCNAx5â)ђˣ-G]: */ϤMQ_JqgoЀ}c8Q__/}KXz5n݊>ƍc=)Su1ydar9])&[}r ;Ba%ImI`&#Ó"whe݃6"F]ưȘE1t'}aP-Jip`-F ҂[D:ĉ#phhEh)`ZAX_?U^cNC&c$9"A#@Z?$J22 Ĩ9' ķ#CRq d2ߩ1 HV&k։$B8+A  T ԑ׮Ïw4>\0ZSxƾ{nl [TCpH_^_rCی -'W^[oz@wҥk0gY*ƍ!7N(;44|>l6k+;q6n.({ G\0qPK(n@`F/`"I0Ĥ_Ƀ``F-h VZ@w>_v[DC { zBAUB#~X3GC(i'%*m zKeZJp&qib?en70jo-i0TJ%7y%,0&7polIɪ7cȤ+Z)UdqSD&_$<(A @8ddTV efym{d4RJBDM֕RL>>\,s!-V6W+6Fߣǿ-b!1ެZ {5_pu7]mS?P 84kAlH ٔrå2>3n=k:Fe< =q7cΝx؈b r(JG6quaxx8c8#bѢE?ݍ脺RC97nĿqMK}+]ޕ-DX غE\Ss1FTduXDX'׆'A{q՜S]N̰]MX_W}4mbufcc#f̜W>ņ/ISpOEc,޹ Jv{҅rC ̓LIdZ<tLNP__o H,C(f,HB3?A`KNqN`]p EaیkÑCDž^z8e%osym  /+g ldk񍛹ux衇ގwXf Νl6^z 6^ IDAT{mۆ:twwe]Jݍ{{/&M b޼y`a„ 0aBTJMk4 9%B$s %%=6[qLJa|pqa*rIfkK}k fby Xoڜ7[K Đ|ep*K՗}Nq-IVSTBTB&d%BՑej$QWЕJ%K%cE cb(술uC^ 5/ʆtDu<0X*T.9n@\BTB&V6XN\nFu{OG/:P EE~f^z=FbE8{Q-%~{bUVhhh> ҂\.N; jm6~˰aT*B۶maKWKD&ˌ |ŧ&n ڰ*2M3XOS0sH{80aL+ IHm3Nj]@tA/hv冕|[a[YIVn 3jvn ~X+? _XܾhKg" Ⴕa"k%׸F< #q#9685</sd0M8AH7[z+rDy:&b)AqC 2U"+*j+JczPx2;嵅Na1֙'e)߂2L~8כe\unhzZFLM2S?`D]]==xWvf;*ۿ:;;}v]<bmmmd2w}1uTqؼyh(iub[6oƤq: :MR ,ɜEĠʳ),ZNM6=SJqO9~HV#-rL2, NXuLi< 9u4m]W{P}YehOHqȀqarO{rh:P73|b8xRX_mT9YdOW[ JQj r婺{G& b|-NM; V?4Nmֺrߡ^XwDeiی]v![m|I8inPb6)c \N'! ZH`Nv+K. Tڗ ?eL LJ#pbNyK:|uPRU;d (Gy loErGBB(7K8V'I“|0Ty%ilDZCssYטüm~~b I3Mp B\l?%qŅNX2\l=885bUǓζ/nЫzdV}U:^60ك7lWguN lĖ! p+* ExG 22P(D`n4C#vEԷj* R?ZF-C`Sp}/3).ք<1)f*npoUr`\8)c)esrjQ$J25 l+V)Z+}[2+ 8'yf N!{"JjS2-LFݵk71i"s¢ú {Ebr|zzERiOR a{-©mmϪFc9N A4j"< ">$WF*Ϋ#6r\._=}. XV'ݥo0;26;G&N>rw )br@f#5(m;.j"iLD#Tm%&i~+<J5 I;0HٝSbv8C7Zk0#vf[?)NXtnT\@qk0 VJdkۏ6n؀FkkF>ڵS“jQF&aT*D1F&%#뇴Ċ##գ)Iz hqH:R@"?G&JT(Q( cpp(?(;J\ylR!N#J!y}GRARA\FX4Q )` H}D)1`U94M38Y:0wT{.(0)X-|!^xRF<y@~t|TWvtWW.0T*]TP}eKU-|;P, sblx2.Bĸ-OENInzVOc2 2FB9wy*8lM$B+%txLQ[hs I7KI8|.: +l2LR[`XFtHD+2_cZ'ʀui&$ڔ v. @f4qgO͌F%Y[m06 WK$,_l6awIlB pm- ! rLnYLwWU-ɖgSUOoU]N1d48Bar0y. 3:hfa䏸**ƽF >ǧq~( 3dv.$BY:]aYяv@M?_.-[osy jTR ׁ'`;Gfnu,9U配;o ܱ۲dON8ʍ@EY1JQ /LI[ynAt7DrFrZLUObȝ!w;2Ux#\K9x|;H :fhL 3&7we?t .OF8ڦʚ7XaYe-8ofwP DJ:DQP*h;A :pɄ0F"#5P5m輍=QHd+4]љGN}x;©qp6F*ΐfҰNi')+۩w+.&pG  C)1.v?TTypi{/[)zB;q<8͸x.1  ŻIDxp A 2UgH}-N& }}>Z@R]rCwݶ1s]1"CoDX_/2Wy4PaљRlf &n <]Z=m:$F=ƦCf3`RE9t/MFanx. c"H+}?{ +@]E9f56SOBm87՝1c5ԣy"352){pqD[L nr-g&7 f!s\kqwd`av毛#bjƩIRIńr90U 7Ƌ(FVUD$6ek<#?q95c:x|a#B;K鯘8aqŴRf2NzX=I!k\?zÇZQ\ZGC&砷^TԠkfL}ZZwBy:+-r)8B1db}Z^dL86 hH cً_<7pEFǔ%GpW`Cm=>{pe?__xV_Cl__S{κ2m6rZ#_(&E6ĊrA4c8q,^]LzK->i?`d1+OW.\OL 0lϙQp#3N\Ek V/k) I3KlHK}M렫 ʴC11 1NqlԇU}@Qe??V+u( trցlrkpV@7^˸SŸ< a7nRV@!OPd9٠ֳN W3pcCcJ)u)Nn,EpCRe"4y,y~WPPSS>}2 /n x]vaŊ{IɑwyŸiي}ގ_ZisFŶn>enڤ,i>_R;3 QB03W 2sz O.3lЁk ׃ W+/rgDU qڅS+ڣA-Ӡ7*4> q(nǚk2Ӓ3+ >+ ~8V XJ: Oe\]k!ІN8>Ole1XWk3PFU*0 =q#hgr2_e\9L$բ9$f֬6fmN`aRv53:Pĩ-s>lxH׏7 [WFuu5<" VYWmTVVbٲehllD.k߅'x=fΜ? Ns1xG sŬY裏wnO+pUPN!JaPb7s:,CAdo{w&T6Qc4Yk̯yr$ЌL0׃+FfB!ýVx&Z_f ;gJpc3l+_q LF;$+I1~(71Vzo;ևXѡf9%wuy0@:e⃖%ᦃlEaPtJRtPnS'1֪./Bvo"_؁".$*j8ѕ- ?7M3/. ed܋1?\1 [ߏ&4o~'͛wNk+qɱG7 FMd IDATh}B|jy_cOߜz N=qObkgzf Zjǩ͢tD<KNrq!:r=G;^7%a0ALN9YXyJ5Os,O}fd3BoudbQUGLl/s[x\z] sp2(n7SJ:4nraCa0Yj, yX{w8q#:uC}s{IRb35(`#''C:6W~7H;K+U&Qr$O x9xWlnש_ IA5ڛ.9sP>i2lF]:l|.|>c? nd>:ڑKh7~t@Eo<Gv/X-|8EX[3s:kznd1҉s1t ?KQW^>ԍS #Wi@[f݅'dNNbu"WO1fb1ΖqhMyړhR( '&S q-A>%urGA•#?X*?]7 F6 !78O.CmfrEPm'\pfC+V&1yAivWt_ Umqb/9(A05Ɍ/7jqC;E^}q(yS.:w..A '{*WH[ITt؁3rupr2&CZ^)K՚{q9t O8m@Wng"{"l޸ LLяloo466bX:u2cP]gE]cP)S1w\,^SMCOY5\;vWVkE~&a``5J۹1cj+ŭrj|AY6G~}_PnC_w/^yd)>yiB}~aO8;ϬW~QN̩/w4 CBeUÚիkNxo 1s<3=ry)5}+H%[p:t98f2w0r /UY-:bi/ 7~nʶ& kp9D32j}.,\ .ī >`@>ǡtA-qчqw㞇AB-܂\zX:˲UW+ĥ^,\oK.p)Jwt({{{Ժ8~4kyUF]Cщٲi#p$KᄓNơGqP3n>v҅e,>PTVUaڵP ImZt7غi#Pqet=83\,3^h30, Ά~,7*HkJX6ܖ"ՙɜpJ̸s:3@)A WعJwhbpOVSqdxݲ=~EWF͕{GDž{GǁjU P.g۲*WsnDC7xנ(Yb@do[ A:^lx71oyŋٲu<*Zfb>j* 6vtЙVl߰Ó˗c[10j#:尽GoGG^ΤQ<4K&㤣%ell^AH5ӊw VSO_t2^uFg; @شa=-/G(Nǟ‡tv(}gDL)Qpx nO`xk&yL5γ8>7cF^Y8#805\[]\&_;5_c +735{El%C[e劋V<+r>\h`Su+5! 0YuV.gl~xŽErNsu^6Ű8*{ {!+H,r|ܿAeH!<MPп}L'vlG}oΝ(#UQVE7_VWVਏѰ <~@=(>uj܆pE.ljt&Ňjjc)Lނn=^Tn`w|3.\v Wp%ː/,^ſvO9t9B/>4Z[p'? zćJPO7ެ5 j1U3.ʍLrǎfeVtdWQ*"6_6$k=mSKu)GUCG~RҼn@ -C8܈<ꗙ+Pa9L?TQW |p( -4Y(յ7H8lKKbж^oP^t-^^Qi #ekLcg#0!4*<.؆\{;zs9ڈ tI{Q^_:?gj2`'ehʖaB6ojܩ000M6ƅ F{k HWUaJeY00PYAπ~\ZkDÓD QbH /4 PbƗk6Ƕ.y>\b#&lDI}UIK?Nx~/Wf9(K]k1ul%y3m峽dq tΌ8|U;.*r]Ig^Ʌ ?롓mOkhy@xwnb |U a%=z\%KF?ƤC$Ch4s@.+ڧ;kCg_Z{w)`9',Zc ;wĝw܎~Ctuu,ƽ^k'r*fΙ25WcO!]U1зHf -kWWQ.7uGSOn&ML{rxA 0LΌ#%%6ȋ9oΉfkv\LrRN$sUQ)L.$LwyH-"5Wi:( /Tѩ7kIT>CVkXD|Fķ5-n?Gp(/r(SxQ~eaTq̼bOjvI(jΘO+t_8V9CA1bVlm]ށK;U8e|q8Ci' y|۹ue^@p'/}}w0̛9vlöFP)ζddce%jֶ`d&yqROF).EBx>"ط[-DstB)34q4E?œ[&YAo .*i&2d+qJL"qxLuJW+Sx}rJ0s⟘: \y- `H76Aȗ+k.n)/;7\An]ٹa=q\Z5s"),2#A.)e!ϫb{qHYߪ8O-Tz^>SR.vbttiSpчGK]-hjĸ?@a 9XXZva|s3*++1g|wGOwD/v< #*u:eYԈG<+{ 1:Q*6R<2QcN5swhRp9m(F\+ӱx ~+ MijsuQl% ,q&tuwzsc(kh {t;:#r1` ~ޤ.E@:5smNOfNM {.f,3 S=xy=G9̱DōUzsu xF!]jʹaMCm%Ju7ˊ{.bA)ΚNAdx!oͼŵ'f)+BA-Iv<\;_/5k\SycOdhe\Y"SjxBb3eu_ q˜i%HU܈\1"}d}oYXxS>CA,@dl Wrzr9莾{걻 /rf@ww7PGnB6o.jTU wO{~|5}q<ÂDo~[7nƒwQ 8S1i_CރŕeW]k?/.߯ 7l+P͛?܏ʫp`˖IS3PYYvlǯkW? U9{g{֛y`ԍ R<=3 \g8gµΐD"!";L& OPJ#* 2Ԯ,r=ԗ5<ށȓb TT*2ׯ6F5bt<_9J~^;E'_|OӧL}A]cf\-r2[n%]aѼށ.477cƍ8qw/A0zap-`8bt[ܮ J ? JDeYY$lRMRaWk,7?=lݴ eeeX|aϸj O.[7m*'OIxǐn=->))rВ%8g kעy\p%P(9$s,ƒªR2lݼ ٲ2,:P?nWcL2j ӦaA-?.͛ݝhjhJd +ݭ W]!^F#[_Lgf`gI J s'(?)W@9p}i!2U_#,t˸ '1A<\89a=3)ĩozlʋ\2ʔb}GxkH*d5s12]j^=Xa1gu>裯".A|g(kĞ%ކasFڱ:*Z,'_+}JR`0OeY54'[G}HŔ}}xmJ4N[~ga(/GUxضN=4r< Dj~1@:6rpȉDV:tq2uuӋ4LĐ_ߎS2#-7p⩧b/At}꺟a5<p/~pG sp c00k/8<Dᅮ(e ᆷt@FӠh"ӯT:lElozu+Fyn/+;;T,A,B #cy$ׁg&*ӝY☹jy"^WBC5* դ #EmCW>&E~Wv/䲀r2隅ē)f{KN_HT2\s,OڣX-|f(˔キ֟h#v\xRUi$CdNm0~\_1ݷqK̙Cwt^.P@y{56MuS?|\z饸QVVT*vN:#(okEm]>q׾q;pTTVbm*iT ^>/_˖??e: 76lӱ_6ƒXrىq /!>x{՛Xẕx'q)>-3MMlkvk܁,_sbF t-45ODg{&Ctӵ`ڵфlWpÍCWxۘph$I-u#O"qBB ‘Kh7JMijs&Ah|ڣઌ?rx38X1nod/؇ȲCd 7pl_\= 8.9tbr+҅ Pa^ERcS4vu|嵕?c!t!A^%ar=nb:D:ǖƯt "iO[O+O?|ts[X]U2 _ K1ىʖaI9i:q`xװm6G?„ pm<{9yc%7cY-[P[[00i@YDxX! P(02Yx~_iӦ:BEuMgҨDoo/kR)xm[US³?/}Bx+c󆍘5w>P]]ݻԄ* *͓&cǃw߅|>~ .TUSLSQU ɠ=.SQY}h6t@ ;5{C;>NGϽQoosi!t'"@ NS GV{!V?sq;x '2G @MWv߲s$+C-p\2t{{!r]L@!@`?'W)"@ dVtl[T<P;E {9r͇+6n! JO&ǟwM@ a$CM}N ꒜*oEڥ,ÂeHF> q, @ a4ôB+@#oN⨌rZ!%Y%2-A*>*$"@ HtײސNpI{jh8#W|WQU"?} It|x9@ ބ^-~Or{dEin'a2G>Xߪu~ $@ qAmq6H'?Јž4އjۜ|:[n;@@ h9Q-Nw.?J'9A=E¤E(!"@ Fȇ*:3sZ:Vdm[%҅ʠf @ 0:fr0*muHvlF02WTlNcZ)Jv]1"@ F:t"iӔ+"W aґ@ @Hueh0Ј_FCJzB\IwȂN lj@ uLBrÓ'1-C}WTqI&U* @ 0`ZR9,#Kg^9aO2'c"0n#@ I}vzܨvo!ěҪ@ a_ʐ*`!]c!uP?@ `{]ƛv1 :$ulilΑK:@ ao#qJc!)+@ a80T0q8N {F?Nk6'j$@  *Ct)N{ #Oplu@ lҫMW1Ҍ *pq @ =8+@&ul!2`8">P}$#@ aP:YA+g`+ 75y@ hE!g0͈r{)#n@ 6:9=6t EFz@ & #2Fs@'@ Ã>nT`4:@ @mv{ NGs@ : 2!'˰/@ aǞtNF#c_1Gb9FN@ ыxDba_3@ #/;r@ =} 1PF@ aO:B>ƚ0K @ $>X/?@ !H9">@ ccA@ X@Ѓ@ 0 '@ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ aU?XIENDB`amberol-0.10.3/data/screenshots/amberol-playlist.png000066400000000000000000005721561443320625200224740ustar00rootroot00000000000000PNG  IHDRB׋sBIT|dtEXtSoftwaregnome-screenshot>*tEXtCreation TimeMon 24 Apr 2023 23:37:31 BSTy!Z IDATx]w|E-oR  XQ,XN= .rzg9b;Eϟ]g4F^BM$-23;y)33;|癝\p… .\p… .\p… .\p… .\p… .\p… .\p… .\p… .\p… .\p… .\p… .\p… .\p… .\p… .\p… .\p… .\p… .\p… .\p… .\pKB mS.\n~NpIn;p\K(F… SD… -w7nu…]݆u:pݚwgRڝ… %n䴻Dž .\$ېBT]]L.\p!Hv]LBagawh/.\ LBܥwW&,]p;@C.I"tFN… .P;A.EfG… >2+OG*L.\p]5ߝ{cW )υ .:$'J .M]8Opҹπ]pvpE )vYҵˊ(]p?4oV:ZnE]X:TNp… #HCy~e )ggmWlO.\Mz4vJN˱Ո&('K K… YV%`o!߮F""%]+H.\pa&Fޥeg|]%@tM$J… H^0g+Jvb,5D#`'Kv*m… NvZnC]:tX+ ҸpEwwjYͤ[oW 2%]{ .\S+`yW ݚxM2%pEd.\p 3Q {<^oW&^^ՇLwׅ .'Z +ɚ|yvCƒJޝ byHKM$"^} .\`$o};-@gtY&ގ^./zL%$ė !|… ")HQ-&T7-#mKDM d"񚗑q4H>ǎGy@Ix=^NMk5 4%K񂥅/O{F$j,Yzh@rrٖG,Kf##v7 rLU"&ݶ5QŬ9X˧!tuqkk`{{r{K@kkֶ-/OJav)I ̮HKp 㚪6)*nK,Q$I8M Fi Q*4ՓwDI"іe{]Xc\QQR48I$P M3wr;14$XB"J8;6N:$]>})ZJUvv N,Xڋ^B:Q۔ɫ֧͝WCmR%vffTLV"ZkYxiHxʺ-3о3&-Q!K;=;CI C=7HZr >#H2oW"^@aX3:$TOG TB@&CtI18p!Z>`@b49##;]vbҵ+lFm,%5{F'+Wu;lRHWKb} (H$- h'v2 t5״Yydzc8E ;m̡)V;Bݖ1óж "-lt # KV9a$1LJ|SLVƻt^".=deP]!$H{ $Rȧԑ|W lTn)`qk=&)S! KYJ'DHbc6ђ9jE,]Ce֕|ƘCӮg'kGkg*iBA~=@sdF*fs: &9Nt햙EU<^^XaJDf0{r,hbc8sp8Qer+erDK/tC~UnK=yevdB%)HXrĖ%왊N4SN&e{c"W/DPcSl!.H##`vKD YL#Iur)9\k(m-͐b =}I/zoߙ̩$IHx<GBI@ ”t3xY4nsW]j[gyf61S |VƁ<7K:Dň']0f{?&QQ*4ˤK(D+FXʮgjhkz{ #{sIR˜"̅#Efm6%?B{dkff T+b:NdDlY2N_@ #DV._xf1!,wgI9c.%zs*6LFdN|8s>]_th_q)3Ej D%n)j'jj* ;cj萷砣ILP˺g٘ҧ3ufu< Ⱦ<dC)> z̯qe`w!^7iM ~S ZRa%a@q244`gp /ardYpM7\g7YǢ= ']|  D [7dzލI7s,//EQpau.?txϜd;,,Y&qJg7كp8Ȏ::IɣAJu)%i&]щn8X_hі/8;B=HЈfȁ]b)*^eD279oI?'EsȡƂ@xp9 /̛G2Zf"8S!=Ҟ?gZԄsfr`G`KӸGk^W afS rΓt&QL2k> @Դ%fevp3%smPrT)39'k hijBIϞpQrar4751KR^Io^"ռP[S!2 'D<ՋZDa2aeoo8Ϟӯ{?z@Y߾㏠fz}%|>Vgϙ}8 ?kkG)9\/Zk߈ -ه[q'gRҙ\ͲFϝ샂b454`قX}lN$݌ζǰa83лo_@MU}>]l\C7+lyɍd7A-?| 9hc,I(*.FΘ'4˵cW$^laK0L<[U;}fb!‘g=FBbHB@]u56\A{B 7Ǐ̛=˶kxPa=>{e{XܤGHN'N6%HyMK"-'=}&\ Gƕ'}!W/v 807lt+pv<~?&G|ِMC1t(:>>zu<#SZ 1G45PطnH8f¡¢"ȲP[K0W$AͻsW#lL9x }E~pkj`7_f'PW]z6>07{&cadIB 0f;0wѸ޿ K6ڼM2hy3w$IS|U|xg1nxĢQLu3_\4l8'u6NB <wN zx˯`Xt51#K_MSUϧq&l&6&'trjN 큯?6qg{3>K+.$[?1o,1Z0#c˄&$HаoouF9ZT ?,ybu ']'J*Vpq{ Ito7HP1bi>q2{b/K2nތ7} 0 9s9/\h·9N.$N7~F3kVĝ'#IawQ.[TR{ >++qrFh׵NpEIT4܀LC&Sw_?e|`}QNZ^pgBx03kπq 7jF|x<83;xNe}ٞtIB,c0pTMvLD"DC!|Whlh@QI 30.GsO:s;l&)Z2W~6Ĺb1nt{tQ| 7vydm<*Qؕ"]1qf;\W۵Seq)1͚K$2|Nw8U }rżtc!쳰j/?_y ee!2&*We;8Px1=Pto .gH6I.^KJ} $ߓ$204%L؄~h",Z`MH~7~Z7t0nnΘbWx8Q&@D"]w:o>Y^Y!]v#KފvlUyvH7-m'nXeT Tz;5sF^}6U`W;|_?Lyei/`Œ%WzK7 S@ո.ۯPQH7[H$PSK՘.uկE]-ӿS^| _s= @11 q(iEi"AB}xzYFpѮ_? a8|,'"a>f% ǃlt;Kա|v^}{빮1&|.Ljӌ32hO|CXĚK`ߵ55CzT^ G> }W`;oɇ84v[V|R&pەr* 6S_{eeL B׬mpޜwk#٨qKC?f'b*{wnu\;.| DeGd6 -7D '0 >|;`&M0 @ZQqb.:)߼=q"~nBX>_~1 1ON^V*_=n"[ gtRDzz]I#?9gi,tJM:yD7V6Wɦ4Xq IDAT%nZ-H 1ou<Ҏ\DĆ̓ձ <ӈ2PD=]k,l1jR`7WVK/FC5;fZnC>]C>(nJ@ Ĩ1c矓̧ sOL}mȲKO=*+mM )L?4Uu!MV]"c@[3+ Uns@\ŠdH7*]c fߡƯx6W&/]}`DI&U K Ԥje.)Tkɤ%'Vc}EP<1?n6$ ݎLݩذv *?^|ť B)kA7]O~ >?4 y~O= χ$̾fSz  "5hẄFģ=iH$BOWHǛ41<}9촐1d<29}Uᄌ+$ZB_aDwrا FĞ5NAÆcˆebdY>OhÃ<}x,-Y##5`8xY| GFo t[wqii ԑqz&sGf`տeGr$Kz<=^xd ,CNeQ55syƯ%xqo.>wkЀ?WwWOFAWPU ?P[Y dQϞ{sjm%?xNbnq2kٿG*gx5z֙t%tj FHת=qHWY ]Rt%%xhڋc0]ם{,Z>vzι$( >|u<;2f#(*)ŔG,I#JZ0gZ]^H.- %oZ/ÉFOe9vY<@']}W\Ͽ6o$IX5s?ư1c0hh,'a`~9;F#^+r9Q? @F25,4E GX7+|29=0:0а} ڊyg;,Yb?XY!;sNl=TG4MuY,bX0>N "٘ZtjSc}=n8lrM$ k>w4b{?>LLP1d(}A]/w5~<Μ|rrsq*}8[$09x٧ udx]ȣǒbkGNn.6ZiPx=lZ G8‡/>#N> ACmN쨩Aq2L(~ 2$Yƴq鑇CeLy]l\GH-,˘6k.90Ȳ}VŚ#F?οfsq,/]\ĸۺwAlc2YtDa!5pLݿ.Mԭ̜7Xf1Q@^ѣ jڽm=X3F+]1+VZw/>@Yea?ߏ= MPԳ ҋ؈s/=4Jzƃ]55x8qe#҂o\x1^|!4㙿۷xmKHzr*j[^>Ypr}'% %$z/9 !AZ>xeCD&˫$gD\Wysfg 7?]r)μjbI=vK6UgDY߾2&U9#N0bX_57֧d!V3QO=P􀖤K{"+ˤKPόJ$]'٭Np&]zFIbk A +ҙyh4w}/ E={fȇ$%0uev[xKBmmhncdIĸCo9/t=ػpJޔn0I{(!>#A#ĥ/ATo؈2ì8/L 4@xnkcfC؀@YNvvlϱSr8\5`Gitϕ*G1IEIH AUt+vK9.ߐ;h0 ^=~vW2=PԳ Sg˖^KgJg td)2lnAt%կ?<^/*an#@ށޭ$q?@c]]ٲ} }8;n݊so '_r)>yi8μj Mym6 t:I#d?QaY36,h~,w'tfڀ!$!gѰn]8ta\ydIxQ8S* ͛~ۣ$8o>T"zHCƽ SZ{XʸYHtEtCE/sإHB8#]΃Kft[eu> dOdމL? eD!<` 1oIIO?K-U=ms.\AN\7.($4(鲐z(\wz}| R ]QjdOT9uct쐮X]K bMiБU' jĸk):"`U͒Ҳiv~]ϦpaՈcvVHY:['i8)8&zvnЬKYۢ|ө7F|rtpu!k :8Mln<N8į$K@u}s~1zGHV- ! \t )2!P3/M5b8q iRd'vfǟ2Kg'h©p;ψҗcJdCn x!Nt$WD_t[Rp$É,pjZ f9K45{ %m`L ?O%d .x3j'lBzcexK ؄.퉗ovci7g,.Y1牜qi\+RWmiEK$L^ S)la9\N&"=? WDG#Imt M:=f D\%h4zWfo*+u -Fwz "MtɊČf^쪕:)KtGhE7*sKE@Hv=s[j"I9{sD&^>#G> 0kNK6y`s!vo <#͆t'4ձe[{:MIرnєH(X~zօ MǾzUg%P.E_ w2u]ѭEG >ˣ"ld!J,8'Kϔpw.YX94qƍ/%$ޞ`#;%Cd@X˶և!+YanN"aQ&C7"K`Nɻ+5a0FNtfʓ}K=Sa\.0'G u1B4 s3EaM_ gD/,܍,u-j.ěn4{X(P ЧH2ZÈf{ )E^={?j*k;?PP V.&Zw}z Xp(%_6cŊJEB)~H '6}X"?7IZVHl|&^'QҫS7g66'_#/g>m41o3OByEXl9J{]O=fFuFv)Ә՗65OY.l4Q:#].sY4bve]bn*4ցp=Z̳͆" vy릫nIU[Ъ,mhj Eb(񣹡z҂MRī_`M~B' l[^&478/mfhZZ0oVէ b/B(zi!MQݧ?U5hھO:} H+!5ކ bY9> 56Yd{;8(k|;mx}>ṯ9v,>}@qYF_&ҟ~B͖-p[6[n5LFI8>6;m}aqդx,hnM b릍SN1^~9#GAݶm4x}>L8s8Z'; u55hnlo/۪-BZcIbV9,Ō3˗ 39\#zw>T6wDִ3J5ǒ  +XnnI0Masr0ڭu'Y cO+SWg4dj*%$% ʪUꅁ#G[ ŏ jX9.F0o7gx9`sEI s٧-aԬZʚ: 1GY.J66##a ֐-7ϐ.$q\8|`c2iuMzøGai [eX{p rjiTRU{?g^vF?֯ϐnZ 㱣Ar\; 9CGJTAKG˲~@hR})K 0ĐfQ|I0b&hD0794Κv%럜ʄk}Y/}I~rs/iG?~ C*hذ I9 KqC54 c%HԴtq _(bĤē-^$UiKx[ %up a!{jCSh`i)O8=X k Dglg)-whN>ˌ{N'(aĶ 5$]~n.')Z9 r>( m,&]kmm۱=dK}vC+wJ yt#BWEEEXf(j귪0v)T)r3ۍKTI hг_9"HJ=7K CNMZڐWPEMA0@0r\Ed ˗!y#uh @߾zn"Uod DZUp(+6b_x`}d|xGj(`y< ڀ.1*:؄Z/L^ S]ɡ@_'щ)U#B(( w. xat-aWMK⨗7zBҒfOV"x}h*[!xRρzB!T V@Lc#u;׬C}1p$B! 39y0wj 4X- @Bi~hX_q2Q|B<|Z +ϔpQq##v ^bI#;g[wS#Lzxa}Bu4*=a@'^k)-(H@8ǫFM]+z 5Iv&UC>eP bɑ-,B8 G=ևآybqXZ"a{ Кpg`G\O;5_,  Iòې r0 {h B  I[.NrH֕5}#߶L$]~RXmOFڶN6l#4+"]DT5iK Ye7C$^ z0 (Yi~}Hey=zẂ(Pbjri ia#҂֖Vx>}z C(+ZpW;GCqm-W0ίAB=8~FaKCbaPQ^M$IC' ҵQIup tnFq'~"KF#ͦ zf_gs+̙5,Et-i5wήSˢoRZPzD<$Br% m!]U*"j4$ɐe >45}D^A KWl@cf IDATQB'|F4ImCHUQ8>?re?*{E>C >NYA? /@p@h>lq%@ dO^ɿJYAk/0I;jYD*0㼝 2lچ dH#];&HXGkO'kiy}&c -? t׳w#TUfh!i闊%HUQ떯@sc#UCJD[[!InX(j|ԕe(/BnUBJ!%Hr!1h2?!ۚ{jF=lު;!Q Lpd}֕uM9g=/N&QaKHh3'kj;*.\t;zp} G.-=^2拰u4}Y]ל˪ARzM[B:$ÛH[GB0?G끦&o0x^(J{@ %0j94H(qx4 1YASԗۯ E9Jb 7^M%7Չnz@Q-j4dI|tԓgoas='/6zpƥߠAbܹx v2< W܃cÚ#\<V.^[ou~kà#mUUx)Xp@IO>kSe~p],=LF"HIy=!\h׳U]QzoeIiĽc]϶5riQ.&:b42 O՜rOKrȬ@WDBIg>KHDuk5mÈal)Y) 5ee h{'Eo ( &!G0䑡'/$A%lo Ji|%6WVcC-OSͤ4$|E3aCFǦu2a>g]5O^[E=q 7Ͽ;/<Fq&`w+/uq_ ~g)oWgO4  E]MMFW\*+\a@Q#ų"O+GH7 ]ϰ]K.n%LZ8(..B07F #{P\BxJP-0d $0ذ A86^/rEM ?DXI %،7ef(?mAQ4lmJly$?Κ>d+/I1`tK+Űaj#7h*|:#ǎ_ sNYv}3f Z~ {d]ԐgЬ];/3!<*JP,%?dv"f^"{&, tyfŞ % ww8a"ѭY]8{M.фalތ{%Ӥ¼ *YSЯW $Y$Avʰ\$Ba= e͊\ _I)䥕Y^ClA}$*bPz ЖQ }aöFnڥ۫qē1pei/`a3{ujO}/^xxu koe jc1476TOEv AI3|Zt;QH,m'D`̭#C=z;9I7# &ڬZb՝nMIP̓%XŽVxs^ǣˠOUqH* $%I2MQ {<<DqhOJ<2TMC՛/# I@N5 ڊ/<r~v? MAc Uhh$!cA(,ò-(D#{gqɔ!ՙ^}%/;ѣ7oZ,C,Lq^ c1<}λ ϷPNt%9ȣ|46n?h'{(%r$d$o w:dd(gɕ^6Vj9t{!hzd}F͉}ͩ(<}$]FplN@K4MT@VTȚ dhAJZ#-ۯS4HZr9:iP4@$$ %H^ Z~1 W#*( ={XјH$FA<z(Ξ| ^}Qz65z ϱx477 {oH`^.Ȳ?ĢTv‰(ӇTdx<wءt6aD<yg~I@e <= M.}MôMrdWb$1F9Cۨ$d'~ JGJC-9Kf0ON^7IYưVoC4$->s~$A'U% hPGM"IQ87HBhݲq P$jUJzЀ% ߇\@ !HC+"a|LGx9'H `êɨjHsw*Ms>wyڐfۖ-x}T>m͸[PZ^֦&w5:勄Bxq#b}Lׯ\{[eN˚Whܱg]q.h7EKS#oO?g$փF`!p.=+a] )m>xdYUK/xʄk}Y/}I~to57Ew(ۊ!7&@@TIWP| Y/AT( !P& %GƟ)@"KN4F_8PbQq׉?45ly٦xnSܕ@&sa^ub8ɧ?qab]KQ(I !ҘFwvH|m*ͣdkZꎥlYS`1q||AV⭪o08 @ "R<3$2W$W\T%k  ~+3_Ӧvsl=/#cTblmhÚFZ;]9/ `x  Hrj YҠj2 p+4aي&$P8n_ě+/GឣQ5KT= j?b|r|j>D%-kk!Z"qt#zbGST&Bޔ(:mᬫNt%]&4Inp#]ǣׇ;%]0KzJk:-!2nn-CB<2>n%j[}{<k2b E J5޶V4lF6?w7?4buq(7ǡhjz'IH/W9%hY Rj `e D?J sMubܴق˘RFͦ\[w*  .PI(+"6Ckmg\M6ܺmh^/Fl51|4UW+E~Fz%=Bkyd,XU~وP$ I>62*HH8%,>'9銹Ht,fDYA6[h=roRLtYu ҫh"`Q/{PXC^?]>= QʭX~+w(oGŵ8`X/r̀8| yXAS4Y_Ơ2TUEƤMK>д J, V>)GayE . FKHXB{YfVjU {O 24D0M|:!0r9ca0+{[y՚.cǭ v2~ۗܰ#i)5 ",M ħR9y N a icjkj92n3{JcJrwH&H3qhr5Dl7W;Gnxg,p^kqR*JSWt}"؏a>={F3M=N[ :=]j;AW<Do:$HpWg8Zh,>afZc\n1>DLpvl:Mj*NajL%h'> 3KY{*&8;Ώ m\ԒeGh -9;@TD1k rCM*W~jln"zVʷB&:u3 /c$L/%Wt}=r&,dj Rg}JWkXg^Hנ@XPH Dzv7`ӋeZx3o׉ڡjr?Э-rU 0Ye{ʲUf{FF<̇Ȯ|e'+̾2rF\etpH"usF'|fP1jAL326ttmՁneP>A;X-6j ~Ai"*}.don  VFH^wy9kK vJv:x+ ey& seTjfBT5c탭*uǚ![U  EcKr,QUԫwӊFy_u/ܽliu[M_ ZRB^)UZZRbS0/Ɂ9+JRGa HP{ޮo-7䍩@jFޯp- 2tʫDKVr/#Zu˕ %LbTᣆ] l+_J(=qa(ztӿҠ+g/r)[>[( ~aԕ9kM{Ap]Ik!rWnzvaʳTWj OP9s_8< ^|u]eS{T9>kQ"h25wLUL8)TX͓#a5`WIܪRٸxy]tS\'X}?EO8~ʮl?oy*>2jzOǫL ay,Rwu65GJq$cRå NVz~ڋ8R=w=}4we-ـpNy]eY?ʠ Sbڠb2Y)zY]d'C}uWQm/5)\gR߲ #|Ҍ^++!@NUzs Dv^\5E0R>q#"eS U*F7mc3)ؖ)FC̣ 6Rń>cؠ/ t]U^NGRcZ6O^g>^Ms4XW*JX9W+XNs*ûն! U3m:Iޡw1+i ; \cUi>$=G:ʠGռ]]K\ۓ4KJTxurQ$w*)4UE/ Y{n<~Am=Wߕ;y0;eLGTN IDAT`zm^}I͹)l{vNp6F3x} hUP"~#<ȟS5EYZ<,j9|~Aכ1o[GtUsp×'?)p Jqp3j}Ϯy8[9…X禒^To@.O|w ]~PUJ>P~R3TwoʅIu[xVzK6-t}Aeɕ[G;x*d;~gUFNg9֥҆Ul{gj>(fN&`\YyGݜaMגW/1ؘ'ز(Kx#}Y${73_AjAK0V{p F-F;o1`8>G/_`@S 4M I=FMbnTNV%X-Vѧo^v\ϱZCշnK5`^5~Ҏg$X͓0ԌfnC Av/ z'j ȯ}4Gt[0#8ӴP$rI'_w1fvͤkWM̡)HpS>bA!&)Ѿ o{/1=PnU+ h&xP*jG]e.UA.eND՞eV:Pj?%q3 #`]% ko.70JWML'L.YpS3tyxF4Kbl;pH8@ndx  6<ֆЂ:AonȲ`-ϓL31NM#1<;H;@X7x bci9.Nd LO DC/&Pnef(}MHͯtl9p<-n% n]8%_Uqt*eM:٧nWƮNu\w=;=;u=vn̚'u5[|Jrd%DB4RfP+;D> i짵!::c 2ӄ̡v aoa;sjii,l= :)֮ LIct޲S/w ?p )tݧɊ$kkP PU5#Kd5~kS̎RVȭb(TW *g-tu2Ed5UQb <%/m\(ӦNDєA$Y?;H'!j=%hIl|˫8x+OvdlK7jDds"@,SKG-L$;1+!efYBG'6n2?1+?v tՐNRrݳaU]r\3][H- wP_yy\QźlL-jX ͞) N1oA}W]8:徤$Tio1g:ߙN3x+o Oi3?' #r4Ш192JĘ?;(+7rޢFsNitT(wld2QOHCNHmcn'z$T{>HI:ۙ=5񓴌hh FrbL$ WEjTz+TCURTժ#Wg׳]e,ge#.(LYsT& Ay]#O]Y>2C4fkdv?Zio9Z5&-jaipv9Vvv~M̽i#] XaLH`ɄF45`*g.ռ9V R׎R):o5r\ë\EY3ryz'_ E}RrT(S)C3^=hbmǂr@C뛈q%׬kmoMS64M .+?|<Z{iEo}[=%w&節 Ƭ0Az;h;vc1M|˷7D~wd]1w_hJw L eϳ7p磏;S=ȝ>/O.[x_"Q\'>v_ Rt.ZDX3S,Y@ Ȏ[_'&O}6ɭ[n `|o>UA<dblv~M]wrƓ=ȝoB>vۧ0Ώx|lz~~I~zwyuox;o޼\lQGUϺu6xu\PYlwKœkK 14>dρf2rdVOhF8  #i N00o>frv 7Eٱ$#l}Cd}4i2h c= m9ȏ~ϟePh#-1Dd:FCi7EIΙ*M½M,[sLcN&I'̯UW]ͷ~z>uWG"oFSKkEx 7}ow‹HLM=?î7dݿt"I:߹K?*_V.[.О=%H;/Y|odԱbESg ‘(|;C!6/D7cº/Udt@T8 ޮLl7z汯Zʖb~ԥ\yh_|ӻ-E=PO?8:2 j#hz%M&XzER`7xLfL)~fGkz2!M-DbQ̜Iׂ;t$]#ppy'77Y=-V3zϓ jNnz~?^tSp .Y@h4u]LB_ko7%4gIRzV梋YvZֿj߿;O>ݶYl9_z}v^-oڷ$W?>OrbV[3 %t8ڋ.;m)cJ Yv%ͦ?>W~t/ں:Ga/Xg//v_=,^/萺r["R2Z,DTnSN MZ̫,L:NKsŲ~l28UQQX9W +&ֺ0# qStI3fMv8e yyo}#,j?LP0<4MbJf͝i i옍Ӌiq_+23JnI75s-a~͔]LQ}C2Ƒ:SQ¾!Bx/crϳ\l.ǖnpEN9sm SU aWE(Sr(*@ b-4"!F1/GR%/4]2g\4SIHij]\""od]9?-Oyb7Q 5-X4.B'54ЀtpS;L^}ݧc⮻hiow\y>/ロFosl$iѪUJ})~QM.Fw-7ޗ_įYa^}Ma׾ /u'vuyy*4:< 5/A9ns[~}jrB>|*%]ώLesA,@y+g9\۞S-r9yث}ٰ<=^׮DB#koʐ@ Oo<|'Oso0E´j% bdsLNNaDid"&X8P$̮n(3 YZ[8q镄]ÚP Ng¬}DCg =׏[n-3~skh`źuK@;_xL:ny?PBž~1~y-g֣i: .erbdo޴yo ֟,\†1'I:n% +uynˮ0طc6P Uʻs?g᱙LBO-kgx3GtxL@;la't1wse(/hzni0M&IMw5C-Cnrښ[vd끓Ik,62_UYn9/@{\29 ch0#q-]ʍxa0GOBgO@c K41ԩ,[{olt?ĿFn48;D8VgTjpW(XTۣ{TudI! rcD`zjW_>jusy,_/P,.m{Ƀ?+h7."?t{[t\ƕzT`@.EŗQ' %65=[D@g7D0f槥Z`|O ,|#?SHsˇo  OV,ů8ܟwNT>0锣~G>9>gk%+rL,K.~kTG"/%8nlQgo'c^6y*y/ v޾ȹ- DQn WOZV7zW)f-@BʶgdIJx d2ǚ4Khnnfcf?QL3eagͯ]I3rZh zJl;hFƶ&yz7$z~)j0 A,%EϚܻGK$ IZogtM!d9}'8.8(-#[ [N !LAkMYs-֪ZJ|3h\..zz8gWK$X~ F43Gdg{VZcM ֺtFAr56p7Ɓ;|L*U,sO˚kk^Rec#aVƩ%_w݊G-@ @:Pr.F*JnRȤ&wl8xֆs"A2H$uI&3mXz9hl@hd㘿ߎ{E[d:C˜y,ׁqqR)bLYr[L*Mmc3Z,t*֯Kr\} 5?tnw4Шy$V;;+RvU@W׾Z&P%zyۣBm|[v\I؏K[֑S j=@׍UdpihOSy׳KY6*+_廝=#3 lܲXv+WR1톉$Ts#`u]fp@CH7䪋VPuz#Z0 "@&eKfINL091I0"ҘeKҍjZIv5J1QA 4R5>4]pÀ{4͛f5+VLeӀ0A^VkYn}=7^N7ԫXՎ_u5 t] noau8(z7ݾU˓t|֫ݲʇM(!h,ۮ)ǷZsT g3YyEh]ӈO%h]*T"P=Dtt]#e,`6j 5k  NLё1}㌙S$L,P= }ynuk.Xa@(0 b5ˋ*AM*c[bL*mD}|;;Ռ?B/N:g MW ̊8o?9#G[GXT\V#K% 50ÅK!:Ì cqX-{funm!V[Ü(b| IZ" M"Fl2K,F RMC5ʩG \|ŕ|˷}sSGr߸7<-;Kt9y]%W_û>|=4޿zapeݭ#6^y%Wg?Sg:y^?9K|a 0Yt)C}}T[8yjw W6iEJHSrٟ^{wZǴMA /p,9iZ*(]b W%Lm,;X jvt|lf&yo&B0z'I&Ȧ ;qb575{(d<}daN fxӇwR|ɡ)XE<=E4YSY,~-'='f2Oqɤټ _fLѿ4yidYhee\+IVv}LYznyt '[K;2:4,K"OYvvLfήG=w\}WQ3& DUxN]u׳p Ku]|zX'/Nsr/[ӴX\{-e8$I^!LńBǒb7xf4ciFlBQHRO@,!,ayaZ @:E"c ~8,X$N.gn዗$94iap"k;As}U B2S +_%mK}S˦vpBN_)ͤ~՟k: Bj2O  5ߥy‰#G <ƫՀgjp#MYR74U[%[å˙ C4UWddBIY8xyhU!tn@0e#( ;9!4Bhz] a=@D-#5aZF~dY`DaBAhF(492@tjujS̻j%9d߉abшzcxzUri >;|_|?+ǏXuy/zvb鹨L[}xVҫf϶mF}x>jQ EItRnu]$i3R%dVԨ[_*R2)KI`Ϩ>u. (VLFme3"od7:߶9Li&wY6ЌB`nDGFD7Q8 1cD@/|ZXFAN }<>]hAq&0Iz_>H4Hz6.f!TDN b.z?n7/[ヒ=۟:d3~ͯ+׭G4b:O?hE7ko|r|c/Vȗd\7FuSTV2= fk[;S~U"ɔ!ߡҶK""i/mig(Җw/OR8`B(.%jY Q(.tiFN5۩ҪiakO]g٬ȧV<*g74ƕk%Lv +$fqS #C p,F'IM& zIkPq\t*ű|ފ4kO=?η-i7&)!6+&OƬ9L|?"Ԁt"_"oY;wd>ЭXXnaq'oC&Nq_b|,|?x|}뛒8\UE,UnS90{d*7*+' fi8 [8%DM]J2蕚+/7يusy,_/P,.m >;5>8 NUXײH/9CP w].y^H9ߑ?L,%`rzfR\'yvV"YN?KH\&Sʅ,O7«lȤYaז·^(Xc=g4ڕ-DG˅G6=VY<*hi <S\^E@^}}ms"Lz^3SmǸ%hf~XEAwDx7[4A SȚ: %'YcϾ1r_AH\Hv|М94:O>A`JadHh(BL&h`"'hkaxl a+ wZ/V*@(m(X32v̦EEXLt½z7MR~uеjw C,F(D}uT2K 8~f 5 PJ30P@g72a995:S1`A = 85!NzNu}32#_{րf2hZ74s /8ԏVxcF&# XҗY]ѫ{ KU*CK*AB==TT>R#=\ٿ巆Ra܂QBIN<\+BӔ;w6ls\\ٚrBeUF3:"މLpN3G{Fvq}X8Hќbi#XUgR 0CJP36DGro@hSq+5o$̼k#/BzNԡiv#'Ojh$!:̮$Ri4McբBzh(4.8$KRzUwct|{dՖU2o2d뷕sʘxy{;˹]Գ$* ⡗4~aA֍NbfweW>v5"kC$kÚc;@[Iy[ Fh R[[KDpPȑ#8z(_Y4p-gDM :1$(f$Ø]C h-t@@CS'rvii>TK C蒀h]ɩPc(>AM4\Y/i Hx*PXz~, 4)y{z֩ ٔV6fxfRڊpa%?S2\AؒFģ̇X_4[[4 tx $\7iy+ Li_|1tuu:k֬6ʾ݌<־au "b*9UP`&% 0pcs o&#q^c adQ+㳚Y9W=1H4 Jj?ϣ-q*JJ fY޳y>BSgJKJղdVʹ9g]mtq2[eⱓ^ .U!K^*J3t8K0R t@d|lr){~8saڵܹr?Ƕ-,D,KVuSQ&)5.CC$LhnbR 1bcq8fM-S'FH<^Кjbzl1rfN8|(˖2.Dd6BYgeJhW%*^$VtZAZVHM%f]Iy@֎%_VNw&+R1SQ^'Z|]4n_GE8HNU w ]{@ww7}o !0r9ca0+{[y՚.cǭ v2~ۗܰ#i)5 ",M ħR9y N a icjkj92n3{JcJrwH&H3qhr5RiI[yũb̄jE#י.M=+XP 9cBN2!xBe0ƞ(Y\9Vlf*`X[ҭR.rF\OKP]8sw】{Dl$HpWg8Zh,>afZc\n1>DLpvl:Mj*NajL%h'> 3KY{*&8;Ώ m\ԒeGh -9;@T{>=%*P+AW]x{*]Y\~{O/LՔʟ.#M[ mY]k&Mb*ҲAjp:c"I]9LCD/ vܯ*RL¡#^ܺv(~yQPQb9 q&"r]/o׮"vN)VJ=]L~v=;*ARxNӸ Ujtf{+e㷼?[>9jC^G1%GdY.56hGUIߘ-epp=*=EY%W~&}RRM?N^0Pner*S*XI:(>bxcݕ|׭%~t%3喰W;z|e8&VW$C XN C=#1җtc<DnOz ,T\aUe~Z-z*K_Q=V]aݶ*ZyMKTCQ9E:=\QQe82\]VsXkyWC9BW:[*;KM"J^u]Msp\@Zsox4mnXќ"XQE d ]{`z9V:ɺnu}VZЭH`?R$AU^_%Aeu},~?wfE?u9LOΉF QkD0u]뮢"H5!If9tt~o6{0ުSUsu6hOT]s.J1We<yFu@E+K7=;1K6ҽ2/[+|C{VӁvVPJ[G6%U X4'Epsbd֨G*CyVpK4΁W|!BY*<pL:R A`uHzt91y/R tX௺Tfv tu8q?(@S+ V۲\vx;/*?]3Y_]_|W5ooҸޱ<"atLְF*˺2c0tJȞmTEjnLT?w50t&XC+jӞ tUc@V(3 }]54}]tm 5P B[՚KѰVܱT+=B3^pj-W5]az=3ޞ'^ի ȫH}_g5YUFNgDZD̥__m `!ҧ~}HVP$f64gxX/Wۅ`F}TOj۠Hkq:Q TM%^ѱWSk̽J;>'nRmB':(7Ҹ &d/'(TD9NE^}+lXdzݫ_y1m=dkC1GE׃:Ye 1VoJno. !l /ˑx~Y^fd0Q?3WR e=B'E&݊7ZAa/Q}ێ4`@yցpu. ܦu Fx]7Se] &<_KuuyޥVNfu\jg (tzhEh5#AoNOB36]MN)[OUrǰE 8u )XA o7p﨎ۭb/"W\微M1~(A /(VHSPZ 2F]5WZ鴭QVc"j?Lꭖ1{׬kDR\ķzƧ:RgQ2ye-lye59ķMn`Wݘ`?=tfCDxM,8TRlcMĉ2!qBrm\H9sC4F3|sNAEt'6{e?DBH!_G`Cݎ~͂QiM R(n:e4 m6(o-ԯhH U\1t ?JIsc1B~W,QٓT\;x.y, 뜎`WYwXqF̖Y_wϭfo_ 1i+$At(Ov!~x;Gџ! + =7e2&D(m`i2a?G/|AyIgRs0;s(Km$Dl:?܋sf{* &X[|-t*_%p־?%@ȓp UW|> OeTb7 q!= ~9,yN/@Kth(j ioNkP:Һh\o QZpQLm 0n9DCu[H$bE%"h4En!/MM “i?r R&vxm¤ֳoL)Ȅ#Q;1tCȐ71ax.b{GHqzr}4-^DHL?1V ǨT50]UR|B˃45[hWVfa]V:i ynEl˹ iz"^aP X1W&P[)TiI8w?4%#LFc4D,"K|0:!l="l uYfҽyRi/@bP3U +W"TZRxUh8xUQWQ'_7O#(xvB Y"zrjQ\&Y.4T8 %`/],%%]q@h)"솢;K2#+%-0rOBRfH+N>!)% ēDgN6v:O6j'Ҙ;y! FGFX3b&9f1U/m+tu[w;!Yc"2>{cYvOꔑ6=AWnޮ% I/τl@# l?/+ :!&P-gnS à 4!߹{4.Wn. MC9Ryjz,=̈Maڍ/g"076Wxznd+yCpھv0o$|^K]Mx~ٜKۙLykiԙLij$m9~)͐2̉M 1hs1?\?K0}B S^w)w T6`8Ck(%oRU^A}`kdk]~\dlU ~,aKӠVq d[]jqz׬ Ɲ+1w(F_Hz\4.ד4 IҦ$#Cddp=A}_>bg}!+?p>Kg7Hrb#9|A]pZPOXCY8} Frki:#mjCd(h)mL:5} Gr}L]v Yehc,[U@SJ6T_VI%Ue@Po\3_m꒫^WMnT\{>X$;yFe,iX)rS0$:nu-cO/R֔BݶpQ#A_>C?O/ jbtPwlO_;ILm`ŧO;7  3of;;w2v <[τ^@bJ+mпv/;n~L}J;y9/족&Çn 9*||SR Ie8nLlx$ϣC vRNgشή!8X$Jۧ>Cc0^L-xx3G~r?~tn.=XqLoWݒꋠr8ߓ+S=̤?de< Ae Pׄ#UӫzxǂtuUUF&(6eԥhu^pͪOq 0N=^Jl :f6pxzã,yi G9ꤕq40ѡa& vx&1 8tJ,^q,iKןdvzz'L51}XU?hl;ȃ'ñMĘ'Mj[HLf }qr[;Np̉Kҧ-WHWmT.k퉶 Ųm<[0O6 ju>SleR=@%QTj*qA"A~ETU\WE} f<Ҹ^_”4CáG-zz2,jmMhn#>YGOgӺi l=44Ofg00bC RbE4,!cҲm$]w%O] 8w(&7sq<ƨi gѳi+/AZ>_tȪ tfP9H2 Rܐ_6ޒ֓ҕ>{Zٍqwj+ٺ_ ʵX7!z1W:ԁpWεjm\1ӑ b`g{vJu%ZNً\PX0!Тe&' qMe 3T _=o;شC9c{kny\>saB"'<N<)G/z&&yӊy;2-|efY;M8%?m>3.,ԆfŦ4R+@VJeT/IS^S>u/ Raqyپ[68z BLFk?:-_F@՗e%lڑ$΢0A7PY%í4*Q8V(T"7U4 Nef@(ryD!bq{ݗk`/lr k6緐3s 0kQ@?Ǟp'bӟß 2Ri|ܷGﻗF.E54Fes69oCC$j|ƙlٰ\6Ct@4Jyx}ptF]$KU9td#']YR;v]uk^uTjZm?$c,止(: 6GȨ/5nYX 1bnI"j3H opdd44}+(äDJI&ASk D3g2} voYX Ͱm.ldZ+[Zf ^B#2f4þGǝۄaJ.~۴ON]}=K/|'r=vwsR4qG>ʽϯ" zY|9aΝ^+%'&nV(;kQʼnZ":W׆KwjՒbvͽrv`0FP&V}{tOux0+6DPz0Pˁ񊺌׉Tt.J:?IjdyH 5ٰu?h-Kkm4=+#dEw ,8zsϥmP3#db_~1sBtG72d14<'s9‹l率^`d4M,$8nV=ٜo$hYjؽ.~kxO$:k .k9-oƽ_beqꗸ3?o| Nyx}ٳ 7򇧞{̹\P6_2GλeH)d26;7ĂKYr% 2-Yk7eE!6{߹Fēg ?epipw|"{%ruٶqyRJ"_\{-e-\O"Q[˷+|;E(d3ЃrY|77ޞnnX?It .oW>Opқ_ Ї`A~7N`sRyxoOSOrawɀ3VnNXh,IsλBZ'N0B(H\ffTmh(2>[%ЪTA*QxKJ&fU2jjE_s^WՂnP*}NE 9E6,9jR6!fɐ@(o}ROEiJ8&1<< B7!ɓ`v"(;:l8aY4f #3&kjkaII>zG5$2Cm8 ODY>6!+^wq;¼?JҩTq~?rǭ?g [n=;^Ǭi8 &q͕g\9̳֟po~/~rLL&c|Ǧ 3<4ĚgKSK Wks4rDCc#]//_~J}4رy3dr]e_)- f_exhVDž/>4_Z>9͚E:`s0g߸_?v1O[?yti|`YPIy`p~mQ.VjEh *QC6ԅQt[w+⪪>Q}"`b|Ӹފ(]q 'I,/sv/Q;Wma}IkDX []JHdrn%E Po?͆Ps6JyE+󇫮/\ lM`MEM &ܺ]=L9g3kb -{Iݛn kV=wh,꧟W)#]Ffsowp$¤Sسc6K IDAT;{w Lk6c!gsk+f_?.>x'C rmSK.'߹[p9p5?_} n_?q:jxPVCu5'ciÀ<غ|R$~hL:b΀k,dPǵ(ٯ 𰞪_ ;oO;jv%9;”8ҔIL_vhB`L7P 3e s 1Qbfo[HM2PëOsIw`':y [bv%aGM4?<?!n&Zx?HLnji W#_rPx6HpA_ӏUK;WVpq+8c8| gw>r~-|ٰܳv-N im]m!ZS_ͼEhkosW:C:,.!]kVۄ{eH'azB"pr5o&ӳw+Vc«2ӸxU/$L6 N8P*Qb P@>o̓ʼn%j1&͛17m$/FG2DmA1ҳn=;0G&+<)޼^O&gs  )i )~Wz|'~\|)7h[is1:2?_zp})KϜ7vrEP74So@gxp,awg'/3bӺhko_{;nծN;\} }ŗ>{6?^Im]=_+W~i$GG9CwE6ɥ+W5oRJ~?aa|:T~}Ӎgח׎.K)WET S\^I:VtKPE;ԁp~V`rt0x}@UzjL4~iּp=^\V+mh8ɴDlL^#ʌmg6<YX;6naxh4ɛXn^!1aQFg.ĜYSi[8l!Z ODÀ.F2qi}\(c曨/8Ã84 { @_˿Hk[W}sEfMR9‘{M<<87>I:c_O},_y>^zy{{ye~H͗ǞtѤ];mY&~߷M?Spy6Wi:^|.ȇ{]x=xϺW RJvoo<ЃosO|Ҫ7!dtxR]oz^.C Qi$yL^U&]8Rՙ~@ʧ:y:yQ4,}IzU)5VRt]?T..mg=;Rl*:ӏzMqFUt o^hxʟ>9Kf!A4>˾L?;:B 30Z;D={C7,ѳy~L޽,<~\|!Mqzpc$M5»9@(PGo~iXZFR՝n#=TSW]tbTw1amVUڪ6i QMqFfl6JV&IJ I[tN1q+'iVXQ]v-X ] ,/%,B׹BX-z-+ y gk5kkwi܇@XH,<$4wZ3;Ԓk is1{|\~ ECɚ<{Ӝ7&{;=BqajB^C,g6&J6?jb1.="7^MeޢBRA)ݕ8x@~7.΁6T]]xXˏuLjTjūHֈvRm|=^s$?FxNE2afR jcQ\3[HM`6m8||,-̛dOc %940hDD0iF4yyIO2͝LKm1_0t2"L #ě<{:Ҽ}b#矺d* H$"F_|JA,Wj!T2:<<]Us?+8#GڔQM,a@V7kE0P zs|Q*O}~k yl곍c۪A4~vfH xCGFi9SU&Qz:%u0B 6c['PPO"g~`j/tϏIО3y^;0G5MB+D#Qj(y|疴 x\y*`;!Z ws~ZTuUJUΚvg~=XTQ+W8B*1v.oҫkǼ, mMZn9ުdU.`(G~mV( \lU Bəos,$]C <' S#IRIB\&C$#7ɥ3NJ4/f<3%:j9P]dIdPkc< Z¦`nv2!o:X\zZ/XɭG*;;6|e9q^*;~>e~*[4,{uF 0Ÿv u>-Ozu{ľ5~%7ny.m}|pRQq꧟vUv%ٹh4 ƿ_c~p7XS0W;7j֭*45oݝebiSk:՗*WaqY39)z-)j ]Vq,t˕_ ƶ臍tQ{V6'PAbmWSJ+rB8qjPЅ1}R3%𨼀_<sx>#dijkkD#tCꛚ8gdH462| F߽#m/CN0Ӆ4%Cӟ!k扄CDYSrgqYvWAGאG+1+Hg2<#pVpڻc;g]1x˥0~ cۆ H)W~)My~JERV?Iԣp+p0 >s7ƋO?E&&Ͳcf*Xk1L2,IPŒ6 E CܞA*KsՑjTQNJ)#JECNAm#-Vaq~^IW_H Jު%isLN:[d:Kc]I&HkKSښȔ477隣D,JHģ!kn$:~d6Oc,NtƒP@ Fڳ$Н̲煵t@QK9B{zq/C_ΐKwhQpL1~zm>D8`E 6{>}:t][kwG,έ[x/ßl!X:zꯏ0uLjkkmlN0BSUהJFa-9:lO w/Ps@d],5R4k̞10dm-C`& 00 JJ$3)ԅkȍ&ҹ<&$/dh~yf8V y[Mc&$eϏrT6b%ϫvnl&`?--[nꋗmFF<͟\?T{O$Xr WS9WVroZk]#3dڵqسnژw5߾FTO|Cv 7?Q|gkD_A.L@?;'GY(9:ʍoux3;l>q]e<ȣჟ~ irp~n _7BҿG_f RNV n6OGh<%iw4@TSCJE=Y7R%iEW&qloxSfd@@Gh?!{c>R%6cnR2 6\9oX֙._,elVr7_O=w""NƐF}^Hsr0}@q% O'Ϭe_,dVtHFeqmV4V-hG{?PvT` U6]m~6iE6-`X*%uκ-Ѓ\^7ҾZz'] cKV{GSZۨVEC-.ʨ]w-eWK,]R-)g_Zx`* ?XAB衫Y@U=W6o~t5=LdZ3F~c"b,oPxi0 O) @I3;>p*|#$iU \!-`? jY_=]QK^~1ҰmI_P .Pk`Gi\u{sHTI-DB?!qj3 c 0yB0y#2Oxd}=Z_ v|n>G0v94͚CXJjAH@4*hlLXpÈb ౗vcL.G"ƣK?,J_fg/V+Y{jug xyn/hJ[2zٛkK(,g+h26JH{ Z^BZD,zZR?V*3ʊ(*u…(Q2v*b@+h Յ^S *@W3e?8{ t `&70;ѸI e5궄niuucAMΝ;}:apQGQT"ykcMvtv0b$9BK0&B"aRCMd`La,7gu|3HAzg28E9!fnzz{!ǃB>yxʷ}Z#h:7oA1~rAI꽎&ߒGEVmI~eJCʶS#j]Ue\']A֜!kt(ǥĮWUY]:Ӹ^/-t a<63yd-[+BWW\ox [;D,1'. GpM1r)4 aԔ&Ex!1ЏǬe$cP/}{\HI&wɪz4q`1.Pd6Y|Ũ]`ґ=L?Q܀s\OAAזon&u;Na,M^K#Ux+::enY[ )JBiKZt#"Xڊ2%Ab^( 8 S@G{C{(-lg7[s9Q~qrQөO8nm񗘲b>C;$Sn@6'@H 3'8m #hGwiYqњZvyM>wmM2ZSоSHN ^p}vXR)‘P9 ƪG++ˇ.[-TS71=ԏ6M rPp~}q؅З. Cy>+:Na[/jUVLC fk#Wd Ϯ%7NNcƍOֳtdMm>G?4JKK%5)A6&5#N!%3dz{ãdsyN{I,;v1RHv7Ol3ϊ9OdFgB}ƐBoo?u&&Y~E0Qato&丷!oDM)NegWFA9h=C*`/ܺptתloZЇEQ[sR{d$SʢN/]{Pnd \J5)Pԯz8 3Xgio^H r 45JLogMX M((?O۟|ۚHg DB\#=vA3}4ڦ=#$82≗;K$f,=t*M]<)wL3w3YYA_ 2h: 2B?2`7(5Fшng͆Y|7ߡq ˸*ӄ;0_Vc+Yy/Y6~8~pyՒ+TaәhqPvIp;2u r jj+[-Ge%_Q^&%Fw^].UNو=4/ Ykࠫ@Qm5|@ 65^|oTt,ֹX%NGG\m Gxv`Tj*ni}*fV^VMQɷuǧM}ℴr=`V/VDP=]8;AjXJ+U?cWߴ*)=}ex^,;.@O . +@ơE$ Z+Cnm`깱)(XTiIgZkr9 d,r"ZOCѫC&*\TԲp+W@a5]!{ EcZ5y8V1MOŀm{]SD:2V԰EUU;U TyASPUtBBAUOf[ƣ [$:nDv*"=5*}](+EעC[[C`0TW) hؠ(Զi +VLڞ8tRfw5ԫ8Uk>i@(^bzuUjL-bN*_תFv5㵟"T)Zt7oʫ肳 `s6Tyt=x-,R10hv} R}8D`-`2J9{ҹ},x nUUtkJ/svNujy'zTj=Zk2/&fDm-J\mYExV ؓds2,굵Ոt-:G]i)s,FEr/rֵ.,b+W]c]52қKj}M\%E0SSqL hQM&7 Y96vvU V,]I썦@aTQ* U^s^A{8uݵԆN *oy4Lc|c񺨉`us_$nXgr~F31N.6Q^u kI:myE(8zĶoBHxSyHEgqmBu^pɜ] o52iˌ8t-|^^ jqROg-^kqE~.Z(;JWVڠ҆U&W^Vϗ *R|Iu; ?|11Nluq;m9ܯjGFJhxm(0W= ?oq`{p;ۋt+wD0Kl16N1I^׸y〝8&شlc1ƀhPN㜙3gϜy~e{fkw53{Y>]9zB5F$, xŸ2BX\ Jw>]˙P #>Ufuq՟j۩H+; ^vCǿG CRӚ_2PLh@R_o4*HiJHgF TAB+ G⴯ c5$^J»ȪE*owH+tk>y0Qɨ\TBT*{AOa4x2(He*iEBܷ֡7. ~놪hBs^LI3x5jK3a놭`^:@"𳻧$Vڴ'/GXqh>!}88< 4Dl}sҚ !"A)XPU?A 8m[ MTȡ.8 7R P%9ί\L3xâO#_om OF0z'puye6tSUMǡ+uج爪;Sz2,Kw6L҇UALtSSy`sBz } T2Z.>~ٜc/0:A=/ߘkI]q9=cy񻞤M+/=}LaI'I]¯wChi$Rĺ$jcFkRr5"]$X)+2?5_J4>Pz:{Ԙ@ZXo68*ӈ KWDúrS9tRy#+V7L GA >dM00mU?e;؆ Uq&|˸4y>QO1TJ4w6K^2ΓMqk7 2W$9Z`b^rSixnG߻ʓɑJDn;5O ϛK 105%*d4v'=<@(0t}׃積EH,ECaznf8gް?YK)rY+([@׏UҔjZf"ʀ)X7UzasH BrE[Ѡ tuTAHA8 ]sj,ZӢjdt"\@p8ɠER^7/*}%*$TV  8E47\n"oC ݐ('As tRh EiRlJN fvQ%q$*Kׅm*Ƣi*E -)D:+We-ycWg誢 :^:w԰Pص)EÏ7wsTLEZo;ݘ 3xRҒ" cfiB{֦.RO_4S8|lr销UM_yREJBKu.snTNK]j ,mzg~V=w~ R_b^NC#bdЉ!FQ>}yle0kP521s7o;$8㙟zs -5d3yV-i%Q[$qA5w2Jbu4R_$-ܔyV3yOoM)-srY`XUÈ@6n)صSSR:{?ɤس}{Pђ SoMn*Egq =5]Ь6ny)k`Nm$6TT򉒷Xu6l2wY Fvku!t\ʘ<FF \( ݮnbRs|b\$}wٲWmvߤjnLIs28iUɥ̩ڸM 'o;;صu{3-,BF'2;58)XbMr&-;Oӷ^duKrf9c5sg7XgS>3>W ˶=@)Oih*Ɯ5QX17I0X2q6z٬bĮUt;ButbQC YLdNJ:t?36|>-1xN^TLpr{gF`?8H{tu o@o/gDc1/_p?C_e@gK|3e]1{.⍜~|d_MNZGMm]%%ꤓҏpԾ];y캇<w+S`?{󛼺[ϔCoZ $R1P.2_[rZ (tAmW*6F#%_#!:nL sӟr<#!=e28gvs-bdXH2hd&CSK l"S SS`6ã5G}t_o\N7g~0ͥ`eHSRcAK]9&r&qCR%xJmp 7H&~g{Wֶ6~xqםw`b>Xn}}|[{\e_sC{54pG?;B$Op?Ϫu'q?Y~o+ᅳw\swtpk3yu5O}eDܳ|X_Q.ͅKO2{WE5( y(_"guoxhji+gp`u }Ymm7Gy\BK,^nM#&+dvD .Bx Gٗ/<5xi-^'dy`O=TR@(AbdWS)`୪1*t$S("  kf }S7?϶tP:C`@ax6MёN͙f$kӔb`0':N!YG^RK/OgxI[<6=}x"u3RJ~xJ_w./;6Ziڵ?A7m}|^[5k߾Cͽ24?-,^v%}}zӍJEoo{24tymW2˷oלw>ojؽ};.Yutp/~_›6=G')[fy/,]Ǐy(^v{E;{m_(B{6{j+w|Zӡ]3 =q"Nt^YtФF7kIXHN?z\ Y D(t.d?4CC1ș%nM ˚LRq,K:c"g29$åm8vRIB",t,ZKz A:cy\gV,D_%6Yf*DZ7qUg0%W^HYK;.a`YvڼinF|y? tb֜9|~uͶuv^ǖM3 0׏;;Yl9={ɤӌ MܳǾy&ɉ1|ç85Nv l۪NbI'7x{ҧm8 V jR@饑n.I}]{Kx,^^Yxfn.νb~r”Yjhmocqq$5uuLW{|_SiJmxp~W݇GV-'(ŻM*Uù\⒣' .d維  1PwkVX~=!X|9c.%6 ˗m]$ιvlJcs3c:n:^x&'yuE90"i(;'z B S-Ӫvp/?N{ݖ/NZ2<ȩ6 TkES>v9^@;Aׯ=/7U+6 Hɚlh;(LLP[๗y1m6/8VtR_ɆNc>X%â 8C#,XO]SzQ~4ְlnm9y-YDs]=CG&8B.gZjb4-296._{ͳfq7΃eտ=_z)ms\voo﹇kw?wg>M6ʫY翎'z;mzblt#DKzQ#o}>/qYg#.߻| W^;7{d JB]^,ZV] _2o*~{x8ёa>162>qZg?He]okym+ު"W$[[?Jq*ɒ+)*=92 [$ݥ{zBVvk++DWw}PUS#Ic8YֿHox%==1BU&w\N{mшO73o e4m#.&2i gAcK|iZj /Ħ65#x 1b<At^Dc!}s9kYڍ 7cLM&;k>Dq~ojmeъykOwSn By>w8h]Dǜ|bH XIC].j#YR m+gjЮRM (a 7 ZA]8UvE!@K4mP vGWP%wWǜN+2z[F꡽UxR)V 6C*pG=H'EzaO7D[86z:+q!SNv9t:ɀLSw.PP•ZCJ'Xxe_[A{Țl3vg|btlK i(}\oJ~ESr!!>rXQàhD8s jN 0U3U3b"H2NIiq6 $xec6] Xj4jˈUsJ¶[n%`&\?|b0}5ZLC؅T]Xn.]KvWw"`c!?U[Dɹeڒ;?(*/ 9)'nS]4U ܽɩBSkaenAloQªڭer3ux{JQU-j@R{]j (d1IN nWד'I,j-IDJ&k#ҖYGwP,0D*EzrB^O$(dD;Kٹo?qdf;anMf!DFҴ$FJAj"O*GD YG@)!u7Y,]G"ȿ l~g?:d3qz{r9;oڵpq9]{|wL p9SOc?|m_s|ƛ 照VO;|3Rx2{{m/ӥj<\]Pr ~ȲXw%t+a4e9%,FӍnZWy2aaJo+枃 mxU%ꙩ 34 /!&XǜfF'}ZkwP,"(G$R[[K,OtJPDCdFNjld 99޿O`gtaޱI&d|y#IfX4B܈7%w<́[-Osgz(F:ƭֺ;lxG_皏}KnK<%oyC9;.Fck vDJ/|ioioڿ7djT1G֯'] awSO(س} v ka~+w(/U޺v$ IDAT5VVqt xVJzMhkDz1Imк ːqV*=Pi_!~^N wfO&HScx(RfdNK--41m̛Nss$H%DI2F"iA4&>WzHaTGv1yGN=Ŧ=w/xa֩'{y s1".\TxﭲVg'zAzT9O-N#IcId:k%Ĥ^DT <ށ[p7Z +VHrf322inRjMd]`\aٔ+XL.ZCa*䷿NPD۞ai Ҋ:y9q2䤤gjY& 9FSlGzGMD,Xo\صT5O\[ _έg|/YoW_xp=kwd ~y js.%OXdx!F`\[ZHON gV?[os=d- /DUǩP7ipL#kN2K8}(֓ʤ z֦^b^q4)V=T~Y 70{/cG'7 UPmmzJce{ TJs MHđ'ioqb,`b f J!h#AD"d y{)2b`Jɉ|ˆ`RySQooƨ`edYLYixk=Ns}5He|Ͽ|Ɂݻihjb.m\Otr|_ß4SX5uuvuZ8 <ȡz*%|`_yB|{ʵte{𚰬R7 `*j*"vN,* QCuncFPzT͏BG`rifOg<#ĆI9R"`ױ~uˆ`x4J<!7"$) !6ֈƉj~qҝGJ#Jg] y$:j2cQ{~BvCjdykH HLi&J&y]]W8Ez.`[엝@Bω޶uǝjO=J2b)=nK.a {۵m;l᪫J/[t; 9\t̟|*k^ZJ'/kq!λd12UrL9N%Ȥ}ޫFCO3kLA}U"J:95VD%[}{yy-^N~h7=]+lxZt!L|xiHX@JL0&41ҒW,1m cxQ>ZXrORKt`LfH7dEظL29J'hYD"<\ ;x3\.nO~ٰajjj#b .z9\ۿ;7V ( |g>˅_N< ,j +T!MaBܹ7&[jRUfB.IoWFiO2~**mG7O?^ӑ)7gV3ue134Z cƌR{h}Yd;+f'ח'*BwPWv*%D$  aи$ SSLt%/Ԧфbbd bDcԐclXHfxDާ?2A}mܜ0?ͷP,f2ܻv|LcG}ۮ>7<_11>ue|t>\IOnMWW {>!z䣏024_^\я!qno06:Zw}{/-(p-nW.t^a(aGXUdh.&kdq\_r^xױ`7&u4BXWJĄd"K (H ,fUkyiNnD"A!W:GWIܨtŸ5-J1eg.gvYz l`>^gӥ,|ծq%Ai/k%cIז Ygָr-kN6y[Bx넛lqV)r9uOS|4^D!bM:p-jB͒OC88yL ^yJDT.ҙ v}c˖-$StvuƷrO+'!-hjnbF"Pp5˿M?g]v6[臰#<з$t dm9ŧ/C%~H ^Η701MFBbJ,Is(S#UbD$N~lܹ4YljGax2QCKHYa2~ALgveVC [5WPK yUe}EȧPTmS98:Q됧~sv(rE@[,`u]Tٞ1 Xj`^)|.>ζ !к IZgvuJn萰GH{:3ojMfH,bpS{w}z^=sk / rR$BшR4bH*D''>6QY۾|÷BnK^O㚓@,4-^JTJj AD@<.hlKD^D9苇1 AP Xc*A:U^qE> V-(vjqܹو$Zj?`7B`\hYSt\BN;}+8+ tx ή Ӌ 7F]=5  ˥yJ3^ P Y/7++ӌx;yk86skd"4nHGKIy#kLS1 jF5R[d'Ƒ(br~@l*b-DI47nD,h 4igQbfBԁd`z(S,B,i'f<-r4c뗕[ MU/h6;zBX4V;(T VBUROZҲ ZjWIul ,s.{AԵxO/hkWnCWolEbz*!@g\s=C[4#e(R*-@FR;;\trtaXK6q~6h#Lp< R l0؃a`&##7ֱ_#Q6,)g(?Cy QJ^ DG=BʸPeRp> b .\U*:=lf,h6w8T3k~>l!Qzl!( @HI%+"/mzzii>VK$G% CێӺzcQf#$JsPuIu(O蘒+* Jޞ~wւkp+/lE" A)(yg[vZ׀76|>F&`ˡ /MfКR>V3L'2&BDbQ2cM_D*j` , Br7dgCKZͼ&e~F8=H|.H/-0骪R=0h5$ h\X0 *̎TcG.!R!2\|7 |=Vu[LhQ}껀JPMvPj\V" Q{(eF rNYΝ'P(SeH%bz~lwvĖFHI&]sY Iywr!jW,ga]|+'` FՌ`K. 1}9VxOYkH \{@L`?`? =H?: 0Әs&7xuH)udSeje>OXS >>JxCWf$&{Vz֞v10&ˇ@gg'== Sq|[yIԧJo6V^di+?x&p,"BF&3蟜EC2FtM?&UaXdVSطS5;Na|-Zٜ{@oF4U-W JU(ՖS; zN~ ny F;QuulZL 8ĺvQ/BejoHEmm@&fu|ƥ мiǦZ顿)?|v"TIz%-ʹ֧8kRzt #S4XsRY2 Zri:"_(rɧA ɡ1~.0tF[̪O10[XwIi"zCZJޅkQQފ_%$Fzگ߫y.Z(#]~j߳Q@%OeD |R E4E5LZR<=VkTU7\g>4!W_$`%*nu^6ӌ^+GT YMD⒵8D FziN0}N Z8s7D6gb*K,A 07,tбtmb3" o;#/."Kv\,u(K5^4=hmL.fr|WXGMxz[*u3W'芐["9dry_m{Nq /zٙ<$z[?ԛЭAjwM&Y|@JYRS&-z'!zk]8+V8:g2X 5)icD/q$AŽmF_/ZY+% Ag|ŽX (?x (sTik+gm0(Q[~k[K: p:UT5I,'(.KyWj tiЩ5M_qZXY[VSWxzn%s6M5iK^ZG=XK W5k'սV]"f$N tC:7u&tkBUIK3y=Mz?堖s  еO $R-]gB G_?t\Jڤ ̰_m [cj.*֊_ec]OYUAW ysݭVP\T[Eٸ PqNyKϿB6S4!kXςPFTc~~CXJґ#4dUPvm:ЭKDoy[_\_f$ja)(E[lzKK+( ? |uTOku뽘0 eWTt_[j@A7nn!Vg sKvtd^U VBM #`V^NAL?*Rmn'ѻ '"{TՋ 峨ntN9|ŜQiF 뛴;W6=PT搪^[/&RK2H, '@fÜ aLRUe4JSjy*.q1eqQjݯ:k!mO9RƏ:˪ 1t>v #͒U_g5#T-C Fi֭kW[=+PPGiKf(ZuML(*'96G/=ƷkW(^Bƒ*} 5lܶ8Iu^2Z DKDUpVB xP(`z5MzUٹ_x-_HױV7G?FyX]&d#wY7"WJTάUY!2,?u\t-3gj[rh]@=A lW|NEM2\ i>2M1-OmlQԜj!kUeΧv5N65.Ic{J @u;> uC%a}Oӷo޿ -o]M̀4#t0'Xko+ 7;@E}XF6<躚"Ji>l4{, "XA+@׫TQNAMe޳^$ԹwCձa|WhTPi/%$`e #EXM|m8!aSƦvz>FgT :?4#WHO2~oOwUCmj{Kzκܠ} (qMKh .r|}t ֐Ud{s ƪJ o-a7R>X5e3p*bKXjTgN ';O_HR`A!g,)9 dV3ʨo!ꔔ )-m^V|WQE+RVt EPs4ksV1s^ 0L 2a1#nytcXtj߾ K h`ͶhF }O:yvǴbTQ:_f&''z^H d!TN%Q1Š*4ߒ%N[D/J)`gHV'{t=4RHߖǓl~#絒B+8 { 0b~YGUz{7htv𛯮nЍM:Vu ٕbOI<4Lnuif/IC2Rj-]*T@u|Ż ATެ"o[C !z* .u'*dx6BvJ )nn-0oV|#J鏺jŸ5 ^\]Uu)Dkp \uV=@^5]ފmzѻVb kYuR#q ƒn1 |SetTQ-_+zzVqjJt1ug}\Iw<1;o9t\kQ?nek1{ 3OE]{O~nYSO2S`h m{.!gfIW;=Ji#te](+J7E\Dގ$If}+ڸ\A{A2э\+2><֬jMU||=iKGW9;f!ې,afUu*Pr uaHS(#KCtOdZ^ߊQt%I'l@פ60LT@|)T(:$utjoA[aP лxk ʖ(He'}3ydBTكG(fs i;4ɱc$7^"tԏ>U&N;IJ%"Ʋ%$Dr`(U$Óy&~z8 8?y8bx` ogр^!.MPjDcG3*A91ͅ#ɤv8?Q饋didkE2K@Xɞ^p \1 VītRv FC>˜s+W&>GD u7l*w'+_;˒V_:Fog ~*2қ!x)K/_`} ҷ,c nfigfW~tܰx .8W&|L1Iہ!zrIfO7-Xa)71VE믪V/LwՉ, <К(BFFdRFq}axqbxd+aTVwzFUz+YPʂ-Z0 oع\7ZD#NZT3b^3?ޚf JA[EғN)6]F] !kL܁$"C"XDQX5Ǩ!qif#b.=z2L0GLƑ _YFyLeDcH`ĉ1V{F$1:歪"@WOQpT%"u]hUclF[MyG^S뭎-*xv'Dup fyϦ$Z IzsUA]RuNSJGԕ]>Tэg.Ϸg 0?FߩReJRҟI O! XSHu# #$F]t;OHZB 8u$ëѱ`mꎑ㺫#YVs~=qA"9Q8Og\UӪ2qeG4QTgfVyk.&s$ CRI5@Y8xgF|YRj qy,ӓB (3;>A2Him ,׾kp%~@WQ+#]Iw9rrM+qrxbe .^̤3<ʱߠs"_.0PeYc,vz3JĴzEZ hTut[>DR"p_' LphgnK@z['}x fȢM<^ӿ NAupD}t> qg_W&-q~QimYrv>;xhUlILHRGO!0Q)T.-σJ7a iFܲ_ǹC',f(G=.'Xj)' aM? G[_̲^3=?Wl۶ĉ1z<Hz$ @_\V*0W,nhq2IU>s<+Pix[nõ tEeǪ׼WlհF(qzzKnԽTҌbY~6ƿn`scmӵj ji5@+ӗ;jscX|])Mξ:Fڸl|6{-4l:g;^ZF= ue+Ñ)ƶ2ğwlEȔg)+N"Qtw$91YW~LŬ~3o} 3cCdY9 ~RRqlcA^A/_fw-w`_EOG$es?WoYKƵ,Wqnu#S.MһT!jצ>aS& akK:[F4R6e~͆ |xK_ꩶZcgK4.N 酯~UzUp-J 6YF]dTV~"E yRj74H- f/좘+Zķh㐉}[Vpp SG1u4}=BcIݴ% I8gh_za?(}V[G'>A^W;nCVu/yR \=|ٽc{ы?socϓOX|ՁIKTKUAz:>_,\K_*^yT!WV-X]C4wX/Y8$fs'ww ֫k8[i.o6 iSШWQiFj]e - ڨQaGX cp,(PEk xP|Bʕ L(LWXpˍ,r]bvJ/ض<+uWI [Ɠ $)*X3EG]CݭN!Αf)T {7~fG*!Jqm5nshn9n*M\CGgİ.YrٹF]<C_W߁Z82F 2bQR榜fo85w^3,~&'y:Urb7pAzגoS՗Vwk;8뭧눴y5<\͚4FK^B.p9[ba_J8ܴtJsțNmD<gO~? ,XMg??AGڻ7V[SSǏW˼zg`BN=S.s kwHZeD62p),h1葚L]kdKEmݻY&i1ɥ{j.j)$nFL޼ݏ??ěNnV&._3:2_%]m᷿׿Xa#ߺksy&y@mw>>g;o}+]==pv::;?ďw?/~ J%>vOoOwNge\$Xї{#Q8e2l/W{fNe3h (yt<8jyՈV<-zc*˦8XmB:Du|mһ|(`ِ{ Ұf^~0Йxd@~](9V!n>8?6Y[RM[6pbB a<4xZw۽@ jåMH7֏Q5@)S{Bo?[޲\P`nχD*^{:zU"w]BRe!vlM6'p*C5j4D4k,4>s?0/MՔU^ p`: j:oK{xgϹꔫ X%+#I1Wf&WXb7nt2oē 2 z,9?ᡙ\,MP(i_O2.ɴ%5ĐH GRE%T p.v?MoX,n|aݶ\vho~/L'2]'>׼y / _drb7Boi)|m/™%Iys|I>ƨAiz-44޶wZֲ%"[ Ѷ+4e8>yh ,Y9FvHD`n_}HQcN H$TJefggA*m%+ifX|)t}ϓhkc"ץ Tx"IK9s띤 4ʭoxtgHG"N AP-bN8td85"4xإK=uM^S,Tς~_y=K/Ǫ #j:fgf":ACإ6]{-|S?7DWw7|~ @"`ku0B*AG -vf )0!ЭX[a 3 NZi+.!`Fݒ_]V 얎hʽC9ܙjWQ v9J?(k)7i G+"`zDѠyvY: m[!́25#_غ^>y>Nyv4;e瑳@lmlܺWeleV,XT*ʑ#$Yr%"$װy6-3#L^!=[Mqc;`?)V-3G94b oO2ЕT~ ÊuiT߻O3=5I\f߮cOsүOҺC ->˼)۞fgfx;~ g;o`e>?E"y3gx׭}hv Se. Uݢ=>L k2<[zAK.M$z+]E&BM@ubtNmCز;&ފ"LP FSX[%WHϕ?_Ќ+Ĕ|DwoϛKA%WKN6o_9z l>R֛2y(l>ODc,+8?4L"%'19Cߧ0vR/7pvOQ/7KI?Vm査ή G8>/.x:h"|ߡc/{PΝMW|?E[鰺\l~xR2 @l'WNvbx^i @wˈQC9GQ| *J ˱m۶F]hd8{ _= -!At*TZǞ^ڽV` eoP(K xVm>;-Gwnfn* tLR@!ȝ;Ca|lfetT`lnƆC,A~vd,` od`bF̷1?ƵkN[6 d hsTV5 h⚝SmG sbYUr҂=jx8he:(.lӚe'@էcAN-"p#{h84D y^YwRe䯷z %[ SooF$ ^ӞB)>3 RR,d%c)nv5 $8L{w7t )!LsG,[Lit?U6fYq;s7rf^b \ƪ7QfYum="4r-r g=Tl&s: IDATϔ4pƯ]8ɴlUor/嫧DNf&0jBRjx"T7z;E!LBJzkOp<ó l3 Kz W(o=,]i9fsj@`B^t[bX\P$nbI.&3[(ҿd Kd2=u|vL3l.|>D&C!_fG%wr>b _ Yx<]7m3@ЙN4!mNwg4uGm1=J@RVήC0K&]Ny87gkX`cԜ4F`h{2Pk{u е]sʧD*.RБN훹Mgb;6DGWikoRP)չQ^Vʕ0;3K"$,qu,{ $}GӓT{;X^mWs~/w\M._dŒndBH2ɘ/6YjZP/PE/\nA9O\7Tق9#,53d2 Mfu% oWp.uH>e=V#ld7J{g}V2 JyouZiVQ|̂B,z;J@-pn$sRɺBt^od2@הOS}1Qo$(YxHy[nf6 2YOF5hg>4`[v~S&svc h܈1 p51BcrLl0o3ԄmQwDyj~ iXRBP>m߷տ dQN<$@rI !xT$8ciXw]JlL>l)O;ɶ zo#Jnd\60^^FQ7|3K3|h`bҷjޤoQwgBʭ֨a.Jh8KmscF& "Z PBm!ESϸA݌V60, QA=%Fmj [Hf!z=,\< zYdPFtcRVOqD 6sYbqAU6OđA7H$TJ\it"u"+%RPUZx7彤֮"졷H3[,2<@b|P 3O|ktvuQTsN/|:hʍsOɯ~~ͯ}*O?aΞ<?o&^ko`pjssz1K>o^:ȇ^> o^M泧NC6]=u Zů-ݸN.{=|kU~e~?wOZoJ\*^:uO/|2QRp}ܕiY Jрo97N~FZ92jVs|ry6E!ח]_ya։~*?:t 0Wp trtlXmXȬt3SYt)L\rIJ)s$:8čW{dMr1EJ,\AjLG;KېW$NPXdt7óH)̖ȤSx +!1VoJnϷ.gO"Jz?{ߟv3;u^:)o7\u7ܼ'O64ƭ}ӛ{o`7O~ߠ\^pՖt<#aSR)ޝ; dڵ]iYA]l& XuZ>}Sf2UANRKQ{XX֥>1GJ=ҬKa7>ޚaɚaUaQBcKW>ܟE^Zys\q[V,cjz@hO'RA9K.;GPd*ӌ^8O&NWo/O35tLO.0+w Ź\fq>Ni&Fcv2̬_daRP!)=g衃H)2h?o㝴eڕrܒEzc𦷽E,Ƈy(J%N=䤻j.D﮴!|VPKL Z"؆KCZ|ژdgHCUkLZ%!S+TSS_}-'7,Ѩ5~𤣭gtT~ՕJPbt*kd,^-cɢ-_J__/6tITN:z,ozYГn#udGu#TL E 9VO_\I%͕8.F &ڡLgUdeif8sTvCT*sSza>&#?ze+VѡYa/_&LfFm۠[|RȩcUﻏnmsQz^8sUDЃ?b*sdɲeq:21:sV\{0V[b}XWGFj@cΙjL@X=˦jOhjư6-9@Lrqҵ"F/z\6ܥi]]p35+1Ya~DL m\C,PTaDD;lO rb1IE@P,ҷ1Vn{3bO2u 0S!(%)d+dپm9G&HQZFP*lvOPwcpi"v䮗} o޿koh/^aumZ ^/~| l g)Ϻ̽}}UOVCwxEow!Ơ~r*MM)\j7mYQEe Za LL2JN^kH$_dJo/("G29>/}+R\<135 _څ?(PkTωQVs,4^oUILv2Fp X:8o9ԭPߠ;PgggբQC+C5K7MO!r\=ʼn9 MSu-`4O^,ڀ@I27˚)|d*bqI 7R&d =W]˅y6Sm)(Itdv fň@2/3,nZP< k|۔Gދ&Nـ`b mrԟtoDc`CHޜQ-nz-".W.=_Q\3@ѐQ;5Htn<ntmk22U689Y .,`c.l<[ 3q ,!3<>YśuJ2F1T *ĩTbIHgsLg?ƱSQ%\u kIHIWwI! H="F:Y=cSrL[vz)n+DzRKUא< eժboڕR\;?:1-=R.Uhmut&v UT-[PQEPB[Vn[GFG?;uBf6J-@>IP1NZJ6hаv\ҧ=Ca7ǔK\RJדF%{CPz.LUnfqm/a^o}%BuU sҥqztttibpp'N0j:6XeQ4c Ӵ"FI3jcM B%Pʌ`6¼^o#LNNd:˥K(lz8mg^2$7rH2=DžL6O=-ӛ@"zqRTJE2SIiό;{:$ٞa~!;0h+-#uhNұa=+;ۘI+ ^Js@e0L7}ֱWEykM\-Q2ËnjRV(>ًhJ3>Jœ%SeC5<0pB& h27BFh[Hoad-rMvvHg--~p `ұ?gcIݵS%6T 2 |V:,jm3:SSלm9[Q#jFޞhoodϗ0/W 7>T :?YφnLDV8>|p޼)J^Ƕ=m|[X~APL Tk"^gҡ¢%*tIdFqC3u8[ZĪ+hiNדCnn(:DbzAi.3!YC5cjԁ`.sl?|ls;¼^P5O#`E҇cEJvl}Q'jJʬO88Uikv~\eRzSGA[PzNr(jjWAaT{Q_'FFT9VN۔qFuDmZ _Y3R9YZ ɹQQT_H`΃Vu^Pk Wv+UWY9/auzahje4]jFҾʕy~6BAMV.7LVP=SuZ@V+-zU!M!yϣ{jE:)8ym}AG> =MKDg/wD83s6Z^WQ<*QnӠ3r eHoZKDp!ReV/'S47|>}-TC8ı?btA>&lZDDւs\_D|OC8*&ĨVqp~[WD b1Bj?R~uP'+l`u~iiҿȕR*z\MϬmP g2ը5 :>[4Up ۚף%4L` xZw'9.j;kOӜ F~cW5ok eu?\YwmBkq.i4 I+P'S&WA0 wsd.NofFYl*R{'k]^_Z^",CBբn@hyҰQh+/Ĩ%h>Rp#jk{ߴ1$!b6jgV/41l{oBc 0݅{[ji4[7xe4ü^DkɯอCJߘWtL|St6uW][zI.2J hЭ0( *4M!K8] HoV hfתR*[djV(,BB'{6o7`uzd~çG2< W/2%7V!` Ka~Mj{P}Z`7N+BxM{ -H0 <~W.Ѝ3{l4mm}'R9FMPwt!TeF43L”.nzU Ղ}e/pF Ǽku3^i2OЅy./;W\.7qV&w~a ^0%A}`2x|j8`<f_9ivp"?벇h'a^3^-^zM!h7e=FYR+}|FiFW蝷R"|{~4譣&ZuM3e rg5fc+w_D.@VLr fnzIhf^J"V.;ǹߍHF/[sa$uk%pg$C隘~9j#Ug.(2|`g8P$9.%[m 8ePDGut.cXz1G0a_E 94|_x1Y$=E&ƺrfԽ1zU/テޣdz6RLWܵ7At:ĵkiKHRdG߱U$$H!d>`bd\8^u3еJĢ JVSWؕ𑻱l\)B<&R:]./֖򬃭tF~@wٜaSjSe8Qj]F7|d9Sw[_@ zXqNd~!n 5zȞ%J.R=ĉGDY6UfAjBEMrlɍp~H& 㽴OI?|1l ,.gw `0{>Jd}(ǡ{gxDG2NzO22`x㬺fHّLvVR8a|KwQ7|CvC@W:[5+jg봚wdGuizrڜ*V,cA~B`"(@D#D`#x&H erwfwf'tvWխ3:uT:sNP04ru\"p"Dj%O!h}0ILelA6lGjѫj3l5N#4-^#Lu} eպkO ̗(l=mdJyt&wS>4Yss0G'u\VlYf vz^z\ )Ҳn6z'9?~tbi:2 &3%bg&tfeBٵ9ՁZ8LDo\st뿀MplzKAѪBIA훶!ٕq=|KsjIP6L@^hlprUgo;EF;F0C QN5 ,Щ8~i7nszHH%ch+"cK%{H$}ceE- <ى?|q}Lc dn'8mہL$$!uo[fv4ߺTV2^'E~6b8||1<ôXģ#`B)"{?:$TVy:_^өB}]b&(J^ r^ fR';AH֙!K?Hq*E[^#[׹P &š+>j_G* Zp4=Zp-LHAJqAd3=w'ɶ&uk; StaM]'Kr۹yӴ:@8:^d8[yp,p0\v=Ik,K-xtv9\JsoDg9?፻]ŒB_`ij1L#yGh9yq zMj}4i0Cc1F5Q.8?Vnd=ĬxR#S9"լJP8pEwbJu0'׉7%tFl%X5ggl!ԇ>k:ammCSP~%Ju0oɲ #6HI;ZvJ<VEIΗ$~|,oC h.214L4c3虳sp9.`?JpN4Y_DNFT{{/X`.{&K Mq?aμx9lgo~9AaaU :!5;;S{y^˺#Έ\B'M1=+#!Ӟ 3bSZ~ rlރ[Le(|[ɱ>oKO_ 7_6GH77p~/99$cļyCTz6^r=Oyidcf}ǧX>&9wu7'K ۳{й Py3z3J#] iKRArtq3mUpj]Ezό^wm\ ɵd2n.yKuAr+cfX>IV`+jw(+I*ul)4ۙzGy;ٴgh_D/LJ< 1g"pD Fs4J/S5=`]V/Ηt5hYN.qɬf8mLnQn|w,>mU~O׾щ,xvoc?2EzBBާ{0{7o}WRAnytF'rtĊB2ylκ,lZ/XS3p{s,<n|5(Au,O.?^VM?C:Wrݿ?|EBBA_?j˯_?oH BTjOֆON6vTok9faЍk4yrQs\d]!y̨ P"j]/pq:V`֝FOo/߽gv뭜w%tuws]wrӿu/R} +^E[[>.\߽ݬ<$r˷VKr`>qݭl{zä IDATzп+}}|DJ^qM7[oԵk獵;vDE $4؀D/u&p[ċlC_\;tR #Qw(?\0 "ׇ^WPUJ@iچ˓^Gy)+C"$#BM$'I%96:z6 7J7a>;xbnJ Fakv-qriF1ndo{EZZ)>JzR.{eH2<'+rfv$@fv6-AW;y#YPPQԷLƿ׿9xWRM| 3c,~26:'֜ @vj3S{]۶q/IS:͵}o˴k?M @6%^νb^ַh^t;8?k8CS͚uxys J/\ϼ 7CqtK3\YoVdNJf2I$| Lkɐlmoß d J.Mfq/LtvA{^_6p}%OxF膽7?覀9p)+7wNelVBۄVLm2^e>hI&q!ƋLNesh`OZ{RJi:{I> -deyǎrG?\muXy)Z[7odlZg ɋK%|&':>_}wɺϦwLn}ա:">i?]]kh3dT` V^ٳٸ~=G 8lZZZWÖwU#hbqT ڒ]]jmhkyV6o"/=GTQbT*V11miR5mm< Ӵ^C5ɡ)F|˺@iAN^gP[H%lp!Yujf̛'q=ώ-3 Hs˸l^aYŤ_mzvF3egՖm980Rhbf/_(ϗN_04=,b8N=w5'9Xm&uIM .8s ÓL %{|S9358ƆXr%vd٤ǯ]uvuWWo2 H~K_aF䥼_>Q{!>/3c8َr1kV|2y'{wg ^ׯ(sgr~;X_"*ooӑ7x#97lݴM6h}.?yڹq4"<I#k/u4Ie9F#҄eM Lk_fVzM!: b`'>s.izo(R mɗ'MXdlb8oyHQk?z}@D*I8B X]TQϛC"dCět<Ϛd,'}wplf7ϻ~8m/4BirI.hޭiJPpMunz$y[uyw񺿦)HӬӌ Xm<X}<cҥ@a,p7/~1? ;@,W.o|dYO*Dsk }O=08>8@[[;}|w~#r <Ŀo}|䣼N&7D<睧_#ۀ*tCGՋ }F~2DPK\i><ƽ~iJA;x1 *@ַDxZL '-Mۛ@}Nd|.h}7s;>@qbOl<>=3gp΋gU,=i)O[s`y䋂RIRھD?.D$ 0Vs92%yG9>ʭ^OeoxCXsEs:jmchO(7#/xF3 z+Ɍ_#GGy?r-erl}$I^c>}ЫLg><[z'W=Ywt2B|dm3Ё|k_ȇӟD"yӕǡ;rsZcTԣ2Jo̶TZi6~n̰]+oVJQ)S6zJST6흠{>Fuk6gVigZl;:ɮS,---ڳO[;8t;>FFO٭[l&sp?AFKV;te#0~=G!aݼH)}$N]LKkaS3+om4J%k`b, Z l߱Ω)\[b✕,xDz]`Vw= $y_%'//)G~ 8ϽhN2L4mc# $ȯkWcSX0zk%c/'#j^M [_xdGeDpAy0 ¶6L6&:nc,h*6nwjZ=V^7]Qi pRe.ɘ@JAK*ɥg9qZژ9>MMJ%JyrfU%Yɯh@f| `Y`F"`lgw?Ϥ/?VOp+ftpE'Y0t«t6x jF!?F TM_wfa_:E>mQJF uU̖jU-\ V##DX;聚?mm W=$7e1eJT@ ;钦%iE( ^K-MIĝxUuLpȎ u9&6F.\jϖG MK5C|ѯWHƲbb>O"T)̝G2Մ43Q**4 pZ_&K'(ŋlJQJZe=s98Oo3;[bj?/s Y9fex05]p4 qsiSZ{JoU}41#T!jTe0 dk+%,j}2jX rڤF}A4j4V0٢ @ٴuQimIQ ua荥]/Ш$mD,J /BRT2R~͗CGؽe+c##|{ML o^(I1S=g|xRR,FK$=u̠=D"b139Ea־7e7gVeeZ6*/yU }pbNcE:jW Uvf dd: QjA/5 Vuїs힍vO 5+&)R]UE_]Ԑ+ kr]g%kyΩuqsmM6-s;Ӵxz\ƦGǪ/e 7 ńG^LnmeѪ1_dqJ'ZF*|c2[1){%Fu3N|^'Hlj&-RL dˡpA 0G?6R 9o?oޤBK[bYﺓ][WLg,}oV}ͺ3y͛dOo&ɀ[ع}_̧5v|}vs-eK?l,p-\яpp>-\˗Ѿ>w lٸ~p+FN~xw+<6TTYTd*`>d0mr ~tՆ~SJSw(;Bj7o +tb*nGP$lZ{)<` ڿ2TST5s-\kFԦ\Z& VEQϟs[Iұ\D#W,MV*{SxWfߺbH9i2S d*E1!D\GYb)wdNG1g0na${I43 yBb8݌dN?1Dt*yHX N)]1KڷD2Y> XO%]sׯE!_{xU=,W^t۷͛z'W?=b'3^yq}.|}о}ēI><>O]dzOnoPτ#_3<y{vblt$_ kW;^4R')X֬ѵ*pщP A`'B "XQ+"J;vnf€LL! Z1@0Ee9d١_S hq-lcڣiΦМ2~`jw+anlm.̌o!_áh~ qI5qQ>Mb dN{cTBףb1D,FX@V6OOnb דw͹;2:Q%Fr~I2!Ӗq }R|ڐJbq8_b IDATaO~̵; j+`hp3gYlwo/G&P(/}~wZf>Q"3;o^M9jj~{9o*J|FR J[iC,U a,<^ P-R_FLPNl!\(w3Tg:xT'1Ly0NZS ,̉uN4K2,4s ?Ւ)`,R3bx hIz1R^B/ֈ'[~~2l^)˼K>ZiRJ2>;' GKo3.:ė>_bg㤛R %q΅usJͪEGؾy3ӟ?amW9r MMM>.M>[eݶ-ؼaoA}^Q*Z<\ 5 4q MI:Wu6SM8۰r umT l+Q3lMGi(xK;(aMgSXC9/,\嚻?p]geUZ (ZZ׏ d3YyxJE=iD|!Vr Bͼk^@9書%/aƬYM,~%7[d.t׹}碗T*y,XV ڔbTe Cu-Z\]Rۨ,z!L"ToPJg[ad:B[1P2bac)d9,| +@+WkDV _d&7!霦evv>G FLx2 qVYcΝ|gQ~@ロ㍀}GMQ7LNL֫wL&xG?PyVH%d3-o >=b\E}B2PC226~z'^U&kE =h&aU Z&zgrBEViE0Ҡ`fy(CD}Vi;L mf}bhY,:G}/l"?u=ruZzu_7^^xa[e|lG$iN%7'Wjr"P>IMO+$D,/j;au&NbG8 R)|.#Z Iz5^رJ}%WA_?^$΂HtQH/Rcwazx޸e|}6|>JQk,u̔00|qVi"&g QM*Ղyry] cc^O/եf[_&ږw$cl!H211ɺ3Ψ<3";wUA5ZFoZBA؃u:::xFPT߾TkL[/Ӵx$BILw7<##^^r2_vN X>$KFټu.bugR#1{6'{ȃWE) _2:/%.%m-$ & t̜MTGbtSjYV>53QR5-px*S5NR-+?Ah׋*ZKPȂzcN2Լ )gm}r7E=kw0R-]:oޙ YfoBa ꢦ2ʞsm(⨛gB 58gwqRq<$wѱ6M:-#bӖNm OK<:H1v_82GLp짷XDW7R]]ˈsD"=5I(c]Ș3Les!8i`7C}+JF:JE]܊Ÿ^z> "Õ5KM*6ݫ`aw"cH9?<*M3Y-c9IN J*}V!`R kIWg]^6B ~e𪫣ڢaUɲN4MWk$*g$f'AWk{رK\.I2粓;c笘I)) <nozA~M7c@tUPGxPjxOuF%9<+t2PFЍk!p-ˀj wh={%gҒm 痢}8T~'s,yO b  ʡ4RkogxJZe `Q;iKS~tIІD)qF6KY EՌ76A]HHxUц3"V5U6P=YKʿJ[*u}]S𑆘&` &1eY18is[ωPH tPE 1gՀIrO{GMO k9 dBpgs!,Xyr)vtV -Ml~tq9tt Y&3 ʡ3# B,';6NM Eޱ|~glhvٙL:ВftzF/Hٲ'&)TۓNW<.!z7QuԱY.ZW.*֔ᑉ(E`wao5jtA=h5 ل,NhlkCsQs3 :"հ >ؘze5%&_4>zYK=w?yՒS}UV'-g8gf͚5x`OlwYHtSꫂ^-{a/ ˜kW)*C*m-xao Ny%ncEI+ gD<p=WI0cǖ *?C_~RHG:ɝObu_/8em=-\r nY枱݇YvR(H t32/Jf̟d/M Jdy&v[cβwlb*3Ts;/ BW$=jeiZ p(Q{d3,W3lm(Am$B i5IJRCFِk~4 WSp`Fet1C홭LZg``).b6oMdž'9ul뢧-͹->l>a4\dR.KzdRdsf221EX◟ǚ3OB ɞ1~xKFH=e+mK@1Ojr1oӥ}j_il#ÞT<W6d6hЄyX0\TD",8?б,s/&8> ]N^2\6GkS%s[^4Cӑ4$L5}4́P.DjpE.b > tBIp*$ӄkz)SvyPz"&ΞOZ{ߝl) eҤ dwR(wԔn98f]ci  ے}f8f(J-a >{2_ӸqA6>!>*XG=9+{-CRM"]5Uܮ f8T< rU(osWϯ1?PK6QUPƖ:Rr! f!aײ-)e<֨#3GnṐƅaaBhKqr81T,J̓eEΝCS?4m?s3{B?lòWVvO=/=al̪ZZ!Ղ)iC),vB2Qg.]f܅m9s@A5(>%^UZ!D ˆ }EF}]*{3in NSϲyRve$4fFh$PмmԤu P(Ԛ5KWB#RN[ +C zZ wHv"=I-o||ނ*n3. ztwjH_/-lଇw*D`5@WO]u*Us^m8m5K^xw :YUR0*Fa,Uj#@YCذ}Ep͆eq7Ѫ~6.ꌕ9 /5 cմkNO䝖$U 5p]KZӕM6gl\[U9aUdMCm je%nѴ6LKUojM&H *;П^usC%PdceS^{θ11{ckl+l&{mz34K:upDzܸWTs UhݞQm_tnmiZZF@mљ{ =TkʤFٔMnOZs( q:,VV)E[6/ehd8,0OL c\FWAPwg% M6 n Q U:Vq˺&+vAmk8 m0[/_Gi%6,TRنƹi@w}˻j9W,i Ihܝj.Iz݆b#HUkR=h,fST҄ɜ׶nY"#Umb<o<8 q~P[UZc ~ 1-)hiF==R TwA/bk*Fxي 8^n "VhOpF GC7 vC)J;$AߨQmN a") C뼷h-<5rh5oG?,4k+IRZju^eKol.ℴԟok(w3zć5H5r#F]?kn=rg:gܰV.FeYjfXZ0ƫɦI ƕE4Z/ *Q@uW/pηbԺ@QǘдX6?ըֵa=uר9Y\Z3*|WY4MOU-[KKFl‹=7؆ii]#U[yFSti6Hcή"E7+po:Jo{N՛hj蒨LSֆV+VC:Gi9ҵIp83U 50Wi "^(zRs^DJ+*4N(mg[ @J/=Ո2CE&.Y@EFYi~3$ş9V2}jycWa 6d\*)X2<,jX媁pu8v+*؈k, ϶qҟ7_MxmnvYt=A~X,'-73Y_͎UuwrL\L +. j X#S3hևϰk2kXȆVBr96yUG,IX6Fh֝{ێ5֡]xkXr|#ua+25EbP"<&: UU:`x;Q' z5}A-ҤQh%s~՜89qrʑDWkyTPT7Kfhm#/0>;X[@_(AMpCPΈQ/P{'Ln$]b b &ucV6μ4uw(~,#܂"@oo8: Jr&qdg~ GhJrYxu/{?>DYO]ǁN^QZwqjU-ɖe{1@C@$pB )BL/nBi6C` L1۲dbI{~잳SϮ7>bx̼;N9so#[$Pϧ۶L(lj"VTG-NWWCJK)*_E8a]"8ƾW,s azK'imQ(N"\<*~c!}]eJ 暤Jo!!a43 [D9V(j#,EY_ 'K} ,zcB-T2!BǐޛTZWa0a>iS*>BlIXje1$I~R)2=ҲJy ,^^|)-3>gA{{೺zwvn&dfr8n$jw`6n`845Y bn YH$3gΤ- ,oM[).QP/tgaRub~R[aCF K!369اWV "}6Ho,jdm`(s㙥Q @P:= _#c-9Mԗ|5d-r5 TL6}̬5"ŷKȹՀ@N@$ga&;:AoU 2QgjX M =x=LBpgIyy9|FAMM {.bT1Ő^455#oTx;w.;XLTc14@QM>5cТoࡃE{d({=Tb2"Ӭz|By8L=)f '#Xfmd Ԍ p]UKKnYh PTaovzHL2cVetfmwNV7ڀ0KBGiyh۞z$ 0~y'BPRR¬YX|9o&EswS[[… Cnz^xxx駩e޼yWu,]~9k@ Tze8)9s~Az,Au&݃oYv'rì˹[I&%lnb_?{gkhx5Nb6;)3k9gy祟?ӷo_>ʶ;n 7MQ4D1h oOW7\/׋s\97#0leӫOUWrO-x.Ti}PDE֌+3-li(~mF.|&v:tB3*7[;IpꞮZWi>pm<1f! 7=ڬaᝃޥ"RKQX `;~gVWʧ %`/#xe#uG7fO<[oFsq]w,TZTKQPՇ&6oLA$ $> #GrH&<9:He,}UTd3I(P^wu\UD(+*t8rbȕ31A,]CM/.O;=IeLH{H]ly=_C~urJy\)1¢t-!b2Hjߕu϶Z6u}\x!3O?=[ŞH'i\]^Hoփe%"_wsmT8ft| hacӓJʰV(">=n%%AdC}=}pπ-R>:)ʸs^ƌGii"jqo, 92B{'[2:`Kϟ@-z̸q;wpg9 uo)hu$G)KY &&"P]yӼ54׉s gXUk%ws. =xޯ?TzHf.89s;G}Dv;m DzS}㔕ѫ?+,%qWJ%qŕWy/_\y啌9P"}z[73dkQFCpm_<k3~<~mm?o]ȩg͈ѣD|?B*2o>O>0t0{7N.8qŅP[Symы>~E/1o0q$N-YIx{xuKz'L?x^[Gqƹ2tp6m?_|Œ>.CHyls\~хyyd|^}E6~xaꢗwΝL;gfXd &M{ᕗI:g'TUq̙\~Ռ?~:mmӟ1]gѣF|?m1w,xa<`z+^9wr+0`  k|?W^z4ޗw`ɜ[|){E3;_:p,ɉ!ۖup՜8_sZ8VU R1-9]=*;ܷp0~Iޯ`KzH C]F7n">|%>|h0/֯_Ow*E߁=z4;=EEEz֦HnDgg'ݔua M-@# Ņ4ܺ^[x1{S[ q&;ELcMKhoksNA~56~#Ebƍ}qL<xz֮Zu_5eؼq#>8&;e\0<2>*{Ҝ]f+--gyd޼%\rl픕W^c>@C}=kVYiz)nκͺ~^6n;ݧPVZE= znq&;Lc 'N`%td_Ӧ!N=8&>G3YjCƢҼ{wߝR..TfʣV} 3(%k 7+F%{8 6#2bNx^32ehZaͩUzuurռBvnqɯ x߰#Xv ;w~@{{uP '{Cii)O<0Z{C)M)~.|{[>PQYɂ_gȰa*/狵kIsc˖|@[[_]kdْ%Y/<Yt_`# *Zn-MIimiaMLɴ#Yi]ȜogM?^,z~ 4|H>ϔ.IR^x';wݙ9Iчp\~0=f" ꢺ 9)&}k^Fou2JAB?4.5u s6+8q"'Ndɒ%+^{;){RJrAjjk/zc=OWW'$Zw}7̞=cgA?|37tg渉x;oG e}+=tttʺ>|\ܵkiḡ t|z7!˖|@D19^Q34@A<>}WenZTJ5lx}7]:;dbZZ\zI*iJ_F3vx:Yt M {6B>\B12mQ^QIr6H+t#[)ӝ.ұ 2j2<{?uUQ(` ,˒_ *_׻ю9=~uvG,5~ǎdСeɎvRdb[RLR4t8cw&cgˊ E1D'SQKt6^~Ynebv@RCڭz777^,J,[هLŌ˴?3mq<}:_dC?];oŬcKhT\N;i ;, w, bCôS.T)]}.m|MdymFw{R(٭-LU%\0 负hY93z"o7 w#Z\DʷkhsVHuu)*DAp;]WOeq; ~}V./~!$/ᵗKIwlok'r>ohbtLٜ~u`.].y$B[k+~8Xee雵ƌ!ÇI;j3~<8+V=@/.?$bP^\yMhO-x,(K dc#?8T(;v젬3v1vx;@VXASc62˙}㍼hO.X'ᙶåʡΓZ[? U]c|i|b42mqI'2+4t0aX:4fZ.r_?0@cɦN6l:FMW7[H<xoj^2ɀNe)NaGP~TU[Ce4!&  txzO;#f3qE?q TI?zy=8wLC)>G-)Q@;ghL}(;|!e$ 6_Osc#de|@4wa%>CwI'bG\};{>_cC&N>4z<^ ]ft2,_w>p}444=;QnlhLyfJji ?;~UVva0[a*oƺCV'J&-%ӊ((wڪ3!vQyqեŸn,-YHKtv]EU|KG;+/h,eW]5&^6,6g]YtBOsQGc֥q=&+.Yv #lz v˧|%% #顤/#4斖\ ҥK)/|'\_8#""QˮWV4I !Me~=)Nvu\e͝3fh0#Z!"%ihG*d`G ACEDb1"qH1x(@K$)$ޞ뮬^*EeQ!4w|H!P8<~H]s_MtdxwCaQDow55]=X,˓;W6UȈ}9J=֬ZwUu)eS;N (W;-c{M W2e .rW*o>o|OF2z<`Ak?t I7Y|.wLyʔggq^;ky`\60_ywrʸh3?ko^xyGkK B-_ps'Gy$?<1-l0sT1Lz8HvW m:?N;vY_ 1fޛ<'M SIvκTsaoddeS?<~8xae#PoyVe0Vfl'BH쟍Vs h}Pˑ:ҙ,KٟCt aKg&GsM5,󿇥HZ>c- ”swf0 =Lu>F9sAF< 2-j ʕ++DEE%KyW2e VdʆSvfxD?=5k!\i GwC=E7a}ZQΤ*z}1֟?o*QʸƛXsϝ$_?~{%l\'U%LkH/A\ _D[){J!cFE.Sꕘ34K\gk4] BsebòR;Q kB+l/,,o+ 4Ҋ,G,V/סDbwW/ȀT*E4˾wIhd2K5Y4EړATM6z7+uwHwۣG0 <,~~8 3jXFEX>u?7)'WW)_4ڏ 9F[‚OXz8uң%q[w) Rl`F,W!VCo7'[NYL*Ln ' |kWK8 }[m4~—-]@ʤ֓P'\֮Yɓxr;pzxM|Ív,_I'fU6hVדKAZ^ԳamߚC#M)!HqqĶqȡv5ہwyDоt\wHX*XzaC6nqڭ%7hm.pcTX5}m&dٹ{)ʻncE# `[K(Nd ^Ru@q*u/–{ b(oCJN Kd]l,z[dGK{B:iRc904r|9o1a.oغu+mmm׿g2-N?D"oa>g.hWȀkꙡGo:d\]Rc<ϣ=rOdgc#E}BH$twwFEE.b9Ӹ{| ЏOhMyDqR]]JEe8#{W ^yS(Jxt󜹔L&IRl^'~U*;34!}҂㜹ܳ;wD̙˚U+qoo;R&izxaV}_Lnsj6nx 2gFRRRmۘ]|'6gQW#g8{B2&QL; S8wl}+"# ֗x9 |r(R @stO-~y\{U瞫^-~NfYUdtUuj >I=xk^ &F V|ù"zcFSLSk+cƍ^v(4!`S3>nmÆбn-x!Ɏv"^;}[ F\"BP_oS.O/6P~.[Ȳ>xb6mhwO8<]ҩc0eٴ~CB}M3nWwo~t̺F.o#&NbϩS++ՂÕ^̦  g/㯷ޢ&̿{.q9^*ŐaQ[ѕ^¦ yi?m00MV .N q'6ȮHp$zL&  {BaHA ыn $XOX_X>~.˷kRiLL7?gTB.t)3c3p.u lkelok碗^>(SL?9-]?α'M555c{I9 £!"QD,Flk%ّYl-='~ɓ9#O"1awV5LIsPԍF[o2` KJ5|'A0bH 2_Ox8.*KaIA/>7टbݷ}K v,g#݌* |T)m4.U1@ϭ2 *i/FW?Dԉ"?1cp`hzYɳudg嫥}_,J_C`q-y^*EAZAӦϜ:>s={6r D"z-N1 =p~_r7}h>d/B '=ca%JѫW/6l!CpxF<&-?g/HDwf+*hO;]wz5WfuښV|Cy|yG:|DcnєyJ7۷ߴiNO>zcƍcU݆ MAVY' kaͪU,:0ӹk6jfߐ#\,z 叒IeU3a}9" yWW(SvD؞{*]u`NyJš\|¨X+x.ޗ:W& gCs' HA}*(,ӧ6lksRUUOb_ټivvX^֣:D"D,NG 8^w%0`Wjkk:t(?֮S&0.C!3$yDc1۾=?/a*:c.r6_]Mr>xyxӡ~V3 fz%fww7w~;gW\9Lrk^:`APNYЕ^fm)ֵyF,EУ0@$D@dN}0mq,- -ACdޚ?.B+ucWz.CGQ}aZÿ;f=XMAl$ϣ@W8vѷh4J<҇9^y$7|3\r +Wfm1̾H!Cgbץ'94:; 󈖖e*dxey4ǟ˿&(c?i$z!z|'$Sdcmt|O?d ҷmBaQ&N̖!'}#X||oƉR1=@>>ĭ[6(˸ ZIVKgW@WnE,E5L* j]q⢪z)yFx2mQSu炌l(kT-CK6@ vp;HV+rh4^I3 L"`9_raSXXD4eАRˀ? ߿H0@TeYYN{D DGEeABj_=bߍ hXOYː[rLlg>~F[hnZܶ2JBL-K;t鉡G/5 -:NvYK$ "ګWz7_Q)D2Ajfڶo'{A0Nwr usܰl !Xr~q (+<~{TߏwKK--%%Dx_^~6n;tyD"w}ۊ--9\|$ :;Ys2j#](ro# "W_zVfuUմ4n,co;.uEkH&tftKZ5ݷަN:S8T*E֭ݴ/%L+k؃ nU/ƶka QFF֨3eUS;m éK{lu`҇Z95Q˖ÑJ?kЮG*>=ۦs% *}.}͈YH|47'ڢvϰ LW3)4W\JDC%RTL/O>ӷFd[k׌/ĉ "V;FoSټy3TUUѯ_?"]ͩT+VPTTĘ1c{}W([f ) "(X=vNo/s$[5|=I'<~Iix D;`6XsлPi{QOIH ^@[t<կ"" w4GGc{?^{OJt-!7=I;eP26ҝ Ck{zRWJ8AVRkQR&qJ*3\te짟 ]6&~%jd+z&b7}5.ޖ.i,Wy9xX,FII)}Pշc=6l b۶m<[=A J ݧy/B xضm}6o̶m8c?>x`[*b `&OԩS:~s?ِ_WWǓO>ɓO>I8q"GFAuu5mkk+Tb3Br|s""26ٶpi,E$c&jLj`B|V']zbQ<*Ei=.\ZZ=̣ }%:߳@Yh-F^QٚajKO8 B-֋V>]_㯌H9ǘ-R^w IDATctww駟LII ,]H$XBa!gqorܶmx ^{-6l Jwvv3ϰmV8q@WZO2%Zuzdڪ/OOȏNcѫX /dlXjaI0yd DII 9.jfӇor0JJYP^۾E'$hl/LD7S,򄐾ldםx+ n%/l.e W6s.[ gUI`^!|'yn*T4Kz!YZ<{|0ԩ0 =2\ i񰭗>彘^^׬" *.dФ Z]G쳷!.WA¤h_ZNSXׁ]yg|e龇b>greF U~֖e`erR/mȼbœ#9Kf.~go:s(:(jm''zl{%BmKT~`廝 X#5>  WX`SSvk݅){;cai5mrC .]x7et58^I(u$C\W=?K;Vw]3|-TV2 iA s,kBʁo҈ :ORmZ%K3/\M^j}yVL2{)R86|h ɆjTIcKO6of VGi5H'v[î`WVPîft`6?:d*.ktYlpwӅ>naƢ''j3h! 3$2.Tt}JWuoX}J?s@]Dyh:9ػ ;BV qLdc-LǗ6:u%cf4{*s|zMհ8pga x-e#0!P}Ags|`Šixa|+)Qi qU4Vtd+u80x{~X.##{/cB? A+tzvCޠS~+~\빪 :w((OR)Naю,%\;,Njc4-(ĥrd+e/˿?Qːƭ<m}\ute˷ݐ%PnGOkѬu](cLЅ e܀.?aG 6bX.hLq ˠ̹[$Ȝ]@/ gψlZMR#o "7鄻 NFA1\&z%CmQ5 A/G9*/Bu.@7Lz&bۙp{#o+ jWda ˲vaZ~[KRW* Z9'=QIM||i&m!o GnC^)t 9 Ɣ,,WQTVF; k0xPjVߘSշ /lӇV2`86mCHvu3~t45X$Bm[Nk@=NݷnʱW^{Frg 箌 j-95=#mlfŢ l8]yr=='xJK/9yd'5s6ӱS4!A#InΘU9 e+̢4}>~o**$gpJsBD:qWPS'V,XDؓ_?>=s>#.ØH9\s+1:w'^}=?ضq׳\s=o#[$Pϧ۶L(lj"VTG-bWWCJK)EhJFY+Cc YH$3gΤ- ,oM[).QP/TgaRub|R[aC_5̴ܞ "; %lFmyOvafLm2!ٽ\W[EjnIcR"'Bug<'ep])(lRU!jy"7pQOruuIw4F=)iq2ղi9z0t#s=f~wub1*\] ƍbHy/Bp7*<̝;ELEkj&*ű h"ʚ1~lh)W7p{0Z)њm3.ⶆ,JG鉂bs^eKII>::yx*3e蕵s凋^: %_g)1853;9kJ,10Q>w`l0́A6>0$aDc,DIҮyWL˸ZMwyTcueΠ~yȁf$8.x-]x 8幭G:Lg0V˹ԝ^VN~motsJUX]B aHa9|d?v#ߖp/j3)e5xwb _"ߺA%D0VWVwV*| 33Ω)Hοlaľ ~_fWīm<]yI8v,!$7o*#oMҤ)gPC  wv.)**so8cuuz2(SN%;j4]e|ܳ8$5BzIߏW% 1Nwtm^ꇊ zDo8;~T34V2,3,JeY\6-VxIKCx߾SὺdtKJaTգn3En5ƄN+O~R0{m(` H Wo[{^Dn[yGu6Vmkz $ਲ਼`UzyG?ޯ^ͺu먯g{1ZěI&)|#*~ÆQGo+^>Q'QLTS[wţ_}F./}_vյ;x˳* PvjᅬAjjkx?_-t~|gx-u˫yRVXҕH˧Gr`AW6UFarx>Ym9SU. 0nWd /ܮnL8r 4 /wќdKLPTWKGG6mt:E:桇bرTL:f޼y3VJuc#.#'Pe2ŋLĵ6OHDpA&N9͋Hja&픜%AfW%#T*E& 8JWzFEX!pա{}njo楶V-hr}t3ζMK&OiRޭ_G_nkݮ$#ȕJ|l1p*mV'exLg[!Ʃ޹yIZlP*" uPtЋ#8;o dZгc#125 k+GQmxr*Yb12 ---b1* _䪫b̘1\bBm om㌬$ݕglw^v 446's/f)gcF,ctw{H]ĴgpXf ƌᔳaxS7n;`ú̏/ nl_\Nsu*xg`1zٶ;`úuX~|cB__2l~,FM$e';ZnNovߣqWbyD0x99[/ޭ[5ou+|&9a8=;=- ]rXV2 r0Y;yQ]S;mUX'uHi@=eG'#4|Zm_2W= 6l$e+1jHfRdV/"֭[G2~0ƍǔ)S6|89R...[n%{_RܹsIoH?d]-@# % 0qӣ+Wyvg?zQ^ۏcN:ɳCaLJXf %% OgJ9E MxH3/!qXڄBZxc-$},nGYV<8M=BL2zdʪjf~:tw=0?# ;/sϲj\zU kAIiiV~g=4]zM X,;37ݔK؃{d׭YK?|Ga=Pz|v3AeLa`U[<į!*HuG 2:L|X >+ޅ]}G ^hV|nx;F!]axC;ژ4i&Mߧ(Ӂ{'bL6Lڇ?_өع^3&s=2gfi`gQ_t7x#sIYt;s& JSNr>^YF tvcceJZ i3fPRZʚ.;ӟ϶}N)..RM=۶ch쑙?2IoC7F-[|cyWVPYQI˶%N>Ƴ8q򅙎nKQVjzi:4CCm琧,'?xeUj#>n1d4T c IDATCl*L]Юl@YOS쫒ͼAiK6Ν>V.[0EIf)mBU:Mq(&Lˋ 1T? $16tv!QT?];vm"?n-[\V#O=M[\+wwy챼lܰ,Y>pםW ^"ѨjcS$ﺋ_mm-%ؾ:N9f}m.}95xe4b&Lg!gTnTիC^?M*nV vr rf$s^Rt0cץ=HYt 0A7u6 $*_.H3 VUEQe%JN 0ĠDKJ>ILcw7Gl#Cd'G AKHz;P 8$wh{e0eӶ^2>'hlfs;+0gd((`ĉD"MMt,`T︃KǵfG'L$mv+xdmθ {la[kI'וqGN2-;RΛo0bl&L@\ze]ؾq'br:s&AiuU/Գ*D,yЭ$ < \N_77) @Vpė{|*b[e\${zj j>!Dʑ  lY)ENNҺX+HȒ*BF:͐Yw4 = l%сaAb0B &Um`ґb[34>sa}gbRlݸM!Wҹ-RM]i;ΪC8 8wk{o|ISْ9ңgڂq_G}< 7_w N?N9/]!sf}}}̻^>[1m׿)SlF=չ}?r~x>s7^]YJfVۧ/Ь/E[\'C;^"ǽ2G&ܐ#Cu25ta#-w<}GAӳג[P{9}t7/g=H}Žqș_4]U~= uC;omݷY-HyzђR &RHg0IdL2 Յ1j ՇF]KFkװ{EE$۶wso -mάӜlw3kj{ۮx)V>Wx>?TC 5Nsuf3 k5pې|Vz!uxRTPu$8tBi30HWukR7u)'~!չŗ~a"dVs*/YaZ2樏G6wYYUŋ/t78 ǟym/s^=^s*Hq1""|:?*JO$JA:<`[:Wň!#S ]#aohtool"LD獾܇ZRܵ-aoZK_>-D7~x!x+~GecusȍH6Z]Ddd>nI'v .x fhJ/gr^MpBmfI-x O/-! yL_Ͽ̮`WUIzD4\V^n獏>fmt 0NS(GDu5ՕU>v,E1zR/bPx^j bܰ$I6@__]cRϱJUD4J=Eq 6 Jb&CQOACUh\xH@VCD+?[?Iz52j T:ʏ >pd &/Yg &;:2nd8-/nWdm圯#!]Ȗ*ʨXǵe.#\Ifs@BtIc Z,lo#W^g5tog/qiqI4LV \+(Fy|/8;1jXW!I]'D"D`Ҡ:ܬoUy:q[AZ4v44狓 yaTJ]!'0\SI5k|xN9#Bi)q&oZ 42PN֐KoHvyd6ie'[Nl4]_'Wj4$H@wu9DCY)5 ;ڋg'?k$2imT%7WU3Ιg;=58~(*Z >*wpüH:]SU6ު*ۻfKXKrzx_yYf,rxmR4Z]q,l~@^ Tш /?nz83C*)$xbvz fHz3pp-=Y^ / )B]Iɥ3[e6 %))=oi0͓ (+:]v*B ٶa#`C\>4UUǠ:*>|̄ ndpcvš|rnY;H7^z)֮ED|zR^If} Q 1wh#il/FP[6A޺Bi%K]+" źz!; PUS®: o%Dak?Q \#+SvwP[ ŕ3/Cfj* qiJ!'}EŜXy@AsmMB@!ᚿ 9dlBEU2:?]+L.LuUH~ޝdL_D"LTeq-LׇS:f~d68Ez]6j())a Wد??K&9@h\=Qd<&h?yp Cn]K L 4'dvG {PE :F.7!\*iU@=7 7WRǁi qv{)?$"*^HT<ʯ-'7yE$P7W |uVmLu?Ԝo{+dce;m]I5obCk7ް*n0ȤRHuk~xXűT+CGX)UMP/b?1j]Qhptm uNp>͜C~aۊ GήW UJ}̅m\ѫ8UA Tt8 v SA`wZ+$En[$a~utɔwv .֢8( v93/p@RmCܴo#7 z|^)9*?Ə؉)6Ǥ wwѷa~t άcuq1:g2r%*BQ<ޚD7L&C&aӆ <}։IӖW_ɇWW~relڰͳy)92l}|<#̎,\?7^;oU"s{búu\o(-/#ټq̟9zM֧  'Q()-u6y>3JIC,|5?\rN[ݕY~]o@ Hd@s"J`Wot )V21 WKZ8މ-Wq[4MaE^Wx.VQ B`tt˟+c*'u/O0y8Z:: 60}t^KÚ1;x'﹇Zo֮"նO%`80{ݲ+)*5v57\y%7ni3fp?O>g18h^_I:;=ܓM6dC0c~|gsm]jN:4.*s'L܍=O?↫bƍ1}\_qm'}N}w<<|d a0lvlnsEδr&syplzO}{ Ե"P]4 ?!h_awWM9_}2? /\szK[PúBvnfmdw'7.g#SX0x.f.ST[LrnXf^ =࣏>-7S 6f4m۶QHн|);Pw<<<?f4zz^>iH4 fԩp?`0'8ēظu+ǎee{}}r9>A t+lmiaLy3O1'zŊ,ܧ I0d0+xo׬YeLв hiկ bۯ%2+ܚ/0\ r=,Bg )J' !*ݝS_RWījC2sW$;;):LraT%ts衇/f\wu 4:ϟϫgÒ>ƒeشq#UUU$XA|@?HHI %}Ā(c$(`Ȑ![ZZZhjjbg몵Hbo?]J/]*oێԙ W5lۺU+Lqwq9r?\RBkkw`FmͺhgV^[p~h!8 M?M+9Yɮԧ IW0̮&no{j3xTAtҿW _7z-jeoo3 2mx;_jWC͠^Ujg>y:ahJJFq às=W^yt:M7ĥ^yᇹ\q\z)TH$ˆ&*[6[ǤRv&7 ~"0 e嶭E1bUՌ}Kaйc;?'=Qgmʊ:K;pO,گ/VQZhhz1W/,p{;?(x]A/WB ST[dy?ًʻ?~y)DDAWWʼnc7P^^N0;u7#_m[G2VaP:z,l/8V^0[UkXGSSdn&O>6ULRFs9S|T<|x,cL2dϸ BPRR¬DD"h2<~L] C7k^?k?xǦT2￟{.|0DH$(( wNCup d2ǫA|")c*]Q;\IJN[$f(U!Dnt'񲌓’]9!AV3|e z tY988T 2aT85D:Ef&z5s^{I)z-6 =#zp8n}Zz{BO003ثa3`dhBH<4'W!J2mDkd{H^_3*^7Xf 7^}5&mρ.z5zQ mVCv`_ezzzuŇǯ6;80Nx$Ͼt:@?֮kf{k,[Yo1'ɧɰmV Y}?-a/zuzqt#u=ۏ?h/yoGf/̑J}L{'ag[vv#B t~.`]ND=GFߦBqDRyz OB12Yҫ{=ikogi|HMnj9Fc̞(o5qY+܅i^ο@RL:3={g" /# ]uH1twn:;Hwv$N R< Q6f=8S/1 4u%$`<HRA<mFSS#oc"<@ &Yh6l ͤI]Z-OkSNBNgo\~+[Wf'iyzh8X}x3@y_ m"q1釷3v.Wt ^JoWjcxx cI(mx9W_Z7o3dge5qbeRW_'#Gdذa477ExkVIJbT$ǐ"ʊW[/Bxbgkn5oii)6mo<pmLM61|p"[l!0`W IDATyd.Ώla|R-o"(E^BPUplrqi&`:%Pqd!k+i:T%7gU$ OzRo7rɸF0߿ٚP&Uʹ[d2sn( 40*4Tz}K&6La$^>T{]zLcQki2wJ[ɻQU [;ݽD8JS[\LI ňG4IpPVVqiFii)w+V`˖-԰pB ֭[2dO% sG#t|gNQ}gaû _F}ޮȉ'"[ w\NI" ffB^#m"7H/] 3] Y X!eaB+"ƫȻ0)7 xm Q8ܽI@?AQ4BQ${T"o'8$G<G#/ƨxe*6lށoLiBPVVFUU#Gd477sw2b.bƍgN0VXAUU$ Z[[c=D#dm-'5x_rV~-uB8n %hd*" PaQ: ׯi%a)PO';8+w+h^bD%dD\"etI7ufٞ^\g E<a ag*Msw7"iΧZ9ti :jرc L&)++cΝPWWG" JM<筷b\~̝;>ɓ'3c Nqq1ƍ 6P]]M4#dl h2` /+ AR>xӢ#2,>Q|.ϫkSVթTP8; ]pxI6@tRh^ 1 uF~aq|,#( Tσ6|]BWWu}KgnYK;6lreկ~+W2vX8~)'N9wp+g[oomm婧⩧I&1n8 4AYn2 Iv=bWZ)PdNm(VtDz|A+<5앬;KE"\Cy CrfPxRv=o2w)Oͪlw8}VjQ Opz:gl3ZMwp?? /p ̂-l2;xK葓JI΅w%WƑKTNiHʘaZQ@0{B}kUUq׿>cMqaܖ-[x衇ضmeDH&RTTɓ6lmiia\~ 4:$7mbp}=G0/fq4hP( Ϝ9Vj{*O*0^Y~qbvq(ry:I53Y5׭j YUݳPu>7/ccs|}XFk ^td_vIrM⅑-@.ﺪj~ +ܸb`dM5#Kv:Ey<BoXTwmB( v ?xIwtVFeB X1+#1Ԯ(M)̴!P[Y0h(ڴTiٻ>2`u2|di[ (f GX3ɮ<^ ٯxnhUm5CDn6[mҕ%twe{oN`&ȇ=,; 9t"Jհ'`\; BdhQtۢZeN'+e} 0MX'[N~ kqJ9+4O_KYe2xy'oӗ [BՆ"hq0Ak>2 8AmFf4 ] |Thq_* jo)ǛײPg-' .N[2kdܧE.UQ xseHMU._µ}C=bГ/L⑮4xmXWgfJ!hӢMpi]U4! TETuP^w^uOz]› |2C~Cz! Qmq̩F5?+!^Ɖ G`npη0I Nju}xEDT1 IazNo=M:"FAՄNBwzK#_㡞@ H6G߆2PgC, QxВJ5kWUz:}V]cLY>4229&B/PdNC> fzy4lrxt5hIF`#~,@ 7-\WA=n7!~@ hCd;-G~Uy6!/3~n9ěOtnu[ !ܣOb:+}GjYAx|R,zavKdW-XwQ OdOtМogj^im ރ"W(DPm߬hг&KCHu$mv؜U{o[Nt7qI!Plh11-pW4tヲ+(v# %5v Cy@F`(歪>V<#".&H"Jj;F(y&C_~1&|o%*Iل E'`փPx: q7Zr:]txI tZ PCyd*jB銘 R{Ϛ0B=X …Zе/q/tjUxPGwˑwl/x4_24SH{2[]Xekk5]U2sG A._U%߂$^}#LN·$ C u\lST\!HWH gq˿!xjzUDWEl4?u^";}'QԐ#QMY5nc#,)y(u( #S 뼤|I*`W"݆I|& ?\,wdSKj`}5ޏ[6,)>Y)UʺWOn?mCTrV>$'*<2:GF844O%/+p_Q^X% .p|' *yA: é%zN7ZCZ y\ >&?•} -6…LW_ j&!L%D缰FFjE~7D_T)%<]#:(2﮴UxjMV>, P-h2e•*!Sypzt<#0pK^_3Nn8(spl2yw:+VX V5%GXr1I OUa޸ ـ˧cװ*jwc (qvq)Md22;wbdҒpTGDL7X #຅o}ԎdyV|Ͼ19r${P*fQgRN6`fTײ0eYmjX:xjۦf6X2j;w%vb-=}Lic`fll7&[lal";JR3sҩ5%Oƍ_ _Hx O0-xr&%aU6%:?olr?əb !10xs#>Ia"X\Z7[^&(lY\A׈'M_\dO~Ơ#]JБ˫LIjNs=Mωoh޾r5b}y5']{=ko;W^wo5!նeͤ3qiQ!8bh 0X>]gRK]=.g)!= O2psxԄ"[?^P|} AB Z!8IespbZd 1ToIn™8ZBtsw/%x8X"vȯnLƠ9t:;ld2A[[{osjahS欳΢u;YAw<;q\`}6vFOXyI*ypjHw=G^NNZ6XPAp$ ۗFZ7,Zo%"X.sЏ%ZdNwa^O'l\`V&I?U +k״VqK6@BrI7(t%w~;/^x!\r eeep!9Y}>ɮ;XHmLNg$}vlnkq %E1Q"ˎH"ݽ=tIK+iΘJHӒO8a'h&9ݮh/szM2>9U?kdREP0ɖ$xBI 6Amǟ( Z/N 3]e |fXܺ I (]0(|쳩c!غu+wuŨ`A=q,#*+DſoIfРAu],.aD$caC$;NmoVhحg3A lnn~h='}Lp PDH+d =^!‘ef%ޠ?S!(--+O>a…6,XK3s---f$8.x-]x u>&;H$twwso`֭{_^gͪ+i[^90x;('8ꬳXjяWn:Y{jjfI1]^`DU oPgpTCS[u@&~qux7X'ީ~[a^ WYoxyB7DvҤ X7+xʮC ?4RƜxV0g1rV zBxO ܶyk;])4W[iT*ūܹsYj'Of̙\r%O>ŋ12_} FB:6oƍ)mD:cNy'H$d2~)>jjj?~xPWWǨQ#9lBJ9lTU\tE[d&Ca7)S0lpzs\\\-BKKKs޼~$}=J:[G*Kgv]{ŋx'x~yr>zهIOfռe^y>ؐVv|^^V\o#6W6EI/爱:WKB#NIH#L)P-,ЯXܳqj9e7Ѽޭ[bHѣGsѣ1 SRRRoo-SN%*QJԄɺ.VWyJcTJJKyx7Y fz;vl̵wĘqro y^::X| ^|[iү.XK3W~I$rwXr~y55co-Z8ۿ"{Lex|k_>p`j/QO*T%lÈD5± 3 Uzs^nj0\ճG{[h)`6n7fG+>Ӟ>e:&j]"Cɟpx##Zm[tojr~oQ" p xg~nVV#ٖOXNPěu¬/p)rN0 MM,LLw7OLliF1ag=wX^ƎN(ai$ bhޱm7^~yvkIX^kg*Ŷ^͝,EFtpktgGG %'[s%RS[+T¾7uNDXӞ SW_O"`{k **=kz_}x =ᆫlyQtvvs5-!l2֝fB4x\8V"-hn)<\#\R]AnIUy9H3 VUEQe%JN 0ĠDKJ>ILcw7Gl#Cd'Jz.#ٺba\4rjB/twߡHc3}zz힨mz.[)ɁC0wv#~F\@ozЦyaArܭ'ϜGN-I6ީGxi/c0"INo=)ðSʆN8 : oLamR&& s8vq'7 t;u|8qbn: ァZ\8*Ex'AH^ێI*UNn/ ao4~UɊ={eieϮexػiUl  "$AUoX//̑ LjթVAz|~ztwQ>x2+G`%V|DdݗIBFeyѣ;HpՏ!1A[֚ѤS_R]qGvzj9{Jw()o #,E]vj6m5^m 2lǵklP.W؎v(< 55!ww@; 9y瓟ǘ*r}^4QQ̀bF [.~z 7*ݻv LB!(dṫ= 0ِa= v9+|b'O5g/d7(.oH='N&~'{*–o8_t2Wo.;kzDzx֬jm9ʂŶ`LJ|uGq׾R2a"Bxrλܼ۸w|.VU{8dfPBRUރ Ix`lq!5F1/DyzOS[6i9›W. KM@Z->%It\jp%GZ3"8O;i *el5ءP^(՘Nd8ktuGv9MRBd Ҍi褦y3N$+*3;eヒ?/yL8 ַy駓ȡCiǾ'^dvSH*]E^n*j1՞)$+AXF_ CCk@&x}]k68}#@ 2I.}[UT )*1wgj 9r-C;"E sN bX;fD.erW(H7+ԤeB-ˆRN,㏣"/ Y訑d DA5l~߲TJaI ?fލxڲ"NtquM-&yqiPۆyq&Cxp 2ܲaU=PUt&4'^c:ZK.BD{z@T\OO9#%1֐9|gmj6[[PRBFFUFи} @CKwtq!>I"dv\qD#+5)x42›6bt7ۜ,$ Cp\>;[7 1e6hB< 0%E+ Iؼh[:7ebteܸKӡTH^/I7 c-]22,-7r)YafYIzW/Fz wQ9DMVqkThR(lͫ|Zap[fqy+LSd%Ȗ~tp7*Cp]z$fۮAҊ KKxcTjt2x|u:0z`Tءܥm7Y c%LǗ 2:xGWIKt;7} gsfQTMP𽱣(gO5^HWP,4`=pNBP6T-x +奣[[-N6NSm(]Q֟Qr:I/ƒؒ#oW|aqXJ6Ĝu i'eHi)!N(}.=QK齦ȲLw8L>"/BB!#ׇ7o{];ٰqP<{& V sd,#DTafeuvd A^w>49WyCfVh9*SW^z۶%AϏa"K?ϼeoMƵ?!u_q3v,JKf /l]w{Ny!r O-Z={w]dffFQjkyWر}{?;y.!ɠhLTTASc> ;}¼;So ^~EU(w@p]rW5rmJ6:RWBISiEް^n8' @M*]mg$7m L$^, Ƅsޜ\p{*Pߩ>/ \QS3ni줤={0i$6eNC#{#+г{HO7$!C8H. Df Wkk|L43/ST\5r$'LcE)c=>uu|>OU]c?Ə>~|+ygغe3,SZVF"8IOq)>iQR,sVo|ZMIsJ@8[OR#z\dd ^H`?G%_ai5.MxNF U %&Ϗ9⼣FlW5olEG_\J/>֮_OaG F:nbskQ9F$\2EK__+Wqs=82GEFPBjmEHʖ 0sk>-,›GSwO|۶xTWb(PW湧fWbWڽ{9STs/~x<̚s9< wB^HT9Sg/沯\A Pf  fj{fϙH+u{x!?@("SS]MgGFP kUؔ ƛ![{.92beXEM(_LboZ7BaoVEnoL@K& :g ҘxRe%% 0HW'ccW7??y W@@&L 'W_kY\8R*3yG {2%jlDxɃz3DHO|X[r我̺ .rNʸq8399njN"ԪOvU 4n=oƗ: o|9ԐJ;} UeW`Do=55|z͜3\Y( q:PT\$ITڅ&vuSuv|Zkkµ jc%G ⱐQaVbR".c Mfixeq40SK5E^Qd+#i'?ܹs7os>IXbSLhm&7/SO;Ogq B c#QG4{m{)'CMM C ?Aj ۔pΎrrr.Û}ؽk'hjldI,;{ʆT$n䁦&&OWưٵsU6p`O_RRB{'ٺ~U$YΪ<o PCfxi]i?;]i5|Zߗ( Յ0^ff}RS*)IiJqgE9{P{;R> heƌ ի; RXX /;ÖVq?yC v^ oNGI22fGJ-)jll-ysn8%3z32hnjJ}]9^۫rݏ~D]dguKvkk &g'p'^y%+]:K٬JI@&!V* {E=T|F1RjDjذ!_f[q׆c9rlLfav4l7GKߡfV&o%dRb[8Q#2===̝;~H$~;nfnO? 1曉HĐ rkهé"Ƚx>e<ϋ7/y8ȲL{n}%=õvұDz}NB0ٱm;W_/]kh0bHN-[twnζ[#Iɓ'n>&M>V%c]9(wP%+{X=>1T;I˥`-#22Ҟ*djhǦpc|<21q:οzrK:5٢_A! ^ftg} ^rrrBA0`2> s>yݻٿ}G+e2U Ɏؽo?ޱ=TTTbFYzAL 'B<8 g湧H+ҥ|=6oڨÆC!^~y;s>bBH325g~}L½ L>xoYKH9 /sO?Kp8_y^y%N8ߏG\ZJVvGo-CpJ< 1noH +t ,  (߅#H3|2D"nvx,^p!//Kf iN!œ ) EDDk7&[>u[>+ǎ`54vw#`q08;YS<֕+#Qx '3@*OڻCL5:z$ѧY뫯'7D| Fq ? Q{˗tɒYsA׿fPXHWg'֭wmz{{y?Pnq澾Ϳ-- Xts0ːQ_BW|?Qwe/'"Ee3w8 I0ZrdO1YW2NSĘ(X2segaa2~lj'Ͽ~(I|݉_^rğ'_'~~ݹt&/\y xaBM __:MQfM== OCg/xw Ϗ! ș~2LV )))ARhM6 + tۜX - ߿ U7ƦS[Wم〬S|h? By 1B&t'NL]|yr_JJI'b#$;uBɑX/?7'^z ao4~UɊ={erheݎ}ǏK"h1!s&AP{6"m; jmAHC*uYG琗NT xE"fd 1$7ueW⹫siIFo]a^]q%sz̢¢BP:*++Y 8 IDAT)++7Vǟdr>zB!2|^r>w08GLj|mիihh}bdffR[[KCC>-NHFIG$ƍS6HTJeZLĝUONzYwW<5-3 ɸ#[W[u s( I9w"WY>SuV潔>F]ⱐwv/47q+"R#I㜅.=}땿2qD;{6o2yᅔ3{lqKegS>u?2U|6t(--eȑǎ;5k=guwfذaxD" :4E&Q;V儠{VEo2A[10uTa;1#Дo|T+c-)Zմ\j׆[:*YH':wxƛOF᩻n\ 5+"/ L-ľn$!R:@` (Q:{C}^%DC}\wudeeq%}L*mF}}={, `唖o>jkcfm܆ #-f^XU&vu[B% 9,oչنdeg#LOBF4&nU#(tׅȰqqw'_k 'o=gUi,qɨFxb_,ut nkD<# j۶m,^ŋΛ7?O >۷uV @OO Pa{zz=Yi `o r\9e e AıM:c{} GacدVb / )Zpilu<67X6ersiILB^t}ut" #b;L<M=i%tC-m ?U\i<["!"//JvICC=C ?1#FH5>mF^^8裑<шb 8R>Fk{Rי9N`8qJ~oUx25jM\R8 9m˘QR15ˇ dg6Sԥ;SHawʽiIf=7S⮫m;nj HE Gh$㔊r>ČCDX6-~fg dddPXXH +ىg͚51e[o p'3n8LByy9`#FĞ={p9P^VΞ={RC]-۫ klKwAJtU};|p]ov}kLdh%8zdlIh ހSXw`^2֑oĥ%ZDŢXն77`ŞZn-[Faa!v۷o ѣihh ##&n?755d,Y A;v,#F@Aqq1Ilgg'hᕕ*ҵ%PiYϦp/m/p"xaQ"X{NVɒЏ=[):K<[ˇ<2IgHElwmTCzE>&JڔP/RP`7[=·.={q'5)syGp:+W__ϓO>ٷo/HD(Ǹq(++#33[r-zSXXH(%%\r޹ 5_jvu^TZh :~nJMqy0|QoR?sr35 )m(FVNL7RʒCh~,a|kxq2iJiIVM>b SN1x\Dn`FEꮻv^|ZU Va \d-ano/v(A Эơ :R&?e')Z+FDjZ7"Tc@=UG [|$^(HQA>mID9;\ a &Q=pc2NGZZ&:Ka"\co ( >%+ַW:Qq 0R?y弲~՝u@=K\zSQ%5mI*Za7G . R4~\MuꑵMN 4Ğc9\k|Jb4U^3hh)tmhISӱL aZ# Ӷ[z[o FCKZ.ta-|9ݒ: 0T1޹5D%\Wxs#"s|JF2\rdNMpɑɉ/,JvjsҖx聥3qbZ%8Rb50;mH%ʎDn&N##bpeN$d䊯 1YNW6*b:G ]=x k DƃFCzno8( ۖnskvO9"hgA: D-vK:;oi-0[0sHG>2 #ARad&xWdFw[&.4viIGgO )Cō%Q8S4L7rn'~iZ=<ϜpݒLFX.9z4N6{%GF~P3_0D2pZ3Td9AuV5If /=n Y20 7d~5.t)FK,sƥX#"RdrFdQRN2?MIՉK{5TqfΛƺftp6.&P87e##bpj~c Cl6Rէ$_=[a|(icbPR1 O09¸v.m״/yavկ5Zs_+BwLنV㭰4u%>F燠M˅-[oS1Ofу.77p[R @W׋pH^0Bn|~W/)"|E8EQFQ_9&Pц& %3%A[O+#x k/zevWF1:Ȫy"SԼo^RH>0+Z=)g @*-#/YAy%,SG=l.(asA x\Pk\P\Ph>xBO[J]=/).I *032 J<457;K]`]Vb8ضq)Cx5zH 9 @ QGa[ukhaGX) NձBT2xHl%yIr>%eǑL"0KO"NKMj[M*Ff~_soY)\z|jr5N*._ť7M_EMv>>1rM]p-lnh J TvyacHVA֭3O |Ä倇Jxk&\ 'Pp-JY?=khu> 5 ϧ&h)Q> UeO+m 'H-Rm1,$9ƓҒxAMOl/^2H$O<]dggsĆhYiiiaժUǕqLD%o~rL^j 1PgEGȾ.+ՆT(R"Ce}t24^:Ak )a(bpxk5:'\{OGd7'ϞpX4TR6i&70"RB0|I6*bI2JNYYN ӘyӖx^>?(<[\tMdeeqɧ \eK0$)  kieUs+'%%..&fTIeRo^Rxzؐ@uSnmFު#;IO95!hoxc`aBxU+!9C|xZS[wiI3jVoˇ~Hyy9BUW]@{{;?N^/yȌ+.U ͡!?7*b.\`cn AԲ*{e:je\5prEy0*(jNކxa\|xXVp5joɧ \g E㓆~;"ICx$}nWWůtO#ěpƄK 33|G,_²ex7xGhllW_ŧdwM5o&-,}Y^~eyyWYl< lڄ#$d`d8:$>Gdwu3(;\2uaw-evօp z א,YWx>5AMZY4+p_?  #cftq\Z.'h=&.#ZYkͭtqTQ!x5Yn)ۚ[)SNW^w>p҄WZy% C%sJ|,X;i#Y~/9Ɏ/=2sHV6 RdW݊tpNK7a8oY'-aw6Dؐ0ۦ9:=Ԕ %0; .z=?K= U:SlΘp-lhFWU4P]-ym|k$! sqSܞ.̞q*3ۈdd]6`O7̉S[7s@x0a6nj0:ru^?#_8 ! ,7 ?vEO㏬u2-^rԴqo:lO!߫D+WAK= b4%^7j gΟ$_s/>|#6vBpϹbǶ,'_5"۸pݐ5^^:1m c%G &ٝXKJV=s0|.d:ҥURp4~?{/ 믿?2hY+,Z|ED"a"O>$ë8H$ŋ>|8MMM?hk?ʼT (Y~iLF$ 8&q%5K^d{"m٣qpR泘u/JVsN;-<-u+|,3Vuxfœ[4YV,sZE1X rz}ץɧ]AiB(;B k4Is';`vq6m7t,/zjGWfС_PH]]{%HT&Fd } `ȑIO?Ha7**e3d@x{.;lX8[3N UU|#trCI߄֖o\5Ra8V'~;@[|8kvC`Y*{t~\"qqM} ?r0{p!׮e֜9 D$n3O.K'~&pݳ!̞s9ee4̓ݻW%3p f]6!1[SOՅ .S ٿ??'ZZZS fٿo?? ͚m2F`QTTĖ͛>bU+W})C{+V('UaWٗǞ{tN eC: 5Wm-^Omd X,#qUx*40@5J&=8{Rg/^7^ixPXXСL+LNZ,(7x#ՄQJ1bǏ8)A^c,XH^z{{ Bd 0xE.yػg{>\^zx}+|z5'O7m:'O敗^b=2O7sJB!xե|j&N 8/jJ=(֮qsƙgj*=֭E9##U~.}j`#5~N R֤k.l;s!pԿtiՔDGxXRW1w\A?%_HջMy<Ȳ$I 6Z ,L? }L0?24=Y0ZaLTvPv䧦twyƤz 5z4C W)0=͛6?b${4999<ٲy39\ƤI9xg_^tuy7op̛7ƎfŃ0u4@pðRC+_i]OOo.lj( IDAT/3yqdgg> 1dddPS;YmDQAS !_:̸,sb7[ 'ɧΝ;x䡅7C H? h r4faaQY= ܼ\] 4!;pݒLmS5eݐ+Ps(qF.=Yg@ O޼<|xsd x22. NiOކzBMMD6'7M 55N[n`G :NDh`-HEmnagK# U`BJ#aUUIn5ayr1Fopo~Ö͛BVfV֟? !$JJ+*+pDvAvN6]]TTVr1ٹcYyn-[B|x0>[6q3ƍ'r!3t0`OBqYH^Gg6irEqpZ2NNԢB&9?kF62sG#k^0xW%,D:kG Y !0QGPA&+&aW8bGcwԩӐaIFyB<ٹ~p{ʦm wp1[=a<'z*nja'P?Pv˗s'sڗpϚ_LOw7۷m9S}QldeATVpI'!]+1ʘ}U+Wcr%39 ٱ}{,2tvv?q̙\t%456‡hK׿rʌ|,}ex1.=|VZII@mڦcnUuӻ㞠o 2I|9n,׫I?M⃬/X5z| _^rğ'_'~nwMg2=65tmHo}-]ѓd "/r$ !DC!P?t 'tEG>U7PMRӸz9z4E(^YF7.V2V dZE.5+=۷m3إ~y$C;pePyqK^w7o;/kĉcX`uߗ!I!$$8Y)UuZ( ao4~UɊ={~{jˮri5Q,`! ׬}z|yydM4HdNY&AOM5AE%EPZu_*IBFl[=Ƀ\ܓB :+epO>O4|5z[ouJ^rn93u&b qjy"@~~E~/m] (.fDY9P5{y芯ҽkr$t nϏLKw|ٓ\dܨjZҚgi2&\Nv=ܼ;~Of ,pv H![\u 1 msʳucۤB *eܞJ; CW%k :pn'4E"cu6j:%V7gFv|b4߹JGc%^fOkG'5m̛q%YTQηOM3h\Fo~>;eヒ?/yL8 ַy駓CH#%qoxe/L-o#tQcqN a-ƷYnh!;CdžAeِPWvXai[cNxyRX C=$aMSoLl2βn d?Tw0 -VZXqO_Noʥ^gedPK3!t1S+˹Br֭":j$1p몪l~߲TJaI ?fލxڲ"NtquM-&<F 0 |BT@U`uVN(*au+8 Kӡ,j2Tj YMab`s6Lguo. kHD:NI9E[ŧ)oz&/euv^m=KtK>fc9g3r(F&(GQuvгHo/r$ B+(LM6?dO{.S*u;cY}j+O-+R&aW{)7DTr:Ä&orn?rғSWՀ\0oVRa߬GO\oDСGѥ%:k٦p >?kM׌@rD#LC]}uvؑ_I$IJ|=^}en/Y?P__+K$Svќu9 4lkK֟Fuu5O]Zif4(XoN.AaCT u.[(7rmuvRRRž={4i ~q cLExGؽCٽp?@;[8یD[2|>ߠL$!hioyaNtn0|{,^87nLp=ISgɊ )WTVrԘ1קv8iO>=55r~ݿ *}t<|z>ƍsOyf]LF/_d۶m(*hh7IEuwgRߺzk˃L ͯ3q:w-ɥ,>?PŲ]ռ}}}xrr) :zX~=C#5|- ܺͭmDG]rL-}\5W!uC 57C55 |5_ˣGq:Qbj(bY\ %[gbcRS],˴xQ/<fξ@ hB_^\EMf_vO>7m" DػgA rVcu9 x6y^7ma J˜*}FGz.;jWd%(!" 0HW'ccW7??y W@@&L 'W_kY\8R*3yG {"jlDxɃz3DHO|X[r我̺ .rNʸq8399njN" \GJ&к5k()H0VUߘqx<!sǎXXJ Bݫ~̪SU5"Yleݚ5{1P,׮DgsaQ$Z,dNnBv?-^N 6k2ٺ!\"P'A'ߚc5T8B-qÃIt!lIqi9ԌuC# K5Wu6:32iDR&xwAf}noUxgBIFS}n7j ~ȴ$^EN]ރ  QVO^ @[o/3fV^MMM wq,\B^xy|7p3:l?{Gmxsrޡ'7h_/$!ed ̈#Ϗ#37'hll-ysniiKDTxAZ4'+?,79kkeϞپmeem ((Єρ&p8̳<͜˿=ol! | Fqqmej׼#/-DnL:E]k:@+|w~{Y9!cPgH~?2A-(eΝoM$w3vWI+B$ET`P$1_26G*T9N)Ll0 a c XJ-{Xic{ٝT_sw~=36oތ}w݅~(n߼la`IW洴`C"}ʄ91H<&"MǢ֘ǎǞSnuytC|MyMe+L"TMM`(Lҁw8u筽x;cU01"8_^qQu{2<^yyl&؁Oz,[ `H&ƫ`~k Kر_pA[v1 YrHss7EG2/f@q'NmGxqJP{@//~NXgncY_-.[-߸ߎ2ʭ#[nGs17d=.zF0 fIg?`ht R Hcy[+FF?܌|XF,31.4bٰ8q(w^yG2YgU _ b'SyhFH(Рm+Z4$k@k֦B[B,![o3=W 0(zfy(ԣJأ if[~Br|q9o3m:l밅M{Y_ͧեkQQso"{j`K_EnF99aN#{$'9q̈ g+D4\ )f2X2;{o}li"mmmBWW=]pE69 (x===0 ###Xz5Z[[q ᾰz!u/-5[qV\qZ[[nE߿ HpZy:TX)=S+ƿo,NiE9FH1}.㌎,zZ,]ӻv< b .T"ϣ/aQܹs'wkon4g nޭ}t+4 hغ WXb~f[x_h__Ե*?{֭×Hwq:;;1|ŋq5~45a` gL,lj#i|d2|s_0Ggh"uY8~8ZZZp|W_GK²eJK$A.Ùg)^湈}wLKEjuT@+\UזC:Np5Rn Ymyq~iu*^Tl!'ߺGF1'nd҃sВL n|sG`0dDsI4Dc# (:R g&؈7C*¦M~G[[v܉EpBGH$099vSlP0x:sp6t޻ce6-m.uW˞FD_pu) تR:VBuX!=QԠ~e.T̊'%<#b s5аtD0cy)0/\ܮ.+&B߿[n֭[~|rtwwc߾}hkk8H&73kğ䗫T8n[T-Ё-MXou<\ +nePk(Hw^UDLᕗadr}F`0X@(a*1?x⋾3IDAT’ڈG~"Ό8Ş^̝ӂIcrhmmc hiiҥKqA ǒ%Kp뭷bʕqݳ>ؿ?ZZZڊD"t:s=F@>nR8z~dd+ E ؊L=< vWWiаu'NJ޶j58]pȼ F''l! INfq:Rk13`2g ıc /MMd2hllӧЀv$ dY cx kp]w/ƚ5ka,^d+WD:FOOZ[[Dpeaqbgp&8z nm[ @W@piV^SpurGDnd/,vhgDސyĶ{"~׻ǃ}(`WO-yK.Aww7VXx<{bժU@CC4lق;w}'t:۷cX`V^+W1=\ddd|+/luԗg%;sݻ~Y(*h@KK =?<j=ͽ2[B\=ItLXa?*0->^YT>TvwvosA&o'O"J{a%$?[nE.By8|0|obb;v(|öv>.i@ .ZQRoU'v𳩍=sa2^ހ2nӨITd_5Dn&?k_.7G|לH\ny/+_RfJۑdׇ΅ pURm{N*(ѱ0ك+^Y4[J҈Woy7+PZ.s{o|hos4~96yM״X.ύ+zwvVР:8U_uU[e{m9ԬSW#@{TWpk+JP^j&u2RxEbEsKmQ Bti(^W(Р=9ОFD_p:k5W!=cu!\ѕ1W)K.) 4s-h Q6gZZ[[ 7(-#-_zj ¤?7IkN_ʠ$3qlJ[&{Tc1ڲP_z]JjlrxN[?N@^k/^N؝\_'oDB:4E,h:5;!1BJ&*پ΋s*d' #,}?Vq)[C_娻eQV[pٗ_s#[ Ί[!hoЈV)8Hs4Wu@XK D#șQ>k혂ez Zm9epo3(Ǒ=鉾\>5tTU 薚QlV^SsWe РmОFD_p2ǂ*ѱVNZ NE"dAg*9^R s@#*`薞c^{@,ow4\>prוb@Q :񳩍=s[u{-Q;~<+IJjؗ MߞyY?bi C#b4E\thCO{߳U%hmzvx=~c;~riW׍X)ɸ'?T& (Ox/_ti*L?:BW+bB7~[h (:R*剕ѵgP<GۋX,9ܜZYA|8y_zήf?ϖ/.^0J],&{w,aXOm4ػx~&XםSOA2oNZ4buuc^n^U V EhQ-jΑH6{$g/PG$.Fֆ3::ֆO&r}"x<0.dYD52)v >n}g?z؞x" 糳 WMMJKgP[J@~VxƷ W\P=UGEfϜ|ۡ5 N_Jɺ9繪@;r,%T ]gPby3$I?܅r7{LWG`eZt6axhQ7=Hptjt@!i|cEitӌJOp*-Ǫy& oWx|Bg@q`?y]8#e2 0ЀL>c۷;*]" Wt o5;E]zΙs|;q|O3Ѡ$a'l8*µ-IK"\0+>0@aGkoܶtT*nι/=+Eb^6F ^CiV#[a6?`/̟ }уxNM9g@4E<G0>1Ŗ'z[yJiʟI_ns߈7j[bW~W,YT2(%"FD ̶r'qD/p@b;6)c^eqko]{%]8wYP xbg{~7:v{W0Bkuzڣҩ͊sd7)i|i׮(Lʠ,fbWWpݏ%ٛ=ѲDLzxE\_{Zexr <U[.S%"*刦ye3a̕ƀsҔ{,׽lޙ ‰kof[|,r6EʼdQ3Pb-ׄ.AZn-.jwޕb躙pynJ^Ǎܞݻ奷{7|Ap[b.o7(oWǮb rZ&YY]vײ7P,^AD!j8p LPExL֮f?cflȝ= u^eYAbLlCG&De",*_ S)nv/uC&RAAޤ(QJww3$fH&'1;)Hx }JuDW$zS!OTe^(\erh BQd^u h] /N&n;Y& &Fm8W*3_@ZQ~u$*U{@g:JWEDЅ B"U T3Z{Jϳ! y<v /϶RՍ# 0Q Ztumkt T^#J:aAtWd'cZ&eMf7AjꤩJ f vf+h_(^wN-yA]Q^zuW+0 h/[V ֶAXtPld"bGQBgR^xډ=BZ o bP+RWu\ƴ*Lb+0' 0#JURZ'i#lRI}"] ꑍy~v=M\*O-ڠA:m5i+P^_m-= "j)`xĺ儆 F5$!7! j@^n ^`ם6 b&PM;NajW >"j3CT*3aAI$Lf zVBji"D3 f!=#CA3vOO3YpL/Aa"HQQk1f*a6/ Jk1[$:AF cm0۶ (0b6 l6 z`ֈzzF Ĭ\zz^ ¬[;.DAE'? n  @R{h1 1%                                      |IENDB`amberol-0.10.3/data/screenshots/amberol-recolor.png000066400000000000000000010461451443320625200222730ustar00rootroot00000000000000PNG  IHDRqB?sBIT|dtEXtSoftwaregnome-screenshot>*tEXtCreation TimeMon 24 Apr 2023 23:38:52 BST1.; IDATx}w]E3޻ %P*>D邠  R~RDi jT&RP?iJ*%BIH-{ʔw朻$h{[9؊v`S$v`U#4zrppppppppp8§#'Ippppppppppp.NZV;888888888XmIFbV:888888888.XmH@jV2:88888888884JUesppppppppppc$sYP VBX蓃Co/VћeX/7JMVfRJY;8888888888ZµRg:G:W*2u'm+?<[iDdR{Ӷ 6d^@NhKܨWsppppppppp苠&SbUd[Lɛ.{fw{͔>K2Ctt&{Ϫ|UU5*AK_spppppppppp(:&K<ErbKLIX+[_O ْ@[?z}tؾDu&&`C!1ǔțN688888888888#MO\DΑ8L \MDR8888888888NQNLJG IiK4ܖC_["?ӝХ`!r}hț)*9(f6|D/d?M%p2#iǾz4I5*ȸʧ^Ŋ&qE8OrBLNZ*3%s uHˆ܊&'TP8 yS=?Nz*\9["gr[jI8y"_x` y\?[Q$H"i4yҩZ鈛CPdB(i"I98=9OᇃCh {Z&"`g'o[` qEQ yytpppppppppph-Ҥ!r}4/8*_7!pzs\ޑ8Aol KҤB(oBAro(i"'JRB¦"qG1 K}Ϟ +M@oWJe\`L{񉃃C&WPP ,7q' 2˃HҷJde\IWоv7dJ%7V%OM8j)ԣWl>jO$g!lc&d1ur^Vh]Dl;=Mf@\N^}j;f7ΙeXصY0R aY6e{ۦDLY@Ueޥ%wo˵5ߚU@OL!fȆnn42/GR &.)ѫc1sVZc9]3?͇}@7|B$r!P+Gґ4Yckq+,+VʞyV]v8li}ZEZE^Göc0-  %g,|ȕ{-d؞IDgTDH5H)U *UN..cKbضSb]^IMG M#<MnܿD$f"ՋIDHsy>*L\CRO6'JUt:Mk:! ztsf3A>c(y%K%TJe,~?͇}@'\<݆)z4A}Ka$t"{4'~-$o!+v[߀Auu _ىZF#Er *rD3E9{SV@es@!?=3[ͺ"A:W=>ln6dPUbۜbOǴh)4n&E&;mK:;QVy/B[2iat6|Wf13#Oh.zG_UIIPv'qbAsɹƜ HAamN̤!fm`3{k$ fZڣd"1Gr ?Z*e2[umNXD3 IIiNʲLԋ5f#ިVaAۍt'&r'U%dk+E5NyҷP'p6n_[l Cs4_nm.l]<+Q(XNUK8Z5DnC>ӾI0`'GkYfa!l\dVB !Z-a&Bd{ČA= Pb|{)PL@]TfiL1=l'Y di~xD:5Y$oA8k0xfk1i'r_`*RwDXo?Qomn >wYgg \^f&Y/a T,Fm+Emn3H&~{UfŞά\U_]frd5``g. MtȧR5,)e3Xe6~7c,`:cCmkxn{"<}T? .)&*}L+&=DD 9@!COB^"%DM4&kUc[e+ 6Y]IB4íE+yuSO!8@u0XٌZ֟97 hF !ZGy&څ!y^p{F{JNejrL:GdFM ۸,3J ?{3UIb\ %I)ƺb ΍|Zo4]= @;h[G>CCd" +Kc6x'3]v^mQ M-"1r!.y`/fJr4I%PS.)l '2rѐ.b3Ȕop߄Ƌҙ mYʨ9 9q2#0nD4r!e™" |E77X\HkhI` $U陎JȴXoc5e ڃ;mQ>7]' 2$.Ƞ^b"B2ZDЂ$w t4ZBn+Q zL؀V6O%I4d pˊ!(37 ̵z" )8Y!+A- MV.LT + 75DNp|5{sJ Gr]8D_@'(+5dBK ~QP !PR'p( z kl0`mHaV-5@ˉ^_9B&jRQH\o)hέbbOD>v w!lZ[8 [BH:&!A Sy"WdA"vo08 εR{ª(W)XWSTl׊ɝѪbMBy6TDrM 鱕14a0Dz \hǽVKh^V<][)ЗImpvVZ,SXN ;VB *:MZ>Sd7#25ثӤE@ik^ C>aD=Et2<foE;s@uԤЊM$1mFhk޵DF:FOL^h|سqF%'+T_T<4 pa\6%II1LC<"+S_Ŵ@=M&Rdy3.0 xh>Cx?5<+̗4cNO ݨ`2h*lJ5luITF'[P!m"3w_ymjfq0+x${Q*\-@VXwD ISoi}4=c/tMc))P~Mȉܤ hǫ$Cs\Y$AC ɉ*Z fmkIѸٸiӦ$$U EePD+JW|^Fz* Cx+AG.M Ys:^CIe(%0`25E""gXdN-"e 2B\X!h Y f$b21yLκ?VLs{$A{4^Y"Dc q&M+./l$P`G:gjePQ!dN>̝Eζ=0ek*n+\ԥī2XpuDNG٨ְSvohkG*'Hޯy'75CO@?DX/؄^$4]w3oh4=w.~Y\z"uvbۘH]3 LBsl]K)ۯr:ѐkx(ԎEiT傿ZTF3*@BE+أWaXeb)]eEj4{lD%6nYO˒B/&j7a[{B9;RV+-RAr&H*{,L`_23ue)8c2$礒W ~slb`GT5uxQl -9-^]]xkT=u*=bٸM49-, AҝbnO$gy{YlmK-vx_ 6 )AX|䎑 &+gĴ.Ѩ@XW/\рtȤBI/RNcà'[(y#l9I;!.LUAlG2^GݯB<I9VX?+`پ<<-^H#e)U!uZ[Q\hJ^c$'gN bA۰b=Ľ&e"zzB!݁/oar}*o'gNhrvh*ͨgȦ9F1i{0z{.MэBA5ۛ4TQ#f/eˬ.'2e6=INCJ bM4!dDY){!sm[{ںɜHlT`7?0<8KRR}e'2PϳsgrTϷ \+_Hb1WRj*L\QhA#%Kp6a&}5=OOw_}QwhN&w~M看oSF;Ͽמz&rm/~v'>^z쟸1lP_+xwW^XTjKl^Ng^o2O\4 7mUJl LrVrAJ5Daʠcu6?OҢ.\`OYFDNY 9qgx1w{V\3D''vIBFIjl-K=VEI5UpJR 'c"Ϗ9]0Q)^DQ V r"I\A{ԅŠ6QL\\ '76n4$tR A RJd rEfdzp1cȀAo .:'rf5oR6[:H+By #!m+m Ğw?eև_yoOw0y]\s %P"" \\4j"ؾxL*cQm.Z"+J83CO\p׾8p};nÅW]& L6 =X"}'c~#y,X~ymZltW_>{//2,\?TY)mejI-'p!!rŪ)Mؑ$+|%4" 8Lys?A}7_W3)ͫk;6Llk?qpaG`3NFV6T"i-wj9WJK^h3An<ЬE$L,Y[*.b,/H:.,kdc(8gZ٦kK QZ|zOZgz SDoUyI o{.N0W_ywmA{{;{ <쳘`Af n{N#둹PW#Ôi眍-`M78P C(>wǔ\Qq[:bѲ8RP.d 鄝ԼFï'ހgZoNwuC[m#(~!>۸_CZ:.2rQ0~O ';ьZ`]O~aV4rfscrl]^4g&r딠6)vTjki3}iu&+4291e <r/>(unyy]˻ ~/X{董qn1laՙ(*u1/ ^N[Ьq;mD=ST wn{evqPxJ^ 7}g%6Zov 9v(J8ۋ_L}vmO0LrLƛI-SҸ6WAQk$w32qerCbiVP 9QBF'$S!YՙLtQdV[W@A%OzdǸDgmdi$ n 6ޛ;& -‚0a/ܙpzJDYRWO:}_/o9;=pѢE(}V~)߿ZlRvh[ Д2} Ct>xPTQo'CZ&hO'7vC|x7Y7Xw=?bkk; p[NG.'1*eY 8MGi6RQEMmOoICD*mƂNBS1e䢩ہO$LjP_P:Q(TP+uk_Ɍȅi +(}e9Ȗ R):,X8q+b:)ߴ+Ejs#/dψ}GRӬXǒ[s&MZ{^Y{[.k/u5)ZtR(VO䘡 C|h!`ʬFa~2 5>zH?wpgTP9fh|0|͵poiXg(c{$9 \B`N3;seii2Hh{{%IF`5sJm&]=u@^FwI$36(=)\Ֆݴ *N-7v+٠#&pq _VtgEp%#T*8`ݍ> ?jrHw/kŗcck~QG/w܊K{5OX`EUyLpD<1Vm aJuN-&ܒjhMLI vFnh=B RNk3CSCXtQc4 vDH.22$"6N˒G­fi{%k6. 5%ҫ1# +VV4VxE;'ye  86i0m rS;`(v3lVm?v[np;ntrGƍN[Ӧb{[z܉ ,xX_- JМe`ls= jYФ#gd93O,-6PȣMPDN8'~* q5K]0ꊱj!Y֊n .3IQ~aiW6DvVʈVRAaLyQO( 83@Tڠp{vAwLTz+//w܊~G=3JY'}|ގa33mF: 80I7^CRݓyG ~r؍M^c70~3[ٗ^HyM6]7û0SӧJrtIҬA3ɔV)miTYH7Fy6aѧ%oDKmoIJB؁>S+&SH$B29rs Ʃd{,{Qz4 ~j> {x2~1CӰkfҖIAfwq]w l8˗K_^J͜QP,v#8i%y MpGEN!sWXN; ?OsB1Q[NG?0M>MSs$1/f3G3+n%Rg1.tV&l O4gW ,BwHMӃK'\$q/+-`/$霥{$5rFbEJ/,7Eբ%gQnyM&2k\(+a77`ӍgG>OUU*WbvBOOnIx{M7yPTs±ZfJm5&YCEm.e0>#xIkvƍIR9Ҷ&AS3 Z 6szMTYVne/Sl'7XťTQ~)ĦmDze?l] "ʒ|WB{JW!}7PoQU]%;7^fMY]OZZHzE.ews~u~av<\yeRAM>;x=Y*5J6)1;WKRg|݁=KOJZ$16 U+sس4nlx7q$fq4* &t*QJ>?;,VJ}2N;l-r"Y#ǴHr-^&X&A]_)u0WƜ%oT3Qj?<i50k<ܿ~ONT3(u)Nb~IVi! I8 bGʆ D5b6}NnIn\2&5LA5Ys;% Y('O?H:)'p~^_Ɋ. 3 *'LFXxR,U !eo 6Xo=%]t2.pwo?pWaA(y%N3uDF-\Ht]5 Po>bǐ\g`ĨL53vdEB$r&.vr#qlՖz-qgޚ:˗c̙8q{ SVO{ࡇՍ ^GƘWk5|0{6)S$ ;npŗ^wޝ믏{vy$ݍ)?(.7zhxx嗳QǤGUu 8?S&hJSrbNUDNeT4^NDcDjj }=NEt%\eTL`.p jjBJC @3qzAXs5=e#Ǿ_"/O]tiDtTH?CW=Sד+OK.qd~g=qQGc}WǒeK1826IV[|8|uxw{br/~zSTeKSPFQE4iC%nDE1{b^w ˙dO)7E>aS(5,[ݠ2-.2h1bMNd}(ub"ZᴭvBvLV.FP0^P#X!fC,[,6|et2MÚ?!ȀK¤nNHuӦܚ{νwG]=:0w+Q#Gb-gJ%z x}VEycñ&N}` ހ+/cžpЯĀqϤq9ӶEAlDǕK>af 6 >7'cΞ©A|WN;cq6\6PvޞZS C\u/T(5 %&ma\Fg~Xۥ ]H;++Jk[$<5eg/S@33H MQ O;g2&fKK$](yA8FPN1U9b8'Nq9NP*ԫdbOiYrZ9wgf/6t(=t]o=tgy\:ӱ[pօ?}1^pg[cC?g'ttCOg| /DрHYt@_w7uxRő+0G{ĜӅ P x'8gˮ@ZNK:H{y9A3bBns[5X ¼vZiʙ]X6 *|a6Q!UFj',E ~fd3~KWEVX?zr;ܤAl;xR1#u22AzDNQ̚Ey)Gc/yաsE:ae&jzں0!^o)䳉eye\]N6) :D5I9nVNF@RvxkMXx.6jQyܐ0\Iv.sA`6 mOÁ|.GI{+v뎱٨sΚHS $'hLQXbM3AI~qDLTK64Lc!Ǣ[3i IDATeE28B ⱶʪ\Nz ͐ZfpIsab*Mhat<0u,Gw;e!":,׉ڲ%=|%r٠;a/*y9;fgUFզLe%*-22])nn{lbRJWnt^2|@:{6(u*E2!V>nC6,SOa6QQWBTeD]MKnZV)sIn%$"'sSj+k\u6Hh XRhhI&Pis->b~- Q`2l;Lom9D.0yS;<5-K)GinQAl8.VRGVRq΢zW:z$MӉ(]0|V&өF j-bFӗt#>ujLf[}NZqC(6@w)O($ mBض]$W) tۀ%%J5uB6k+6"Ր-U`#8P[g3Mh+٩)$D9#7=Pj+L*4$$)ۋdҪgM#){Jcu,Jɪek>+k2*")9*^\7R‘B3lD!3qy&",eo+!g8[R@kk80koؔ9JAW%([̵V$"999uFxhSY&8m(iv] Cx jN&S[ VxaJ" `l"Y2Z[HYs,aGK˳GL}eT@%TjP5iFp ,}ړ cFBs\$319O~ cpH0< e8EQJ\}QMdo9YSy6&MV7gDrj-YD pQ $aBytECC A?JmВzIss| ĉNnyɘf-ɕ==jی0z H\ a;Ic* ѼTadʜ|$lTRX)|TSiÚ5=m -J{I7 aniѪ0k3SbƸܕSJPo~.)RAdc0͏Bh*d C*9JZ&#O~%HxpcI<8p \{M3C֬-9XVĊlɮHζ . "glhj-&VOG,Ȅo&*T*c[`ml1r.~dAhBȴFn{ ךlb5ɁԆ jy pH8mpq\h&ӸJDPKV /?>@lD }"ԁ^S$ή (+^Lc c`{BO{$Xs WOvIXRpJltFa6 < /ԵmVOu0G$֊-$?"Pa,&Pl9>lc3D͊lx(؞ߋbN[$<- k'ȣ]k`Fxcx:'دOMS#V vAE AǃyONxc/'8Ue']Qcy ?ŷG i:q-xa947T,T%lRE\8ea"3r żeprL2[3|G%H7Cl\~gm;,M "3ž6^xft!9(L)%$ODHCI|SuHu6hO!)< DkqBע*jj+ co( 5JJb{>|1 ~qgu0QG pk'kD3^c WayA?zPtem<*5yGm5UӂYA/ZP+^<(s)(sЖ t>ԽEofjȔڑi㞟JA6\v_ҹ_^|^QXP&]XC51lV; j`3T[G5\j0J \zk6SJgr@(d'!pjIƮ/YHSއP)cTplh{澘~gDž'`ŘA#ѿ,]RâF',[Υ7l4 FgO'ӏb6l=ӧE]?S 2?^xQЈFzqmfŀ]wk.Ŵ_{n8[obF_]Mt-ȑ#01`@\y%n=?p?w N8ǝr2yo*vn{\pͯި'ܹ?`՛O=wǃK}W3´4x莻q_G10\q;o?~q7N4l6o}r 8Kob 7_9,39,eUc+ʭTA dSc?VU3?b`:%Qy `*旉s'ky|N'pua޻г+f= RA?Ee'j>#I5="YHxP9y"Dm6|+J@,÷z, nc!q`ɀ=$ `ܬb, `'` U|'5x"&$q 堞8/؋iT/ٰ_Tb < cCp@^mg m,42$<ߜOQ>^ogEǰ( X?6p@[yjgS8WI;xHXhV58> g.Np4DD?UbrPG?E8C+'dmi  %p/< k2F:0p1C|湍{-w@nӖ -5rA65[O(y% :ˇ[ 9`$$) 8 Ɏ'w1UHeГY=hr'ޢʃ;9+kp]C-%p++_o>yxH êvRD9AmA{ɕƃ: o(c%p3b=4v~+ 7ldѧ{\ikHjQcvk(Vfpkh edde$UdG6z_JmZLBlq.=9d\G  1tL- m|!]<9j.C/ࡌ`0v'^a4_QX5(K“~VOQy#8Qc@xyT^_vx#0?!Q7`P`uRFaмՒ{.04o Xb+wy"d:$ąLt' s:qa6Y)ĥm Љe ut:zz /d2X* ٸG~ h:jލ%%-F#_ə#ǓN䇂lWwpO'ÿ˖_i?K|֛?sfΞ'yْ2Īw8ggL@{{;xM|0gE!]9K"W֘\KF%4^+gk _59$iڮ:Y[P?ЀJrznl?j48Tx&dž_5S,!a Ng!7 o 'xPB"RGH*Xub(.ca]aKIkb0%DxR/1=<<3^KIe ` Qcq]="~+-2{^C )c3~:'J7^o-mmQ堚kh0&'5(uH$,xfG/ ©4 }wtVb'PaߤL+B#p"9sY+rhO3riRr *|d~P&4|y&n5ܫ+ZÞ; Xr z43QB %TPF QAm( JQ5n]Bͻ{Ѓ*j:oFTg6FSސʠ z.iphlK%GTd[%Z9I9z-)[zQ-_ֻb)Vg┢uXj$1U"Tg5i7EoҀ >_?ׇO>|u!zUXžw9 ;@r)%÷7"2|a#b\SԆAYSH0CE6㿋 ysW8^D~O d>/\!y S{x)CH,BWk>HQ U! G-DH%< ])"gytjXvZxt1 A\xHVHKg]̞]x?W,/Y|E maG+ 8enrZ ZɼmgȌfs+ :e ,]F#k.?/qWOFc}GZ{|҈CG% $.XUorj oTK`hC?QF1x(}*Ot`(U,Ѓ|*jP`[bc3F[rB3Ͳ9N8)r Pe%KCgkG'd 8n)9 ,8F9Gגn,_8[gWKDD ,{k,$X{@@xG~5H) S ;ɢS& 'wxu#o?G<h/QgJ4. { N !9$^@;l“0@fPT _< IDAT&lE#/[3}^_{{]ߨ97K}kyKi COA@ (C^ ]P:@%PVF։ܱ%p _j2.34wH st G qXe D5Ўv:hlF{ <5<`Ac.†a85F'x*%hJ@A`фOhuG  Y}vDem@$0ʞZ)\42ԥIH8.EnФe;\rSYr,Kșt8eK!| 9Dz(h{ E[ YW>|HfJDN1cq(Ϙ!6P{;V_FG Pc+/ߞ n{I^snUY3fXvS6%Ç TdEP6)EP|A4@Ԁ5$B2dtWsoUwUuUu'̅ɷ[=~FL:r44NH`ydUGPi N!'D^vJYiԙMw'MK+M .QMLrN5y$0RS!}΃8,j?@M#2:8pIAwc|f0 ct%BiMU z;B=LK%k2Y3k+Q}N]\hq@ 4 Op,_zc G5kHiH~15@~6|vvո:ken}is{?_}|P:|l? )p^Ż=+g>۠!I,"}NN~`P|nI2rw;vp]%ﰹSFCО5]/Ιj_ݵcP'S*Uœn"L^lr#nV_E*1^CNt/\hJ|0&p~;tNP wL"pOd `#!=n`pCD?"4b? Ii4'ܜ)KTɫ*&z Ѹ- 2Oh`QXS< M3Gܢ {5cTgN,͔Q.CH&Mu`ЉF4lvgP,=yrF VKMa-1 RW؆8GsC]}ig\?"}N]b3 X՜Q㕐 cwdº킊ʫM8>]P]G{ٴ+„sba>c=(x gXGM]ۃl@rl;. . `%ןwe{qxQS _ [~m'%4JOzp ޴!L>`/p/\ *~u*p#7r4t#ƧO3ԕ'I=QcsyOѦ2i\1iQayABe(}&2'߫̌C@AI(PR- lѫhR9{9r*ҋVX¨T w̐D*<p$*/,*ba4u V3tQݲhG=3(+0$sIk0MqډpJҪh앦ө>6Bh?};hd 9cY:Z ) #bV3 c}4J1 yI{&56Ӑnϻ1.8uQj7TyNj@ZՃVzC'6~pƒ8  VF K kq1=58s85nY4Ğ僤9ө+"Ő={+[γ em**ԭh*\PHyhZ:z<1}/;C%x` P`}"  ^fe wLe6$J\Aq;nA!Gb9&*RWлiC(r-[F~ExAHB .G0(`NŁPUxADY$Ef6`@E-!aSd;N`8F`5eq?2vͤ Nf5Mo`֖tj9̟(W@|ֳ Bv@άW,͢QjUL|f1K  'A\Ӂ>F G0r#`AdǷK}ػ"8&lN w_o2 pc~n0e+qF~Wm݌}؍cr[v8EW ;|&v~Hǒ[}wHhCGM‘sˬ nڮ͜aS)O=ƚWVf+YMD#m\Fԧ˸pe^*cB`41&M"pGcx( opOLSPp^Y!n"L ؘ a +$"F٤ڧ@Qh($!DJZ12BPS$qHvGNBR3=|91*X <.v%#BW{F2lF5m `uu{4W(ƜC*w fRp+H^alKXaB,1M) Q:`NccO`.1DS`^-67sa3^B'~ZUm+uLG٦55˂QM 'A\)K򍍛c![벉lr X#HN䞱=9qR <ǭ.A9|8pSF8ϰ鮷Ÿ}w~ܲC}0?"};W\1)q  /I_kcx=A>kvr3gd}u-5\ej=VAgZ6FOYp-z WPH" {N@nF3ag1rͣڜ(b,d|Pځ_P;齣8} .c( ^Ca4UbcAX 5$BcL pFO&<(ʡmwp㖷|86]}N?ضj^מyGݓy8nٻ +O\kN0lb߮%],ДM2f쀴%=9pGDzfp7M~Q*J:ᲀX: 6fO Q0wʩ8&D j( F.e6EAhUl! 6C`g@>(Ȩ4féK6B}4iDw H";cv'Jsm`>@"X؝:gw#}?C(0|MkV   pP^4G6UNU2VMR 9=I@PK{`w"H> >wMy Eъy{”k@S]R :9;:i=96?%WqW7ۿDnC|C7C/uCP{R3`twT%u3 !I#{o z3'ΐA67sgɨ%;ڧdzmj"RzaK0SlT$Er/=<|㻟[_)a43-(Ϊ29Oy:@ % ¼Eeb"jL3TS:V0Vp5h(E?2b9) $_B5@_LQ= fjx!_':,(xC} ĈF̜^{iTr+0 0rb,e*EfHLAtJ P"y#1%/T#[D飙D]K$}9Ssc=pCp 4|t]?j TzSkI4e#BL+;sF0Iot6oeASVk q}G; b&1#i!2~#3n#\:EM)e4nݮM0zsR{X#~짉ۺkCB40Hܫm*h?aegt=u"Iy_-hyXsfKRGbBƾh 12M)2PlI5hW4gDD9̒Ri͢)T(7p$d8mS`$AȹdTgVByYjƇKmS" X6>er18<掁 ?a'|x*@+p<dQ< HC!OC,b˪QU=Tzj0ƭ”m(8ȫҶ'"vL։vb U:OY6KfDњpvjBHP36z?mt1PeӢrYsu}3뼾SȍnʨJ/f6NK_ɳ;o8i1bB}@#J}2i/U[e|Vmc%~sZ"}D1߆r[L6WrSN֡g & ;vLة9FET+GcacKqǻO_DeڜI8}BM=>ujLWzVzDG B BQfBax hH<2Yr1tw !j0m)(i yJB:Mxc='LI 8M' I"(#D$C"THS,t2u:pw2&0PpZ;d<0h]$u[BRIRm%i_pʧCTLz\>Q7JZP6*jC-/UK6USN]LV z7Opu )"N9̳}1I&Wh?1]mUa2e8kFSoXMU=Oo,/>6c=;eTq/'5SڹIU6P=neBBjFL Ns^ lEaEbvi[b]3p#\1XF@<2Ƅim*h^9+I|y`JoPfw`E~2qR^1S~).x9[XYƼI 0=@K {崌:T7t{m})n|&Ʈ9QZ͒ce>\ $ -fuEr!00AMBzɓ{sbvuk_@DAirjZ&aEP12m2 C ~<3HZG&j(c LbV*b $ vkn!@@S ("3Ћ8ȭڇ08ՂF!Z$ ňCr!1J6ՠ/32&LUu,K(I?0R8U'Z xQ$cF` ky(Uou4d򔸵yL){j[uASn(4Ԅ)bR@}/ m8 zXkPl>q8fjt3]g 9]*`"Xi]MKc\ߩ9G L0úbAV _B#P>@sÒj,{3/4'&lbn@/gH9 +6Qk}5 0r Zd IDAThrL ,*xr(XP#1 ⽹7hԖ0 ^"Te_dk6riǐg=ȭ٤fy"t) 'A\`f@Ga^l=M͆>J`"]fj_7Lǂ*6Jް.>6g4H --$D+a#hqky`Ei[5# dU Dc)Y) 2Ls^!O3$Bj :P8&ƠOﺉ7k)VGay`DG9֯ Fќ9 4#'#Q0_eFfVZCr_pBcrY#nM&~~^,)LcTLD%PEaVHB`ʞEm'{1-.)fiJ~H>STW<QD _K?P8 Z|6F,'c6 j2k>?PN^ĪX rS2oT/vJʫвv} -L9s%$UpΦ! .X1<(@3N1%Yq"($`-j\>\CI e1+;kNfﺆwP]]ں|Op DXpiK|}.>SL;Gy5TwPކ`MKP6Ѽ;@TU>.#t,roaSz}H3 0𙵫m !MQ84 ލSʰ=}Zl_/$s_,@x}h`jv' 5r鯕+ /hL{/664,@CmSwg9TKGU&'EAA2-c3Y@N٦B9"sKL3]B=0bB0VXh77r0A"`˛#m%SU+8@ dqJa8%!Ҳ],`x'@Mfi)0D@AI!9 e}( >LCjs:aM@+a G:Cb*17N渞$F;}Adnlצ@ÞYC ʋUY}g6!-\f[mjjK&I:'+C8 :*-㄁*BK@C0,ZйO >NMWamc9L@]Wi۸"yax:%Zd+gagwɸoƠ )n"S37_vRwE fSҢDGd4MUȟD$r?#P4L wLh\OT6斀OBx6w$C#WFR>wب̏#ſ'WYԴkEǬ6 5hȑ>RvOetg `1:0v4 u'g57uzMfƳ@c3M8M)ԛ4B4yA0g)9#Yl,^g<<&GMn5nȮV:eZ`.h]W4g}bM?Tg@_WnH9 t6l\UNy&BaJaC jd X S7^+LPHܸ&gwƱhr/ )= '4rW: DV e3֝iU-\2֤LȡGh 24 >k2KԦ8QsQl0Rą{G M0Ahgi!E͙9_!r_PӋl @5!FaBGw{@F$.[cM#fRjIs\gđvT>)]O 9`=ff~]: E Y GF.G3QFf9کwGӫ)#TPN`jQg̶-򝀿ED '.z ibyi Av*M>FX][Ce`ҹf gt`X~9Uܭ{ݼ2l5/jeVU3C;4amf󖓧@E1괇 56{5Gp40JA!^ƅV~p x[e4"inY{+p$#A*ԓT#Mv? OTRW GhD)P5v1pj^(Wd9w} ZۃGerv xGm VG`D$2NÑ0YP䐵_ .(clRHjl` 0i&bj wxQ0OĶz,<sKn%s%1pkw|ԉf33"8[򚯏=[ŦѰoMJeU=瀟[4&n]V'h8Ab"3۶nj^mh `uG Z6`2KܖF(A*ǼO]RM;:1tiG:Լgϲ7DNS.^"qqY(TΗ/]xf!c#xp Т3GMOfb'l rz43hr 8 HOjB SMܺ,k0-T{1f L@p,>| ,Q:̼%3vMf pa&`s DBIDGL.j<K%8Q&(&2̄30!S3TN7-$&6N(0-*Prz Ly&`' H )*| !x=9ӎ(d4}a_`,ߕ27ARS. w\h91~f]л'Q\Q';,B--e4f *"u8,UmUiӉ4q0M3F9o?+Y<2,,,"2 l߾+++H:p%lݺĎ;p1$I]v[cXXXY6Be94MlfI{h!π"3c֭Ho|G9  aJufV\ "VOʉRgֆ%ߚ&t]k{w> :L>D"Ҝ6Z~&+SlSP"LQ8'?=LdlRd)` (H_@נ2Px`Jg ^h#pdՈDD  lR̎=D gPi&S@a&C? ceT̚H k6m˰&K^|څx>2F3cǩ2`q-&A,kOvFbKh۲`6k)@0H2=| #8;e)3 .*g7/ւ0`'29qBu4;{N) Ѓ+8%91W*a.lZ;f)]0ւi"Uf8“cXNȉiw^@!UiMjt(|#kE'Sx->g\'S8ߘ\ A GjaYs^lՂS`HPLn?YuyG!Ղf TWJ:nc}]r 1/ӑ$zѶ9#B6\G8 G)0XXz.ga:3=j>|It'kSNpl;z`@|03>?8:db{~ݢERzLǢHՑsvfB:-Ƴl &ՅIƼaE]$Qk[T* OL!|Qb5r¯ Erՠ7Swdhz/ zNEd&O;?&hήh UV-hDc,D*a8 ,Fx).8Ε^qC-v_XG_>/=JN> fJ Z/(ՙ:UozoQmif9⽾8= k\X#Lh77؆R˪@c᳅ӥ , OUZ7 n5m-.O$u7'GNPV 'A\UY6ms.\8oK;@/Zx]nV ?z{\$3cyy%f̌Ҿ/,,`yy6m*nu<0=R0r_*wQ:/hct3 Q -0kfI'Oe[սu"+}hYt2Z^p2XԴ0^T "9M۞+UI"4B@9J[E .5 iIϮpw`Bi(b 4fe*#BHFW4(:RNgC .de4qhœ71]<9VVtCO&y)2%̆]9K3P6H?sG(ܘ20K?.i+@ mPQ{,:C.ItPS-/6f + `URvn榦}i{x7UY^b.Sr OcV/\C dP%z`wlN!nڶ21%3Su9+o҃OMxzH U,1 ȢZ'6*Yu$6Ի3~2ߒ*aͰj=*嗦*EN8 m@KdD-..9Gn23X(0O*!P}3pTuaeuEӂn]=/|ί~睇܉[2BЮ IDAT;} W\QqO)| /]y~ =óWq=G _xneOs׮U߼K 9Oصs'_5]G&m[',,,Ex9.w@Ȍp<]Tޛ_ztn7=k򺥣{qWgyN"]n=1T2AHjuH09yc6`-0By51 p0 ͼܓPxR@ wL$X?1D E&K&GvvN5wb. ]7rttJ(*LK4v8l(2#cz앴nIN8u Ռ@FÀԙ8S#`&Iqٴl^J=B,i/村G~7Lt }*-*(KϦKE6R1dLʇݫ4VUT1Vؔ `"ϓN82}4?mrmhYL ҩwnadiRP7#]^Ɩ%lھPn+Hoe8|q,Au{>?_/]OI<ģ'J@w;pcp'. ]pcpsű / إmm~[?[ i['<6~ضeK!GN8gr-^d]N՝FO4'rMvGm܆0j:ZS hL@L!sjFwX] K$lE#j2VIb]ɦ!)EDg~TFVC|©O5d%P(@D9眘V:-h"hߔ_|hkۡYދcq.쮛/9xN"O^2Z\'\΋6L+r1 3)Sf$$6`! /+lk?iVRhJ\#0ޅ:Lj9j<`PtȣGuuixQ\x/ۮ,-坉h*?,ašpIhӞYp [Szs]œę)` ]áۼiW[]'cum65]Iom_WSO=moK7𼗼~>w Z>Jf\t_[4'>/n ?)۶b"?>ȇ+?Y8uދ׽pc_zzxL-GoS/yy~ /yׯw <18|/V鬳qwx~ꗞ/|mݻg-jl8pSZ^Ê>iսSOzM :5tÙj ק6敽mRTOV aj;UTH4mrmY`-G L>" Zx)іOǗ$‚W #+Q gB^X)XS-^-[x 0w ت76L5A l+ޅd^q~2 {yErC"(-΄jV_K;Sޯ- ڴ<2ԥԧM'V8 ,\xT22F P`0`0(ӂs T6ܛB7!~vy&x['?w^ᓟ4W:Ź}m[/sqq??߸ ?ܿ~}NgO}3xC[)]|g<k_W4<?/;7~GhRqɇ>G=ky?~qYOU|ӟ=1ܺe .?ŏ=qxW|*|+C^[6oEo};x_?xk^G?!}cG?T|?>7|3/\`x4C XsВMͪs9k 1JA z9Z47jzvmR!u l.C"_9 `` ~ JME2HjDp,#G%Ƥ49^ 8RrGcĉY# a J^SB ' E$VR'3)"6pg̿v{u|Jνx5[͑ KǚhxXeRrO!Tͩ %`N ؜s8UTƉ)y Ml R)ZOs`f^ x w i싎oҡҩ^W8/Qcg2!o[s e TkGKa-Y? ~Zcw{ @ص},rMZ|dnO{LXMh+r882w% ӌk3 iPAjgVĄijR@R3Nq?`B@D]~SDiDg5JyU2\*&.!y>pKE4s b^IsDb uǀ,rEyc@+WmygYAI=V/14j`V1sܰ9Z bt fs`8{{o»#Z>+>ԄdS쇅'eS rSRFNf/L (SjWabɳsΣn%O-z5WqVVƽ}A[f'A\UX_}040eny,0,ȩk\ݻq 3*Bhyʼy vGsg///{)9l<מ9o-xo|胥zY:wHw;ݛn ›'Kޏ7u_ysg>;F/[;-(O< \qNݱ۶nm{Ș"^m9zg~zwo ݞ96o\FJy&c5jՆoR 5) 隻Dh~Vv}Y߹݀juY"wf]c]ƯŸLݩO*&b)8u,wOA7&$BCoy|ZO<8E$̑>n[^5bq5q#!Uћϙs_J Ih$jޜj<#l..%4t $^"Q'ș.쏉zG#F`b!4h؈MqC4NjpG}]2W~><ছonpeu;A?.o\]x/?ss>uƙغekY0`%.:s< 6e\ }m[ճ"BMʬjoBL&Z)lg(ye Uhr!!e0$EAH`*t]=#I Pt,wI0jXk;k7.џsMfnuCEbx ˕"9V'y q)$ 0(I<(%P( c8M!~#$6p^uS"'QywI,ߩn4¢mB0WUN`߃ByK>-Ҟ@q>NbuuUOc2uz` ,CΥ<IsgF$b ovQ*E;9Qt!38`ai3Oۅ64m[Uػ^߈W+R[Y#~y>&s+~Anݻo?K^.m[~2nݻo͕uxoGB:r^RC08 O\pcz_~S1?>g> I`qM7ߌQ 4V>,/N kEӗmϻ-޴'']ҵ,Jô( R[^|zh2nͣ炡_|sExcbn'⌠ĥ@2TH&RK@4 $ [:8B/ sWZ?b!B^w?"d.ݏ\Bw;p .cᝇ'zpSY)pt.%#^@9a,r:5Dl?`u$Ҧ'yS6ypX>Q r:6HjQq8 Ƨd5HT<\+5UfZf WasButyYX9,gH[iۀ: 8bbk XL3wX%Ƚ,$[G&286ўRcx2, ]X 2Nݱ GXY=Pݶ.q9t쓞淾?yħ?U披_YOR1owo~ ۇK/8^?u+ e3~'뮝T? p͵*iF?GC`&xc׾¿4lگ_[x_C_$+@jxݛ׼0`SƮqXv`vxPY>lT1I_kCc [fs TPqmִ*Ye_V l'Zլ4 [$=2BY-ݑp  f^Re< =%@9RJ8 ShFBGZW < AN3' $C IA)8Ѐ3nсH8 q  9$8 !ӆI[QzvXCBưy# `@ QΫ9k&ڸDr#NQKO5zMC99\<]NkH$8TPșpӎËصu,PipZK1( fucu`b]R3plز0‰})Gؿ#c:M&f 픞n*hUem F>urdtv7JUHGU?Hק,ضB<0"@DWg97j2WCPqۉFhRI4IR_qE#Q:vf fyu# N@pI7JJ܂@pK bd&p$9$H#e`@ ITȐ!s#90dž,S%V.:t'dWȇz|<#?|Y.r> 8MvL j!Fʢd+;&ۄ+:a7:7bԂ(l~YM% ZڂucSGc :$i*$6huMdYCiRV!f}VnW&zjO\N)틤Llmڂ^wCLľ ; Qm{{y]  l1K[& F ؒ2vm N=uGay:t%$vX#Kw e~+/e}a bHF2–ebC1! *ҋ%F @09s]凕Y]uuwU>qrefUes/h&WlOO/bOO.9s ڮ{Q}ld?Ԥ8ġz`h;®7Oඊ[e/&z}1 u5ge\Fo CjM B m `%~+#,p#+~2N(?I&BO%^#QN q 4 KBAT!J#%U RRrzp >oP!bQo!zOگ0=X"& D:֩gp*DbKu.3L1Z +h مZhL~X s<)ڐuSiK}i6 ]iUmziy(2* 2*c47g,dAƸ~E9cZ|ٓb'>p)R$:2JZrFѕԂ@L7Ps G?s{1<::-YٻY~==[p`w1>n_{e#d ;CgA}u {vɭln3u[]@N WILd"DDCўc.l1].YZV dHQb1y";1fJS+T֩=R-z ؤJy>#'32=RTf) DN oXB~wsbH<*|䒧'KqʯT75q5ш(D#*Hw'oԍq/p% "~ɧ<_ Bj1 Q-UpZ )8-}r;0^GC7TɚO:CsMf \fkY\Y7FBi㶠)[[9pFM$fW˦щkmaȵhC<*҄HĘ*+W8dZ1|U)e!dA(cFR1+>8dR\ՑKR0xAXpt)%ˈT5 -ܡ#݇Q ;ԾRSbI8K5U]#!8gb35v.œSP0kULD5OY(D%}{" d'W=8^HrU,OpesF359 |~kJ^On*w@!o?@6=^UKk_vCV2~ήSn˥N- 3[_DWh$. Z!*)ȅ+n :%>$sKJD[ef$l\fIXd:c098J1)-8 tNNksX(??[!12"Rʄr#/cZpxNy3^KG5upLxXNұ%>N @ǂQ1gTJ=e|YV"D:)PB}/2@U!u$Bm/PNR:1P'Hb Mt QqHd+,7$`-dUήٹ>׼C1dK},2Q6IAГ[ϊ53`Zz%xV'~2NǸ;ہْsہpFڻ$Lʸa옘zkQ ާ8 *QudБb/rV|{]&9t_nk @np=x@#Yhxکtop#תc0;p!9c[$Wxkk`ÇTi^N8zkMRӖ֥l†rKG`ָe+ H"HfFx-t+pj!LIwMm![A3Bh֔>ge 0;Uj9]۪g',3N. ,/ߠ,2Fw@,. bM!X 9:y؁%HdQ%֌sU%q//FQPRJ[OȂHQr7;X:aru%,F"%_[VFE]hMyI""Qm -XS K+ t-[y:SL9Qzv[Gi חЌ #1ImkjYM_rӸSv $#*+cd|򾲇[ʪsfڲ78 XsާAit9f^dp%Sjyᴀ2M+6Yؕ)Q4:3pspO*DJYEK͇#RU}7xVw{wȦ7 =϶}\g==uܼBT{ջV[?zM10#7nv V^$\.7R  ]2GQ|i"=@(((}dOO#T(#䁎#ΊszGE#~OxG!GDv#FYP5H Y %5Wʐ-=e9415YQ412PzCuNnv^>{JXJMUu #ɓW_#m5wt9.lI|_FAd4g,;\:1oo]W yrġ1OC@JPqe4<B:;sE|ʹ\wv-UbkDb2Yt\㊀#BD(&xzM1 (k_zW-z}~[- 6iK]hWVi7ۻ ;Ѯ4tTW"v)4s%eX.p( #%ҋdIx\#I6m8O![Y4Xi0`tn ɅYLAݳ`"Op/# 8f)"#t6ջ2 ##/-k)j~q?6<2Ӵsڍ2gQ\ԯTXJʟSWHU aQȻ/w=+< K4/WXΦݫ%y <: 'jzJ<_\>6l>sjg}W!p@s9( ̝FIT0O7.1?X RHkUʠ^ƍ dCzSݹSѲCJ{mwZ:AVuToK/ɬCe['xj`Ÿ1ryy(J.tYAZ8r.M"[L4-*ka6_*BQ-\.<13N^#f|?+GP!,6s@<|?_@G:xig祛Fn@!ח9Ǵ[2h1Y_a7rM}{#7EWֱe| jbgC=>GQp]}D "+ d9ʺ)"΢Yچ|-[- de;oc.XgwD0p s$$[aj{w&)lK 2Dp>v'>+q{;!zRps1WOrZ!ޮOrG/:fp_, 8%VOS_T11S_,PC _}U&Ke >^ b\J5G<R\\1`TP#8<%QN/;2%$rlo7Mu\,wT!@cegޤ0[ j%(1R^\$YIhј+ْ-_=yN@uw$rd|yXp ߀5}=7vzI[ڱb6}OH" EQ0N9;;k~pgwʥaE[K.a^+>Q6uxSβBl*qje^-q Gf#y6?=֠nWr:|1o}yB"@[}\G ֗Cԕ+jkc2Ao;y=uw(_Wojȁcqk )EXʍYQ{e>I#B`1 b,W]EIڐg4\- dhrt%1dz̲c>)n$Vy 2!;Xjs~xc>q e%:73J'}sP{q9[89Qݱ8q:dp<=%rbq?(tIux?1CNgrHP*3K%VUGSd=՜_yj㻺>1+G12-5U Z /XyBSX]{ّ7 ӕl[fLnoz-Y7}5'APMӖ]IzΙn]OOiynr/a|PP JKQYR:d_y! հPG!I5LZs`X:@+L\Loӱ9|W>'X.g>/_>)T?|w'3Q~'?//ݟ1*o8]?>#|`<_?Do˼7/| .]\G}Khe>|[ ;dP׽W^WHܖ:(GnԟWup1~>q=.I1*K֊TewkӍ,X3lɞd&>)f=(&Kvє_Ĩ]bN\M'#2O4$6F\ :R8YSpI"*8,L K wV+Јj3+ ٌ71Oq%&@zbSs UUL>(PP@YjфSulMϻHRYMzDd 9O^_Am{Gڎ6),[mܚrk~ ? r_fc :(SɈCx'ʕ8XF|]N'8{u#fQsmTITxΤweZ6m ٱoS *+$_!4\@.{O_?'eOuw/>3)}Ç?+pzr[ٟ?/}Ww.ٰq|ds`>dqOΞdU]Mx@zAM۽9p0h#ㆷ*O=;~t1HJFR<Rag [u,k"YlIzRq*)[~GÈ&[Cnߤ2.^;q3w$`btO[O f+()GwǞz;ZS- nP2-`YyGcS#9Eq`>?GcwK$ywѢb|+ \fFP"wݧ,\Ii0J6JOSXI#0^>44"Ǥ"Zp9I..0wl6 ddO M+8Cud6%|/]cp no#krݗz`f#4rdz'@ zw D?BEE9)K_-&O(k (y܈Q-|d P^lͽ+uOO1˿U~9W<3y~嫛y_ ?ch:׾/}W;7tc5B_ֺ݊[_+j>8nRg#5'M7VWn7#vOaJGBH9ұr(qCiS+([2`K2YE@YTiX3O)XI'YjAp-&&|ɜ)"|fv%q1g1{jH8Ԃy}IPy`|#K_1[EDWOKEč!sB9GDq@u%\V8ky˷K,̩c$'s"5JjL!uZ hJr<{MM}%Q}RSv**qO5߳&XⓌ(\{YVV2u Dvu}17ni̖,ݳE`簷)]/]/}zrR#,kZ""9 7Xuiwb;GUWW[ֹMb1DT#EYce8H*u;S6*u]WUYZޔʾ'??gmro|359ʼGn+ɛXhv48d;F|@,jn>!bx@ ٗyl]in uΔcVA!#I>ILn\R.nb(zgb8 `f (b1,LTfDi Z0 O SeDY3ey^ 3 ^%RuɄ"NqZN1Y ޝ0fSG$DDJqnrgس\ ˂.Aͳ< }?Ư?W_y_ܯGov~7>t2a+PH*-aT IDATIpyr{M;~\2%ηlڷ/Fz{:{C=6%}gMuN-[$Y23G^274V7S̋J1Y$s$1 fHVerTa笒◃%9mC9Ȼ町Dt G/8v*T.pB\DΙGr DZ9iPY>8}7N;L)!r GrWԕhTAt+GA(( )zf$ kDjP.&QI)R #X@Bh2RrݠW6 ߐص73EHMdh)k#ɵo Pٸ8t+]ji \Cɖ=| ާ vv-&ʪ8>>FU)k4ĠŘj;(C( |͊A\Y(|9s1R .ƸUӓ{5D>K?/`3?S?'~m+[OyQ9x]a;;ugLrr`aXw@,۞`#㆝֬dUqα_BmRЄE!Xc[ iƛ^g[9fZy'1$Sֻdͱ4#T#~6;ë޶>(@#"Mp8UD1KUGΙ/ \r\zY#&;݈Tԣ/,sFL`Q? Rٹ(@v//3 կq|I'W]$05㬚S]=@HE$$7*1ъRyJL\5&+6KPM 8jΪ53eCH-.ńO}) MsZԷҺDDVg5|g/lНaim/pտ>U7 ^ wD?Ͼr_W:\\O~w=֥S\.991POD9rv\vRJ qP_zz5čle_]UwZ4L vho w;uVYQYd"+[|[zH-x"x-/-e<x憎g4 oU3Зѕ]m5NADST4Fb17AV?)rl+OŨ]rlU!1.f PؙEjH"RId)9Vr  .ńs'I_sy+y+m-/?.)Frqs/s﻾ٯNJ *S3zJN=J,(B ,<$".: h.Q4{L%'?,/Hɗw\9Ζ5,~lI5Sy$,"aBXFbĥh1@ b%#1$j AX0Y=S "5͹C5 xK":J3s!jQ$]%YV5 ɍSd]DB ـ$W]5/N50EExxs=\iyc䮾gۦ޴ʸs:꜂v=׷w1Wzќ?x[#(﴾m}&&}lk~V DڃE#$7DzܸXr)q.H >uO[}8ms4lbu0) Xv7nBqn`;hwr[/ud8lrWa.[A-Ứۊ֘lFp4:5{L]ϩC-X-uwg$l[au>IrPF9/-1gz{;Ր\DMN1bF%oh{;weuMӦ{4%= r<`pބ(:5NX5h@$XWS_?N㒠vXRk &ڬ'FLez!(MFzvuQF1=Dg0wD@ { ^4[,if 0őCAdy4ޭAM ;BlI^9k hYvk3`ט4v kkgSώgyW꾱 k~ #$pk_zhI;.CRTx`pCĮ,lJdUE&Қ ^x[zN5hξ72MhYq=][lYzx׊%BcC}V7TcL1إ!hzk!*JWjj鈮rHfTɊwf4IWvU szsK+eg$ 7n4:JL'8$H;HyVW,8xdiÔjvV$uDHFqkyPުy^ jxQ-x.Q(?ҿD@*xLWVnkɡ1Q'x7]b`Q!}7Myƚ(Ʌ6cFM;W}5k74:۟6V5:S{I(:]XϮnm]ez=O()o}'vfAX gCU":99iSN- \| VsxRbcJ0DbĨC-v/@ >2[r[QݠiWՒ@~E<[\gTC2d.Ѻ$VK/tMU4 FUPլtn {_7Ka$f=S[>MGԁVɥ6;ǚ~ۥ( Jm9ML4 o$0qZ,Rؘlz4*mʵ}ߚ(wH+M# ۚ6{bh%9Ct:Y."UBkD jYbt)>+UKޔN$ Qւ)vN./"WٸJ>Ct=޷UZVoA| 2%}~ wM, 7 lt[ Pn5lM;9fcgYL'U.-4c:$Pd5scg$͹X5!̝P4م$("heu:SD-{9/VπKhy9s!t(IWP-Ղ.:#,!xBj^'H!gC7ńW5G?~yᓧ%AOs>KB B=|`t[YMXɒ?|9N咸 *d@QQh Z$9ඒ3WB"&QJ7RPMXG1߸Xb0h xp i, e4[*Ue4jgAÄz=5VN#wȲGDlvvMW*g ۙwGy=zis}ʱ; āKTVdj^>aT8[ jdE=hĨ,quuhrQ=$7Qqr{ |myO!H)y=U`irK$ǀsQyn^wBW=ܨ,PI)m-,1rH& n/WD56]ZnjKDҦ$ Yfd$s1ɧjZ蜹ert'9|&@:W'!nѥgGݩ)>T)?; kx|_Rv,ˆV,|t|Wz(y|<"18p2F#TSyvr(ܛ7kt8GbhD[64IguVMs( ɂۙ48u]jRR #DHA2AԂ[H 0z1͐+OlTwjk/;vO VkӤµ >:WET:=quwt8V;DT9@8ڷV$VXjŹHWv;bY\֭cw7MH1QMrnp+.nY{1:TxGPs3lRs@Qz@n[d',)<|l_DY5@mgR펆O= E< 9*2)hيa)LA׬K"HZOwhJ~CZ,`Cu W)gq"'m(0O):~ǔZx/yvtgc #wu zI_Q9Ōad⅁2 ~;B*NJ5c4LFTEzD|sQ#Q&&Uoq!7%&YMH\;IΗmq$oU@\ u=CwTs0pXppkVrM3&֩6Ruiaڵk.hM2n/lBփ5Cgzvf3Ѩ͗O! !ؿbc{Ź %UUճEӆNv(ʹz!Zݦ{urkw?UM;eM7B[@>5Þ ֋}ܮ2cf$B]ؒ6JE&0@'4ȕH_R:=YDbǔOhQdFmaRLiOc+R&B@&mbec D*4R59/8.,c"UqS1rZ/)c7[3vOђB8.ȝmVs::N \Vv}2fo-itJXz>_+ˠ\%:!)[Ln_ܢ;jH4`. 5"iT(Ң9f-c3p⍛VH~g)VA$s؄GQdjXrԗSL]3oWJWwm*mhZ6f*Lmژ&v)B]sF[:H~ HW+24÷Sr5w=UҿڵSnOU Cncԯ=83->`'uW]krCҮԳ>k޿e=ul\imD2B5K:8@B0`I)#8a6JiAQR gXSI1L' 8:n'JE:yEpe CBH%LiQ <w(~ⴠ?Ob蘻g'3k\qBɻܫ|p1|x'JA阹Ԝ=)KX+Gcst/,&.ãKz5mjD9c*'YZ r1>]Q!KXgΡ;> +H UّnvCt"$FJusr*f̖&ӗb\Ch?9VF\v3cy ΢e5\|ׇ`׵dNjzkѫ=[2u,׿;ׯy' n@뚳s e9qyj{eUU|Nf jw̷9n0.e -7lglΝ>rT :n8^׳W x0xPzo ۅ6w4OiR#8qDѯ\ǘ+5/mi 2G\7&نf@OҹPI)S0 `@k @3Ж<8fQO)1bL֡9-/޴0嘒sdL]]r"W{˒yP|]p\< )RxE8Xr(c83;B)@sRpNQCP{^gzt23*Ѭ=6壦pgx]2dp@ -`y4@B@XskS@12IL~k3PM}sg쭃ESFtAHy`+ۡȖoםmr[7!ۍ1Ono>=qRG SǺ=Tb{o" ԶnUn(;rЧ ~B;tCqkWCw7Iw]cw6Fjl|S܅Ůڹ~te2vm}d_bql6Ԙn{T0XR@U-xCƥ;xs$9pא9o̖SpȖ=D D#%jCPZ螙V@ˀٻ%7^;4 vnX`z`FWa]F-l[!{eٗ::=̇vN9@gN~emᅱg[Ӱ3 IDAT#.YٗaOUSO@\ȱF:DG]`iXҞA Õ=Y; Qך\ %7ȭ7@ZVpпൾn2|{WEvMQ?]wrCVgڼe^KAف&1 $YHr73e$>%Y\y9e3 i2[+tV/[4C7D̒'NI())o,H7Gc@Kߡ}cϲW\nNUOx<"r-0k\G,f-PJ,F eeu|1¿*,jqY|@-J@8_1eq0N %]BѺJ\)ds!.F#И:J7oRGliUQsgoŠm:B\=/ @dP{^sleO]VlLm1IJlEASW>5q3Ɇ{NŁڜQ?qaoZwu %dĽeޟ ڜ1Hnƿ==.=T`te! PH:x <0~; EO=;^X5rXX6 Tv Nͳ/S7.Zl#dEs|D. Ӽ7ʪ\/ɕ@V)MCC].HU2OT[!T^f%jQO5,KO] 3Ggą5[ J #4F$(-Gc jD'hvE28Dʴ`%]"&lƩV-S6i@ߘ{AwGln&朝a:!HeFfU,\} PxIM"9z{}[lU؇걾pe|ýOA\N9.vuHl'mo{3ZWAw vTv+ր\< ¢rr<~=^9k NÅf`Yy(42Z;v?k?ZLq[d"F..G2=8c2-\ ˤ6.[Ha LwX鲬7;#qͮr&/Jk"$ ,C*GJ|s,_c}|'\= L,Nަp>ܱ_A%Pg]s5|F,f,kΨFweGu]U:JꖐԒa09ӛ3N 8 ؞g?~g { NIH -oٻcUs=ism Z՟眽V]U{j%v\EgNgy.am$yqtWc+m{oEABBEQ:q!eh,8dQ zFl.6ܖ൰b$ad5J2D `= %!+i^'qd΂k3ƥ$. Ƹu9 iYwkݕtrԯ }HKFZߞ7e7XdB:$}36uI&W^ȴi 5[Oθ RAH@FN,7=ؙ.WNQf 2`vZSшͤ36F Y'#Kp{ =j?(툢GKv;Eajq6 "#!Hq$ $sJ!}SAr"s $gvO0S%D1)\!tstnnM!5uÉpkz/'0.ɰHm\ _fUCZ=G)ÙF\I S8޽]tV):E0)b( E GhpQRР`+ )pj!R|@USgx'o 4jN"H** E{4 X4oSwR,:!9/DqR;Hļ_$DXvoo~kx[eCYcuQMFMa Zt[Ǵi˞aq/-}B{5 ;m:6u`SN/i϶ͲmUR/jԠYٕ6~O'JꃩQiLc䢚Hc`ms)8@z$10QMTt1^X=Gɾ ={50$"3{1ͳb{@[c#4ڙH[rɓi!TMcm eToC Ӟ8'5Zj(s$^Q6dڮҭ*%Fҟ@7TT\1 ~γ1F#p&߀\p:d5`@^ )D/bi/0h#cvSVNnכYJ\y YDuK\ nNEp.J9LF`7N#O!&C5V s'b=! QtcH$h"DGB*%X[47IZyBB+y7PB-' "i[Pz4X<>sZb'FϢ"q\o8( EG}%}aLS8s1J7҉?Is@+h [,>Ybm[CݐnD'r8Ax|n^g3/#8Qń*iMg$x[1 F>64v{h*xqzҩ0Jܰ \aYӆ\:&3S̩:cw׍eS= U;vGSNWzMz2</ȸ.ShpCuhHXPJQz 1#\4%T%AZiݮX>`'ҋB $@^i)$~Axx8Q3"jdU{J~Z]I h A1@bJP\J+yW^W(sn B(]Av''444j? pc$d\IHqD&I\QJ"x$Ru3&Y3H{U(C؁DZ7>}߇ndߚfь`w(B\gL:#Aܶr}Ѿ_Y>Tgˁ܄rInzS-Z((2HRY,;K"W-mr}N(Z]k̴~b70bZL{RcVFM?$x%Е<9"ҳ;IZ,9" u㡸2.231'&>9zXm'5Z:ԧXq 1Dz1I$&+\~#j׼+K^b?:QJEphǖ Pya-MAP(TI} P8 M5zD͙Wy'j9I5"/xsD9KY4:[/=pl-h]sH[DK_}[\\c˱Վ8[5WgpHbܞlY mD Ǹ ʝ>lVN!zZePtxKR/ٚHEgJiD@JTGӏʔ!aq|bMݯ!ܾFF̛"q@]VzLqۈtn}I. hÀs{Dh_'vZVi4gl24D{=Mm$Y-W/oZ>s\[ 'yB醁s/91)Y NA) G(y0WQ2l$@F jhOrϯjvof*m\{"w1&&UCcPx-$KJ;5kl % pEҘkFE&qF*PFRmm&0 oqnOzdUaۮ4rM5{EOxFo:\]>vC&A5`MνҺ:*[ZuMv/^To8DjL3h˘GOXBe:cBb\Q/>^_2b=,OiYUBeR$L]$(1!\s*sBj܉,9 ;Z .ZQɬbX'ӓ[c{&/j2Iɱ˜Te4-qD-ݗD{AKWq E(Ps?5uH\TR8UR>S9{@FmZwWN]i2+G_4.s.y7O2SPtúcZJM`-Q}{$}Y=1{U>eL2`zQú]>4qN>rC }6l.>&i)AVxvrX7m}2Z@(A~LuCn 8~%\;HYr2e$Ѥ3 c/f|7f6%8!;%`n1@b8T8 dWNK"5# Hd=>ءdO%$פ3)Fɟ| Pד9K c$ѨN^(!`IіLEwF&KLDbG[׃#RhnŜhb6y@)b}G5>0ר)( ItBJ߂Q!b%6i^ -q )Bj˴/3BjH! @J7VwOT wq;,)Ӹh"D933+>SMlw6Å}ә ) ̧ȘS1]/^ч,ҬrLjVξL5͑lWq֗JThrC7r:<\$ՆJ6B-86s|QmhH#&6$/8z6P"z>$1I1ČQOjBF5St b" E]n39u",f9(,C6 2ԀW yj&(h[f\HxsJi3@x;s!:7$Q*䂁4q 0ૹ]רZ>MU- sjjAJAA Ś " jt=f4S k4(sLJc`! 0@m'S!ڷI#|5+\)j) y*ɓ%$=$z8\VJ=cPT98R6uyjoDls?[ O2N7r~l[jMg.Sǎqjqq˛i~N5<4}Lrj?R};Ems-؆> =Bןs(:]PcxqiK\ۖ58VVVΤ},Jm4 jCEatdb^d=J`L#ڏbx"=LkG!%1箤Yz,\yd ޡ @h2ZQH\!t!BI"R\)<̣^wh;h:Hqbͅ`x`R"]`04]RĜh!h蚍J@so\QRdYA"/8EqVt/Qb$SENtAO}2ITp]zjHޓDęc^oNs&.-AQ=lp!Gb"Fg㢑2}sTh?@r<2~ NAHG÷_t8gR >ufk gÛG?yT( E@ I$&Ew6e]MXL7[ˁ[ ) k7^p4wjTbd47P的&ex),ha!-)h #/r @r#u1~=UM`X鐛/{n\CNlNç 4eMGfVy,nu5lRŷcǶ)ە<Ǝj1mslܖ1 ْv|"8M[W8>DiN:Rs ۼTqY]*/.ݬ3[ʃiA>J\+%D(эNr#aØ(= }c|?=WmNFۼXIqu̡ 4aQBb$"1s Ѧ-JP$93Q ĸrbtih>)$I^q>I{  ot)fN8- Z\NQ|'4  8 08$hxBȾKvX̺'Y&ullGfZv HfXe\XU$WC -jXZBoX"rrKPE<Z@jA.gK Q)(,EC t wAoxKPl>ǜ>QHv±HXOw"́?e&9q)g6W=-.hYq$&aכ* $jE%t'!d4R{W!2u44ՠL<3<֧Ӂmʤ>^8a6% rd2a^WHu 7}}[.E[rXPxX}uSyQ$%TΘqYVM&5CTp2ApE`"gCH̕c!>s"bAM2)IbSE̴a\hstӎf $+`"d !GO`D0AYTgG8 V|> IDATzTY'O矅N˔\s{{k@wK^] p2t ٣% wG"6.ƫ/&6*ftM-PwR?s@6^)Ap~])%6sIEF#\^82N5:陜[cC2"4t)u&ߩ6 4eȫ}<~eiH|$8# nX:fdꋃI7Z ۖ++L|n unr=>#O j/rc1FgjʍGr{Ծr{73Tܳg]d3! =AGoG8HcO`>C\Ң+2 v( -Ř3J֐p1X%"p .3(]Kf* 6|œ8SOT  `Va`)5=a rnعJP4l)(dq9҄P}Q2DrB\4 9:0?\<6NᏬ(]I# ͠nVnFN}#I+wVVA TY 6PN.!'ҳ=tlH 1M,`(QTI,X:*ѠMM)CYo1U1r[8Bd=nBԬڄM=O K*׀)Cwp(MJ. H*"B J{F @kؽ$ ˛V.1wk]tP_^,~ ! htL wȎ ͢Y:(!wStaԣx N!Ц'dаs)DQTo+ 1зRtrEa4FOr\kQy!GC@ ;Rd5JdMbAc X9<;<]|uInKHN ea+G)qi'i<0y&Eo {%)rn\Y`n0J_ò^RBWٿ =<M}xK'#rLSOKHƥ [$7>O9gkx(nn{gM6{hM Xmiک5^%vXot+e8^q{HS䍙FgؚblӘGQL|^h}k 99 Ko+%9ўH ~R0J6O3Mwrߒacڋw6lqM< n"$Tic8HlZokC*A"Y6D"B<|S]k}CrÍw~;ˉ 5)bJ1 rp^8>62׀rde Y;]1$ l q8 )whG(Ă;I GEYhq]E}o=".D-Qy=za4o=%Sp,SvcކZ Fލ;b<NXN٬! fimP4DWM88<.@q8SlR7հnDcs &*V+W.h7tyL\V)@L i 6Zmo8N䗡?Jl=jTab_uʪ^h4xfc{nC84T4tе֦qM7#zUoߪzdZ<}&~^UNTi:#T.Wڇze-<8δ)p*^݃tGGL].yĊGޜ*{䨍_;E )PwK3-FH5'CS 9'e|9-}#d8$x}ycpY/n~.MkH4s5@Z9.E ,Jb,C F>d hG >FktF>.d5PAZ6bnpsmkC 2TC3γv9|/ڱ y syZh{ڰc]h|ff,ƥ甑IIdQo:76 M3,D#΁4m>Iql$KoϖmW&Oodϫ _SG/ #tPk9JT;aRƲ"۞G\Jg$nYtcssbP>-Nk5fJ}\gs ^?U^ w|G|^5z]0kHox o_-iWܐcc@\0@ZcU^95ߢa KBj~_xTtj^9FTZ4c1k[yu 53=qXG1eD x %!\:@&Qc)FHCnT 0<"Mfœ(3xgMЂ֝]AʼnC[ ȓ. "y mL5,b!ԾcybNzhtPib鉞!ʋ.j>y rd/N!g,qR(P&ؽ s!I sM9^w7r¼IS5:8< ;qDWކ;h)::UP=Cf /{ן@]q`NlbE'$cI 8Dk+M~0KMgs2?@qse=1r =S 6Pviӯj| }TdLh}32bS'3 >O x9>{nE{o;נiiMhaW.$>nyO_=dee?%ez 7ȴOW__^qO'c?o4-HC;Q\U,1#8Oot: W/*Q$F7v'W EX3n(6m]W&%ݡIƨTc1wU`༤ס9WTPb㳶p@/xw`M4"*P8μTF&M-fYop@@r4dG޹=;aqk:++"έP8c܃(x˸c foP 5(,` V-ar: t8x;v JH`DE-928E̒?8tp"nE)7U$M5p{E4@&Q4ٯڤC.sIڈ7PTM̗2F _7:bN\cK~U%[jeÍ1{ضe ঠ;,+}j5puʇF"ڛ6&Gg|#zeX ?g`ٜpό؄8 ; j?V-K_2s,t:'r{[>኿ ]6r=Kx/yIh??OnT2M~ڏ7۾|O|߾=O'\z|عcGٖw5qu+v,=Kxן/~|+^org'>c:1ej@rk=d(Q!^jM)gZNr$7ʫSݘ4  q19<fqfi"2vc/)iQa6H" d$1:YCZ I6H, ~'v q8A]D[3VT]M$hD[lHci!,rx= r0rȱcKpLx ]{9kj𻠱 usH Z3o ?4vf &H h"4mdafۀ,*6{8fQV^ LEw>)!puøCG/~rqş i!n6>fvC,ИE\ H~yg'Ls1>|KK<=rmE /{y%𑫯f~nwoy v뷇nۼo_o? w:LŻ8=oWy޳]O>5?C77{c>1koa]7k;g/{9}y{ 2!W_J~u?j}hyןK.÷>o_J~~oii x)\ "}YkiEօYպV5h*R#ߛv:p~nUVe#*Nn*Sz}+8GZqB%򪫹*8Lb3E\g" n&'FY\nZ#kG8sɶ엜DXG8qs;9iCfق[HkjYa 5,%H{{ 9t7 pŽ&⏞Dې/5qlx|qsq\%Cuh#s-0Fe|=K;N[ K\8fAfѨJ36kǹLZmܐ1d|~V=<8Hm# oڷ$3]Ba)د "[*Lg:ƴYot'4[y链ËrvGyiiƔ9u S*sۈ Au{i/`6Uwl}j{ջn\L0[NK+7Ŏ#,Mp_x/y2*}R~w~w-K_".}7_şi`nn<ѽ _r,pYg Ç38|FsﷶO2 /[kyݫ/绾x{k_|7}3{vf=FQ<_I Wt@nL%)Uo;V!FMhV/J ~? ^әg58x7"HG*ip̓@՛~W>=[:v8o&{č7 wmPS;bm_witRX:u ^˹E|׷~?k'g֗8oyܻ|׷|{?-ZSL-pCSu) Wme恜PGTiȭUlD\vbSIFB*㾚菱]DH遲0)fMaIzActXiJi܍/k)b;2J82oPƫXNbHw.G%C%Gױf-ĭ Y3z4>b)=CO/vCp$؊@30e;A,@0 pkYV(k7NvТRsBcqJ}E =/ҴppT@ikx4D IDAT׿Fصs8y$N?婜\}ݵ,&f3,,s'>U'׽,xK^BQVcrT}c'p1V :0Q=P!JQ#DyI z4|'j5@X! q,9#nZ6$ITP2)T1мj9R:6$U0p5rW< 3zym;b,S#+ѭrq'm<# nl:}@a6t#W_ͥy,ڧ?9;~X/翿,O$8[?1~~_[wr˭׽M/ y ǸK]Xזk˧>/z/}ыX]]||5WO^/Gx=?ǯr;K~w\??5Srʎj二=kiTQDz۱LS 13 `V)W^6^n m2!q썒lffA/gK%'J(m B)Ǿpb@ wTVKR4ѹyٲ> 3{ 0"+*B0-pj w ,>`E]|х н }p|!R.9w.FG 5t{I# Q0~'rt(,`\^<`dyg< i_Mom}Ӥ)OQG3SW{Ӿn>q4̧WRnN}|+n oyV;G_o55gწlv8veԬcDBkrS~ete*eNh"y[oWT*_j-GEo:IӪ7f8*3i/.۩A&W'$o޼ Q!zD> cFh@~3PeG][j@  X;52:1IDGjN8y a kECL,= kg({95>?y@h N-!a38 zre٤Jq=j9;*D`%zГGqvQ-mySK)Ti(%g+z,#E4[DN]BHb1v9rQ|XC\>x`XդVG J Pb;sKJIFic=tHHl$2+L~m,WakY6V[ b/uoQ)k/ kZ8ycklrͧdM|֠@hxi6qCj jda95RMKWci* @aX Q3m X=;6UmU'CM"s4۫gREԋj5jϑƪ9,7c4;<`?D ȣ=/) 47')Qe.4Ib֣tDg D8.zt'ՁC&?9$ >:k5n $56wvBThB1g "+8q ,B1.Jh"@{fs؅ٰ\ZPYױG = a cSwr|վ$:.OyS т@ c'$Y7QW,'ڻh\tGS9N!(`Z4ba$r xp φ;v]J/YDU1PttP$4!'PS*$ntyeE23Kgio@P] 7ŝce#Vlݭ<8x{> R {xGm3Ւ\ۊoݼ;mGマi(g*}vDC)pݣtW;X;6-rLOJEՏ6^dTnہ짻l\j'3uqrMh* "}fuW%jDE*GXfjL {C.ymH Nk.<@HRPH `qV*51A]5s ͤrq'cY>tYB54b !_wWq8lti9L5AWeaSښpk7}+UT0'Ρ>CEHw T2'qE ]̽IX[}7IVR R k]2+qjRy)vՇ! 'nxܣ叁g[V ˣd,/JK^mnl^ݛ'3o9'e#Q1e&D : f&jb W:1%YD9TrLs[=6WjP>f3Rf f99d|4nR8Ʀ Se/L6FڿnpW5Ξx}'Wq2;K{% Ӱ>M)r̨ra 䘾j|CJ~^,_bmTz,ȱw@c'jbwb)POwZC|Y%-4Hhn:f m]]qHT4:8|f=Bl#m(.]E#`gQ23oۏs?KOi?#l^>JNYA>2f,z'*"V54BƿºnϤ=Xڸ;>G#mf3E z4&$Q{@&7bR.w欤[HӢ14]Hye6\]2X7G)i/1A,wݑ"!ڀ&Ҹ<< V@ѕcɑɭ䰐l#֡ȥh^<[:_C,+518y3:hy%L=CE\~i9XLk5w;[ۀk~A?z˸ vh7=8TFBm/.WFܫb >p*z (0zGg㛇!p]Q{Dy X.+갘tNјL!t;v/O$'JEg CL<,dVd:N1+CgȨvQwZWpj2ڛm*lgv,n@zAb =| )RB^B!t@'7m[hwt:D'xiNy}Vax2=Uy,RSIsfS4mr+|a:`sģ,A͑Im3μ&dc@Uqe@!3^Lލ&Ligf$I]t ICԤI4fVz,b(vws8-]o["eP9s:Cm4^m%'t{ i|4 D[8AEwpMsu+譧P EТ I7OQl_E[|%%@I\?KܾS׆ 8T t}A])W*mPM!$mշ;zL F^G 8r]V|d"Ha@/_@WbDW.\wqMnxF3MJa^4INS}rd~i^)ubplаs9 s,Kn?qfO?޿i J/atCۏ9fb1GqH=Q".xD3Gw28QSt t54]9N+7k7MQ%t =oٛAHTM晦'۞wyFi?f US+{FgTR%I&kIܩrY>./S\CpRCY`Z ٯST惿u{ޏ2>g? ^qa>3OW(7=U^%/wDpLo_f#&N(o$J+S1QG7,;M|n}.ӗ=áѐBWypzi_> "E JMʼn+߸b (JiSo⼅B@/9Oe\Ã9Kaw$jV,pq֟͛> ~1i]H sH tG{\">܆4G\ )@K&׉QИ@!Ւ4 !Iu4Ш8DWч^Dm(>&5gW.Jin\"<@WA1ކ/P\:zTbiM+\i飗Ǥ>4VL%,6E܃_e~ǡh2 ؂lhM2 (O2 MK4g.x,[9#ITS2KC՘EqQ^+ wFTW ΗMC z<zi7?I}99jdQg=Ne1՞gﲞ r#/sܹ}/}4m9ߐSL7uF42N*{Ʊ."`u' V'ճBc3x6VwM1vE7VphЀVƍZYeY,6ʗҫ:J?(  $4buo#ňAqA:mUxd4 pX4 EpNp0͟6pE,#QN񹇵YU:W($8:GLP-rY<5Qg"AauwD΅ LE"IK"X?8UG9ܕycKͷ-xHׅy!9IkΕaS]]yN 3!*Yrw2z7q>fr̶̲á)T< 0ASXV =7čA7&nj: [澹#y'w,L ] IDATJ+yy/-w (A#q**Ї0XY1}3 `HMِ} |2܇q˻&|p+tD٣d4_wIK8uU9h}4؆鸶fq\jqP$NNiwgirD DÌh,sGӚEGt=L<V)VЂw{<ž1L4Z脑4fbOv̚2Fi gl Wyp$-ڋ.(tÃ9oDM{3ТXG>?"#jE?~k'j_o:GěF7󶷼F~W? g>>/7!uEJ{ӱc+e/h}#}%/iV^gxGBN*DS}kH1ΰ ;o4UjY&5JpbcK{2 ˦‘3ksaȠ2Rbiy- D\j"t%>`).t ;GG&$D3spByO,y+cȑY9ͫOW9['8e Iڙ tVak-vuH\\'6W;q1pμQ#J vK2PcMѳȹH3G;9.EĘ4oU'KJ 81vs&n6ǐ\m /meNlbnuYO5PeH!z2š5 D sOmq3[EyJ.Ba Z@hO*8{n&=朶fj?1ϕk9-,il*-çRy0 ̍&ԧc1Pˇ: {w\&q W>{Ͽϼfw"/"_r)?GE5Ԃ-'N?y{y_#~~;w|(BM]=i9woSګkk/geyiN?gWÇٙ~ȯ"? ח| 7Cy@CY9t#-fgrq4TȐ<-Jw?,zm}V Nv[dZ.9O VzkKE3Kj/P pR2DXǤ3\ZiPWG&-_;n޴`.#f9J3F b@!&Y *92YB|ef7{ }4<9:A_=p/;ZG\ mKu\!ƩED24dJ6@wP6lm]${* hAti&6;nGt S..d@f G FMmbl}ˉkB_E?+MLYA] ;o\40{s?m#]@4$58A)h*Mo;OmF\ Vy(JQ ' nA۩AzxAqŗ+}҈= "m b?k{aޱC/t,Cf5aL7,{>= Խfk5^uOB̻¹ϰvVp86x CZɌ҈FY_LdWU<$< /}?`yyyHF>ui*O+ׄh* y!'(tJ"u,=D(>I^:\ -"n5VdLF0-]|bA 6@[+fǼPvH݃cFla4rGׁ-3yO4O{Gb{ecWfX;;Bu ))촑Ć;#v \6!H ZDZI'ا# xc Wv-VQ @"ռPs0j7w5yL;y2X\@^d^RPh_k ƴ >0!WYӦ<(47Zr~Β{~=@Lb?I &^/ݐ cmw|֗K݆M_]~;wy4}3|?G|2O?,/]g~+EWx߯ 9[^ =D6d_Z\Dj@nL6urG}S'Q@KϘc!]0=\w|mdd~r'U)s\ӔR y(Wɑ WO ,x,D:}"Μi3Rj 2 v'Ns`A"G,l=tc 9;)ϡW7{3sQ8kmb4Z›yKC͡ __&}oy{y>F̳tɩ5M.*)-b+AJtd s6Dur67KgiX[}L i x;ɟ<V"<紫;Ş Dqx7']7\7]t"xGS{ظ5m_J_c^7=57/liɾ5I]kUg3>X1{ `.Ï/{L.CײلL2GVZM57ݬqGO7yzvBt{G&^b8U*gQ f I)& !3!Bb2ԀF: Q.$pbf7+;Vȅ+!(1@,~6o>YcyzTX:v-D5/ّQ KYt-o!Z2ވyKWijsyݧ)@܈2&IۏE#_)5 fP}s dc6zgÚj' P? !; #%YmI#>IɩIpNLvcK\NϴojW˜Μ9 갸X=+o .]Ш8hԙftIXpŋ' dԼ7tИpKLj\25G"! 9H'XũLp|kcQpyu_X]p;T"QʹQKG'J6֧hH"I{R +a!(\f\8o5o"8ԜrusJGÛ6+PjB @h Ƥ4}zc{iUd83hD9i{f#=)Q{Bb+ٓ[w;pp5"ékS s^({nZ:P5ʘчgPy Yj}'4 Uz<ҫ5cS˭/1 BuFS)ffݶ7޼Jn$@^ PTjnḰKm\qN;?Dku`&!iW$D%Y 0yqd΄@j5O"Ei]ut(U4_ɁHf'ڰ5*߁kw@뱢((K6&W`&R=Q*\8HhOi~I̬@nL}gr 1I>!A JW]bR^> #q#jJg4y"%ۅ**^$݁z儶8jnNp> LwnB92t"p+DoBPB8w*Xб/G|)_pu@˴@.@hGڙ+cM %.9 0瓶NzH&{oM6^gP)HG#W[l7iC /+ "*A VoVPi|H3)FQ#*M:=<+/~|'6j瘊F셸Àn"xDC|:tcG476eR|Ԧi]oJK/G ĕ7Y%9Vħ;u@řf-6M;s8Qj x9j2_#ygP Y<|@vPb T I$ ޙu|[j_}"wp)l ZO"N=\))%̯8漣YB!d= Y, `8aN)\G{{[m,69hX#`/,b!%7r比%x/nx6 Vh},K2 hxE|uJ.7ɟRGbT 4"ki)8iFClaDڄKl!yp*Soo;/! &Te>*yb5-j4宑VUkUD ԇXljSdK:BܳOJ<}4q 8Oҥi'ԉ{tV,kۈ~3X!&G Ā:Q s!erxb%_ZLQB 3Ք ]3 L]5 J95ĘkZȣĉzj0=,S$R\]XXNYç?fc#,"\(T(_NM7'(x^L+owӧ=ϝ #NB 9ծjQ fYs?/Yex%wݻs]_sirHJ2cdvۅ~t -[^|8E|@yhpo{F/?ؠ ,">yA\ayDӽ*Jik$4f1.;/݁Q]֫_ci28!ڳ$ .2!ᐬ2 rH&qS>}_{ĕM1/f} D߃I}>ktp»>ζ_5̾>*'i*;)8`1Q?6isf\u?gL]9|V$ z"0g,8ʂĤIwD|2iN!gMq g. ^ |&frP椠ք@B19eDKеY$tB1qlix;<ǗRO5.l6#(0 ڽg`j9N8qD89ނvyEqhH%a6u" ,2#g|}$)>;v02)cs{936OijHHƀj3{$r)jCDN79ig.qer/)&H=J}2*ovR˻p hܝS P7} "Ze IDATf*uvܞ3OƼ^ýCtrT廾 =qL|x*d} eU9&d8[)hU;l@vE>IY q2=.e0.xbL.f4xaf1~Msǁ!d29j)R@Rj3ڮ)z K.BKR2FDRŋ's>yꙧQkqow,nnqF@P(!9 1L Bcq$w(5ԝm ̙)7v+[lnB9 {΋5w9j\vO0A '@L@ty_$9k1ݱ[:q%=x&_U\ %/S)| -ڐ)"]WF%rɝ~zFoHcE\ݙɭj!&G28|!z כֿW-P<  ? ,vKATM GscIՆ)c-@zMq1b^ <9[Q'/#2Ak'~d)+he)}A&L/*ŕ76Ku+\ zj׮pO xV2BĐ;A%&ƀRaet%K$A!cJ~SH=#9[[z{^:gMes=Ce7JLŕzRӶ^SF _jeHҾUR2/`2?P|i7\9q]W[1eQPp!yg쩽e 9t Z`)FTEQ1P%Ν%:W/;O,p~O}E((%$m\uu e."N9׾DŽZCxk_̼R:`\MV(Ǚ]WJ<8Ytu>GC5(DCb v:P8|;e;Gq1CfH^QvFZmGJ!- !"!_Z5żT T-M'nQ{× bbћ-wpXY;J e`HD}/4f.>- hNr]|h#_Lp%ȥb*UEiN=ǩvsHe؇VN)A4^J]WG5q@VLXPfiekܙNIShɒ)Y%3;R0K{j> ]uK5vE]_:hqn>A~m5'Feg[ɝ2)ێ<93/(FEy7Fi Oȕi]q|li\==G_NhGi*qeK4Cy uh8x8;XE$b .=7'(Zt\{Z]iz;bi^OkccJZzSeV{o5ص%NS@w_7ݠ Bgr7gyG.ט*M!BvϩwmTU)؞avɟRS7zA+|UoSѼUh*W>38mԕۋl_P5!cvf4&7/ހ8)/O4D꩸K) ɢJH=\J!̉)^RoBP[[@,CRve ~|cv-CWrж]\X,Gs);<\#spEdxѝa6 !v5"7QyÔ;^h/ F$v ĬF 0X,鞝jDcN :i;y Oцub6s`{vN$H6[$g?3Ȳn_ce)'O]晭+򱯐eBe e^wjl7 Z!Љآ9!rO MyDC57#BԤ `ss<2YFxéG{ݛ|">y-eӁ*_+GuM&R׾qPi=@MsPA*.FterT>AS8S2rñmBv4^F1yTNuؘT"޼b4Os iv̥JGţ>zkgb^u37x)¥2r5sJs#BxBc0yg|v$:ͧ$&AA+-4}ќ"x:kybVVē9@Sng[< ^i9{xuKqQL•o75k~hz)%OeʽpvcdswRԕܻVV̪n`WRq s1&C_3 >Mrf 3K],3RSe~_'pٮGkYxR=V,~tQF1LSN+q?&Z4: VߏDM.˹ 3s$edo!\ɛ.89)3RsKdNj8;~{x|y\l-o}f͹=CgySOrrZaN:r<.(/]C sM51dc;~Omp۫[N6j)͂stb+_gIV^syhv;_u%n9zZ3FԈÍEmVd|}uGC׈уH` ݐ !]o+RdEϪ(CO{v"':#2{ݛa7ߔ4́갪 6L&q ^oD 7V { sU)}_CƟoC& _a|T6R] 9jq/D̓@Xi[JXF;3&&L{w$#Rp:[eNrekN{3찺D |*g!,rWP6i6W.ms?Og7sboU+ri|ͣ.si*A3\cܫi]:ן(Ц5ƣrEm{5 LXmihDCa\ŵ-;s768|k:9뗛<呯<@g8ʋװES/ӟ ujS u!;|+N.\38Ov˹Uwg? *xS<h^lQE%'Ƃy 9 X<}7[ n: j>y 67x&ޯ)r"9NvW_\ew W'lvqZ.#ظΡS/[f{C8y'homQ;IB4@AXqʈf)koIxT=`NQH`/NT堪_ +gC?=Q2ΞZI4ۛ^q]#_>S|hU7kЖॉ6)vsQ|cJPgur%cRFun`.puh4̓kȤrL:愺,4DӪ9Y®Ò𷒀)9@]eMҼ5s9yDjvK G|ü[P>±zj;K,, W Z=w{ G,KKW`HdW_Yg쓴:HFր(!cnE|;hr(ޛvTuUyι󐛐A0 GZnv jж@}i ,M8 4 L77w]jy9xsSϽ眽VvZ>5D( sC׊1(++'Y={"ނ8<#<#v\W]lgѶl?Ɖ1^vi(Sö]6 :_cZzI:4Fc?ϖɶ9sA@ Ykc~i൉hW]&I{}㦩t+Y@1GEȔ=1 QĘaY 4)e(Kd..x7N}vݶS2ۿ۳ld;xlZPdlP8~:gXzj'k0ğH]KhwziZ(~ťlN.3Eɶ%?ZxDGѓC'c?/NNQdݵ\7=lA;`ių_[~+9qmgVBpLrJ}y}\Z)t+}qΈcu F\ܾk{ kva߁%v3'7s|.޳YȖ /Ƕo/Զn==nycf^'ǨGlcB<~ZpW3DsX6O.hAM憤(]z[4N :XMpH(coܖߧY[(9DM酕!N ,BܹTsZE:Qs"(CiL;˷.>%̘ei]i~>zjsR9RMEܒ(⻒y\jP3y8s @ 5 @BD@5x4lc :<wJ7Ft !d(Go:E6q8 ނ/}#OWOrC| nY;sz{ඃ_duCFg guQ{)+;O>éqݬO|dCN~%lPk8_ Xvh7g݋f]8Yeeyb/}k+'Ot/~q8[8xa=5rs:$-8qc3CO?~u1Savq65 M 3obx8UOzy0l/ؠɭrݬzqrYgQdO֘Zȡc|/3}UV=g&8>_A Zl>ݏSL#U'1Cty-$0aj6~Kӓ]sD7g *uLe CE @\[:uI#=%?#6G[+,3\6ѹ_upnn{1 >.Z퀣>OIڴyõt,L) d5<:]VǮ sN"EЬDELD՘\!0_|"#(T\s_z!?(&#eώQ_ETL<8x#E_/&'''ígۯKV:+Ω[H~7=|"aD3\v72Zq#6qR◹dE}ҷrd’Wض}{pD}x̾=_ƪ %O㜓IVnQF;ws#^Dy/eߒ#ӌ| 1{vy:'"w\q_|x%(xݚ+\r9;Yg2&8ɕ4w}6v1_5e{&l~2}aK,Y{**>KKcv]Gk }>[Pz~WgQVp R 25r2FMԾ4{4U_Z*5OjYdr,߷D{Rٳ>77k\9uR,I ld\,dMRuA_yJ0 3` }LCf7Y2m;YJ<ߜ୵RZY'Ac7hz =;@ڝY 59'K(*3D2 c1!PuިF[G!F&N ¸pO/./8uOcٽ ]RnfLi?nSQf1 gV^뿈4*~+|ȶ#(-/'_=?ʡSqW IDATv3F+J(8shh|>Cg4njމ+P |bU_|VveW3(f=v@Ϋo ul OVMzM\[r:u W.9W6U*L=_N\E#8b{u9Mi i*V6Å Ylv؂꠺y7o$i74?# 3_Sch&9ݻre(vTcz>DtrX1yEuN"D&COXu<¯3 P.&9lKA^}t="UTy1^< PɃCULv!!3p{3Z7ԯ VY#ӚR5k=3F0Qx\Vi*jwޣ@Lc;345m,L|8Kc VPh1މ<d.\MsٙtxRhl3ͽi Q㤳6jk~hKj]<rA>~__tJ.oc@jBi|9\$yfY/Bҡ{<کqܞ}LJ"_s&ʢ `(ʽ8ς.2}{!.C]O!c@`22Ҿe)Y>ib=#9y0 N]|@;BlJ05J'.7\&\j<6dF0Q S TM֊<-+" -j}4yaƱdqL4>}Sz->&|:CЬQ+&9KU"h&CנyTkC3_A*h's8}HǰLc<-'\HWa7<\DN"֋rֽ>V\^KE;IN47YABv\Y m6Ul,p VyBgs-7-J!sY:+ tC=T% 5ܓ+LYX %0}W4< rp  : 2"1Ӡy F))uH}H]"fvXjl:SZHIrb=a*74"3S0 4 JZBr2/>w@ҷV2~MvK`-jܐM`Ns0ZtipBpZ# 5/0 $iR Q *V4%JylA[H MR污ylSxz};̇ `ߡkoi~JJ#ٰlu07CaoxkړL-Yㆵa46BWunRMY;wP+[Q@9E2ZΑRL 9;O[L%[xVN=5 *QmvZG6+\m JSxT=hɴFZUFhܻ̎#hN5~+rCU\sM>x6/ݺzvtoLgJ7)M)}iuQtۛ^:׬\S.%b f)Ulwěj#>ܣBÝ*urT9Qy7`@]+#a LvrzLOUVh3ީBI`~!j驢ܳeF5j?z&4hPxW,h4= Z(GKvtRھY}jkmFF|fD[hE}LM$t]Gu|96v-#{S⽾8.N V}˃=rMöMKro{u';/AG!0[&446%;f)ą>Z[*sC<,򚦨-RhΞ\Iq=8$]M ulBrdE|A3Wv:͐eޚIScIVCo '/+-9#!}͞c#}XѐƭN|cgqC"x?L=AX碙ZeDzط;q !:F,xaB ]T~UU4Yo?Uz9ulܫ։R\\4**DwZۥj@f5d 0MWQ3{a 3YEYqug~qH bߥCFM3rK,bz\+3:dHK.66- Jr[sjn:Mis6a-ԌZGnM?@nPJʋtT<1=v$ҬS՜|!=2}632 J nt@HhfV=S^.t,L(]4nEA;dsx^bA4:)i1$D-Z>OM(MgN^ `GftmώucqIe.b<4"K$Bbw(/5,hG3إKZ񦙺Ӏէy)M@CQ^-*^2CK@1JE]**q @Bʑm*߹V.Ϭ$RASi89|V~ uiiqP=fSkT1Of o+PCzUx*[sv:>.تHhgON}/g-3ьt"1avhZ?T~|ÊJkL%5ո:@[zzӨ.4uKS>u4pgV%iolVd0׺G02r9;9HmE"(Bø V:1Nӂل BI?4yHb`Z)}+PG%h ZʩJYa>ȵq*8p~VpqW&S% <8K ؉Xq2q-'v,QЭU޴|nf+%dzHѹzvh*Ռ rd:Y_+׏贔ZkgӬ?p ֵHPX_Lmdykjw$_fSs3 uvtcWjGkX!y]'9&aD&7vHHfxD?: MK&ylj@AR c4,=,d\f3NQvZ[֓XJilS&gPF+w-SK4gL/Mp]/ 3ާ^.ZإojCSx6އ{{XŤeHV9Ar0̤5tmmI [?0Ա_zdELe N[r9_} n.,{(!. e\Ã✔M4y,/p 4Zk1~D'lbU" 23$EX9@Col󀸩|#]a($׊vd\D'xk:)1"EqImA, W8]1Gd e ż[P Vl$Kfx32qґIix.>U=a^t4PE;eb $@$J5 e;;u8fVx1x,j4yl2PpgShx?L4.֜o_Zo]k}z48T5&Xms c8Yy/;qBpzR^sDcyhBkےMx3`7BlM:ʮl69>ئr+]M. -B a8IL3; WibL38zTNsde,8mIE]MI2t b轰iXϹjmﰙiдq&r{ So.:6v8w9]6=ڿnad "ͩZ] dyTA@4+A="J;<=]5>݉2*A>H5^CXܶj_OwېxE V0ižT1 h@h6{%Hu#j+*cL(Qí`` 9=cE뵫 xڝ>Mne!6`и4&.1)WAɐ(a{{Ӥ'kV#~T[dLM;R<"ɈVNp!>/n`N*`MA B@|RSPE}y4k"0?yC[ $50@㙲^3Zߜ9qS2}dәҡVΰ6Holz.MqE)*q("%`s$"XܷfNCd7$%DYܟ4mI@{kߵ,9}]h?L'X̻Hj\taw TG DL'p D] N)/>ыt6SjC"Xuo:7][sj%-r%ĂFg$n^%N`lA/(xlf|s? kk_]a;|Vg^Bߜ9MPzH u g^C`Sh 2I=\sK0,-+f,䥝|&vzN՛U6C~#t2_ 7Δ;@m쳾ؠgśN)_uRs ]^lZVnXZ3d20݄:${W6= T;P4<@ šC{-OFc4۬›db IDAT(W&TщDgĻҗWԧcN>Mo'<;c=WxWpn_n\*ݔmu.熯mh.Llm&ƫ|iI(*$1'cCc ۛDjsȔrNDG&v7ɂ2L!EJWTͬ0PKhږxJ`3643-j^i}Szzfa UA@<"!F3jicS G6-Rsg #Pvou0ZcxLBńN faVV&nآ{&R6>⬌ m/ @[A4CYı) sc3Ts`ڗ%;!{<Yu.#A~pj^HM[zi?a*ԣrN-|CNOaJנV7 TEF<`J׵)i:*\5x*։Fٸ(.,|@"]fxƿBRSb1)9\d#e,,ؽo'߷c 1\', a]|Ͷ|(_{Y~xg.$Tb͘&i^ޑ9T7\{-7^ny& o>=%g?Yǯ<yyKj4~?yxcǎ\z%s|SF‘cG}ӧO"'8,3fTZR9h^\- Hǻ Ousڸϛtނ%2o"֠x$᧓5sD9XoF2>wg~q{`iľ^^]O!>ǹ $^@; TK-U +^kO}++3;ҜYN.bS666x_=>#Gu~4pe`vF({|M׾K.P=cr#_~?MEr=6d5hn-XK.m>f@ExۀwLsr\d.r=RZ^NMd UacXEcWM*5:xOMl@ mb~5ާAS5LYq#:B(boPq%>j2o>0:v0 ٧QsqhIQ bM*o1Y)cu'Z{"sqHc!>Km"\^N"YB)=V}3COUL阄ݛtfi4Y"q \J*ah7LdF# I4 !`PAsT[ VZ Vh_J_鏁@9:ͮsy/L%5]&,a&"TN^(1p7HNILFc7qz2˄e w<V98YBeDXG-Ҵp c$t25ldSs;Ƌyo}׻8z(Wx]]73gxOFOAQZλ>xʷO~}=q#'~Cg|(Ї8r(~,˸Cۻf3iK _.[n%3kylAM5"/<~nٌ+}IƦFNZߚ20Fw]yS$e5 8&|81A("Cch~ XÙ bjI=A^LU(FS3$6i2S"v_̀(m,SqFY/戣t",&VJJ "S#V@Ira(S5@i*ff׽Mz ?gq?Ntۖvd0g?gOr?~NoTmw _R^$Ʀt1~'~Kz ⳟ|j9^ʗW_OϿwo~"zGpϑ#<3|CN:ſ{3ys/q)> q..7[\;݈Zzo`S>\7ja|bbkhCtT0z3Lt1%{Y#ZiPTw'(ə|̯X02xDM }`Z wcqTR*9@M9ڨ?Vפr+yj\ :$Hb@F2q$&SAy-,dJ.`4sA[h^#C4kw%롪&:Xf`Hӧ:VڽjN_gcmԞYBкN!͟TռR2Gi̤>:ʴ0Q݁˾%U/ͣ^*kU7d9Ͻ|?| \(4N qx0ؾ/cqS^QSH8܎gum'wr;OppɜY%_S's J84lC;_mSlĈD,y׽nQ2Xz=Ꝯ7?5c[GRV^;!Yf3p8͐Lڵs'"xg3s—R ^9ғYVhE7b3SEKd|0!*v {-M\ߤ b%(! %X\tҭ,?h'K.ql1T;6nq:*ܡ(m8.l6[nMZ9E}Rkak9ej"$OgǎL |Ərwpç> "Zhz SCPd}ԫަ"b[Gٞ,?C7?DDb>~CTW"F?yW?Qfx3 smgu͍.idv}|| t쟭T2OJ@W-M5 DD+B9Ix%drYBy0c+)UK^0 T6",*Z3bxXQ3lG@vk/$y'Ex5ݧ+m $ Th9f9(!ޗhR0JD)=?r5x^\ۿʼnSj]3?K?>ާ񖷿NaE:m |7ۘ/ i~nދL(Sn^lCʫBO{jw*_hԤꢈxfNL m _ڵ" N@w4H!4uE2wB_29^zv&G KcҴR4o:iRcDJK*6 y=&8x܆V XW$oZ1kKhqΊ!o඼a9a.#[v`14uem;s4.st'M}͋4XI)3F7P,Z 0Cs8),{/O'4pbdokč, 1wP8NMIǶ1Q\Hh干|Q.܋s #4aQ sN}[qrW4T EnWռկ4(7*z,7Im@lMT C=O7̳~굊O>O/y+x{ß}̏$g#+҆f1gb(R`^_ތR'N諸6D:yvBILBd/.:H`/B:A",hu2r_8RhB~aRb aaS OE)6v$򣥠9B טS_{ aũݡ6h&v]lCcAvыv2BVw,QQe# B'bYh%N-;ORU1':ۀ2JrD3DrGGWB1}h[O 2ݛ 8 ]|#P5jƂLNB",#hi'w\ky6}hFdƴ GpL C^:AIZ4 q Wl׊(![9QC: |&Mh4M`.(g 5Bh֙ڕW0g*5˩TbÆÝuBʟU(]+;OJKj4VOeOno./T ^} &߹Vt IDAT)=le_~O"Ŷ }•G=܍ِ!{_neJk;Ş]{N_:nێ^vdεkMLW˅h@WZY24l"mP[M|ͦn #ef_N}ǣш(j|fԦTP;S̎S W[268St׳`BgK)n]du1AX߆yiB +~@e % 2d1uJև *~c}rʐqUKcIM(TMk_٦ipg-Ѽ&ӸxP$l̜x/S󦙐LG)Q^,pUe_-H(.O)׆h;])3݋VzۖmZ9h!_~^j;ܜ6{O10wʘp|QD'!wvlG2\p!0UWW> u#l yU[tnt~b`e-`b8cK/Dxu;ڂ> ``seZi=LhTmbz7LHgn_?xLGW?}g(=O kt _sx%>[9`hKKUYV_5GfJ* p(9E00d5$'pK#@~:D&*UO0 Y8\ji$j,#"8Q%REϨrO{)JR$@%=8)=d |Ng0UH5CP2)NGND9M Ý78E`*IudPZ[`v7-,dBs[+#/'!\0Tr#`Z~6XkcűjkZ )K@ ݮ{-`]Kd/L9q0Lr (ػHe@搑? Ι\YB 58r>yW{ ?/ك~ nE;у'/#4Gc&( TpjS".G6|w몹j U P'jYz7|ԃԸIt?|yֿ1~}55W7yu ?O~ ᛛl_漫ս.jgR.vXNםn>.`y~ tnYPiAk͋D"Jk1 tD$1sƙ bt5+gH4G4Rg-% ͣf7# 7ֈwMwC'04jV|6-(X"$E; } ǐu$\wS|,9.x1,Bٗ?cvGӕЯY)Œ[G fMc3hj{yE*%K>4(hij=]ژXeJ oz(y7k$Z Dѝi~/Mx 1.B*L6΁X$C\:ƹ w1,r7 wލo/'(^G11ҋa@Nރ>ݷۖap_}]kZt7KFz>i*kPFiHd<\APw5 rnz @ b*<$ATe5ïo`/#}X%">U~#FWct)JBC6l4.M(˗l/d 6NEϱ&ƩY$;_K-hZ\͕WfSΖL B2ҔpD "G&" +..{"y[UMlRI' E[7%\rKSt#..V|HQ<(SϑfZ[ն: Q!5 ΁OQ\*eFhnh2UJyEEl>Y^FU/[7KkD&Uh u??Wd@ Vu}dȭ3gqvFE+PR{<)jk47D&ܑk):Kch$BDs(DHDTtp_U&လ*|px}B2_kX/@m~(׬Orq4-i5(:I' 8qe*#]fՊRʒȪImԶJW)*W @KN3T~ U_nՔ$\,NDNYjMe:XCIP@E PoՌ:8)Uwb VڅV֯sj~[yb'7PAQ+i6R-os@tCO~4(ϦhU$$Du*fժZTs [l#), Ů'J]PdoF`Q~ 1!S|J.^WC^lNq;ZTGRّ OH!2!nE:t׷@A$ \O< d"]4~'Go9_Xʐ_qI"p:`v <2^icx>\D^lÄYnGOhٵ ]s zsCuy-D?]x>y'{7z{kUĖ-[\v%g Y /oگc+wx駣FxYkZt0 UcUHe|j xdQ8q[ݮaɴ-H[ꨩ)@-ؑJ랤A%OCѶEZA<귊% fz^[ pe+ּFfqB$}nBW[U6ǥ(VLcΪ8P0EQU3![ Sfj㡶M ].::pTT0˕7@L튭|r((.2r%Rj CЪCMHBJ%H(WQ U"#d  e"Bd(Gmbak \*| @}iQRP"yX:pcEPB]H:ͫZ/ɓC ȃkY@!I&[kj *sdldxM/Ȕq.ƄTg&ω&u1c1V1چ$jO 4Ƨ~RoGW9ycP $H;t,Ag<ĺwpc8mKX]!L,1%D @rf$lnXH(˷b}Vr @&g 2'OrL}Uxz NgXY3<\`zvشi(LVEVTV[ ژH<ryGD#$pQ=6Pr( )ˁP Sm$e#b ۵V/:d>dݖS_[G6v@YluT(<=Snߤ"B^/H.ckof@՝~$ @>/Ev-L:1t;S:2 \`b0$> bŖBHR;:7i ay~I$E{@w}/cii [l,.-ův:O 83155۶W />0񹹸L1fr"r $dh(pNP.S9zeG+/X6`F`(2WpX^nvˌjʟ}b@ `_T4!cy{k| _}97M%9sn/~eԪTu(Hu~F$ jO(DZ|DZ Tq]Ug3%+BIVZl&!KSޥʃCʿ_jjOreI:!@u !b0r+bE%Tz Ƥ!Frd]S4VFu8ö́,m]"a%Ғ +"ځ*EFdIР h{j[kQoj#.:BE)#ٷ\X$AR,?}@ϩ6J67tCPc)I۪";2vMP9 hM)b[Dq 0I06>Mkf'phqdTW.CN.09u0X&<+a<n3!L9u:]S&E'8[]VNL_nTMm1 D`WHV {J%]On4@]8^| r\I:(eE,KlCsdM:A**(+7Hd{PඈrLhPl.)W X+.Q I6A]ܷTXy$UG“z_PGͼZ߂^ÚIWq .kRX_bHRX\ZS N'AzJ&1B8g̠cŸE8glEy\rEH Eoy/|O. 7nơǟĺ0Mxx,N,=,_A.IdH&͛6~GO>TXYhvѥ_ Νs9^x| J\uŕxl.LNNb0/ArTIbb_?F̥`1kg@׍>y`Nr,oM @T <6j0\,ڎ"CCB\h' $Iy\9 xb~ @Zd)42X-#I rDuP|_Q }e^Uw02r Pm]RJY$$آRP)yy/Zy"1/+bע3wb9,./ϿK//r<dB 0!? {{q}/Q/zQl|7+w߃G`ߋ}t^9_?#xo6 LfJcZ@5t;l2Y>qɵg1l:0Ȅ3ͰZF8WfrNfIxP(/5$@DZ & }EȐb"^E(IťE+PͩbJJr)؂'*R׿+2*FRq[͝~ү`H@NVX0tkky$#0UFrBvAHOP<\BU5uXBFQi1\~N IDATU%9I_QpU̲(eFHKOhKTk):J!:>@*\Ay\!eJ U͠0>\ӧO4-QI1ٞ-"lS- F*Om28rvQ5aHB|K&Vz L<8SZ ä=W&jĴTPBr'A:E:1m˯Ai3XX<,%`.gw`|j*6lnGoa,V`rf,ݏsH6@$H?ͧ_rb6ax S0 ֭߀W^đFl|!Jl:4,< KS"jHcMazlwS0ʤ1F]YZNvz48޸LԒZ]SmE^.އAvx6gK}E.8,ѮPr!E^!*D. GMZFQF5-a>C=b5^3!qĎdSvn9 JM&)ʘ$i i a88 8 Un2uz 2?U B9nnśSӸNlȊM/3cAy&@>N,<2N&} #dqd0NH`WAT|,섀3dY<2ywW)wmDbe "+ !79hw|'0 5y' 2t,>u:fxr_& -'K#) -Gׯ!X(f_td0ݫr19tN8śhlwPŊSy^|Pmy"rr*snxbk{C&(Ư[Fɚ!vr<HRWzɓL(!{k(6PkDuBw>)c_HmѫQק?Hs~6.ybN39@ Og9/eOڀ+JQ[SCr3ꎷ5_.DAݎC&~-[ yv/S+U[iU#:26i͇Dw.2F p1fcޖ10؎]*CyPrDTZ?PqeEݪV~.I5RNΕoc܈,bPl6ŶkN8|r$O(9 O!lPHu$OvtA+p j%M@pZnA^"rpȑ;S!9 U^C:̪HU0ݻ/O`gP \ۋ5ZsXfL"gK LkV=f<=qBZ ȩS(\(Pq&mw~h&d~d7rTJDvѵn 8l^!|hwS^xΨ&YUkȉ`T\ w %7uYu'䅢 Qf.a2=!K@\S J$Lu C8lm>re|+kYbKS^:'0 P,ơ\FH\(Cro[L H} ɖ CHQ<A)OiHǴri>0%ĵ1$k# !퇶3?qjQ5V'd@92N4Ht148 h x3Yҍ˥0,@.k2CBctuFpP^,kqmoүZ?Hs~hktʷkQ4ȩ㏀oc-YÒ;.I{:6JSߠO.Bj}MwLŲc45ÛL\z[TA-Q DUPM?(;iS. h&-׃ Dp-^Q;6A"C5/ ֎݅<ֹʜ5 4QWb 0bZr_99DXWxf!YͱVɆVYyLyq(\>6; Z@U;59?r٪Ai:cRo#ӟƇnbuTfV2gPA灎Yܲ!EU^%MIdO5A@Gk:Ub`+Wɦ)1@kj`!7k( S= bE6Z 3m!Q/ 5W$eVP߽ TFYS޴S!J. -q)yЏfIeڐ3yWZoǓHz?ZdpꍘoLy3擡w侘?B8 7sbj|ͱa (ɯVB1wGl״T9(e\j5E5)f4|].Sbg3tbm0ea( bI3VEd*2تhآvՋh\K +meba@M0$, L? Q),>%-Bk"R$9 (fQKMLnmR$@nv=GQc+|~-g! дUjTFo&]f5i;M:trY`r=a<ܤ\VRq 5_RʩQ j@(w@-}2E.*'gǢ$<f rC:_1lXp9 d:/ u9:Pt1#R=(mD&2q8Xp' & ];q9qL]@LoikjALI,apj>@Ѵs}F^ӗ'Wk=Y;Z37h;ꇀNɷmC"][Aj?Tfr[;S"N&9^ l9sX<P jnS0*>TiR ϕ%I3#rOLmSDZne-69ؾטc] ioO [a<~!LDY;,u oq?Qd5ė4+(]f4\GA7 k_p[-(20 8$likJzK[:61w׀/ xh WcmspUm5j綾9ؠAI yiBc`V~z2g|v5P]C`F\V̩+:kcGrLaj!Ndet čj o j= Y%ӥ_˷0ԋ)xG,'b ^cK_z{IlVT@}+߬=:=l*x,<:T+@䙣rme&zD'kR +PHG1bx7 ٮ|R.NTx+!*M⹧նg粱(cTeY+2S\Clu1RPK=G/de֤*|cAcڬAj4!blp;x(Cƚ>-0a(')q=kꔾ+-FTGpƑy Nf SчkN8Fߵ4V ȡ%4 \JxTCwpSe@gidLkV;bZ~߄f8v6^X:2:Kc=q Na4:|ʬJo$,4Z8"R BckZڲ)f1?xDZ=ܨOPcQ®Z%s~CaDIH|NQ9Øn,~G*jegȮZ mO9@\Ep zaPADN=huڹ1&ָBJ@FDx{DXAs1W'jy,uU97Sڶ/r+AwUrFdNYf=)\{ vhjvH&8WAzʳ84=T~ b@K[aelwE7^5C@ܷ,4rcT5ZՋeUHWC"(Tw^@Ԥ9.IB"o7aӜoBg@Ft͈!\puPĝAe8,dv5yݙ]QL@*`C]y)QVȕCISr_סAFFP M F:ɨ>^ezfv"<1{XџkN8F@A*7r]gq 0JOH GŮp C騪̋9 ZV#6yaUk)y͖`ŜfaxNXMKH8\f|@6@PfX_pG6^Z[qQIdiI)u"S)qdzf"6vF12:YM|#5L@\.$یoNie'|;7]9P[am,4'Γ_8q!xk䲹^Xc g#CmafXMWxA5Yʿ;5" G8a1)Һ*.x%ƀSOUrnhtȁܝKBېf\۰ne9Q%Sؼ"g˕=d6 QwS Nif`H5e9=hȄ!~Q)BFesC#Kbn4pfDG .2cWfWF iJ[Y23;2G jAe>j(pEUj›[s{Pf>o }Ł2cN Pd.ƪHYN ! -Y_sc+#i-.A0˭&+knY C.¬Ԇ< w iUVTsl]*fvYbkCE)Y\-:\fywtq$kƓFbL4AX$v9r/樻2 !d[x Q2tYF^ojT҂+U{ 原 AqOٛ6żE21TJPRؖ|.!a" 1t(\ IA|e4$wU~l[X ^9eyu ֢M|ۉRcfi!*kf8.EKQߖa+?jfh\^A/or}F̲ݎ X`? ܫ80C|dGplN7j;\jsZ~,KW2r|^qQ16ͪuf賜|pi_eU> & ۢ.6( O3&dtj%>LG։-qlNQ]U숱TY>3zj=drl֙U)Z . p"aPu 0XE2+\,A="Us9VgD^Y^Jo5Tn3f?\\5@k8QAB`a,/.H E'1n;G~8+0F']G Hxp_A'+2컯YyA 3+FT\!p WOb %sDy%(v' ލ'I[*Q(uYT^(|]m [IJTF-F$O[_ })}= _9ǂ ff0us<08}d2*od6TUj z k` ->ӠZBfM2awցͷ[#ЛIf|AZ; IU2ASMsMo;DMs,b\>g *kKfWYIdY<'i;t"ź^y(?^9&fס$A$`0ٹc觛/ re.iCD%PB ˲B^Y7!D9zK'1nK*/H3BC" 'Y?k5 QgH1ڰQ#y5_Z03T&# Ih@ gWzc$}i@@Fً2` Y;dXyo9V;^i,g7ҷvX. IDAT# cpWeQuzNMMg\ZN=it3o>o|3kF,+Z(Yt'ѝ02>^>(VWs=ృ=Dwoa}c~DKInT+wy[ FQ//(A\ʾm$ ]b^ #*7x0Bo<|9QzfL@ͳ?7NW2S]M Un#/H2GXht9>fn 8ElQՔj@/BDD6xSIu«8D&8Y]l[ "&l Grh'UmsWw!ߝ9ZrkS碳m[6+HϻAo#Ej:D@.jcexsm7_k73C@dI"xpJ-hIrT[ )vHޚ% ר厩(BUΌOnP;bD"~n( ;>o%hjkZXVrmT5 EX\ 8Ljnt."SB&Ţ0YKg%o[E&Cf2`1T0V"th].J.}6 ˟CvVPl1B48QU/a,[rϓH{1SL>cg Xv{n>s}զoO,%i Cqy}esv+M-x(rI:l>S+q&AjZ`&s8e&2[ʁ~a\9=iD@8-?x)Laӏ~|Ob8B%8B੽W^r6Ϥ8C?#%$ڷqC1ʑ9湌`rzQKv<1d%ΎKId@ZeGHChbl!xy-/=|\c2gS!_MÂp0\!ΓĚ>& -3fWF nE nѺnpM^2bi.e _%,֎,Gs%lo8FFݲG9^CY^oN`US?EJWI6|oomvҼ2s_ps ! I[Ïœq %LouolL Zm_K;ڇ#0MA]nD1qy}q,W8htIPC'FeW{4RpSHT KچCih|+oc JҴni7V:8s /YWgK -=T[Ȕפ#yFqd1ڵ@fQ!S./ I T23ek6LzWDdѡ9a9 Z1<3.oO5&Aܖm i'E,uBHRB&?L6jneOބ .31Y?GC_D-O ,,`^ȭb7bOk~݀5h~a |۷m~“| xGjBH8S' Xl^5CNv&#?Ha jl1P@Ib Vdφݣ9۵,jY@UzV{`SQO=~3 šFHŌ. \vk3REm&J(/ҟ Rz߆-X8PŮ^ #W6̵ vʘ] %&%@"ON@Loƛ>BtqY8w覀Ćpa4nr;nO_ӓ]$iBA.sMcfX Wzp@a'}qARi[w7)@C4@J-UhNPGƒۚ^Φ5% C,w(UD+yy /i }.8!]#PȄA[kyVZ fF,Dmb`n UɩTL;z4sn|M|ѱ4ͺU%!->|;&|V& Ӹ(` ƫY>,²2llkڢ_4SpWߦ RYoG8ƿM ̟\Q(π[o姯Cӝ.- %43cMxteo?s̿"֭*@X.Xe{D3˓Y~Y)E g46n܈__ĝ܋sY C7(V嬥,ܟ10_oK .>$̢@sdX@QD`0X^z L0(c2t< }I@pP۩7է C|Ęۂ0r^U{]/LhaAf,-턨LH4.e2f2cauVVm>FxP.{8you>H6]+[]:u:%u/ W$_~syu@.'ngMI19_*u&tNy7.ALMᒋ.]{3"U|7zV$wwiBH As/27ϡ3s$AxƊ.{->(>7#?†Yp{IDx{>~?38#,A/1BbEh5&+' 7;{`+Z m괱,i?VC.yI'zW߱vOc}Z.][ónټKw^?}Gٙ)@Iڿ6ܳgg`ߋ?q|T X\Z~?K.]=^>p[{-??~\|Eb,nݞb9D 13`%v6ZĠ!mB7(A)f('vA?}rΚz&IQ+k2--AR"ǷĐaBvHexb-G59aPHHoCG\2,|kln!18k,ň?m]dHaCV\6x oaSD@FXp{sNclەMH: `jf.q:r% IPZB %{֭[޽~ wca,?uH(A^ d"sfmؗ`i @5aγu?~_}uᚫ_IeyϽ `,"hj936)qHNXC NHC{7'viGdP=,dcw,CBޠ>-?$I偞NNZhS<:lWQ+r.Ո6גP(Y߻xlm|Bcm`#c+Lhsnd51߻Q/$uu;zrnmѩN 5' :p4.mmog<{Q=vDqr%x+V lbӦgDuSg8OލIom?/p T$MJ@(<~~+no[ə8о_y?e8LLxgOӟ;| [liǖBv2'b$(`fS]K Gn]ZIDX~2!EƍaS 4J=ndӟ,e:x &,Ej?v b5/9W;Lip{kajIw 8o=Ί'3񊀐9O5V*V{VbIS ߚtj70¥rq;V:ژ))g"2b.-IOxO]H'fp-bǙ!Oaӻ[Ձ>s^ΛƎذS$ImiU&qz8}vu+nV|㡇yF\K~A] %tI(m< ~TF|L)F%F>&j.$%N!uEn@:E4F &jL:Ϯ +_@D7Ʒ)5VV& o١'h/ef:GTg6QEzBۅVNXrsqDEjW2%56 0m +2#oH;.GX:OZ}/s.J@ʹ #%O?O~@BKq‰8xN8t:,-XXHB t ~g016Nێ}9lLp5WJ}>N"@ a 3OogۛCޙD֯_Ɨﻯ+[r.b((m2mN=֟lrZx_|fNiW9oYQ1>fS$w^=luE[Oh|/vKǏ'Ø&[ރg@X74E/pM7_K.œO| {<_~I'gӷoG&6Ky XX̰( Q=>' _SxKwazz8$%,D$FK,aetV[nκ]!Y—u;8xcrO"sZftҮaFHf%ض/ i&g|w,[AD3q)b;Co/Bg!Y:}Q.οgf 5uYLq|kxpw~G~\U bM sw:ohϚm{;}`o`vYZ\t[XXoœ R3@Rt<+N}a;ƛođ#!`0{+ .4}Pرv |rOxz o| eLNN`IOǠׇCo0a/i =rrY;ո PcneY9cHm0^Fx,_E 23FmWH[4tCnLg*%LV,}xG|pp睟\÷w!ӿLvp7M\XWҚX-eP{25;˜.,iǟ:#'?U}4^% NuUsa 2c}ƿWM"þ%v 7ȑvX^ 9'O>'sxGqg3B }ك`Fۃ`=Yݏ{ N^ŕcK'AEdr!@"/a;XZL\!-!ӞMakUi'bYt4<gbNŶm4r"c{h!U Ԓ9usq!ؙ_u37%5 * 50&hscP&B6ɀئd ~0`.F'hb؉h о;hm8$U'CPl(6ݺ1q7a Ri6Rq3,~0WQ7*6xĘ8GcRl J펕:ӊS!W6-~_pg' iUbmqe_@-V ;Rc&d3*'g rP -S-}Z G1wg'p_\8]va8v={Wǎ>~}wNXAx*>HG VWAѳQg =ul$-z0Xv8F!I8\ IDAT63O٬]- gd ܚ,%Ze!,-Vd2@k+2w~^UoZ"|f\ ڜ29ք\8wXddLehG~e&kTlrd=roJm$?ތt OX%"z L7Ma]9xv -BHcv8m{lj X.--;?.<_ZLڄ"xqlڴ 'O.`yy B|@`i[033 ǎСC,CoTLYmZ[#O+G(' " 3\-RVa` VvZ7ϧ#ICq 87T/kNfE 7Z}A-[ZW܆p֣+Y#|,2i\[ G?} 0OY{:$APr1}IКt&8aSm8;w( :qЯ4zu |c_ȸR{I!/tu24KMkػ|/鴬Nx1r+@)w?I8:av0 }yxm 7^<-D=q=_9$,Ce":u#~? /Cb5n C `FzGFFh=h 6:Jo`#s&''r+YK0Ѝ wtv-tlDp1oΥ5kg*e0x`&]eT'Uw#c-پ4҆>sO2z ~Z+بML~%ٸe,K~e F5*N_GR$jXdm%y}_ rxN^J~c0ȑt:CŖ;0e 7.pca$pॗpb$ 4A >2>gņ 2'vKƺ]$ 9_id9\LNZVj' rK5ZAm^sXr6\la;V&I0 M=@MJnJjT_ҙO1t: 6/rLl˩ +n!#λ?(PH_ .,,Z^:)rטZ{y` K;1f_ LLo qe`]w<ovъ9 4Նn- FZh۴W\d_79D`àg{6o=S[|$%q\>K#ē`axI!Sȫ$g?qvz>;|^jɵ͋똼aFVȭ,8@&c3c͸z,2NHӤXy*v? 8z܆v ./`0HPBH$#$D@ 59K3ؿ吒6Q{э169q1iGp9˞ IcFbxn̪3g &r _P5iM.T=l]nRJhn]rͶ2[6j i__+a}dLlu7GIh&e\Ѓ/N-yjT9$E\{[c o&|ltԷIW#s`0+u`-F-t ĕPiiMZ}/ñ iZ=,M`.f/a 2`ϱ"qSIciicKP_./V dYNTFfY$ ܺuc%cX 0rɚejfJMBw-6NA5a`a Gf7F Ƹ#i=01x3ε7J촊d1I;C&rXBSp\\ nUe`9A+8.t8 i]Hkx7X\h <ˣ<̃I>]06SI:ޛ[rmw2B Uկ * .,aa/BXdU!$ed{]q=ZϠdgz>U}v~3_뢓 *UlkNS Χ@ Bt7<}OJ0 h^nsE,gU>{?gq= +@`}O#RA|ғγ64%)R v#`ۖ4Ʀyl\n@p^]vO"Ӕ<HZW\&_>7m"MS3M˿~-[6?|hZOW$I^y%|5nq A9?6/d]@-SqlC]: 9l6(-P߆ύp,jlZ x$qT ԣmG9 Hm}`*+4< 5a(@<3JTKaI&4/m6y/EvY=U^3)kN EU٦KށleT8H$qI7 ]JBZQvrFDh ~'N>?!~q.k_Xn5_;m˒4MiD 0b<\{ۥA@~@-WsM\/O{ʓwO^ɻɧ,q}f|#eiO]<':{57;Kgo\?%|1aK^}W3$.-KR_P}T5VP>>gvܫ)G /l1ӲT-lLsɵX+=NCM5F oTV\.l> 9J\r'3q R4^F"a$$ aJ3]_ػ8:=Bq-w:>xIA d d"6n56NI/! LrߍZIraD$[7̲$""%qͪ^g+ .귾W]:n^;/`rr󄃢S%*HCE#N#X`J>+29jEuwaMi&''9 l-O ;0[KrI|g / >h\w Yɒ#FB݀pv~FU шЍt'N7 A'i判!G(t"xY{q ˀ`ey0[(ڄH Ť2F XԷ͛617?ϳ~ܴk?_,Y9~eaq|{λzE\|E|tq+> r%%)V>.keS0$cɚD֘g (hx:~Ti60UǙ[Ppq;JT!پ"FDUtd "sDTWٱg/Bȶô%fQbS x.NM@5+BisEAFXحNԚm8^63ߏJ@v!j4C"{ŀ}D\r_R?ă( UA1/B;h|G( @-[ 27O,)3_8ӫ.{O{ܽ~e/ǯʐvv|>/_9̝wCemo^sa^}mukuXkrU^N<|e g:qkr!k,+G ; P9^uwnuϝj-X{qՐd5 N$?cr\#N#Lr'+or~t8ڢZm^7C}#JKﯶXnV+;n];Q\Hc0|6F4KO''q$4BAaDGW*|}w e!hb](OXOw$ЌBDr \tZӦCG-E xBɳ6Os[/Ç'NATK0e wZ!^RK.{%/앙+>xx%𐇑]Eϻ蒜s#~|K_V}k?y 0Y(3xزo:\UbSӂM:U0fœ0^ BYN2'.3CAb^1>V9\dދnCFuapæygXkД {ƣeBg'z"Dt2v7kB>lT7,]S({/S ΑjE &Z3WXNR=* hG e{iR_"`b| z[KrVƍ]^q05>Ƀń{#'d1ݫm펢YՂ? NxP!۪K*.@g &}^L-y6TrvӜ:'{b0i=O#?B5]E&, =0w%۪4z?ndX̀ͥ|Ҁ #vubQH8d?EQ@׮Wz+́R!ɫn4nt |a^F@Vg3O牏9np8MA`;r͓29@+ljIvcV%s,K$++]VW{;tH٥//,r𶽜K&q;6G@ rY9Ȱv[)=7S2i}ox*Ս\zbB7-F+fEu7 ZK"Ꜭ dr+4Vk;mYND(Ry gfV'=~M`khjp9S"%MUD`c8E1Uag099qc^2@ǖs5tꆸ)7ONdw Xp '!bl{qd)'t!D,e@=k&~_+Dʄ0IH64%8M cWoq"[\BJI@Hy T[m&#AK9WisV*ź]qWy걗# '* 5 BO|/91e9K?e$w>a](NF͉vW p+blLUuT^3 !5Xa&U>7*z$0s$S!_luܚ9A:okjGknY:Ksgx]^v}{_e#SF?#bp)k5 -.[ rxʍGc%DA@SZNKxVxjvG̮#…a fHE[ԕ$ur(F,ZCP|Sc %j#gH\Eޜi+af-ȽxtA _R7:Xs~sW1?.zmM:?IV$J cќH~㭻<~ ?_Me5!T} +Z5[/%,8)ɏr1ʜ9 kt+#k^)@\lb#GX|oq}0K:7n8 D@0[_)z = tDwؽʹ!6,rz)|gR94B:K1I_OSٯ)c#-/!RDMez'뮂:dS5W%ũj9MؤAdn;RԯZ{;{15M;{d 4V3bmJ¡%IJ4 MeVY8st>atĪ rcY?  C "NX.vݠA"ZHJDkh(#QΣNEIc[ubߎ֓qgֹ0o _:r yTNȨ{,J)&y>w"%BxoZ:iAx[Aed/5Vg&7x߼0GbR)cFpƀ 8UR)I$쟓tfHJL[{1I"AʔH Q@ YhJvL]N5@o2QOY#ihUv2mȉoypu~kɽN,x9&l1 IDAT]aL2 >#lp|Qm ʫEshV>50<tG흨J.E|S*rȨ+mjoeqIh?^Ym%Jd: 's %r4J~]rtʩj&\rC5reQgǐlvZJb̭F-#>л7I Ž.i%a5"$mL:!lLwغhR7~B M5FűOMM;_gvW_ 2Q4WN^:)A\tK(FRtWb5 `mK/IBS]8;)є D-8QMMW$6 +F"Y ,%]z[ZGm2ߩ4Ǧ S8y(ju\I2݀K|g(PkQ/j"წEI W#19Xi[|UU]N h(QBRpMq58((R~o5aM~h4/Qy0:X/"tdCf>zo _'  нNNEyq IwҔF EJ,0|a~v@Y]XM"d/aCJУёlq/eaǁ.`xJFac4&{AY@@we0900 A!iMuHE8# UUL5G|ް_Ѡj[ + Ȫt"d#gCll&+N'u?=rz49TJΜʭJ9@vsVS̖'yjFoP]4 n}K]_dTS`;auvG XAcTerjCUsCuhsP*M''xetBVEZIXX%9`:ⴤ)E@ԙ"L宇@eXr]F026܂etM*D^x ]u]@CM@Jo%r6o̽RKA $\ij_LqaK(U'3?QpYjKk5j'uQ&Zc͢9tŽNrndXǐB:AUZT"eJ[vŹ~\Cv>7 tΠPEԂ 5yQ`rMSzsWJ?OμqLHYHBmI~TG^BVZWZkQI~7*5Xw7u)mLj`muZ.ng+#(4Lju 9PɘGaEzYuDŽɵJY֤0- UXö: RQC41]q ޮ8/&)֌YǟtRS3<U][=d]TsÒJKCԉc߄#yZa:tB*uCIi9&_38S+Wo,B' E5H@4J2N k] *n[۪Pz\v s76UƷXImE<\ _Dzqpm.A_%:p-3jwi< d5+M[fEPkaƊID.`SЊ+ j)aYX7 .f_faz k?/zFPC|EƊVMb]ֲO}q:$2sxnbc*FP=>>l.ftނ2|]й"3urCUB6~=W]`^PjY(jǃrSYV8ҹ\ KNoB"B<>1}:G92n3PDqPa5Š}Jɦ S05s Q{9F#p9#s{$+('+VMA lpڧ=ǔ+㓀N9g9Zu2<X'76ujf08mFEON*:|nҏp>B4Rt j}έ WEB+K$-s 8|Z*Z3_hQR\^o֌lNMTA.h1 v$`TAy陻kXס̙w3*&MJLNM5WN'`#-/}gS J'`Ԝ6:?]m>h.yܵ$Vm*/ r-$G`{ކ XjkE.m(Ħ*>]BTGsYDFY{20آ(+żfG \@j=Sci{}G,qG]u {z/u48+PGݩܨ5\mn캢::E ./EtJp9*o`{ZT$E?z!Gɵ.G*Ypm\ 3.l{뵫52IQ<Z{p: JT Y˒iPR<Э3٢>biF2+ 쐓8{TX҇ƚeN),oFfu5eQR+Hl.kg0asZ:혇H s 3 =^9["vNsBѓqҙ[ҩ[̲olT/~틚9쪯AnP.-'(*rMHN)5)~5%ۘv--wWR߰|7)rJ_03<5h%̦[m*rM6#]; Kk&-Z:l(q^vr#Z9UN \V,7 R{Lt V-#ge @nBEw+N|X^uشkCY%󕉴EuξYaK\Tt dU-Ҫ iT6 5"Y/@nZsjRr۲8Dh(R8R`p:+5UЛX (dGr%v $R}C#1#ǖ.IZ=߭:ڨd6Aa\-6קN9Ta`΢*5P? T o5 :㹔m$麞}A'1kQЖbP_6+v|IY~tܵHiꚫ޸|[}r88iO⪃3`[cM'b@+  (ÀH-7[o7*kQ];+ÑVȏltZ4w'Ք{&YEŽK[.?qsR/\>5XԜ'+%rp<O]qCvs?}fa$q8SsYv%&w+:RAt80.s]aUiE~#֝r&"r]Pu9S% (CB]V.EuuV9Os')F3palf!'jq1;v+A(lrWpwWEο:7s|;W^ԠGhthiu9 ;jOМhi4D" cVSqL0 hM0 i eʖG><.Uu_Lo:cJ T;kUh aTIŀ]Qd, ny=,6[@ 9hFWb)3_qf¡U1kܠr8>XTg|:dQzdȱ$%hmhj,2J& mt."+.GLnpxvo.o 4g)XDMD":&οQ<b3 er *NHb IW0L4+H C'tCɋy񫮰723 Q9wH,uN,sP+AXk&ᷛ2\EXPePke՞vgzM}܅oH j14:e]k/q+k*>HQ9ZOUGݐf-6,ƴ̡4x(oHe ~{$P^BdV;ChQ <.yJXO ˥L@[a|EG4j߻\8Et[N8xg}+]A7ӈ$bE6I&mAsfg3S[h0N2DH?J&l" ӔUX饄"#Y\" !1H"4V:,Z=V:@NG#pbͤu񱀷QoA"qM]tj{ m+}@ 2+OrP/$PUJ#TGf(6 #R[ e]ķsa R^o\(Y `p6yD2w(yUU =@͇ҸT0k[GGr^) S ΃fEDWlR= nxasW9qt5d%]٠'i!hn9gyLLLO1 v@B)8k a("A$ )nt&!H^jH{l8KH٣+VgkZUaבFT]XJ&PYFpY+4`S3BΑͦ YWNnW Zԭ.zhLr褓)дX9awN?擥p/X/kSuVszvAۦ@rmЭ s⴩7A:HR^EGM5yvܧr~OTc棷Ng+roS ΃C/h,@-h/MsXH_XEݴAhmhl:έٲxA DH4BA B 0hʔk"t S-aD,u{[Kb'u#ްHш_CEG} v':yqe%gl:IKJU玤c¶;s wvպ٠CE"W&J? w3myrՊ_mal4la$jbpE=kΪ y"ٔRoS_L8]:Q;><,[ mFj())AqwPĤ1W+c R{V&]  ʶgә;~f;40  I&)@ʀfJ#TF>`i%_xeLX^M[L82N5,bT Uu LC U-Ke1 t&5W;Ȏ"R[b'AY rƶS/R; 7svqbc .]ȭCIPѬTw͜I;P|٦5TỦ>8gU嚒r?0֗wMUEB+ǔ =IN@A ]YOB94i4߸LNiC{I҈aH#!h@)2HMΘض!/B/@)14Ex6OIa,-;mU<%tZ?lUNUh0۪[4&Ws!&9Xr\e|u(gLBt@B<\5.>.kmw:v43dT:W`jA>ۃU晉?ӏS /ƍ|]>W7*H1k.ۢ^8CUk.)l WsurDeݔqa:TC%y?t y,08q#,_V"i8Ncl+v06})SSLn9Ѧnэ"TM&PJ"@)I-Va Ӱ҃8ī HH(@([('oA"JZhD`ȱU5ކo4Ft6RYu_Rfge} ʊ/P[%CU0ʭ_Pjit5BTU6)A]. )$I $& '63&lN8NHmE4Z ځ@wzB!HH a A@ H4ek*o;4^,I$t{_& IDAT"@ 25 @L7ͯ~7-,ݿ{^{/?O:?7Ż>/7-KE_[(PkNոVQ¢x@U] Dڊ-V`cc-tE/NcMAFVMRor8Fc^+^Bo{k zIX;9p9 ڵ e6bt-f|I{@CuɢQf=u6)!ڸsj|ss\xk~7youZm^~qmK^sD+^/;YiuN'(W /J봈 r.t 9D".Apv$Zӓt6Z4[!Qx3шhwBD dH$BFQ Fd %cD R8څylI6ƂMVS0쯫IʐnWJ!h6%"(4f E\ 8=w^>o_4C%[<"[vx%9@#MnGgO6Ց.6V|594RAe4Wu]z9^y: 75_BoK+Op!RY>-,.k]x+d ,y"W\kWbELIw9Jx/CevI9ᛇF 2̚KRu~[Ybg}_˯>'mW?496p~%NwU;M|{Rdt yPܛ%`>rN![bj#q;$lD@!n cRmrM4Z$*YRZ@W#>y\p1ɑeIOJD w% +ALfKFi WVbD/1/\{سOc~~>'HX謳c}F {_<āy39'=Ŭ&QpQiϧjhij-8锠bH;.T':Z>gvjFe V"Xoxx^L#\ki[~7r۝w2>6Ư/^λF.@aJ?'7]/gIb[E*qgM!.}ΨOZT{`?37˯o;M{Ir?ǎqΎٳnc}<Op;ޣF YwA7Iu@ "0h2a+br+&cho@sIsAh(ZQD7^ w϶<0# B m!hN[(4~;" )G`U d,IDʒ?+ՎӓLMDfL4,/⻈LNL7뮿_D?37?O{ ۶loyb*(v+"Y]:{N/m:oFV8+zq4}s|*cd 56,EZ*A{*X[ȭSh]c=:7LJ?W,.wjFܐ97T3:}96kǪ7sOX7cpؔoY*4ˏ94eҝ׽n~Ð_|3y1>#Yڍ&yp]s^j6m9;O?{/s.o+%gtLY]ZM~N8 eG,vΥщYJ&i1FKD@+ ZA gonpmjLW$L Q0!lh t)w1Ղ36l;KRa(pt9`3тťɉ0L9AJ BtK.~ [6oft:mװ[z-pw칓o#ǽa|{8toyS4w>.es'gw>h| o-[w>:Ug>?|ٳNnﳞ >S//k?˿f# -PРr^qV*_=)iqPc[=&|>"W)ɮ_z ߲o(Īnu{=> %^MWꈧu=NbC;莶`w>Pvx= uݍ :I\bø'_~2߼{\w-tݱnE#_glq/-p\xy|ړu*a#Ѫڐ nSe@Od 'jL4"h#D 4V$kK:a¶7ݵRV/MdWBOJJH4l hF$Mh7p4E! $)WSO9r\rh>w?,'0pgp!edp?1^>4099;>я7N/s%_gy^Ԥ fiy{~cWs]<1}~{ПWr'?@z%TXn8镢ZTϒucٸ;>> ʱEu⥓-N~WA_R՜S}`uQ#7"4Hx9s5\EWylF ઝ*2jTS;&(,}`$bz0[̯)0*TKBhU^Vm(p+H!.smRp=45M K$CŚ~H~<8eC #%`vY:F^`Щ8# ֖&Ljh4DmAљL#:V(Ih0Qbym"!h5!&`1@*@I  ;67ސp`^tjo;vdy ڑتdz)fjBt=о}py}-vFyܴfv| KKlۺ4ö[2^|_}c_~-~7 v-[J?xVwtHGqpM¦'&iމ.1g9}*X_|6Un(dQȦ@ wۮ 2>˜}0 UOTzDmðF=ݧ>ŕz\w{P9ow~jUia_}M~%da:sIlȩsp,93|^^H&y*'?'>]:GO?R>' {EwTJQ]w/=|ӷpӹ;e o[G{+M')S NI"$KRE4!IL c%W% e{8M1VMLĆ $A !gni5R@"{2)b:iXHj R |C06/b8|翿__?t0?"&8}'cc{w!npp?]|ƛ/Q3opݷхpgqM/8|dEq7qΝu:-uJG0|r0`k.\ju#}:"QRMf6+L>h]=M&JXM.oOV^hV*)u\0*&'&yi\xW]Y~=w]191۷ޗzmWq`SL +(t*@N l}gx#cKu|óQkkr\džd=n"-.ׯ?7]~ǟ7sǏ?z)|sI{䲫_羀wrlq,dYi:y-SQ Kޑ0q92WQ{FIѤ36FӤ3abDT+bjI)4`C6ml8sdj,rʊQH(eD]tL DC!P@mi29p`61JHPOWarqJѣʕo?$G=~|_Ј".}⏒$ t]~׾ /h4x~t,=)O湿ly# Wr| y8m }2yet&'׿5xo>'Ͽ$L@h_5U ԁۡr򩹽ۢ_l`e`)̷ռb~zUQ4p:?8F:s#uHh=xlx.|K^.!9/}iYإIr6#1P٘RB+kD' vnK$%da5el }c/ʯi~7YgAѣo<+^~/⦛ofqy'<ٿ:tKH^{ncϝw1?z֏ۿ|mW_zlqiwOxƯ/t8xxo17?_~?ig8r(~ortnW_2l_[4xrHև ˜HD5,!pYRKCq%t7UFn[v `AvX8q3 -sVlՠ\3ʮ+wW @vQWHqa()`tR 8f--AeX\߂08Sዝ zKR.%d j29סe_(89g'^6iD བྷFWҫۦs' ?kpK~kss ŧұ5ޡ96IաՎh191=-MzqXZ {WoN69[{6enUQ+dL_ZE(IiG x$66<ΙBK.9 28*tů{Ň6ԢQee4_rbln)UW6wP~CR#vɱXl$Oa[]*SRވPVЊ_ LE 0,&qX$id brc}XjlcߤN9ci 52Va͜lLlۉּSySޤB}cj|k~ߣy iYDg2׊u҆4GDO);.CinM64ƚ}@ iv74SyǏ'lfu.!Plwg+Yu99(s YUW›xl+e.9ٵvg-Y9)/*ٵ\8/+˒ˆjfLre%MM}Ե_nǀ{HuR\ @=^Y)+ie+[C*o]"1Ko<'(GOܖ D?G^&O;Jզ\F[AݛqIʀTRZAB'/McAozD]aX( D(H0r"24Rݳ駍s$,wa9){q"b" I"Bi''dl GK/'4ekCʹEC[ؔȂj}\T.0u:~@*ވB^q݅/ (4UgۍE[0*TuZԪjJK!+7Jl=%z2S;Wجf\"H)riվVLE5d]^CDa_U(6b\ /0Rʸ9#*7){緦Ɖ&QCQ {=}6#`r=%$)meK wX8/aJ zRHZHJZv3 BL 3vL/?*;ZW)P^GÄ^6Oj V͠B@E}u%TA}ǽhT0+cxb>#8e}F{"ƛ㙪ɮk!'\ƞ yŰKJP;z8m,qm03 ӏu`4y oh\\uvjT3&R.XwPXQZH >#N$<1|6uV{6JN'^ 5>&RFͰꏅƺaҩAogi'n8qcϙ.c!-b$VH,&nȲ8l0׉]akChLOOqy]]HIVVY>L5%gl%%" b&vH!Y,%^ iŌ8K&B H}k.-9Bf!|PgWiV"ז, ɚpбu+)6s.v]A}N.nNqG̔j= VMxOD 9iG+Ne:qOj%Pǵu萫>}U9-[S:JFo[^{vF%R[TJd濞O^vϑo]YS qv*?7- QxH""!1X"XZM" %hDDRm4 K)={Ǘ%%S!F} :ҥ8I*HLRa*bq"X&) cf'А&Qgh_tu  9t\X*f$Vzjh_NRۘX6vuH! %z#d}- 5}0 2yh~(v6ݭMX,vF!UCCk ? G$!B"*^JY@ :^L$f#d#O|Fj}UXJ+ ٹl#lIcW,C-bI!@T|j>F|V,2/єxxRv3͈(5ջtE.7$⦴rVkd[L @}ٙ\cI`PV\u+ʔ#eW#Sl2v/Y*e-~ʪP b1T2Nњc ORG>QePd\Y^!ҍC {./γQ)qpI׆7`ƶ[rO<%IaR9T|2j+Ug'ĉ7-@Q5 c$ن0!鴡 ƴۂE5&c5'#v ٶIϓ, Xc!juسks-/b&|f:DmI, tLb%s]?8 uB gU6*J @:IV G,q""nSP%'+'1L&Ki$Z@H}SYI%KP>BT勌4?ۥM§YG0?E v,\èMYМ̜E(AIL(ɬǚ0wQE[!Eױ[zq]r q#(OECѢ i!Vو;ĝ8v$)}:c0ZDQĞ-f %ߏY6Qa騤^no!bر/07C;$y1S:B1mMa|֔#vd~)鰜Mj^2Oe(3N]挊WGt;9o_N%*B9hH}[*Qzu[45P'LO1VZɡR"?inc<$ՙ 4rrFcgZu̱9r_z(*ݒ A,Jixs7PLz/2;ÃĢyaY2'ĕK]Q|BV!TMST|^@_Ќ;9b(T$#^7ը V>m!PҔqW4cIG5%M_n #RbjD>SwE^0HIJɷdۍ\"!-Xkk쪰ǣ+fb Q|ʦ}7Q)U} bP޲ELjX!K'J"ـe]V}L!\2gJ-覽E%7ΰfR<ci"7[\ɲƝ_7ʶyP1,(\,n3}r F)+Ga^'*QǣGȎD1^B||651+*ӘA 6ddbD` 3vNl2DcBݞI&+mʈNDc&&Љ$~1x"bҀjuغ}>G{#2TSiJ94$}c 3d]hܘ1Ecu ȳiuX|"ٕ]9tvd2wpOUUDwCX!3(O~v DB]0pWU'b̃, efi|)1> 6Ef+lg*VPKc·b wtt`tj!<|@RuJF15u^E0;ע17 ѱ:֍26ZՆ;;;1jUVMxT2X2Ւl35#+2TeUB?`{VZg/{~#'>˜~Х~@y.Gǿ_җ9KG?ݳg/s9罐>T^xj?~| xY?pfh'[VY$0@ 3W$]6 U TR6R ut ֬e֛H.!.z8YYa<3P]E"&e =ly b"ki!] .9zD (렅HEǁ,!mKW>BǜyUկ2ʂaNr^ $j`57odRwh'Άzu(T**ġGtd @KBCأ{T@mVa7{ X*u!$c>i54CqL܌lowqZʲ>#NGss ?k~r-F˗u۶.C6Y|[m#Ouk0:2U8OaӖ-ہ{[D2;'r]9߅pmK+-VNSl8Yd\ TȺaMJ:s{e#bԡAde.aVZ:\V.8[Ƽ+Vz,+6S2 ۢ  CoRyf됓cޔ!:&o )S*)ԎI^'łT+ƒ|Z| *TUھ㜬dԝ"A 3Q&8bڄQoqD>- !$~'o :O<yQ7Ӆlf I Pv?jR tn E-3ϖy0~N3Zy5ETmFZ:$e+DӬ,+hlLbV0d%ZXC DrBSVp؄G~%+seݬ]Ôՙ{ҤIǬ Fڦ :5 _rFͫuXsQ,Iv0ܳD]K Nʆɮ|0NVKʭU螶$"YkJY>IܕԆ9v^>k*4GBX1P4~RCYkKFCNWb&s̼n=,KZrw7iv:|:u@neB')ߓ7;ei߂@Z B*#cT*ʨOQH5T&n֜r&x9F!2 A}_C,;D&Q;"#NNc멯=2B30 6nm"EODG!br~tYE>~Peo3d׾fD"y+,[SّR 2ʆ!<8FU8 NJ: DP]d~S10iZ+*5nޤ08|qp _l/9)+ZCuJVwѠí NyvjR/;Fh GRf*Vq(T 1֔?m:l i, AN啚H1w侧/&o|vm&˹ ٝ:e3wmݿ@T~TZ0 "AI8eɶoQRCtb"u! DZ{e*hٹ! j3]j,YS{Ljdyb!kVطwF3bBEx <|*LaSilm%s{v7ip13OکԱDP(g8RaDV5h u5V\X-@=U"=V/ s%C)WJ jTwua%UR'{OgZdb.K8ngeVc`'[T^v3r1!HժeSuf|ԯ]Ŵo[̯aW'gqqձNXC-K'+Ij~wUzTp61/h͐[Xz)A(#$>!~ Ol]af[mdl"$}*Ue5sQf#Ac8$bb"`R)2g c#I-R7vˀL@ecЂ&؉C5^n注!uPq%EQ$pS!F JH&,|(Q).JY*Sa/,) .z [MhU 3a9}v'C.W = NR<.:S*7tY:3xAɓ"[ DVstvnaIOo;߇_=#6Gc|ܧZdri7t{$b֮س\au/f>xDL{lT{Wtsf D%s&?޻t\z!QvUM !l'-WƮsQRsv6u0Ue`mbةVy%MINRDߘuYJ8_,]HOeoTmj׬|܎C MuT.`tL;z> yYil7ՠȕb%S43oZ\Kfᓣ;):1y!gAx rzBiu)F\,Ln@nMJyaAxruL[ULpI}IU_QpYqEJSH%AKi6I*!NLƊtv{b`KJ{B"iH)>`r+Wu贡I141͸–moc>z/1RL'X{cu lh3;$t'z-:jgdӖBR -jh{Vkv]$8k˳9QVB%ީcMo_轝+lU1 .&ʄrYŲBke 6 w3mhn3fX-]o; z:٬up߆-7^C(@#iĜ OYQCպBCi$1mKQo`(3/ܗrAv{߲흿,Ua fSknܡBUԎDDy/DHOH@ҙݞebɄQ g#V L[{_ȶM3=bI0>{f#va!%a-Tq_S.d-_`U+lZV)J@߻eiL3N$?at|"g%bcvCB)t8 ă>:"U TK7ӟUb950ʼnw_;栐/9ɨ;κRU&KFl 긐T 1ڕѡ8-wCFkTFTZ?Rŋanf~x UB,߮+P4,Ya'Y- ʱ(lgv-JX3R[!PXɚW L/SJWd&֫E (eڜTd/U%bҀb9 v? -r'ͪ|$nSP9*`D2R0icS688%e ݖ\eԯ6]JcV~7nN^;/Jwo8,ӰiYN$ |С> @ Qk+ޫσ΍J}r9ȰCjؽΞ]SthÈf ffܷa/2i56K܉8 Qk,_i̶l;#25 t=} IDATK¹9: ̶o٭*liHBz7$/S&Tϰka^ٷkؙ (a}WaP[eIҢک9Njҝ8=zw'rM.{^BMPlZ[zd7bիwij5sٸ.)ɭVSn iAٸRlaCޙQI'ԙi5W8w 7os]-}ꉇ]2CVV@gEC"Q]I4`Pvmcce1]ϦݰQ,9~ڔC? }V(9%ؕd^L$C=Y.Z\j>[VJe>5aA TGoJgfIdrlAW0AͧɉxZ˫rҵ/T&N^aD+dPQY%`. !n( $Lv֭>o>[r p"ŝt"-.ӷl7| HrLWn 0]n*5ޡ^z촏dBG(ez q6 :"g_# j{H2,X]KQ@`n頣8 ;`ij֪_S! Z"]F]΁%ͱ"H8bq[XZHbxj+*-Y 29!δGVJMEI*ąKe 뻬8U&R0T\z (SŅ\zb_Vߓ3훫5;aI>#a{u*bkHV30i[vAH@\G 3@. C0)5fF୔b*;YJ6i/ .IlvM8A'҈P訰 I㙼}dHa4žYCcS)}L{NaSB@o߲+3$ 㤂$N3R~%le|yuJ^npۿh!VtpBԯ财*>^tarFː.ً`.F᫽iy'NeiWu\fP/(r{iYw[L f[wavMn9!9wpIB 򗊓B:?,𖱷E*V+i~uZy0e9H'׀EWc(>h]+Se7OvMºE$iml":0<qqF̯ԥ@oY2]Q2X5\vl6jp^]'?IrNUP*LPnĥSìߜhBnJ1+L vb۷^ a=_/aVPlglCۃ8D1hhfB%]1-_eKR^Y>s]>׭MA\Z.0Ta/eoҼ?v ^UxbA r^M "xKq>GP.ibZeBmu\Fh]&c62do1qpM1DF8XJ >UĐW4;=5uw^U{:N|UOvalR4uYK* rY߭~ ePz]ÊoPǥz؝B<_5 Θ(||[0iM28u"D4-Ȏ%xʦN36ge1kTUfڶ}hEM:NpQqm@{O^n.1hzjMXv\d"$脯#]8mޞ ']!ǛO}~Awo>38QXc m{;`WnI/h?6ɗ2:ϝs% =qs%G=bUAn  3duujw mUIU˰ "l>ODMPeN~IR^(ޥ*yd]oBQO%nR!/Gɕ|&7W(nRuՆ~_q^ym9Wz?l~+.g<ì\UY@RU\m}-o%w5ØTѴ I ^g"Axkn̿}w(dUYrc{CT sN ~-M[ƴҒf ɸVfM #Yԉ$X8bʪEC,dK|斩/+6dU}5m[++_@Nh(&]'%kJ30vFme ]2׼y駱v*Fuv#6oٹ9䥔K ,[?[nx`Sy`}_ֲnj&;v_-w]\:\7pW,quE|ZnŦPJBڀˡ(ԅRz2:HAB[L:ְ.(։M&|IZ&@B$fl;3H逵ܕI Ȑ̗0)Aq[%~ !#չǪ)r$+ ,hkN(]qC*j f*֬ZřO{VfbL2:(ыsԝzƒI?h*uwr~<*o}3\v0D;}ICչX0 X)8Xd!9|^nCD@E¸Ԥ6BgA~E-IV@NwgTN.g,岘T#6{ڼp`!l _OTPz/ۇ9U6Dt 613mn)ڜC;.ᅳ7OЭwͶ;m!Yy}71QOF[:xk_pYΏe4-- @,焣_< %)yX=laRn,t ;h)<sɰSҮfA|<[SΠz)Uĵݾoo߇hN .'Uե_OMeb˦.{Kܲd5idd%wig>j9ql3߱A\i 1c JOE5'EcKs.YūeBim0,\gي|șz|I'Wn;]?S,^'}$;)=H~a<*j#C^zy7>φ1RfJN=n."?FbW$I)`8 =7r.6Tԑų7ʼp @,!Rus19Iv!@#8eSER/: #C11ЍE)vGtRys-:_1;rtq%TM]DNw nNL##F9o؉1bZ<}9b>_eQVȽ&κ<[lAU[v,+cdRYD-'-ϥD'i7-gNሕR~@ E.Hm}Z#g67>7m zع{w{yhjʟyaIxd=q/<胜э7_ڻ~|2g?EzN4Mnn>~잚R+Y4>޷gj{%aز};?L%$V_|%/7}WK/_jN;D,Z,[n_ ~7N?c?F??}K<~uX_ X .sx^ͻ2ԩ dqlH!.@t9:$xҫ"D " aYRan97+<Jw&VƑbrڏ}#īG"=NRGҫA4 ӂN$'0xzZ1qCAʺ=U~yW@G xKRʷ^MK[(ԻĔ\I_ VMhpuw$enԔ"I;Ar 6)(Hn"1X-|1&`ѢȗN3drSR|!8ROexx&+8txѢI~];2vC+/8;;䚛of}3L9+Zw^3N=5N)'^w'cO~kv\ R062߽u1p16gGۿedO>+.bn^^m|tU˖qiK/喻H'4*/>^Fa;9'wb=N>»v@\s|@YX%xkKjKOF:~@Gm)ewΓDȭW_Ğ^s%P|jT*{;yTocQFթόPQ[>AuE:,>} !X8aBf}\ܵjUKh|p2ȋfS]v+k'O$:7KN).yYJ 6m }$W)"$CNDt@]c8.za򽫷9`2)URxdn4e5>y }ŋh6}%C߾*v$/:\Mo_o|##]?^/)lÁv J]Ip=pvztmqnegۉ =קvV-[zxk_pVXJ%acǞ=O]&sFDΤC?VʛZ$_NfbrStmngN &Ad)u"W$D@$bA8-=tBd'N &m1KFH/@RA*urM}[fvw"wtD!&vu%I CJ_K4o]FYzw\/DY.bs]S0t'Gyk((VO$4-碅+7„M$}K9x޳MRK v~e,I xŋ_Ep |s>x%}]Vxo[n~Z?ݜ|q]8zFJMJq|>nNٸwM}>T.gc} hMguw}#׮ᗏ>·3N=kgr}}6=>lپ-۷swIG 7~C("k~q{)z+u]xS89e,Qe;jڔ8;=#7@qGA[5zun\b%,$6Da{4xD؄F ]Gdiŏ3xRADeUÝJG'ʮYNF_NjVPբRm2`hOևk (ͪ R :dˊD_䲷UOD>o`c[X1֝;Ńk;n>>9ssl۹K)/YΦǶg>FG8r[y(G7.yoOFɆ-[`Y[6p̺u}.e_1ۻG{,d y091K'K{/{M kz]y)pRR7ƍ{Ͽ~,H7g?9[o9x35W\AT+u~pM0q̺u|k ^ 9&4mUc EL3[ זd-ȮA )q&mti#xӽQGIY! ^oZ%g ̎.~:vg[p.hiI:o q4ohs mvח#_KDDvtڄCQIԘcD"T^  i B0xz%"WMZsI>R^ʬ6K4l.}K@SR*!/}+S h-`H'SV 2T.I-w^VoTdv FJ>56Escn4tNO)XVKxG엿r*F v9| O|wk[|E#=/=qcG`ҥwgpdQkrg0:2B'LN^JG"u}td$o 9p~9ÉG͋9G+;(B"JJWft(YiNպ^X&Byev/N!ډs@A.:o>W@$~ҳO  |gķ,m" / _{x1/nAL_мu#N'%1ǓՂVgƢEvOV\t%|_SpY(*e}Hwhs$bOPUꈛ3 j'])V⊫îFAS;fșb{Cy+W`Lz\4.OCCY-e&wl,E/ 1MhQk4~osQGqܑG˘;v;NqVdy'j>-۷s>߿".8lNy^eK{^6oΏn\}5vg#mٱ7|S8jZffgyhF7]YRp}o3+صw/:s=_*N;D|ꗼ>$z=KW=}33|88ӻY^>|ϺaԔCqt&1HJd#gB9xxRf_ujRbGR j'Q3Ft@IT$DQ $ᓨ73,gc*h?RA r6n ;!7_XFUü/y'Ms=?_n իVr?}}O {WJݲظRI\0gqG9n1A &X$hNT_ m53*/倠ojH_&3{  2iUlۮ6D2r> .SW'JkތC<j1-m&cTCڣ|=ݕz5wVR6f qLl ޥ0[àsƽq_r f;$e3uա$gMTVkPB$%QLBQ-y >^i8iXj`$ngH7yl 1$X iVU_{)kgp(^͠o\q,9_Err<3[p_yѲ/u}!M7:tҁl܃Q aQJX5`1#g}ĭ έcCdtI ӟG7GXwQ vvWV=0 mڭ!=!@!nwAT&+V,g=]| 7m_j.x WMzj*3H)}˗i>QGe.|n6>i6|c/oxt~d=  /8?Wq?%篦CR9N0 ]"-X<ERĵx:'l>RpDN.\V35dc;vp7t r6S,/&r\/>(, ȍ!@ߺ8 [! B< 2qJ'b |2 / @6bjNWA yNHdݡOFAz{Y˦K~E/ c0==ö۹E@g>{%~ռw/ ~zJsΧ?vǝ|Wp“ctdV7ō75^O}n8 oʤ4YI0 pq2lmIY8L4$M:u\YLUcf*J^qա^X`0s('.z}TjGC9=Qi*J`Iaƒl?\ kuUn]'}tYOi-NE^~)7L wnkAhX*b̹T`m8bhHAF݀x ٜ@H9AF~2*Pކ!hA\h6 ڄi Dm@n!B !{SFБ]8S=zK^LR[o_[d  5=3xΟߕֽuvJp}F+ٺmu x3J>UJ;"ĸ ,C^Z(li-f~r),oNJѯӉ*w(srivGc\72KU=awaoD# ]RN$ZC6;YN9Tr}d`1COt~Bbo}3O;U˗1l}i[qøciV-_珸[ϵXڢnX,^Eѳ)݃ 0џ"b@׽>QcTb%3RYQ%F.7A#m؋C}d [K`""MkX&G!CB"<Q8dJL_Tկs/իy {pcNf=uԑ{Vu㧜d}[ё6m2T$ W:n9SN&lqB_ o!" $.i솎0Yҧ^\Zx|'Ljz@T=SRJV \ѹD ,f'5)'DBfcR9+l~1ˎ={W+3-.Vx+Z4Zza]9TcD 0UZ2nJu% J@Wz@V{{ DfVMJ<3J3XEel3rjOQ T,"@ *^ 2 6 SְwV1~T/9I #9x.O◾|-mR|Jw ?e%#MsOofjjOO@P 8yNE#z87;) 1hQ&_.SN.v!za%Rl8ѻPn C+ߌٸFxaŧyٞ19jc Ԩ 8yb=NߙpPadxHtI L9a% 1PY@0@Z@eMZm)tzBabX׿R4T3RdB&ŠI΅*tx Dӑ7m51kam]4mU } '$lӣWFzo4:h ^T&aWg(R-UE,&!3kAT]Ť2D0I iF6$^zU @HsSDڎeCpK,nyHdIM}oCnd(@ *ϸb]o##lq+7diz~ ( wֆ\)mv;1 S̹K<2=WjfR$"vԿ}0PkP&AxӤM$ncL.g{@J6OoǺ א5#u&ѐ2.I `Y`3[f4ōz[Tˮi{^NV]NaSY;"Ǻ!b|7m:2ĕ/^ؾ`t9 G'P+{=qSZPkGV6YD*5-!(Jsw0v ޷?yΛvْþpDڈӛ7,͐L~r {}iˑxgq'(eKfhnqP7ä'N=^Qc$a)kliÒ8H HT?jk?m2!^NC4.uHs"Mu|.XT,?>|d jTҔ,FO5]jPh좶~ XXT*[QTt`"g`8-sا-8yPK5 ?⌨ܚ@ ʿ{CԞ"Dghg#Nfk| - O%u'rQ%/&8dyD^Eae6m򫔖lI~r+/ȖVW 'emNPnUۆU6YvBݍN LȞ_0%aRim$vH>od- ֵ#=+,%{A|v(dtLп*ٷBuEvBUVOE )KDtr>51j V6#1>+nb֩h)ƅ崍v&ItXJjӳJRQcT쒤^9J-cHZv} _SEnVD!l@i]B$~"aҡv Cɝ= zPGh0U8f+a45׏ښVQ\Qᷚ>z(I*tZ6I4hoQ|7;qW_/PovsEnPh"m 'lM%'[(@E.K8kE0eV1(dոOw>fHm;O;{cJBW"O;ͯTb8}`E;!6ƧNX0m30ʏVfUY0NНnRj D":bF0,"? \P̿}1l3sy K/=o"( tB_Q.-L R_bg&`*o1QXjUp]B#2Gfzg(3'H;i3]`xHTyo\u2qʰ!i~ @;]A+jR ,Rty4gQ*w*j6U $AZ,<Ƥ)Ar# [bԈFUu@#ۡj}OSVĥ?eעވ UH haPŵK*.U^c(l'F0KZxK( @ofovV:9 i8,[JWfrGN;:q8M.Bn@liDua/L鍕]-92wʷBԾ =oHԾ߉ʚwdLxY8-y͈#6رsUĿɅMkW| %FY2lVވ9.i>+JUh(cdشu(@Tg>v J 喿;$\wkp-qÏBO|;ѣF1+ykjYf`#o`;EMϴ*N*+dc[qZ4iަa c:P~&G~>q}fĨ .(N Pb)DD)fdK'!E~Io IDAT$M):C<1 kFo]HD dc:$B!V}+[TLZoʘU5Fmܠh4;z`^'ln*J*]wG\u8嘯pyr_⤳J6 _g_rGfξrTe~YOe3{iseS(Yb|^eѲ|OrApօ=vک bj"؈eV;bxj_[ҙ)kM77Y%X`ل4,Ab2xH~1+G0iz3b,!J.ZrJDF@S E(.8q˿s\$ mI4O: ƹyRAB Jĭ-0K~`)k,oS/W0kE1i)\c$Z5%u1\xPhe,1($S|:WjcELNeȔ2U0b=a P~uqhX凒ˆ1'8@O?Q>'ׇ7<2w5]]?Von}inǢeod꧎{Lo,EE ¾Q;_Zi:bQ SCZ*̚(*sˊT\ȧM͆680n nG%~?zW4_#q .%XS(fD{RR!\P~er+vR dLmN;\RDy_I;'*MAcz.F(fSKAY:ؐ)f[hh+Ȳ3f~D%K#TzYB2\ޠ[JVd-BY= #ڐ@ǒfQJyٰ d`h.Q%Khnj]~}Z[[jחVek__##l?v{5ѣF\1i8Z[yqˆXPMLt;Jo\כ8ڦSXM? 3'^;SFN&O%h93(|Z:g`~&܍-!'Kq}7s2Ȯx b-t%'li=wX[K:6cD?ͣoaYa_c=ijY*wGߠ#`=SOe=q]s/~̤{ռ{.ǽ9lva{?Rem򣳾V'ѵnx%tn%3NYa3 @M2fbb56 ѮE"i;PXis-Zq#k-6ca2l/Z|t*HD{+u4FtŭP#L(+=ɸ6n tڹ uj*#M_\ϸo[Xf ufG~K$Bduh+c)~;5cpGKh5Нx>4|(>vg~=>@T*^{='2>w6XnYd)x͕~臸G<˨#v0LJ!IiX(6ELCHcye hHXwՓH"bs Nu3Buѯ;JYG0Iw5=%ѣ+Wk"L(+kWR f0 sɓxsD.oSE3o/]Gvv*Ͻ@Kݔ!cI_ ; f#/Y?~Z.OG 9s'8zwxqo)= EH hWu}/ê>bɑ&qUVY\@i 3>.N&ҁ: J?xBu':@W_+ϛ#?1b ~Gf|c2a8v ˖< @?jl\F 'AYP(Y)H%rݮ Fin镉‚Z aBB܊iɲP> J"Rmxi>䠷?vy'no&(W#֬[GG[:p8{OvS,7n'gsqu̘3s@@͗j <@*, ])6,Qt!& @hˀb*BNWaqmq4nO2̕&zqW#Y< $$$lZr8,dR0(Xy@f)V.^@ٽh >VrbW 2;|O>cQ8lL\V|,bV(*1N߁_Syy|oѡj2A%y.LyjVb&%HW*FIlRb[xi}cUkd8>@HŵPYSE%:]&r"nOR{Ԣu5:# yN='6Ӱ/E^>\eƛ:uc8oQqk|cӨ,D  %-)Ԡ C 'ԀyٿX'p&1 D3HYݬRSd2LkE6#rY@- d2'*n/:Y/gVRZ{ΤuxZ;ȴkPߌ: ([;EDA y~ɝro>z3ׯ瓟(/5H;l<7l,y4v3Ͽ"-2z! ;=9_%_zdVV+4TQ%Xm  RUU*Է)~ߤ1XQ3zf3pQ (!7u@-ۡotPsMWYTV[6+/R'/GzY׮|j&/c];;zE.XUh2zDC0Oc,3+IqJA[:g @SrQ3I%.k.7+mq5o=O>64/+{Ns>k(wpAD?}w @LED E^7Q,V~'`ɓ E &D2-V6M%Af(5 dV'rܪ=d8C,[O;SOD>h.֬]˒oV^ͷN?EV]z. _#gWSSC™$Y~`a=G1[@W_45AHWKdzhۦT?SޕKS1:1pP;EiUJfU7ס_#m6(c1wPHE)h&.X?{/I=+z@}v *NtX.9A0B42*BkC]wÈ*qzuCw߽[LbDNFt2VLzq 'n@c,pD5U,dBmM{U&fMJtGDONbΰrA1> 2::irAu7{/l?`=gE_x.=fsߚ6 YCiX~ #|32AdG#GmS;M--||V Oel :PnRPB,)".ORyG_x}.˞AVMqQ(LK߶g=iQ`$)!;$TNP[* ̒N:yPZJ 6[8 & ܭFSGSMzT,Ƣ3zTzvuE2*)dd"w |1%xb%|0 ZtjoyA"3H4m% N玚Qӹ5BrM0] Y4|8 3t Dn#dsMd!2F=G{|%Af;dnrn@I /&(S9)Oڲ2ge?_WKгa.c[$Ŏ1Ȳ^D"LshZ*R>L;&Cb~c&P [2:/K +b|m܅kt B&PVc5 xԘ7pQqͼ5MIWDTPF*V_O3jC9IQ9_Ԡ$fq )k\#s1 \1 TŔ!@o CrYdXz'ȑqȀh!ZP;zK۴!qlִ>M@nN)]2%YJ)q$8dEmg%d*@NJ5K\IKX,OZlM 3k; b\8hrSR'tºC Tݶ1aS%WwS">y6Qȗطp5}#%^m ڍϘ[1ǻ_kfӲS?( "7c i 0'֑LdcCl|-U7T/Օxw)m".E6_?6oSФX֤ժ_RwZwȆN\2&G\)`,TNM"3 1CAz=A2doA d~ +'sK('e/^hQr+]LOsNv\ a()pUJYY,ߵnUҴFOWS0*vUVNU7%@Wᑕf^Rc_!Pm{R:6~"M('3qH1&셉X% Nʅ4O{`o$IW58>շFcLڕ3*Ly.]96ppRgGI8@XG Ξm#";z",NّPue:J{q~lN JVW32+H7Юz/W1p K7 U/BC_I2b $Vc$53SZ(H¹iDVҥ!9DD-0j.@3 >UbQI-pOZV`V,Ҋw+o}:A R|Z^'ymBJ0cU(9e]*_Z28}lp1`eL Wrqye2#Bq | k'[6qaid#3j"މ%Jȵ rn2d= k;q;hRgx7Q>ݝ.lF-q*WtSplEiߡ fRKo-٤fx5X.&ڀ|fNJ4z!/ e:Q#bւMg]| wq9*6lH:PvWC[~)vR']sD Sc/o&*G<Umd gf'+q|1XZӌCxJppHH&e2@L6"I%zlg5qSALIӨq x&,E@0e]>2sTYY?S&JMTkU - KǤl4w xk*`QaFӓi̤}8`Pkka'Xy ]+% mV/[@Z O@^ 5NR].-,mAtި,[VS€/ۃ8*KL!bTmٌQbZfsҲDKPeR(ai5+4Ԉ. ZiU{M W őa_5ͷiFDa ;)Cf7GJЌFl..@2eVȆStZO(n[|_3/ k)&C-3Bdۈa с ֿo>ˆZhm:ƀa%~.CtI830hbaш߻.ވp6r58(2p2aD&ϚcDpGvHӡ"W)T6wUgf0ҡ(t3ٲ^9=@@c}k;lr)pp%Ntv_GV51\V(Rs+k4= Cx DhuX1rluQLJez#)C6Tik5r߸m1f7 9ijǏc'7o5LL V_AI3 mؐ]nݮrEǮ(|nl0۷MҊ/u{Ct;DyG: wGvﯹ[p=X3?[vw{_e#}٩X,rZ8pym۠\qNʧ?r8w84zzegԈh1G0hI۶lTQ 0[SJ,jM9(t2iD:\w9mqAhK1;r9ekJB@^` %}Sr}9bL>[.RJ_5,V8deEB3ƁrEXw#*"|IV/[9bwb,Vǹ*U @+Y"рP|R\D(urU5cTD ɖ|bQ6Wz;MXDg~/ jξ{}|iikeWkAlIFajw.475Nk5)AC_Ql5qga6oinf\p,^Isڱ_;} 8Ɂ{.u6r>=N<]ۃQ>c.`oiv)vsJMoǩى5){VcaIdذ-]ʺn 9V;4̙hZ[0J3)oĻ5Βf2NRHHo m']Սf㲛PK n؟K="䪶k_5mR/O&j[wT8H/ }<'ǟ~3Om3W^L<֖AW ̜+>SS~aDQW " 蜧q^3>Cǘ.Z/~{ݚA3ƿg^z_]>Lv-wI|,"^X R4i*#:n*!x %+Q S07A\mNS*RH>][fzFθƩXr6%U$I欚|4gQ8+ivZkf4QhOHҡmJR^$ (M?NRJXaax,^{: $s<}[fEM IDAT]q]w#)/?MM<ē70@./e:۸期G7LM8EՊ_9'Pu]VwuQ\67?4?xٜk ?_'6͊5k۸G@$|(wn>~qU|-'f]7zK^uҕ+jV[ΈX,&-)o}*3;ԨG0fؓ#ŝ8sFd4ϙPPQJƦw7i!J7b՛Pn|NJo?K@VcAF~$S.ܶM @H;!ySr"vOӀF@4}#xIBI51HBݛ H?J^EAB2=UzfsfO=Sͣi;_3uV45˯p׎c[o' 9+_?czRW)pforōl{/}Cıc{cʔI[SN>?_(,YS~~.?'~'mO\uYϣ_m|s'fD8壪M_/]5K#Gx ?IzmCMfz-W[BjE`0&nh,mKa]AC#J2bA|ܑ%2xAֶ/$>> p*\=J'9^<_UCW~Ι=Uu$[KɞꬹϰǴBܔcvep0s堙壈3wݕͣT*QGonYf-Lj׳rZ.LNchk^9simnfCGۆGzSIǙ{̽V젷VÇnkzV]7!{o`,[vWfvj");z4\eCO/ /jOŃ:Uk2˯nC9{z'5/ͪk۬B@e}Zx ʹ(`P[rn* 㔑4ze &M2H .oC=0-I裀@KiFg?RتGJGJぁڸUP9dP!ZSV$D]7s>ЖnPBq#Ur^'Hnznmo-0v /-\ƾ^%^^NN8Bp!+G-,mmm>?yi|옯ϫߩ:9|`kOx9zQ^9磌hkmCg!8Bӿ]+&و~1ѣFܬ :o,]ʜyxt\t~mVv&>Q;g|SYz 9b"֩H$_̧~kk}PSc kcȞ:sM_S5ocM@ރxbd_wECJ g1Ix}j}e7JBfFXkWAV x e02 KC&IN(Kw lи,}S*@k*I[S=wƔɓx쩧kΞ?N+${;[_8tvwSE}o~~S&oџ(]z=,g&>6LS}r~r>3K~!97 ~{,_K:ST}#3v{ڷ|NŹ˲8}'fOqS8?ϻ@lW\!a SȊ)n>Lz4| 3cmT*xҦ@ !CGoCM ߆SXob]Ls&[֛HSَTRWl'x)߱n'xO;'#7q(`ʔ=!$_oP:~AVu>h( ^B༦|c 3؃Ggϩް_z>io+Xj%|`S%|*z9wV_/QK/L7m5=vމGf)3EѺ`ŪeO TƎNedg']{ /lƳ_ ŗ33g0nh7~"y:ە \Dg^HLND|H'bU"I8FjO'LWI"?-%&05bԸc7L[9- |5Ķzm%J1TEQUU#e5Z+oy؇5ٚbo{]q cưvS(K\s띕qラf}p?rm @ <2{w 2e MM#;:8t}<K%OϳlNS~YMG[:p61#:lw嚵L;֖fFttoy/47SRqiS@nd9PP ŧF6ķZL 5>/Tg툛~+&9owobomJى§4㔪ʞ` 8bcuԥPˈ1JIeǮ՟7][ PlQJcZWR'[|ǫЕ7`>ıcX۽o_-?7@>Äknvߧy8ҷ g~kLjKNi5>6<.X]Jǎ3;7ꛋ8gop-30„1c;̋΢eoqѵ?7?4'}ga=wsUW}/~6{B斠 rY8X&CO_Ͽ!vo|SlocɊ\q-~T#~ĭch4GH5cFlޯa1OAJgUMW^({y\{_7[\;rڞꮜNOɁ[<0oFbCO*&i7 R̾}Dd'o>t ڙiNNl޼3ٜ11B9LȁVDwp/P0־Pab g?6gFnumo=i n>ůSyڤRUc,xqKo$iQiV3x)i,ƙ5شMy wPu+]?W;ks%q 0;qm}'w6pKۮ xU^( Qܶ.U &imE)^=cmKHvr BG"]"J۞]9&1@<&kf躌P#Ro)ڃ hKM 1>x~~^v:y+$'܊ip0cǨ c'L˪rFm_YK:1Ue҂onWHԇ_P,]3j~I.wSQ#XceȳKT㋈Iߠ| ВƲ0n[G=h[9$Z3T(m4LAlj0X]cp9 J`1 6kg54 ɂ55#IH&w(H(Jv) oYwYS,񾑂16V 1%n6m ;@VEPe3CBC c (JrXFx"ρAD'4[Pb 9 Z |R{ IPe of*yD[ɤ ( 7 _E[)}_9oam#Ej nKVJ _0_JK.e@IlZ->}MIռaIa(Iost@{ds 3!.(ٰ ˭Yy[ޟ7zbI xYL.fvh)mjbɺњ-Jklb&1@T/$&>TZ_Ql#>Xj"ZBI[imUrM(6ˏ)0/M Z|I:zU ;Dj 3؆ѸGYS\@̒h*adhin"ߟ ]li*b&ɽa4 :FAS;d ğȜ&WD94M71m!Ӥ<" f=ٕ,m5`@kT$ H~D/*B^vZ8HRq2 GûrzHDC>Ȅn%ԏ_`94}t8px_v?( 2z],#y;ߝ-YM87ΖQ?o qʱZz=IShT2IIoH]6%הa#he]3038Sp0st sV٘BS %pJ .壒Y"YB6̸K4Q nۈ)o; a#cS6bPZQ5¢d里ě(hqݮ/XEf@xv5_mBS1^Va0Mjn2& b協5ΦK􆹢ri4%Vai CEP%z%I^|t,iàW77b%{ ]2З *{/&$uY֟( (\pl5v NhRf!TJD2-($%`@@^$ %υ>1(P&rf ^(/y;oݧBGfoQv(Y IDATuN։ -H 1boȝ-3O7/uw;F/,CXS ClgfE]2u ^3$<-"2H uP[qT]oܣp(.Zd&e1'e"plj񈡸)ۙ]5/,A_M||`/ipWKtu}i.In) rScm:N }y2m*\[葬߰ҎK^cY"_^d_zJH$d3dK[ Wlf$$!#)DFVsjK׼bFrYv~;VZm,8j2]yWo$e5`H[سou+ g^o@kdh8#7<_}w$ לc{q).Fh=),([݋Rc2*Wj7 Pm@F8SkP_՞$]R떶X:5**۱iPQXUH_}Ts˱3mT&߭JH1ɚBΉ6:Q]Ћ{8f߻YJP/}v,h 3F,eպՔAsH.;[&#{ft+nge.,d=ZKѾl1ły8el8@ .I-AJ(nQъY` }Bλ2~vE'L?/?É_;Y5UN݆~k^*rs1_޿̬B.;7^͋sO7_ˎ>U9"λr~~'֊_1e-襧t&Ǣc=v ^z#?>uYӵݼuW]nU_PKstvuo4?8o4vƄx9̗ǟn{\)N~?atv2; XkYX*V'Ե*܉\zQkҩd թ *Iꔚ|IdB哬ϦuU&fm3PI%?`C6;*񨺴9m_.FfZ#ٓN>Jj'cFhΌTn"9) I}9>cAXWaX&gCf g#9 t(ST-؁tPA[djCW /]UkYX'_b=ЃހEJpPp=~pnԚ|;/}-&N|?O:r--\L4s.~{Ϭɝ~<7E[hkk+.~3FɅXYW0vͪkx|Xu[:5b pU1u兗{d\poXz =?/wOwT,O xmmm\_/9r:lph7-YxZyR":c&_uܶ~|+0'NDq/~V鮖Я*6>m:ycmQ}7bQKzUw\'oS*Q14q{=C! pl z;QFM5VڰJ޲] ySRZHV dM }L D9ijQx}dK8LhQta#zء# ]Mqa/]H{5[w%KtA4 Atfr=0=X bP*&nM"X:X֏C5NVAT |}f=:Z[[}wqĈ5kӿW$!|8a<^vW_#9|&۫3~ܟ7t7t;l-Gg񃟞Kkk yp~ȈN^xeYÏ=ΆkzN=k 兗+t⑀n_,t5sͯ؏GK~+7t;;l7\HDFބJBVjP8(E`;#0Tի\`#RU)mWCCñ2P&֢XgO.0Mt #xr$7dxP3NI#@{֡I@a՝7NN(,@"٘1,6` `,N'xŃdHBh4qS{GB3gwݧt B0V6]ZjP]v>s;zz7IZ ,psE+RvwjK&;<#ۀ=wKh'߿%~{#?077?|_;wfaa5Wr҉';[QXfM_qq}Ίǿ\ugv~>g _^/_<䧴W8fuIa-V 0׸{ٟk.ck `'D+NJ[B2 E4=ך8,׉FA `7"۬MQ tT.$PiЧ(>ۤ4H 1'(҄5,}}Bu҅L:?pmPc`:ѩPZ_H2/iKC}\v8mCmڢ}r)DWO5i=E~m aٯԛ1δy.Y$qI> KMJ7H!X)-T!`u%MYwEhr\(A[jd7n1hlo;'?u|ٰ~SSٻÇp-x&*v٫@n'گ$n&NF?:qN]*rnvvN9͏>9a d6YÉ5~kO!yM3l@l'|<ф(b[%^LaPm 881&5J3[c620%!|5"W&78 u"K96vIJm.6oWZcpE|NP5GuF.f,9KQ}P>ZLТmIZS"HˍUvǑ(*SE6=\(A(։ιc\F,f!-W'T$XF)_}|YIOeX#ǖ 3" }xN]N=$'8m rE.!XYCڒ9+Irh6@JD ɏrՕW0G>g{=߼}/,K5x+A"c-bG0tW'mDSx1(CݑZM`N7Mp+XW؟_S Q"}ؕAQRCc#HXH*W N|5{~D烌SӖo2ڀh|z.<>2_S?P?nPV' (h6b=xYMUbQ8u?/X\N}cx`ul\;.<d|x=g8/X=pd8 ibDPDz$VuJf>]]Zq]92蟘;+y:/j>w'}~;Ir\&H2m +&p]e䅠y7Zk1P'#ЖlA %/ UpV ȥ핮KAJ6N(2=b51 g|(>e逦)KE*OzXC!@zA1"3ɱ 6{KS7c|vK/G:P3"~}?|SkˍKW1SoԻA5evlB>ܤ!Շ}{zkۊCM({_EtA1 _G)Q30 !U@`g*i"|TmH:fbJ2 i1 3%'Iob)놮n6Zr(gLIgC皵s1

`ng-j+3hwt Ҏ$.fz!F},ykYr5/ɅH'9&mڱ cyضg-AFhɷD!vqry<< ku(:H N$L6\hq`Yr W928iAԐ-eP0VJ!qn*r}^b{\ր/ z3G E`@NsZIDXz9PmHҭ;efXO;T|"X\:y2Ui7I ~K )Ej)L*ȉ(ZQ0Ux &j&6D5QMR(9DLebwpiz'XM$2iWJCB>A\hV;y]lUL5=\!yo5YrȲҿ>e mu RUܙ[Fփ/oL5-qX85% 6@A5܊ʄ +ØX51뫤lфz{}Fm`u+cZ#;}O!acЩiMB#a~`޲䉂>t?Ib@ $v%#рVqq ĸ%TDX'q5@6q.U!@ r@1O=:K%Au\$K:iEM,G؉#IyA 2I吵\9#9m1]iP3f0䪯KgE*+J7A JR l I\n:k"ȕ8xŻgi\"ESEv>"lE$fd()I\W* HaԡvEFmK'P'*$8[LֶT䯢[2۷D"a┅٤#EZ]zeM[rltޚO.Z`r5"ī!|6;"]$w gXⅧs4շodmh-!-ql;d# S$3a" !r3)?7pJuZy̎HIԨpmUb! wp"k T񡯒RbIaBMM3j?ŌگN` kܡ(n#PtɆYƖMk0U&;ﳭYr"PnP|:eZUX]>5LWUX]:xuWlt ۝~HTf 1xHWpK^{1]q'z6l߬X)v 9.}/rT`kc0iXN`D#@.NF8CXRO&:, xHر@=PSHwcGpJn`V^>X6f* gJ7:ÒT~+#}ASNVqƿP~bzH髡B 1C>]!9U6Ɣ=96WRJ{.P$'Z6BQʏ#XTNzm<;?LuWfDp\.ݣ,] nA<9+忼'7[lr`zuY3 %e1 ,e.X`[!|:AS@MGnNLM`n qJ6X zjȤHJ'7ZLWRaNT}IW:~¦P͈LLĥMuMDSM,3f˟H 6!RpV|]K\B_XH[ dha$Xa0X)LYya3g'qFҩ-:EI[ ].]G^*2r%<64ZVٱQ(066<!46Bj!JjN9?6NJs/.`OE-G|8eD눈* C,&5D$֏uѽT?I`&S¸:C&oۛxO'*d>(}ρL㧩O4>"Uڶ -dJu"IVo?sB<}+ / #]|?0qƳ8+YfG|>ʝw|Dž^ȧ/Xf5չ9D>OzK"t{^_Ss>&9s ?c?`g H:TiG'vm3gm٫q)gi)8 =#sm\rc-j6˵6V.tj IDAT8AJ7˜K:mpNaK!LWz/)]2S+n9HKkOGhFmF&/֞VdGUH~l> dbTv!6WqB>x_Uq(syr<9qDKOJ\u=6vԀD_n2, d',F%$o3k4*]Pe5r6זE†}⏑'q}I_}5b4^w_g~sT֝s _7bӸs8c:.lvλ*&^U>.}sO?7\KK(J|7|p+.r?)y Y?G8gR*ou=1A"XS MJddIXwŹiy8>z[S#RR@! ԸBrB9P(ji4[4 w&=QҴ9qgd59>Hu;*J89aΐ0 5g*LՍR1Q:\3+o7tu 3gwq?N~V9o-YtlH#$Χt~7qWs-rN'rEf"WB&^kBJՠvDj5P΁']^ Y(8') }>\1m7~sw%$q[￝7UM-=e C$pFI$L0O:܍8a$B%,1 qê<w,V)۫ѥhSqu7&L]艓s+KVoPCs J☣w"+SBO{ m2#oއl,ǹo `~|7c5mLCJ/Ku gjxr,ߪzְqØX@GE6%x.lSuyϿ=Yx/\u=Fc|Vcɗ9?ǡ{aq Q 09A(h*v!)PY  !d۶p 7Qرs7 ۩Yvu>sz[@7_z;'lXk ؽw?й?^FչV. _m蔊X3&@3@e;A%VuK?EzgT%6/`Dp6vkIZbV?հ9mBXRUhE"Ykm5V)3^d?R.Q)Xը>eBߍPV,uƐWL/ ,y 6N+3kK?MɏV%(K'Z& e(Nau:<#eD raMP%\jq` 'q*}:/g=rsWS(Ba JPY?\Ez +A_A~Z$48Fgg!c fjnԬI)}G? }q~LNNX!8jSOW23pH<<$OM8Y 6U+ȡM#z>nOD&H&T^ehB6vu'2FRG qdPFr<711666xH@rJbRJ{Y G}7R]eΛaGgBOPƖm \r6Ih2&#@8y$B{+ eȃ,@P:6\9Z<!=h Ǒ  ~fggYv4 ajz=?´;XW4Мe.;v[ƫ/ p&-9SwW4>5r^58:e~fN=$v>E˅=B\)B0|Eb3w7x^̞}A?l pՕWp_vC_'vÇO~mwof! " $B:*HzqM9@[LF'!م_DJ%@0 DP[|\ፐ@cru0$Jؘ/|?''UZk(P>6L'+IhZRha+mlW39flڼM%vs .(A2Ik `#z }61f涴܀[1A#a0qpr:*6[_S:Effpϓ9iy-S<R$wya3D(fҫ#)TQ2;ͤ 4aiD3c ,VAa@|z6ѷM[iA$XΪ]X]h/)uM4A5zMNΡX(P(r8ӭoxGh4[; N~HB+LUm~Tu\@g'W/syBB>ׯBt2VKlYb!fEyr-J?ħ*dKb03($LMsg?DdPg&]8Gn}tV|v/0,oy0~}S; 69pXr)g{WJA;'_{gv2\cM+ط4GVR2`2.얒p4{O\B>6 3#'pO=y͋q&'G^i>= 뉬 0C;B:bi1{c*h{F31f핆ZK8.dX,P(4O;tC>bFE/tN¨IݪvG- =zI$ٗ;+uXW,(u@vrryJj@բhj8u_)m.5iX&P.?jlCga*|1'YXh`CWT ™Z Ҫ.1Ӿ*vf ,-Z pw&=ρLohN5$]\|y<__'#BzT_ ŰAac.[a+ߚ|Cs^M $}LMM0=5!pmT(0=9\Ns-2 '7oT]E)rL$RKZb/T9K&֭JB?i$151ĸqCBPrt!QxvLDb%'Z,=>o1QC019N}_d\Yons<6n`)WzD[;2i,;!l{v)[53[FMYUҕgrReIG\*:!Xp[hoa:.TU%m'}FAF냏=ƶie{LM\|:)S$1!r1M,<W+ ʷNHꐵ&ㄢ 4]㿧N Ķ.H},ݖ7nOGvb1hI$.4|)<px=v^ʱ BxR8tql*Xn9Ɯq Z.||M>b ];'>C`hy-bCR#V 5+`?-z#By")&U[5 :(|l4 %E! nb9vNUIg51rrևRFj|ۦX{\% Pծ#|J9v6N8XܯjIPMLUps})ꯩH熩~hwHEfXHn Ƭ۠R8FW8;\otB^H$\`*&fureSJtͬ5|*KIЖίh-iKc%T[4ʎtKE᎜X؆mecݲx%Uʌ,|Pd IT+>lNv.՝X7MFV-ldEx0&b4ꏣ$Π(N,)k,t_txmy~.M!n/H^-2c!S(SH`R> D;fayrL`zcRXGp&c R9 #&gH1+K8:WIѺR+d&[>r=g\nXfԎ{дDNq_prDC DN[ Id#8y*ԑ8^vФ, "ʇv +X:]n ˯&[ &],1ZaʨSh/+;*6TGx]fOQę1D̯19Dkw3OV($tPP!eG[,EwT2ПfD_ CL&wXvu}&@& G*嚾c#W.jx$WM߉r9;D &hnms ?M:[ʊT566}I['qa/+Y5jIG:LAyAm٬Y8k`sqڏ3hX%lqoӫ0RfpDJf(igHRšt_ti-,m@ jTD.$`ShI!?|M`,sr2fLbL}ΌUXX\ ɞD#%jޢ BP*f!(h>W=dInˎͅtp2 2)Q"fI/PY#Y҄A$B׬5$qa2Pt]dNBEdFH \a`jȸ#2hzPi^wT=I@cZ P ec[,Ǚ N(T(o 6E0Mkunb$N^ S(-cKnsBb@U}I\eIL뇱,DSd">}g bY^) WIM +=r:쬫6)r/}NP7$J ԯŤMt7r%aDlzֳY$t-C+= <{!&4P$CQO@W GÙ ~ $<#{1Շc$„9i0bS 4՛@=9b lBWo1L]̧V+\1JMOyc_SPM?sx)'lh*' >MUdz_Txכ~WE|]h|-oO")V׏2\3x~z}Q2Va9fR,70~/dc590 r>`TL:tǷWF8 jMӁHhZ"YE0LJJ3LpGvS v]@4[|V jcY V7@[mf15bO쿕β3ΖP7焀\ 7I6^|ޝB!%q&8^E-\.ٖ}|՛>-wNFc^DTtiZ>_G>_%30rh^qP6 (*Ttx eRf/6 >CȄ^2u|{NQ,M<ӆSPE̯XUFO'6T1mnqVtQp%[Ge4 &@밂ŤTkDA& 􋕆a|ب o''yϼ׾a⍤"AjUbU/J" 4E|w;kBImFpN&gV^Gr 䢳ׇ鎻/~مŠOҩn \udW'~"Ra9IIh*" "%%nqqڡ8葷\0p뵅H;X"eĔ4Y*ǃM.SJR4FGQpV񒑲AESD|7Kx^xbpR*ByG8QP^|.{΅uWDAȌU$6R͎K ׾u/"KFAS&MRou# o`GRFUwCGd&?@(Ů쨂KW |aW3m|8/DPh`fo_o!9|Q}]SEGŴ\SFEt&4v xvflW Mk H"XVq1D.a;bLce,B2%%Ӆ m6H( Ǐ$L{u2c[O#2@5HVܭڎH&`D.H*UM7a\ERԄ6x &וo v/~|$>d_"k'@ɢ0II.Ԯ}tړnW]X Ri0];LŠx{H?$ ʪ_{bvj˗(eJ H[`'(Z!a&09F 'qPK2 #oY&#}Wzf"!dlnurh8}/~ǚMuҘƦ81%rd[\=r|DZf_=8a۵1.,.-7p3~y}u'#iR!90߲Į=AB<Ζ#=qZu>?|[| .+ч؂h=G`ݾ-0lɛ B-hB8V8XW3BO ܧ77 CM'C G#jAʴ:{ eG'4Dw4^|.}c:^l5Z6R1xԳ]{Wh2+ S"}`\NiR5=83UѬ=fl)kQ SY0a0bjhCn6фYNSXYLA*I"qFl6MDH4HO5YfV _XZҞuCy~ԋ׼$ڗazLHhmenSw©j_M{Dl]iC+TCH5A"ز7nߺnF@3ylO&}Hˑ6?6+h[d 6Ju7l4~{0&,arw(~u__~}N_pn7xɥX /aN O®*Bw"%MeI`ZYʄ8Jކ3#q坦7m4g^) j~Yol" %fO#kQm Jł[A c\iZ,,.2^D8^9mMK鎻ܗ&_/tɏ-baS zʟ4[ TR96l6ҙueLL%%s;W }^o| ~Q9o-Wb%; Ñp_s QB%bjd4a{,#ϐFȐPW ,bVpJ,# PT 8YAjU^oI\QEԉz?x;\ByZU }Ac*V?v{\씅3/$7Q\ >J17Z4>׷`Ĕ`&Ž5)qg)V#XauVas6 xApS'@+ZW_z`!o~mZ~θt~oxd{.,8έ|k_F.Exy+gc ֲPܖ-)#nƭ&J̵P0G!q*΄JT9bw z*3Ӥׁ%10w,b0|A`lh4["'z_LjER&U Oh:$.Uְ-k핍fS2þl/6v[] ~mDh{`X=Šm[cJҬOCXćB:ofq~ iA2FRa$;'8<u-?|Yrj L۬ \7NmPWdWk(=uV^ɺ𸨲'qeS46L`<^8i3N ?I`:D⮧YRQg6EE!hPL _Wi#!pAchP|m"1IwV&|Fe\1qjׯ(tvTb15jMaPQ'aBgCw^mvM&V=€&CbIB_(%hF1\Ǽ0O, J qi%?R}Jc.;U -%me ҴrV%*zʱP>ՠ#ӔGuY\191fJ Jb6x|L3Ja *־eYwVoJG+Z8q]jKܳ@[KjY`X`4tDxпAc-kzLbhWV-1A9N"4b~eH!h̰$GfX7O|z2rtlM2={OlK%ls{w_½q۽NcWYPo3Q*'?&/Oi9:6y`Ұ EAbGM,Tb%ζzZ707id?asjx,&ytGF㒇E3.XO^r  U*4-:"'ft^g^]?+j"`& rfy˵8h_iwʭr{I 3?)Z'PLuڨm4EJ?l<NCTY\_==\I(Y<t8 H|Y}dw[@MqӁ\ìsemÞV޻@s /6947z\Qu}{wp0F0 % < %i肎\2C$KM85" űC|P C ³ZA\׋lLƏ'U OR .OkÉ{R) x cMVMZCuK䴘1Sn)^q=1w $-F3NMaS< IT8C0)¬ aD62|qח| v TV=)C[wϐ0LChI輰>XZr~_rŞu[hJl`~q=|+ LB ZiВXyKItEގ/(H(6و|>Q)%@ E䤝f+U1QE>(C`;#ޝDzAflF=hq"m`nRTr?TOU;e'KjcБǻ`P6N&xˉmda$'y_k,qfni@ XluX`-uhYPt%yK,|e Ia,,.Q,KA26^oD^#P9T*[f0}X]fr|T'ZOi]u6Z=1"`v]eRC攁MZz? jBLalÂ&k '&6p:mE˜I59NWy><@"'dW\̉O ײ%w|-w-OrFJ@TJlPw%M*_At ۜcӬt".ˬ[3Ά:;nksydaKJ9= E*cJu}拼u[pC܇Xw6slX'sXZht1'_yӿ|ox5W ^7)>?CRfi>wo }?z^3)<̢rҹ?ӡ4i,k}X hz!EU#EmՁG~%6'+G\8ۣ8q yXJ.>y+Wݛػk7NcGؽw7s͗v ?z&'yΛimvCwL5YjO{S༳O?S/=̨.)x#!p"I! xP_SZJ?RMMA^D접n,7e%Dy-ʲ! jUO s!F'>?5=:9S^%lmbADDP3YY\^=9_u-5I:ih'Is5]H1!4qy9wHl6Z%Sg>}?i'}Tdw_: Fgz(LnрQyLlXEէЬUp?#?|E~yl${wn/}Wĕ(8M r9+iHA%'-Vy*t/ՂO ⇷{l:m.s[pxJmB{zV/\xLMN|v?~og\v7׽—w]13{_wع{7vسwy۸_Ϗ1}4uȄ%״c$vF@Zq#_=KkۆJX7ڡȤd }`$6A49`0^D׉|\]aǍKoziR V GT3eח8H_"G#: Z#s}IV /P躏*ou-}6VE3䱕;*?0 Ij$#m(nG:,~dӟrąhb_㦯|--č:\p e^T*e9N۰ ?{oUijY6SL1=HBÛnBK!@*[vu)?s̙=̜+|{ffgmֳ m[[Zpܦyh(ɦ#7V2 IDAT1Wp׶J-sCtffYɓN0: Y89I#֭`pp_S&=c+/Ŷ_9?v|Fj'?}{s7O_Mlo N˽~xl;F`6Nc՚kW۲Mτv:_7}]{]W+[آhͷ΁3 GoO7W5`7 I/)YҤv(&"6KR(7HG(RĚqOܴOeq |ػ'êC;V28r X욚_*{yh~;ӟbu@ȹKlX"^}3[6{4ra&ctѩ"O/Bu;[Ƃ9ov{yjmpB6hn,oɁ9&f?+o.9oϿz^1<2rl|7l4{إs_Jo:5:4~7M0߅n 7Yi-J A_z{Ԥ{ +DH}k|Qg MY)|IR!@BA,|Dt(`"41F E:o?5ΗKe )GL JҸO*Vyt1"ʔ˭O"yi #<Ɍ/j蚢~J<|i/8տߞϹѱqt;ʲ K7OB[NHwY{:-pǷvqN㼗 q&۟b??{ӛ32R ]o} [JJ@'u'=#p ^A~,fhW&(p=^j)5SG$Q_{QփDIXJ˻.Yir-ihC bgrʀDr;tYPp$"Q#WQ7VgtEs@ hͣ "b7Y}N$r k6hd*4§~"#j M'n:&(n1=oOzՎ9?V(ʙЋWL􄍮G ٽuWG237)~1Vy,8d^'eutuϹ19N>-[A_f'eq'`FdG2cժUs`,m%a]p2RK)}7L̀,BƖb|20Jl2$Nl/@1>sҡ0-@w`: o?uאz̜iWh )Un\_o">/NOOCM5+AY]d`i/w,(㌨{ˣo+ ;IKc8~̯P!-XKAm' 7H̛y4i˭SmоO$2hEd #dd!Y~E=ㆶ2{׼#aw/oF&xe} b[xG`hQ,rsOǞ5x|Gv[g`hG r{F>Vd {nPYc)A=Hs)}`[*PDָh& eov'q<ؗPLb>Q3opDF[#F_yHe N!' !x)$[JY*jj0VBh,?OOa]MREJE{ @JDNȘٖ%GnEy&7o`vhgGg?n,:lg'VqεXL,y眅57}O>+,~q vHvLYo\nN<8>še#(%YHg1&][`7e7^rFJt^]\һ=xD3JZH`;po#8AL`v9"m28@U[)b]?NSr*^X39%aI 8Z^Cxi& C@l VLc0"^Ni.pfL6sd8G_G/?v7my4}Rb ߻.~+HGb5iϳ\O6_Mro/tfzI),_pԙ/aGeiS`: ax4QRM%˥c(tlbEV'[[t|)VzlLn= ._ 2Ԥo>|AD2U. SF;אަK2?cE6%2!Hd!+NE'I[TK=oAy7a1rdܒI傊IFݯ0jޢ5}"ܨt[jaU,_Šjkj-c9)sgqZ͟^v:k;'3)ǜIN&4=;wpS8uR]ed9X^ifG]={lsN)aeGL"K_rTfδ+K$aG HbA{Jh+_z".0󭂑Wa;C _ R5@Xp!Z5еWhfIw &i{68"=M·кw*$QbUS}e:PꃺNϞn)Qfd|JqFnz"f \pZN[\{'{iurR r̺#s:'8wwaIxA-|t!x)i+؜!}߾ ǧ_d~ =K(e&9,nܿ48}:&qSإ.MKM;f:]LXXFhYmle,y9kEa#~_R.Go CR{?h "Puڰ?$Q=o4<^T6FQv0>GRo|lw) Jmx,V%+bER;6?|~ͻ_} ̿GɲGo~,ogϖG ˖'N{82}ܵc79PHJdg *\4@bՍj6Q/44V[PwDM"8ro0j480@@^QHk9"EKԢn#Gš;\~,c:V3s *T,_{Go`.` }>XNyEWqgcf/X ɉ'KG?{ gaB7`ey mF CcJ\ zJR o'F[)Kئ0vkւ'ڳ.)yiy1ɛqUQDNMq Jse>4ޛI^ȋ@oI^ =< |zߟvZ áx WWjrAn*V i_k_u8(mhDvt`ncCDrʕ=qeww>>BFN22qw?s%b\%/x-g <;fȵ LSiȊ!6-Yƒ[nJ mݽVYogBP QBR+N.3;UM"ڲ8EI{]Q$=77qDŽ8$ DQ .4*_)g/ yYI@ ڈt*7FwO\;il@EUѨ!^7a$6e0\ TuK!!AཛP)L}v'_^c毲ۊ]Pv>t .hT=)h4/dQ}N:H>c=S.Bo G}eKg 361T1᜕k_3.|='}]# ,\ͱYX`Ytutޞn~tÍ, o 8(;Dn;xmHG(й8L{+WXa˻26bV̴Dөc| {uҪ)N+yI.~p%t)fƧ%)fHXB5^ B\KѸa3@6cVگE uFK3AKSgE̠nUMU8\mAo+WHˬ|ʹ ș/ X+7ʘHU3T6fDyMI RcvMȐ#!n޳2W@QD% }4rY{aY$.^/uN)tpSȱ-S@tf'yN~ .~y٫xxᭈLlg˖"lq$NE!<0l\cv/io+'dbi}=S#l3܌]ѽz=k$0a5_RdwSj%2F>Ǎ"`ɛiyAI7;L[xn0FkB3皒&'|a5)yQ\ i@ r/u͜I D0dD.f.\6啞 7O!Ɍ"nΦ~);o(2}l"zdͱxt<ˊ6<b__#:4G>9|>'>u9F@kWnd~>qܱGC aQG=֬fdt~lyb[Z7g!KNN=!d ]l)K5/UD\ǶPKUK4&UTy "0D9ͥQRzTf\J<ni)E-"'CY]hhO1o+.ᦖӅ) e>7]h8zL` &fim`.?Ohw\8yevg]όPf/o^}WJp7hR]E埢dIbFTpz[M8}޷8mvF*лes%ZK8i`pN6 }59Ł"]KS8b rdr6NY2110u 3˹r,f/y/Kl(#9L br3&ƙ-tQBvP:1Nh֧~ w[˖,a75vfggYfo`ꕴX||"r So-& `MPJ `"PB橣¾g$0)yp;6 ɪ% ]\c9m $m-jMDBbԵ4_Cb0OI^@ {L7c %x]|DChf7QCB EL$6%H8mG^1͖ N5kW2An, s ũ',aIdz`;RBӓc=t` 4#?Pctny׭e ;JǦӦlޑ923N}.ǪЛ׆лSK[[b8)%rPw!-޴.y쉭߄V IDATH#Vޣ7Oj7<$+-$y 1'7.ڒ~iX^)bf6_eTǙȑLN>f?ZT75_x6?(mJNiOtOܱvϽ83 ۠HaH {FbhUHQ73ʲanC./asN?9Q$ *+͚KzxՋ>yH$'罈>V},#ríw261ٜl!s۴-|\6 4b5(aY[8c (s\oX @ SW+ug,/A )%T84מYά|G}!7X\?F,l:40NP/0=I(OY269>*h`e%ɚB۶8RaY ,S16C]a Knx`vuyC_vaw,Nj.|{y?U)8n u.:0]{ط||\.3t`O|r>(6pkɛڪNp"u6}ęB-q14[I .2@ЀMs+dfy/{4)~狟ĶmT.G"0a|78L*I ~mL$SKzgko-p됹Ύ6'/FUwOxg{@򵏽|.˛?;W֯Ⴓݥ ][R]oX"W_!:`E8A׽T 8F&f$?7F&r9vJ$veY׏N`e=#`(<0+vAM \3 0]62M$q^~|xE7n|Jn!~ު֘@5Ct>-ul~|` e_c4o`-xl%2; `HNeam8H=ͩ/"p^~E>6? 7tJGhJ51U.0 ˽^C`PSm$SȗS5sʻqG,u8njeMNR)1Sb+E8+#145E쀄6V`Þ-{X]Dz谿s`e`,P.80SPaz:`ҁYȶpcVYp[|Ϊ)$֥7!jZP t _Ljq2xBmb7D J} UCK Ss?LP=Β}M6S,Ojj{[Fق6Y&+#[jR}Z7%GI 5*ƝUvԺ5?T'A*%4t0jʖCU)7: ||v%TSșiggG)02], OBkF8t0X$,`tPavrrC{60v LI!"Z&q]e*~8cJ 1zDK*iJ0/yk<?:Ojct_f~Vh\ 39ᔖ Ю`qd~Lȅ!ohl}2}G=}QI ?1KCLdbEJ^{se`tg8ItX)`OѭrDuf]9͹r;@! ķ侤 -c68pdv^/;$a <=+L4Iț!U]BڄN>R79zT' !Jq%ճٸWli:E07'ܻo˗wS; 5]{ibаo6 0A$r Y3FmsQM,C137Rx9K=iv( tk  "bSN` ae {&,7/NC~ATaלO=6DQ3'6 gضcY3NQ2 +6e)AΆCc 2u(TZ9jyNG%p1T i iL Omcc *<~0f4z٬^}C^oM!hЀ1:_ٲ} ĨU&-3廀z?j|z!VTdҭ,ߜ uKW~PoGt<wPnpxht[#IfUj4=Phk%z4Al֘6Z+y '/ v"1gI~;v+zwwFզ8~"ʏ?ōꢤnh)9QÉBb6FF;5S xtuT&gf4IW>xg5 ~|ukسo?%țJ$.;/XLGT5GJ@803%L0%)%YQ"Wؗ;f ,ru`R98Jo&aup=LF8(P?ѪqkD4 ʖEbi!qT%3ɛO3$6P67?-O(jZo|_YsN?yC ݑlPCsr1Y/9+!@ LdLӻ3pAFSIpq(J3pJ4̫)ȗΒnN?>RP,wG\U?4L\ek1c(N8^2 FRU%YbޒA;ڡl ;I*A `ۜ;P}weθNknY%b$T)ѷi0eo9b iAfU-I>TɎHntyO=JF>T.,_̇1hT ?\s趻රh<Eu[6)wGA_c!hv"҈T5/fT5!AzJTO/}=]w\L{ bD0.f]Lfp|Dn[HOi,^ϮTrn7yf? I^œﶬ$k\-d%}8 Dއ6\:LX\& Yw9eN"8Ut/]k34FV ~"H( ^T<E ;׹D9əi*3G4 \v^F5Ŧ7`8:&*Bٓbde(-˦2>y4U Ml>H3Q[eS j]W_G6 xIϿ1c<*%S皇g [U4Rkiз: FŖ:i7T8ZALCHZiP$a2ˉ%uR)(#dn[C1B[Mb.{Ax!)c/k!T]}{0½AeUCIc友,WM@߽ăIB ,HM7ES5b6#E4ܗiy71_VĬD^V/])8]I; L#0;ț7n;z fMLυ'áL|K\HL2#52mUg>8d*3~cߋ/J5?bbFpLQהõUć&((/h]êܠbó%Le`Ccѽ(,fq0q"pE:]&qQjR_3fc5K]'nf>@-T(@=1I;֪ bHuA'x06Ѐ4/^>KʣL>Ŝ5c9 HQD[*O]_"QD1I6TϧՖu3+ #e꾦hQT ;Q}Vqd#Ԥ>p\(܈^,rĩ䡖6a0i^[U$)ۉ69H7zR̋44 cCFUA!o \J3S4Y*%q() Vp?ΨέUK*U>C f]Bר2YiY95 igL4&n%1E8i&1aa$cj, q32wiz^TFYs8 9rh>X͏6ncTMhuPz[^DypL2$Ψz, kzA+c3)N6HEJm@A#ݎ,u@)"隂ryeIpBp=[&qвĬƬI;$H. "|SbE:髤NRBJ6+2:4J{uꢪQiK],A4՟x?W>9/?a:F?z^c 7jZOhtİP h,*ņrW%QIf<\_q&nᲸI"o R7h&tYLєZ)]'nWނFa#k%~PC# ɛ9DTm; 8S&4cWu?+@(uɛ_tgZE][U}D Jlv:A}HV=A)n@ IuT]۾i[.V7VM-NY$NI:r(P(nkxL FQ:F>Q)<Ӣ5 P7sN%4ⴝV㨇|d3?OdԌ |z43_'kh:Pts 1% j,4̶&x)h mYV&苈 Lk0a?UDQOj"A㶍?o)ЯVzsQY$.eѯSԾd!4Jد(}b1%D4n<"O'6m)UL%l#gA@\]u PIdzO(:RWr?r=$I#Tj`TO%?IÓqZ!a+DA.^VS7z@ڸ˷U"q^G<&D }!4 9L%ϟ:cg T*iM5cGxѥ 1xZ6=CU&Tfb D636H{;X| Ay߬\:aL6IKZ0Cc%nN# k*ihY N$^F16IE5#h74B&I ';L %`;t*ةI$oj~7K]0# ɛYj8#r$Fn,oᑞ%}r*|`($h4[<]Fgd Y06iKlt$>O/7 kitI _"XI)"qH 턕e{d)5u܅/nJpBGIH,s/NvRܦaAA0R,@}y{Oʘy_d{h!z[L&IcISv}1eE*"*O!W9IHe 8=QY&G1TJ0p~?0 T[<&Ŵ SjM13DP pEH){C &}Lc.iH qP(y& ˂\FW ^D#5~DDZd\~`VEPsa u- GlN(лP?{bi% 9'L)WCM/Ml?T_}$.@ ]KFS ~D.I[AR' !GF$1C fHeM*|LyʀVBiY}y1‚2b,l d_*1;h '4* Iat/Ob1r@2 e(Uqe9^նԊE$IGt1kz'm8H$XCEJ8B"qpdmIŒG`AXdlIq#Q> G88m Om-O ĻH$kozI+ө8^dd E$opp(ZDFdal)O.ھjQ8yʩ䃍9ï q+=+*ap˒H%BJM!H* yn %T2t:^i?U Ԉ\E_qP!'bFZ)c$ޯ|[7x{OJ/U~%Ə/eN*6*fxE IDATJ4o;`b,0iĞq(z '}6r9 LFĢILI@XiFU+|Jĵo$!@!NM$aS-SG^a aOaA!@H&FFA ` )jtpqH`[;HIIJ JB"BPB 8BPAT$H N{ |ꃔsQ#MfCE8d>ԞFTRxNLVt\ZR[@i|:&,18D*F>cI_7=]ttSdl sEgbxdRQGL1 j&m"͒f6maY8CRTP,p'^QuU#n=78Xͧbl2=˶e3d3z`Y ä+KzxfwͲ淔Uu/ԐQ~ln5yw "EID/9i!$HN! 6r)2B"%%۝E q1C0#)KTXUV`KyFG%B+֧cIEi>LRܤ0[JTt2R%S+hJHaHTz&9$4ҪiFvz2*Mf2:3:;Y| Cc gxt\釞 r,B|.%,LƦhcXbvHT 7 ^M @q@^!Pz.wJvΐϹ犥ssKh#j` q\VGl&5nS6IhV0$<2a0ӒEIJPQUcHwZm-alH,.t]sTp2$RBbYT$Nj3A$=pwYS=o. $ӆw%ȭOGoA\TRXQ p 0V>&#o*Bm fBNAn {IG{G_/y U,aiCcl߹ٚY -ۦ!hߺL Re+Rƾ)% 5^ކFD!_;cV%o%͒f)JLx>gܶ][Vd^\g+) 9ݐ@KQ) `Q8ZQp>R"澤.sH*B ¥[%^8Q#|ԉ#,*@Y:TT6j/)ArKHKT?(m|o ӍٽNy"h8Ÿ*ԄQ>ı} b(ܸhYl".KHK`"jR9+}vmٶ!jKJ (tu7-egLL0;7@y+X ?/?R)TySq/hIOMNO3;["T WחGA~kg!?7,L"l\Do8MT)lRTY]$:CT9o-b,9KPPX̒\BXFHQUs4%H. _u ԍ> lRΊ>Bm]I ]HM7)5NίN@GLh D9bPf)l\O>c=IKG{m نmD3*Do dy VhQގeYLΟ܄oP;<=ɜ"N #r~X"%n^Y$.^g`e,괿Sݴ}?O ԿQ]Niۂ%qIq(9.+J8ܗHGV́wfmե !,AFP%;;!a,$ 3-b BXѝc YJ0(MV2ʴ͙ |A!H 8O" Cqڕ"'Rh8CB5R054# :u"q41?%3*Q+u 'O@G KO,U{/+im34o0u1FQVhÚސ?L^ *hRA0UJ ;VSۨ_jH-q|.߯pY] gNL^n1d 'zs\_qW?5ꍦ/wXZt"  a[`g2ؖ-,l%UJ}jncTb*b"cd,e,r"oYV!/, $k~@J,,±mJŜ=7vo]bO=x+Xj s9ͼ/}s4[ | )qt+*ʈ=zbAD>ٸ{6]]yZ(tum[9/F%XBpeF_!IEJ}l:;= ZGK%۶{5* 5u毲SZ7cxr/ &S(]9<Y{dm% E ܷPmZ%ڸEaA޲Zڊtp #T`:Smx/PoV}!e&Sx߾N8K pc&?=|_Z)Y^⠯pbqzYG%no(UF##\Cfo@Vn@ f\aĸ㮰0$M~oXw$ >!=t4WK䚍cq'D@1|vj; x4wR'X(Ƭ5Ƨ/`L0]C6=N,4^ Jbrdl²t@:*,DX6r@)QmS}n !"'O؀iK]^Y ljUǏX w?dYݴC$ E|]M-|@mlP n:6&q O\VQU Nx 9Фʹ&DP;F~F U",,;r^}3D. ?#$=s,L+ia:E'R&-(Iⴥ6e26 8/UtP)[*]& ]>H wNX)%t(K{~%tA՞kӂ=qsϢPp)':~ϯ^q׿x [gů~ !_b:;y靼]c{X#֯e냷p >wrǐz\O3:6˸톫׾E/|.˖sO]gʇ]\R7x .u?/|WE󜗾N?\J(aVw!\<8Yߺ ij0}UBǼle>q"]:X06>ɝ=57U+% .v5lٶK?O4fPUI'N_Fïq?Uo3% `a|^e,k9lɇ/7F'ÒR()N8O:Fn1f sOf F䄧prHN ;#%Kw#B v߃ҽ\w<1MYV3Egg333\7_|SR򗼀' x_/o m׾) /_/zYfff+U?~ygײtwu+.s6/"|@ XSDR"oY)ׇkb!GqQB2@1br Ņpm\p 7+-!1W,' _dYYPшٸ\+S.X#bvAj@WHeX/ SFyܘ }+ V[5 w}6y_7z d.CC*bH>HOV1eܿr58սoop(ꔘ!ĭJ$-~"KX'BdK0*sq-q:u1B fppxM..;u|SkS{?ɯ~=.|hokc  ? `|bus>N9s{{4˖.s}AK1zrB7\_XW_s=w ?7?:A&o:H&& pUrqo>} buGZ8Woh}93:G_û:~IC u7R(WEy}{dlo\[A+^5/yfq|oo/TlGU?rlț*5V( #q}u|qSa8i}-}X^Yv߀a.SZBnk+-.L=@ /},y]-1lЍ' ,J9j̩deOߖ=KmdU'9C,Oe.ՅJF| D4ݻv*+99ss8xz>^ގ+x/>oz}6>H;x/<{+\k>E݇ g> G%cgu[xk|gdSe;w-M'tgC[ Jo*vr̊d:B%][Ħ%pNԪ$.2xn/cvv=W3^>_ /%5o?O~ak!xЉH/hFrougKIaz_J:?0YQ]7;x%ZrE$>Ċ"!)k3UԷ+^[-,y`Rhc>R'8eʎ%1d C,I ҅Sx6-3-q($%3;tpᖟy'/7nW'>_*ۏ`x 033_xK_`SO|_O<"rܦ= mũƵ{g^{Yn[UչmJca-vmXfQnk*y!"t +4|n-S$N>}%߻GIa?ΆvxTh{X3<u"ӑm59,F60+HY]Ûba { ێH ڐ) FB&k;9dT[-*͙IGS,_nC Txxqp$OӃŹEN'=7} <?ǫxk_׼ħ`'?ԧEy䉏M߸Ub3o-xkyO]`qȥ0b֥Z!ׯ~k״fś2,Yᖷwݷ3<}@P}Gw(GStKFtc'~%~٪g#[}e)`rE{" TpFjϟ{_Fd2IM7?nYh;gFK~>r?{ONVޕπ7M8O+mӟXHm{B ׸+vTuZ o8YMڕ^iobV.Jly)VJ?PmTl+dPI[sM'(&KǴ@qA١Jk MC_~ь) '㐈3׺Ӗ%3c'S- Di]'l>>YA;tٮ,oCޘ >̞C" Hz)E=vZ`cF@R&&yNݾ&*AI[|MY0rBX(d,%|4'#Ox/~/u_:(NpryYˇX.A*lj`1pRMXWRr5#Y;{A_Hv'N\Y;0ш_rOT$VAaEXQ %X,\`{  7Y3apph3@>9Z2NN7q`vK~s\2ɈZͮ? qO.N)Oy3uNiQlІOwH$`,]t{q1dd'#x"8 q2 h}TQM]_{=ҊqO_\s,O?IhBp.ܪY 8w U_핝*lrcoCD^Nƥ-W(pg+?w4]Us<|Aǃwx+PJ0|z䆊YŲ%8RHdCWlBN#u|`='nDS?/z"NiʢńX~OM V, 44SS-*4b/#'S9r?+Gu&c0q*}(Nx8 d-XY\W+~޵?ZYƋ/S“׽~oą1GFXxd,sXТQ򦄐7[Wv,ZuV+MP%n1g#t5E[%?ck0G} 9z| O.h`u f?Q|+XʙƿXbf2_=|T0&!"sH%y?FXLAL ڨia1j!H iT* 7[T0h+!VQ19xK)9q8O[,!NEoƥ#dq?H!ұc ލ>{y0Q>o>^~1=cqDH߷cQdێ 5 ؾ߿ǯػo.7 0FGơpm\HPV:qL kq(xtsxӷ[0FsNO;3ܻwAIqUNpB,eME\ Ѣhm;!N">^,mD5X1`8E@eG".wnw ŰhmV׻hzUݮ];S#djCvq %/cYZ<}#avy_G S3x }9/q+KK`qE z].zbmm }=y gvڸg(D^gq 7~_];g1b! \ 'Go3TCkv8אּ1o nB쉅]'Ik]u^\p޹ꔵQu׽{ɊB(YX^b~NȉWKLGXJyyv/0(u&#MVہbQb|H`:bO  ]7?c|%mۂӃ),7h!@py|/!9Ns>Smw-iU/a׃3LO16%?]" A(,Jڮ63wA?6VnoU)yֻv _O&><ϳoEEYГJ{uCYL7Fؚ" {`"D 8| D|tX>l0i`Hށ;gm`XhP8>#F| >w㊥sycenFν;_SO#q˷}x+< 8tm\ô}޵x/8v xA8aqYĉxw}ovDuκTlsW_ *>$ }{w. YvkmZ:~ TQ, pYI\4 r GaV9qm;,Cf" NT-&IDX딣ȐMqr`[m`#eMorBanO|胤=Hvi&4t7S[qurxKjmE0LXy${X Csw>#1rx mp38^oó4{ފ_|p[ޅ^D]o箻Q{G>qXڗ;Mf|q"O,3T\{[UơjW!5[*4.YodYM9:3 9 %-Ϗ@;0rᣕ6k}(]D7ZY' W#p2wEhU*&ST_E.8쌞Шcd eWwgQqiPMZ8:,ܐ:ZR詂- 8!Cp bt^.p@ 0oC/^E#BYsˆJe%3)tod{rKX[G{|7a];q7*ӶZ^`fz سyN..*Ax$1x+5 TlDӴk*F1HqV7զě}@TʴfjBO<|K+x9gaѪ9 p"~wz$0^R"#0̔| /kk;p}asa\J5Vdf*Eo0Hջdϒ]ws WU\IvE*K&4ʘ[|TDU9B")}÷W`~n6g%ٱYjgUaNbMCIěF֔p+ֹ2?p,Uk]{s6<3 b:?zbݟ P0vv!^n~XyU[13[ wZ8 H=1{$v(*ڭS@aFo0@K7b b˜SOH[o^J4ۛ+4dܢJD%9Ɠ̍znbp(\(q3e>NV7wd:;cqq }3ޮ豠 VW; 8gc};xEoSSA>w!7`烝p縨 NVw2̈́[rҸĭQ:18VPnO&is6,cvvS6Qnu,%H7W2WG~AnhK9(Np E3ppf6TӮu(?iq%k! A190mQq e䷏v;@+oϱ'~;V@]IcQ9ZaFmGc*`KEi㿵6HڞolI0l2i`hbl\160#fpO*'͎)uAT+? qj|K>1=~;8r~߆w0C;vo}pϽ{˳Q4*o=a!p.; W>kS,8ahTU c_];fM{>i:Oԉcio٣ToZCT?6kKQi,ެc4s IRն8\Վ3*Lкe>(MZUYqU}S(otfə"]q2G0z_s]ouZGV+K5l F I9݂ ߌv zS," 8ܻܿLm+~T8Xb->g'#kQ<c4` h$K׳1|Leug ڍ{ νbvnn;o>1 1UNbȮ /Lwpj'jv^V z> ƏTp,7;&;Ve8^,^70sb%C׋Ʌ3֯F]a^i@;i&\fvLSg9@OI^H$X L oO%d6?H1 ?a`|G27qܻ2z.1;;ys,(8{H&SFö˞C_G=>7U n{x5:;̺͕,a/. jLbäX\Z7X2oM0<ﻩ]IC)JYfBlJf,*LJKa0 %4*g 8;HV.F Kv*ÑB׵$x\X۩;*QvƺI5n$ƨL~~z)|1WB"q,:؇g(N[K~k|áp.LLR3q.,je+'rl'5p÷c`,BJ z ?|L " JA1ee~ _ PfzHl 8[i=:e6&MTOJi 8M\z=6<*E)&jH꾲z(nrVh_ܔ&wvGX蹢.d6%"JjtXLAT-0g^Yy b+2bͩWJ}vД=y?>KrS6OAH#3򉣆eq48:ɯ3\0rN Z]UDkԙ>IA[!'] 7]V4`,7oQl) 8KF0I؜]]7-ӶQ+URqz9ge:Ѧ*fܼL"jS/C6 Q sЦJ}Q#Wj?%*A&WЍ-δzP`C̹c[Z2/+i6$Rd5' F6QFY8eoFˠ߈zQybt[ZP *[6q>,p[8r+к PSۖW Bt湮Hc-$}vP{,VOx`RŤ"F0/Lc qJ Utj 8԰xe$Rٌ{p"ތ ˫\, ]k}z"dǤlE谟thBϑxNx`MT`QIqM'MI"6!p`Cˢ>LV:ź4Ι yAB)̌MԵU_לK#Lriʖq7 ~ō4UIokds{[]v 1o3 Htz\}&w~Q`Z҆5mxEMG0cA:\DzM #\2re9+G*[-9,VR@Lp0&:f0^ lJOI"n~ 1pZ_ToG'qzi3f[R9 Mʬp򌬖aͼ: 5B O:O O*&QgbRx +-ʧW* @X/RU.n gUxBvNvWoV7&Nq3G~l05lwo^hvLɬ ,OзyӢAn#>jD96j[3\+&*[Ѷi$j*> e09mAc:%KW5%|NDu!p_֗]Ce_D[D魑nc] P~.Yoǹj*-:vsA:XL e.b*+veX<$P6uIM՝]xAwzF]h6-PNsZ񭊊:].++ kə`{KqRc H5#Aɧ/O }mq Դ,F'=L9MeCm6"f6ָnNY7ڴ/}lxSSUf?i/- ouŅK-ªVK{? j+6q/,;AXWXIB,툻rր+Q?N (aD)3Rn 6N3w$+MtԖVfۈk!6y̶ޏgC9G8ԇe{۶cFmx3g,릈7)l5p𡾀YQlJDfAWGo.,V2 kHli_huu }=Q,UJ4lϯ%)JnXDpUmR W~K-śž>ƯQ\>MC6ہ l* `l\#N|{Xh=xjQk 3`A 0Z-Q `ˆc׶'!, Cx~"8 v  :̺!&)Mi ݹ~2F 0VGY?ifWrMr) {u_aWeGyjaN("g0ˆca~8sLCކc3ByV 1|NMq>Zaq>Ns~/a}]0?7s1C18C+ny`-?3G@;xvֲNeԬK un~ I9@.&E׽qքŋiH1ڦa*`̌ʣ:e5W6y-&׺ []DRFBXPŨVt mkMuE몎vs]; q1p鰠ڬ^˴$6k'(ĭrWjRA&D_yjuG$S!g z!aCصcARoVC+sV~oyXnG>f};^mpO=w } NX=mE7< 1<#i]1W^nh5|MuvwPe܈&FVH5G''e:%k93,Y 6,hZ@V/fP50Tx7MX.hb%̢eƇbPihRî1zaX6lF{й6jDΪgb! 3 y {G -'#m? qx` f@Gh]޼n_T [#=`0<~0Fy`qr >`!`c8g(Jy-UPSOs =M:wٴ2gMm*8c_m+ȼuy݃Ź*ۮ~mM 4kS}m!7kt7$zf#rڙ4MVCU5&*^Afv a=S]=ǒb惑.',ɛd}q%rVkF{PVad!6J_l(H\Ypfo;/|(q8G%8aXcx "N9GNa 6`+8 "<>q4056LMm؏y Kb:VT 0GXdgL&'7IG6vy^2pBbJ֩9tco\Vׯ}_pKImj*(ʶD9b_'WlƮ(p$Fj|*K%gGbW)HPy±L3P$c_l;,.ܢϢϤ@d1N1>A nAN  B<< !sAGsc{ w-it1n?*r [ g:s s,X{`~?' @<T[qjB70.'@ivLa}MӮ}kA]@fFyw5%ԛ|R5$sG:)|z=p !WD֪"f%xY6 F ;%[ W[g`~kMΡX$Yca24mʕ4i-.`sxE'͜N[!'y1pѫ[png>Cr ?cOp0R5&TkL4jV?:4hx4w؁>Ga(&ED@xXSA/ p6:~%7C?U[`Wǁ1D4gƘ <Gp<Z\Ǐ=bVhM!F;!0c?y>Qv'[n{Ql\)#3ܝ5=g)jJ*,e;ncۙThPk^9U[Ż2hT_ZeSgWjWД8jO%4m)Al6&NZm[deJö@MZdڿZLT5ۗy[ߏ#iPeT%&F5)⬺\>Y*qʿ#wn뙙X]]C̫[ӔX/Bq,A^ qSTLj#tqa[^m>J4@9Za1Ly}~!Кq|yqȱyv[z=>!z`#AaB[wʫ'YnmJ낼&h4gES4u9a U4T]_71J1X3^Dߔᔪ"'Dqc+loٶ}~9;;SSEz_z!pqּG`O~lG {ؿc<(Fy |t<1xñ>NFqZ3 |><۷Y4{>/ BLN᪛)w/}xW]{'<>nFwU}o~kW {؅/}k|6 |x;8up:(Ѭ ä 8%`ȚȦ]\ aTCLP;,s{Ff6G=?XBrDy̌M}'"u.TE)5mʊ<͊Ѯ:vU~PŰQ gMsUYՑŽ iTs5dul;V6Xy`+v߿:31ZY\$(tDթ$Q˦Qf#;~;{k=?7w~ S՚E-,vOa*o++-.rXh@;˜c51[aƘk4Ͱq1yv8pska0,q28='Nֻ4}O~#􅿌'>16?+0i]+k'vڡ.H4 J ;0$V -KLi׮s%@oE͠ o: Y^dߌ [XD5RVi3; PS"ĵk 43UR` v)ox+Ϝ$c["6+Q z7[Ekْ6#7>+̀Ydˀ.S_+u\ncvf+GߏeE|ɶl؛wTXTB-?2Jǹt n>7?w\>`1fY aB\H `S^ۃk}?уX E`1Ћcz <~R?xcy}o 8✳pust{= @3D>)^;!_z~켇>o~ {;=g*]n Eݻv`OW^y|>T.@8-YbqWUmDM7'؊~* )IDATiιM.ڵ#KfV 8*DkG ,lJ77y}h7]/v"^]ii&qo39r9ʈ6"@<QX&)lI3Yb&O3ry`e鶽߹ڗnHh(\;urCTW^,MVp+ l8*Kh~=w|=w/x {55վ1٬hbўf-=`f DǺ!MOH!b`v{ DC8qt<~fھmCa !)]a}*ƶОaʽöi3#/A= zfg[X_ mV'{#q __~m~Smۆ#u 󘝝:t 17L뜙J|єp`3m`fV6A LmBZvq2^c2L֨_Pxs~-:+_kV4ۚQ67jxEޑɣwU߿ې,b2@YeEN$tD8Lg1_&w| hk#4  RWd_Q?[镪)E_&a$NwpX4mѸeGBE"AAA+Wny,+McD Sq}f\S)~㍄a$#{8  h*.YqoQah;eĚIqQ{~tM>\8e'jpM$  fɏeߋ8WMsb:Mg#DtT[~Q&Y'ő|9AAAA4rV5R9 EYowmő1#ũŅN#n)#GAAnMM:`|hGd;}:8MFkH̼8  XT#qH[QamۈJ LH\1h'#rQ7Q[s   ) X(DWLzGQ8tlH\G2D dąѸ, 2;r  0CcNJU 4 &ؐIN Wo@1Oqq]fib*HAA8&Fhdo2 7Qlp5Yhj{"&$  bc *т$:S&e?)0S)䇮7U*e Gd8   Y p6rf4.j4N]gagqAAQȦA[~[h[(\QM(0#qtUB8Z>+Ywd   %);%،P="'+m   =l5p? L]T:a =  bPWШFߊuE%+jn%.\Ɖو<~Q   A5&JS%t)1 LrU  hh`@kZufrw-0FAA=:-DbSD)4%t.Xb;   鉦U:yJ 8`EGWf_F  b#ddlYru\~$AAAlEdW}ݯ^7s&A`+T :tAAA&٦aˋ8s!\AAjT*6U%<rv$AAAT(ۑ=ƤIAAS^(*Me҄?.FۚKAAD5&#muڊ1q r.}   &bHi9ä:~jGAA[#&J+‍rż\7AA3Ųhc6Ƥ 8I#  8p!ژHeRةPwAA14!&A6ʩ$D\z*3AAAո]-2N5AC+JAAzSSQH  غL T/M~* AAAN4)N)q:<ӡ  bHAuJELqLOAALXD8݄v<AAAo9   jNg+pAAA8-[V8[x  bpZ <[]l'  S-#ڊ   &-+ڊhу   6k8q)AAACŒ                                                                        ;'lIENDB`amberol-0.10.3/io.bassi.Amberol.json000066400000000000000000000026401443320625200172010ustar00rootroot00000000000000{ "app-id" : "io.bassi.Amberol.Devel", "runtime" : "org.gnome.Platform", "runtime-version" : "master", "sdk" : "org.gnome.Sdk", "sdk-extensions" : [ "org.freedesktop.Sdk.Extension.rust-stable" ], "command" : "amberol", "finish-args" : [ "--share=ipc", "--socket=fallback-x11", "--device=dri", "--socket=wayland", "--socket=pulseaudio", "--filesystem=xdg-music:ro", "--filesystem=xdg-download:ro" ], "build-options" : { "append-path" : "/usr/lib/sdk/rust-stable/bin", "build-args" : [ "--share=network" ], "env" : { "G_MESSAGES_DEBUG" : "none", "RUST_BACKTRACE" : "1", "RUST_LOG" : "amberol=debug,glib=debug" } }, "cleanup" : [ "/include", "/lib/pkgconfig", "/man", "/share/doc", "/share/gtk-doc", "/share/man", "/share/pkgconfig", "*.la", "*.a" ], "modules" : [ { "name" : "amberol", "builddir" : true, "buildsystem" : "meson", "config-opts": [ "-Dprofile=development" ], "sources" : [ { "type" : "git", "url" : "https://gitlab.gnome.org/ebassi/amberol.git" } ] } ] } amberol-0.10.3/meson.build000066400000000000000000000040651443320625200153640ustar00rootroot00000000000000# SPDX-FileCopyrightText: 2022 Emmanuele Bassi # SPDX-License-Identifier: GPL-3.0-or-later project('amberol', 'rust', version: '0.10.3', license: ['GPL-3.0'], meson_version: '>= 0.59.0', default_options: [ 'warning_level=2', ], ) dependency('gtk4', version: '>= 4.10.0') dependency('libadwaita-1', version: '>= 1.2') dependency('gstreamer-1.0', version: '>= 1.20') dependency('gstreamer-audio-1.0', version: '>= 1.20') dependency('gstreamer-player-1.0', version: '>= 1.20') dependency('gstreamer-plugins-base-1.0', version: '>= 1.20') dependency('gstreamer-plugins-bad-1.0', version: '>= 1.20') dependency('gstreamer-bad-audio-1.0', version: '>= 1.20') i18n = import('i18n') gnome = import('gnome') fs = import('fs') cargo = find_program('cargo', required: true) cargo_sources = files( 'Cargo.toml', 'Cargo.lock', ) if get_option('profile') == 'development' profile = '.Devel' if fs.is_dir('.git') vcs_tag = run_command('git', 'rev-parse', '--short', 'HEAD', check: true).stdout().strip() if vcs_tag == '' version_suffix = '-devel' else version_suffix = '-@0@'.format(vcs_tag) endif else version_suffix = '-devel' endif else profile = '' version_suffix = '' endif application_id = 'io.bassi.Amberol@0@'.format(profile) subdir('data') subdir('src') subdir('po') reuse = find_program('reuse', required: false) if reuse.found() test('license', reuse, args:['lint'], workdir: meson.project_source_root(), suite: ['lint'], ) endif meson.add_dist_script( 'build-aux/dist-vendor.sh', meson.project_source_root(), meson.project_build_root() / 'meson-dist' / '@0@-@1@'.format(meson.project_name(), meson.project_version()), ) gnome.post_install( glib_compile_schemas: true, gtk_update_icon_cache: true, update_desktop_database: true, ) summary({ 'prefix': get_option('prefix'), 'libdir': get_option('libdir'), 'datadir': get_option('datadir'), 'bindir': get_option('bindir'), }, section: 'Directories', ) summary({ 'Profile': get_option('profile'), }, section: 'Build options', ) amberol-0.10.3/meson_options.txt000066400000000000000000000003151443320625200166510ustar00rootroot00000000000000# SPDX-FileCopyrightText: 2022 Emmanuele Bassi # SPDX-License-Identifier: GPL-3.0-or-later option ( 'profile', type: 'combo', choices: [ 'default', 'development' ], value: 'default', ) amberol-0.10.3/po/000077500000000000000000000000001443320625200136335ustar00rootroot00000000000000amberol-0.10.3/po/LINGUAS000066400000000000000000000001661443320625200146630ustar00rootroot00000000000000be ca cs da de el en_GB es eu fa fi fr fur gl he hr hu id is it ka ko lt ne nl oc pl pt pt_BR ru sl sr sv tr uk zh_CN amberol-0.10.3/po/POTFILES.in000066400000000000000000000004701443320625200154110ustar00rootroot00000000000000data/io.bassi.Amberol.desktop.in.in data/io.bassi.Amberol.appdata.xml.in.in data/io.bassi.Amberol.gschema.xml src/audio/inhibit_controller.rs src/audio/song.rs src/gtk/help-overlay.ui src/gtk/playback-control.ui src/gtk/playlist-view.ui src/gtk/window.ui src/application.rs src/playback_control.rs src/window.rs amberol-0.10.3/po/be.po000066400000000000000000000336101443320625200145640ustar00rootroot00000000000000# Belarusian translation for amberol. # Copyright (C) 2022 amberol's COPYRIGHT HOLDER # This file is distributed under the same license as the amberol package. # Yuras Shumovich \, 2022. # msgid "" msgstr "" "Project-Id-Version: amberol main\n" "Report-Msgid-Bugs-To: https://gitlab.gnome.org/World/amberol/issues\n" "POT-Creation-Date: 2023-01-16 13:52+0000\n" "PO-Revision-Date: 2023-01-16 21:16+0300\n" "Last-Translator: Yuras Shumovich \n" "Language-Team: Belarusian \n" "Language: be\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: 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: Poedit 3.2.2\n" #: data/io.bassi.Amberol.desktop.in.in:3 #: data/io.bassi.Amberol.appdata.xml.in.in:6 msgid "Amberol" msgstr "Amberol" #: data/io.bassi.Amberol.desktop.in.in:4 msgid "Music Player" msgstr "Музычны прайгравальнік" #. Translators: Search terms to find this application. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! #: data/io.bassi.Amberol.desktop.in.in:12 msgid "music;player;media;audio;playlist;" msgstr "player;музычны;прайгравальнік;мультымедыя;аўдыя;прайграванне;плэер;" #: data/io.bassi.Amberol.appdata.xml.in.in:7 msgid "Plays music, and nothing else" msgstr "Прайграе музыку і больш нічога" #: data/io.bassi.Amberol.appdata.xml.in.in:9 msgid "" "Amberol is a music player with no delusions of grandeur. If you just want to " "play music available on your local system then Amberol is the music player " "you are looking for." msgstr "" "Amberol – гэта музычны прайгравальнік без маніі велічы. Калі вы проста " "хочаце прайграваць музыку з лакальнай сістэмы, Amberol той прайгравальнік, " "які вам трэба." #: data/io.bassi.Amberol.appdata.xml.in.in:14 msgid "Current features:" msgstr "Бягучыя магчымасці:" #: data/io.bassi.Amberol.appdata.xml.in.in:16 msgid "adaptive UI" msgstr "адаптыўны інтэрфейс карыстальніка" #: data/io.bassi.Amberol.appdata.xml.in.in:17 msgid "UI recoloring using the album art" msgstr "змяненне колеру інтэрфейсу згодна з вокладкай" #: data/io.bassi.Amberol.appdata.xml.in.in:18 msgid "drag and drop support to queue songs" msgstr "падтрымка перацягвання для размяшчэння песень у чарзе" #: data/io.bassi.Amberol.appdata.xml.in.in:19 msgid "shuffle and repeat" msgstr "выпадковы парадак і паўтор" #: data/io.bassi.Amberol.appdata.xml.in.in:20 msgid "MPRIS integration" msgstr "Інтэграцыя з MPRIS" #: data/io.bassi.Amberol.appdata.xml.in.in:41 msgid "Emmanuele Bassi" msgstr "Эмануэль Басі (Emmanuele Bassi)" #: src/audio/inhibit_controller.rs:40 msgid "Playback in progress" msgstr "Выконваецца прайграванне" #: src/audio/song.rs:328 msgid "Unknown artist" msgstr "Невядомы выканаўца" #: src/audio/song.rs:335 msgid "Unknown title" msgstr "Невядомая назва" #: src/audio/song.rs:342 msgid "Unknown album" msgstr "Невядомы альбом" #: src/gtk/help-overlay.ui:11 msgctxt "shortcut window" msgid "General" msgstr "Агульныя" #: src/gtk/help-overlay.ui:14 msgctxt "shortcut window" msgid "Toggle primary menu" msgstr "Раскрыць/закрыць асноўнае меню" #: src/gtk/help-overlay.ui:20 msgctxt "shortcut window" msgid "Copy song details to the clipboard" msgstr "Скапіяваць у буфер абмену звесткі песні" #: src/gtk/help-overlay.ui:26 msgctxt "shortcut window" msgid "Show shortcuts" msgstr "Паказаць спалучэнні клавіш" #: src/gtk/help-overlay.ui:32 msgctxt "shortcut window" msgid "Quit" msgstr "Выйсці" #: src/gtk/help-overlay.ui:40 msgctxt "shortcut window" msgid "Playlist" msgstr "Спіс прайгравання" #: src/gtk/help-overlay.ui:43 msgctxt "shortcut window" msgid "Add a song to the playlist" msgstr "Дадаць песню ў спіс прайгравання" #: src/gtk/help-overlay.ui:49 msgctxt "shortcut window" msgid "Add a folder to the playlist" msgstr "Дадаць папку ў спіс прайгравання" #: src/gtk/help-overlay.ui:55 msgctxt "shortcut window" msgid "Clear the playlist" msgstr "Ачысціць спіс прайгравання" #: src/gtk/help-overlay.ui:61 msgctxt "shortcut window" msgid "Toggle the playlist pane" msgstr "Паказаць/схаваць спіс прайгравання" #: src/gtk/help-overlay.ui:67 msgctxt "shortcut window" msgid "Toggle shuffling songs" msgstr "Уключыць/выключыць выпадковы парадак" #: src/gtk/help-overlay.ui:75 msgctxt "shortcut window" msgid "Playback" msgstr "Прайграванне" #: src/gtk/help-overlay.ui:78 msgctxt "shortcut window" msgid "Toggle play/pause" msgstr "Прайграванне/паўза" #: src/gtk/help-overlay.ui:84 msgctxt "shortcut window" msgid "Previous song" msgstr "Папярэдняя песня" #: src/gtk/help-overlay.ui:90 msgctxt "shortcut window" msgid "Next song" msgstr "Наступная песня" #: src/gtk/help-overlay.ui:96 msgctxt "shortcut window" msgid "Seek backwards in the current song" msgstr "Пракруціць назад бягучую песню" #: src/gtk/help-overlay.ui:102 msgctxt "shortcut window" msgid "Seek forward in the current song" msgstr "Пракруціць наперад бягучую песню" #: src/gtk/playback-control.ui:30 msgctxt "a11y" msgid "Elapsed time" msgstr "Прайшло часу" #: src/gtk/playback-control.ui:42 msgctxt "a11y" msgid "Remaining time" msgstr "Засталося часу" #: src/gtk/playback-control.ui:64 msgid "Play the Previous Song" msgstr "Прайграць папярэднюю песню" #: src/gtk/playback-control.ui:69 msgctxt "a11y" msgid "Skip backwards" msgstr "Перайсці да папярэдняй" #: src/gtk/playback-control.ui:78 msgid "Toggle Play" msgstr "Прайграванне/паўза" #: src/gtk/playback-control.ui:84 msgctxt "a11y" msgid "Toggle play" msgstr "Прайграванне/паўза" #: src/gtk/playback-control.ui:93 msgid "Play the Next Song" msgstr "Прайграць наступную песню" #: src/gtk/playback-control.ui:98 msgctxt "a11y" msgid "Skip forward" msgstr "Перайсці да наступнай" #: src/gtk/playback-control.ui:121 msgid "Toggle Playlist" msgstr "Паказаць/схаваць спіс прайгравання" #: src/gtk/playback-control.ui:126 msgctxt "a11y" msgid "Toggle playlist" msgstr "Паказаць/схаваць спіс прайгравання" #: src/gtk/playback-control.ui:135 msgid "Shuffle the Playlist" msgstr "Перамяшаць спіс прайгравання" #: src/gtk/playback-control.ui:137 msgctxt "a11y" msgid "Shuffle" msgstr "Выпадковы парадак" #: src/gtk/playback-control.ui:156 src/playback_control.rs:153 msgid "Enable Repeat" msgstr "Уключыць паўтор" #: src/gtk/playback-control.ui:161 msgctxt "a11y" msgid "Repeat" msgstr "Паўтор" #: src/gtk/playback-control.ui:172 msgid "Main Menu" msgstr "Галоўнае меню" #: src/gtk/playback-control.ui:178 msgctxt "a11y" msgid "Primary menu" msgstr "Асноўнае меню" #: src/gtk/playback-control.ui:194 msgid "Copy" msgstr "Капіраваць" #: src/gtk/playback-control.ui:200 msgid "Add _Song" msgstr "Дадаць _песню" #: src/gtk/playback-control.ui:204 msgid "Add _Folder" msgstr "Дадаць п_апку" #: src/gtk/playback-control.ui:208 msgid "Clear" msgstr "Ачысціць" #: src/gtk/playback-control.ui:214 msgid "_Match Cover Art" msgstr "_Супаставіць з вокладкай" #: src/gtk/playback-control.ui:220 msgid "_ReplayGain" msgstr "Выраўноўванне _гучнасці" #: src/gtk/playback-control.ui:222 msgid "_Album" msgstr "_Альбом" #: src/gtk/playback-control.ui:227 msgid "_Track" msgstr "_Дарожка" #: src/gtk/playback-control.ui:232 msgid "_Off" msgstr "_Выключыць" #: src/gtk/playback-control.ui:240 msgid "_Keyboard Shortcuts" msgstr "_Спалучэнні клавіш" #: src/gtk/playback-control.ui:244 msgid "_About Amberol" msgstr "_Аб праграме" #: src/gtk/playback-control.ui:248 msgid "_Quit" msgstr "_Выйсці" #: src/gtk/playlist-view.ui:19 msgid "Playlist" msgstr "Спісы прайгравання" #: src/gtk/playlist-view.ui:49 msgid "Search Songs in the Playlist" msgstr "Пошук песень у спісе прайгравання" #: src/gtk/playlist-view.ui:61 msgid "Select Songs in the Playlist" msgstr "Выбар песень у спісе прайгравання" #: src/gtk/playlist-view.ui:74 msgid "Close the Playlist" msgstr "Закрыць спіс прайгравання" #: src/gtk/playlist-view.ui:135 msgid "Select All Songs" msgstr "Выбраць усе песні" #: src/gtk/playlist-view.ui:148 msgid "Remove Selected Songs" msgstr "Выдаліць выбраныя песні" #: src/gtk/window.ui:12 msgid "Drop a song to add it to the queue" msgstr "Перацягніце песню, каб дадаць яе ў чаргу" #: src/gtk/window.ui:49 msgid "" "Select a file or a folder, or drag files from your file manager to the " "application window to add songs to the playlist" msgstr "" "Выберыце файл або папку і перацягніце з файлавага менеджара ў акно праграмы, " "каб дадаць песні ў спіс прайгравання" #: src/gtk/window.ui:58 msgid "Add Folder" msgstr "Дадаць папку" #: src/gtk/window.ui:68 msgid "Add Song" msgstr "Дадаць песню" #. Translators: Replace "translator-credits" with your names, one name per line #: src/application.rs:188 msgid "translator-credits" msgstr "Юрась Шумовіч " #: src/playback_control.rs:157 msgid "Repeat All Tracks" msgstr "Паўтараць усе дарожкі" #: src/playback_control.rs:161 msgid "Repeat the Current Track" msgstr "Паўтараць бягучую дарожку" #: src/window.rs:409 msgid "_Add Song" msgstr "Дадаць _песню" #: src/window.rs:410 src/window.rs:450 msgid "_Cancel" msgstr "_Скасаваць" #: src/window.rs:412 msgid "Open File" msgstr "Адкрыць файл" #: src/window.rs:419 msgid "Audio files" msgstr "Аўдыяфайлы" #: src/window.rs:428 src/window.rs:1293 msgid "Unable to access files" msgstr "Немагчыма атрымаць доступ да файлаў" #: src/window.rs:449 msgid "_Add Folder" msgstr "Дадаць п_апку" #: src/window.rs:452 msgid "Open Folder" msgstr "Адкрыць папку" #: src/window.rs:463 msgid "Unable to access folders" msgstr "Немагчыма атрымаць доступ да папак" #: src/window.rs:475 msgid "No available song found" msgstr "Не знойдзена даступных песень" #: src/window.rs:532 msgid "No songs found" msgstr "Песні не знойдзены" #: src/window.rs:559 msgid "Added a new song" msgstr "Дададзена новая песня" #: src/window.rs:560 msgid "Play" msgstr "Прайграваць" #. Translators: the `{}` must be left unmodified; #. it will be expanded to the number of songs added #. to the playlist #: src/window.rs:569 msgid "Added one song" msgid_plural "Added {} songs" msgstr[0] "Дададзена {} песня" msgstr[1] "Дададзена {} песні" msgstr[2] "Дададзена {} песень" #: src/window.rs:1029 msgid "Unable to access dropped files" msgstr "Немагчыма атрымаць доступ да перацягнутых файлаў" #: src/window.rs:1123 msgid "{} minute" msgid_plural "{} minutes" msgstr[0] "{} хвіліна" msgstr[1] "{} хвіліны" msgstr[2] "{} хвілін" #: src/window.rs:1134 msgid "{hours} hour {minutes} remaining" msgid_plural "{hours} hours {minutes} remaining" msgstr[0] "Засталася {hours} гадзіна {minutes} хвіліна" msgstr[1] "Засталося {hours} гадзіны {minutes} хвіліны" msgstr[2] "Засталося {hours} гадзін {minutes} хвілін" #. Translators: the '{}' must be left unmodified, and #. it will be replaced by the number of minutes remaining #. in the playlist #: src/window.rs:1144 msgid "{} minute remaining" msgid_plural "{} minutes remaining" msgstr[0] "Засталася {} хвіліна" msgstr[1] "Засталося {} хвіліны" msgstr[2] "Засталося {} хвілін" #: src/window.rs:1273 msgid "No song selected" msgstr "Няма выбраных песень" #. Translators: The '{}' must be left unmodified, and #. it is expanded to the number of songs selected #: src/window.rs:1278 msgid "{} song selected" msgid_plural "{} songs selected" msgstr[0] "Выбрана {} песня" msgstr[1] "Выбрана {} песні" msgstr[2] "Выбрана {} песень" #. Translators: `{title}` and `{artist}` must be left #. untranslated; they will expand to the title and #. artist of the currently playing song, respectively #: src/window.rs:1331 msgid "Currently playing “{title}” by “{artist}”" msgstr "Зараз прайграецца {title} - {artist}" #: src/window.rs:1377 msgid "Amberol needs to run in the background to play music" msgstr "Каб прайграваць музыку, Amberol патрабуецца працаваць у фонавым рэжыме" #~ msgid "Add File" #~ msgstr "Дадаць файл" #~ msgid "Amberol cannot run in the background" #~ msgstr "Amberol не можа працаваць у фонавым рэжыме" amberol-0.10.3/po/ca.po000066400000000000000000000257351443320625200145720ustar00rootroot00000000000000# Catalan translation for amberol. # Copyright (C) 2022 amberol's COPYRIGHT HOLDER # This file is distributed under the same license as the amberol package. # maite , 2022. # msgid "" msgstr "" "Project-Id-Version: amberol main\n" "Report-Msgid-Bugs-To: https://gitlab.gnome.org/World/amberol/issues\n" "POT-Creation-Date: 2022-07-12 20:46+0000\n" "PO-Revision-Date: 2022-07-13 18:44+0200\n" "Last-Translator: maite guix \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: Poedit 3.1.1\n" #: data/io.bassi.Amberol.desktop.in.in:3 #: data/io.bassi.Amberol.appdata.xml.in.in:6 msgid "Amberol" msgstr "Amberol" #: data/io.bassi.Amberol.desktop.in.in:4 msgid "Music Player" msgstr "Reproductor de música" #. Translators: Search terms to find this application. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! #: data/io.bassi.Amberol.desktop.in.in:12 msgid "music;sound;player;media;audio;playlist;" msgstr "música;so;reproductor;multimèdia;àudio;llista de reproducció;" #: data/io.bassi.Amberol.appdata.xml.in.in:7 msgid "Plays music, and nothing else" msgstr "Reprodueix música i res més" #: data/io.bassi.Amberol.appdata.xml.in.in:9 msgid "" "Amberol is a music player with no delusions of grandeur. If you just want to " "play music available on your local system then Amberol is the music player " "you are looking for." msgstr "" "Amberol és un reproductor de música sense deliris de grandesa. Si voleu " "reproduir música disponible al vostre sistema local únicament, Amberol és el " "reproductor de música que busqueu." #: data/io.bassi.Amberol.appdata.xml.in.in:14 msgid "Current features:" msgstr "Funcionalitats actuals:" #: data/io.bassi.Amberol.appdata.xml.in.in:16 msgid "adaptive UI" msgstr "interfície d'usuari adaptativa" #: data/io.bassi.Amberol.appdata.xml.in.in:17 msgid "UI recoloring using the album art" msgstr "Acolorir la interfície d'usuari amb la caràtula de l'àlbum" #: data/io.bassi.Amberol.appdata.xml.in.in:18 msgid "drag and drop support to queue songs" msgstr "" "implementació d'arrossegar i deixar anar per a posa a la cua les cançons" #: data/io.bassi.Amberol.appdata.xml.in.in:19 msgid "shuffle and repeat" msgstr "aleatori i repetició" #: data/io.bassi.Amberol.appdata.xml.in.in:20 msgid "MPRIS integration" msgstr "Integració MPRIS" #: data/io.bassi.Amberol.appdata.xml.in.in:41 msgid "Emmanuele Bassi" msgstr "Emmanuele Bassi" #: src/audio/inhibit_controller.rs:40 msgid "Playback in progress" msgstr "Reproducció en curs" #: src/audio/song.rs:324 msgid "Unknown artist" msgstr "Artista desconegut" #: src/audio/song.rs:331 msgid "Unknown title" msgstr "Títol desconegut" #: src/audio/song.rs:338 msgid "Unknown album" msgstr "Àlbum desconegut" #: src/gtk/help-overlay.ui:11 msgctxt "shortcut window" msgid "General" msgstr "General" #: src/gtk/help-overlay.ui:14 msgctxt "shortcut window" msgid "Toggle primary menu" msgstr "Commuta el menú primari" #: src/gtk/help-overlay.ui:20 msgctxt "shortcut window" msgid "Copy song details to the clipboard" msgstr "Copia els detalls de la cançó al porta-retalls" #: src/gtk/help-overlay.ui:26 msgctxt "shortcut window" msgid "Show Shortcuts" msgstr "Mostra les dreceres" #: src/gtk/help-overlay.ui:32 msgctxt "shortcut window" msgid "Quit" msgstr "Surt" #: src/gtk/help-overlay.ui:40 msgctxt "shortcut window" msgid "Playlist" msgstr "Llista de reproducció" #: src/gtk/help-overlay.ui:43 msgctxt "shortcut window" msgid "Add a song to the playlist" msgstr "Afegeix una cançó a la llista de reproducció" #: src/gtk/help-overlay.ui:49 msgctxt "shortcut window" msgid "Add a folder to the playlist" msgstr "Afegeix una carpeta a la llista de reproducció" #: src/gtk/help-overlay.ui:55 msgctxt "shortcut window" msgid "Clear the playlist" msgstr "Neteja la llista de reproducció" #: src/gtk/help-overlay.ui:61 msgctxt "shortcut window" msgid "Toggle the playlist pane" msgstr "Commuta la subfinestra de llista de reproducció" #: src/gtk/help-overlay.ui:67 msgctxt "shortcut window" msgid "Toggle shuffling songs" msgstr "Commuta a reproducció aleatòria de cançons" #: src/gtk/help-overlay.ui:75 msgctxt "shortcut window" msgid "Playback" msgstr "Reproducció" #: src/gtk/help-overlay.ui:78 msgctxt "shortcut window" msgid "Toggle Play/Pause" msgstr "Commuta reproducció/pausa" #: src/gtk/help-overlay.ui:84 msgctxt "shortcut window" msgid "Previous song" msgstr "Cançó anterior" #: src/gtk/help-overlay.ui:90 msgctxt "shortcut window" msgid "Next song" msgstr "Cançó següent" #: src/gtk/help-overlay.ui:96 msgctxt "shortcut window" msgid "Seek backwards in the current song" msgstr "Busca cap enrere de la cançó actual" #: src/gtk/help-overlay.ui:102 msgctxt "shortcut window" msgid "Seek forward in the current song" msgstr "Buscar cap endavant de la cançó actual" #: src/gtk/playback-control.ui:30 msgctxt "a11y" msgid "Elapsed time" msgstr "Temps transcorregut" #: src/gtk/playback-control.ui:42 msgctxt "a11y" msgid "Remaining time" msgstr "Temps restant" #: src/gtk/playback-control.ui:64 msgid "Play the Previous Song" msgstr "Reprodueix la cançó anterior" #: src/gtk/playback-control.ui:69 msgctxt "a11y" msgid "Skip backwards" msgstr "Salta enrere" #: src/gtk/playback-control.ui:78 msgid "Toggle Play" msgstr "Commuta la reproducció" #: src/gtk/playback-control.ui:84 msgctxt "a11y" msgid "Toggle play" msgstr "Commuta la reproducció" #: src/gtk/playback-control.ui:93 msgid "Play the Next Song" msgstr "Reprodueix la cançó següent" #: src/gtk/playback-control.ui:98 msgctxt "a11y" msgid "Skip forward" msgstr "Salta endavant" #: src/gtk/playback-control.ui:121 msgid "Toggle Playlist" msgstr "Commuta la llista de reproducció" #: src/gtk/playback-control.ui:126 msgctxt "a11y" msgid "Toggle playlist" msgstr "Commuta la llista de reproducció" #: src/gtk/playback-control.ui:135 msgid "Shuffle the Playlist" msgstr "Llista de reproducció aleatòria" #: src/gtk/playback-control.ui:137 msgctxt "a11y" msgid "Shuffle" msgstr "Aleatori" #: src/gtk/playback-control.ui:156 src/playback_control.rs:153 msgid "Enable Repeat" msgstr "Habilita la repetició" #: src/gtk/playback-control.ui:161 msgctxt "a11y" msgid "Repeat" msgstr "Repetició" #: src/gtk/playback-control.ui:172 msgid "Main Menu" msgstr "Menú principal" #: src/gtk/playback-control.ui:177 msgctxt "a11y" msgid "Primary menu" msgstr "Menú primari" #: src/gtk/playback-control.ui:193 msgid "Copy" msgstr "Copia" #: src/gtk/playback-control.ui:199 msgid "Add _Song" msgstr "Afegeix _cançó" #: src/gtk/playback-control.ui:203 msgid "Add _Folder" msgstr "Afegeix _carpeta" #: src/gtk/playback-control.ui:207 msgid "Clear" msgstr "Neteja" #: src/gtk/playback-control.ui:213 msgid "_Match Cover Art" msgstr "_Coincidència de caràtula" #: src/gtk/playback-control.ui:219 msgid "_Keyboard Shortcuts" msgstr "Dreceres de _teclat" #: src/gtk/playback-control.ui:223 msgid "_About Amberol" msgstr "_Quant a Amberol" #: src/gtk/playback-control.ui:227 msgid "_Quit" msgstr "_Surt" #: src/gtk/playlist-view.ui:19 msgid "Playlist" msgstr "Llista de reproducció" #: src/gtk/playlist-view.ui:49 msgid "Search Songs in the Playlist" msgstr "Cerca cançons de la llista de reproducció" #: src/gtk/playlist-view.ui:61 msgid "Select Songs in the Playlist" msgstr "Selecciona cançons a la llista de reproducció" #: src/gtk/playlist-view.ui:74 msgid "Close the Playlist" msgstr "Tanca la llista de reproducció" #: src/gtk/playlist-view.ui:135 msgid "Select All Songs" msgstr "Selecciona totes les cançons" #: src/gtk/playlist-view.ui:148 msgid "Remove Selected Songs" msgstr "Suprimeix les cançons seleccionades" #: src/gtk/window.ui:12 msgid "Drop a song to add it to the queue" msgstr "Deixa anar una cançó per a afegir-la a la cua" #: src/gtk/window.ui:48 msgid "" "Select a file or a folder, or drag files from your file manager to the " "application window to add songs to the playlist" msgstr "" "Seleccioneu un fitxer o una carpeta, o arrossegueu fitxers del gestor de " "fitxers a la finestra de l'aplicació per a afegir cançons a la llista de " "reproducció" #: src/gtk/window.ui:57 msgid "Add Folder" msgstr "Afegeix una carpeta" #: src/gtk/window.ui:67 msgid "Add File" msgstr "Afegeix arxiu" #: src/application.rs:181 msgid "Plays music and nothing else" msgstr "Reprodueix música i res més" #. Translators: Replace "translator-credits" with your names, one name per line #: src/application.rs:188 msgid "translator-credits" msgstr "Maite Guix , 2022" #: src/playback_control.rs:157 msgid "Repeat All Tracks" msgstr "Repeteix totes les pistes" #: src/playback_control.rs:161 msgid "Repeat the Current Track" msgstr "Repeteix la pista actual" #: src/window.rs:394 msgid "_Add Song" msgstr "_Afegeix cançó" #: src/window.rs:395 src/window.rs:430 msgid "_Cancel" msgstr "_Cancel·la" #: src/window.rs:397 msgid "Open File" msgstr "Obre el fitxer" #: src/window.rs:404 msgid "Audio files" msgstr "Fitxers d'àudio" #: src/window.rs:429 msgid "_Add Folder" msgstr "_Afegeix una carpeta" #: src/window.rs:432 msgid "Open Folder" msgstr "Obre la carpeta" #: src/window.rs:450 src/window.rs:552 msgid "No available song found" msgstr "No s'ha trobat cap cançó disponible" #: src/window.rs:498 msgid "No songs found" msgstr "No s'ha trobat cap cançó" #: src/window.rs:524 msgid "Added a new song" msgstr "S'ha afegit una cançó nova" #: src/window.rs:525 msgid "Play" msgstr "Reproduir" #. Translators: the `{}` must be left unmodified; #. it will be expanded to the number of songs added #. to the playlist #: src/window.rs:534 msgid "Added one song" msgid_plural "Added {} songs" msgstr[0] "S'ha afegit una cançó" msgstr[1] "S'han afegit {} cançons" #. Translators: the '{}' must be left unmodified, and #. it will be replaced by the number of minutes remaining #. in the playlist #: src/window.rs:1077 msgid "{} minute remaining" msgid_plural "{} minutes remaining" msgstr[0] "{} minut restant" msgstr[1] "{} minuts restants" #: src/window.rs:1204 msgid "No song selected" msgstr "No s'ha seleccionat cap cançó" #. Translators: The '{}' must be left unmodified, and #. it is expanded to the number of songs selected #: src/window.rs:1209 msgid "{} song selected" msgid_plural "{} songs selected" msgstr[0] "{} cançó seleccionada" msgstr[1] "{} cançons seleccionades" #. Translators: `{title}` and `{artist}` must be left #. untranslated; they will expand to the title and #. artist of the currently playing song, respectively #: src/window.rs:1257 msgid "Currently playing “{title}” by “{artist}”" msgstr "S'està reproduint «{title}» de «{artist}»" #: src/window.rs:1285 msgid "Amberol needs to run in the background to play music" msgstr "Amberol necessita córrer en segon pla per a reproduir música" #: src/window.rs:1298 msgid "Amberol cannot run in the background" msgstr "Amberol no es pot executar en segon pla" amberol-0.10.3/po/cs.po000066400000000000000000000301171443320625200146020ustar00rootroot00000000000000# Czech translation of amberol. # Copyright (C) 2023 the author(s) of amberol. # This file is distributed under the same license as the amberol package. # Vojtěch Perník , 2022. # Písek Pískovec , 2022. # Daniel Rusek , 2023. # msgid "" msgstr "" "Project-Id-Version: amberol main\n" "Report-Msgid-Bugs-To: https://gitlab.gnome.org/World/amberol/issues\n" "POT-Creation-Date: 2023-04-06 11:27+0000\n" "PO-Revision-Date: 2023-04-04 13:12+0200\n" "Last-Translator: Daniel Rusek \n" "Language-Team: \n" "Language: cs\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n>=2 && n<=4 ? 1 : 2);\n" "X-Generator: Poedit 3.2.2\n" #: data/io.bassi.Amberol.desktop.in.in:3 #: data/io.bassi.Amberol.appdata.xml.in.in:6 msgid "Amberol" msgstr "Amberol" #: data/io.bassi.Amberol.desktop.in.in:4 msgid "Music Player" msgstr "Přehrávač hudby" #. Translators: Search terms to find this application. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! #: data/io.bassi.Amberol.desktop.in.in:12 msgid "music;player;media;audio;playlist;" msgstr "hudba;přehrávač;média;audio;playlist;" #: data/io.bassi.Amberol.appdata.xml.in.in:7 msgid "Plays music, and nothing else" msgstr "Přehrává hudbu, a nic víc" #: data/io.bassi.Amberol.appdata.xml.in.in:9 msgid "" "Amberol is a music player with no delusions of grandeur. If you just want to " "play music available on your local system then Amberol is the music player " "you are looking for." msgstr "" "Amberol je hudební přehrávač bez iluzí vznešenosti. Pokud chcete jen " "přehrávat hudbu uloženou na svém zařízení, Amberol je hudební přehrávač, " "který hledáte." #: data/io.bassi.Amberol.appdata.xml.in.in:14 msgid "Current features:" msgstr "Současné funkce:" #: data/io.bassi.Amberol.appdata.xml.in.in:16 msgid "adaptive UI" msgstr "přizpůsobivé UI" #: data/io.bassi.Amberol.appdata.xml.in.in:17 msgid "UI recoloring using the album art" msgstr "UI měnící barvu na základě obrázku alba" #: data/io.bassi.Amberol.appdata.xml.in.in:18 msgid "drag and drop support to queue songs" msgstr "podpora přetahování písní do řady" #: data/io.bassi.Amberol.appdata.xml.in.in:19 msgid "shuffle and repeat" msgstr "náhodné a opakovat" #: data/io.bassi.Amberol.appdata.xml.in.in:20 msgid "MPRIS integration" msgstr "integrace MPRIS" #: data/io.bassi.Amberol.appdata.xml.in.in:42 msgid "Emmanuele Bassi" msgstr "Emmanuele Bassi" #: src/audio/inhibit_controller.rs:40 msgid "Playback in progress" msgstr "Probíhá přehrávání" #: src/audio/song.rs:325 msgid "Unknown artist" msgstr "Neznámý umělec" #: src/audio/song.rs:332 msgid "Unknown title" msgstr "Neznámý název" #: src/audio/song.rs:339 msgid "Unknown album" msgstr "Neznámé album" #: src/gtk/help-overlay.ui:11 msgctxt "shortcut window" msgid "General" msgstr "Obecné" #: src/gtk/help-overlay.ui:14 msgctxt "shortcut window" msgid "Toggle primary menu" msgstr "Zobrazit/skrýt hlavní nabídku" #: src/gtk/help-overlay.ui:20 msgctxt "shortcut window" msgid "Copy song details to the clipboard" msgstr "Zkopírovat detaily písně do schránky" #: src/gtk/help-overlay.ui:26 msgctxt "shortcut window" msgid "Show shortcuts" msgstr "Zobrazit klávesové zkratky" #: src/gtk/help-overlay.ui:32 msgctxt "shortcut window" msgid "Quit" msgstr "Ukončit" #: src/gtk/help-overlay.ui:40 msgctxt "shortcut window" msgid "Playlist" msgstr "Seznam přehrávání" #: src/gtk/help-overlay.ui:43 msgctxt "shortcut window" msgid "Add a song to the playlist" msgstr "Přidat skladbu do seznamu přehrávání" #: src/gtk/help-overlay.ui:49 msgctxt "shortcut window" msgid "Add a folder to the playlist" msgstr "Přidat složku do seznamu přehrávání" #: src/gtk/help-overlay.ui:55 msgctxt "shortcut window" msgid "Clear the playlist" msgstr "Vyčistit seznam přehrávání" #: src/gtk/help-overlay.ui:61 msgctxt "shortcut window" msgid "Toggle the playlist pane" msgstr "Zobrazit/skrýt seznam skladeb" #: src/gtk/help-overlay.ui:67 msgctxt "shortcut window" msgid "Toggle shuffling songs" msgstr "Přepnout opakování" #: src/gtk/help-overlay.ui:75 msgctxt "shortcut window" msgid "Playback" msgstr "Přehrávání" #: src/gtk/help-overlay.ui:78 msgctxt "shortcut window" msgid "Toggle play/pause" msgstr "Pozastavit nebo hrát dál" #: src/gtk/help-overlay.ui:84 msgctxt "shortcut window" msgid "Previous song" msgstr "Předchozí skladba" #: src/gtk/help-overlay.ui:90 msgctxt "shortcut window" msgid "Next song" msgstr "Další skladba" #: src/gtk/help-overlay.ui:96 msgctxt "shortcut window" msgid "Seek backwards in the current song" msgstr "Skok zpět o 10 sekund" #: src/gtk/help-overlay.ui:102 msgctxt "shortcut window" msgid "Seek forward in the current song" msgstr "Skok vpřed o 10 sekund" #: src/gtk/playback-control.ui:35 msgctxt "a11y" msgid "Elapsed time" msgstr "Uběhnutý čas" #: src/gtk/playback-control.ui:47 msgctxt "a11y" msgid "Remaining time" msgstr "Zbývající čas" #: src/gtk/playback-control.ui:69 msgid "Play the Previous Song" msgstr "Přehrát předchozí skladbu" #: src/gtk/playback-control.ui:74 msgctxt "a11y" msgid "Skip backwards" msgstr "Skočit zpět" #: src/gtk/playback-control.ui:83 msgid "Toggle Play" msgstr "Pozastavit nebo hrát dál" #: src/gtk/playback-control.ui:89 msgctxt "a11y" msgid "Toggle play" msgstr "Pozastavit nebo hrát dál" #: src/gtk/playback-control.ui:98 msgid "Play the Next Song" msgstr "Přehrát další skladbu" #: src/gtk/playback-control.ui:103 msgctxt "a11y" msgid "Skip forward" msgstr "Skočit vpřed" #: src/gtk/playback-control.ui:126 msgid "Toggle Playlist" msgstr "Zobrazit/skrýt seznam skladeb" #: src/gtk/playback-control.ui:131 msgctxt "a11y" msgid "Toggle playlist" msgstr "Zobrazit/skrýt seznam skladeb" #: src/gtk/playback-control.ui:140 msgid "Shuffle the Playlist" msgstr "Promíchat seznam skladeb" #: src/gtk/playback-control.ui:142 msgctxt "a11y" msgid "Shuffle" msgstr "Náhodné" #: src/gtk/playback-control.ui:161 src/playback_control.rs:153 msgid "Enable Repeat" msgstr "Povolit opakování" #: src/gtk/playback-control.ui:166 msgctxt "a11y" msgid "Repeat" msgstr "Opakovat" #: src/gtk/playback-control.ui:177 msgid "Main Menu" msgstr "Hlavní nabídka" #: src/gtk/playback-control.ui:183 msgctxt "a11y" msgid "Primary menu" msgstr "Primární nabídka" #: src/gtk/playback-control.ui:199 msgid "Copy" msgstr "Kopírovat" #: src/gtk/playback-control.ui:205 msgid "Add _Song" msgstr "Přidat _skladbu" #: src/gtk/playback-control.ui:209 msgid "Add _Folder" msgstr "Přidat _složku" #: src/gtk/playback-control.ui:213 msgid "Clear" msgstr "Vyčistit" #: src/gtk/playback-control.ui:219 msgid "_Match Cover Art" msgstr "_Ladit s obrázkem alba" #: src/gtk/playback-control.ui:223 msgid "_Background Playback" msgstr "Přehrávání na _pozadí" #: src/gtk/playback-control.ui:229 msgid "_ReplayGain" msgstr "_ReplayGain" #: src/gtk/playback-control.ui:231 msgid "_Album" msgstr "_Album" #: src/gtk/playback-control.ui:236 msgid "_Track" msgstr "_Stopa" #: src/gtk/playback-control.ui:241 msgid "_Off" msgstr "_Vypnout" #: src/gtk/playback-control.ui:249 msgid "_Keyboard Shortcuts" msgstr "_Klávesové zkratky" #: src/gtk/playback-control.ui:253 msgid "_About Amberol" msgstr "_O aplikaci Amberol" #: src/gtk/playback-control.ui:257 msgid "_Quit" msgstr "_Ukončit" #: src/gtk/playlist-view.ui:19 msgid "Playlist" msgstr "Seznam skladeb" #: src/gtk/playlist-view.ui:49 msgid "Search Songs in the Playlist" msgstr "Hledat skladby v seznamu" #: src/gtk/playlist-view.ui:61 msgid "Select Songs in the Playlist" msgstr "Vybrat skladby v seznamu" #: src/gtk/playlist-view.ui:74 msgid "Close the Playlist" msgstr "Zavřít seznam skladeb" #: src/gtk/playlist-view.ui:135 msgid "Select All Songs" msgstr "Vybrat všechny skladby" #: src/gtk/playlist-view.ui:148 msgid "Remove Selected Songs" msgstr "Odebrat vybrané skladby" #: src/gtk/window.ui:12 msgid "Drop a song to add it to the queue" msgstr "Přetáhnout pro přidání skladby do řady" #: src/gtk/window.ui:49 msgid "" "Select a file or a folder, or drag files from your file manager to the " "application window to add songs to the playlist" msgstr "" "Vyberte soubor nebo složku, nebo přetáhněte soubory ze svého správce souborů " "do okna aplikace, abyste přidali skladby do seznamu" #: src/gtk/window.ui:58 msgid "Restore Playlist" msgstr "Obnovit seznam skladeb" #: src/gtk/window.ui:68 msgid "Add Folder" msgstr "Přidat složku" #: src/gtk/window.ui:77 msgid "Add Song" msgstr "Přidat skladbu" #. Translators: Replace "translator-credits" with your names, one name per line #: src/application.rs:227 msgid "translator-credits" msgstr "Písek Pískovec " #: src/application.rs:239 msgid "Amberol needs to run in the background to play music" msgstr "Amberol musí běžet na pozadí, aby hrál hudbu" #: src/playback_control.rs:157 msgid "Repeat All Tracks" msgstr "Opakovat všechny skladby" #: src/playback_control.rs:161 msgid "Repeat the Current Track" msgstr "Opakovat současnou skladbu" #: src/window.rs:390 msgid "_Add Song" msgstr "_Přidat skladbu" #: src/window.rs:391 src/window.rs:431 msgid "_Cancel" msgstr "_Zrušit" #: src/window.rs:393 msgid "Open File" msgstr "Otevřít soubor" #: src/window.rs:400 msgid "Audio files" msgstr "Zvukové soubory" #: src/window.rs:409 src/window.rs:1300 msgid "Unable to access files" msgstr "Nelze získat přístup k souborům" #: src/window.rs:430 msgid "_Add Folder" msgstr "_Přidat složku" #: src/window.rs:433 msgid "Open Folder" msgstr "Otevřít složku" #: src/window.rs:444 msgid "Unable to access folders" msgstr "Nelze získat přístup ke složkám" #: src/window.rs:462 msgid "No available song found" msgstr "Nenalezeny dostupné skladby" #: src/window.rs:519 msgid "No songs found" msgstr "Nalezeny žádné skladby" #: src/window.rs:549 msgid "Added a new song" msgstr "Nová skladba přidána" #: src/window.rs:550 msgid "Play" msgstr "Přehrát" #. Translators: the `{}` must be left unmodified; #. it will be expanded to the number of songs added #. to the playlist #: src/window.rs:559 msgid "Added one song" msgid_plural "Added {} songs" msgstr[0] "Přidána jedna skladba" msgstr[1] "Přidány {} skladby" msgstr[2] "Přidáno {} skladeb" #: src/window.rs:1050 msgid "Unable to access dropped files" msgstr "Nelze získat přístup k vloženým souborům" #: src/window.rs:1143 msgid "{} minute" msgid_plural "{} minutes" msgstr[0] "{} minuta" msgstr[1] "{} minuty" msgstr[2] "{} minut" #: src/window.rs:1154 msgid "{hours} hour {minutes} remaining" msgid_plural "{hours} hours {minutes} remaining" msgstr[0] "Zbývá {hours} hodina {minutes}" msgstr[1] "Zbývají {hours} hodiny {minutes}" msgstr[2] "Zbývá {hours} hodin {minutes}" #. Translators: the '{}' must be left unmodified, and #. it will be replaced by the number of minutes remaining #. in the playlist #: src/window.rs:1164 msgid "{} minute remaining" msgid_plural "{} minutes remaining" msgstr[0] "Zbývá {} minuta" msgstr[1] "Zbývá {} minuty" msgstr[2] "Zbývá {} minut" #: src/window.rs:1280 msgid "No song selected" msgstr "Nevybrána žádná skladba" #. Translators: The '{}' must be left unmodified, and #. it is expanded to the number of songs selected #: src/window.rs:1285 msgid "{} song selected" msgid_plural "{} songs selected" msgstr[0] "Vybrána {} skladba" msgstr[1] "Vybrány {} skladby" msgstr[2] "Vybráno {} skladeb" #. Translators: `{title}` and `{artist}` must be left #. untranslated; they will expand to the title and #. artist of the currently playing song, respectively #: src/window.rs:1338 msgid "Currently playing “{title}” by “{artist}”" msgstr "Právě hraje “{title}” od “{artist}”" #~ msgid "Add File" #~ msgstr "Přidat soubor" #~ msgid "Plays music and nothing else" #~ msgstr "Přehrává hudbu, a nic víc" #~ msgid "{} hour" #~ msgid_plural "{} hours" #~ msgstr[0] "{} hodina" #~ msgstr[1] "{} hodiny" #~ msgstr[2] "{} hodin" #~ msgid "Amberol cannot run in the background" #~ msgstr "Amberol nemůže běžet na pozadí" amberol-0.10.3/po/da.po000066400000000000000000000276371443320625200145760ustar00rootroot00000000000000# Danish translation for amberol. # Copyright (C) 2022 amberol's COPYRIGHT HOLDER # This file is distributed under the same license as the amberol package. # Alan Mortensen , 2022-23. # msgid "" msgstr "" "Project-Id-Version: amberol main\n" "Report-Msgid-Bugs-To: https://gitlab.gnome.org/World/amberol/issues\n" "POT-Creation-Date: 2023-02-22 13:07+0000\n" "PO-Revision-Date: 2023-03-11 16:02+0100\n" "Last-Translator: Alan Mortensen \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: Poedit 3.0.1\n" #: data/io.bassi.Amberol.desktop.in.in:3 #: data/io.bassi.Amberol.appdata.xml.in.in:6 msgid "Amberol" msgstr "Amberol" #: data/io.bassi.Amberol.desktop.in.in:4 msgid "Music Player" msgstr "Musikafspiller" #. Translators: Search terms to find this application. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! #: data/io.bassi.Amberol.desktop.in.in:12 msgid "music;player;media;audio;playlist;" msgstr "musik;afspiller;medie;lyd;afspilningsliste;playliste;" #: data/io.bassi.Amberol.appdata.xml.in.in:7 msgid "Plays music, and nothing else" msgstr "Afspiller musik og ikke andet" #: data/io.bassi.Amberol.appdata.xml.in.in:9 msgid "" "Amberol is a music player with no delusions of grandeur. If you just want to " "play music available on your local system then Amberol is the music player " "you are looking for." msgstr "" "Amberol er en musikafspiller uden storhedsvanvid. Vil du bare afspille musik " "fra dit lokale system, er Amberol den musikafspiller, du har ledt efter." #: data/io.bassi.Amberol.appdata.xml.in.in:14 msgid "Current features:" msgstr "Nuværende funktioner:" #: data/io.bassi.Amberol.appdata.xml.in.in:16 msgid "adaptive UI" msgstr "tilpassende brugergrænseflade" #: data/io.bassi.Amberol.appdata.xml.in.in:17 msgid "UI recoloring using the album art" msgstr "farvelægning af brugergrænsefladen med brug af pladeomslaget" #: data/io.bassi.Amberol.appdata.xml.in.in:18 msgid "drag and drop support to queue songs" msgstr "sæt sange i kø med træk-og-slip" #: data/io.bassi.Amberol.appdata.xml.in.in:19 msgid "shuffle and repeat" msgstr "bland og gentag" #: data/io.bassi.Amberol.appdata.xml.in.in:20 msgid "MPRIS integration" msgstr "MPRIS-integration" #: data/io.bassi.Amberol.appdata.xml.in.in:42 msgid "Emmanuele Bassi" msgstr "Emmanuele Bassi" #: src/audio/inhibit_controller.rs:40 msgid "Playback in progress" msgstr "Afspilning i gang" #: src/audio/song.rs:337 msgid "Unknown artist" msgstr "Ukendt kunstner" #: src/audio/song.rs:344 msgid "Unknown title" msgstr "Ukendt titel" #: src/audio/song.rs:351 msgid "Unknown album" msgstr "Ukendt album" #: src/gtk/help-overlay.ui:11 msgctxt "shortcut window" msgid "General" msgstr "Generelt" #: src/gtk/help-overlay.ui:14 msgctxt "shortcut window" msgid "Toggle primary menu" msgstr "Slå primær menu til/fra" #: src/gtk/help-overlay.ui:20 msgctxt "shortcut window" msgid "Copy song details to the clipboard" msgstr "Kopiér detaljer om sangen til udklipsholderen" #: src/gtk/help-overlay.ui:26 msgctxt "shortcut window" msgid "Show shortcuts" msgstr "Vis genveje" #: src/gtk/help-overlay.ui:32 msgctxt "shortcut window" msgid "Quit" msgstr "Afslut" #: src/gtk/help-overlay.ui:40 msgctxt "shortcut window" msgid "Playlist" msgstr "Afspilningsliste" #: src/gtk/help-overlay.ui:43 msgctxt "shortcut window" msgid "Add a song to the playlist" msgstr "Tilføj en sang til afspilningslisten" #: src/gtk/help-overlay.ui:49 msgctxt "shortcut window" msgid "Add a folder to the playlist" msgstr "Tilføj en mappe til afspilningslisten" #: src/gtk/help-overlay.ui:55 msgctxt "shortcut window" msgid "Clear the playlist" msgstr "Ryd afspilningslisten" #: src/gtk/help-overlay.ui:61 msgctxt "shortcut window" msgid "Toggle the playlist pane" msgstr "Slå afspilningslisteruden til/fra" #: src/gtk/help-overlay.ui:67 msgctxt "shortcut window" msgid "Toggle shuffling songs" msgstr "Slå tilfældig rækkefølge til/fra" #: src/gtk/help-overlay.ui:75 msgctxt "shortcut window" msgid "Playback" msgstr "Afspilning" #: src/gtk/help-overlay.ui:78 msgctxt "shortcut window" msgid "Toggle play/pause" msgstr "Afspil/pause" #: src/gtk/help-overlay.ui:84 msgctxt "shortcut window" msgid "Previous song" msgstr "Forrige sang" #: src/gtk/help-overlay.ui:90 msgctxt "shortcut window" msgid "Next song" msgstr "Næste sang" #: src/gtk/help-overlay.ui:96 msgctxt "shortcut window" msgid "Seek backwards in the current song" msgstr "Søg baglæns i nuværende sang" #: src/gtk/help-overlay.ui:102 msgctxt "shortcut window" msgid "Seek forward in the current song" msgstr "Søg fremad i nuværende sang" #: src/gtk/playback-control.ui:35 msgctxt "a11y" msgid "Elapsed time" msgstr "Forløbet tid" #: src/gtk/playback-control.ui:47 msgctxt "a11y" msgid "Remaining time" msgstr "Resterende tid" #: src/gtk/playback-control.ui:69 msgid "Play the Previous Song" msgstr "Afspil forrige sang" #: src/gtk/playback-control.ui:74 msgctxt "a11y" msgid "Skip backwards" msgstr "Spring baglæns" #: src/gtk/playback-control.ui:83 msgid "Toggle Play" msgstr "Slå afspilning til/fra" #: src/gtk/playback-control.ui:89 msgctxt "a11y" msgid "Toggle play" msgstr "Slå afspilning til/fra" #: src/gtk/playback-control.ui:98 msgid "Play the Next Song" msgstr "Afspil næste sang" #: src/gtk/playback-control.ui:103 msgctxt "a11y" msgid "Skip forward" msgstr "Spring frem" #: src/gtk/playback-control.ui:126 msgid "Toggle Playlist" msgstr "Slå afspilningsliste til/fra" #: src/gtk/playback-control.ui:131 msgctxt "a11y" msgid "Toggle playlist" msgstr "Slå afspilningsliste til/fra" #: src/gtk/playback-control.ui:140 msgid "Shuffle the Playlist" msgstr "Bland afspilningslisten" #: src/gtk/playback-control.ui:142 msgctxt "a11y" msgid "Shuffle" msgstr "Bland" #: src/gtk/playback-control.ui:161 src/playback_control.rs:153 msgid "Enable Repeat" msgstr "Aktivér gentagelse" #: src/gtk/playback-control.ui:166 msgctxt "a11y" msgid "Repeat" msgstr "Gentag" #: src/gtk/playback-control.ui:177 msgid "Main Menu" msgstr "Hovedmenu" #: src/gtk/playback-control.ui:183 msgctxt "a11y" msgid "Primary menu" msgstr "Primær menu" #: src/gtk/playback-control.ui:199 msgid "Copy" msgstr "Kopiér" #: src/gtk/playback-control.ui:205 msgid "Add _Song" msgstr "Tilføj _sang" #: src/gtk/playback-control.ui:209 msgid "Add _Folder" msgstr "Tilføj _mappe" #: src/gtk/playback-control.ui:213 msgid "Clear" msgstr "Ryd" #: src/gtk/playback-control.ui:219 msgid "_Match Cover Art" msgstr "_Tilpas til pladeomslag" #: src/gtk/playback-control.ui:223 msgid "_Background Playback" msgstr "_Afspilning i baggrunden" # https://en.wikipedia.org/wiki/ReplayGain #: src/gtk/playback-control.ui:229 msgid "_ReplayGain" msgstr "_ReplayGain" #: src/gtk/playback-control.ui:231 msgid "_Album" msgstr "_Album" #: src/gtk/playback-control.ui:236 msgid "_Track" msgstr "_Nummer" #: src/gtk/playback-control.ui:241 msgid "_Off" msgstr "_Fra" #: src/gtk/playback-control.ui:249 msgid "_Keyboard Shortcuts" msgstr "_Tastaturgenveje" #: src/gtk/playback-control.ui:253 msgid "_About Amberol" msgstr "_Om Amberol" #: src/gtk/playback-control.ui:257 msgid "_Quit" msgstr "Af_slut" #: src/gtk/playlist-view.ui:19 msgid "Playlist" msgstr "Afspilningsliste" #: src/gtk/playlist-view.ui:49 msgid "Search Songs in the Playlist" msgstr "Søg sange i afspilningslisten" #: src/gtk/playlist-view.ui:61 msgid "Select Songs in the Playlist" msgstr "Vælg sange i afspilningslisten" #: src/gtk/playlist-view.ui:74 msgid "Close the Playlist" msgstr "Luk afspilningslisten" #: src/gtk/playlist-view.ui:135 msgid "Select All Songs" msgstr "Vælg alle sange" #: src/gtk/playlist-view.ui:148 msgid "Remove Selected Songs" msgstr "Fjern valgte sange" #: src/gtk/window.ui:12 msgid "Drop a song to add it to the queue" msgstr "Slip en sang for at tilføje den til køen" #: src/gtk/window.ui:49 msgid "" "Select a file or a folder, or drag files from your file manager to the " "application window to add songs to the playlist" msgstr "" "Vælg en fil eller mappe, eller træk filer fra filhåndteringen til " "programvinduet for at tilføje sange til afspilningslisten" #: src/gtk/window.ui:58 msgid "Restore Playlist" msgstr "Gendan afspilningsliste" #: src/gtk/window.ui:68 msgid "Add Folder" msgstr "Tilføj mappe" #: src/gtk/window.ui:77 msgid "Add Song" msgstr "Tilføj sang" #. Translators: Replace "translator-credits" with your names, one name per line #: src/application.rs:233 msgid "translator-credits" msgstr "" "Alan Mortensen \n" "\n" "Dansk-gruppen\n" "Websted http://dansk-gruppen.dk\n" "E-mail " #: src/application.rs:247 msgid "Amberol needs to run in the background to play music" msgstr "Amberol skal køre i baggrunden for at kunne afspille musik" #: src/playback_control.rs:157 msgid "Repeat All Tracks" msgstr "Gentag alle numre" #: src/playback_control.rs:161 msgid "Repeat the Current Track" msgstr "Gentag nuværende nummer" #: src/window.rs:397 msgid "_Add Song" msgstr "_Tilføj sang" #: src/window.rs:398 src/window.rs:438 msgid "_Cancel" msgstr "_Annullér" #: src/window.rs:400 msgid "Open File" msgstr "Åbn fil" #: src/window.rs:407 msgid "Audio files" msgstr "Lydfiler" #: src/window.rs:416 src/window.rs:1306 msgid "Unable to access files" msgstr "Kan ikke tilgå filer" #: src/window.rs:437 msgid "_Add Folder" msgstr "_Tilføj mappe" #: src/window.rs:440 msgid "Open Folder" msgstr "Åbn mappe" #: src/window.rs:451 msgid "Unable to access folders" msgstr "Kan ikke tilgå mapper" #: src/window.rs:469 msgid "No available song found" msgstr "Ingen tilgængelige sange fundet" #: src/window.rs:526 msgid "No songs found" msgstr "Ingen sange fundet" #: src/window.rs:556 msgid "Added a new song" msgstr "Tilføjede en ny sang" #: src/window.rs:557 msgid "Play" msgstr "Afspil" #. Translators: the `{}` must be left unmodified; #. it will be expanded to the number of songs added #. to the playlist #: src/window.rs:566 msgid "Added one song" msgid_plural "Added {} songs" msgstr[0] "Tilføjede en sang" msgstr[1] "Tilføjede {} sange" #: src/window.rs:1056 msgid "Unable to access dropped files" msgstr "Kan ikke tilgå droppede filer" #: src/window.rs:1149 msgid "{} minute" msgid_plural "{} minutes" msgstr[0] "{} minut" msgstr[1] "{} minutter" #: src/window.rs:1160 msgid "{hours} hour {minutes} remaining" msgid_plural "{hours} hours {minutes} remaining" msgstr[0] "{hours} time {minutes} tilbage" msgstr[1] "{hours} timer {minutes} tilbage" #. Translators: the '{}' must be left unmodified, and #. it will be replaced by the number of minutes remaining #. in the playlist #: src/window.rs:1170 msgid "{} minute remaining" msgid_plural "{} minutes remaining" msgstr[0] "{} minut tilbage" msgstr[1] "{} minutter tilbage" #: src/window.rs:1286 msgid "No song selected" msgstr "Ingen sang valgt" #. Translators: The '{}' must be left unmodified, and #. it is expanded to the number of songs selected #: src/window.rs:1291 msgid "{} song selected" msgid_plural "{} songs selected" msgstr[0] "{} sang valgt" msgstr[1] "{} sange valgt" #. Translators: `{title}` and `{artist}` must be left #. untranslated; they will expand to the title and #. artist of the currently playing song, respectively #: src/window.rs:1344 msgid "Currently playing “{title}” by “{artist}”" msgstr "Afspiller nu “{title}” af “{artist}”" #~ msgid "Add File" #~ msgstr "Tilføj fil" #~ msgid "Plays music and nothing else" #~ msgstr "Afspiller musik og ikke andet" #~ msgid "Amberol cannot run in the background" #~ msgstr "Amberol kan ikke køre i baggrunden" #~ msgid "“{}” is not a supported audio file" #~ msgstr "“{}” er ikke en understøttet lydfil" #~ msgid "Unrecognized file type for “{}”" #~ msgstr "Filtypen for “{}” kunne ikke genkendes" #~ msgid "Amberol is running in the background" #~ msgstr "Amberol kører i baggrunden" amberol-0.10.3/po/de.po000066400000000000000000000327641443320625200145770ustar00rootroot00000000000000# German translation for amberol. # Copyright (C) 2022 amberol's COPYRIGHT HOLDER # This file is distributed under the same license as the amberol package. # Jürgen Benvenuti , 2022, 2023. # Christian Kirbach , 2022. # Philipp Kiemle , 2022-2023. # Konstantin Tutsch , 2022. # msgid "" msgstr "" "Project-Id-Version: amberol main\n" "Report-Msgid-Bugs-To: https://gitlab.gnome.org/World/amberol/issues\n" "POT-Creation-Date: 2023-04-24 22:31+0000\n" "PO-Revision-Date: 2023-05-08 13:16+0200\n" "Last-Translator: Philipp Kiemle \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: Poedit 3.2.2\n" #: data/io.bassi.Amberol.desktop.in.in:3 #: data/io.bassi.Amberol.appdata.xml.in.in:6 msgid "Amberol" msgstr "Amberol" #: data/io.bassi.Amberol.desktop.in.in:4 msgid "Music Player" msgstr "Musikwiedergabe" #. Translators: Search terms to find this application. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! #: data/io.bassi.Amberol.desktop.in.in:12 msgid "music;player;media;audio;playlist;" msgstr "" "music;player;media;audio;playlist;Musik;Wiedergabe;Medien;Audio;" "Wiedergabeliste;" #: data/io.bassi.Amberol.appdata.xml.in.in:7 msgid "Plays music, and nothing else" msgstr "Spielt Musik ab, und sonst nichts" #: data/io.bassi.Amberol.appdata.xml.in.in:9 msgid "" "Amberol is a music player with no delusions of grandeur. If you just want to " "play music available on your local system then Amberol is the music player " "you are looking for." msgstr "" "Amberol ist eine Musikwiedergabe, die sich nicht für großartig hält. Falls " "Sie einfach nur Musik auf Ihrem Computer wiedergeben wollen, ist Amberol die " "Musikwiedergabe, die Sie suchen." #: data/io.bassi.Amberol.appdata.xml.in.in:14 msgid "Current features:" msgstr "Derzeitige Funktionen:" #: data/io.bassi.Amberol.appdata.xml.in.in:16 msgid "adaptive UI" msgstr "Adaptive Benutzeroberfläche" #: data/io.bassi.Amberol.appdata.xml.in.in:17 msgid "UI recoloring using the album art" msgstr "Benutzeroberfläche passt sich farblich ans Albumbild an" #: data/io.bassi.Amberol.appdata.xml.in.in:18 msgid "drag and drop support to queue songs" msgstr "Unterstützung von Ziehen-und-Ablegen für Warteschlangen" #: data/io.bassi.Amberol.appdata.xml.in.in:19 msgid "shuffle and repeat" msgstr "Durchmischen und Wiederholen" #: data/io.bassi.Amberol.appdata.xml.in.in:20 msgid "MPRIS integration" msgstr "MPRIS-Integration" #: data/io.bassi.Amberol.appdata.xml.in.in:42 msgid "Emmanuele Bassi" msgstr "Emmanuele Bassi" #: src/audio/inhibit_controller.rs:40 msgid "Playback in progress" msgstr "Wiedergabe läuft" #: src/audio/song.rs:325 msgid "Unknown artist" msgstr "Unbekannter Interpret" #: src/audio/song.rs:332 msgid "Unknown title" msgstr "Unbekannter Titel" #: src/audio/song.rs:339 msgid "Unknown album" msgstr "Unbekanntes Album" #: src/gtk/help-overlay.ui:11 msgctxt "shortcut window" msgid "General" msgstr "Allgemein" #: src/gtk/help-overlay.ui:14 msgctxt "shortcut window" msgid "Toggle primary menu" msgstr "Hauptmenü ein-/ausschalten" #: src/gtk/help-overlay.ui:20 msgctxt "shortcut window" msgid "Copy song details to the clipboard" msgstr "Titel-Details in die Zwischenablage kopieren" #: src/gtk/help-overlay.ui:26 msgctxt "shortcut window" msgid "Show shortcuts" msgstr "Tastenkombinationen anzeigen" #: src/gtk/help-overlay.ui:32 msgctxt "shortcut window" msgid "Quit" msgstr "Beenden" #: src/gtk/help-overlay.ui:40 msgctxt "shortcut window" msgid "Playlist" msgstr "Wiedergabeliste" #: src/gtk/help-overlay.ui:43 msgctxt "shortcut window" msgid "Add a song to the playlist" msgstr "Einen Titel zur Wiedergabeliste hinzufügen" #: src/gtk/help-overlay.ui:49 msgctxt "shortcut window" msgid "Add a folder to the playlist" msgstr "Einen Ordner zur Wiedergabeliste hinzufügen" #: src/gtk/help-overlay.ui:55 msgctxt "shortcut window" msgid "Clear the playlist" msgstr "Wiedergabeliste leeren" #: src/gtk/help-overlay.ui:61 msgctxt "shortcut window" msgid "Toggle the playlist pane" msgstr "Leiste der Wiedergabeliste ein-/ausblenden" #: src/gtk/help-overlay.ui:67 msgctxt "shortcut window" msgid "Toggle shuffling songs" msgstr "Titel durchmischen ein-/ausschalten" #: src/gtk/help-overlay.ui:75 msgctxt "shortcut window" msgid "Playback" msgstr "Wiedergabe" #: src/gtk/help-overlay.ui:78 msgctxt "shortcut window" msgid "Toggle play/pause" msgstr "Abspielen/Pausieren umschalten" #: src/gtk/help-overlay.ui:84 msgctxt "shortcut window" msgid "Previous song" msgstr "Vorheriger Titel" #: src/gtk/help-overlay.ui:90 msgctxt "shortcut window" msgid "Next song" msgstr "Nächster Titel" #: src/gtk/help-overlay.ui:96 msgctxt "shortcut window" msgid "Seek backwards in the current song" msgstr "Im aktuellen Titel rückwärts springen" #: src/gtk/help-overlay.ui:102 msgctxt "shortcut window" msgid "Seek forward in the current song" msgstr "Im aktuellen Titel vorwärts springen" #: src/gtk/playback-control.ui:21 msgid "Play the Previous Song" msgstr "Den vorherigen Titel wiedergeben" #: src/gtk/playback-control.ui:26 msgctxt "a11y" msgid "Skip backwards" msgstr "Zurückspulen" #: src/gtk/playback-control.ui:35 msgid "Toggle Play" msgstr "Wiedergabe ein-/ausschalten" #: src/gtk/playback-control.ui:41 msgctxt "a11y" msgid "Toggle play" msgstr "Wiedergabe ein-/ausschalten" #: src/gtk/playback-control.ui:50 msgid "Play the Next Song" msgstr "Den nächsten Titel wiedergeben" #: src/gtk/playback-control.ui:55 msgctxt "a11y" msgid "Skip forward" msgstr "Vorspulen" #: src/gtk/playback-control.ui:78 msgid "Toggle Playlist" msgstr "Wiedergabeliste ein-/ausblenden" #: src/gtk/playback-control.ui:83 msgctxt "a11y" msgid "Toggle playlist" msgstr "Wiedergabeliste ein-/ausblenden" #: src/gtk/playback-control.ui:92 msgid "Shuffle the Playlist" msgstr "Die Wiedergabeliste durchmischen" #: src/gtk/playback-control.ui:94 msgctxt "a11y" msgid "Shuffle" msgstr "Durchmischen" #: src/gtk/playback-control.ui:113 src/playback_control.rs:114 msgid "Enable Repeat" msgstr "Wiederholungsfunktion einschalten" #: src/gtk/playback-control.ui:118 msgctxt "a11y" msgid "Repeat" msgstr "Wiederholen" #: src/gtk/playback-control.ui:129 msgid "Main Menu" msgstr "Hauptmenü" #: src/gtk/playback-control.ui:135 msgctxt "a11y" msgid "Primary menu" msgstr "Hauptmenü" #: src/gtk/playback-control.ui:151 msgid "Copy" msgstr "Kopieren" #: src/gtk/playback-control.ui:157 msgid "Add _Song" msgstr "_Titel hinzufügen" #: src/gtk/playback-control.ui:161 msgid "Add _Folder" msgstr "_Ordner hinzufügen" #: src/gtk/playback-control.ui:165 msgid "Clear" msgstr "Leeren" #: src/gtk/playback-control.ui:171 msgid "_Match Cover Art" msgstr "Ans Album_bild anpassen" #: src/gtk/playback-control.ui:175 msgid "_Background Playback" msgstr "_Hintergrund-Wiedergabe" #: src/gtk/playback-control.ui:181 msgid "_ReplayGain" msgstr "_Lautstärkeanpassung" #: src/gtk/playback-control.ui:183 msgctxt "replaygain-menu" msgid "_Album" msgstr "_Album" #: src/gtk/playback-control.ui:188 msgctxt "replaygain-menu" msgid "_Song" msgstr "_Titel" #: src/gtk/playback-control.ui:193 msgctxt "replaygain-menu" msgid "_Disabled" msgstr "_Deaktiviert" #: src/gtk/playback-control.ui:201 msgid "_Keyboard Shortcuts" msgstr "Tasten_kombinationen" #: src/gtk/playback-control.ui:205 msgid "_About Amberol" msgstr "_Info zu Amberol" #: src/gtk/playback-control.ui:209 msgid "_Quit" msgstr "_Beenden" #: src/gtk/playlist-view.ui:19 msgid "Playlist" msgstr "Wiedergabeliste" #: src/gtk/playlist-view.ui:49 msgid "Search Songs in the Playlist" msgstr "Titel in der Wiedergabeliste suchen" #: src/gtk/playlist-view.ui:61 msgid "Select Songs in the Playlist" msgstr "Titel in der Wiedergabeliste auswählen" #: src/gtk/playlist-view.ui:74 msgid "Close the Playlist" msgstr "Wiedergabeliste schließen" #: src/gtk/playlist-view.ui:135 msgid "Select All Songs" msgstr "Alle Titel auswählen" #: src/gtk/playlist-view.ui:148 msgid "Remove Selected Songs" msgstr "Ausgewählte Titel entfernen" #: src/gtk/window.ui:12 msgid "Drop a song to add it to the playlist" msgstr "Legen Sie einen Titel ab, um ihn zur Wiedergabeliste hinzuzufügen" #: src/gtk/window.ui:49 msgid "" "Select a file or a folder, or drag files from your file manager to the " "application window to add songs to the playlist" msgstr "" "Wählen Sie eine Datei oder einen Ordner, oder ziehen Sie Dateien aus Ihrer " "Dateiverwaltung in das Anwendungsfenster, um Titel zur Wiedergabeliste " "hinzuzufügen" #: src/gtk/window.ui:58 msgid "Restore Playlist" msgstr "Wiedergabeliste wiederherstellen" #: src/gtk/window.ui:68 msgid "Add Folder" msgstr "Ordner hinzufügen" #: src/gtk/window.ui:77 msgid "Add Song" msgstr "Titel hinzufügen" #: src/gtk/window.ui:161 msgctxt "a11y" msgid "Elapsed time" msgstr "Verstrichene Zeit" #: src/gtk/window.ui:173 msgctxt "a11y" msgid "Remaining time" msgstr "Verbleibende Zeit" #. Translators: Replace "translator-credits" with your names, one name per line #: src/application.rs:227 msgid "translator-credits" msgstr "" "Jürgen Benvenuti , 2022, 2023.\n" "Christian Kirbach , 2022.\n" "Philipp Kiemle , 2022-2023.\n" "Konstantin Tutsch , 2022." #: src/application.rs:239 msgid "Amberol needs to run in the background to play music" msgstr "Amberol muss im Hintergrund laufen, um Musik wiedergeben zu können" #: src/playback_control.rs:118 msgid "Repeat All Songs" msgstr "Alle Titel wiederholen" #: src/playback_control.rs:122 msgid "Repeat the Current Song" msgstr "Den aktuellen Titel wiederholen" #: src/window.rs:403 msgid "_Add Song" msgstr "Titel _hinzufügen" #: src/window.rs:404 src/window.rs:444 msgid "_Cancel" msgstr "A_bbrechen" #: src/window.rs:406 msgid "Open File" msgstr "Datei öffnen" #: src/window.rs:413 msgid "Audio files" msgstr "Audio-Dateien" #: src/window.rs:422 src/window.rs:1315 msgid "Unable to access files" msgstr "Auf Dateien konnte nicht zugegriffen werden" #: src/window.rs:443 msgid "_Add Folder" msgstr "_Ordner hinzufügen" #: src/window.rs:446 msgid "Open Folder" msgstr "Ordner öffnen" #: src/window.rs:457 msgid "Unable to access folders" msgstr "Auf Ordner konnte nicht zugegriffen werden" #: src/window.rs:475 msgid "No available song found" msgstr "Kein vorhandener Titel gefunden" #: src/window.rs:532 msgid "No songs found" msgstr "Keine Titel gefunden" #: src/window.rs:562 msgid "Added a new song" msgstr "Ein neuer Titel wurde hinzugefügt" #: src/window.rs:563 msgid "Play" msgstr "Abspielen" #. Translators: the `{}` must be left unmodified; #. it will be expanded to the number of songs added #. to the playlist #: src/window.rs:572 msgid "Added one song" msgid_plural "Added {} songs" msgstr[0] "Ein Titel wurde hinzugefügt" msgstr[1] "{} Titel wurden hinzugefügt" #: src/window.rs:1062 msgid "Unable to access dropped files" msgstr "Auf abgelegte Dateien konnte nicht zugegriffen werden" #: src/window.rs:1152 msgid "{} minute" msgid_plural "{} minutes" msgstr[0] "{} Minute" msgstr[1] "{} Minuten" #: src/window.rs:1163 msgid "{hours} hour {minutes} remaining" msgid_plural "{hours} hours {minutes} remaining" msgstr[0] "{hours} Stunde {minutes} verbleibend" msgstr[1] "{hours} Stunden {minutes} verbleibend" #. Translators: the '{}' must be left unmodified, and #. it will be replaced by the number of minutes remaining #. in the playlist #: src/window.rs:1173 msgid "{} minute remaining" msgid_plural "{} minutes remaining" msgstr[0] "{} Minute verbleibend" msgstr[1] "{} Minuten verbleibend" #: src/window.rs:1295 msgid "No song selected" msgstr "Kein Titel ausgewählt" #. Translators: The '{}' must be left unmodified, and #. it is expanded to the number of songs selected #: src/window.rs:1300 msgid "{} song selected" msgid_plural "{} songs selected" msgstr[0] "{} Titel ausgewählt" msgstr[1] "{} Titel ausgewählt" # Translators: `{title}` and `{artist}` must be left untranslated #. Translators: `{title}` and `{artist}` must be left #. untranslated; they will expand to the title and #. artist of the currently playing song, respectively #: src/window.rs:1353 msgid "Currently playing “{title}” by “{artist}”" msgstr "Aktuell wird »{title}« von »{artist}« wiedergegeben" #~ msgid "_Track" #~ msgstr "_Titel" #~ msgid "_Off" #~ msgstr "A_us" #~ msgid "Repeat All Tracks" #~ msgstr "Alle Titel wiederholen" #~ msgid "Add File" #~ msgstr "Datei hinzufügen" #~ msgid "Plays music and nothing else" #~ msgstr "Spielt Musik ab und sonst nichts" #~ msgid "Amberol cannot run in the background" #~ msgstr "Amberol kann nicht im Hintergrund laufen" #~ msgid "“{}” is not a supported audio file" #~ msgstr "»{}« ist keine unterstützte Audio-Datei" #~ msgid "Unrecognized file type for “{}”" #~ msgstr "Unbekannter Datei-Typ für »{}«" #~ msgid "Amberol is running in the background" #~ msgstr "Amberol läuft im Hintergrund" #~ msgid "Playing next" #~ msgstr "Anstehende Titel" #~ msgctxt "shortcut window" #~ msgid "Songs Queue" #~ msgstr "Titel-Warteschlange" #~ msgctxt "shortcut window" #~ msgid "Queue a Song" #~ msgstr "Einen Titel zur Warteschlange hinzufügen" #~ msgctxt "shortcut window" #~ msgid "Queue a Folder" #~ msgstr "Einen Ordner zur Warteschlange hinzufügen" #~ msgctxt "shortcut window" #~ msgid "Clear" #~ msgstr "Leeren" #~ msgctxt "shortcut window" #~ msgid "Previous Track" #~ msgstr "Vorheriger Titel" amberol-0.10.3/po/el.po000066400000000000000000000252071443320625200146010ustar00rootroot00000000000000# Greek translation for amberol. # Copyright (C) 2022 amberol's COPYRIGHT HOLDER # This file is distributed under the same license as the amberol package. # Efstathios Iosifidis , 2022. # msgid "" msgstr "" "Project-Id-Version: amberol main\n" "Report-Msgid-Bugs-To: https://gitlab.gnome.org/World/amberol/issues\n" "POT-Creation-Date: 2022-10-26 03:21+0000\n" "PO-Revision-Date: 2022-10-26 19:26+0300\n" "Last-Translator: Efstathios Iosifidis \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: Poedit 3.2\n" #: data/io.bassi.Amberol.desktop.in.in:3 #: data/io.bassi.Amberol.appdata.xml.in.in:6 msgid "Amberol" msgstr "Amberol" #: data/io.bassi.Amberol.desktop.in.in:4 msgid "Music Player" msgstr "Αναπαραγωγή μουσικής" #. Translators: Search terms to find this application. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! #: data/io.bassi.Amberol.desktop.in.in:12 msgid "music;player;media;audio;playlist;" msgstr "" #: data/io.bassi.Amberol.appdata.xml.in.in:7 msgid "Plays music, and nothing else" msgstr "Αναπαραγωγή μουσικής, τίποτα άλλο" #: data/io.bassi.Amberol.appdata.xml.in.in:9 msgid "" "Amberol is a music player with no delusions of grandeur. If you just want to " "play music available on your local system then Amberol is the music player " "you are looking for." msgstr "" #: data/io.bassi.Amberol.appdata.xml.in.in:14 msgid "Current features:" msgstr "Τρέχοντα χαρακτηριστικά:" #: data/io.bassi.Amberol.appdata.xml.in.in:16 msgid "adaptive UI" msgstr "" #: data/io.bassi.Amberol.appdata.xml.in.in:17 msgid "UI recoloring using the album art" msgstr "" #: data/io.bassi.Amberol.appdata.xml.in.in:18 msgid "drag and drop support to queue songs" msgstr "" #: data/io.bassi.Amberol.appdata.xml.in.in:19 msgid "shuffle and repeat" msgstr "τυχαία σειρά και επανάληψη" #: data/io.bassi.Amberol.appdata.xml.in.in:20 msgid "MPRIS integration" msgstr "" #: data/io.bassi.Amberol.appdata.xml.in.in:41 msgid "Emmanuele Bassi" msgstr "Emmanuele Bassi" #: src/audio/inhibit_controller.rs:40 msgid "Playback in progress" msgstr "" #: src/audio/song.rs:328 msgid "Unknown artist" msgstr "Άγνωστος καλλιτέχνης" #: src/audio/song.rs:335 msgid "Unknown title" msgstr "Άγνωστος τίτλος" #: src/audio/song.rs:342 msgid "Unknown album" msgstr "Άγνωστο άλμπουμ" #: src/gtk/help-overlay.ui:11 msgctxt "shortcut window" msgid "General" msgstr "Γενικά" #: src/gtk/help-overlay.ui:14 msgctxt "shortcut window" msgid "Toggle primary menu" msgstr "" #: src/gtk/help-overlay.ui:20 msgctxt "shortcut window" msgid "Copy song details to the clipboard" msgstr "" #: src/gtk/help-overlay.ui:26 msgctxt "shortcut window" msgid "Show Shortcuts" msgstr "Εμφάνιση συντομεύσεων" #: src/gtk/help-overlay.ui:32 msgctxt "shortcut window" msgid "Quit" msgstr "Έξοδος" #: src/gtk/help-overlay.ui:40 msgctxt "shortcut window" msgid "Playlist" msgstr "Λίστα αναπαραγωγής" #: src/gtk/help-overlay.ui:43 msgctxt "shortcut window" msgid "Add a song to the playlist" msgstr "Προσθήκη τραγουδιού στη λίστα αναπαραγωγής" #: src/gtk/help-overlay.ui:49 msgctxt "shortcut window" msgid "Add a folder to the playlist" msgstr "Προσθήκη φακέλου στη λίστα αναπαραγωγής" #: src/gtk/help-overlay.ui:55 msgctxt "shortcut window" msgid "Clear the playlist" msgstr "" #: src/gtk/help-overlay.ui:61 msgctxt "shortcut window" msgid "Toggle the playlist pane" msgstr "" #: src/gtk/help-overlay.ui:67 msgctxt "shortcut window" msgid "Toggle shuffling songs" msgstr "" #: src/gtk/help-overlay.ui:75 msgctxt "shortcut window" msgid "Playback" msgstr "Αναπαραγωγή" #: src/gtk/help-overlay.ui:78 msgctxt "shortcut window" msgid "Toggle Play/Pause" msgstr "" #: src/gtk/help-overlay.ui:84 msgctxt "shortcut window" msgid "Previous song" msgstr "Προηγούμενο τραγούδι" #: src/gtk/help-overlay.ui:90 msgctxt "shortcut window" msgid "Next song" msgstr "Επόμενο τραγούδι" #: src/gtk/help-overlay.ui:96 msgctxt "shortcut window" msgid "Seek backwards in the current song" msgstr "" #: src/gtk/help-overlay.ui:102 msgctxt "shortcut window" msgid "Seek forward in the current song" msgstr "" #: src/gtk/playback-control.ui:30 msgctxt "a11y" msgid "Elapsed time" msgstr "" #: src/gtk/playback-control.ui:42 msgctxt "a11y" msgid "Remaining time" msgstr "" #: src/gtk/playback-control.ui:64 msgid "Play the Previous Song" msgstr "" #: src/gtk/playback-control.ui:69 msgctxt "a11y" msgid "Skip backwards" msgstr "" #: src/gtk/playback-control.ui:78 msgid "Toggle Play" msgstr "" #: src/gtk/playback-control.ui:84 msgctxt "a11y" msgid "Toggle play" msgstr "" #: src/gtk/playback-control.ui:93 msgid "Play the Next Song" msgstr "Αναπαραγωγή επόμενου τραγουδιού" #: src/gtk/playback-control.ui:98 msgctxt "a11y" msgid "Skip forward" msgstr "" #: src/gtk/playback-control.ui:121 msgid "Toggle Playlist" msgstr "" #: src/gtk/playback-control.ui:126 msgctxt "a11y" msgid "Toggle playlist" msgstr "" #: src/gtk/playback-control.ui:135 msgid "Shuffle the Playlist" msgstr "" #: src/gtk/playback-control.ui:137 msgctxt "a11y" msgid "Shuffle" msgstr "Τυχαία σειρά" #: src/gtk/playback-control.ui:156 src/playback_control.rs:153 msgid "Enable Repeat" msgstr "" #: src/gtk/playback-control.ui:161 msgctxt "a11y" msgid "Repeat" msgstr "Επανάληψη" #: src/gtk/playback-control.ui:172 msgid "Main Menu" msgstr "Κυρίως μενού" #: src/gtk/playback-control.ui:177 msgctxt "a11y" msgid "Primary menu" msgstr "" #: src/gtk/playback-control.ui:193 msgid "Copy" msgstr "Αντιγραφή" #: src/gtk/playback-control.ui:199 msgid "Add _Song" msgstr "" #: src/gtk/playback-control.ui:203 msgid "Add _Folder" msgstr "" #: src/gtk/playback-control.ui:207 msgid "Clear" msgstr "Εκκαθάριση" #: src/gtk/playback-control.ui:213 msgid "_Match Cover Art" msgstr "" #: src/gtk/playback-control.ui:219 msgid "_ReplayGain" msgstr "" #: src/gtk/playback-control.ui:221 msgid "_Album" msgstr "Ά_λμπουμ" #: src/gtk/playback-control.ui:226 msgid "_Track" msgstr "" #: src/gtk/playback-control.ui:231 msgid "_Off" msgstr "" #: src/gtk/playback-control.ui:239 msgid "_Keyboard Shortcuts" msgstr "" #: src/gtk/playback-control.ui:243 msgid "_About Amberol" msgstr "" #: src/gtk/playback-control.ui:247 msgid "_Quit" msgstr "Έ_ξοδος" #: src/gtk/playlist-view.ui:19 msgid "Playlist" msgstr "Λίστα αναπαραγωγής" #: src/gtk/playlist-view.ui:49 msgid "Search Songs in the Playlist" msgstr "Αναζήτηση τραγουδιών στη λίστα αναπαραγωγής" #: src/gtk/playlist-view.ui:61 msgid "Select Songs in the Playlist" msgstr "Επιλογή τραγουδιών στη λίστα αναπαραγωγής" #: src/gtk/playlist-view.ui:74 msgid "Close the Playlist" msgstr "Κλείσιμο λίστας αναπαραγωγής" #: src/gtk/playlist-view.ui:135 msgid "Select All Songs" msgstr "Επιλογή όλων των τραγουδιών" #: src/gtk/playlist-view.ui:148 msgid "Remove Selected Songs" msgstr "Αφαίρεση επιλεγμένων τραγουδιών" #: src/gtk/window.ui:12 msgid "Drop a song to add it to the queue" msgstr "" #: src/gtk/window.ui:49 msgid "" "Select a file or a folder, or drag files from your file manager to the " "application window to add songs to the playlist" msgstr "" #: src/gtk/window.ui:58 msgid "Add Folder" msgstr "Προσθήκη φακέλου" #: src/gtk/window.ui:68 msgid "Add File" msgstr "Προσθήκη αρχείου" #. Translators: Replace "translator-credits" with your names, one name per line #: src/application.rs:188 msgid "translator-credits" msgstr "" #: src/playback_control.rs:157 msgid "Repeat All Tracks" msgstr "Επανάληψη όλων των κομματιών" #: src/playback_control.rs:161 msgid "Repeat the Current Track" msgstr "Επανάληψη του τρέχοντος κομματιού" #: src/window.rs:409 msgid "_Add Song" msgstr "" #: src/window.rs:410 src/window.rs:450 msgid "_Cancel" msgstr "" #: src/window.rs:412 msgid "Open File" msgstr "Άνοιγμα αρχείου" #: src/window.rs:419 msgid "Audio files" msgstr "Αρχεία ήχου" #: src/window.rs:428 src/window.rs:1276 msgid "Unable to access files" msgstr "Αδυναμία πρόσβασης στα αρχεία" #: src/window.rs:449 msgid "_Add Folder" msgstr "_Προσθήκη φακέλου" #: src/window.rs:452 msgid "Open Folder" msgstr "Άνοιγμα φακέλου" #: src/window.rs:463 msgid "Unable to access folders" msgstr "" #: src/window.rs:475 msgid "No available song found" msgstr "" #: src/window.rs:523 msgid "No songs found" msgstr "Δεν βρέθηκαν τραγούδια" #: src/window.rs:549 msgid "Added a new song" msgstr "" #: src/window.rs:550 msgid "Play" msgstr "Aναπαραγωγή" #. Translators: the `{}` must be left unmodified; #. it will be expanded to the number of songs added #. to the playlist #: src/window.rs:559 msgid "Added one song" msgid_plural "Added {} songs" msgstr[0] "" msgstr[1] "" #: src/window.rs:1012 msgid "Unable to access dropped files" msgstr "" #: src/window.rs:1106 msgid "{} minute" msgid_plural "{} minutes" msgstr[0] "" msgstr[1] "" #: src/window.rs:1117 msgid "{hours} hour {minutes} remaining" msgid_plural "{hours} hours {minutes} remaining" msgstr[0] "" msgstr[1] "" #. Translators: the '{}' must be left unmodified, and #. it will be replaced by the number of minutes remaining #. in the playlist #: src/window.rs:1127 msgid "{} minute remaining" msgid_plural "{} minutes remaining" msgstr[0] "" msgstr[1] "{} minutes remaining" #: src/window.rs:1256 msgid "No song selected" msgstr "Δεν επιλέχθηκε τραγούδι" #. Translators: The '{}' must be left unmodified, and #. it is expanded to the number of songs selected #: src/window.rs:1261 msgid "{} song selected" msgid_plural "{} songs selected" msgstr[0] "" msgstr[1] "" #. Translators: `{title}` and `{artist}` must be left #. untranslated; they will expand to the title and #. artist of the currently playing song, respectively #: src/window.rs:1314 msgid "Currently playing “{title}” by “{artist}”" msgstr "" #: src/window.rs:1360 msgid "Amberol needs to run in the background to play music" msgstr "" #: src/window.rs:1373 msgid "Amberol cannot run in the background" msgstr "" amberol-0.10.3/po/en_GB.po000066400000000000000000000257141443320625200151560ustar00rootroot00000000000000# British English translation for amberol. # Copyright (C) 2022 amberol's COPYRIGHT HOLDER # This file is distributed under the same license as the amberol package. # Bruce Cowan , 2022. # msgid "" msgstr "" "Project-Id-Version: amberol main\n" "Report-Msgid-Bugs-To: https://gitlab.gnome.org/World/amberol/issues\n" "POT-Creation-Date: 2022-11-02 17:44+0000\n" "PO-Revision-Date: 2022-12-05 13:06+0000\n" "Last-Translator: Bruce Cowan \n" "Language-Team: English - United Kingdom \n" "Language: en_GB\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: Gtranslator 42.0\n" #: data/io.bassi.Amberol.desktop.in.in:3 #: data/io.bassi.Amberol.appdata.xml.in.in:6 msgid "Amberol" msgstr "Amberol" #: data/io.bassi.Amberol.desktop.in.in:4 msgid "Music Player" msgstr "Music Player" #. Translators: Search terms to find this application. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! #: data/io.bassi.Amberol.desktop.in.in:12 msgid "music;player;media;audio;playlist;" msgstr "music;player;media;audio;playlist;" #: data/io.bassi.Amberol.appdata.xml.in.in:7 msgid "Plays music, and nothing else" msgstr "Plays music, and nothing else" #: data/io.bassi.Amberol.appdata.xml.in.in:9 msgid "" "Amberol is a music player with no delusions of grandeur. If you just want to " "play music available on your local system then Amberol is the music player " "you are looking for." msgstr "" "Amberol is a music player with no delusions of grandeur. If you just want to " "play music available on your local system then Amberol is the music player " "you are looking for." #: data/io.bassi.Amberol.appdata.xml.in.in:14 msgid "Current features:" msgstr "Current features:" #: data/io.bassi.Amberol.appdata.xml.in.in:16 msgid "adaptive UI" msgstr "adaptive UI" #: data/io.bassi.Amberol.appdata.xml.in.in:17 msgid "UI recoloring using the album art" msgstr "UI recolouring using the album art" #: data/io.bassi.Amberol.appdata.xml.in.in:18 msgid "drag and drop support to queue songs" msgstr "drag and drop support to queue songs" #: data/io.bassi.Amberol.appdata.xml.in.in:19 msgid "shuffle and repeat" msgstr "shuffle and repeat" #: data/io.bassi.Amberol.appdata.xml.in.in:20 msgid "MPRIS integration" msgstr "MPRIS integration" #: data/io.bassi.Amberol.appdata.xml.in.in:41 msgid "Emmanuele Bassi" msgstr "Emmanuele Bassi" #: src/audio/inhibit_controller.rs:40 msgid "Playback in progress" msgstr "Playback in progress" #: src/audio/song.rs:328 msgid "Unknown artist" msgstr "Unknown artist" #: src/audio/song.rs:335 msgid "Unknown title" msgstr "Unknown title" #: src/audio/song.rs:342 msgid "Unknown album" msgstr "Unknown album" #: src/gtk/help-overlay.ui:11 msgctxt "shortcut window" msgid "General" msgstr "General" #: src/gtk/help-overlay.ui:14 msgctxt "shortcut window" msgid "Toggle primary menu" msgstr "Toggle primary menu" #: src/gtk/help-overlay.ui:20 msgctxt "shortcut window" msgid "Copy song details to the clipboard" msgstr "Copy song details to the clipboard" #: src/gtk/help-overlay.ui:26 msgctxt "shortcut window" msgid "Show Shortcuts" msgstr "Show Shortcuts" #: src/gtk/help-overlay.ui:32 msgctxt "shortcut window" msgid "Quit" msgstr "Quit" #: src/gtk/help-overlay.ui:40 msgctxt "shortcut window" msgid "Playlist" msgstr "Playlist" #: src/gtk/help-overlay.ui:43 msgctxt "shortcut window" msgid "Add a song to the playlist" msgstr "Add a song to the playlist" #: src/gtk/help-overlay.ui:49 msgctxt "shortcut window" msgid "Add a folder to the playlist" msgstr "Add a folder to the playlist" #: src/gtk/help-overlay.ui:55 msgctxt "shortcut window" msgid "Clear the playlist" msgstr "Clear the playlist" #: src/gtk/help-overlay.ui:61 msgctxt "shortcut window" msgid "Toggle the playlist pane" msgstr "Toggle the playlist pane" #: src/gtk/help-overlay.ui:67 msgctxt "shortcut window" msgid "Toggle shuffling songs" msgstr "Toggle shuffling songs" #: src/gtk/help-overlay.ui:75 msgctxt "shortcut window" msgid "Playback" msgstr "Playback" #: src/gtk/help-overlay.ui:78 msgctxt "shortcut window" msgid "Toggle Play/Pause" msgstr "Toggle Play/Pause" #: src/gtk/help-overlay.ui:84 msgctxt "shortcut window" msgid "Previous song" msgstr "Previous song" #: src/gtk/help-overlay.ui:90 msgctxt "shortcut window" msgid "Next song" msgstr "Next song" #: src/gtk/help-overlay.ui:96 msgctxt "shortcut window" msgid "Seek backwards in the current song" msgstr "Seek backwards in the current song" #: src/gtk/help-overlay.ui:102 msgctxt "shortcut window" msgid "Seek forward in the current song" msgstr "Seek forward in the current song" #: src/gtk/playback-control.ui:30 msgctxt "a11y" msgid "Elapsed time" msgstr "Elapsed time" #: src/gtk/playback-control.ui:42 msgctxt "a11y" msgid "Remaining time" msgstr "Remaining time" #: src/gtk/playback-control.ui:64 msgid "Play the Previous Song" msgstr "Play the Previous Song" #: src/gtk/playback-control.ui:69 msgctxt "a11y" msgid "Skip backwards" msgstr "Skip backwards" #: src/gtk/playback-control.ui:78 msgid "Toggle Play" msgstr "Toggle Play" #: src/gtk/playback-control.ui:84 msgctxt "a11y" msgid "Toggle play" msgstr "Toggle play" #: src/gtk/playback-control.ui:93 msgid "Play the Next Song" msgstr "Play the Next Song" #: src/gtk/playback-control.ui:98 msgctxt "a11y" msgid "Skip forward" msgstr "Skip forward" #: src/gtk/playback-control.ui:121 msgid "Toggle Playlist" msgstr "Toggle Playlist" #: src/gtk/playback-control.ui:126 msgctxt "a11y" msgid "Toggle playlist" msgstr "Toggle playlist" #: src/gtk/playback-control.ui:135 msgid "Shuffle the Playlist" msgstr "Shuffle the Playlist" #: src/gtk/playback-control.ui:137 msgctxt "a11y" msgid "Shuffle" msgstr "Shuffle" #: src/gtk/playback-control.ui:156 src/playback_control.rs:153 msgid "Enable Repeat" msgstr "Enable Repeat" #: src/gtk/playback-control.ui:161 msgctxt "a11y" msgid "Repeat" msgstr "Repeat" #: src/gtk/playback-control.ui:172 msgid "Main Menu" msgstr "Main Menu" #: src/gtk/playback-control.ui:177 msgctxt "a11y" msgid "Primary menu" msgstr "Primary menu" #: src/gtk/playback-control.ui:193 msgid "Copy" msgstr "Copy" #: src/gtk/playback-control.ui:199 msgid "Add _Song" msgstr "Add _Song" #: src/gtk/playback-control.ui:203 msgid "Add _Folder" msgstr "Add _Folder" #: src/gtk/playback-control.ui:207 msgid "Clear" msgstr "Clear" #: src/gtk/playback-control.ui:213 msgid "_Match Cover Art" msgstr "_Match Cover Art" #: src/gtk/playback-control.ui:219 msgid "_ReplayGain" msgstr "_ReplayGain" #: src/gtk/playback-control.ui:221 msgid "_Album" msgstr "_Album" #: src/gtk/playback-control.ui:226 msgid "_Track" msgstr "_Track" #: src/gtk/playback-control.ui:231 msgid "_Off" msgstr "_Off" #: src/gtk/playback-control.ui:239 msgid "_Keyboard Shortcuts" msgstr "_Keyboard Shortcuts" #: src/gtk/playback-control.ui:243 msgid "_About Amberol" msgstr "_About Amberol" #: src/gtk/playback-control.ui:247 msgid "_Quit" msgstr "_Quit" #: src/gtk/playlist-view.ui:19 msgid "Playlist" msgstr "Playlist" #: src/gtk/playlist-view.ui:49 msgid "Search Songs in the Playlist" msgstr "Search Songs in the Playlist" #: src/gtk/playlist-view.ui:61 msgid "Select Songs in the Playlist" msgstr "Select Songs in the Playlist" #: src/gtk/playlist-view.ui:74 msgid "Close the Playlist" msgstr "Close the Playlist" #: src/gtk/playlist-view.ui:135 msgid "Select All Songs" msgstr "Select All Songs" #: src/gtk/playlist-view.ui:148 msgid "Remove Selected Songs" msgstr "Remove Selected Songs" #: src/gtk/window.ui:12 msgid "Drop a song to add it to the queue" msgstr "Drop a song to add it to the queue" #: src/gtk/window.ui:49 msgid "" "Select a file or a folder, or drag files from your file manager to the " "application window to add songs to the playlist" msgstr "" "Select a file or a folder, or drag files from your file manager to the " "application window to add songs to the playlist" #: src/gtk/window.ui:58 msgid "Add Folder" msgstr "Add Folder" #: src/gtk/window.ui:68 msgid "Add File" msgstr "Add File" #. Translators: Replace "translator-credits" with your names, one name per line #: src/application.rs:188 msgid "translator-credits" msgstr "Bruce Cowan " #: src/playback_control.rs:157 msgid "Repeat All Tracks" msgstr "Repeat All Tracks" #: src/playback_control.rs:161 msgid "Repeat the Current Track" msgstr "Repeat the Current Track" #: src/window.rs:409 msgid "_Add Song" msgstr "_Add Song" #: src/window.rs:410 src/window.rs:450 msgid "_Cancel" msgstr "_Cancel" #: src/window.rs:412 msgid "Open File" msgstr "Open File" #: src/window.rs:419 msgid "Audio files" msgstr "Audio files" #: src/window.rs:428 src/window.rs:1276 msgid "Unable to access files" msgstr "Unable to access files" #: src/window.rs:449 msgid "_Add Folder" msgstr "_Add Folder" #: src/window.rs:452 msgid "Open Folder" msgstr "Open Folder" #: src/window.rs:463 msgid "Unable to access folders" msgstr "Unable to access folders" #: src/window.rs:475 msgid "No available song found" msgstr "No available song found" #: src/window.rs:523 msgid "No songs found" msgstr "No songs found" #: src/window.rs:549 msgid "Added a new song" msgstr "Added a new song" #: src/window.rs:550 msgid "Play" msgstr "Play" #. Translators: the `{}` must be left unmodified; #. it will be expanded to the number of songs added #. to the playlist #: src/window.rs:559 msgid "Added one song" msgid_plural "Added {} songs" msgstr[0] "Added one song" msgstr[1] "Added {} songs" #: src/window.rs:1012 msgid "Unable to access dropped files" msgstr "Unable to access dropped files" #: src/window.rs:1106 msgid "{} minute" msgid_plural "{} minutes" msgstr[0] "{} minute" msgstr[1] "{} minutes" #: src/window.rs:1117 msgid "{hours} hour {minutes} remaining" msgid_plural "{hours} hours {minutes} remaining" msgstr[0] "{hours} hour {minutes} remaining" msgstr[1] "{hours} hours {minutes} remaining" #. Translators: the '{}' must be left unmodified, and #. it will be replaced by the number of minutes remaining #. in the playlist #: src/window.rs:1127 msgid "{} minute remaining" msgid_plural "{} minutes remaining" msgstr[0] "{} minute remaining" msgstr[1] "{} minutes remaining" #: src/window.rs:1256 msgid "No song selected" msgstr "No song selected" #. Translators: The '{}' must be left unmodified, and #. it is expanded to the number of songs selected #: src/window.rs:1261 msgid "{} song selected" msgid_plural "{} songs selected" msgstr[0] "{} song selected" msgstr[1] "{} songs selected" #. Translators: `{title}` and `{artist}` must be left #. untranslated; they will expand to the title and #. artist of the currently playing song, respectively #: src/window.rs:1314 msgid "Currently playing “{title}” by “{artist}”" msgstr "Currently playing “{title}” by “{artist}”" #: src/window.rs:1360 msgid "Amberol needs to run in the background to play music" msgstr "Amberol needs to run in the background to play music" #: src/window.rs:1373 msgid "Amberol cannot run in the background" msgstr "Amberol cannot run in the background" amberol-0.10.3/po/es.po000066400000000000000000000311621443320625200146050ustar00rootroot00000000000000# Spanish translation for amberol. # Copyright (C) 2022 amberol's COPYRIGHT HOLDER # This file is distributed under the same license as the amberol package. # Daniel Mustieles , 2022-2023. # msgid "" msgstr "" "Project-Id-Version: amberol main\n" "Report-Msgid-Bugs-To: https://gitlab.gnome.org/World/amberol/issues\n" "POT-Creation-Date: 2023-02-22 13:07+0000\n" "PO-Revision-Date: 2023-03-14 13:18+0100\n" "Last-Translator: Daniel Mustieles \n" "Language-Team: Spanish - Spain \n" "Language: es_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: Gtranslator 42.0\n" #: data/io.bassi.Amberol.desktop.in.in:3 #: data/io.bassi.Amberol.appdata.xml.in.in:6 msgid "Amberol" msgstr "Amberol" #: data/io.bassi.Amberol.desktop.in.in:4 msgid "Music Player" msgstr "Reproductor de música" #. Translators: Search terms to find this application. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! #: data/io.bassi.Amberol.desktop.in.in:12 msgid "music;player;media;audio;playlist;" msgstr "música;sonido;reproductor;medio;lista;reproducción;" #: data/io.bassi.Amberol.appdata.xml.in.in:7 msgid "Plays music, and nothing else" msgstr "Reproducir música y nada más" #: data/io.bassi.Amberol.appdata.xml.in.in:9 msgid "" "Amberol is a music player with no delusions of grandeur. If you just want to " "play music available on your local system then Amberol is the music player " "you are looking for." msgstr "" "Amberol es un reproductor de música sin aires de grandeza. Si sólo quiere " "reproducir música disponible en su sistema local Amberol es el reproductor " "que estaba buscando." #: data/io.bassi.Amberol.appdata.xml.in.in:14 msgid "Current features:" msgstr "Características actuales" #: data/io.bassi.Amberol.appdata.xml.in.in:16 msgid "adaptive UI" msgstr "IU adaptativa" #: data/io.bassi.Amberol.appdata.xml.in.in:17 msgid "UI recoloring using the album art" msgstr "Colorear la IU usando el diseño del álbum" #: data/io.bassi.Amberol.appdata.xml.in.in:18 msgid "drag and drop support to queue songs" msgstr "soporte de arrastrar y soltar para añadir canciones a la cola" #: data/io.bassi.Amberol.appdata.xml.in.in:19 msgid "shuffle and repeat" msgstr "mezclar y repetir" #: data/io.bassi.Amberol.appdata.xml.in.in:20 msgid "MPRIS integration" msgstr "Integración con MPRIS" #: data/io.bassi.Amberol.appdata.xml.in.in:42 msgid "Emmanuele Bassi" msgstr "Emmanuele Bassi" #: src/audio/inhibit_controller.rs:40 msgid "Playback in progress" msgstr "Reproducción en progreso" #: src/audio/song.rs:337 msgid "Unknown artist" msgstr "Artista desconocido" #: src/audio/song.rs:344 msgid "Unknown title" msgstr "Título desconocido" #: src/audio/song.rs:351 msgid "Unknown album" msgstr "Álbum desconocido" #: src/gtk/help-overlay.ui:11 msgctxt "shortcut window" msgid "General" msgstr "General" #: src/gtk/help-overlay.ui:14 msgctxt "shortcut window" msgid "Toggle primary menu" msgstr "Conmutar el menú primario" #: src/gtk/help-overlay.ui:20 msgctxt "shortcut window" msgid "Copy song details to the clipboard" msgstr "Copiar los detalles de la canción al portapapeles" #: src/gtk/help-overlay.ui:26 msgctxt "shortcut window" msgid "Show shortcuts" msgstr "Mostrar atajos" #: src/gtk/help-overlay.ui:32 msgctxt "shortcut window" msgid "Quit" msgstr "Salir" #: src/gtk/help-overlay.ui:40 msgctxt "shortcut window" msgid "Playlist" msgstr "Lista de reproducción" #: src/gtk/help-overlay.ui:43 msgctxt "shortcut window" msgid "Add a song to the playlist" msgstr "Añadir una canción a la lista de reproducción" #: src/gtk/help-overlay.ui:49 msgctxt "shortcut window" msgid "Add a folder to the playlist" msgstr "Añadir una carpeta a la lista de reproducción" #: src/gtk/help-overlay.ui:55 msgctxt "shortcut window" msgid "Clear the playlist" msgstr "Limpiar la lista de reproducción" #: src/gtk/help-overlay.ui:61 msgctxt "shortcut window" msgid "Toggle the playlist pane" msgstr "Conmutar el panel de lista de reproducción" #: src/gtk/help-overlay.ui:67 msgctxt "shortcut window" msgid "Toggle shuffling songs" msgstr "Conmutar la mezcla de canciones" #: src/gtk/help-overlay.ui:75 msgctxt "shortcut window" msgid "Playback" msgstr "Reproducción" #: src/gtk/help-overlay.ui:78 msgctxt "shortcut window" msgid "Toggle play/pause" msgstr "Conmutar la pausar/reproducción" #: src/gtk/help-overlay.ui:84 msgctxt "shortcut window" msgid "Previous song" msgstr "Canción anterior" #: src/gtk/help-overlay.ui:90 msgctxt "shortcut window" msgid "Next song" msgstr "Siguiente canción" #: src/gtk/help-overlay.ui:96 msgctxt "shortcut window" msgid "Seek backwards in the current song" msgstr "Buscar hacia atrás en la canción actual" #: src/gtk/help-overlay.ui:102 msgctxt "shortcut window" msgid "Seek forward in the current song" msgstr "Buscar hacia adelante en la canción actual" #: src/gtk/playback-control.ui:35 msgctxt "a11y" msgid "Elapsed time" msgstr "Tiempo transcurrido" #: src/gtk/playback-control.ui:47 msgctxt "a11y" msgid "Remaining time" msgstr "Tiempo restante" #: src/gtk/playback-control.ui:69 msgid "Play the Previous Song" msgstr "Reproducir la canción anterior" #: src/gtk/playback-control.ui:74 msgctxt "a11y" msgid "Skip backwards" msgstr "Saltar hacia atrás" #: src/gtk/playback-control.ui:83 msgid "Toggle Play" msgstr "Conmutar la reproducción" #: src/gtk/playback-control.ui:89 msgctxt "a11y" msgid "Toggle play" msgstr "Conmutar la reproducción" #: src/gtk/playback-control.ui:98 msgid "Play the Next Song" msgstr "Reproducir la siguiente canción" #: src/gtk/playback-control.ui:103 msgctxt "a11y" msgid "Skip forward" msgstr "Saltar hacia adelante" #: src/gtk/playback-control.ui:126 msgid "Toggle Playlist" msgstr "Conmutar la lista de reproducción" #: src/gtk/playback-control.ui:131 msgctxt "a11y" msgid "Toggle playlist" msgstr "Conmutar la lista de reproducción" #: src/gtk/playback-control.ui:140 msgid "Shuffle the Playlist" msgstr "Mezclar la lista de reproducción" #: src/gtk/playback-control.ui:142 msgctxt "a11y" msgid "Shuffle" msgstr "Mezclar" #: src/gtk/playback-control.ui:161 src/playback_control.rs:153 msgid "Enable Repeat" msgstr "Activar la repetición" #: src/gtk/playback-control.ui:166 msgctxt "a11y" msgid "Repeat" msgstr "Repetir" #: src/gtk/playback-control.ui:177 msgid "Main Menu" msgstr "Menú principal" #: src/gtk/playback-control.ui:183 msgctxt "a11y" msgid "Primary menu" msgstr "Menú primario" #: src/gtk/playback-control.ui:199 msgid "Copy" msgstr "Copiar" #: src/gtk/playback-control.ui:205 msgid "Add _Song" msgstr "_Añadir canción" #: src/gtk/playback-control.ui:209 msgid "Add _Folder" msgstr "Añadir ca_rpeta" #: src/gtk/playback-control.ui:213 msgid "Clear" msgstr "Limpiar" #: src/gtk/playback-control.ui:219 msgid "_Match Cover Art" msgstr "_Coincidir con diseño de portada" #: src/gtk/playback-control.ui:223 msgid "_Background Playback" msgstr "_Reproducción en segundo plano" #: src/gtk/playback-control.ui:229 msgid "_ReplayGain" msgstr "_Reproducir otra vez" #: src/gtk/playback-control.ui:231 msgid "_Album" msgstr "_Álbum" #: src/gtk/playback-control.ui:236 msgid "_Track" msgstr "_Pista" #: src/gtk/playback-control.ui:241 msgid "_Off" msgstr "_Apagar" #: src/gtk/playback-control.ui:249 msgid "_Keyboard Shortcuts" msgstr "Atajos del _teclado" #: src/gtk/playback-control.ui:253 msgid "_About Amberol" msgstr "Acerca _de Amberol" #: src/gtk/playback-control.ui:257 msgid "_Quit" msgstr "_Salir" #: src/gtk/playlist-view.ui:19 msgid "Playlist" msgstr "Lista de reproducción" #: src/gtk/playlist-view.ui:49 msgid "Search Songs in the Playlist" msgstr "Buscar canciones en la lista de reproducción" #: src/gtk/playlist-view.ui:61 msgid "Select Songs in the Playlist" msgstr "Seleccionar canciones en la lista de reproducción" #: src/gtk/playlist-view.ui:74 msgid "Close the Playlist" msgstr "Cerrar la lista de reproducción" #: src/gtk/playlist-view.ui:135 msgid "Select All Songs" msgstr "Seleccionar todas las canciones" #: src/gtk/playlist-view.ui:148 msgid "Remove Selected Songs" msgstr "Quitar las canciones seleccionadas" #: src/gtk/window.ui:12 msgid "Drop a song to add it to the queue" msgstr "Suelte una canción para añadirla a la cola" #: src/gtk/window.ui:49 msgid "" "Select a file or a folder, or drag files from your file manager to the " "application window to add songs to the playlist" msgstr "" "Seleccione un archivo o una carpeta o arrastre archivos desde su gestor de " "archivos a la ventana de la aplicación para añadir canciones a la lista de " "reproducción" #: src/gtk/window.ui:58 msgid "Restore Playlist" msgstr "Restaurar lista de reproducción" #: src/gtk/window.ui:68 msgid "Add Folder" msgstr "Añadir carpeta" #: src/gtk/window.ui:77 msgid "Add Song" msgstr "Añadir canción" #. Translators: Replace "translator-credits" with your names, one name per line #: src/application.rs:233 msgid "translator-credits" msgstr "Daniel Mustieles , 2022 - 2023" #: src/application.rs:247 msgid "Amberol needs to run in the background to play music" msgstr "Amberol debe ejecutarse en segundo plano para reproducir música" #: src/playback_control.rs:157 msgid "Repeat All Tracks" msgstr "Repetir todas las pistas" #: src/playback_control.rs:161 msgid "Repeat the Current Track" msgstr "Repetir la pista actual" #: src/window.rs:397 msgid "_Add Song" msgstr "_Añadir canción" #: src/window.rs:398 src/window.rs:438 msgid "_Cancel" msgstr "C_ancelar" #: src/window.rs:400 msgid "Open File" msgstr "Abrir archivo" #: src/window.rs:407 msgid "Audio files" msgstr "Archivos de sonido" #: src/window.rs:416 src/window.rs:1306 msgid "Unable to access files" msgstr "No se puede acceder a los archivos" #: src/window.rs:437 msgid "_Add Folder" msgstr "Añadir ca_rpeta" #: src/window.rs:440 msgid "Open Folder" msgstr "Abrir carpeta" #: src/window.rs:451 msgid "Unable to access folders" msgstr "No se puede acceder a las carpetas" #: src/window.rs:469 msgid "No available song found" msgstr "No hay ninguna canción disponible" #: src/window.rs:526 msgid "No songs found" msgstr "No se han encontrado canciones" #: src/window.rs:556 msgid "Added a new song" msgstr "Se ha añadido una canción nueva" #: src/window.rs:557 msgid "Play" msgstr "Reproducir" #. Translators: the `{}` must be left unmodified; #. it will be expanded to the number of songs added #. to the playlist #: src/window.rs:566 msgid "Added one song" msgid_plural "Added {} songs" msgstr[0] "Se ha añadido una canción" msgstr[1] "Se han añadido {} canciones" #: src/window.rs:1056 msgid "Unable to access dropped files" msgstr "No se puede acceder a los archivos que ha soltado" #: src/window.rs:1149 msgid "{} minute" msgid_plural "{} minutes" msgstr[0] "{} minuto" msgstr[1] "{} minutos" #: src/window.rs:1160 msgid "{hours} hour {minutes} remaining" msgid_plural "{hours} hours {minutes} remaining" msgstr[0] "Queda {hours} hora {minutes}" msgstr[1] "Quedan {hours} horas {minutes}" #. Translators: the '{}' must be left unmodified, and #. it will be replaced by the number of minutes remaining #. in the playlist #: src/window.rs:1170 msgid "{} minute remaining" msgid_plural "{} minutes remaining" msgstr[0] "Queda {} minuto" msgstr[1] "Quedan {} minutos" #: src/window.rs:1286 msgid "No song selected" msgstr "Ninguna canción seleccionada" #. Translators: The '{}' must be left unmodified, and #. it is expanded to the number of songs selected #: src/window.rs:1291 msgid "{} song selected" msgid_plural "{} songs selected" msgstr[0] "{} canción seleccionada" msgstr[1] "{} canciones seleccionadas" #. Translators: `{title}` and `{artist}` must be left #. untranslated; they will expand to the title and #. artist of the currently playing song, respectively #: src/window.rs:1344 msgid "Currently playing “{title}” by “{artist}”" msgstr "Reproduciendo actualmente «{title}» de «{artist}»" #~ msgctxt "shortcut window" #~ msgid "Songs Queue" #~ msgstr "Cola de canciones" #~ msgctxt "shortcut window" #~ msgid "Queue a Song" #~ msgstr "Añadir una canción a la cola" #~ msgctxt "shortcut window" #~ msgid "Clear" #~ msgstr "Limpiar" #~ msgctxt "shortcut window" #~ msgid "Previous Track" #~ msgstr "Pista anterior" #~ msgid "Playing next" #~ msgstr "Reproducir siguiente" #~ msgid "Choose a folder" #~ msgstr "Elegir una carpeta" #~ msgid "Plays music and nothing else" #~ msgstr "Reproducir música y nada más" #~ msgid "Unrecognized file type for “{}”" #~ msgstr "Tipo de archivo no reconocido para «{}»" #~ msgid "“{}” is not a supported audio file" #~ msgstr "«{}» no es un archivo de sonido soportado" amberol-0.10.3/po/eu.po000066400000000000000000000317751443320625200146210ustar00rootroot00000000000000# Basque translation for amberol. # Copyright (C) 2022 amberol's COPYRIGHT HOLDER # This file is distributed under the same license as the amberol package. # Asier Sarasua Garmendia , 2022, 2023. # msgid "" msgstr "Project-Id-Version: amberol main\n" "Report-Msgid-Bugs-To: https://gitlab.gnome.org/World/amberol/issues\n" "POT-Creation-Date: 2023-02-22 13:07+0000\n" "PO-Revision-Date: 2023-03-04 20:28+0000\n" "Last-Translator: Asier Sarasua Garmendia \n" "Language-Team: Basque \n" "Language: eu\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" #: data/io.bassi.Amberol.desktop.in.in:3 #: data/io.bassi.Amberol.appdata.xml.in.in:6 msgid "Amberol" msgstr "Amberol" #: data/io.bassi.Amberol.desktop.in.in:4 msgid "Music Player" msgstr "Musika-erreproduzigailua" #. Translators: Search terms to find this application. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! #: data/io.bassi.Amberol.desktop.in.in:12 msgid "music;player;media;audio;playlist;" msgstr "musika;erreproduzigailua;multimedia;audioa;erreprodukzio-zerrenda" #: data/io.bassi.Amberol.appdata.xml.in.in:7 msgid "Plays music, and nothing else" msgstr "Musika erreproduzitzen du, besterik ez" #: data/io.bassi.Amberol.appdata.xml.in.in:9 msgid "" "Amberol is a music player with no delusions of grandeur. If you just want to " "play music available on your local system then Amberol is the music player " "you are looking for." msgstr "Amberol handinahirik gabeko musika-erreproduzigailu bat da. Zure sistema lokalean duzun musika entzun nahi baduzu, Amberol da behar duzun erreproduzigailua." #: data/io.bassi.Amberol.appdata.xml.in.in:14 msgid "Current features:" msgstr "Uneko eginbideak:" #: data/io.bassi.Amberol.appdata.xml.in.in:16 msgid "adaptive UI" msgstr "interfaze moldakorra" #: data/io.bassi.Amberol.appdata.xml.in.in:17 msgid "UI recoloring using the album art" msgstr "interfazearen kolorea aldatzen da albumaren itxura erabilita" #: data/io.bassi.Amberol.appdata.xml.in.in:18 msgid "drag and drop support to queue songs" msgstr "arrastatu eta jaregiteko euskarria abestiak ilaran jartzeko" #: data/io.bassi.Amberol.appdata.xml.in.in:19 msgid "shuffle and repeat" msgstr "ausaz erreproduzitu eta errepikatu" #: data/io.bassi.Amberol.appdata.xml.in.in:20 msgid "MPRIS integration" msgstr "MPRIS integrazioa" #: data/io.bassi.Amberol.appdata.xml.in.in:42 msgid "Emmanuele Bassi" msgstr "Emmanuele Bassi" #: src/audio/inhibit_controller.rs:40 msgid "Playback in progress" msgstr "Erreprodukzioa abian" #: src/audio/song.rs:337 msgid "Unknown artist" msgstr "Artista ezezaguna" #: src/audio/song.rs:344 msgid "Unknown title" msgstr "Izenburu ezezaguna" #: src/audio/song.rs:351 msgid "Unknown album" msgstr "Album ezezaguna" #: src/gtk/help-overlay.ui:11 msgctxt "shortcut window" msgid "General" msgstr "Orokorra" #: src/gtk/help-overlay.ui:14 msgctxt "shortcut window" msgid "Toggle primary menu" msgstr "Aktibatu/desaktibatu menu nagusia" #: src/gtk/help-overlay.ui:20 msgctxt "shortcut window" msgid "Copy song details to the clipboard" msgstr "Kopiatu abestiaren xehetasunak arbelean" #: src/gtk/help-overlay.ui:26 msgctxt "shortcut window" msgid "Show shortcuts" msgstr "Erakutsi lasterbideak" #: src/gtk/help-overlay.ui:32 msgctxt "shortcut window" msgid "Quit" msgstr "Irten" #: src/gtk/help-overlay.ui:40 msgctxt "shortcut window" msgid "Playlist" msgstr "Erreprodukzio-zerrenda" #: src/gtk/help-overlay.ui:43 msgctxt "shortcut window" msgid "Add a song to the playlist" msgstr "Gehitu abesti bat erreprodukzio-zerrendari" #: src/gtk/help-overlay.ui:49 msgctxt "shortcut window" msgid "Add a folder to the playlist" msgstr "Gehitu karpeta bat erreprodukzio-zerrendari" #: src/gtk/help-overlay.ui:55 msgctxt "shortcut window" msgid "Clear the playlist" msgstr "Garbitu erreprodukzio-zerrenda" #: src/gtk/help-overlay.ui:61 msgctxt "shortcut window" msgid "Toggle the playlist pane" msgstr "Txandakatu erreprodukzio-zerrendaren panela" #: src/gtk/help-overlay.ui:67 msgctxt "shortcut window" msgid "Toggle shuffling songs" msgstr "Txandakatu abestiak ausaz erreproduzitzea" #: src/gtk/help-overlay.ui:75 msgctxt "shortcut window" msgid "Playback" msgstr "Erreproduzitu" #: src/gtk/help-overlay.ui:78 msgctxt "shortcut window" msgid "Toggle play/pause" msgstr "Txandakatu erreprodukzioa/pausatzea" #: src/gtk/help-overlay.ui:84 msgctxt "shortcut window" msgid "Previous song" msgstr "Aurreko abestia" #: src/gtk/help-overlay.ui:90 msgctxt "shortcut window" msgid "Next song" msgstr "Hurrengoa abestia" #: src/gtk/help-overlay.ui:96 msgctxt "shortcut window" msgid "Seek backwards in the current song" msgstr "Bilatu atzerantz uneko abestian" #: src/gtk/help-overlay.ui:102 msgctxt "shortcut window" msgid "Seek forward in the current song" msgstr "Bilatu aurrerantz uneko abestian" #: src/gtk/playback-control.ui:35 msgctxt "a11y" msgid "Elapsed time" msgstr "Igarotako denbora" #: src/gtk/playback-control.ui:47 msgctxt "a11y" msgid "Remaining time" msgstr "Falta den denbora" #: src/gtk/playback-control.ui:69 msgid "Play the Previous Song" msgstr "Erreproduzitu aurreko abestia" #: src/gtk/playback-control.ui:74 msgctxt "a11y" msgid "Skip backwards" msgstr "Saltatu atzerantz" #: src/gtk/playback-control.ui:83 msgid "Toggle Play" msgstr "Txandakatu erreprodukzioa" #: src/gtk/playback-control.ui:89 msgctxt "a11y" msgid "Toggle play" msgstr "Txandakatu erreprodukzioa" #: src/gtk/playback-control.ui:98 msgid "Play the Next Song" msgstr "Erreproduzitu hurrengo abestia" #: src/gtk/playback-control.ui:103 msgctxt "a11y" msgid "Skip forward" msgstr "Saltatu aurrerantz" #: src/gtk/playback-control.ui:126 msgid "Toggle Playlist" msgstr "Txandakatu erreprodukzio-zerrenda" #: src/gtk/playback-control.ui:131 msgctxt "a11y" msgid "Toggle playlist" msgstr "Txandakatu erreprodukzio-zerrenda" #: src/gtk/playback-control.ui:140 msgid "Shuffle the Playlist" msgstr "Erreproduzitu zerrenda ausaz" #: src/gtk/playback-control.ui:142 msgctxt "a11y" msgid "Shuffle" msgstr "Ausaz" #: src/gtk/playback-control.ui:161 src/playback_control.rs:153 msgid "Enable Repeat" msgstr "Gaitu errepikapena" #: src/gtk/playback-control.ui:166 msgctxt "a11y" msgid "Repeat" msgstr "Errepikatu" #: src/gtk/playback-control.ui:177 msgid "Main Menu" msgstr "Menu nagusia" #: src/gtk/playback-control.ui:183 msgctxt "a11y" msgid "Primary menu" msgstr "Menu nagusia" #: src/gtk/playback-control.ui:199 msgid "Copy" msgstr "Kopiatu" #: src/gtk/playback-control.ui:205 msgid "Add _Song" msgstr "Gehitu _abestia" #: src/gtk/playback-control.ui:209 msgid "Add _Folder" msgstr "Gehitu _karpeta" #: src/gtk/playback-control.ui:213 msgid "Clear" msgstr "Garbitu" #: src/gtk/playback-control.ui:219 msgid "_Match Cover Art" msgstr "_Egin bat azalarekin" #: src/gtk/playback-control.ui:223 msgid "_Background Playback" msgstr "A_tzeko planoko erreprodukzioa" #: src/gtk/playback-control.ui:229 msgid "_ReplayGain" msgstr "_ReplayGain" #: src/gtk/playback-control.ui:231 msgid "_Album" msgstr "_Albuma" #: src/gtk/playback-control.ui:236 msgid "_Track" msgstr "_Pista" #: src/gtk/playback-control.ui:241 msgid "_Off" msgstr "_Desaktibatuta" #: src/gtk/playback-control.ui:249 msgid "_Keyboard Shortcuts" msgstr "La_sterbideak" #: src/gtk/playback-control.ui:253 msgid "_About Amberol" msgstr "Amberol aplikazioari _buruz" #: src/gtk/playback-control.ui:257 msgid "_Quit" msgstr "I_rten" #: src/gtk/playlist-view.ui:19 msgid "Playlist" msgstr "Erreprodukzio-zerrenda" #: src/gtk/playlist-view.ui:49 msgid "Search Songs in the Playlist" msgstr "Bilatu erreprodukzio-zerrendako abestiak" #: src/gtk/playlist-view.ui:61 msgid "Select Songs in the Playlist" msgstr "Hautatu erreprodukzio-zerrendako abestiak" #: src/gtk/playlist-view.ui:74 msgid "Close the Playlist" msgstr "Itxi erreprodukzio-zerrenda" #: src/gtk/playlist-view.ui:135 msgid "Select All Songs" msgstr "Hautatu abesti guztiak" #: src/gtk/playlist-view.ui:148 msgid "Remove Selected Songs" msgstr "Kendu hautatutako abestiak" #: src/gtk/window.ui:12 msgid "Drop a song to add it to the queue" msgstr "Jaregin abesti bat ilaran gehitzeko" #: src/gtk/window.ui:49 msgid "" "Select a file or a folder, or drag files from your file manager to the " "application window to add songs to the playlist" msgstr "Hautatu fitxategi edo karpeta bat, edo arrastatu zure fitxategi-kudeatzaileko fitxategiak aplikazioaren leihora, erreprodukzio-zerrendari abestiak gehitzeko" #: src/gtk/window.ui:58 msgid "Restore Playlist" msgstr "Leheneratu erreprodukzio-zerrenda" #: src/gtk/window.ui:68 msgid "Add Folder" msgstr "Gehitu karpeta" #: src/gtk/window.ui:77 msgid "Add Song" msgstr "Gehitu abestia" #. Translators: Replace "translator-credits" with your names, one name per line #: src/application.rs:233 msgid "translator-credits" msgstr "translator-credits" #: src/application.rs:247 msgid "Amberol needs to run in the background to play music" msgstr "Amberol atzeko planoan exekutatu behar da musika erreproduzitu ahal izateko" #: src/playback_control.rs:157 msgid "Repeat All Tracks" msgstr "Errepikatu pista guztiak" #: src/playback_control.rs:161 msgid "Repeat the Current Track" msgstr "Errepikatu uneko pista" #: src/window.rs:397 msgid "_Add Song" msgstr "_Gehitu abestia" #: src/window.rs:398 src/window.rs:438 msgid "_Cancel" msgstr "_Utzi" #: src/window.rs:400 msgid "Open File" msgstr "Ireki fitxategia" #: src/window.rs:407 msgid "Audio files" msgstr "Audio-fitxategiak" #: src/window.rs:416 src/window.rs:1306 msgid "Unable to access files" msgstr "Ezin dira fitxategiak atzitu" #: src/window.rs:437 msgid "_Add Folder" msgstr "_Gehitu karpeta" #: src/window.rs:440 msgid "Open Folder" msgstr "Ireki karpeta" #: src/window.rs:451 msgid "Unable to access folders" msgstr "Ezin dira karpetak atzitu" #: src/window.rs:469 msgid "No available song found" msgstr "Ez da aurkitu bat datorren abestirik" #: src/window.rs:526 msgid "No songs found" msgstr "Ez da abestirik aurkitu" #: src/window.rs:556 msgid "Added a new song" msgstr "Beste abesti bat gehitu da" #: src/window.rs:557 msgid "Play" msgstr "Erreproduzitu" #. Translators: the `{}` must be left unmodified; #. it will be expanded to the number of songs added #. to the playlist #: src/window.rs:566 msgid "Added one song" msgid_plural "Added {} songs" msgstr[0] "Abesti bat gehitu da" msgstr[1] "{} abesti gehitu dira" #: src/window.rs:1056 msgid "Unable to access dropped files" msgstr "Ezin dira jaregindako fitxategiak atzitu" #: src/window.rs:1149 msgid "{} minute" msgid_plural "{} minutes" msgstr[0] "Minutu {}" msgstr[1] "{} minutu" #: src/window.rs:1160 msgid "{hours} hour {minutes} remaining" msgid_plural "{hours} hours {minutes} remaining" msgstr[0] "Ordu {hours} eta {minutes} minutu geratzen dira" msgstr[1] "{hours} ordu eta {minutes} minutu geratzen dira" #. Translators: the '{}' must be left unmodified, and #. it will be replaced by the number of minutes remaining #. in the playlist #: src/window.rs:1170 msgid "{} minute remaining" msgid_plural "{} minutes remaining" msgstr[0] "Minutu {} geratzen da" msgstr[1] "{} minutu geratzen dira" #: src/window.rs:1286 msgid "No song selected" msgstr "Ez da abestirik hautatu" #. Translators: The '{}' must be left unmodified, and #. it is expanded to the number of songs selected #: src/window.rs:1291 msgid "{} song selected" msgid_plural "{} songs selected" msgstr[0] "Abesti {} hautatu da" msgstr[1] "{} abesti hautatu dira" #. Translators: `{title}` and `{artist}` must be left #. untranslated; they will expand to the title and #. artist of the currently playing song, respectively #: src/window.rs:1344 msgid "Currently playing “{title}” by “{artist}”" msgstr "Orain erreproduzitzen: “{title}”, egilea: “{artist}”" #~ msgid "Add File" #~ msgstr "Gehitu fitxategia" #~ msgid "Amberol cannot run in the background" #~ msgstr "Amberol ezin da atzeko planoan exekutatu" #~ msgid "Plays music and nothing else" #~ msgstr "Musika erreproduzitzen du, besterik ez" #~ msgid "“{}” is not a supported audio file" #~ msgstr "“{}” ez da onartutako audio-fitxategi bat" #~ msgid "Unrecognized file type for “{}”" #~ msgstr "Fitxategi-mota ezezaguna honetarako: “{}”" #~ msgid "Amberol is running in the background" #~ msgstr "Amberol atzeko planoan exekutatzen ari da" #~ msgctxt "shortcut window" #~ msgid "Songs Queue" #~ msgstr "Abestien ilara" #~ msgctxt "shortcut window" #~ msgid "Queue a Song" #~ msgstr "Jarri abestia ilaran" #~ msgctxt "shortcut window" #~ msgid "Queue a Folder" #~ msgstr "Jarri karpeta bat ilaran" #~ msgctxt "shortcut window" #~ msgid "Clear" #~ msgstr "Garbitu" #~ msgctxt "shortcut window" #~ msgid "Previous Track" #~ msgstr "Aurreko pista" #~ msgid "Playing next" #~ msgstr "Hurrengoa erreproduzitzen" #~ msgctxt "shortcut window" #~ msgid "Seek Backwards" #~ msgstr "Bilatu atzerantz" #~ msgctxt "shortcut window" #~ msgid "Seek Forward" #~ msgstr "Bilatu aurrerantz" #~ msgid "Show the playlist" #~ msgstr "Erakutsi erreprodukzio-zerrenda" #~ msgid "Choose a folder" #~ msgstr "Aukeratu karpeta bat" amberol-0.10.3/po/fa.po000066400000000000000000000437151443320625200145730ustar00rootroot00000000000000# Amberol. # Copyright (C) 2022 Amberol COPYRIGHT HOLDER # This file is distributed under the same license as the Amberol package. # Danial Behzadi , 2022. # Seyed Eshag Moghim Shahidani , 2022. # Seyed Hosein Mousavi Fard , 2022. # msgid "" msgstr "" "Project-Id-Version: amberol\n" "Report-Msgid-Bugs-To: https://gitlab.gnome.org/World/amberol/issues\n" "POT-Creation-Date: 2023-04-24 22:31+0000\n" "PO-Revision-Date: 2023-04-25 04:04+0330\n" "Last-Translator: Danial Behzadi \n" "Language-Team: Farsi\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==0 || n==1);\n" "X-Generator: Poedit 3.2.2\n" #: data/io.bassi.Amberol.desktop.in.in:3 data/io.bassi.Amberol.appdata.xml.in.in:6 msgid "Amberol" msgstr "امبرول" #: data/io.bassi.Amberol.desktop.in.in:4 msgid "Music Player" msgstr "پخش‌کنندهٔ آهنگ" #. Translators: Search terms to find this application. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! #: data/io.bassi.Amberol.desktop.in.in:12 msgid "music;player;media;audio;playlist;" msgstr "music;player:media;موزیک;آهنگ;موسیقی;صدا;صوت;آوا;پخش‌کننده;رسانه;" #: data/io.bassi.Amberol.appdata.xml.in.in:7 msgid "Plays music, and nothing else" msgstr "پخش آهنگ و هیچ چیز دیگر" #: data/io.bassi.Amberol.appdata.xml.in.in:9 msgid "" "Amberol is a music player with no delusions of grandeur. If you just want to " "play music available on your local system then Amberol is the music player you " "are looking for." msgstr "" "امبرول پخش‌کنندهٔ آهنگی بدون توهّم بزرگی است. اگر فقط می‌خواهید آهنگ‌های روی سامانهٔ " "محلیتان را پخش کنید، امبرول پخش‌کنندهٔ آهنگیست که دنبالش می‌گردید." #: data/io.bassi.Amberol.appdata.xml.in.in:14 msgid "Current features:" msgstr "ویژگی‌های کنونی:" #: data/io.bassi.Amberol.appdata.xml.in.in:16 msgid "adaptive UI" msgstr "رابط کاربری تطبیقی" #: data/io.bassi.Amberol.appdata.xml.in.in:17 msgid "UI recoloring using the album art" msgstr "تغییر رنگ رابط کاربری با استفاده از تصویر آلبوم" #: data/io.bassi.Amberol.appdata.xml.in.in:18 msgid "drag and drop support to queue songs" msgstr "پشتیبانی از کشیدن و انداختن برای صف کردن آهنگ‌ها" #: data/io.bassi.Amberol.appdata.xml.in.in:19 msgid "shuffle and repeat" msgstr "بُر زدن و تکرار" #: data/io.bassi.Amberol.appdata.xml.in.in:20 msgid "MPRIS integration" msgstr "یکپارچگی MPRIS" #: data/io.bassi.Amberol.appdata.xml.in.in:42 msgid "Emmanuele Bassi" msgstr "امانوئل باسی" #: src/audio/inhibit_controller.rs:40 msgid "Playback in progress" msgstr "پخش در حال انجام" #: src/audio/song.rs:325 msgid "Unknown artist" msgstr "هنرمند ناشناس" #: src/audio/song.rs:332 msgid "Unknown title" msgstr "عنوان ناشناس" #: src/audio/song.rs:339 msgid "Unknown album" msgstr "آلبوم ناشناس" #: src/gtk/help-overlay.ui:11 msgctxt "shortcut window" msgid "General" msgstr "عمومی" #: src/gtk/help-overlay.ui:14 msgctxt "shortcut window" msgid "Toggle primary menu" msgstr "تغییر وضعیت فهرست اصلی" #: src/gtk/help-overlay.ui:20 msgctxt "shortcut window" msgid "Copy song details to the clipboard" msgstr "رونوشت جزییات آهنگ به تخته‌گیره" #: src/gtk/help-overlay.ui:26 msgctxt "shortcut window" msgid "Show shortcuts" msgstr "نمایش میان‌برها" #: src/gtk/help-overlay.ui:32 msgctxt "shortcut window" msgid "Quit" msgstr "خروج" #: src/gtk/help-overlay.ui:40 msgctxt "shortcut window" msgid "Playlist" msgstr "سیاههٔ پخش" #: src/gtk/help-overlay.ui:43 msgctxt "shortcut window" msgid "Add a song to the playlist" msgstr "افزودن آهنگ به سیاههٔ پخش" #: src/gtk/help-overlay.ui:49 msgctxt "shortcut window" msgid "Add a folder to the playlist" msgstr "افزودن شاخه‌ای به سیاههٔ پخش" #: src/gtk/help-overlay.ui:55 msgctxt "shortcut window" msgid "Clear the playlist" msgstr "پاک‌سازی سیاههٔ پخش" #: src/gtk/help-overlay.ui:61 msgctxt "shortcut window" msgid "Toggle the playlist pane" msgstr "تغییر وضعیت قاب سیاههٔ پخش" #: src/gtk/help-overlay.ui:67 msgctxt "shortcut window" msgid "Toggle shuffling songs" msgstr "تغییر وضعیت بُر زدن آهنگ‌ها" #: src/gtk/help-overlay.ui:75 msgctxt "shortcut window" msgid "Playback" msgstr "پخش" #: src/gtk/help-overlay.ui:78 msgctxt "shortcut window" msgid "Toggle play/pause" msgstr "تغییر وضعیت پخش/مکث" #: src/gtk/help-overlay.ui:84 msgctxt "shortcut window" msgid "Previous song" msgstr "آهنگ پیشین" #: src/gtk/help-overlay.ui:90 msgctxt "shortcut window" msgid "Next song" msgstr "آهنگ بعدی" #: src/gtk/help-overlay.ui:96 msgctxt "shortcut window" msgid "Seek backwards in the current song" msgstr "عقب رفتن در آهنگ کنونی" #: src/gtk/help-overlay.ui:102 msgctxt "shortcut window" msgid "Seek forward in the current song" msgstr "جلو رفتن در آهنگ کنونی" #: src/gtk/playback-control.ui:21 msgid "Play the Previous Song" msgstr "پخش آهنگ پیشین" #: src/gtk/playback-control.ui:26 msgctxt "a11y" msgid "Skip backwards" msgstr "پرش به عقب" #: src/gtk/playback-control.ui:35 msgid "Toggle Play" msgstr "تغییر وضعیت پخش" #: src/gtk/playback-control.ui:41 msgctxt "a11y" msgid "Toggle play" msgstr "تغییر وضعیت پخش" #: src/gtk/playback-control.ui:50 msgid "Play the Next Song" msgstr "پخش آهنگ بعدی" #: src/gtk/playback-control.ui:55 msgctxt "a11y" msgid "Skip forward" msgstr "پرش به جلو" #: src/gtk/playback-control.ui:78 msgid "Toggle Playlist" msgstr "تغییر وضعیت سیاههٔ پخش" #: src/gtk/playback-control.ui:83 msgctxt "a11y" msgid "Toggle playlist" msgstr "تغییر وضعیت سیاههٔ پخش" #: src/gtk/playback-control.ui:92 msgid "Shuffle the Playlist" msgstr "بُر زدن سیاههٔ پخش" #: src/gtk/playback-control.ui:94 msgctxt "a11y" msgid "Shuffle" msgstr "بُر زدن" #: src/gtk/playback-control.ui:113 src/playback_control.rs:114 msgid "Enable Repeat" msgstr "به‌کار انداختن تکرار" #: src/gtk/playback-control.ui:118 msgctxt "a11y" msgid "Repeat" msgstr "تکرار" #: src/gtk/playback-control.ui:129 msgid "Main Menu" msgstr "فهرست اصلی" #: src/gtk/playback-control.ui:135 msgctxt "a11y" msgid "Primary menu" msgstr "فهرست اصلی" #: src/gtk/playback-control.ui:151 msgid "Copy" msgstr "رونوشت" #: src/gtk/playback-control.ui:157 msgid "Add _Song" msgstr "افزودن _آهنگ" #: src/gtk/playback-control.ui:161 msgid "Add _Folder" msgstr "افزودن _شاخه" #: src/gtk/playback-control.ui:165 msgid "Clear" msgstr "پاک‌سازی" # این متن یک دکمه برای فعال کردن اینکه از رنگ غالب تصویر جلد آهنگ به عنوان رنگ غالب برنامه استفاده شود، است. #: src/gtk/playback-control.ui:171 msgid "_Match Cover Art" msgstr "انطباق با تصویر جلد" #: src/gtk/playback-control.ui:175 msgid "_Background Playback" msgstr "_پخش در پس‌زمینه" #: src/gtk/playback-control.ui:181 msgid "_ReplayGain" msgstr "_بهرهٔ بازپخش" #: src/gtk/playback-control.ui:183 msgctxt "replaygain-menu" msgid "_Album" msgstr "آلبو_م" #: src/gtk/playback-control.ui:188 msgctxt "replaygain-menu" msgid "_Song" msgstr "آهن_گ" #: src/gtk/playback-control.ui:193 msgctxt "replaygain-menu" msgid "_Disabled" msgstr "_از کار افتاده" #: src/gtk/playback-control.ui:201 msgid "_Keyboard Shortcuts" msgstr "_میان‌برهای صفحه‌کلید" #: src/gtk/playback-control.ui:205 msgid "_About Amberol" msgstr "_دربارهٔ امبرول" #: src/gtk/playback-control.ui:209 msgid "_Quit" msgstr "_خروج" #: src/gtk/playlist-view.ui:19 msgid "Playlist" msgstr "سیاههٔ پخش" #: src/gtk/playlist-view.ui:49 msgid "Search Songs in the Playlist" msgstr "جست‌وجوی آهنگ‌های سیاههٔ پخش" #: src/gtk/playlist-view.ui:61 msgid "Select Songs in the Playlist" msgstr "گزینش آهنگ‌های سیاههٔ پخش" #: src/gtk/playlist-view.ui:74 msgid "Close the Playlist" msgstr "بستن سیاههٔ پخش" #: src/gtk/playlist-view.ui:135 msgid "Select All Songs" msgstr "گزینش تمامی آهنگ‌ها" #: src/gtk/playlist-view.ui:148 msgid "Remove Selected Songs" msgstr "برداشتن آهنگ‌های برگزیده" #: src/gtk/window.ui:12 msgid "Drop a song to add it to the playlist" msgstr "انداختن آهنگ برای افزودنش به سیاههٔ پخش" #: src/gtk/window.ui:49 msgid "" "Select a file or a folder, or drag files from your file manager to the " "application window to add songs to the playlist" msgstr "" "برای افزودن آهنگ‌ها به سیاههٔ پخش، پرونده یا شاخه‌ای را گزیده یا پرونده‌ها را از " "مدیر پرونده‌تان به پنجرهٔ برنامه بکشید" #: src/gtk/window.ui:58 msgid "Restore Playlist" msgstr "بازگردانی سیاههٔ پخش" #: src/gtk/window.ui:68 msgid "Add Folder" msgstr "افزودن شاخه" #: src/gtk/window.ui:77 msgid "Add Song" msgstr "افزودن آهنگ" #: src/gtk/window.ui:161 msgctxt "a11y" msgid "Elapsed time" msgstr "زمان رفته" #: src/gtk/window.ui:173 msgctxt "a11y" msgid "Remaining time" msgstr "زمان مانده" #. Translators: Replace "translator-credits" with your names, one name per line #: src/application.rs:227 msgid "translator-credits" msgstr "" "دانیال بهزادی \n" "سید حسین موسوی فرد \n" "سید اسحاق مقیم شهیدانی " #: src/application.rs:239 msgid "Amberol needs to run in the background to play music" msgstr "لازم است امبرول برای پخش آهنگ در پس‌زمینه اجرا شود" #: src/playback_control.rs:118 msgid "Repeat All Songs" msgstr "تکرار تمامی آهنگ‌ها" #: src/playback_control.rs:122 msgid "Repeat the Current Song" msgstr "تکرار آهنگ کنونی" #: src/window.rs:403 msgid "_Add Song" msgstr "_افزودن آهنگ" #: src/window.rs:404 src/window.rs:444 msgid "_Cancel" msgstr "_لغو" #: src/window.rs:406 msgid "Open File" msgstr "گشودن پرونده" #: src/window.rs:413 msgid "Audio files" msgstr "پرونده‌های صوتی" #: src/window.rs:422 src/window.rs:1315 msgid "Unable to access files" msgstr "ناتوان در دسترسی به پرونده‌ها" #: src/window.rs:443 msgid "_Add Folder" msgstr "_افزودن شاخه" #: src/window.rs:446 msgid "Open Folder" msgstr "گشودن شاخه" #: src/window.rs:457 msgid "Unable to access folders" msgstr "ناتوان در دسترسی به شاخه‌ها" #: src/window.rs:475 msgid "No available song found" msgstr "هیچ آهنگی پیدا نشد" #: src/window.rs:532 msgid "No songs found" msgstr "هیچ آهنگی پیدا نشد" #: src/window.rs:562 msgid "Added a new song" msgstr "آهنگی جدید اضافه شد" #: src/window.rs:563 msgid "Play" msgstr "پخش" #. Translators: the `{}` must be left unmodified; #. it will be expanded to the number of songs added #. to the playlist #: src/window.rs:572 msgid "Added one song" msgid_plural "Added {} songs" msgstr[0] "{} آهنگ اضافه شد" msgstr[1] "۱ آهنگ اضافه شد" #: src/window.rs:1062 msgid "Unable to access dropped files" msgstr "ناتوان در دسترسی به پرونده‌های انداخته" #: src/window.rs:1152 msgid "{} minute" msgid_plural "{} minutes" msgstr[0] "{} دقیقه" msgstr[1] "۱ دقیقه" #: src/window.rs:1163 msgid "{hours} hour {minutes} remaining" msgid_plural "{hours} hours {minutes} remaining" msgstr[0] "{hours} ساعت و {minutes} مانده" msgstr[1] "{hours} ساعت و {minutes} مانده" #. Translators: the '{}' must be left unmodified, and #. it will be replaced by the number of minutes remaining #. in the playlist #: src/window.rs:1173 msgid "{} minute remaining" msgid_plural "{} minutes remaining" msgstr[0] "{} دقیقه مانده" msgstr[1] "۱ دقیقه مانده" #: src/window.rs:1295 msgid "No song selected" msgstr "هیچ آهنگی گزیده نشده" #. Translators: The '{}' must be left unmodified, and #. it is expanded to the number of songs selected #: src/window.rs:1300 msgid "{} song selected" msgid_plural "{} songs selected" msgstr[0] "{} آهنگ گزیده شده" msgstr[1] "۱ آهنگ گزیده شده" #. Translators: `{title}` and `{artist}` must be left #. untranslated; they will expand to the title and #. artist of the currently playing song, respectively #: src/window.rs:1353 msgid "Currently playing “{title}” by “{artist}”" msgstr "در حال پخش «{title}» از «{artist}»" #~ msgid "_Track" #~ msgstr "_قطعه" #~ msgid "_Off" #~ msgstr "_خاموش" #~ msgid "Repeat All Tracks" #~ msgstr "تکرار همهٔ قطعه‌ها" #~ msgid "Add File" #~ msgstr "افزودن پرونده" #~ msgid "Plays music and nothing else" #~ msgstr "پخش آهنگ، و دیگر هیچ" #~ msgid "Amberol cannot run in the background" #~ msgstr "امبرول نتوانست در پس‌زمینه اجرا شود" #~ msgid "{} hour" #~ msgid_plural "{} hours" #~ msgstr[0] "۱ ساعت" #~ msgstr[1] "{} ساعت" #~ msgid "“{}” is not a supported audio file" #~ msgstr "«{}» یک پروندهٔ صوتی پشتیبانی شده نیست" #~ msgid "Unrecognized file type for “{}”" #~ msgstr "گونهٔ پروندهٔ «{}» شناسایی نشده" #~ msgid "Amberol is running in the background" #~ msgstr "امبرول دارد در پس‌زمینه اجرا می‌شود" #~ msgctxt "shortcut window" #~ msgid "Songs Queue" #~ msgstr "صف آهنگ‌ها" #~ msgctxt "shortcut window" #~ msgid "Queue a Song" #~ msgstr "افزودن یک آهنگ به صف" #~ msgctxt "shortcut window" #~ msgid "Queue a Folder" #~ msgstr "افزودن یک شاخه به صف" #~ msgctxt "shortcut window" #~ msgid "Clear" #~ msgstr "پاک‌سازی" #~ msgctxt "shortcut window" #~ msgid "Previous Track" #~ msgstr "قطعهٔ قبلی" #~ msgid "Playing next" #~ msgstr "در ادامه پخش می‌شود" #~ msgctxt "shortcut window" #~ msgid "Seek Backwards" #~ msgstr "حرکت به عقب" #~ msgctxt "shortcut window" #~ msgid "Seek Forward" #~ msgstr "حرکت به جلو" #~ msgid "Show the playlist" #~ msgstr "نمایش فهرست پخش" #~ msgid "Choose a folder" #~ msgstr "شاخه‌ای برگزینید" #~ msgid "Last UI change for a while, I promise." #~ msgstr "آخرین تغییر رابط کاربری برای مدتی، قول می‌دهم." #~ msgid "Move the playlist panel to the left" #~ msgstr "بردن تابلوی فهرست پخش به چپ" #~ msgid "Drop the seek buttons" #~ msgstr "رهاکردن دکمه‌های حرکت" #~ msgid "Improve the rendering of the waveform" #~ msgstr "بهبود نمایش شکل موج" #~ msgid "Improve extraction of the song metadata" #~ msgstr "بهبود استخراج ابرداده آهنگ" #~ msgid "Thanks to everyone who tried Amberol and filed issues!" #~ msgstr "تشکر از همه کسانی که آمبرول را امتحان کردند و مشکل‌ها را پر!" #~ msgid "Bugs never end, and so does bug squashing." #~ msgstr "مشکلات تمامی ندارند، پس مشکلات را برطرف می‌کنیم." #~ msgid "Fix a crash when manually advancing through the playlist" #~ msgstr "برطرف کردن کرش هنگام پیشروی از طریق فهرست پخش" #~ msgid "Make the waveform scrubber more legible" #~ msgstr "خواناتر کردن شکل موج" #~ msgid "Keep the UI state more consistent when toggling the playlist" #~ msgstr "استوار نگه‌داشتن رابط کاربری هنگام تغییر وضعیت فهرست پخش" #~ msgid "" #~ "Many, many thanks to all of those who opened an issue after the 0.4.0 release!" #~ msgstr "" #~ "تشکر بسیار فراوان از همه کسانی که بعد از نگارش ۰.۴.۰ مشکلی را باز کردند!" #~ msgid "Fix a slight visual artefact in the playlist" #~ msgstr "تصحیح یک مصنوع بصری جزئی در لیست پخش" #~ msgid "A brown paper bag release fixing an embarrassing bug." #~ msgstr "رها کردن کیسه کاغذی قهوه‌ای برای رفع یک اشکال شرم‌آور." #~ msgid "The first beta release for Amberol! Isn't this exciting?" #~ msgstr "اولین نگارش بتا برای آمبرول! آیا این هیجان انگیز نیست؟" #~ msgid "Show an initial page when launching Amberol" #~ msgstr "هنگام راه‌اندازی آمبرول یک صفحهٔ اولیه را نشان می‌دهد" #~ msgid "Make the layout more mobile friendly without impacting desktop users" #~ msgstr "بدون تأثیر بر کاربران میزکار، طرح‌بندی را برای تلفن همراه راحت‌تر می‌کند" #~ msgid "Allow removing songs from the playlist" #~ msgstr "اجازهٔ برداشتن آهنگ از فهرست پخش را می‌دهد" #~ msgid "" #~ "Add initial (experimental) support for recursive loading of music folders" #~ msgstr "" #~ "پشتیبانی اولیه (آزمایشی) را برای بارگذاری بازگشتی شاخه‌های موسیقی اضافه کنید" #~ msgid "Show the cover art for music tracks in the playlist" #~ msgstr "تصویر جلد قطعه‌های موسیقی را در فهرست پخش نمایش می‌دهد" #~ msgid "Show the current position inside the song" #~ msgstr "نمایش موقعیت حال درون آهنگ" amberol-0.10.3/po/fi.po000066400000000000000000000303501443320625200145720ustar00rootroot00000000000000# Finnish translation for amberol. # Copyright (C) 2022 amberol's COPYRIGHT HOLDER # This file is distributed under the same license as the amberol package. # Jiri Grönroos , 2022. # msgid "" msgstr "" "Project-Id-Version: amberol main\n" "Report-Msgid-Bugs-To: https://gitlab.gnome.org/World/amberol/issues\n" "POT-Creation-Date: 2023-04-24 22:31+0000\n" "PO-Revision-Date: 2023-04-30 20:36+0300\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: Poedit 3.2.2\n" #: data/io.bassi.Amberol.desktop.in.in:3 #: data/io.bassi.Amberol.appdata.xml.in.in:6 msgid "Amberol" msgstr "Amberol" #: data/io.bassi.Amberol.desktop.in.in:4 msgid "Music Player" msgstr "Musiikkisoitin" #. Translators: Search terms to find this application. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! #: data/io.bassi.Amberol.desktop.in.in:12 msgid "music;player;media;audio;playlist;" msgstr "music;player;media;audio;playlist;musiikki;ääni;soitin;soittolista;" #: data/io.bassi.Amberol.appdata.xml.in.in:7 msgid "Plays music, and nothing else" msgstr "Toistaa musiikkia eikä mitään muuta" #: data/io.bassi.Amberol.appdata.xml.in.in:9 msgid "" "Amberol is a music player with no delusions of grandeur. If you just want to " "play music available on your local system then Amberol is the music player " "you are looking for." msgstr "" "Amberol on musiikkisoitin ilman turhia kilkkeitä. Jos haluat soittaa " "paikallisella tietokoneella olevaa musiikkia, Amberol on oikea valinta " "sinulle." #: data/io.bassi.Amberol.appdata.xml.in.in:14 msgid "Current features:" msgstr "Nykyiset ominaisuudet:" #: data/io.bassi.Amberol.appdata.xml.in.in:16 msgid "adaptive UI" msgstr "mukautuva käyttöliittymä" #: data/io.bassi.Amberol.appdata.xml.in.in:17 msgid "UI recoloring using the album art" msgstr "Käyttöliittymän väritys albumin kansikuvitusta käyttäen" #: data/io.bassi.Amberol.appdata.xml.in.in:18 msgid "drag and drop support to queue songs" msgstr "vedä ja pudota -tuki kappaleiden lisäämiseksi jonoon" #: data/io.bassi.Amberol.appdata.xml.in.in:19 msgid "shuffle and repeat" msgstr "sekoitus ja kertaus" #: data/io.bassi.Amberol.appdata.xml.in.in:20 msgid "MPRIS integration" msgstr "MPRIS-integraatio" #: data/io.bassi.Amberol.appdata.xml.in.in:42 msgid "Emmanuele Bassi" msgstr "Emmanuele Bassi" #: src/audio/inhibit_controller.rs:40 msgid "Playback in progress" msgstr "Toisto meneillään" #: src/audio/song.rs:325 msgid "Unknown artist" msgstr "Tuntematon esittäjä" #: src/audio/song.rs:332 msgid "Unknown title" msgstr "Tuntematon kappale" #: src/audio/song.rs:339 msgid "Unknown album" msgstr "Tuntematon albumi" #: src/gtk/help-overlay.ui:11 msgctxt "shortcut window" msgid "General" msgstr "Yleiset" #: src/gtk/help-overlay.ui:14 msgctxt "shortcut window" msgid "Toggle primary menu" msgstr "Avaa/sulje ensisijainen valikko" #: src/gtk/help-overlay.ui:20 msgctxt "shortcut window" msgid "Copy song details to the clipboard" msgstr "Kopioi kappaleen tiedot leikepöydälle" #: src/gtk/help-overlay.ui:26 msgctxt "shortcut window" msgid "Show shortcuts" msgstr "Näytä pikanäppäimet" #: src/gtk/help-overlay.ui:32 msgctxt "shortcut window" msgid "Quit" msgstr "Lopeta" #: src/gtk/help-overlay.ui:40 msgctxt "shortcut window" msgid "Playlist" msgstr "Soittolista" #: src/gtk/help-overlay.ui:43 msgctxt "shortcut window" msgid "Add a song to the playlist" msgstr "Lisää kappale soittolistalle" #: src/gtk/help-overlay.ui:49 msgctxt "shortcut window" msgid "Add a folder to the playlist" msgstr "Lisää kansio soittolistalle" #: src/gtk/help-overlay.ui:55 msgctxt "shortcut window" msgid "Clear the playlist" msgstr "Tyhjennä soittolista" #: src/gtk/help-overlay.ui:61 msgctxt "shortcut window" msgid "Toggle the playlist pane" msgstr "Näytä/piilota soittolista" #: src/gtk/help-overlay.ui:67 msgctxt "shortcut window" msgid "Toggle shuffling songs" msgstr "Kappaleiden sekoitus päälle/pois" #: src/gtk/help-overlay.ui:75 msgctxt "shortcut window" msgid "Playback" msgstr "Toisto" #: src/gtk/help-overlay.ui:78 msgctxt "shortcut window" msgid "Toggle play/pause" msgstr "Toista/keskeytä" #: src/gtk/help-overlay.ui:84 msgctxt "shortcut window" msgid "Previous song" msgstr "Edellinen kappale" #: src/gtk/help-overlay.ui:90 msgctxt "shortcut window" msgid "Next song" msgstr "Seuraava kappale" #: src/gtk/help-overlay.ui:96 msgctxt "shortcut window" msgid "Seek backwards in the current song" msgstr "Siirry takaisinpäin nykyisessä kappaleessa" #: src/gtk/help-overlay.ui:102 msgctxt "shortcut window" msgid "Seek forward in the current song" msgstr "Siirry eteenpäin nykyisessä kappaleessa" #: src/gtk/playback-control.ui:21 msgid "Play the Previous Song" msgstr "Toista edellinen kappale" #: src/gtk/playback-control.ui:26 msgctxt "a11y" msgid "Skip backwards" msgstr "Siirry taaksepäin" #: src/gtk/playback-control.ui:35 msgid "Toggle Play" msgstr "Toista tai keskeytä" #: src/gtk/playback-control.ui:41 msgctxt "a11y" msgid "Toggle play" msgstr "Toista tai keskeytä" #: src/gtk/playback-control.ui:50 msgid "Play the Next Song" msgstr "Toista seuraava kappale" #: src/gtk/playback-control.ui:55 msgctxt "a11y" msgid "Skip forward" msgstr "Siirry eteenpäin" #: src/gtk/playback-control.ui:78 msgid "Toggle Playlist" msgstr "Näytä/piilota soittolista" #: src/gtk/playback-control.ui:83 msgctxt "a11y" msgid "Toggle playlist" msgstr "Näytä/piilota soittolista" #: src/gtk/playback-control.ui:92 msgid "Shuffle the Playlist" msgstr "Sekoita soittolista" #: src/gtk/playback-control.ui:94 msgctxt "a11y" msgid "Shuffle" msgstr "Sekoita" #: src/gtk/playback-control.ui:113 src/playback_control.rs:114 msgid "Enable Repeat" msgstr "Käytä kertausta" #: src/gtk/playback-control.ui:118 msgctxt "a11y" msgid "Repeat" msgstr "Kertaa" #: src/gtk/playback-control.ui:129 msgid "Main Menu" msgstr "Päävalikko" #: src/gtk/playback-control.ui:135 msgctxt "a11y" msgid "Primary menu" msgstr "Ensisijainen valikko" #: src/gtk/playback-control.ui:151 msgid "Copy" msgstr "Kopioi" #: src/gtk/playback-control.ui:157 msgid "Add _Song" msgstr "Lisää k_appale" #: src/gtk/playback-control.ui:161 msgid "Add _Folder" msgstr "Lisää _kansio" #: src/gtk/playback-control.ui:165 msgid "Clear" msgstr "Tyhjennä" #: src/gtk/playback-control.ui:171 msgid "_Match Cover Art" msgstr "_Täsmää kansikuvitukseen" #: src/gtk/playback-control.ui:175 msgid "_Background Playback" msgstr "_Toisto taustalla" #: src/gtk/playback-control.ui:181 msgid "_ReplayGain" msgstr "_ReplayGain" #: src/gtk/playback-control.ui:183 msgctxt "replaygain-menu" msgid "_Album" msgstr "_Albumi" #: src/gtk/playback-control.ui:188 msgctxt "replaygain-menu" msgid "_Song" msgstr "_Kappale" #: src/gtk/playback-control.ui:193 msgctxt "replaygain-menu" msgid "_Disabled" msgstr "_Ei käytössä" #: src/gtk/playback-control.ui:201 msgid "_Keyboard Shortcuts" msgstr "_Pikanäppäimet" #: src/gtk/playback-control.ui:205 msgid "_About Amberol" msgstr "_Tietoja - Amberol" #: src/gtk/playback-control.ui:209 msgid "_Quit" msgstr "_Lopeta" #: src/gtk/playlist-view.ui:19 msgid "Playlist" msgstr "Soittolista" #: src/gtk/playlist-view.ui:49 msgid "Search Songs in the Playlist" msgstr "Etsi kappaleita soittolistalta" #: src/gtk/playlist-view.ui:61 msgid "Select Songs in the Playlist" msgstr "Valitse kappaleet soittolistalta" #: src/gtk/playlist-view.ui:74 msgid "Close the Playlist" msgstr "Sulje soittolista" #: src/gtk/playlist-view.ui:135 msgid "Select All Songs" msgstr "Valitse kaikki kappaleet" #: src/gtk/playlist-view.ui:148 msgid "Remove Selected Songs" msgstr "Poista valitut kappaleet" #: src/gtk/window.ui:12 msgid "Drop a song to add it to the playlist" msgstr "Raahaa kappale lisätäksesi sen soittolistaan" #: src/gtk/window.ui:49 msgid "" "Select a file or a folder, or drag files from your file manager to the " "application window to add songs to the playlist" msgstr "" "Valitse tiedosto tai kansio, tai vedä tiedostoja tiedostonhallinnasta " "sovelluksen ikkunaan lisätäksesi kappaleet soittolistaan" #: src/gtk/window.ui:58 msgid "Restore Playlist" msgstr "Palauta soittolista" #: src/gtk/window.ui:68 msgid "Add Folder" msgstr "Lisää kansio" #: src/gtk/window.ui:77 msgid "Add Song" msgstr "Lisää kappale" #: src/gtk/window.ui:161 msgctxt "a11y" msgid "Elapsed time" msgstr "Aikaa kulunut" #: src/gtk/window.ui:173 msgctxt "a11y" msgid "Remaining time" msgstr "Aikaa jäljellä" #. Translators: Replace "translator-credits" with your names, one name per line #: src/application.rs:227 msgid "translator-credits" msgstr "Jiri Grönroos" #: src/application.rs:239 msgid "Amberol needs to run in the background to play music" msgstr "Amberolin tulee olla käynnissä taustalla toistaakseen musiikkia" #: src/playback_control.rs:118 msgid "Repeat All Songs" msgstr "Kertaa kaikki kappaleet" #: src/playback_control.rs:122 msgid "Repeat the Current Song" msgstr "Kertaa nykyinen kappale" #: src/window.rs:403 msgid "_Add Song" msgstr "_Lisää kappale" #: src/window.rs:404 src/window.rs:444 msgid "_Cancel" msgstr "_Peru" #: src/window.rs:406 msgid "Open File" msgstr "Avaa tiedosto" #: src/window.rs:413 msgid "Audio files" msgstr "Äänitiedostot" #: src/window.rs:422 src/window.rs:1315 msgid "Unable to access files" msgstr "Ei pääsyä tiedostoihin" #: src/window.rs:443 msgid "_Add Folder" msgstr "_Lisää kansio" #: src/window.rs:446 msgid "Open Folder" msgstr "Avaa kansio" #: src/window.rs:457 msgid "Unable to access folders" msgstr "Ei pääsyä kansioihin" #: src/window.rs:475 msgid "No available song found" msgstr "Saatavilla olevaa kappaletta ei löytynyt" #: src/window.rs:532 msgid "No songs found" msgstr "Kappaleita ei löytynyt" #: src/window.rs:562 msgid "Added a new song" msgstr "Lisättiin uusi kappale" #: src/window.rs:563 msgid "Play" msgstr "Toista" #. Translators: the `{}` must be left unmodified; #. it will be expanded to the number of songs added #. to the playlist #: src/window.rs:572 msgid "Added one song" msgid_plural "Added {} songs" msgstr[0] "Lisättiin yksi kappale" msgstr[1] "Lisättiin {} kappaletta" #: src/window.rs:1062 msgid "Unable to access dropped files" msgstr "Ei pääsyä pudotettuihin tiedostoihin" #: src/window.rs:1152 msgid "{} minute" msgid_plural "{} minutes" msgstr[0] "{} minuutti" msgstr[1] "{} minuuttia" #: src/window.rs:1163 msgid "{hours} hour {minutes} remaining" msgid_plural "{hours} hours {minutes} remaining" msgstr[0] "{hours} tunti {minutes} jäljellä" msgstr[1] "{hours} tuntia {minutes} jäljellä" #. Translators: the '{}' must be left unmodified, and #. it will be replaced by the number of minutes remaining #. in the playlist #: src/window.rs:1173 msgid "{} minute remaining" msgid_plural "{} minutes remaining" msgstr[0] "{} minuutti jäljellä" msgstr[1] "{} minuuttia jäljellä" #: src/window.rs:1295 msgid "No song selected" msgstr "Kappaletta ei ole valittu" #. Translators: The '{}' must be left unmodified, and #. it is expanded to the number of songs selected #: src/window.rs:1300 msgid "{} song selected" msgid_plural "{} songs selected" msgstr[0] "{} kappale valittu" msgstr[1] "{} kappaletta valittu" #. Translators: `{title}` and `{artist}` must be left #. untranslated; they will expand to the title and #. artist of the currently playing song, respectively #: src/window.rs:1353 msgid "Currently playing “{title}” by “{artist}”" msgstr "Toistetaan kappale “{title}” esittäjältä “{artist}”" #~ msgid "_Track" #~ msgstr "_Kappale" #~ msgid "_Off" #~ msgstr "_Pois" #~ msgid "Repeat All Tracks" #~ msgstr "Kertaa kaikki kappaleet" #~ msgid "Add File" #~ msgstr "Lisää tiedosto" #~ msgid "Plays music and nothing else" #~ msgstr "Toistaa musiikkia eikä mitään muuta" #~ msgid "Amberol cannot run in the background" #~ msgstr "Amberol ei voi olla käynnissä taustalla" #~ msgid "“{}” is not a supported audio file" #~ msgstr "“{}” ei ole tuettu äänitiedosto" #~ msgid "Unrecognized file type for “{}”" #~ msgstr "Tiedoston “{}” tiedostotyyppiä ei tunnistettu" #~ msgid "Amberol is running in the background" #~ msgstr "Amberol on käynnissä taustalla" amberol-0.10.3/po/fr.po000066400000000000000000000303411443320625200146030ustar00rootroot00000000000000# French translation for amberol. # Copyright (C) 2022 amberol's COPYRIGHT HOLDER # This file is distributed under the same license as the amberol package. # devmatheo , 2022. # Alexandre Franke , 2023. # msgid "" msgstr "" "Project-Id-Version: amberol main\n" "Report-Msgid-Bugs-To: https://gitlab.gnome.org/World/amberol/issues\n" "POT-Creation-Date: 2023-04-26 21:36+0000\n" "PO-Revision-Date: 2023-04-28 08:39+0200\n" "Last-Translator: Irénée Thirion \n" "Language-Team: French - France \n" "Language: fr_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: Poedit 3.2.2\n" #: data/io.bassi.Amberol.desktop.in.in:3 #: data/io.bassi.Amberol.appdata.xml.in.in:6 msgid "Amberol" msgstr "Amberol" #: data/io.bassi.Amberol.desktop.in.in:4 msgid "Music Player" msgstr "Lecteur de musique" #. Translators: Search terms to find this application. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! #: data/io.bassi.Amberol.desktop.in.in:12 msgid "music;player;media;audio;playlist;" msgstr "musique;son;lecteur;média;audio;liste de lecture;" #: data/io.bassi.Amberol.appdata.xml.in.in:7 msgid "Plays music, and nothing else" msgstr "Lit de la musique et rien d’autre" #: data/io.bassi.Amberol.appdata.xml.in.in:9 msgid "" "Amberol is a music player with no delusions of grandeur. If you just want to " "play music available on your local system then Amberol is the music player " "you are looking for." msgstr "" "Amberol est un lecteur de musique qui n’en fait pas trop. Si vous voulez " "simplement écouter la musique disponible sur votre ordinateur, c’est le " "lecteur qu’il vous faut." #: data/io.bassi.Amberol.appdata.xml.in.in:14 msgid "Current features:" msgstr "Fonctionnalités actuelles :" #: data/io.bassi.Amberol.appdata.xml.in.in:16 msgid "adaptive UI" msgstr "interface utilisateur adaptative" #: data/io.bassi.Amberol.appdata.xml.in.in:17 msgid "UI recoloring using the album art" msgstr "" "utilisation des couleurs de la couverture de l’album pour coloriser " "l’interface utilisateur" #: data/io.bassi.Amberol.appdata.xml.in.in:18 msgid "drag and drop support to queue songs" msgstr "" "prise en charge du glisser-déposer pour mettre les morceaux en fin de liste " "de lecture" #: data/io.bassi.Amberol.appdata.xml.in.in:19 msgid "shuffle and repeat" msgstr "lecture aléatoire et répétition" #: data/io.bassi.Amberol.appdata.xml.in.in:20 msgid "MPRIS integration" msgstr "intégration MPRIS" #: data/io.bassi.Amberol.appdata.xml.in.in:42 msgid "Emmanuele Bassi" msgstr "Emmanuele Bassi" #: src/audio/inhibit_controller.rs:40 msgid "Playback in progress" msgstr "Écoute en cours" #: src/audio/song.rs:325 msgid "Unknown artist" msgstr "Artiste inconnu(e)" #: src/audio/song.rs:332 msgid "Unknown title" msgstr "Titre inconnu" #: src/audio/song.rs:339 msgid "Unknown album" msgstr "Album inconnu" #: src/gtk/help-overlay.ui:11 msgctxt "shortcut window" msgid "General" msgstr "Général" #: src/gtk/help-overlay.ui:14 msgctxt "shortcut window" msgid "Toggle primary menu" msgstr "Basculer le menu principal" #: src/gtk/help-overlay.ui:20 msgctxt "shortcut window" msgid "Copy song details to the clipboard" msgstr "Copier les informations du morceau dans le presse-papiers" #: src/gtk/help-overlay.ui:26 msgctxt "shortcut window" msgid "Show shortcuts" msgstr "Afficher les raccourcis clavier" #: src/gtk/help-overlay.ui:32 msgctxt "shortcut window" msgid "Quit" msgstr "Quitter" #: src/gtk/help-overlay.ui:40 msgctxt "shortcut window" msgid "Playlist" msgstr "Liste de lecture" #: src/gtk/help-overlay.ui:43 msgctxt "shortcut window" msgid "Add a song to the playlist" msgstr "Ajouter un morceau à la liste de lecture" #: src/gtk/help-overlay.ui:49 msgctxt "shortcut window" msgid "Add a folder to the playlist" msgstr "Ajouter un dossier à la liste de lecture" #: src/gtk/help-overlay.ui:55 msgctxt "shortcut window" msgid "Clear the playlist" msgstr "Effacer la liste de lecture" #: src/gtk/help-overlay.ui:61 msgctxt "shortcut window" msgid "Toggle the playlist pane" msgstr "Basculer le panneau de la liste de lecture" #: src/gtk/help-overlay.ui:67 msgctxt "shortcut window" msgid "Toggle shuffling songs" msgstr "Basculer le mélange de morceaux" #: src/gtk/help-overlay.ui:75 msgctxt "shortcut window" msgid "Playback" msgstr "Lecture" #: src/gtk/help-overlay.ui:78 msgctxt "shortcut window" msgid "Toggle play/pause" msgstr "Basculer la lecture / pause" #: src/gtk/help-overlay.ui:84 msgctxt "shortcut window" msgid "Previous song" msgstr "Morceau précédent" #: src/gtk/help-overlay.ui:90 msgctxt "shortcut window" msgid "Next song" msgstr "Morceau suivant" #: src/gtk/help-overlay.ui:96 msgctxt "shortcut window" msgid "Seek backwards in the current song" msgstr "Reculer dans le morceau actuel" #: src/gtk/help-overlay.ui:102 msgctxt "shortcut window" msgid "Seek forward in the current song" msgstr "Avancer dans le morceau actuel" #: src/gtk/playback-control.ui:21 msgid "Play the Previous Song" msgstr "Écouter le morceau précédent" #: src/gtk/playback-control.ui:26 msgctxt "a11y" msgid "Skip backwards" msgstr "Reculer" #: src/gtk/playback-control.ui:35 msgid "Toggle Play" msgstr "Lancer la lecture" #: src/gtk/playback-control.ui:41 msgctxt "a11y" msgid "Toggle play" msgstr "Basculer la lecture" #: src/gtk/playback-control.ui:50 msgid "Play the Next Song" msgstr "Lire le morceau suivant" #: src/gtk/playback-control.ui:55 msgctxt "a11y" msgid "Skip forward" msgstr "Avancer" #: src/gtk/playback-control.ui:78 msgid "Toggle Playlist" msgstr "Basculer la liste de lecture" #: src/gtk/playback-control.ui:83 msgctxt "a11y" msgid "Toggle playlist" msgstr "Basculer la liste de lecture" #: src/gtk/playback-control.ui:92 msgid "Shuffle the Playlist" msgstr "Mélanger la liste de lecture" #: src/gtk/playback-control.ui:94 msgctxt "a11y" msgid "Shuffle" msgstr "Mélanger" #: src/gtk/playback-control.ui:113 src/playback_control.rs:114 msgid "Enable Repeat" msgstr "Activer la répétition" #: src/gtk/playback-control.ui:118 msgctxt "a11y" msgid "Repeat" msgstr "Répéter" #: src/gtk/playback-control.ui:129 msgid "Main Menu" msgstr "Menu principal" #: src/gtk/playback-control.ui:135 msgctxt "a11y" msgid "Primary menu" msgstr "Menu principal" #: src/gtk/playback-control.ui:151 msgid "Copy" msgstr "Copier" #: src/gtk/playback-control.ui:157 msgid "Add _Song" msgstr "Ajouter un _morceau" #: src/gtk/playback-control.ui:161 msgid "Add _Folder" msgstr "Ajouter un _dossier" #: src/gtk/playback-control.ui:165 msgid "Clear" msgstr "Effacer" #: src/gtk/playback-control.ui:171 msgid "_Match Cover Art" msgstr "_Accorder aux couleurs de l’album" #: src/gtk/playback-control.ui:175 msgid "_Background Playback" msgstr "Lecture en arrière _plan" #: src/gtk/playback-control.ui:181 msgid "_ReplayGain" msgstr "_ReplayGain" #: src/gtk/playback-control.ui:183 msgctxt "replaygain-menu" msgid "_Album" msgstr "_Album" #: src/gtk/playback-control.ui:188 msgctxt "replaygain-menu" msgid "_Song" msgstr "_Morceau" #: src/gtk/playback-control.ui:193 msgctxt "replaygain-menu" msgid "_Disabled" msgstr "_Désactivé" #: src/gtk/playback-control.ui:201 msgid "_Keyboard Shortcuts" msgstr "_Raccourcis clavier" #: src/gtk/playback-control.ui:205 msgid "_About Amberol" msgstr "À _propos d’Amberol" #: src/gtk/playback-control.ui:209 msgid "_Quit" msgstr "_Quitter" #: src/gtk/playlist-view.ui:19 msgid "Playlist" msgstr "Liste de lecture" #: src/gtk/playlist-view.ui:49 msgid "Search Songs in the Playlist" msgstr "Rechercher des morceaux dans la liste de lecture" #: src/gtk/playlist-view.ui:61 msgid "Select Songs in the Playlist" msgstr "Sélectionner des morceaux dans la liste de lecture" #: src/gtk/playlist-view.ui:74 msgid "Close the Playlist" msgstr "Fermer la liste de lecture" #: src/gtk/playlist-view.ui:135 msgid "Select All Songs" msgstr "Retirer tous les morceaux" #: src/gtk/playlist-view.ui:148 msgid "Remove Selected Songs" msgstr "Retirer les morceaux sélectionnés" #: src/gtk/window.ui:12 msgid "Drop a song to add it to the playlist" msgstr "Glissez et déposez un morceau pour l’ajouter à la liste de lecture" #: src/gtk/window.ui:49 msgid "" "Select a file or a folder, or drag files from your file manager to the " "application window to add songs to the playlist" msgstr "" "Sélectionnez un fichier ou un dossier, ou glissez et déposez des morceaux " "depuis votre gestionnaire de fichiers vers la fenêtre de l’application pour " "les ajouter à la liste de lecture" #: src/gtk/window.ui:58 msgid "Restore Playlist" msgstr "Restaurer la liste de lecture" #: src/gtk/window.ui:68 msgid "Add Folder" msgstr "Ajouter un dossier" #: src/gtk/window.ui:77 msgid "Add Song" msgstr "Ajouter un morceau" #: src/gtk/window.ui:161 msgctxt "a11y" msgid "Elapsed time" msgstr "Temps écoulé" #: src/gtk/window.ui:173 msgctxt "a11y" msgid "Remaining time" msgstr "Temps restant" #. Translators: Replace "translator-credits" with your names, one name per line #: src/application.rs:228 msgid "translator-credits" msgstr "" "Mathéo \n" "Alexandre Franke \n" "Irénée Thirion " #: src/application.rs:240 msgid "Amberol needs to run in the background to play music" msgstr "Amberol doit être executé en tâche de fond pour lire de la musique" #: src/playback_control.rs:118 msgid "Repeat All Songs" msgstr "Répéter tous les morceaux" #: src/playback_control.rs:122 msgid "Repeat the Current Song" msgstr "Répéter le morceau actuel" #: src/window.rs:438 msgid "_Add Song" msgstr "_Ajouter un morceau" #: src/window.rs:439 src/window.rs:479 msgid "_Cancel" msgstr "A_nnuler" #: src/window.rs:441 msgid "Open File" msgstr "Ouvrir un fichier" #: src/window.rs:448 msgid "Audio files" msgstr "Fichiers audios" #: src/window.rs:457 src/window.rs:1393 msgid "Unable to access files" msgstr "Impossible d’accéder aux fichiers" #: src/window.rs:478 msgid "_Add Folder" msgstr "_Ajouter un dossier" #: src/window.rs:481 msgid "Open Folder" msgstr "Ouvrir un dossier" #: src/window.rs:492 msgid "Unable to access folders" msgstr "Impossible d’accéder aux dossiers" #: src/window.rs:510 msgid "No available song found" msgstr "Aucun morceau disponible trouvé" #: src/window.rs:567 msgid "No songs found" msgstr "Aucun morceau trouvé" #: src/window.rs:597 msgid "Added a new song" msgstr "Nouveau morceau ajouté" #: src/window.rs:598 msgid "Play" msgstr "Lire" #. Translators: the `{}` must be left unmodified; #. it will be expanded to the number of songs added #. to the playlist #: src/window.rs:607 msgid "Added one song" msgid_plural "Added {} songs" msgstr[0] "Un morceau ajouté" msgstr[1] "{} morceaux ajoutés" #: src/window.rs:1157 msgid "Unable to access dropped files" msgstr "Impossible d’accéder aux fichiers déposés" #: src/window.rs:1251 msgid "{} minute" msgid_plural "{} minutes" msgstr[0] "{} minute" msgstr[1] "{} minutes" #: src/window.rs:1262 msgid "{hours} hour {minutes} remaining" msgid_plural "{hours} hours {minutes} remaining" msgstr[0] "{hours} heure {minutes} restante" msgstr[1] "{hours} heures {minutes} restantes" #. Translators: the '{}' must be left unmodified, and #. it will be replaced by the number of minutes remaining #. in the playlist #: src/window.rs:1272 msgid "{} minute remaining" msgid_plural "{} minutes remaining" msgstr[0] "{} minute restante" msgstr[1] "{} minutes restantes" #: src/window.rs:1372 msgid "No song selected" msgstr "Aucun morceau sélectionné" #. Translators: The '{}' must be left unmodified, and #. it is expanded to the number of songs selected #: src/window.rs:1377 msgid "{} song selected" msgid_plural "{} songs selected" msgstr[0] "{} morceau sélectionné" msgstr[1] "{} morceaux sélectionnés" #. Translators: `{title}` and `{artist}` must be left #. untranslated; they will expand to the title and #. artist of the currently playing song, respectively #: src/window.rs:1431 msgid "Currently playing “{title}” by “{artist}”" msgstr "Lecture de « {title} » par « {artist} »" #~ msgid "_Track" #~ msgstr "_Morceau" #~ msgid "Add File" #~ msgstr "Ajouter un fichier" #~ msgid "Repeat All Tracks" #~ msgstr "Répéter tous les morceaux" amberol-0.10.3/po/fur.po000066400000000000000000000271711443320625200147770ustar00rootroot00000000000000# Friulian translation for amberol. # Copyright (C) 2023 amberol's COPYRIGHT HOLDER # This file is distributed under the same license as the amberol package. # FIRST AUTHOR , YEAR. # msgid "" msgstr "" "Project-Id-Version: amberol main\n" "Report-Msgid-Bugs-To: https://gitlab.gnome.org/World/amberol/issues\n" "POT-Creation-Date: 2023-02-22 13:07+0000\n" "PO-Revision-Date: 2023-03-10 08:53+0100\n" "Last-Translator: Fabio Tomat \n" "Language-Team: Friulian \n" "Language: fur\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-Editor: HaiPO 1.4 beta\n" "X-Generator: Poedit 3.2.2\n" #: data/io.bassi.Amberol.desktop.in.in:3 #: data/io.bassi.Amberol.appdata.xml.in.in:6 msgid "Amberol" msgstr "Amberol" #: data/io.bassi.Amberol.desktop.in.in:4 msgid "Music Player" msgstr "Riprodutôr musicâl" #. Translators: Search terms to find this application. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! #: data/io.bassi.Amberol.desktop.in.in:12 msgid "music;player;media;audio;playlist;" msgstr "musiche;riprodutôr;multimedia;audio;liste di riproduzion;" #: data/io.bassi.Amberol.appdata.xml.in.in:7 msgid "Plays music, and nothing else" msgstr "Al riprodûs musiche e nuie altri" #: data/io.bassi.Amberol.appdata.xml.in.in:9 msgid "" "Amberol is a music player with no delusions of grandeur. If you just want to " "play music available on your local system then Amberol is the music player " "you are looking for." msgstr "" "Amberol al è un riprodutôr musicâl cence delusions di grandece. Se tu " "desideris dome scoltâ la musiche disponibile sul to sisteme locâl, Amberol " "al è il riprodutôr musicâl che tu stâs cirint." #: data/io.bassi.Amberol.appdata.xml.in.in:14 msgid "Current features:" msgstr "Funzionalitâts corintis:" #: data/io.bassi.Amberol.appdata.xml.in.in:16 msgid "adaptive UI" msgstr "IU adative" #: data/io.bassi.Amberol.appdata.xml.in.in:17 msgid "UI recoloring using the album art" msgstr "La interface si torne a colorâ doprant la grafiche dal album" #: data/io.bassi.Amberol.appdata.xml.in.in:18 msgid "drag and drop support to queue songs" msgstr "supuart pal strissinâ e molâ par meti in code lis cjançons" #: data/io.bassi.Amberol.appdata.xml.in.in:19 msgid "shuffle and repeat" msgstr "messede e ripet" #: data/io.bassi.Amberol.appdata.xml.in.in:20 msgid "MPRIS integration" msgstr "Integrazion MPRIS" #: data/io.bassi.Amberol.appdata.xml.in.in:42 msgid "Emmanuele Bassi" msgstr "Emmanuele Bassi" #: src/audio/inhibit_controller.rs:40 msgid "Playback in progress" msgstr "Riproduzion in vore" #: src/audio/song.rs:337 msgid "Unknown artist" msgstr "Artist no cognossût" #: src/audio/song.rs:344 msgid "Unknown title" msgstr "Titul no cognossût" #: src/audio/song.rs:351 msgid "Unknown album" msgstr "Album no cognossût" #: src/gtk/help-overlay.ui:11 msgctxt "shortcut window" msgid "General" msgstr "Gjenerâl" #: src/gtk/help-overlay.ui:14 msgctxt "shortcut window" msgid "Toggle primary menu" msgstr "Comute menù primari" #: src/gtk/help-overlay.ui:20 msgctxt "shortcut window" msgid "Copy song details to the clipboard" msgstr "Copie i detais de cjançon intes notis" #: src/gtk/help-overlay.ui:26 msgctxt "shortcut window" msgid "Show shortcuts" msgstr "Mostre scurtis" #: src/gtk/help-overlay.ui:32 msgctxt "shortcut window" msgid "Quit" msgstr "Jes" #: src/gtk/help-overlay.ui:40 msgctxt "shortcut window" msgid "Playlist" msgstr "Liste di riproduzion" #: src/gtk/help-overlay.ui:43 msgctxt "shortcut window" msgid "Add a song to the playlist" msgstr "Zonte une cjançon ae liste di riproduzion" #: src/gtk/help-overlay.ui:49 msgctxt "shortcut window" msgid "Add a folder to the playlist" msgstr "Zonte une cartele ae liste di riproduzion" #: src/gtk/help-overlay.ui:55 msgctxt "shortcut window" msgid "Clear the playlist" msgstr "Nete la liste di riproduzion" #: src/gtk/help-overlay.ui:61 msgctxt "shortcut window" msgid "Toggle the playlist pane" msgstr "Comute il ricuadri de liste di riproduzion" #: src/gtk/help-overlay.ui:67 msgctxt "shortcut window" msgid "Toggle shuffling songs" msgstr "Comute il messedâ lis cjançons" #: src/gtk/help-overlay.ui:75 msgctxt "shortcut window" msgid "Playback" msgstr "Riproduzion" #: src/gtk/help-overlay.ui:78 msgctxt "shortcut window" msgid "Toggle play/pause" msgstr "Comute riprodûs/pause" #: src/gtk/help-overlay.ui:84 msgctxt "shortcut window" msgid "Previous song" msgstr "Cjançon precedente" #: src/gtk/help-overlay.ui:90 msgctxt "shortcut window" msgid "Next song" msgstr "Cjançon sucessive" #: src/gtk/help-overlay.ui:96 msgctxt "shortcut window" msgid "Seek backwards in the current song" msgstr "Cîr indaûr in cheste cjançon" #: src/gtk/help-overlay.ui:102 msgctxt "shortcut window" msgid "Seek forward in the current song" msgstr "Cîr indenant in cheste cjançon" #: src/gtk/playback-control.ui:35 msgctxt "a11y" msgid "Elapsed time" msgstr "Timp passât" #: src/gtk/playback-control.ui:47 msgctxt "a11y" msgid "Remaining time" msgstr "Timp che al reste" #: src/gtk/playback-control.ui:69 msgid "Play the Previous Song" msgstr "Riprodûs la cjançon precedente" #: src/gtk/playback-control.ui:74 msgctxt "a11y" msgid "Skip backwards" msgstr "Salte indaûr" #: src/gtk/playback-control.ui:83 msgid "Toggle Play" msgstr "Comute Riprodûs" #: src/gtk/playback-control.ui:89 msgctxt "a11y" msgid "Toggle play" msgstr "Comute riprodûs" #: src/gtk/playback-control.ui:98 msgid "Play the Next Song" msgstr "Riprodûs la cjançon sucessive" #: src/gtk/playback-control.ui:103 msgctxt "a11y" msgid "Skip forward" msgstr "Salte indenant" #: src/gtk/playback-control.ui:126 msgid "Toggle Playlist" msgstr "Comute liste di riproduzion" #: src/gtk/playback-control.ui:131 msgctxt "a11y" msgid "Toggle playlist" msgstr "Comute liste di riproduzion" #: src/gtk/playback-control.ui:140 msgid "Shuffle the Playlist" msgstr "Messede la liste di riproduzion" #: src/gtk/playback-control.ui:142 msgctxt "a11y" msgid "Shuffle" msgstr "Messede" #: src/gtk/playback-control.ui:161 src/playback_control.rs:153 msgid "Enable Repeat" msgstr "Abilite Ripeti" #: src/gtk/playback-control.ui:166 msgctxt "a11y" msgid "Repeat" msgstr "Ripet" #: src/gtk/playback-control.ui:177 msgid "Main Menu" msgstr "Menù principâl" #: src/gtk/playback-control.ui:183 msgctxt "a11y" msgid "Primary menu" msgstr "Menù primari" #: src/gtk/playback-control.ui:199 msgid "Copy" msgstr "Copie" #: src/gtk/playback-control.ui:205 msgid "Add _Song" msgstr "Zonte _cjançon" #: src/gtk/playback-control.ui:209 msgid "Add _Folder" msgstr "Zonte c_artele" #: src/gtk/playback-control.ui:213 msgid "Clear" msgstr "Nete" #: src/gtk/playback-control.ui:219 msgid "_Match Cover Art" msgstr "_Imbine ae grafiche de cuvierte" #: src/gtk/playback-control.ui:223 msgid "_Background Playback" msgstr "Riproduzion in _sotfont" #: src/gtk/playback-control.ui:229 msgid "_ReplayGain" msgstr "_ReplayGain" #: src/gtk/playback-control.ui:231 msgid "_Album" msgstr "_Album" #: src/gtk/playback-control.ui:236 msgid "_Track" msgstr "_Linie" #: src/gtk/playback-control.ui:241 msgid "_Off" msgstr "_Disativât" #: src/gtk/playback-control.ui:249 msgid "_Keyboard Shortcuts" msgstr "Scurtis di _tastiere" #: src/gtk/playback-control.ui:253 msgid "_About Amberol" msgstr "_Informazions su Amberol" #: src/gtk/playback-control.ui:257 msgid "_Quit" msgstr "_Jes" #: src/gtk/playlist-view.ui:19 msgid "Playlist" msgstr "Liste di riproduzion" #: src/gtk/playlist-view.ui:49 msgid "Search Songs in the Playlist" msgstr "Cîr cjançons te liste di riproduzion" #: src/gtk/playlist-view.ui:61 msgid "Select Songs in the Playlist" msgstr "Selezione cjançons te liste di riproduzion" #: src/gtk/playlist-view.ui:74 msgid "Close the Playlist" msgstr "Siere la liste di riproduzion" #: src/gtk/playlist-view.ui:135 msgid "Select All Songs" msgstr "Selezione dutis lis cjançons" #: src/gtk/playlist-view.ui:148 msgid "Remove Selected Songs" msgstr "Gjave lis cjançons selezionadis" #: src/gtk/window.ui:12 msgid "Drop a song to add it to the queue" msgstr "Mole une cjançon par zontâle te code" #: src/gtk/window.ui:49 msgid "" "Select a file or a folder, or drag files from your file manager to the " "application window to add songs to the playlist" msgstr "" "Selezione un file o une cartele, opûr strissine i files di un gjestôr di " "files sul barcon de aplicazion, par zontâ lis cjançons ae liste di " "riproduzion" #: src/gtk/window.ui:58 msgid "Restore Playlist" msgstr "Ripristine liste di riproduzion" #: src/gtk/window.ui:68 msgid "Add Folder" msgstr "Zonte cartele" #: src/gtk/window.ui:77 msgid "Add Song" msgstr "Zonte cjançon" #. Translators: Replace "translator-credits" with your names, one name per line #: src/application.rs:233 msgid "translator-credits" msgstr "Fabio Tomat " #: src/application.rs:247 msgid "Amberol needs to run in the background to play music" msgstr "Par riprodusi musiche Amberol al scugne zirâ in sotfont" #: src/playback_control.rs:157 msgid "Repeat All Tracks" msgstr "Ripet dutis lis liniis" #: src/playback_control.rs:161 msgid "Repeat the Current Track" msgstr "Ripet la linie corinte" #: src/window.rs:397 msgid "_Add Song" msgstr "_Zonte cjançon" #: src/window.rs:398 src/window.rs:438 msgid "_Cancel" msgstr "_Anule" #: src/window.rs:400 msgid "Open File" msgstr "Vierç file" #: src/window.rs:407 msgid "Audio files" msgstr "Files audio" #: src/window.rs:416 src/window.rs:1306 msgid "Unable to access files" msgstr "Impussibil acedi ai files" #: src/window.rs:437 msgid "_Add Folder" msgstr "_Zonte cartele" #: src/window.rs:440 msgid "Open Folder" msgstr "Vierç cartele" #: src/window.rs:451 msgid "Unable to access folders" msgstr "Impussibil acedi aes cartelis" #: src/window.rs:469 msgid "No available song found" msgstr "Nissune cjançon disponibile cjatade" #: src/window.rs:526 msgid "No songs found" msgstr "Nissune cjançon cjatade" #: src/window.rs:556 msgid "Added a new song" msgstr "Zontade une gnove cjançon" #: src/window.rs:557 msgid "Play" msgstr "Riprodûs" #. Translators: the `{}` must be left unmodified; #. it will be expanded to the number of songs added #. to the playlist #: src/window.rs:566 msgid "Added one song" msgid_plural "Added {} songs" msgstr[0] "Zontade une cjançon" msgstr[1] "Zontadis {} cjançons" #: src/window.rs:1056 msgid "Unable to access dropped files" msgstr "Impussibil acedi ai files molâts" #: src/window.rs:1149 msgid "{} minute" msgid_plural "{} minutes" msgstr[0] "{} minût" msgstr[1] "{} minûts" #: src/window.rs:1160 msgid "{hours} hour {minutes} remaining" msgid_plural "{hours} hours {minutes} remaining" msgstr[0] "a restin {hours} ore {minutes}" msgstr[1] "a restin {hours} oris {minutes}" #. Translators: the '{}' must be left unmodified, and #. it will be replaced by the number of minutes remaining #. in the playlist #: src/window.rs:1170 msgid "{} minute remaining" msgid_plural "{} minutes remaining" msgstr[0] "al reste {} minût" msgstr[1] "a restin {} minûts" #: src/window.rs:1286 msgid "No song selected" msgstr "Nissune cjançon selezionade" #. Translators: The '{}' must be left unmodified, and #. it is expanded to the number of songs selected #: src/window.rs:1291 msgid "{} song selected" msgid_plural "{} songs selected" msgstr[0] "{} cjançon selezionade" msgstr[1] "{} cjançons selezionadis" #. Translators: `{title}` and `{artist}` must be left #. untranslated; they will expand to the title and #. artist of the currently playing song, respectively #: src/window.rs:1344 msgid "Currently playing “{title}” by “{artist}”" msgstr "Cumò in riproduzion “{title}” di “{artist}”" amberol-0.10.3/po/gl.po000066400000000000000000000323631443320625200146040ustar00rootroot00000000000000# Galician translation for amberol. # Copyright (C) 2022 amberol's COPYRIGHT HOLDER # This file is distributed under the same license as the amberol package. # FIRST AUTHOR , YEAR. # Fran Dieguez , 2022. # msgid "" msgstr "" "Project-Id-Version: amberol main\n" "Report-Msgid-Bugs-To: https://gitlab.gnome.org/World/amberol/issues\n" "POT-Creation-Date: 2023-04-24 22:31+0000\n" "PO-Revision-Date: 2023-04-26 01:40+0200\n" "Last-Translator: Fran Dieguez \n" "Language-Team: Galician \n" "Language: gl\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: Poedit 3.2.2\n" "X-DL-Team: gl\n" "X-DL-Module: amberol\n" "X-DL-Branch: main\n" "X-DL-Domain: po\n" "X-DL-State: Translating\n" #: data/io.bassi.Amberol.desktop.in.in:3 #: data/io.bassi.Amberol.appdata.xml.in.in:6 msgid "Amberol" msgstr "Amberol" #: data/io.bassi.Amberol.desktop.in.in:4 msgid "Music Player" msgstr "Reprodutor de música" #. Translators: Search terms to find this application. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! #: data/io.bassi.Amberol.desktop.in.in:12 msgid "music;player;media;audio;playlist;" msgstr "música;reprodutor;media;son;lista de reprodución;" #: data/io.bassi.Amberol.appdata.xml.in.in:7 msgid "Plays music, and nothing else" msgstr "Reproduce música e nada máis" #: data/io.bassi.Amberol.appdata.xml.in.in:9 msgid "" "Amberol is a music player with no delusions of grandeur. If you just want to " "play music available on your local system then Amberol is the music player " "you are looking for." msgstr "" "Amberol é un reprodutor de música sen delirios de grandeza. Se só quere " "reproducir a música dispoñíbel no seu sistema local entón Amberol é o " "reprodutor de música que busca." #: data/io.bassi.Amberol.appdata.xml.in.in:14 msgid "Current features:" msgstr "Características actuáis:" #: data/io.bassi.Amberol.appdata.xml.in.in:16 msgid "adaptive UI" msgstr "interface adaptativa" #: data/io.bassi.Amberol.appdata.xml.in.in:17 msgid "UI recoloring using the album art" msgstr "Recoloreado da interface usando o arte do álbume" #: data/io.bassi.Amberol.appdata.xml.in.in:18 msgid "drag and drop support to queue songs" msgstr "compatibilidade de arrastrar e soltar para encolar cancións" #: data/io.bassi.Amberol.appdata.xml.in.in:19 msgid "shuffle and repeat" msgstr "misturar e repetir" #: data/io.bassi.Amberol.appdata.xml.in.in:20 msgid "MPRIS integration" msgstr "Integración con MPRIS" #: data/io.bassi.Amberol.appdata.xml.in.in:42 msgid "Emmanuele Bassi" msgstr "Emmanuele Bassi" #: src/audio/inhibit_controller.rs:40 msgid "Playback in progress" msgstr "Reprodución en progreso" #: src/audio/song.rs:325 msgid "Unknown artist" msgstr "Artista descoñecido" #: src/audio/song.rs:332 msgid "Unknown title" msgstr "Título descoñecido" #: src/audio/song.rs:339 msgid "Unknown album" msgstr "Álbume descoñecido" #: src/gtk/help-overlay.ui:11 msgctxt "shortcut window" msgid "General" msgstr "Xeral" #: src/gtk/help-overlay.ui:14 msgctxt "shortcut window" msgid "Toggle primary menu" msgstr "Trocar menú principal" #: src/gtk/help-overlay.ui:20 msgctxt "shortcut window" msgid "Copy song details to the clipboard" msgstr "Copiar os detalles da canción ao portapapeis" #: src/gtk/help-overlay.ui:26 msgctxt "shortcut window" msgid "Show shortcuts" msgstr "Mostrar atallos" #: src/gtk/help-overlay.ui:32 msgctxt "shortcut window" msgid "Quit" msgstr "Saír" #: src/gtk/help-overlay.ui:40 msgctxt "shortcut window" msgid "Playlist" msgstr "Lista de reprodución" #: src/gtk/help-overlay.ui:43 msgctxt "shortcut window" msgid "Add a song to the playlist" msgstr "Engadir unha canción á lista de reprodución" #: src/gtk/help-overlay.ui:49 msgctxt "shortcut window" msgid "Add a folder to the playlist" msgstr "Engadir un cartafol á lista de reprodución" #: src/gtk/help-overlay.ui:55 msgctxt "shortcut window" msgid "Clear the playlist" msgstr "Pechar a lista de reprodución" #: src/gtk/help-overlay.ui:61 msgctxt "shortcut window" msgid "Toggle the playlist pane" msgstr "Trocar o panel de lista de reprodución" #: src/gtk/help-overlay.ui:67 msgctxt "shortcut window" msgid "Toggle shuffling songs" msgstr "Trocar as cancións aletorias" #: src/gtk/help-overlay.ui:75 msgctxt "shortcut window" msgid "Playback" msgstr "Lista de reprodución" #: src/gtk/help-overlay.ui:78 msgctxt "shortcut window" msgid "Toggle play/pause" msgstr "Trocar reproducir/pausar" #: src/gtk/help-overlay.ui:84 msgctxt "shortcut window" msgid "Previous song" msgstr "Canción anterior" #: src/gtk/help-overlay.ui:90 msgctxt "shortcut window" msgid "Next song" msgstr "Seguite canción" #: src/gtk/help-overlay.ui:96 msgctxt "shortcut window" msgid "Seek backwards in the current song" msgstr "Avanzar na canción actual" #: src/gtk/help-overlay.ui:102 msgctxt "shortcut window" msgid "Seek forward in the current song" msgstr "Ir atrás na canción actual" #: src/gtk/playback-control.ui:21 msgid "Play the Previous Song" msgstr "Reproducir a canción anterior" #: src/gtk/playback-control.ui:26 msgctxt "a11y" msgid "Skip backwards" msgstr "Saltar cara atrás" #: src/gtk/playback-control.ui:35 msgid "Toggle Play" msgstr "Trocar reprodución" #: src/gtk/playback-control.ui:41 msgctxt "a11y" msgid "Toggle play" msgstr "Trocar reprodución" #: src/gtk/playback-control.ui:50 msgid "Play the Next Song" msgstr "Reproducir a seguinte canción" #: src/gtk/playback-control.ui:55 msgctxt "a11y" msgid "Skip forward" msgstr "Saltar adiante" #: src/gtk/playback-control.ui:78 msgid "Toggle Playlist" msgstr "Trocar lista de reprodución" #: src/gtk/playback-control.ui:83 msgctxt "a11y" msgid "Toggle playlist" msgstr "Trocar lista de reprodución" #: src/gtk/playback-control.ui:92 msgid "Shuffle the Playlist" msgstr "Mesturar a lista de reprodución" #: src/gtk/playback-control.ui:94 msgctxt "a11y" msgid "Shuffle" msgstr "Aleatorio" #: src/gtk/playback-control.ui:113 src/playback_control.rs:114 msgid "Enable Repeat" msgstr "Activar repetir" #: src/gtk/playback-control.ui:118 msgctxt "a11y" msgid "Repeat" msgstr "Repetir" #: src/gtk/playback-control.ui:129 msgid "Main Menu" msgstr "Menú principal" #: src/gtk/playback-control.ui:135 msgctxt "a11y" msgid "Primary menu" msgstr "Menú principal" #: src/gtk/playback-control.ui:151 msgid "Copy" msgstr "Copiar" #: src/gtk/playback-control.ui:157 msgid "Add _Song" msgstr "Engadir _canción" #: src/gtk/playback-control.ui:161 msgid "Add _Folder" msgstr "Engadir _cartafol" #: src/gtk/playback-control.ui:165 msgid "Clear" msgstr "Limpar" #: src/gtk/playback-control.ui:171 msgid "_Match Cover Art" msgstr "_Coincidir co arte da carátula" #: src/gtk/playback-control.ui:175 msgid "_Background Playback" msgstr "Reprodución en _segundo plano" #: src/gtk/playback-control.ui:181 msgid "_ReplayGain" msgstr "_ReplayGain" #: src/gtk/playback-control.ui:183 msgctxt "replaygain-menu" msgid "_Album" msgstr "_Álbum" #: src/gtk/playback-control.ui:188 msgctxt "replaygain-menu" msgid "_Song" msgstr "_Canción" #: src/gtk/playback-control.ui:193 msgctxt "replaygain-menu" msgid "_Disabled" msgstr "_Desactivado" #: src/gtk/playback-control.ui:201 msgid "_Keyboard Shortcuts" msgstr "Atallos de _teclado" #: src/gtk/playback-control.ui:205 msgid "_About Amberol" msgstr "_Sobre Amberol" #: src/gtk/playback-control.ui:209 msgid "_Quit" msgstr "_Saír" #: src/gtk/playlist-view.ui:19 msgid "Playlist" msgstr "Lista de reprodución" #: src/gtk/playlist-view.ui:49 msgid "Search Songs in the Playlist" msgstr "Buscar cancións na lista de reprodución" #: src/gtk/playlist-view.ui:61 msgid "Select Songs in the Playlist" msgstr "Seleccionar cancións na lista de reprodución" #: src/gtk/playlist-view.ui:74 msgid "Close the Playlist" msgstr "Pechar a lista de reprodución" #: src/gtk/playlist-view.ui:135 msgid "Select All Songs" msgstr "Seleccionar todas as cancións" #: src/gtk/playlist-view.ui:148 msgid "Remove Selected Songs" msgstr "Eliminar as canción seleccionadas" #: src/gtk/window.ui:12 msgid "Drop a song to add it to the playlist" msgstr "Omitir unha canción para engadila á lista de reprodución" #: src/gtk/window.ui:49 msgid "" "Select a file or a folder, or drag files from your file manager to the " "application window to add songs to the playlist" msgstr "" "Seleccione un ficheiro ou cartafol, ou arrastre os ficheiros desde o seu " "xestor de ficheiros na xanela da aplicación para engadir cancións na lista " "de reprodución" #: src/gtk/window.ui:58 msgid "Restore Playlist" msgstr "Restaurar lista de reprodución" #: src/gtk/window.ui:68 msgid "Add Folder" msgstr "Engadir cartafol" #: src/gtk/window.ui:77 msgid "Add Song" msgstr "Engadir canción" #: src/gtk/window.ui:161 msgctxt "a11y" msgid "Elapsed time" msgstr "Tempo pasado" #: src/gtk/window.ui:173 msgctxt "a11y" msgid "Remaining time" msgstr "Tempo que falta" #. Translators: Replace "translator-credits" with your names, one name per line #: src/application.rs:227 msgid "translator-credits" msgstr "Fran Diéguez , 2022-2023" #: src/application.rs:239 msgid "Amberol needs to run in the background to play music" msgstr "Amberol precisa executarse en segundo plano para reproducir música" #: src/playback_control.rs:118 msgid "Repeat All Songs" msgstr "Repetir todas as cancións" #: src/playback_control.rs:122 msgid "Repeat the Current Song" msgstr "Repetir a canción actual" #: src/window.rs:403 msgid "_Add Song" msgstr "_Engadir canción" #: src/window.rs:404 src/window.rs:444 msgid "_Cancel" msgstr "_Cancelar" #: src/window.rs:406 msgid "Open File" msgstr "Abrir ficheiro" #: src/window.rs:413 msgid "Audio files" msgstr "Ficheiros de son" #: src/window.rs:422 src/window.rs:1315 msgid "Unable to access files" msgstr "Non foi posíbel acceder aos ficheiros" #: src/window.rs:443 msgid "_Add Folder" msgstr "_Engadir cartafol" #: src/window.rs:446 msgid "Open Folder" msgstr "Abrir cartafol" #: src/window.rs:457 msgid "Unable to access folders" msgstr "Non foi posíbel acceder aos cartafoles" #: src/window.rs:475 msgid "No available song found" msgstr "Non se atoparon cancións" #: src/window.rs:532 msgid "No songs found" msgstr "Non se atoparon cancións" #: src/window.rs:562 msgid "Added a new song" msgstr "Engadiuse unha nova canción" #: src/window.rs:563 msgid "Play" msgstr "Reproducir" #. Translators: the `{}` must be left unmodified; #. it will be expanded to the number of songs added #. to the playlist #: src/window.rs:572 msgid "Added one song" msgid_plural "Added {} songs" msgstr[0] "Engadiuse unha canción" msgstr[1] "Engadironse {} cancións" #: src/window.rs:1062 msgid "Unable to access dropped files" msgstr "Non foi posíbel acceder aos ficheiros soltados" #: src/window.rs:1152 msgid "{} minute" msgid_plural "{} minutes" msgstr[0] "{} minuto" msgstr[1] "{} minutos" #: src/window.rs:1163 msgid "{hours} hour {minutes} remaining" msgid_plural "{hours} hours {minutes} remaining" msgstr[0] "faltan {hours} hora {minutes}" msgstr[1] "faltan {hours} horas {minutes}" #. Translators: the '{}' must be left unmodified, and #. it will be replaced by the number of minutes remaining #. in the playlist #: src/window.rs:1173 msgid "{} minute remaining" msgid_plural "{} minutes remaining" msgstr[0] "falta {} minuto" msgstr[1] "faltan {} minutos" #: src/window.rs:1295 msgid "No song selected" msgstr "Non hai unha canción seleccionada" #. Translators: The '{}' must be left unmodified, and #. it is expanded to the number of songs selected #: src/window.rs:1300 msgid "{} song selected" msgid_plural "{} songs selected" msgstr[0] "{} canción seleccionada" msgstr[1] "{} cancións seleccionadas" #. Translators: `{title}` and `{artist}` must be left #. untranslated; they will expand to the title and #. artist of the currently playing song, respectively #: src/window.rs:1353 msgid "Currently playing “{title}” by “{artist}”" msgstr "Reproducindo actualmentex «{title}» por «{artist}»" #~ msgid "_Track" #~ msgstr "_Pista" #~ msgid "_Off" #~ msgstr "_Desactivado" #~ msgid "Repeat All Tracks" #~ msgstr "Repetir todas as pistas" #, fuzzy #~| msgid "_Add Folder" #~ msgid "Add File" #~ msgstr "_Engadir cartafol" #~ msgid "Plays music and nothing else" #~ msgstr "Reproduce música e nada máis" #~ msgid "Amberol cannot run in the background" #~ msgstr "Amberol non se pode executar en segundo plano" #~ msgctxt "shortcut window" #~ msgid "Songs Queue" #~ msgstr "Encolar cancións" #~ msgctxt "shortcut window" #~ msgid "Queue a Song" #~ msgstr "Encolar unha canción" #~ msgctxt "shortcut window" #~ msgid "Clear" #~ msgstr "Limpar" #~ msgctxt "shortcut window" #~ msgid "Previous Track" #~ msgstr "Anterior pista" #~ msgctxt "shortcut window" #~ msgid "Seek Backwards" #~ msgstr "Avanzar cara adiante" #~ msgctxt "shortcut window" #~ msgid "Seek Forward" #~ msgstr "Atrasar" #~ msgid "Show the playlist" #~ msgstr "Mostrar lista de reprodución" #~ msgid "Playing next" #~ msgstr "Reproducir seguinte" #~ msgid "Choose a folder" #~ msgstr "Escoller un cartafol" #~ msgid "Unrecognized file type for “{}”" #~ msgstr "Tipo de ficheiro non recoñecido para “{}”" #~ msgid "“{}” is not a supported audio file" #~ msgstr "“{}” non é un ficheiro de son compatíbel" amberol-0.10.3/po/he.po000066400000000000000000000347601443320625200146010ustar00rootroot00000000000000# Hebrew translation for amberol. # Copyright (C) 2022 amberol's COPYRIGHT HOLDER # This file is distributed under the same license as the amberol package. # Yosef Or Boczko , 2022-2023. # msgid "" msgstr "" "Project-Id-Version: amberol main\n" "Report-Msgid-Bugs-To: https://gitlab.gnome.org/World/amberol/issues\n" "POT-Creation-Date: 2023-04-29 18:48+0000\n" "PO-Revision-Date: 2023-05-07 15:54+0300\n" "Last-Translator: Yosef Or Boczko \n" "Language-Team: Hebrew \n" "Language: he\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=4; plural=(n==1 ? 0 : n==2 ? 1 : n>10 && n%10==0 ? " "2 : 3)\n" "X-Generator: Gtranslator 42.0\n" #: data/io.bassi.Amberol.desktop.in.in:3 #: data/io.bassi.Amberol.appdata.xml.in.in:6 msgid "Amberol" msgstr "אמברול" #: data/io.bassi.Amberol.desktop.in.in:4 msgid "Music Player" msgstr "נגן מוזיקה" #. Translators: Search terms to find this application. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! #: data/io.bassi.Amberol.desktop.in.in:12 msgid "music;player;media;audio;playlist;" msgstr "" "מוזיקה;מוסיקה;שמע;צליל;נגן;מדיה;אודיו;רשימת השמעה;רשימות השמעה;פליליסט;" #: data/io.bassi.Amberol.appdata.xml.in.in:7 msgid "Plays music, and nothing else" msgstr "ניגון מוזיקה, ושום דבר מעבר לכך" #: data/io.bassi.Amberol.appdata.xml.in.in:9 msgid "" "Amberol is a music player with no delusions of grandeur. If you just want to " "play music available on your local system then Amberol is the music player " "you are looking for." msgstr "" "אמברול הוא נגן מוזיקה ללא שגעון גדלות. אם ברצונך רק להשמיע מוזיקה הזמינה " "במערכת המקומית שלך, אמברול הוא נגן המוזיקה בשבילך. " #: data/io.bassi.Amberol.appdata.xml.in.in:14 msgid "Current features:" msgstr "תכונות נוכחיות:" #: data/io.bassi.Amberol.appdata.xml.in.in:16 msgid "adaptive UI" msgstr "ממשק משתמש משתנה ומותאם" #: data/io.bassi.Amberol.appdata.xml.in.in:17 msgid "UI recoloring using the album art" msgstr "צביעת ממשק המשתמש בהתאם לכיסוי האלבום" #: data/io.bassi.Amberol.appdata.xml.in.in:18 msgid "drag and drop support to queue songs" msgstr "תמיכה בגרירה ושחרור להכנסת שירים לתור" #: data/io.bassi.Amberol.appdata.xml.in.in:19 msgid "shuffle and repeat" msgstr "ערבוב וחזרה" #: data/io.bassi.Amberol.appdata.xml.in.in:20 msgid "MPRIS integration" msgstr "שילוב MPRIS" #: data/io.bassi.Amberol.appdata.xml.in.in:42 msgid "Emmanuele Bassi" msgstr "Emmanuele Bassi" #: src/audio/inhibit_controller.rs:40 msgid "Playback in progress" msgstr "בתהליך ניגון" #: src/audio/song.rs:325 msgid "Unknown artist" msgstr "אמן לא ידוע" #: src/audio/song.rs:332 msgid "Unknown title" msgstr "כותרת לא ידועה" #: src/audio/song.rs:339 msgid "Unknown album" msgstr "אלבום לא ידוע" #: src/gtk/help-overlay.ui:11 msgctxt "shortcut window" msgid "General" msgstr "כללי" #: src/gtk/help-overlay.ui:14 msgctxt "shortcut window" msgid "Toggle primary menu" msgstr "החלפת תצוגת התפריט העיקרי" #: src/gtk/help-overlay.ui:20 msgctxt "shortcut window" msgid "Copy song details to the clipboard" msgstr "העתקת פרטי שיר ללוח הגזירים" #: src/gtk/help-overlay.ui:26 msgctxt "shortcut window" msgid "Show shortcuts" msgstr "הצגת צירופי מקשים" #: src/gtk/help-overlay.ui:32 msgctxt "shortcut window" msgid "Quit" msgstr "יציאה" #: src/gtk/help-overlay.ui:40 msgctxt "shortcut window" msgid "Playlist" msgstr "רשימת השמעה" #: src/gtk/help-overlay.ui:43 msgctxt "shortcut window" msgid "Add a song to the playlist" msgstr "הוספת שיר לרשימת ההשמעה" #: src/gtk/help-overlay.ui:49 msgctxt "shortcut window" msgid "Add a folder to the playlist" msgstr "הוספת תיקייה לרשימת ההשמעה" #: src/gtk/help-overlay.ui:55 msgctxt "shortcut window" msgid "Clear the playlist" msgstr "ניקוי רשימת ההשמעה" #: src/gtk/help-overlay.ui:61 msgctxt "shortcut window" msgid "Toggle the playlist pane" msgstr "הצגה/הסתרת רשימת ההשמעה הצדית" #: src/gtk/help-overlay.ui:67 msgctxt "shortcut window" msgid "Toggle shuffling songs" msgstr "ערבוב/ביטול ערבוב שירים" #: src/gtk/help-overlay.ui:75 msgctxt "shortcut window" msgid "Playback" msgstr "ניגון" #: src/gtk/help-overlay.ui:78 msgctxt "shortcut window" msgid "Toggle play/pause" msgstr "ניגון/השהייה" #: src/gtk/help-overlay.ui:84 msgctxt "shortcut window" msgid "Previous song" msgstr "שיר קודם" #: src/gtk/help-overlay.ui:90 msgctxt "shortcut window" msgid "Next song" msgstr "שיר הבא" #: src/gtk/help-overlay.ui:96 msgctxt "shortcut window" msgid "Seek backwards in the current song" msgstr "דילוג לאחור בשיר הנוכחי" #: src/gtk/help-overlay.ui:102 msgctxt "shortcut window" msgid "Seek forward in the current song" msgstr "דילוג קדימה בשיר הנוכחי" #: src/gtk/playback-control.ui:21 msgid "Play the Previous Song" msgstr "ניגון השיר הקודם" #: src/gtk/playback-control.ui:26 msgctxt "a11y" msgid "Skip backwards" msgstr "דילוג לאחור" #: src/gtk/playback-control.ui:35 msgid "Toggle Play" msgstr "ניגון/השהיה" #: src/gtk/playback-control.ui:41 msgctxt "a11y" msgid "Toggle play" msgstr "ניגון/השהיה" #: src/gtk/playback-control.ui:50 msgid "Play the Next Song" msgstr "ניגון השיר הבא" #: src/gtk/playback-control.ui:55 msgctxt "a11y" msgid "Skip forward" msgstr "דילוג קדימה" #: src/gtk/playback-control.ui:78 msgid "Toggle Playlist" msgstr "הצגה/הסתרת רשימת ההשמעה" #: src/gtk/playback-control.ui:83 msgctxt "a11y" msgid "Toggle playlist" msgstr "הצגה/הסתרת רשימת ההשמעה" #: src/gtk/playback-control.ui:92 msgid "Shuffle the Playlist" msgstr "ערבוב רשימת ההשמעה" #: src/gtk/playback-control.ui:94 msgctxt "a11y" msgid "Shuffle" msgstr "ערבוב" #: src/gtk/playback-control.ui:113 src/playback_control.rs:114 msgid "Enable Repeat" msgstr "לאפשר חזרה" #: src/gtk/playback-control.ui:118 msgctxt "a11y" msgid "Repeat" msgstr "חזרה" #: src/gtk/playback-control.ui:129 msgid "Main Menu" msgstr "תפריט ראשי" #: src/gtk/playback-control.ui:135 msgctxt "a11y" msgid "Primary menu" msgstr "תפריט עיקרי" #: src/gtk/playback-control.ui:151 msgid "Copy" msgstr "העתקה" #: src/gtk/playback-control.ui:157 msgid "Add _Song" msgstr "הוספת _שיר" #: src/gtk/playback-control.ui:161 msgid "Add _Folder" msgstr "הוספת _תיקייה" #: src/gtk/playback-control.ui:165 msgid "Clear" msgstr "ניקוי" #: src/gtk/playback-control.ui:171 msgid "_Match Cover Art" msgstr "ה_תאמת כיסוי אלבום" #: src/gtk/playback-control.ui:175 msgid "_Background Playback" msgstr "ניגון ב_רקע" #: src/gtk/playback-control.ui:181 msgid "_ReplayGain" msgstr "_ReplayGain" #: src/gtk/playback-control.ui:183 msgctxt "replaygain-menu" msgid "_Album" msgstr "_אלבום" #: src/gtk/playback-control.ui:188 msgctxt "replaygain-menu" msgid "_Song" msgstr "_שיר" #: src/gtk/playback-control.ui:193 msgctxt "replaygain-menu" msgid "_Disabled" msgstr "_מושבת" #: src/gtk/playback-control.ui:201 msgid "_Keyboard Shortcuts" msgstr "_צירופי מקשים" #: src/gtk/playback-control.ui:205 msgid "_About Amberol" msgstr "_על אמברול" #: src/gtk/playback-control.ui:209 msgid "_Quit" msgstr "_יציאה" #: src/gtk/playlist-view.ui:19 msgid "Playlist" msgstr "רשימת השמעה" #: src/gtk/playlist-view.ui:49 msgid "Search Songs in the Playlist" msgstr "חיפוש שירים ברשימת ההשמעה" #: src/gtk/playlist-view.ui:61 msgid "Select Songs in the Playlist" msgstr "בחירת שירים ברשימת ההשמעה" #: src/gtk/playlist-view.ui:74 msgid "Close the Playlist" msgstr "סגירת רשימת ההשמעה" #: src/gtk/playlist-view.ui:135 msgid "Select All Songs" msgstr "בחירת כל השירים" #: src/gtk/playlist-view.ui:148 msgid "Remove Selected Songs" msgstr "הסרת השירים הנבחרים" #: src/gtk/window.ui:12 msgid "Drop a song to add it to the playlist" msgstr "יש לגרור שיר להוספה לרשימת ההשמעה" #: src/gtk/window.ui:49 msgid "" "Select a file or a folder, or drag files from your file manager to the " "application window to add songs to the playlist" msgstr "" "להוספת שירים לרשימת ההשמעה יש לבחור קובץ או תיקייה, או לגרור קבצים ממנהל " "הקבצים שלך לחלון היישום" #: src/gtk/window.ui:58 msgid "Restore Playlist" msgstr "שחזור רשימת השמעה" #: src/gtk/window.ui:68 msgid "Add Folder" msgstr "הוספת תיקייה" #: src/gtk/window.ui:77 msgid "Add Song" msgstr "הוספת שיר" #: src/gtk/window.ui:161 msgctxt "a11y" msgid "Elapsed time" msgstr "זמן שעבר" #: src/gtk/window.ui:173 msgctxt "a11y" msgid "Remaining time" msgstr "זמן שנותר" #. Translators: Replace "translator-credits" with your names, one name per line #: src/application.rs:229 msgid "translator-credits" msgstr "" "יוסף אור בוצ׳קו \n" "מיזם תרגום GNOME לעברית https://l10n.gnome.org/teams/he/" #: src/application.rs:241 msgid "Amberol needs to run in the background to play music" msgstr "אמברול צריך לפעול ברקע על מנת לנגן מוזיקה" #: src/playback_control.rs:118 msgid "Repeat All Songs" msgstr "חזרה על כל השירים" #: src/playback_control.rs:122 msgid "Repeat the Current Song" msgstr "חזרה על השיר הנוכחי" #: src/window.rs:438 msgid "_Add Song" msgstr "_הוספת שיר" #: src/window.rs:439 src/window.rs:479 msgid "_Cancel" msgstr "_ביטול" #: src/window.rs:441 msgid "Open File" msgstr "פתיחת קבוץ" #: src/window.rs:448 msgid "Audio files" msgstr "קובצי שמע" #: src/window.rs:457 src/window.rs:1393 msgid "Unable to access files" msgstr "לא ניתן לגשת לקבצים" #: src/window.rs:478 msgid "_Add Folder" msgstr "הו_ספת תיקייה" #: src/window.rs:481 msgid "Open Folder" msgstr "פתיחת תיקיה" #: src/window.rs:492 msgid "Unable to access folders" msgstr "לא ניתן לגשת לתיקיות" #: src/window.rs:510 msgid "No available song found" msgstr "לא נמצא שיר זמין" #: src/window.rs:567 msgid "No songs found" msgstr "לא נמצאו שירים" #: src/window.rs:597 msgid "Added a new song" msgstr "נוסף שיר חדש" #: src/window.rs:598 msgid "Play" msgstr "ניגון" #. Translators: the `{}` must be left unmodified; #. it will be expanded to the number of songs added #. to the playlist #: src/window.rs:607 msgid "Added one song" msgid_plural "Added {} songs" msgstr[0] "נוסף שיר אחד" msgstr[1] "נוספו {} שירים" msgstr[2] "נוספו שני שירים" msgstr[3] "נוספו {} שירים" #: src/window.rs:1157 msgid "Unable to access dropped files" msgstr "לא ניתן לגשת לקבצים שנזרקו" #: src/window.rs:1251 msgid "{} minute" msgid_plural "{} minutes" msgstr[0] "דקה" msgstr[1] "{} דקות" msgstr[2] "שתי דקות" msgstr[3] "{} דקות" #: src/window.rs:1262 msgid "{hours} hour {minutes} remaining" msgid_plural "{hours} hours {minutes} remaining" msgstr[0] "נותרה שעת אחת ו־{minutes} דקות" msgstr[1] "נותרו {hours} שעות ו־{minutes} דקות" msgstr[2] "נותרו שעתיים ו־{minutes} דקות" msgstr[3] "נותרו {hours} שעות ו־{minutes} דקות" #. Translators: the '{}' must be left unmodified, and #. it will be replaced by the number of minutes remaining #. in the playlist #: src/window.rs:1272 msgid "{} minute remaining" msgid_plural "{} minutes remaining" msgstr[0] "נותרה דקה אחת" msgstr[1] "נותרו {} דקות" msgstr[2] "נותרו {} דקות" msgstr[3] "נותרו {} דקות" #: src/window.rs:1372 msgid "No song selected" msgstr "לא נבחרו שירים" #. Translators: The '{}' must be left unmodified, and #. it is expanded to the number of songs selected #: src/window.rs:1377 msgid "{} song selected" msgid_plural "{} songs selected" msgstr[0] "נבחר שיר אחד" msgstr[1] "נבחרו {} שירים" msgstr[2] "נבחרו שני שירים" msgstr[3] "נבחרו {} שירים" #. Translators: `{title}` and `{artist}` must be left #. untranslated; they will expand to the title and #. artist of the currently playing song, respectively #: src/window.rs:1431 msgid "Currently playing “{title}” by “{artist}”" msgstr "מתנגן כעת „{title}” בביצוע „{artist}”" #~ msgid "_Track" #~ msgstr "_רצועה" #~ msgid "_Off" #~ msgstr "_כיבוי" #~ msgid "Repeat All Tracks" #~ msgstr "חזרה על כל הרצועות" #~ msgid "Add File" #~ msgstr "הוספת קובץ" #~ msgid "Amberol cannot run in the background" #~ msgstr "אמברול לא יכול לפעול ברקע" #~ msgid "Plays music and nothing else" #~ msgstr "ניגון מוזיקה ושום דבר מעבר לכך" #~ msgid "{} hour" #~ msgid_plural "{} hours" #~ msgstr[0] "שעה" #~ msgstr[1] "{} שעות" #~ msgstr[2] "שעתיים" #~ msgstr[3] "{} שעות" #~ msgid "“{}” is not a supported audio file" #~ msgstr "‏„{}” אינו קובץ שמע נתמך" #~ msgid "Unrecognized file type for “{}”" #~ msgstr "סוג קובץ לא מזוהה עבור „{}”" #~ msgid "Amberol is running in the background" #~ msgstr "אמברול פועל ברקע" #~ msgid "Playing next" #~ msgstr "ניגון הבא" #~ msgctxt "shortcut window" #~ msgid "Songs Queue" #~ msgstr "תור שירים" #~ msgctxt "shortcut window" #~ msgid "Queue a Song" #~ msgstr "הכנסת שיר לתור" #~ msgctxt "shortcut window" #~ msgid "Queue a Folder" #~ msgstr "הכנסת תיקייה לתור" #~ msgctxt "shortcut window" #~ msgid "Clear" #~ msgstr "ניקוי" #~ msgctxt "shortcut window" #~ msgid "Previous Track" #~ msgstr "רצועה קודמת" #~ msgctxt "shortcut window" #~ msgid "Seek Backwards" #~ msgstr "קפיצה לאחור" #~ msgctxt "shortcut window" #~ msgid "Seek Forward" #~ msgstr "קפיצה קדימה" #~ msgid "Show the playlist" #~ msgstr "הצגת רשימת ההשמעה" #~ msgid "Choose a folder" #~ msgstr "בחירת תיקייה" amberol-0.10.3/po/hr.po000066400000000000000000000300321443320625200146020ustar00rootroot00000000000000# Croatian translation for amberol. # Copyright (C) 2022 amberol's COPYRIGHT HOLDER # This file is distributed under the same license as the amberol package. # FIRST AUTHOR , YEAR. # msgid "" msgstr "" "Project-Id-Version: amberol main\n" "Report-Msgid-Bugs-To: https://gitlab.gnome.org/World/amberol/issues\n" "POT-Creation-Date: 2023-01-05 10:55+0000\n" "PO-Revision-Date: 2023-01-13 11:36+0100\n" "Last-Translator: gogo \n" "Language-Team: Croatian \n" "Language: hr\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && " "n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" "X-Generator: Poedit 3.2.2\n" #: data/io.bassi.Amberol.desktop.in.in:3 #: data/io.bassi.Amberol.appdata.xml.in.in:6 msgid "Amberol" msgstr "Amberol" #: data/io.bassi.Amberol.desktop.in.in:4 msgid "Music Player" msgstr "Glazbeni reproduktor" #. Translators: Search terms to find this application. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! #: data/io.bassi.Amberol.desktop.in.in:12 msgid "music;player;media;audio;playlist;" msgstr "glazba;reproduktor;medij;zvuk;popis izvođenja;" #: data/io.bassi.Amberol.appdata.xml.in.in:7 msgid "Plays music, and nothing else" msgstr "Slušajte glazbu i ništa više od toga" #: data/io.bassi.Amberol.appdata.xml.in.in:9 msgid "" "Amberol is a music player with no delusions of grandeur. If you just want to " "play music available on your local system then Amberol is the music player " "you are looking for." msgstr "" "Amberol je glazbeni reproduktor bez obzira na njegovu jednostavnost. Ako " "samo želite slušati glazbu dostupnu na vašem lokalnom sustavu, tada je " "Amberol glazbeni reproduktro koji tražite." #: data/io.bassi.Amberol.appdata.xml.in.in:14 msgid "Current features:" msgstr "Trenutne značajke:" #: data/io.bassi.Amberol.appdata.xml.in.in:16 msgid "adaptive UI" msgstr "prilagodljivo grafičko sučelje" #: data/io.bassi.Amberol.appdata.xml.in.in:17 msgid "UI recoloring using the album art" msgstr "grafičko sučelje mijenja boju prema omotu albuma" #: data/io.bassi.Amberol.appdata.xml.in.in:18 msgid "drag and drop support to queue songs" msgstr "podrška za povlačenje i ispuštanje pjesme u red reprodukcije" #: data/io.bassi.Amberol.appdata.xml.in.in:19 msgid "shuffle and repeat" msgstr "ponavljanje i naizmjenična repodukcija" #: data/io.bassi.Amberol.appdata.xml.in.in:20 msgid "MPRIS integration" msgstr "MPRIS integracija" #: data/io.bassi.Amberol.appdata.xml.in.in:41 msgid "Emmanuele Bassi" msgstr "Emmanuele Bassi" #: src/audio/inhibit_controller.rs:40 msgid "Playback in progress" msgstr "Reprodukcija u tijeku" #: src/audio/song.rs:328 msgid "Unknown artist" msgstr "Nepoznat izvođač" #: src/audio/song.rs:335 msgid "Unknown title" msgstr "Nepoznat naslov" #: src/audio/song.rs:342 msgid "Unknown album" msgstr "Nepoznat album" #: src/gtk/help-overlay.ui:11 msgctxt "shortcut window" msgid "General" msgstr "Općenito" #: src/gtk/help-overlay.ui:14 msgctxt "shortcut window" msgid "Toggle primary menu" msgstr "Uklj/Isklj glavni izbornik" #: src/gtk/help-overlay.ui:20 msgctxt "shortcut window" msgid "Copy song details to the clipboard" msgstr "Kopiraj pojedinosti pjesme u međuspremnik" #: src/gtk/help-overlay.ui:26 msgctxt "shortcut window" msgid "Show Shortcuts" msgstr "Prikaži prečace tipkovnice" #: src/gtk/help-overlay.ui:32 msgctxt "shortcut window" msgid "Quit" msgstr "Zatvori" #: src/gtk/help-overlay.ui:40 msgctxt "shortcut window" msgid "Playlist" msgstr "Popis izvođenja" #: src/gtk/help-overlay.ui:43 msgctxt "shortcut window" msgid "Add a song to the playlist" msgstr "Dodaj pjesmu u popis izvođenja" #: src/gtk/help-overlay.ui:49 msgctxt "shortcut window" msgid "Add a folder to the playlist" msgstr "Dodaj mapu u popis izvođenja" #: src/gtk/help-overlay.ui:55 msgctxt "shortcut window" msgid "Clear the playlist" msgstr "Obriši popis izvođenja" #: src/gtk/help-overlay.ui:61 msgctxt "shortcut window" msgid "Toggle the playlist pane" msgstr "Uklj/Isklj panel popisa izvođenja" #: src/gtk/help-overlay.ui:67 msgctxt "shortcut window" msgid "Toggle shuffling songs" msgstr "Uklj/Isklj naizmjeničnu reprodukciju" #: src/gtk/help-overlay.ui:75 msgctxt "shortcut window" msgid "Playback" msgstr "Reprodukcija" #: src/gtk/help-overlay.ui:78 msgctxt "shortcut window" msgid "Toggle Play/Pause" msgstr "Uklj/Isklj pauzu/reprodukciju" #: src/gtk/help-overlay.ui:84 msgctxt "shortcut window" msgid "Previous song" msgstr "Prijašnja pjesma" #: src/gtk/help-overlay.ui:90 msgctxt "shortcut window" msgid "Next song" msgstr "Sljedeća pjesma" #: src/gtk/help-overlay.ui:96 msgctxt "shortcut window" msgid "Seek backwards in the current song" msgstr "Premotaj unatrag u trenutnoj pjesmi" #: src/gtk/help-overlay.ui:102 msgctxt "shortcut window" msgid "Seek forward in the current song" msgstr "Premotaj unaprijed u trenutnoj pjesmi" #: src/gtk/playback-control.ui:30 msgctxt "a11y" msgid "Elapsed time" msgstr "Proteklo vrijeme" #: src/gtk/playback-control.ui:42 msgctxt "a11y" msgid "Remaining time" msgstr "Preostalo vrijeme" #: src/gtk/playback-control.ui:64 msgid "Play the Previous Song" msgstr "Reproduciraj prijašnju pjesmu" #: src/gtk/playback-control.ui:69 msgctxt "a11y" msgid "Skip backwards" msgstr "Prebaci unatrag" #: src/gtk/playback-control.ui:78 msgid "Toggle Play" msgstr "Uklj/Isklj reprodukciju" #: src/gtk/playback-control.ui:84 msgctxt "a11y" msgid "Toggle play" msgstr "Uklj/Isklj reprodukciju" #: src/gtk/playback-control.ui:93 msgid "Play the Next Song" msgstr "Reproduciraj sljedeću pjesmu" #: src/gtk/playback-control.ui:98 msgctxt "a11y" msgid "Skip forward" msgstr "Prebaci naprijed" #: src/gtk/playback-control.ui:121 msgid "Toggle Playlist" msgstr "Uklj/Isklj popis izvođenja" #: src/gtk/playback-control.ui:126 msgctxt "a11y" msgid "Toggle playlist" msgstr "Uklj/Isklj popis izvođenja" #: src/gtk/playback-control.ui:135 msgid "Shuffle the Playlist" msgstr "Naizmjenični popis izvođenja" #: src/gtk/playback-control.ui:137 msgctxt "a11y" msgid "Shuffle" msgstr "Naizmjenično" #: src/gtk/playback-control.ui:156 src/playback_control.rs:153 msgid "Enable Repeat" msgstr "Omogući ponavljanje" #: src/gtk/playback-control.ui:161 msgctxt "a11y" msgid "Repeat" msgstr "Ponovi" #: src/gtk/playback-control.ui:172 msgid "Main Menu" msgstr "Glavni izbornik" #: src/gtk/playback-control.ui:178 msgctxt "a11y" msgid "Primary menu" msgstr "Glavni izbornik" #: src/gtk/playback-control.ui:194 msgid "Copy" msgstr "Kopiraj" #: src/gtk/playback-control.ui:200 msgid "Add _Song" msgstr "Dodaj _pjesmu" #: src/gtk/playback-control.ui:204 msgid "Add _Folder" msgstr "Dodaj _mapu" #: src/gtk/playback-control.ui:208 msgid "Clear" msgstr "Obriši" #: src/gtk/playback-control.ui:214 msgid "_Match Cover Art" msgstr "_Uskladi omot albuma" #: src/gtk/playback-control.ui:220 msgid "_ReplayGain" msgstr "_Normalizacija zvuka" #: src/gtk/playback-control.ui:222 msgid "_Album" msgstr "_Album" #: src/gtk/playback-control.ui:227 msgid "_Track" msgstr "_Pjesma" #: src/gtk/playback-control.ui:232 msgid "_Off" msgstr "_Isključi" #: src/gtk/playback-control.ui:240 msgid "_Keyboard Shortcuts" msgstr "_Prečaci tipkovnice" #: src/gtk/playback-control.ui:244 msgid "_About Amberol" msgstr "_O Amberolu" #: src/gtk/playback-control.ui:248 msgid "_Quit" msgstr "_Zatvori" #: src/gtk/playlist-view.ui:19 msgid "Playlist" msgstr "Popis izvođenja" #: src/gtk/playlist-view.ui:49 msgid "Search Songs in the Playlist" msgstr "Pretraži pjesme u popisu izvođenja" #: src/gtk/playlist-view.ui:61 msgid "Select Songs in the Playlist" msgstr "Odaberi pjesme u popisu izvođenja" #: src/gtk/playlist-view.ui:74 msgid "Close the Playlist" msgstr "Zatvori popis izvođenja" #: src/gtk/playlist-view.ui:135 msgid "Select All Songs" msgstr "Odaberi sve pjesme" #: src/gtk/playlist-view.ui:148 msgid "Remove Selected Songs" msgstr "Ukloni odabrane pjesme" #: src/gtk/window.ui:12 msgid "Drop a song to add it to the queue" msgstr "Ispustite pjesmu za dodavanje u popis izvođenja" #: src/gtk/window.ui:49 msgid "" "Select a file or a folder, or drag files from your file manager to the " "application window to add songs to the playlist" msgstr "" "Odaberite datoteku ili mapu, ili ispustite datoteku iz svojeg upravitelja " "datoteka u prozor aplikacije za dodavanje pjesme u popis izvođenja" #: src/gtk/window.ui:58 msgid "Add Folder" msgstr "Dodaj mapu" #: src/gtk/window.ui:68 msgid "Add Song" msgstr "Dodaj pjesmu" #. Translators: Replace "translator-credits" with your names, one name per line #: src/application.rs:188 msgid "translator-credits" msgstr "" "Launchpad Contributions:\n" " gogo https://launchpad.net/~trebelnik-stefina\n" "\n" "Milo Ivir " #: src/playback_control.rs:157 msgid "Repeat All Tracks" msgstr "Ponovni sve pjesme" #: src/playback_control.rs:161 msgid "Repeat the Current Track" msgstr "Ponovi trenutnu pjesmu" #: src/window.rs:409 msgid "_Add Song" msgstr "_Dodaj pjesmu" #: src/window.rs:410 src/window.rs:450 msgid "_Cancel" msgstr "_Odustani" #: src/window.rs:412 msgid "Open File" msgstr "Otvori datoteku" #: src/window.rs:419 msgid "Audio files" msgstr "Glazbene datoteke" #: src/window.rs:428 src/window.rs:1293 msgid "Unable to access files" msgstr "Nemoguć pristup datotekama" #: src/window.rs:449 msgid "_Add Folder" msgstr "_Dodaj mapu" #: src/window.rs:452 msgid "Open Folder" msgstr "Otvori mapu" #: src/window.rs:463 msgid "Unable to access folders" msgstr "Nemoguć pristup mapama" #: src/window.rs:475 msgid "No available song found" msgstr "Nema pronađenih dostupnih pjesama" #: src/window.rs:532 msgid "No songs found" msgstr "Nema pronađenih pjesama" #: src/window.rs:559 msgid "Added a new song" msgstr "Dodana je nova pjesma" #: src/window.rs:560 msgid "Play" msgstr "Reproduciraj" #. Translators: the `{}` must be left unmodified; #. it will be expanded to the number of songs added #. to the playlist #: src/window.rs:569 msgid "Added one song" msgid_plural "Added {} songs" msgstr[0] "Dodana je {} pjesma" msgstr[1] "Dodane su {} pjesme" msgstr[2] "Dodano je {} pjesama" #: src/window.rs:1029 msgid "Unable to access dropped files" msgstr "Nemoguć pristup ispuštenim datotekama" #: src/window.rs:1123 msgid "{} minute" msgid_plural "{} minutes" msgstr[0] "{} minuta" msgstr[1] "{} minute" msgstr[2] "{} minuta" #: src/window.rs:1134 msgid "{hours} hour {minutes} remaining" msgid_plural "{hours} hours {minutes} remaining" msgstr[0] "{hours} sat {minutes} preostalo" msgstr[1] "{hours} sata {minutes} preostalo" msgstr[2] "{hours} sati {minutes} preostalo" #. Translators: the '{}' must be left unmodified, and #. it will be replaced by the number of minutes remaining #. in the playlist #: src/window.rs:1144 msgid "{} minute remaining" msgid_plural "{} minutes remaining" msgstr[0] "{} minuta preostala" msgstr[1] "{} minute preostale" msgstr[2] "{} minuta preostalo" #: src/window.rs:1273 msgid "No song selected" msgstr "Nema odabranih pjesama" #. Translators: The '{}' must be left unmodified, and #. it is expanded to the number of songs selected #: src/window.rs:1278 msgid "{} song selected" msgid_plural "{} songs selected" msgstr[0] "{} pjesma odabrana" msgstr[1] "{} pjesme odabrane" msgstr[2] "{} pjesama odabrano" #. Translators: `{title}` and `{artist}` must be left #. untranslated; they will expand to the title and #. artist of the currently playing song, respectively #: src/window.rs:1331 msgid "Currently playing “{title}” by “{artist}”" msgstr "Trenutno slušate “{title}” od “{artist}”" #: src/window.rs:1377 msgid "Amberol needs to run in the background to play music" msgstr "" "Amberol treba biti pokrenut u pozadini kako bi mogao reproducirati glazbu" #~ msgid "Add File" #~ msgstr "Dodaj datoteku" #~ msgid "Plays music and nothing else" #~ msgstr "Slušajte glazbu i ništa više od toga" #~ msgid "Amberol cannot run in the background" #~ msgstr "Amberol se nemože pokrenuti u pozadini" #~ msgid "{} hour" #~ msgid_plural "{} hours" #~ msgstr[0] "{} sat" #~ msgstr[1] "{} sata" #~ msgstr[2] "{} sata" amberol-0.10.3/po/hu.po000066400000000000000000000300551443320625200146120ustar00rootroot00000000000000# Hungarian translation for amberol. # Copyright (C) 2022, 2023 Free Software Foundation, Inc. # This file is distributed under the same license as the amberol package. # # Balázs Úr , 2022, 2023. msgid "" msgstr "" "Project-Id-Version: amberol main\n" "Report-Msgid-Bugs-To: https://gitlab.gnome.org/World/amberol/issues\n" "POT-Creation-Date: 2023-04-24 22:31+0000\n" "PO-Revision-Date: 2023-04-26 23:35+0200\n" "Last-Translator: Balázs Úr \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: Lokalize 22.08.2\n" #: data/io.bassi.Amberol.desktop.in.in:3 #: data/io.bassi.Amberol.appdata.xml.in.in:6 msgid "Amberol" msgstr "Amberol" #: data/io.bassi.Amberol.desktop.in.in:4 msgid "Music Player" msgstr "Zenelejátszó" #. Translators: Search terms to find this application. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! #: data/io.bassi.Amberol.desktop.in.in:12 msgid "music;player;media;audio;playlist;" msgstr "zene;lejátszó;média;hang;lejátszási lista;" #: data/io.bassi.Amberol.appdata.xml.in.in:7 msgid "Plays music, and nothing else" msgstr "Zenét játszik, és semmi több" #: data/io.bassi.Amberol.appdata.xml.in.in:9 msgid "" "Amberol is a music player with no delusions of grandeur. If you just want to " "play music available on your local system then Amberol is the music player " "you are looking for." msgstr "" "Az Amberol egy nagyzási képzelgések nélküli zenelejátszó. Ha csak a helyi " "rendszerén elérhető zenéket szeretné lejátszani, akkor az Amberol lesz az a " "zenelejátszó, amelyet keres." #: data/io.bassi.Amberol.appdata.xml.in.in:14 msgid "Current features:" msgstr "Jelenlegi funkciók:" #: data/io.bassi.Amberol.appdata.xml.in.in:16 msgid "adaptive UI" msgstr "alkalmazkodó felhasználói felület" #: data/io.bassi.Amberol.appdata.xml.in.in:17 msgid "UI recoloring using the album art" msgstr "felhasználói felület átszínezése az album borítójának használatával" #: data/io.bassi.Amberol.appdata.xml.in.in:18 msgid "drag and drop support to queue songs" msgstr "fogd és vidd támogatás a dalok sorba állításához" #: data/io.bassi.Amberol.appdata.xml.in.in:19 msgid "shuffle and repeat" msgstr "megkeverés és ismétlés" #: data/io.bassi.Amberol.appdata.xml.in.in:20 msgid "MPRIS integration" msgstr "MPRIS integráció" #: data/io.bassi.Amberol.appdata.xml.in.in:42 msgid "Emmanuele Bassi" msgstr "Emmanuele Bassi" #: src/audio/inhibit_controller.rs:40 msgid "Playback in progress" msgstr "Lejátszás folyamatban" #: src/audio/song.rs:325 msgid "Unknown artist" msgstr "Ismeretlen előadó" #: src/audio/song.rs:332 msgid "Unknown title" msgstr "Ismeretlen cím" #: src/audio/song.rs:339 msgid "Unknown album" msgstr "Ismeretlen album" #: src/gtk/help-overlay.ui:11 msgctxt "shortcut window" msgid "General" msgstr "Általános" #: src/gtk/help-overlay.ui:14 msgctxt "shortcut window" msgid "Toggle primary menu" msgstr "Elsődleges menü be- és kikapcsolása" #: src/gtk/help-overlay.ui:20 msgctxt "shortcut window" msgid "Copy song details to the clipboard" msgstr "Dal részleteinek másolása a vágólapra" #: src/gtk/help-overlay.ui:26 msgctxt "shortcut window" msgid "Show shortcuts" msgstr "Gyorsbillentyűk megjelenítése" #: src/gtk/help-overlay.ui:32 msgctxt "shortcut window" msgid "Quit" msgstr "Kilépés" #: src/gtk/help-overlay.ui:40 msgctxt "shortcut window" msgid "Playlist" msgstr "Lejátszási lista" #: src/gtk/help-overlay.ui:43 msgctxt "shortcut window" msgid "Add a song to the playlist" msgstr "Dal hozzáadása a lejátszási listához" #: src/gtk/help-overlay.ui:49 msgctxt "shortcut window" msgid "Add a folder to the playlist" msgstr "Mappa hozzáadása a lejátszási listához" #: src/gtk/help-overlay.ui:55 msgctxt "shortcut window" msgid "Clear the playlist" msgstr "A lejátszási lista törlése" #: src/gtk/help-overlay.ui:61 msgctxt "shortcut window" msgid "Toggle the playlist pane" msgstr "A lejátszási lista panel be- és kikapcsolása" #: src/gtk/help-overlay.ui:67 msgctxt "shortcut window" msgid "Toggle shuffling songs" msgstr "Dalok megkeverésének be- és kikapcsolása" #: src/gtk/help-overlay.ui:75 msgctxt "shortcut window" msgid "Playback" msgstr "Lejátszás" #: src/gtk/help-overlay.ui:78 msgctxt "shortcut window" msgid "Toggle play/pause" msgstr "Lejátszás vagy szüneteltetés" #: src/gtk/help-overlay.ui:84 msgctxt "shortcut window" msgid "Previous song" msgstr "Előző dal" #: src/gtk/help-overlay.ui:90 msgctxt "shortcut window" msgid "Next song" msgstr "Következő dal" #: src/gtk/help-overlay.ui:96 msgctxt "shortcut window" msgid "Seek backwards in the current song" msgstr "Tekerés hátra a jelenlegi dalban" #: src/gtk/help-overlay.ui:102 msgctxt "shortcut window" msgid "Seek forward in the current song" msgstr "Tekerés előre a jelenlegi dalban" #: src/gtk/playback-control.ui:21 msgid "Play the Previous Song" msgstr "Az előző dal lejátszása" #: src/gtk/playback-control.ui:26 msgctxt "a11y" msgid "Skip backwards" msgstr "Kihagyás vissza" #: src/gtk/playback-control.ui:35 msgid "Toggle Play" msgstr "Lejátszás be/ki" #: src/gtk/playback-control.ui:41 msgctxt "a11y" msgid "Toggle play" msgstr "Lejátszás be/ki" #: src/gtk/playback-control.ui:50 msgid "Play the Next Song" msgstr "A következő dal lejátszása" #: src/gtk/playback-control.ui:55 msgctxt "a11y" msgid "Skip forward" msgstr "Kihagyás előre" #: src/gtk/playback-control.ui:78 msgid "Toggle Playlist" msgstr "Lejátszási lista be- és kikapcsolása" #: src/gtk/playback-control.ui:83 msgctxt "a11y" msgid "Toggle playlist" msgstr "Lejátszási lista be- és kikapcsolása" #: src/gtk/playback-control.ui:92 msgid "Shuffle the Playlist" msgstr "A lejátszási lista megkeverése" #: src/gtk/playback-control.ui:94 msgctxt "a11y" msgid "Shuffle" msgstr "Megkeverés" #: src/gtk/playback-control.ui:113 src/playback_control.rs:114 msgid "Enable Repeat" msgstr "Ismétlés engedélyezése" #: src/gtk/playback-control.ui:118 msgctxt "a11y" msgid "Repeat" msgstr "Ismétlés" #: src/gtk/playback-control.ui:129 msgid "Main Menu" msgstr "Főmenü" #: src/gtk/playback-control.ui:135 msgctxt "a11y" msgid "Primary menu" msgstr "Elsődleges menü" #: src/gtk/playback-control.ui:151 msgid "Copy" msgstr "Másolás" #: src/gtk/playback-control.ui:157 msgid "Add _Song" msgstr "_Dal hozzáadása" #: src/gtk/playback-control.ui:161 msgid "Add _Folder" msgstr "_Mappa hozzáadása" #: src/gtk/playback-control.ui:165 msgid "Clear" msgstr "Törlés" #: src/gtk/playback-control.ui:171 msgid "_Match Cover Art" msgstr "_Borító színeinek használata" #: src/gtk/playback-control.ui:175 msgid "_Background Playback" msgstr "_Lejátszás a háttérben" #: src/gtk/playback-control.ui:181 msgid "_ReplayGain" msgstr "Ha_ngerő-korrekció" #: src/gtk/playback-control.ui:183 #| msgid "_Album" msgctxt "replaygain-menu" msgid "_Album" msgstr "_Album" #: src/gtk/playback-control.ui:188 #| msgid "Add _Song" msgctxt "replaygain-menu" msgid "_Song" msgstr "_Dal" #: src/gtk/playback-control.ui:193 msgctxt "replaygain-menu" msgid "_Disabled" msgstr "_Letiltva" #: src/gtk/playback-control.ui:201 msgid "_Keyboard Shortcuts" msgstr "_Gyorsbillentyűk" #: src/gtk/playback-control.ui:205 msgid "_About Amberol" msgstr "Az Amberol _névjegye" #: src/gtk/playback-control.ui:209 msgid "_Quit" msgstr "_Kilépés" #: src/gtk/playlist-view.ui:19 msgid "Playlist" msgstr "Lejátszási lista" #: src/gtk/playlist-view.ui:49 msgid "Search Songs in the Playlist" msgstr "Dalok keresése a lejátszási listában" #: src/gtk/playlist-view.ui:61 msgid "Select Songs in the Playlist" msgstr "Dalok kijelölése a lejátszási listában" #: src/gtk/playlist-view.ui:74 msgid "Close the Playlist" msgstr "A lejátszási lista bezárása" #: src/gtk/playlist-view.ui:135 msgid "Select All Songs" msgstr "Összes dal kijelölése" #: src/gtk/playlist-view.ui:148 msgid "Remove Selected Songs" msgstr "Kijelölt dalok eltávolítása" #: src/gtk/window.ui:12 #| msgid "Drop a song to add it to the queue" msgid "Drop a song to add it to the playlist" msgstr "Húzzon ide egy dalt a lejátszási listához való hozzáadáshoz" #: src/gtk/window.ui:49 msgid "" "Select a file or a folder, or drag files from your file manager to the " "application window to add songs to the playlist" msgstr "" "Válasszon egy fájlt vagy mappát, vagy húzza a fájlokat a fájlkezelőből az " "alkalmazás ablakába, hogy dalokat adjon hozzá a lejátszási listához." #: src/gtk/window.ui:58 msgid "Restore Playlist" msgstr "Lejátszási lista visszaállítása" #: src/gtk/window.ui:68 msgid "Add Folder" msgstr "Mappa hozzáadása" #: src/gtk/window.ui:77 msgid "Add Song" msgstr "Dal hozzáadása" #: src/gtk/window.ui:161 msgctxt "a11y" msgid "Elapsed time" msgstr "Eltelt idő" #: src/gtk/window.ui:173 msgctxt "a11y" msgid "Remaining time" msgstr "Hátralévő idő" #. Translators: Replace "translator-credits" with your names, one name per line #: src/application.rs:227 msgid "translator-credits" msgstr "Úr Balázs , 2022." #: src/application.rs:239 msgid "Amberol needs to run in the background to play music" msgstr "Az Amberolnak a háttérben kell futnia a zene lejátszásához" #: src/playback_control.rs:118 #| msgid "Select All Songs" msgid "Repeat All Songs" msgstr "Összes dal ismétlése" #: src/playback_control.rs:122 #| msgid "Repeat the Current Track" msgid "Repeat the Current Song" msgstr "A jelenlegi dal ismétlése" #: src/window.rs:403 msgid "_Add Song" msgstr "Dal _hozzáadása" #: src/window.rs:404 src/window.rs:444 msgid "_Cancel" msgstr "_Mégse" #: src/window.rs:406 msgid "Open File" msgstr "Fájl megnyitása" #: src/window.rs:413 msgid "Audio files" msgstr "Hangfájlok" #: src/window.rs:422 src/window.rs:1315 msgid "Unable to access files" msgstr "Nem lehet hozzáférni a fájlokhoz" #: src/window.rs:443 msgid "_Add Folder" msgstr "Mappa _hozzáadása" #: src/window.rs:446 msgid "Open Folder" msgstr "Mappa megnyitása" #: src/window.rs:457 msgid "Unable to access folders" msgstr "Nem lehet hozzáférni a mappákhoz" #: src/window.rs:475 msgid "No available song found" msgstr "Nem található elérhető dal" #: src/window.rs:532 msgid "No songs found" msgstr "Nem találhatók dalok" #: src/window.rs:562 msgid "Added a new song" msgstr "Új dal hozzáadva" #: src/window.rs:563 msgid "Play" msgstr "Lejátszás" #. Translators: the `{}` must be left unmodified; #. it will be expanded to the number of songs added #. to the playlist #: src/window.rs:572 msgid "Added one song" msgid_plural "Added {} songs" msgstr[0] "Egy dal hozzáadva" msgstr[1] "{} dal hozzáadva" #: src/window.rs:1062 msgid "Unable to access dropped files" msgstr "Nem lehet hozzáférni a behúzott fájlokhoz" #: src/window.rs:1152 msgid "{} minute" msgid_plural "{} minutes" msgstr[0] "{} perc" msgstr[1] "{} perc" #: src/window.rs:1163 msgid "{hours} hour {minutes} remaining" msgid_plural "{hours} hours {minutes} remaining" msgstr[0] "{hours} óra {minutes} van hátra" msgstr[1] "{hours} óra {minutes} van hátra" #. Translators: the '{}' must be left unmodified, and #. it will be replaced by the number of minutes remaining #. in the playlist #: src/window.rs:1173 msgid "{} minute remaining" msgid_plural "{} minutes remaining" msgstr[0] "{} perc van hátra" msgstr[1] "{} perc van hátra" #: src/window.rs:1295 msgid "No song selected" msgstr "Nincs dal kijelölve" #. Translators: The '{}' must be left unmodified, and #. it is expanded to the number of songs selected #: src/window.rs:1300 msgid "{} song selected" msgid_plural "{} songs selected" msgstr[0] "{} dal kijelölve" msgstr[1] "{} dal kijelölve" #. Translators: `{title}` and `{artist}` must be left #. untranslated; they will expand to the title and #. artist of the currently playing song, respectively #: src/window.rs:1353 msgid "Currently playing “{title}” by “{artist}”" msgstr "Jelenleg játszott: „{artist}” – „{title}”" amberol-0.10.3/po/id.po000066400000000000000000000307411443320625200145740ustar00rootroot00000000000000# Indonesian translation for amberol. # Copyright (C) 2022 amberol's COPYRIGHT HOLDER # This file is distributed under the same license as the amberol package. # Kukuh Syafaat , 2022-2023. # Andika Triwidada , 2022 # msgid "" msgstr "" "Project-Id-Version: amberol main\n" "Report-Msgid-Bugs-To: https://gitlab.gnome.org/World/amberol/issues\n" "POT-Creation-Date: 2023-04-24 22:31+0000\n" "PO-Revision-Date: 2023-04-28 12:46+0700\n" "Last-Translator: Kukuh Syafaat \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: Poedit 3.2.2\n" #: data/io.bassi.Amberol.desktop.in.in:3 #: data/io.bassi.Amberol.appdata.xml.in.in:6 msgid "Amberol" msgstr "Amberol" #: data/io.bassi.Amberol.desktop.in.in:4 msgid "Music Player" msgstr "Pemutar Musik" #. Translators: Search terms to find this application. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! #: data/io.bassi.Amberol.desktop.in.in:12 msgid "music;player;media;audio;playlist;" msgstr "musik;pemutar;media;audio;daftar putar;" #: data/io.bassi.Amberol.appdata.xml.in.in:7 msgid "Plays music, and nothing else" msgstr "Putar musik, dan tidak ada yang lain" #: data/io.bassi.Amberol.appdata.xml.in.in:9 msgid "" "Amberol is a music player with no delusions of grandeur. If you just want to " "play music available on your local system then Amberol is the music player " "you are looking for." msgstr "" "Amberol adalah pemutar musik tanpa delusi keagungan. Jika Anda hanya ingin " "memutar musik yang tersedia di sistem lokal Anda maka Amberol adalah pemutar " "musik yang Anda cari." #: data/io.bassi.Amberol.appdata.xml.in.in:14 msgid "Current features:" msgstr "Fitur saat ini:" #: data/io.bassi.Amberol.appdata.xml.in.in:16 msgid "adaptive UI" msgstr "antarmuka adaptif" #: data/io.bassi.Amberol.appdata.xml.in.in:17 msgid "UI recoloring using the album art" msgstr "Pewarnaan ulang antar muka menggunakan sampul album" #: data/io.bassi.Amberol.appdata.xml.in.in:18 msgid "drag and drop support to queue songs" msgstr "seret dan lepas dukungan untuk mengantrekan lagu" #: data/io.bassi.Amberol.appdata.xml.in.in:19 msgid "shuffle and repeat" msgstr "acak dan ulangi" #: data/io.bassi.Amberol.appdata.xml.in.in:20 msgid "MPRIS integration" msgstr "Integrasi MPRIS" #: data/io.bassi.Amberol.appdata.xml.in.in:42 msgid "Emmanuele Bassi" msgstr "Emmanuele Bassi" #: src/audio/inhibit_controller.rs:40 msgid "Playback in progress" msgstr "Pemutaran sedang berlangsung" #: src/audio/song.rs:325 msgid "Unknown artist" msgstr "Artis tak dikenal" #: src/audio/song.rs:332 msgid "Unknown title" msgstr "Judul tak dikenal" #: src/audio/song.rs:339 msgid "Unknown album" msgstr "Album tak dikenal" #: src/gtk/help-overlay.ui:11 msgctxt "shortcut window" msgid "General" msgstr "Umum" #: src/gtk/help-overlay.ui:14 msgctxt "shortcut window" msgid "Toggle primary menu" msgstr "Jungkitkan menu primer" #: src/gtk/help-overlay.ui:20 msgctxt "shortcut window" msgid "Copy song details to the clipboard" msgstr "Salin detail lagu ke papan klip" #: src/gtk/help-overlay.ui:26 msgctxt "shortcut window" msgid "Show shortcuts" msgstr "Tampilkan pintasan" #: src/gtk/help-overlay.ui:32 msgctxt "shortcut window" msgid "Quit" msgstr "Keluar" #: src/gtk/help-overlay.ui:40 msgctxt "shortcut window" msgid "Playlist" msgstr "Daftar Putar" #: src/gtk/help-overlay.ui:43 msgctxt "shortcut window" msgid "Add a song to the playlist" msgstr "Tambahkan lagu ke daftar putar" #: src/gtk/help-overlay.ui:49 msgctxt "shortcut window" msgid "Add a folder to the playlist" msgstr "Tambahkan folder ke daftar putar" #: src/gtk/help-overlay.ui:55 msgctxt "shortcut window" msgid "Clear the playlist" msgstr "Bersihkan daftar putar" #: src/gtk/help-overlay.ui:61 msgctxt "shortcut window" msgid "Toggle the playlist pane" msgstr "Jungkitkan panel daftar putar" #: src/gtk/help-overlay.ui:67 msgctxt "shortcut window" msgid "Toggle shuffling songs" msgstr "Jungkitkan mengacak lagu" #: src/gtk/help-overlay.ui:75 msgctxt "shortcut window" msgid "Playback" msgstr "Putar" #: src/gtk/help-overlay.ui:78 msgctxt "shortcut window" msgid "Toggle play/pause" msgstr "Jungkitkan putar/jeda" #: src/gtk/help-overlay.ui:84 msgctxt "shortcut window" msgid "Previous song" msgstr "Lagu sebelumnya" #: src/gtk/help-overlay.ui:90 msgctxt "shortcut window" msgid "Next song" msgstr "Lagu berikutnya" #: src/gtk/help-overlay.ui:96 msgctxt "shortcut window" msgid "Seek backwards in the current song" msgstr "Lewati ke belakang di lagu saat ini" #: src/gtk/help-overlay.ui:102 msgctxt "shortcut window" msgid "Seek forward in the current song" msgstr "Lewati ke depan di lagu saat ini" #: src/gtk/playback-control.ui:21 msgid "Play the Previous Song" msgstr "Putar Lagu Sebelumnya" #: src/gtk/playback-control.ui:26 msgctxt "a11y" msgid "Skip backwards" msgstr "Lewati ke belakang" #: src/gtk/playback-control.ui:35 msgid "Toggle Play" msgstr "Jungkitkan Memutar" #: src/gtk/playback-control.ui:41 msgctxt "a11y" msgid "Toggle play" msgstr "Jungkitkan Memutar" #: src/gtk/playback-control.ui:50 msgid "Play the Next Song" msgstr "Putar Lagu Berikutnya" #: src/gtk/playback-control.ui:55 msgctxt "a11y" msgid "Skip forward" msgstr "Lewati ke depan" #: src/gtk/playback-control.ui:78 msgid "Toggle Playlist" msgstr "Jungkitkan Daftar Putar" #: src/gtk/playback-control.ui:83 msgctxt "a11y" msgid "Toggle playlist" msgstr "Jungkitkan Daftar Putar" #: src/gtk/playback-control.ui:92 msgid "Shuffle the Playlist" msgstr "Acak Daftar Putar" #: src/gtk/playback-control.ui:94 msgctxt "a11y" msgid "Shuffle" msgstr "Acak" #: src/gtk/playback-control.ui:113 src/playback_control.rs:114 msgid "Enable Repeat" msgstr "Aktifkan Pengulangan" #: src/gtk/playback-control.ui:118 msgctxt "a11y" msgid "Repeat" msgstr "Berulang" #: src/gtk/playback-control.ui:129 msgid "Main Menu" msgstr "Menu Utama" #: src/gtk/playback-control.ui:135 msgctxt "a11y" msgid "Primary menu" msgstr "Menu primer" #: src/gtk/playback-control.ui:151 msgid "Copy" msgstr "Salin" #: src/gtk/playback-control.ui:157 msgid "Add _Song" msgstr "Tambah _Lagu" #: src/gtk/playback-control.ui:161 msgid "Add _Folder" msgstr "Tambah _Folder" #: src/gtk/playback-control.ui:165 msgid "Clear" msgstr "Bersihkan" #: src/gtk/playback-control.ui:171 msgid "_Match Cover Art" msgstr "Cocokkan Sampul Albu_m" #: src/gtk/playback-control.ui:175 msgid "_Background Playback" msgstr "Pemutaran Latar _Belakang" #: src/gtk/playback-control.ui:181 msgid "_ReplayGain" msgstr "_ReplayGain" #: src/gtk/playback-control.ui:183 msgctxt "replaygain-menu" msgid "_Album" msgstr "_Album" #: src/gtk/playback-control.ui:188 msgctxt "replaygain-menu" msgid "_Song" msgstr "_Lagu" #: src/gtk/playback-control.ui:193 msgctxt "replaygain-menu" msgid "_Disabled" msgstr "_Dinonaktifkan" #: src/gtk/playback-control.ui:201 msgid "_Keyboard Shortcuts" msgstr "Pintasan Papan Ti_k" #: src/gtk/playback-control.ui:205 msgid "_About Amberol" msgstr "Tent_ang Amberol" #: src/gtk/playback-control.ui:209 msgid "_Quit" msgstr "_Keluar" #: src/gtk/playlist-view.ui:19 msgid "Playlist" msgstr "Daftar Putar" #: src/gtk/playlist-view.ui:49 msgid "Search Songs in the Playlist" msgstr "Cari Lagu di Daftar Putar" #: src/gtk/playlist-view.ui:61 msgid "Select Songs in the Playlist" msgstr "Pilih Lagu di Daftar Putar" #: src/gtk/playlist-view.ui:74 msgid "Close the Playlist" msgstr "Tutup Daftar Putar" #: src/gtk/playlist-view.ui:135 msgid "Select All Songs" msgstr "Pilih Semua Lagu" #: src/gtk/playlist-view.ui:148 msgid "Remove Selected Songs" msgstr "Hapus Lagu yang Dipilih" #: src/gtk/window.ui:12 msgid "Drop a song to add it to the playlist" msgstr "Jatuhkan lagu untuk menambahkannya ke daftar putar" #: src/gtk/window.ui:49 msgid "" "Select a file or a folder, or drag files from your file manager to the " "application window to add songs to the playlist" msgstr "" "Pilih berkas atau folder, atau seret berkas dari pengelola berkas Anda ke " "jendela aplikasi untuk menambahkan lagu ke daftar putar" #: src/gtk/window.ui:58 msgid "Restore Playlist" msgstr "Pulihkan Daftar Putar" #: src/gtk/window.ui:68 msgid "Add Folder" msgstr "Tambah Folder" #: src/gtk/window.ui:77 msgid "Add Song" msgstr "Tambah Lagu" #: src/gtk/window.ui:161 msgctxt "a11y" msgid "Elapsed time" msgstr "Waktu berlalu" #: src/gtk/window.ui:173 msgctxt "a11y" msgid "Remaining time" msgstr "Sisa waktu" #. Translators: Replace "translator-credits" with your names, one name per line #: src/application.rs:227 msgid "translator-credits" msgstr "" "Kukuh Syafaat , 2022-2023.\n" "Andika Triwidada , 2022." #: src/application.rs:239 msgid "Amberol needs to run in the background to play music" msgstr "Amberol perlu berjalan di latar belakang untuk memutar musik" #: src/playback_control.rs:118 msgid "Repeat All Songs" msgstr "Ulangi Semua Lagu" #: src/playback_control.rs:122 msgid "Repeat the Current Song" msgstr "Ulangi Lagu Saat Ini" #: src/window.rs:403 msgid "_Add Song" msgstr "T_ambah Lagu" #: src/window.rs:404 src/window.rs:444 msgid "_Cancel" msgstr "_Batal" #: src/window.rs:406 msgid "Open File" msgstr "Buka Berkas" #: src/window.rs:413 msgid "Audio files" msgstr "Berkas suara" #: src/window.rs:422 src/window.rs:1315 msgid "Unable to access files" msgstr "Tak bisa mengakses berkas" #: src/window.rs:443 msgid "_Add Folder" msgstr "T_ambah Folder" #: src/window.rs:446 msgid "Open Folder" msgstr "Buka Folder" #: src/window.rs:457 msgid "Unable to access folders" msgstr "Tak bisa mengakses folder" #: src/window.rs:475 msgid "No available song found" msgstr "Tidak ada lagu yang tersedia" #: src/window.rs:532 msgid "No songs found" msgstr "Tidak ada lagu yang ditemukan" #: src/window.rs:562 msgid "Added a new song" msgstr "Menambahkan lagu baru" #: src/window.rs:563 msgid "Play" msgstr "Putar" #. Translators: the `{}` must be left unmodified; #. it will be expanded to the number of songs added #. to the playlist #: src/window.rs:572 msgid "Added one song" msgid_plural "Added {} songs" msgstr[0] "Menambahkan satu lagu" #: src/window.rs:1062 msgid "Unable to access dropped files" msgstr "Tak bisa mengakses berkas yang dijatuhkan" #: src/window.rs:1152 msgid "{} minute" msgid_plural "{} minutes" msgstr[0] "{} menit" #: src/window.rs:1163 msgid "{hours} hour {minutes} remaining" msgid_plural "{hours} hours {minutes} remaining" msgstr[0] "{hours} jam {minutes} tersisa" #. Translators: the '{}' must be left unmodified, and #. it will be replaced by the number of minutes remaining #. in the playlist #: src/window.rs:1173 msgid "{} minute remaining" msgid_plural "{} minutes remaining" msgstr[0] "{} menit tersisa" #: src/window.rs:1295 msgid "No song selected" msgstr "Tidak ada lagu yang dipilih" #. Translators: The '{}' must be left unmodified, and #. it is expanded to the number of songs selected #: src/window.rs:1300 msgid "{} song selected" msgid_plural "{} songs selected" msgstr[0] "{} lagu dipilih" #. Translators: `{title}` and `{artist}` must be left #. untranslated; they will expand to the title and #. artist of the currently playing song, respectively #: src/window.rs:1353 msgid "Currently playing “{title}” by “{artist}”" msgstr "Sedang memutar \"{title}\" oleh \"{artist}\"" #~ msgid "_Track" #~ msgstr "_Trek" #~ msgid "_Off" #~ msgstr "_Matikan" #~ msgid "Repeat All Tracks" #~ msgstr "Ulangi Semua Trek" #~ msgid "Add File" #~ msgstr "Tambah Berkas" #~ msgid "Plays music and nothing else" #~ msgstr "Putar musik dan tak ada yang lain" #~ msgid "Amberol cannot run in the background" #~ msgstr "Amberol tidak dapat berjalan di latar belakang" #~ msgid "{} hour" #~ msgid_plural "{} hours" #~ msgstr[0] "{} jam" #~ msgctxt "shortcut window" #~ msgid "Songs Queue" #~ msgstr "Antrean Lagu" #~ msgctxt "shortcut window" #~ msgid "Queue a Song" #~ msgstr "Antrekan Lagu" #~ msgctxt "shortcut window" #~ msgid "Queue a Folder" #~ msgstr "Antrekan Folder" #~ msgctxt "shortcut window" #~ msgid "Clear" #~ msgstr "Bersihkan" #~ msgctxt "shortcut window" #~ msgid "Previous Track" #~ msgstr "Trek Sebelumnya" #~ msgid "Playing next" #~ msgstr "Memutar berikutnya" #~ msgid "“{}” is not a supported audio file" #~ msgstr "\"{}\" bukan berkas audio yang didukung" #~ msgid "Unrecognized file type for “{}”" #~ msgstr "Jenis berkas yang tidak dikenal untuk \"{}\"" #~ msgid "Choose a file" #~ msgstr "Pilih berkas" #~ msgid "Choose a folder" #~ msgstr "Pilih folder" amberol-0.10.3/po/is.po000066400000000000000000000265641443320625200146230ustar00rootroot00000000000000# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # # Sveinn í Felli , 2022. msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: https://gitlab.gnome.org/World/amberol/issues\n" "POT-Creation-Date: 2022-09-07 01:25+0000\n" "PO-Revision-Date: 2022-09-08 16:21+0000\n" "Last-Translator: Sveinn í Felli \n" "Language-Team: Icelandic\n" "Language: is\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" "X-Generator: Lokalize 21.12.3\n" #: data/io.bassi.Amberol.desktop.in.in:3 #: data/io.bassi.Amberol.appdata.xml.in.in:6 msgid "Amberol" msgstr "Amberol" #: data/io.bassi.Amberol.desktop.in.in:4 msgid "Music Player" msgstr "Tónlistarspilari" #. Translators: Search terms to find this application. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! #: data/io.bassi.Amberol.desktop.in.in:12 msgid "music;player;media;audio;playlist;" msgstr "tónlist;spilari;margmiðlun;hljóð;spilun;spilunarlisti" #: data/io.bassi.Amberol.appdata.xml.in.in:7 msgid "Plays music, and nothing else" msgstr "Spilar tónlist og ekkert annað" #: data/io.bassi.Amberol.appdata.xml.in.in:9 msgid "" "Amberol is a music player with no delusions of grandeur. If you just want to " "play music available on your local system then Amberol is the music player " "you are looking for." msgstr "" "Amberol er tónlistarspilari án alls óþarfa. Ef þú ert bara að leita að" " spilara fyrir tónlist sem þú átt þegar á tölvunni þinni, þá er Amberol" " eitthvað fyrir þig." #: data/io.bassi.Amberol.appdata.xml.in.in:14 msgid "Current features:" msgstr "Núverandi eiginleikar:" #: data/io.bassi.Amberol.appdata.xml.in.in:16 msgid "adaptive UI" msgstr "Aðlaganlegt viðmót" #: data/io.bassi.Amberol.appdata.xml.in.in:17 msgid "UI recoloring using the album art" msgstr "Endurlitun notandaviðmóts út frá umslagsmyndum" #: data/io.bassi.Amberol.appdata.xml.in.in:18 msgid "drag and drop support to queue songs" msgstr "stuðningur við draga og sleppa lögum í biðröð" #: data/io.bassi.Amberol.appdata.xml.in.in:19 msgid "shuffle and repeat" msgstr "stokka og endurtaka" #: data/io.bassi.Amberol.appdata.xml.in.in:20 msgid "MPRIS integration" msgstr "MPRIS-samþætting" #: data/io.bassi.Amberol.appdata.xml.in.in:41 msgid "Emmanuele Bassi" msgstr "Emmanuele Bassi" #: src/audio/inhibit_controller.rs:40 msgid "Playback in progress" msgstr "Afspilun í gangi" #: src/audio/song.rs:328 msgid "Unknown artist" msgstr "Óþekktur flytjandi" #: src/audio/song.rs:335 msgid "Unknown title" msgstr "Óþekktur titill" #: src/audio/song.rs:342 msgid "Unknown album" msgstr "Óþekktur diskur" #: src/gtk/help-overlay.ui:11 msgctxt "shortcut window" msgid "General" msgstr "Almennt" #: src/gtk/help-overlay.ui:14 msgctxt "shortcut window" msgid "Toggle primary menu" msgstr "Víxla aðalvalmynd af/á" #: src/gtk/help-overlay.ui:20 msgctxt "shortcut window" msgid "Copy song details to the clipboard" msgstr "Afrita valinn texta á klippispjald" #: src/gtk/help-overlay.ui:26 msgctxt "shortcut window" msgid "Show Shortcuts" msgstr "Birta flýtilykla" #: src/gtk/help-overlay.ui:32 msgctxt "shortcut window" msgid "Quit" msgstr "Loka forriti" #: src/gtk/help-overlay.ui:40 msgctxt "shortcut window" msgid "Playlist" msgstr "Spilunarlisti" #: src/gtk/help-overlay.ui:43 msgctxt "shortcut window" msgid "Add a song to the playlist" msgstr "Bæta lagi á spilunarlista" #: src/gtk/help-overlay.ui:49 msgctxt "shortcut window" msgid "Add a folder to the playlist" msgstr "Bæta möppu á spilunarlista" #: src/gtk/help-overlay.ui:55 msgctxt "shortcut window" msgid "Clear the playlist" msgstr "Hreinsa spilunarlistann" #: src/gtk/help-overlay.ui:61 msgctxt "shortcut window" msgid "Toggle the playlist pane" msgstr "Víxla spilunarlistaspjaldi af/á" #: src/gtk/help-overlay.ui:67 msgctxt "shortcut window" msgid "Toggle shuffling songs" msgstr "Víxla stokkun laga af/á" #: src/gtk/help-overlay.ui:75 msgctxt "shortcut window" msgid "Playback" msgstr "Afspilun" #: src/gtk/help-overlay.ui:78 msgctxt "shortcut window" msgid "Toggle Play/Pause" msgstr "Víxla á milli Spila/Bíða" #: src/gtk/help-overlay.ui:84 msgctxt "shortcut window" msgid "Previous song" msgstr "Fyrra lag" #: src/gtk/help-overlay.ui:90 msgctxt "shortcut window" msgid "Next song" msgstr "Næsta lag" #: src/gtk/help-overlay.ui:96 msgctxt "shortcut window" msgid "Seek backwards in the current song" msgstr "Leita afturábak í þessu lagi" #: src/gtk/help-overlay.ui:102 msgctxt "shortcut window" msgid "Seek forward in the current song" msgstr "Leita áfram í þessu lagi" #: src/gtk/playback-control.ui:30 msgctxt "a11y" msgid "Elapsed time" msgstr "Liðinn tími" #: src/gtk/playback-control.ui:42 msgctxt "a11y" msgid "Remaining time" msgstr "Tími eftir" #: src/gtk/playback-control.ui:64 msgid "Play the Previous Song" msgstr "Spila fyrra lag" #: src/gtk/playback-control.ui:69 msgctxt "a11y" msgid "Skip backwards" msgstr "Stökkva til baka" #: src/gtk/playback-control.ui:78 msgid "Toggle Play" msgstr "Víxla afspilun af/á" #: src/gtk/playback-control.ui:84 msgctxt "a11y" msgid "Toggle play" msgstr "Víxla afspilun af/á" #: src/gtk/playback-control.ui:93 msgid "Play the Next Song" msgstr "Spila næsta lag" #: src/gtk/playback-control.ui:98 msgctxt "a11y" msgid "Skip forward" msgstr "Stökkva áfram" #: src/gtk/playback-control.ui:121 msgid "Toggle Playlist" msgstr "Víxla spilunarlista af/á" #: src/gtk/playback-control.ui:126 msgctxt "a11y" msgid "Toggle playlist" msgstr "Víxla spilunarlista af/á" #: src/gtk/playback-control.ui:135 msgid "Shuffle the Playlist" msgstr "Stokka spilunarlista" #: src/gtk/playback-control.ui:137 msgctxt "a11y" msgid "Shuffle" msgstr "Stokka" #: src/gtk/playback-control.ui:156 src/playback_control.rs:153 msgid "Enable Repeat" msgstr "Virkja endurtekningu" #: src/gtk/playback-control.ui:161 msgctxt "a11y" msgid "Repeat" msgstr "Endurtaka" #: src/gtk/playback-control.ui:172 msgid "Main Menu" msgstr "Aðalvalmynd" #: src/gtk/playback-control.ui:177 msgctxt "a11y" msgid "Primary menu" msgstr "Meginvalmynd" #: src/gtk/playback-control.ui:193 msgid "Copy" msgstr "Afrita" #: src/gtk/playback-control.ui:199 msgid "Add _Song" msgstr "_Bæta við lagi" #: src/gtk/playback-control.ui:203 msgid "Add _Folder" msgstr "Bæta við mö_ppu" #: src/gtk/playback-control.ui:207 msgid "Clear" msgstr "Hreinsa" #: src/gtk/playback-control.ui:213 msgid "_Match Cover Art" msgstr "Sa_msvara umslagsmynd" #: src/gtk/playback-control.ui:219 msgid "_ReplayGain" msgstr "_ReplayGain styrkjöfnun" #: src/gtk/playback-control.ui:221 msgid "_Album" msgstr "_Albúm" #: src/gtk/playback-control.ui:226 msgid "_Track" msgstr "_Lag" #: src/gtk/playback-control.ui:231 msgid "_Off" msgstr "Slö_kkt" #: src/gtk/playback-control.ui:239 msgid "_Keyboard Shortcuts" msgstr "Flýtily_klar" #: src/gtk/playback-control.ui:243 msgid "_About Amberol" msgstr "_Um Amberol" #: src/gtk/playback-control.ui:247 msgid "_Quit" msgstr "_Hætta" #: src/gtk/playlist-view.ui:19 msgid "Playlist" msgstr "Spilunarlisti" #: src/gtk/playlist-view.ui:49 msgid "Search Songs in the Playlist" msgstr "Leita að lögum í spilunarlistanum" #: src/gtk/playlist-view.ui:61 msgid "Select Songs in the Playlist" msgstr "Velja lög í spilunarlistanum" #: src/gtk/playlist-view.ui:74 msgid "Close the Playlist" msgstr "Loka spilunarlistanum" #: src/gtk/playlist-view.ui:135 msgid "Select All Songs" msgstr "Velja öll lög" #: src/gtk/playlist-view.ui:148 msgid "Remove Selected Songs" msgstr "Fjarlægja valin lög" #: src/gtk/window.ui:12 msgid "Drop a song to add it to the queue" msgstr "Slepptu lagi til að bæta því í biðröðina" #: src/gtk/window.ui:49 msgid "" "Select a file or a folder, or drag files from your file manager to the " "application window to add songs to the playlist" msgstr "" "Veldu skrá eða möppu, eða dragðu skrár úr skráastjóranum þínum yfir á" " forritsgluggann til að bæta lögum á spilunarlistann" #: src/gtk/window.ui:58 msgid "Add Folder" msgstr "Bæta við möppu" #: src/gtk/window.ui:68 msgid "Add File" msgstr "Bæta við skrá" #: src/application.rs:181 msgid "Plays music and nothing else" msgstr "Spilar tónlist og ekkert annað" #. Translators: Replace "translator-credits" with your names, one name per line #: src/application.rs:188 msgid "translator-credits" msgstr "Sveinn í Felli, sv1@fellsnet.is" #: src/playback_control.rs:157 msgid "Repeat All Tracks" msgstr "Endurtaka öll lög" #: src/playback_control.rs:161 msgid "Repeat the Current Track" msgstr "Endurtaka núverandi lag" #: src/window.rs:409 msgid "_Add Song" msgstr "Bæt_a við lagi" #: src/window.rs:410 src/window.rs:450 msgid "_Cancel" msgstr "_Hætta við" #: src/window.rs:412 msgid "Open File" msgstr "Opna skrá" #: src/window.rs:419 msgid "Audio files" msgstr "Hljóðskrár" #: src/window.rs:428 src/window.rs:1276 msgid "Unable to access files" msgstr "Gat ekki fengið aðgang að skrám" #: src/window.rs:449 msgid "_Add Folder" msgstr "Bæt_a við möppu" #: src/window.rs:452 msgid "Open Folder" msgstr "Opna möppu" #: src/window.rs:463 msgid "Unable to access folders" msgstr "Gat ekki fengið aðgang að möppum" #: src/window.rs:475 msgid "No available song found" msgstr "Ekkert tiltækt lag fannst" #: src/window.rs:523 msgid "No songs found" msgstr "Engin lög fundust" #: src/window.rs:549 msgid "Added a new song" msgstr "Bætti við nýju lagi" #: src/window.rs:550 msgid "Play" msgstr "Spila" #. Translators: the `{}` must be left unmodified; #. it will be expanded to the number of songs added #. to the playlist #: src/window.rs:559 msgid "Added one song" msgid_plural "Added {} songs" msgstr[0] "Bætti við einu lagi" msgstr[1] "Bætti við {} lögum" #: src/window.rs:1012 msgid "Unable to access dropped files" msgstr "Gat ekki fengið aðgang að slepptum skrám" #: src/window.rs:1106 msgid "{} minute" msgid_plural "{} minutes" msgstr[0] "{} mínúta" msgstr[1] "{} mínútur" #: src/window.rs:1117 msgid "{hours} hour {minutes} remaining" msgid_plural "{hours} hours {minutes} remaining" msgstr[0] "{hours} klukkustund {minutes} eftir" msgstr[1] "{hours} klukkustundir {minutes} eftir" #. Translators: the '{}' must be left unmodified, and #. it will be replaced by the number of minutes remaining #. in the playlist #: src/window.rs:1127 msgid "{} minute remaining" msgid_plural "{} minutes remaining" msgstr[0] "{} mínúta eftir" msgstr[1] "{} mínútur eftir" #: src/window.rs:1256 msgid "No song selected" msgstr "Ekkert lag valið" #. Translators: The '{}' must be left unmodified, and #. it is expanded to the number of songs selected #: src/window.rs:1261 msgid "{} song selected" msgid_plural "{} songs selected" msgstr[0] "{} lag valið" msgstr[1] "{} lög valin" #. Translators: `{title}` and `{artist}` must be left #. untranslated; they will expand to the title and #. artist of the currently playing song, respectively #: src/window.rs:1314 msgid "Currently playing “{title}” by “{artist}”" msgstr "Er núna að spila “{title}” með “{artist}”" #: src/window.rs:1360 msgid "Amberol needs to run in the background to play music" msgstr "Amberol þarf að keyra í bakgrunni til að geta spilað tónlist" #: src/window.rs:1373 msgid "Amberol cannot run in the background" msgstr "Amberol getur ekki keyrt í bakgrunni" amberol-0.10.3/po/it.po000066400000000000000000000302441443320625200146120ustar00rootroot00000000000000# Italian translation for amberol. # Copyright (C) 2022 amberol's COPYRIGHT HOLDER # This file is distributed under the same license as the amberol package. # NicKoehler , 2022. # msgid "" msgstr "" "Project-Id-Version: amberol main\n" "Report-Msgid-Bugs-To: https://gitlab.gnome.org/World/amberol/issues\n" "POT-Creation-Date: 2022-10-11 16:54+0000\n" "PO-Revision-Date: 2022-10-14 10:48+0200\n" "Last-Translator: NicKoehler \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: Poedit 3.1.1\n" #: data/io.bassi.Amberol.desktop.in.in:3 #: data/io.bassi.Amberol.appdata.xml.in.in:6 msgid "Amberol" msgstr "Amberol" #: data/io.bassi.Amberol.desktop.in.in:4 msgid "Music Player" msgstr "Lettore musicale" #. Translators: Search terms to find this application. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! #: data/io.bassi.Amberol.desktop.in.in:12 msgid "music;player;media;audio;playlist;" msgstr "musica;lettore;media;audio;playlist;" #: data/io.bassi.Amberol.appdata.xml.in.in:7 msgid "Plays music, and nothing else" msgstr "Riproduci musica e nient'altro" #: data/io.bassi.Amberol.appdata.xml.in.in:9 msgid "" "Amberol is a music player with no delusions of grandeur. If you just want to " "play music available on your local system then Amberol is the music player " "you are looking for." msgstr "" "Amberol è un lettore musicale senza manie di grandezza. Se vuoi solo " "riprodurre musica locale, Amberol è il lettore musicale che stai cercando." #: data/io.bassi.Amberol.appdata.xml.in.in:14 msgid "Current features:" msgstr "Funzionalità attuali:" #: data/io.bassi.Amberol.appdata.xml.in.in:16 msgid "adaptive UI" msgstr "interfaccia utente adattiva" #: data/io.bassi.Amberol.appdata.xml.in.in:17 msgid "UI recoloring using the album art" msgstr "Interfaccia utente ricolorata in base alla copertina dell'album" #: data/io.bassi.Amberol.appdata.xml.in.in:18 msgid "drag and drop support to queue songs" msgstr "supporta l'aggiunta alla coda dei brani tramite trascinamento" #: data/io.bassi.Amberol.appdata.xml.in.in:19 msgid "shuffle and repeat" msgstr "mescola e ripeti" #: data/io.bassi.Amberol.appdata.xml.in.in:20 msgid "MPRIS integration" msgstr "Integrazione MPRIS" #: data/io.bassi.Amberol.appdata.xml.in.in:41 msgid "Emmanuele Bassi" msgstr "Emmanuele Bassi" #: src/audio/inhibit_controller.rs:40 msgid "Playback in progress" msgstr "Riproduzione in corso" #: src/audio/song.rs:328 msgid "Unknown artist" msgstr "Artista sconosciuto" #: src/audio/song.rs:335 msgid "Unknown title" msgstr "Titolo sconosciuto" #: src/audio/song.rs:342 msgid "Unknown album" msgstr "Album sconosciuto" #: src/gtk/help-overlay.ui:11 msgctxt "shortcut window" msgid "General" msgstr "Generale" #: src/gtk/help-overlay.ui:14 msgctxt "shortcut window" msgid "Toggle primary menu" msgstr "Mostra/Nascondi menù principale" #: src/gtk/help-overlay.ui:20 msgctxt "shortcut window" msgid "Copy song details to the clipboard" msgstr "Copia i dettagli del brano negli appunti" #: src/gtk/help-overlay.ui:26 msgctxt "shortcut window" msgid "Show Shortcuts" msgstr "Mostra scorciatoie" #: src/gtk/help-overlay.ui:32 msgctxt "shortcut window" msgid "Quit" msgstr "Esci" #: src/gtk/help-overlay.ui:40 msgctxt "shortcut window" msgid "Playlist" msgstr "Playlist" #: src/gtk/help-overlay.ui:43 msgctxt "shortcut window" msgid "Add a song to the playlist" msgstr "Aggiungi un brano alla playlist" #: src/gtk/help-overlay.ui:49 msgctxt "shortcut window" msgid "Add a folder to the playlist" msgstr "Aggiungi una cartella alla playlist" #: src/gtk/help-overlay.ui:55 msgctxt "shortcut window" msgid "Clear the playlist" msgstr "Svuota la playlist" #: src/gtk/help-overlay.ui:61 msgctxt "shortcut window" msgid "Toggle the playlist pane" msgstr "Mostra/Nascondi pannello playlist" #: src/gtk/help-overlay.ui:67 msgctxt "shortcut window" msgid "Toggle shuffling songs" msgstr "Attiva/Disattiva riproduzione casuale" #: src/gtk/help-overlay.ui:75 msgctxt "shortcut window" msgid "Playback" msgstr "Riproduzione" #: src/gtk/help-overlay.ui:78 msgctxt "shortcut window" msgid "Toggle Play/Pause" msgstr "Riproduci/Pausa" #: src/gtk/help-overlay.ui:84 msgctxt "shortcut window" msgid "Previous song" msgstr "Brano precedente" #: src/gtk/help-overlay.ui:90 msgctxt "shortcut window" msgid "Next song" msgstr "Brano successivo" #: src/gtk/help-overlay.ui:96 msgctxt "shortcut window" msgid "Seek backwards in the current song" msgstr "Scorri indietro il brano corrente" #: src/gtk/help-overlay.ui:102 msgctxt "shortcut window" msgid "Seek forward in the current song" msgstr "Scorri avanti il brano corrente" #: src/gtk/playback-control.ui:30 msgctxt "a11y" msgid "Elapsed time" msgstr "Tempo trascorso" #: src/gtk/playback-control.ui:42 msgctxt "a11y" msgid "Remaining time" msgstr "Tempo rimanente" #: src/gtk/playback-control.ui:64 msgid "Play the Previous Song" msgstr "Riproduci il brano precedente" #: src/gtk/playback-control.ui:69 msgctxt "a11y" msgid "Skip backwards" msgstr "Salta indietro" #: src/gtk/playback-control.ui:78 msgid "Toggle Play" msgstr "Riproduci/Pausa" #: src/gtk/playback-control.ui:84 msgctxt "a11y" msgid "Toggle play" msgstr "Riproduci/Pausa" #: src/gtk/playback-control.ui:93 msgid "Play the Next Song" msgstr "Riproduci il brano successivo" #: src/gtk/playback-control.ui:98 msgctxt "a11y" msgid "Skip forward" msgstr "Salta avanti" #: src/gtk/playback-control.ui:121 msgid "Toggle Playlist" msgstr "Mostra/Nascondi playlist" #: src/gtk/playback-control.ui:126 msgctxt "a11y" msgid "Toggle playlist" msgstr "Mostra/Nascondi playlist" #: src/gtk/playback-control.ui:135 msgid "Shuffle the Playlist" msgstr "Mescola la playlist" #: src/gtk/playback-control.ui:137 msgctxt "a11y" msgid "Shuffle" msgstr "Mescola" #: src/gtk/playback-control.ui:156 src/playback_control.rs:153 msgid "Enable Repeat" msgstr "Abilita ripetizione" #: src/gtk/playback-control.ui:161 msgctxt "a11y" msgid "Repeat" msgstr "Ripeti" #: src/gtk/playback-control.ui:172 msgid "Main Menu" msgstr "Menù principale" #: src/gtk/playback-control.ui:177 msgctxt "a11y" msgid "Primary menu" msgstr "Menù primario" #: src/gtk/playback-control.ui:193 msgid "Copy" msgstr "Copia" #: src/gtk/playback-control.ui:199 msgid "Add _Song" msgstr "Aggiungi _brano" #: src/gtk/playback-control.ui:203 msgid "Add _Folder" msgstr "Aggiungi _cartella" #: src/gtk/playback-control.ui:207 msgid "Clear" msgstr "Svuota" #: src/gtk/playback-control.ui:213 msgid "_Match Cover Art" msgstr "_Abbina alla copertina" #: src/gtk/playback-control.ui:219 msgid "_ReplayGain" msgstr "_ReplayGain" #: src/gtk/playback-control.ui:221 msgid "_Album" msgstr "_Album" #: src/gtk/playback-control.ui:226 msgid "_Track" msgstr "_Brano" #: src/gtk/playback-control.ui:231 msgid "_Off" msgstr "_Spento" #: src/gtk/playback-control.ui:239 msgid "_Keyboard Shortcuts" msgstr "_Scorciatoie da tastiera" #: src/gtk/playback-control.ui:243 msgid "_About Amberol" msgstr "_Informazioni su Amberol" #: src/gtk/playback-control.ui:247 msgid "_Quit" msgstr "_Esci" #: src/gtk/playlist-view.ui:19 msgid "Playlist" msgstr "Playlist" #: src/gtk/playlist-view.ui:49 msgid "Search Songs in the Playlist" msgstr "Cerca brani nella playlist" #: src/gtk/playlist-view.ui:61 msgid "Select Songs in the Playlist" msgstr "Seleziona brani nella playlist" #: src/gtk/playlist-view.ui:74 msgid "Close the Playlist" msgstr "Chiudi la playlist" #: src/gtk/playlist-view.ui:135 msgid "Select All Songs" msgstr "Seleziona tutti i brani" #: src/gtk/playlist-view.ui:148 msgid "Remove Selected Songs" msgstr "Rimuovi i brani selezionati" #: src/gtk/window.ui:12 msgid "Drop a song to add it to the queue" msgstr "Rilascia un brano per aggiungerlo alla coda" #: src/gtk/window.ui:49 msgid "" "Select a file or a folder, or drag files from your file manager to the " "application window to add songs to the playlist" msgstr "" "Selezionare un file o una cartella oppure trascinare i file dal file manager " "alla finestra dell'applicazione per aggiungere i brani alla playlist" #: src/gtk/window.ui:58 msgid "Add Folder" msgstr "Aggiungi cartella" #: src/gtk/window.ui:68 msgid "Add File" msgstr "Aggiungi file" #. Translators: Replace "translator-credits" with your names, one name per line #: src/application.rs:188 msgid "translator-credits" msgstr "NicKoehler" #: src/playback_control.rs:157 msgid "Repeat All Tracks" msgstr "Ripeti tutti i brani" #: src/playback_control.rs:161 msgid "Repeat the Current Track" msgstr "Ripeti il brano corrente" #: src/window.rs:409 msgid "_Add Song" msgstr "_Aggiungi brano" #: src/window.rs:410 src/window.rs:450 msgid "_Cancel" msgstr "_Annulla" #: src/window.rs:412 msgid "Open File" msgstr "Apri file" #: src/window.rs:419 msgid "Audio files" msgstr "File audio" #: src/window.rs:428 src/window.rs:1276 msgid "Unable to access files" msgstr "Impossibile accedere ai file" #: src/window.rs:449 msgid "_Add Folder" msgstr "_Aggiungi cartella" #: src/window.rs:452 msgid "Open Folder" msgstr "Apri cartella" #: src/window.rs:463 msgid "Unable to access folders" msgstr "Impossibile accedere alle cartelle" #: src/window.rs:475 msgid "No available song found" msgstr "Nessun brano trovato" #: src/window.rs:523 msgid "No songs found" msgstr "Nessun brano trovato" #: src/window.rs:549 msgid "Added a new song" msgstr "Aggiunto un nuovo brano" #: src/window.rs:550 msgid "Play" msgstr "Riproduci" #. Translators: the `{}` must be left unmodified; #. it will be expanded to the number of songs added #. to the playlist #: src/window.rs:559 msgid "Added one song" msgid_plural "Added {} songs" msgstr[0] "Aggiunto un brano" msgstr[1] "Aggiunti {} brani" #: src/window.rs:1012 msgid "Unable to access dropped files" msgstr "Impossibile accedere ai file eliminati" #: src/window.rs:1106 msgid "{} minute" msgid_plural "{} minutes" msgstr[0] "{} minuto" msgstr[1] "{} minuti" #: src/window.rs:1117 msgid "{hours} hour {minutes} remaining" msgid_plural "{hours} hours {minutes} remaining" msgstr[0] "{hours} ora e {minutes} rimanenti" msgstr[1] "{hours} ore e {minutes} rimanenti" #. Translators: the '{}' must be left unmodified, and #. it will be replaced by the number of minutes remaining #. in the playlist #: src/window.rs:1127 msgid "{} minute remaining" msgid_plural "{} minutes remaining" msgstr[0] "{} minuto rimanente" msgstr[1] "{} minuti rimanenti" #: src/window.rs:1256 msgid "No song selected" msgstr "Nessun brano selezionato" #. Translators: The '{}' must be left unmodified, and #. it is expanded to the number of songs selected #: src/window.rs:1261 msgid "{} song selected" msgid_plural "{} songs selected" msgstr[0] "{} brano selezionato" msgstr[1] "{} brani selezionati" #. Translators: `{title}` and `{artist}` must be left #. untranslated; they will expand to the title and #. artist of the currently playing song, respectively #: src/window.rs:1314 msgid "Currently playing “{title}” by “{artist}”" msgstr "“{title}” di “{artist}” in riproduzione" #: src/window.rs:1360 msgid "Amberol needs to run in the background to play music" msgstr "" "Amberol necessita di essere eseguito in background per riprodurre musica" #: src/window.rs:1373 msgid "Amberol cannot run in the background" msgstr "Amberol non può essere eseguito in background" #~ msgid "Plays music and nothing else" #~ msgstr "Riproduci musica e nient'altro" #~ msgid "{} hour" #~ msgid_plural "{} hours" #~ msgstr[0] "{} ora" #~ msgstr[1] "{} ore" #~ msgctxt "shortcut window" #~ msgid "Songs Queue" #~ msgstr "Coda dei brani" #~ msgctxt "shortcut window" #~ msgid "Queue a Song" #~ msgstr "Metti in coda un brano" #~ msgctxt "shortcut window" #~ msgid "Queue a Folder" #~ msgstr "Metti in coda una cartella" #~ msgctxt "shortcut window" #~ msgid "Clear" #~ msgstr "Svuota" #~ msgctxt "shortcut window" #~ msgid "Previous Track" #~ msgstr "Brano precedente" #~ msgid "Playing next" #~ msgstr "Prossimi brani" #~ msgid "“{}” is not a supported audio file" #~ msgstr "“{}” è un file audio non supportato" #~ msgid "Unrecognized file type for “{}”" #~ msgstr "Tipo di file non riconosciuto per “{}”" amberol-0.10.3/po/ka.po000066400000000000000000000374511443320625200146000ustar00rootroot00000000000000# Georgian translation for amblerol. # Copyright (C) 2023, Amberol authors # This file is distributed under the same license as the Amberol package. # Ekaterine Papava , 2023. # msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: https://gitlab.gnome.org/World/amberol/issues\n" "POT-Creation-Date: 2023-04-24 22:31+0000\n" "PO-Revision-Date: 2023-04-25 06:37+0200\n" "Last-Translator: Ekaterine Papava \n" "Language-Team: Georgian <(nothing)>\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: Poedit 3.2.2\n" #: data/io.bassi.Amberol.desktop.in.in:3 #: data/io.bassi.Amberol.appdata.xml.in.in:6 msgid "Amberol" msgstr "Amberol" #: data/io.bassi.Amberol.desktop.in.in:4 msgid "Music Player" msgstr "მედია დამკვრელი" #. Translators: Search terms to find this application. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! #: data/io.bassi.Amberol.desktop.in.in:12 msgid "music;player;media;audio;playlist;" msgstr "music;sound;player;media;audio;playlist;" #: data/io.bassi.Amberol.appdata.xml.in.in:7 msgid "Plays music, and nothing else" msgstr "დაუკარით მუსიკა და არაფერი სხვა" #: data/io.bassi.Amberol.appdata.xml.in.in:9 msgid "" "Amberol is a music player with no delusions of grandeur. If you just want to " "play music available on your local system then Amberol is the music player " "you are looking for." msgstr "" "Amberol-ი მუსიკის დამკვრელია განდიდების მანიის გარეშე. თუ თქვენ უბრალოდ " "თქვენს კომპიუტერში არსებული მუსიკის დაკვრა გნებავთ, Amberol -ი ზუსტად ისაა, " "რასაც ეძებთ." #: data/io.bassi.Amberol.appdata.xml.in.in:14 msgid "Current features:" msgstr "მიმდინარე თვისებები:" #: data/io.bassi.Amberol.appdata.xml.in.in:16 msgid "adaptive UI" msgstr "მორგებადი ინტერფეისი" #: data/io.bassi.Amberol.appdata.xml.in.in:17 msgid "UI recoloring using the album art" msgstr "UI-ის ფერების შეცვლა ყდის სურათის გამოყენებით" #: data/io.bassi.Amberol.appdata.xml.in.in:18 msgid "drag and drop support to queue songs" msgstr "რიგში ფაილების გადათრევის მხაარდაჭერა" #: data/io.bassi.Amberol.appdata.xml.in.in:19 msgid "shuffle and repeat" msgstr "შემთხვევით გამეორება" #: data/io.bassi.Amberol.appdata.xml.in.in:20 msgid "MPRIS integration" msgstr "MPRIS ინტეგრაცია" #: data/io.bassi.Amberol.appdata.xml.in.in:42 msgid "Emmanuele Bassi" msgstr "Emmanuele Bassi" #: src/audio/inhibit_controller.rs:40 msgid "Playback in progress" msgstr "დაკვრა მიმდინარეობს" #: src/audio/song.rs:325 msgid "Unknown artist" msgstr "უცნობი შემსრულებელი" #: src/audio/song.rs:332 msgid "Unknown title" msgstr "უცნობი სათაური" #: src/audio/song.rs:339 msgid "Unknown album" msgstr "უცნობი ალბომი" #: src/gtk/help-overlay.ui:11 msgctxt "shortcut window" msgid "General" msgstr "მთავარი" #: src/gtk/help-overlay.ui:14 msgctxt "shortcut window" msgid "Toggle primary menu" msgstr "ძირითადი მენიუს ჩართ/გამორთ" #: src/gtk/help-overlay.ui:20 msgctxt "shortcut window" msgid "Copy song details to the clipboard" msgstr "სიმღერის დეტალების ბუფერში კოპირება" #: src/gtk/help-overlay.ui:26 msgctxt "shortcut window" msgid "Show shortcuts" msgstr "მალსახმობების ჩვენება" #: src/gtk/help-overlay.ui:32 msgctxt "shortcut window" msgid "Quit" msgstr "გამოსვლა" #: src/gtk/help-overlay.ui:40 msgctxt "shortcut window" msgid "Playlist" msgstr "დასაკრავი სია" #: src/gtk/help-overlay.ui:43 msgctxt "shortcut window" msgid "Add a song to the playlist" msgstr "სიმღერის დასაკრავ სიაში ჩამატება" #: src/gtk/help-overlay.ui:49 msgctxt "shortcut window" msgid "Add a folder to the playlist" msgstr "საქაღალდის დასაკრავ სიაში ჩამატება" #: src/gtk/help-overlay.ui:55 msgctxt "shortcut window" msgid "Clear the playlist" msgstr "დასაკრავი სიის გასუფთავება" #: src/gtk/help-overlay.ui:61 msgctxt "shortcut window" msgid "Toggle the playlist pane" msgstr "დასაკრავი სიის პანელის გადართვა" #: src/gtk/help-overlay.ui:67 msgctxt "shortcut window" msgid "Toggle shuffling songs" msgstr "სიმღერების შემთხვევით დაკვრის გადართვა" #: src/gtk/help-overlay.ui:75 msgctxt "shortcut window" msgid "Playback" msgstr "დაკვრა" #: src/gtk/help-overlay.ui:78 msgctxt "shortcut window" msgid "Toggle play/pause" msgstr "დაკვრა/გაჩერების გადართვა" #: src/gtk/help-overlay.ui:84 msgctxt "shortcut window" msgid "Previous song" msgstr "წინა სიმღერა" #: src/gtk/help-overlay.ui:90 msgctxt "shortcut window" msgid "Next song" msgstr "შემდეგი სიმღერა" #: src/gtk/help-overlay.ui:96 msgctxt "shortcut window" msgid "Seek backwards in the current song" msgstr "მიმდინარე სიმღერის უკან გადახვევა" #: src/gtk/help-overlay.ui:102 msgctxt "shortcut window" msgid "Seek forward in the current song" msgstr "მიმდინარე სიმღერის წინ გადახვევა" #: src/gtk/playback-control.ui:21 msgid "Play the Previous Song" msgstr "წინა სიმღერის დაკვრა" #: src/gtk/playback-control.ui:26 msgctxt "a11y" msgid "Skip backwards" msgstr "უკან გამოტოვება" #: src/gtk/playback-control.ui:35 msgid "Toggle Play" msgstr "მედიის დაკვრის გადართვა" #: src/gtk/playback-control.ui:41 msgctxt "a11y" msgid "Toggle play" msgstr "მედიის დაკვრის გადართვა" #: src/gtk/playback-control.ui:50 msgid "Play the Next Song" msgstr "შემდეგი სიმღერის დაკვრა" #: src/gtk/playback-control.ui:55 msgctxt "a11y" msgid "Skip forward" msgstr "წინ გადახტომა" #: src/gtk/playback-control.ui:78 msgid "Toggle Playlist" msgstr "დასაკრავი სიის გადართვა" #: src/gtk/playback-control.ui:83 msgctxt "a11y" msgid "Toggle playlist" msgstr "დასაკრავი სიის გადართვა" #: src/gtk/playback-control.ui:92 msgid "Shuffle the Playlist" msgstr "დასაკრავი სის გადართვა" #: src/gtk/playback-control.ui:94 msgctxt "a11y" msgid "Shuffle" msgstr "შემთხვევით" #: src/gtk/playback-control.ui:113 src/playback_control.rs:114 msgid "Enable Repeat" msgstr "გამეორების ჩართვა" #: src/gtk/playback-control.ui:118 msgctxt "a11y" msgid "Repeat" msgstr "გამეორება" #: src/gtk/playback-control.ui:129 msgid "Main Menu" msgstr "მთავარი მენიუ" #: src/gtk/playback-control.ui:135 msgctxt "a11y" msgid "Primary menu" msgstr "ძირითადი მენიუ" #: src/gtk/playback-control.ui:151 msgid "Copy" msgstr "დააკოპირე" #: src/gtk/playback-control.ui:157 msgid "Add _Song" msgstr "_სიმღერის დამატება" #: src/gtk/playback-control.ui:161 msgid "Add _Folder" msgstr "_საქაღალდის დამატება" #: src/gtk/playback-control.ui:165 msgid "Clear" msgstr "გაწმენდა" #: src/gtk/playback-control.ui:171 msgid "_Match Cover Art" msgstr "_ყდის სურათის დამთხვევა" #: src/gtk/playback-control.ui:175 msgid "_Background Playback" msgstr "_ფონური დაკვრა" #: src/gtk/playback-control.ui:181 msgid "_ReplayGain" msgstr "ხმის გაძლიერების კოეფიციენტ" #: src/gtk/playback-control.ui:183 msgctxt "replaygain-menu" msgid "_Album" msgstr "_ალბომი" #: src/gtk/playback-control.ui:188 msgctxt "replaygain-menu" msgid "_Song" msgstr "_სიმღერა" #: src/gtk/playback-control.ui:193 msgctxt "replaygain-menu" msgid "_Disabled" msgstr "_გამორთულია" #: src/gtk/playback-control.ui:201 msgid "_Keyboard Shortcuts" msgstr "კლავიატურის მალსახმობები" #: src/gtk/playback-control.ui:205 msgid "_About Amberol" msgstr "Amberol-ის _შესახებ" #: src/gtk/playback-control.ui:209 msgid "_Quit" msgstr "დატოვება" #: src/gtk/playlist-view.ui:19 msgid "Playlist" msgstr "დასაკრავი სია" #: src/gtk/playlist-view.ui:49 msgid "Search Songs in the Playlist" msgstr "დასაკრავ სიაში სიმღერების მოძებნა" #: src/gtk/playlist-view.ui:61 msgid "Select Songs in the Playlist" msgstr "მონიშნეთ სიმღერები დასაკრავი სიიდან" #: src/gtk/playlist-view.ui:74 msgid "Close the Playlist" msgstr "დასაკრავი სიის დახურვა" #: src/gtk/playlist-view.ui:135 msgid "Select All Songs" msgstr "_ყველა სიმღერის მონიშვნა" #: src/gtk/playlist-view.ui:148 msgid "Remove Selected Songs" msgstr "მონიშნული სიმღერების წაშლა" #: src/gtk/window.ui:12 msgid "Drop a song to add it to the playlist" msgstr "სიმღერის რიგში ჩასამატებალად უბრალოდ დააგდეთ ფაილი აქ" #: src/gtk/window.ui:49 msgid "" "Select a file or a folder, or drag files from your file manager to the " "application window to add songs to the playlist" msgstr "" "დასაკრავ სიაში ჩასამატებლად აირჩიეთ ფაილი ან საქაღალდე ან გადმოათრიეთ " "ფაილები თქვენი ფაილების მმართველიდან" #: src/gtk/window.ui:58 msgid "Restore Playlist" msgstr "დასაკრავი სიის აღდგენა" #: src/gtk/window.ui:68 msgid "Add Folder" msgstr "საქაღალდის დამატება" #: src/gtk/window.ui:77 msgid "Add Song" msgstr "სიმღერის დამატება" #: src/gtk/window.ui:161 msgctxt "a11y" msgid "Elapsed time" msgstr "გასული დრო" #: src/gtk/window.ui:173 msgctxt "a11y" msgid "Remaining time" msgstr "დარჩენილი დრო" #. Translators: Replace "translator-credits" with your names, one name per line #: src/application.rs:227 msgid "translator-credits" msgstr "მთარგმნელის შესახებ" #: src/application.rs:239 msgid "Amberol needs to run in the background to play music" msgstr "Amberol-ს მუსიკის დასაკრავად ფონურად გაშვება სჭირდება" #: src/playback_control.rs:118 msgid "Repeat All Songs" msgstr "ყველა სიმღერის გამეორება" #: src/playback_control.rs:122 msgid "Repeat the Current Song" msgstr "მიმდინარე სიმღერის გამეორება" #: src/window.rs:403 msgid "_Add Song" msgstr "_სიმღერის დამატება" #: src/window.rs:404 src/window.rs:444 msgid "_Cancel" msgstr "_გაუქმება" #: src/window.rs:406 msgid "Open File" msgstr "ფაილის გახსნა" #: src/window.rs:413 msgid "Audio files" msgstr "აუდიო ფაილები" #: src/window.rs:422 src/window.rs:1315 msgid "Unable to access files" msgstr "ფაილებთან წვდომის შეცდომა" #: src/window.rs:443 msgid "_Add Folder" msgstr "_საქაღალდის დამატება" #: src/window.rs:446 msgid "Open Folder" msgstr "საქაღალდის გახსნა" #: src/window.rs:457 msgid "Unable to access folders" msgstr "საქაღალდეებთან წვდომის შეცდომა" #: src/window.rs:475 msgid "No available song found" msgstr "სიმღერები მიუწვდომელია" #: src/window.rs:532 msgid "No songs found" msgstr "სიმღერების გარეშე" #: src/window.rs:562 msgid "Added a new song" msgstr "ახალი სიმღერა დაემატა" #: src/window.rs:563 msgid "Play" msgstr "დაკვრა" #. Translators: the `{}` must be left unmodified; #. it will be expanded to the number of songs added #. to the playlist #: src/window.rs:572 msgid "Added one song" msgid_plural "Added {} songs" msgstr[0] "დაემატა {} სიმღერა" msgstr[1] "დაემატა {} სიმღერა" #: src/window.rs:1062 msgid "Unable to access dropped files" msgstr "დაყრილ ფაილებთან წვდომის შეცდომა" #: src/window.rs:1152 msgid "{} minute" msgid_plural "{} minutes" msgstr[0] "{} წუთი" msgstr[1] "{} წუთი" #: src/window.rs:1163 msgid "{hours} hour {minutes} remaining" msgid_plural "{hours} hours {minutes} remaining" msgstr[0] "დარჩენილია {hours} საათი და {minutes} წუთი" msgstr[1] "დარჩენილია {hours} საათი და {minutes} წუთი" #. Translators: the '{}' must be left unmodified, and #. it will be replaced by the number of minutes remaining #. in the playlist #: src/window.rs:1173 msgid "{} minute remaining" msgid_plural "{} minutes remaining" msgstr[0] "დარჩენილია {} წუთი" msgstr[1] "დარჩენილია {} წუთი" #: src/window.rs:1295 msgid "No song selected" msgstr "სიმღერა არჩეული არაა" #. Translators: The '{}' must be left unmodified, and #. it is expanded to the number of songs selected #: src/window.rs:1300 msgid "{} song selected" msgid_plural "{} songs selected" msgstr[0] "მონიშნულია {} სიმღერა" msgstr[1] "მონიშნულია {} სიმღერა" #. Translators: `{title}` and `{artist}` must be left #. untranslated; they will expand to the title and #. artist of the currently playing song, respectively #: src/window.rs:1353 msgid "Currently playing “{title}” by “{artist}”" msgstr "ვუკრავ “{title}”. შემსრულებელი: “{artist}”" #~ msgid "_Track" #~ msgstr "_ტრეკი" #~ msgid "_Off" #~ msgstr "_გამორთ" #~ msgid "Repeat All Tracks" #~ msgstr "ყველა ტრეკის გამეორება" #~ msgid "Add File" #~ msgstr "ფაილის დამატება" #~ msgid "Plays music and nothing else" #~ msgstr "დაუკარით მუსიკა და არაფერი სხვა" #~ msgid "{} hour" #~ msgid_plural "{} hours" #~ msgstr[0] "{} საათი" #~ msgstr[1] "{} საათი" amberol-0.10.3/po/ko.po000066400000000000000000000267211443320625200146140ustar00rootroot00000000000000# Korean translation for amberol. # Copyright (C) 2022 amberol's COPYRIGHT HOLDER # This file is distributed under the same license as the amberol package. # Seong-ho Cho , 2022, 2023. # msgid "" msgstr "" "Project-Id-Version: amberol main\n" "Report-Msgid-Bugs-To: https://gitlab.gnome.org/World/amberol/issues\n" "POT-Creation-Date: 2023-02-22 13:07+0000\n" "PO-Revision-Date: 2023-03-04 19:13+0900\n" "Last-Translator: Seong-ho Cho \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: Poedit 2.3.1\n" #: data/io.bassi.Amberol.desktop.in.in:3 #: data/io.bassi.Amberol.appdata.xml.in.in:6 msgid "Amberol" msgstr "앰버롤" #: data/io.bassi.Amberol.desktop.in.in:4 msgid "Music Player" msgstr "음악 재생기" #. Translators: Search terms to find this application. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! #: data/io.bassi.Amberol.desktop.in.in:12 msgid "music;player;media;audio;playlist;" msgstr "" "music;음악;곡;player;재생;재생기;media;매체;미디어;audio;오디오;소리;음성;" "playlist;재생목록;목록;" #: data/io.bassi.Amberol.appdata.xml.in.in:7 msgid "Plays music, and nothing else" msgstr "음악을 재생하며, 다른 동작은 하지 않습니다" #: data/io.bassi.Amberol.appdata.xml.in.in:9 msgid "" "Amberol is a music player with no delusions of grandeur. If you just want to " "play music available on your local system then Amberol is the music player " "you are looking for." msgstr "" "앰버롤은 장엄한 착각을 주지 않는 음악 재생 프로그램입니다. 로컬 시스템에 있" "는 음악을 재생하려 한다면 앰버롤은 여러분이 찾던 음악 재생 프로그램으로 안성" "맞춤입니다." #: data/io.bassi.Amberol.appdata.xml.in.in:14 msgid "Current features:" msgstr "현재 기능:" #: data/io.bassi.Amberol.appdata.xml.in.in:16 msgid "adaptive UI" msgstr "적응형 UI" #: data/io.bassi.Amberol.appdata.xml.in.in:17 msgid "UI recoloring using the album art" msgstr "앨범 표지에 맞춰 인터페이스 색상 변경" #: data/io.bassi.Amberol.appdata.xml.in.in:18 msgid "drag and drop support to queue songs" msgstr "재생 대기열로 곡 끌어다 놓기 기능" #: data/io.bassi.Amberol.appdata.xml.in.in:19 msgid "shuffle and repeat" msgstr "뒤섞고 반복 재생" #: data/io.bassi.Amberol.appdata.xml.in.in:20 msgid "MPRIS integration" msgstr "MPRIS 통합" #: data/io.bassi.Amberol.appdata.xml.in.in:42 msgid "Emmanuele Bassi" msgstr "Emmanuele Bassi" #: src/audio/inhibit_controller.rs:40 msgid "Playback in progress" msgstr "재생 중" #: src/audio/song.rs:337 msgid "Unknown artist" msgstr "알 수 없는 음악가" #: src/audio/song.rs:344 msgid "Unknown title" msgstr "알 수 없는 제목" #: src/audio/song.rs:351 msgid "Unknown album" msgstr "알 수 없는 앨범" #: src/gtk/help-overlay.ui:11 msgctxt "shortcut window" msgid "General" msgstr "일반" #: src/gtk/help-overlay.ui:14 msgctxt "shortcut window" msgid "Toggle primary menu" msgstr "기본 메뉴 전환" #: src/gtk/help-overlay.ui:20 msgctxt "shortcut window" msgid "Copy song details to the clipboard" msgstr "곡 세부 정보를 클립보드에 복사" #: src/gtk/help-overlay.ui:26 msgctxt "shortcut window" msgid "Show shortcuts" msgstr "바로 가기 키 표시" #: src/gtk/help-overlay.ui:32 msgctxt "shortcut window" msgid "Quit" msgstr "끝내기" #: src/gtk/help-overlay.ui:40 msgctxt "shortcut window" msgid "Playlist" msgstr "재생 목록" #: src/gtk/help-overlay.ui:43 msgctxt "shortcut window" msgid "Add a song to the playlist" msgstr "곡을 재생 목록에 추가" #: src/gtk/help-overlay.ui:49 msgctxt "shortcut window" msgid "Add a folder to the playlist" msgstr "폴더를 재생 목록에 추가" #: src/gtk/help-overlay.ui:55 msgctxt "shortcut window" msgid "Clear the playlist" msgstr "재생 목록 지우기" #: src/gtk/help-overlay.ui:61 msgctxt "shortcut window" msgid "Toggle the playlist pane" msgstr "재생 목록 창 전환" #: src/gtk/help-overlay.ui:67 msgctxt "shortcut window" msgid "Toggle shuffling songs" msgstr "곡 재생 순서 섞기 전환" #: src/gtk/help-overlay.ui:75 msgctxt "shortcut window" msgid "Playback" msgstr "재생" #: src/gtk/help-overlay.ui:78 msgctxt "shortcut window" msgid "Toggle play/pause" msgstr "재생/일시정지 전환" #: src/gtk/help-overlay.ui:84 msgctxt "shortcut window" msgid "Previous song" msgstr "이전 곡" #: src/gtk/help-overlay.ui:90 msgctxt "shortcut window" msgid "Next song" msgstr "다음 곡" #: src/gtk/help-overlay.ui:96 msgctxt "shortcut window" msgid "Seek backwards in the current song" msgstr "현재 곡 후위 탐색" #: src/gtk/help-overlay.ui:102 msgctxt "shortcut window" msgid "Seek forward in the current song" msgstr "현재 곡 전위 탐색" #: src/gtk/playback-control.ui:35 msgctxt "a11y" msgid "Elapsed time" msgstr "경과 시간" #: src/gtk/playback-control.ui:47 msgctxt "a11y" msgid "Remaining time" msgstr "남은 시간" #: src/gtk/playback-control.ui:69 msgid "Play the Previous Song" msgstr "이전 곡 재생" #: src/gtk/playback-control.ui:74 msgctxt "a11y" msgid "Skip backwards" msgstr "뒤로 건너뛰기" #: src/gtk/playback-control.ui:83 msgid "Toggle Play" msgstr "재생 전환" #: src/gtk/playback-control.ui:89 msgctxt "a11y" msgid "Toggle play" msgstr "재생 전환" #: src/gtk/playback-control.ui:98 msgid "Play the Next Song" msgstr "다음 곡 재생" #: src/gtk/playback-control.ui:103 msgctxt "a11y" msgid "Skip forward" msgstr "앞으로 건너뛰기" #: src/gtk/playback-control.ui:126 msgid "Toggle Playlist" msgstr "재생 목록 전환" #: src/gtk/playback-control.ui:131 msgctxt "a11y" msgid "Toggle playlist" msgstr "재생 목록 전환" #: src/gtk/playback-control.ui:140 msgid "Shuffle the Playlist" msgstr "재생 목록 뒤섞기" #: src/gtk/playback-control.ui:142 msgctxt "a11y" msgid "Shuffle" msgstr "임의재생" #: src/gtk/playback-control.ui:161 src/playback_control.rs:153 msgid "Enable Repeat" msgstr "반복 활성화" #: src/gtk/playback-control.ui:166 msgctxt "a11y" msgid "Repeat" msgstr "반복" #: src/gtk/playback-control.ui:177 msgid "Main Menu" msgstr "주 메뉴" #: src/gtk/playback-control.ui:183 msgctxt "a11y" msgid "Primary menu" msgstr "기본 메뉴" #: src/gtk/playback-control.ui:199 msgid "Copy" msgstr "복사" #: src/gtk/playback-control.ui:205 msgid "Add _Song" msgstr "곡 추가(_S)" #: src/gtk/playback-control.ui:209 msgid "Add _Folder" msgstr "폴더 추가(_F)" #: src/gtk/playback-control.ui:213 msgid "Clear" msgstr "지우기" #: src/gtk/playback-control.ui:219 msgid "_Match Cover Art" msgstr "표지 그림 일치(_M)" #: src/gtk/playback-control.ui:223 msgid "_Background Playback" msgstr "백그라운드 재생(_B)" #: src/gtk/playback-control.ui:229 msgid "_ReplayGain" msgstr "리플레이 게인(_R)" #: src/gtk/playback-control.ui:231 msgid "_Album" msgstr "앨범(_A)" #: src/gtk/playback-control.ui:236 msgid "_Track" msgstr "트랙(_T)" #: src/gtk/playback-control.ui:241 msgid "_Off" msgstr "끔(_O)" #: src/gtk/playback-control.ui:249 msgid "_Keyboard Shortcuts" msgstr "키보드 바로 가기 키(_K)" #: src/gtk/playback-control.ui:253 msgid "_About Amberol" msgstr "앰버롤 정보(_A)" #: src/gtk/playback-control.ui:257 msgid "_Quit" msgstr "끝내기(_Q)" #: src/gtk/playlist-view.ui:19 msgid "Playlist" msgstr "재생 목록" #: src/gtk/playlist-view.ui:49 msgid "Search Songs in the Playlist" msgstr "재생 목록의 곡 검색" #: src/gtk/playlist-view.ui:61 msgid "Select Songs in the Playlist" msgstr "재생 목록의 곡 선택" #: src/gtk/playlist-view.ui:74 msgid "Close the Playlist" msgstr "재생 목록 닫기" #: src/gtk/playlist-view.ui:135 msgid "Select All Songs" msgstr "모든 곡 선택" #: src/gtk/playlist-view.ui:148 msgid "Remove Selected Songs" msgstr "선택한 곡 제거" #: src/gtk/window.ui:12 msgid "Drop a song to add it to the queue" msgstr "대기열에 곡을 넣어 추가하는 기능" #: src/gtk/window.ui:49 msgid "" "Select a file or a folder, or drag files from your file manager to the " "application window to add songs to the playlist" msgstr "" "파일 또는 폴더를 선택하거나 파일 관리자에서 파일을 끌어다 프로그램 창에 올려" "두어 재생 목록에 곡을 추가하십시오" #: src/gtk/window.ui:58 msgid "Restore Playlist" msgstr "재생 목록 복원" #: src/gtk/window.ui:68 msgid "Add Folder" msgstr "폴더 추가" #: src/gtk/window.ui:77 msgid "Add Song" msgstr "곡 추가" #. Translators: Replace "translator-credits" with your names, one name per line #: src/application.rs:233 msgid "translator-credits" msgstr "조성호 " #: src/application.rs:247 msgid "Amberol needs to run in the background to play music" msgstr "앰버롤은 음악을 재생할 때 백그라운드에서 실행해야 합니다" #: src/playback_control.rs:157 msgid "Repeat All Tracks" msgstr "모든 트랙 반복 재생" #: src/playback_control.rs:161 msgid "Repeat the Current Track" msgstr "현재 트랙 반복 재생" #: src/window.rs:397 msgid "_Add Song" msgstr "곡 추가(_A)" #: src/window.rs:398 src/window.rs:438 msgid "_Cancel" msgstr "취소(_C)" #: src/window.rs:400 msgid "Open File" msgstr "파일 열기" #: src/window.rs:407 msgid "Audio files" msgstr "오디오 파일" #: src/window.rs:416 src/window.rs:1306 msgid "Unable to access files" msgstr "파일을 열 수 없습니다" #: src/window.rs:437 msgid "_Add Folder" msgstr "폴더 추가(_A)" #: src/window.rs:440 msgid "Open Folder" msgstr "폴더 열기" #: src/window.rs:451 msgid "Unable to access folders" msgstr "폴더를 열 수 없습니다" #: src/window.rs:469 msgid "No available song found" msgstr "곡이 없습니다" #: src/window.rs:526 msgid "No songs found" msgstr "곡이 없습니다" #: src/window.rs:556 msgid "Added a new song" msgstr "새 곡을 추가했습니다" #: src/window.rs:557 msgid "Play" msgstr "재생" #. Translators: the `{}` must be left unmodified; #. it will be expanded to the number of songs added #. to the playlist #: src/window.rs:566 msgid "Added one song" msgid_plural "Added {} songs" msgstr[0] "곡 {}개를 추가했습니다" #: src/window.rs:1056 msgid "Unable to access dropped files" msgstr "끌어다 놓은 파일을 열 수 없습니다" #: src/window.rs:1149 msgid "{} minute" msgid_plural "{} minutes" msgstr[0] "{}분" #: src/window.rs:1160 msgid "{hours} hour {minutes} remaining" msgid_plural "{hours} hours {minutes} remaining" msgstr[0] "{hours}시간 {minutes}분 남음" #. Translators: the '{}' must be left unmodified, and #. it will be replaced by the number of minutes remaining #. in the playlist #: src/window.rs:1170 msgid "{} minute remaining" msgid_plural "{} minutes remaining" msgstr[0] "{}분 남음" #: src/window.rs:1286 msgid "No song selected" msgstr "선택한 곡이 없습니다" #. Translators: The '{}' must be left unmodified, and #. it is expanded to the number of songs selected #: src/window.rs:1291 msgid "{} song selected" msgid_plural "{} songs selected" msgstr[0] "곡 {}개 선택함" #. Translators: `{title}` and `{artist}` must be left #. untranslated; they will expand to the title and #. artist of the currently playing song, respectively #: src/window.rs:1344 msgid "Currently playing “{title}” by “{artist}”" msgstr "현재 재생중: “{title}” ― “{artist}”" #~ msgid "Add File" #~ msgstr "파일 추가" amberol-0.10.3/po/lt.po000066400000000000000000000277211443320625200146230ustar00rootroot00000000000000# Lithuanian translation for amberol. # Copyright (C) 2022 amberol's COPYRIGHT HOLDER # This file is distributed under the same license as the amberol package. # FIRST AUTHOR , YEAR. # mprogramavimai , 2022. # Aurimas Černius , 2022-2023. # msgid "" msgstr "" "Project-Id-Version: amberol main\n" "Report-Msgid-Bugs-To: https://gitlab.gnome.org/World/amberol/issues\n" "POT-Creation-Date: 2023-02-22 13:07+0000\n" "PO-Revision-Date: 2023-02-26 22:34+0200\n" "Last-Translator: Aurimas Černius \n" "Language-Team: Lietuvių \n" "Language: lt\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && " "(n%100<10 || n%100>=20) ? 1 : 2)\n" "X-DL-Team: lt\n" "X-DL-Module: amberol\n" "X-DL-Branch: main\n" "X-DL-Domain: po\n" "X-DL-State: Translating\n" "X-Generator: Gtranslator 42.0\n" #: data/io.bassi.Amberol.desktop.in.in:3 #: data/io.bassi.Amberol.appdata.xml.in.in:6 msgid "Amberol" msgstr "Amberol" #: data/io.bassi.Amberol.desktop.in.in:4 msgid "Music Player" msgstr "Muzikos grotuvas" #. Translators: Search terms to find this application. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! #: data/io.bassi.Amberol.desktop.in.in:12 msgid "music;player;media;audio;playlist;" msgstr "muzika;grotuvas;medija;garsas;grojaraštis;" #: data/io.bassi.Amberol.appdata.xml.in.in:7 msgid "Plays music, and nothing else" msgstr "Groja muziką ir nieko daugiau" #: data/io.bassi.Amberol.appdata.xml.in.in:9 msgid "" "Amberol is a music player with no delusions of grandeur. If you just want to " "play music available on your local system then Amberol is the music player " "you are looking for." msgstr "" "Amberol yra muzikos grotuvas be jokių didybės kliedesių. Jeigu tiesiog nori " "groti muziką, pasiekiamą savo sistemoje, tai Amberol yra muzikos grotuvas, " "kurio tu ieškai." #: data/io.bassi.Amberol.appdata.xml.in.in:14 msgid "Current features:" msgstr "Dabartinės savybės:" #: data/io.bassi.Amberol.appdata.xml.in.in:16 msgid "adaptive UI" msgstr "adaptyvi sąsaja" #: data/io.bassi.Amberol.appdata.xml.in.in:17 msgid "UI recoloring using the album art" msgstr "spalvų pakeitimas pagal albumo išvaizdą" #: data/io.bassi.Amberol.appdata.xml.in.in:18 msgid "drag and drop support to queue songs" msgstr "nutempimo palaikymas dainų pridėjimui į eilę" #: data/io.bassi.Amberol.appdata.xml.in.in:19 msgid "shuffle and repeat" msgstr "maišymas ir kartojimas" #: data/io.bassi.Amberol.appdata.xml.in.in:20 msgid "MPRIS integration" msgstr "MPRIS integracija" #: data/io.bassi.Amberol.appdata.xml.in.in:42 msgid "Emmanuele Bassi" msgstr "Emmanuele Bassi" #: src/audio/inhibit_controller.rs:40 msgid "Playback in progress" msgstr "Grojama" #: src/audio/song.rs:337 msgid "Unknown artist" msgstr "Nežinomas atlikėjas" #: src/audio/song.rs:344 msgid "Unknown title" msgstr "Nežinomas pavadinimas" #: src/audio/song.rs:351 msgid "Unknown album" msgstr "Nežinomas albumas" #: src/gtk/help-overlay.ui:11 msgctxt "shortcut window" msgid "General" msgstr "Esmė" #: src/gtk/help-overlay.ui:14 msgctxt "shortcut window" msgid "Toggle primary menu" msgstr "Perjungti pagrindinį meniu" #: src/gtk/help-overlay.ui:20 msgctxt "shortcut window" msgid "Copy song details to the clipboard" msgstr "Kopijuoti dainos detales į iškarpinę" #: src/gtk/help-overlay.ui:26 msgctxt "shortcut window" msgid "Show shortcuts" msgstr "Rodyti trumpinius" #: src/gtk/help-overlay.ui:32 msgctxt "shortcut window" msgid "Quit" msgstr "Išeiti" #: src/gtk/help-overlay.ui:40 msgctxt "shortcut window" msgid "Playlist" msgstr "Grojaraštis" #: src/gtk/help-overlay.ui:43 msgctxt "shortcut window" msgid "Add a song to the playlist" msgstr "Pridėti dainą į grojaraštį" #: src/gtk/help-overlay.ui:49 msgctxt "shortcut window" msgid "Add a folder to the playlist" msgstr "Pridėti aplanką į grojaraštį" #: src/gtk/help-overlay.ui:55 msgctxt "shortcut window" msgid "Clear the playlist" msgstr "Išvalyti grojaraštį" #: src/gtk/help-overlay.ui:61 msgctxt "shortcut window" msgid "Toggle the playlist pane" msgstr "Perjungti grojaraščio polangį" #: src/gtk/help-overlay.ui:67 msgctxt "shortcut window" msgid "Toggle shuffling songs" msgstr "Perjungti dainų maišymą" #: src/gtk/help-overlay.ui:75 msgctxt "shortcut window" msgid "Playback" msgstr "Grojimas" #: src/gtk/help-overlay.ui:78 msgctxt "shortcut window" msgid "Toggle play/pause" msgstr "Groti/Pristabdyti" #: src/gtk/help-overlay.ui:84 msgctxt "shortcut window" msgid "Previous song" msgstr "Ankstesnė daina" #: src/gtk/help-overlay.ui:90 msgctxt "shortcut window" msgid "Next song" msgstr "Kita daina" #: src/gtk/help-overlay.ui:96 msgctxt "shortcut window" msgid "Seek backwards in the current song" msgstr "Grįžti laiku dabartinėje dainoje" #: src/gtk/help-overlay.ui:102 msgctxt "shortcut window" msgid "Seek forward in the current song" msgstr "Į priekį laiku dabartinėje dainoje" #: src/gtk/playback-control.ui:35 msgctxt "a11y" msgid "Elapsed time" msgstr "Praleistas laikas" #: src/gtk/playback-control.ui:47 msgctxt "a11y" msgid "Remaining time" msgstr "Likęs laikas" #: src/gtk/playback-control.ui:69 msgid "Play the Previous Song" msgstr "Groti ankstesnę dainą" #: src/gtk/playback-control.ui:74 msgctxt "a11y" msgid "Skip backwards" msgstr "Prasukti atgal" #: src/gtk/playback-control.ui:83 msgid "Toggle Play" msgstr "Groti/pristabdyti" #: src/gtk/playback-control.ui:89 msgctxt "a11y" msgid "Toggle play" msgstr "Groti/pristabdyti" #: src/gtk/playback-control.ui:98 msgid "Play the Next Song" msgstr "Groti kitą dainą" #: src/gtk/playback-control.ui:103 msgctxt "a11y" msgid "Skip forward" msgstr "Prasukti pirmyn" #: src/gtk/playback-control.ui:126 msgid "Toggle Playlist" msgstr "Perjungti grojaraštį" #: src/gtk/playback-control.ui:131 msgctxt "a11y" msgid "Toggle playlist" msgstr "Perjungti grojaraštį" #: src/gtk/playback-control.ui:140 msgid "Shuffle the Playlist" msgstr "Maišyti grojaraštį" #: src/gtk/playback-control.ui:142 msgctxt "a11y" msgid "Shuffle" msgstr "Maišyti" #: src/gtk/playback-control.ui:161 src/playback_control.rs:153 msgid "Enable Repeat" msgstr "Įjungti kartojimą" #: src/gtk/playback-control.ui:166 msgctxt "a11y" msgid "Repeat" msgstr "Kartoti" #: src/gtk/playback-control.ui:177 msgid "Main Menu" msgstr "Pagrindinis meniu " #: src/gtk/playback-control.ui:183 msgctxt "a11y" msgid "Primary menu" msgstr "Pirminis meniu" #: src/gtk/playback-control.ui:199 msgid "Copy" msgstr "Kopijuoti" #: src/gtk/playback-control.ui:205 msgid "Add _Song" msgstr "Pridėti _dainą" #: src/gtk/playback-control.ui:209 msgid "Add _Folder" msgstr "Pridėti _aplanką" #: src/gtk/playback-control.ui:213 msgid "Clear" msgstr "Išvalyti" #: src/gtk/playback-control.ui:219 msgid "_Match Cover Art" msgstr "Sutapti su _viršeliu" #: src/gtk/playback-control.ui:223 msgid "_Background Playback" msgstr "Grojimas _fone" #: src/gtk/playback-control.ui:229 msgid "_ReplayGain" msgstr "_ReplayGain" #: src/gtk/playback-control.ui:231 msgid "_Album" msgstr "_Albumas" #: src/gtk/playback-control.ui:236 msgid "_Track" msgstr "_Takelis" #: src/gtk/playback-control.ui:241 msgid "_Off" msgstr "_Išjungta" #: src/gtk/playback-control.ui:249 msgid "_Keyboard Shortcuts" msgstr "_Klaviatūros trumpiniai" #: src/gtk/playback-control.ui:253 msgid "_About Amberol" msgstr "_Apie Amberol" #: src/gtk/playback-control.ui:257 msgid "_Quit" msgstr "_Išeiti" #: src/gtk/playlist-view.ui:19 msgid "Playlist" msgstr "Grojaraštis" #: src/gtk/playlist-view.ui:49 msgid "Search Songs in the Playlist" msgstr "Ieškoti dainų grojaraštyje" #: src/gtk/playlist-view.ui:61 msgid "Select Songs in the Playlist" msgstr "Pasirinkti dainas grojaraštyje" #: src/gtk/playlist-view.ui:74 msgid "Close the Playlist" msgstr "Užverti grojaraštį" #: src/gtk/playlist-view.ui:135 msgid "Select All Songs" msgstr "Pasirinkti visas dainas" #: src/gtk/playlist-view.ui:148 msgid "Remove Selected Songs" msgstr "Pašalinti pasirinktas dainas" #: src/gtk/window.ui:12 msgid "Drop a song to add it to the queue" msgstr "Numeskite dainą jai pridėti į eilę" #: src/gtk/window.ui:49 msgid "" "Select a file or a folder, or drag files from your file manager to the " "application window to add songs to the playlist" msgstr "" "Pasirinkti failą arba aplanką, arba užmeskite failus iš jūsų failų naršyklės " "į programos langą dainoms pridėti į grojaraštį" #: src/gtk/window.ui:58 msgid "Restore Playlist" msgstr "Atstatyti grojaraštį" #: src/gtk/window.ui:68 msgid "Add Folder" msgstr "Pridėti aplanką" #: src/gtk/window.ui:77 msgid "Add Song" msgstr "Pridėti dainą" #. Translators: Replace "translator-credits" with your names, one name per line #: src/application.rs:233 msgid "translator-credits" msgstr "" "Išvertė:\n" "Aurimas Černius \n" "Mprogramavimai" #: src/application.rs:247 msgid "Amberol needs to run in the background to play music" msgstr "Amberol turi veikti fone, kad grotų muziką" #: src/playback_control.rs:157 msgid "Repeat All Tracks" msgstr "Kartoti visus takelius" #: src/playback_control.rs:161 msgid "Repeat the Current Track" msgstr "Kartoti dabartinį takelį" #: src/window.rs:397 msgid "_Add Song" msgstr "_Pridėti dainą" #: src/window.rs:398 src/window.rs:438 msgid "_Cancel" msgstr "_Atsisakyti" #: src/window.rs:400 msgid "Open File" msgstr "Atverti failą" #: src/window.rs:407 msgid "Audio files" msgstr "Garso failai" #: src/window.rs:416 src/window.rs:1306 msgid "Unable to access files" msgstr "Nepavyksta pasiekti failų" #: src/window.rs:437 msgid "_Add Folder" msgstr "Pridėti _aplanką" #: src/window.rs:440 msgid "Open Folder" msgstr "Atverti aplanką" #: src/window.rs:451 msgid "Unable to access folders" msgstr "Nepavykta pasiekti aplankų" #: src/window.rs:469 msgid "No available song found" msgstr "Nerasta pasiekiamų dainų" #: src/window.rs:526 msgid "No songs found" msgstr "Nerasta dainų" #: src/window.rs:556 msgid "Added a new song" msgstr "Pridėta nauja daina" #: src/window.rs:557 msgid "Play" msgstr "Groti" #. Translators: the `{}` must be left unmodified; #. it will be expanded to the number of songs added #. to the playlist #: src/window.rs:566 msgid "Added one song" msgid_plural "Added {} songs" msgstr[0] "Pridėta {} daina" msgstr[1] "Pridėtos {} dainos" msgstr[2] "Pridėtos {} dainų" #: src/window.rs:1056 msgid "Unable to access dropped files" msgstr "Nepavykta pasiekti numestų failų" #: src/window.rs:1149 msgid "{} minute" msgid_plural "{} minutes" msgstr[0] "{} minutė" msgstr[1] "{} minutės" msgstr[2] "{} minučių" #: src/window.rs:1160 msgid "{hours} hour {minutes} remaining" msgid_plural "{hours} hours {minutes} remaining" msgstr[0] "{} minutė" msgstr[1] "{} minutės" msgstr[2] "{} minučių" #. Translators: the '{}' must be left unmodified, and #. it will be replaced by the number of minutes remaining #. in the playlist #: src/window.rs:1170 msgid "{} minute remaining" msgid_plural "{} minutes remaining" msgstr[0] "Liko {} minutė" msgstr[1] "Liko {} minutės" msgstr[2] "Liko {} minučių" #: src/window.rs:1286 msgid "No song selected" msgstr "Jokia daina nepasirinkta" #. Translators: The '{}' must be left unmodified, and #. it is expanded to the number of songs selected #: src/window.rs:1291 msgid "{} song selected" msgid_plural "{} songs selected" msgstr[0] "Pasirinkta {} daina" msgstr[1] "Pasirinktos {} dainos" msgstr[2] "Pasirinktos {} dainų" #. Translators: `{title}` and `{artist}` must be left #. untranslated; they will expand to the title and #. artist of the currently playing song, respectively #: src/window.rs:1344 msgid "Currently playing “{title}” by “{artist}”" msgstr "Dabar grojama „{artist}“ „{title}“" #~ msgid "Add File" #~ msgstr "Pridėti failą" #~ msgid "Plays music and nothing else" #~ msgstr "Groja muziką ir nieko daugiau" #~ msgid "Amberol cannot run in the background" #~ msgstr "Amberol negali veikti fone" amberol-0.10.3/po/meson.build000066400000000000000000000004661443320625200160030ustar00rootroot00000000000000# SPDX-FileCopyrightText: 2022 Emmanuele Bassi # SPDX-License-Identifier: GPL-3.0-or-later i18n.gettext( 'amberol', args: [ '--keyword=i18n', '--keyword=i18n_f', '--keyword=i18n_k', '--keyword=ni18n:1,2', '--keyword=ni18n_f:1,2', '--keyword=ni18n_k:1,2', ], preset: 'glib', ) amberol-0.10.3/po/ne.po000066400000000000000000000313521443320625200146010ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # msgid "" msgstr "" "Project-Id-Version: Nepali Gnome Translation\n" "Report-Msgid-Bugs-To: https://gitlab.gnome.org/World/amberol/issues\n" "POT-Creation-Date: 2022-06-13 17:32+0000\n" "PO-Revision-Date: 2022-06-15 16:18+0545\n" "Last-Translator: \n" "Language-Team: Nepali \n" "Language: ne\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: Poedit 3.1\n" #: data/io.bassi.Amberol.desktop.in.in:3 #: data/io.bassi.Amberol.appdata.xml.in.in:6 msgid "Amberol" msgstr "" #: data/io.bassi.Amberol.desktop.in.in:4 msgid "Music Player" msgstr "सङ्गीत बजाउने" #. Translators: Search terms to find this application. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! #: data/io.bassi.Amberol.desktop.in.in:12 msgid "music;sound;player;media;audio;playlist;" msgstr "" #: data/io.bassi.Amberol.appdata.xml.in.in:7 #, fuzzy msgid "Plays music, and nothing else" msgstr "यहाँ अरु केही गर्न सकिदैन" #: data/io.bassi.Amberol.appdata.xml.in.in:9 msgid "" "Amberol is a music player with no delusions of grandeur. If you just want to " "play music available on your local system then Amberol is the music player " "you are looking for." msgstr "" #: data/io.bassi.Amberol.appdata.xml.in.in:14 #, fuzzy msgid "Current features:" msgstr "विशेषता:" #: data/io.bassi.Amberol.appdata.xml.in.in:16 #, fuzzy msgid "adaptive UI" msgstr "अनुकूल गर्नुहोस्" #: data/io.bassi.Amberol.appdata.xml.in.in:17 msgid "UI recoloring using the album art" msgstr "" #: data/io.bassi.Amberol.appdata.xml.in.in:18 msgid "drag and drop support to queue songs" msgstr "" #: data/io.bassi.Amberol.appdata.xml.in.in:19 #, fuzzy msgid "shuffle and repeat" msgstr "फिट्नुहोस्/दोहोर्याउनुस् बन्द" #: data/io.bassi.Amberol.appdata.xml.in.in:20 #, fuzzy msgid "MPRIS integration" msgstr "प्रणाली एकीकरण" #: data/io.bassi.Amberol.appdata.xml.in.in:41 msgid "Emmanuele Bassi" msgstr "" #: src/audio/inhibit_controller.rs:42 #, fuzzy msgid "Playback in progress" msgstr "प्रगति हुँदैछ" #: src/audio/song.rs:309 msgid "Unknown artist" msgstr "अज्ञात कलाकार" #: src/audio/song.rs:316 msgid "Unknown title" msgstr "अज्ञात शीर्षक" #: src/audio/song.rs:323 msgid "Unknown album" msgstr "अज्ञात एल्बम" #: src/gtk/help-overlay.ui:11 msgctxt "shortcut window" msgid "General" msgstr "सामान्य" #: src/gtk/help-overlay.ui:14 #, fuzzy msgctxt "shortcut window" msgid "Toggle primary menu" msgstr "मुख्य मेनु" #: src/gtk/help-overlay.ui:20 #, fuzzy msgctxt "shortcut window" msgid "Copy song details to the clipboard" msgstr "चयन गरिएको पाठलाई क्लिपबोर्डमा प्रतिलिपि बनाउनुहोस्" #: src/gtk/help-overlay.ui:26 msgctxt "shortcut window" msgid "Show Shortcuts" msgstr "सर्टकट देखाउनुहोस्" #: src/gtk/help-overlay.ui:32 msgctxt "shortcut window" msgid "Quit" msgstr "अन्त्य गर्नुहोस्" #: src/gtk/help-overlay.ui:40 #, fuzzy msgctxt "shortcut window" msgid "Playlist" msgstr "बजाउने सूची" #: src/gtk/help-overlay.ui:43 #, fuzzy msgctxt "shortcut window" msgid "Add a song to the playlist" msgstr "बजाइने सुचिमा थप्नुहोस्…" #: src/gtk/help-overlay.ui:49 #, fuzzy msgctxt "shortcut window" msgid "Add a folder to the playlist" msgstr "बजाइने सुचिमा थप्नुहोस्…" #: src/gtk/help-overlay.ui:55 #, fuzzy msgctxt "shortcut window" msgid "Clear the playlist" msgstr "खाली गर्नुहोस्" #: src/gtk/help-overlay.ui:61 #, fuzzy msgctxt "shortcut window" msgid "Toggle the playlist pane" msgstr "बजाउने सूची" #: src/gtk/help-overlay.ui:69 msgctxt "shortcut window" msgid "Playback" msgstr "प्लेब्याक" #: src/gtk/help-overlay.ui:72 #, fuzzy msgctxt "shortcut window" msgid "Toggle Play/Pause" msgstr "प्लेब्याक सुरु गर्न बाइन्डिङ (वा प्ले/पज टगल गर्नुहोस्) ।." #: src/gtk/help-overlay.ui:78 msgctxt "shortcut window" msgid "Previous song" msgstr "_अघिल्लो गीत" #: src/gtk/help-overlay.ui:84 msgctxt "shortcut window" msgid "Next song" msgstr "अर्को गीत" #: src/gtk/help-overlay.ui:90 #, fuzzy msgctxt "shortcut window" msgid "Seek backwards in the current song" msgstr "पछाडि खोजी गर्नुहोस्" #: src/gtk/help-overlay.ui:96 #, fuzzy msgctxt "shortcut window" msgid "Seek forward in the current song" msgstr "हालको ट्रयाकमा अगाडि फड्काउनका लागि स्थिर बाइन्डिङ ।" #: src/gtk/playback-control.ui:30 #, fuzzy msgctxt "a11y" msgid "Elapsed time" msgstr "सही स्टपवाचसँग बितेको समय मापन गर्नुहोस्" #: src/gtk/playback-control.ui:42 #, fuzzy msgctxt "a11y" msgid "Remaining time" msgstr "%s बाकि छ" #: src/gtk/playback-control.ui:64 #, fuzzy msgid "Play the previous song" msgstr "_अघिल्लो गीत" #: src/gtk/playback-control.ui:69 #, fuzzy msgctxt "a11y" msgid "Skip backwards" msgstr "पछाडि पनि खोज्ने ।" #: src/gtk/playback-control.ui:78 #, fuzzy msgid "Toggle play" msgstr "प्लेब्याक सुरु गर्न बाइन्डिङ (वा प्ले/पज टगल गर्नुहोस्) ।." #: src/gtk/playback-control.ui:84 #, fuzzy msgctxt "a11y" msgid "Toggle play" msgstr "प्लेब्याक सुरु गर्न बाइन्डिङ (वा प्ले/पज टगल गर्नुहोस्) ।." #: src/gtk/playback-control.ui:93 #, fuzzy msgid "Play the next song" msgstr "अर्को गीत" #: src/gtk/playback-control.ui:98 #, fuzzy msgctxt "a11y" msgid "Skip forward" msgstr "हालको ट्रयाकमा अगाडि फड्काउनका लागि स्थिर बाइन्डिङ ।" #: src/gtk/playback-control.ui:121 #, fuzzy msgid "Toggle playlist" msgstr "बजाउने सूची" #: src/gtk/playback-control.ui:126 #, fuzzy msgctxt "a11y" msgid "Toggle playlist" msgstr "बजाउने सूची" #: src/gtk/playback-control.ui:135 #, fuzzy msgid "Shuffle the playlist" msgstr "बजाउने सूची" #: src/gtk/playback-control.ui:137 msgctxt "a11y" msgid "Shuffle" msgstr "फिट्नुहोस्" #: src/gtk/playback-control.ui:156 src/playback_control.rs:153 #, fuzzy msgid "Enable repeat" msgstr "नदोहो-याउनु" #: src/gtk/playback-control.ui:161 msgctxt "a11y" msgid "Repeat" msgstr "दोहो-याउनु" #: src/gtk/playback-control.ui:176 #, fuzzy msgctxt "a11y" msgid "Primary menu" msgstr "मुख्य मेनु" #: src/gtk/playback-control.ui:192 msgid "Copy" msgstr "प्रतिलपि गर्नुहोस्" #: src/gtk/playback-control.ui:198 #, fuzzy msgid "Add _Song" msgstr "{} गीत" #: src/gtk/playback-control.ui:202 #, fuzzy msgid "Add _Folder" msgstr "फोल्डर थप्नुहोस्" #: src/gtk/playback-control.ui:206 msgid "Clear" msgstr "खाली गर्नुहोस्" #: src/gtk/playback-control.ui:212 #, fuzzy msgid "_Match Cover Art" msgstr "आवरण" #: src/gtk/playback-control.ui:218 msgid "_Keyboard Shortcuts" msgstr "कुञ्जीपाटी सटकर्ट" #: src/gtk/playback-control.ui:222 #, fuzzy msgid "_About Amberol" msgstr "बारेमा" #: src/gtk/playlist-view.ui:19 #, fuzzy msgid "Playlist" msgstr "बजाउने सूची" #: src/gtk/playlist-view.ui:49 #, fuzzy msgid "Select songs in the playlist" msgstr "सूचिचयन गर्नुहोस्" #: src/gtk/playlist-view.ui:62 #, fuzzy msgid "Close the playlist" msgstr "बजाउने सूची" #: src/gtk/playlist-view.ui:111 #, fuzzy msgid "Select all songs" msgstr "सबै चयन गर्नुहोस्" #: src/gtk/playlist-view.ui:124 #, fuzzy msgid "Remove selected songs" msgstr "{} गीतहरू छानियो" #: src/gtk/window.ui:12 msgid "Drop a song to add it to the queue" msgstr "" #: src/gtk/window.ui:48 msgid "" "Select a file or a folder, or drag files from your file manager to the " "application window to add songs to the playlist" msgstr "" #: src/gtk/window.ui:57 msgid "Add Folder" msgstr "फोल्डर थप्नुहोस्" #: src/gtk/window.ui:67 #, fuzzy msgid "Add File" msgstr "फाइल थप्नुहोस्" #: src/application.rs:142 #, fuzzy msgid "Plays music and nothing else" msgstr "यहाँ अरु केही गर्न सकिदैन" #. Translators: Replace "translator-credits" with your names, one name per line #: src/application.rs:148 msgid "translator-credits" msgstr "" "translator-credits Pawan Chitrakar ,Jyotsna Shrestha " ", Nabin Gautam" #: src/playback_control.rs:157 #, fuzzy msgid "Repeat all tracks" msgstr "सबै दोहोर्याउनुस्" #: src/playback_control.rs:161 #, fuzzy msgid "Repeat the current track" msgstr "दोहोर्याउनुहोस्" #: src/window.rs:385 #, fuzzy msgid "_Add Song" msgstr "{} गीत" #: src/window.rs:386 src/window.rs:420 msgid "_Cancel" msgstr "रद्द गर्नुहोस्" #: src/window.rs:388 msgid "Open File" msgstr "फाइल खोल्नुहोस्" #: src/window.rs:394 msgid "Audio files" msgstr "ध्वनि फाइल" #: src/window.rs:419 #, fuzzy msgid "_Add Folder" msgstr "फोल्डर थप्नुहोस्" #: src/window.rs:422 msgid "Open Folder" msgstr "फोल्डर खोल्नुहोस्" #: src/window.rs:439 src/window.rs:452 src/window.rs:922 #, fuzzy msgid "No available song found" msgstr "{} गीत" #. Translators: '{}' must be left unmodified; it #. will expand to a file name #: src/window.rs:481 #, fuzzy msgid "“{}” is not a supported audio file" msgstr "फाइल समर्थित छैन (चयन फाईल %i)" #: src/window.rs:493 #, fuzzy msgid "Added a new song" msgstr "{} गीत" #: src/window.rs:494 msgid "Play" msgstr "प्ले गर्नुहोस्" #: src/window.rs:537 #, fuzzy msgid "No songs found" msgstr "{} गीतहरू" #. Translators: the `{}` must be left unmodified; #. it will be expanded to the number of songs added #. to the playlist #: src/window.rs:556 src/window.rs:940 #, fuzzy msgid "Added one song" msgid_plural "Added {} songs" msgstr[0] "{} गीत" msgstr[1] "{} गीतहरू" #. Translators: The '{}' must be left unmodified; #. it will expand to a file name #: src/window.rs:573 #, fuzzy msgid "Unrecognized file type for “{}”" msgstr "पहिचान नभएको छवि फाइल ढाँचा" #. Translators: the '{}' must be left unmodified, and #. it will be replaced by the number of minutes remaining #. in the playlist #: src/window.rs:976 #, fuzzy msgid "{} minute remaining" msgid_plural "{} minutes remaining" msgstr[0] "{} मिनेट" msgstr[1] "%s बाकि छ" #: src/window.rs:1102 #, fuzzy msgid "No song selected" msgstr "{} गीत छानियो" #. Translators: The '{}' must be left unmodified, and #. it is expanded to the number of songs selected #: src/window.rs:1107 #, fuzzy msgid "{} song selected" msgid_plural "{} songs selected" msgstr[0] "{} गीत छानियो" msgstr[1] "{} गीतहरू छानियो" #. Translators: `{title}` and `{artist}` must be left #. untranslated; they will expand to the title and #. artist of the currently playing song, respectively #: src/window.rs:1158 msgid "Currently playing “{title}” by “{artist}”" msgstr "" #: src/window.rs:1185 msgid "Amberol needs to run in the background to play music" msgstr "" #: src/window.rs:1194 #, fuzzy msgid "Amberol is running in the background" msgstr "\"%s\" पृष्ठभूमिमा चलिरहेको छ" #: src/window.rs:1198 #, fuzzy msgid "Amberol cannot run in the background" msgstr "पृष्ठभूमि मा चलाउनुहोस्" amberol-0.10.3/po/nl.po000066400000000000000000000311231443320625200146040ustar00rootroot00000000000000# Dutch translation for amberol. # Copyright (C) 2022 amberol's COPYRIGHT HOLDER # This file is distributed under the same license as the amberol package. # Philip Goto , 2022. # Nathan Follens , 2022. # msgid "" msgstr "" "Project-Id-Version: amberol main\n" "Report-Msgid-Bugs-To: https://gitlab.gnome.org/World/amberol/issues\n" "POT-Creation-Date: 2022-09-28 20:25+0000\n" "PO-Revision-Date: 2022-11-02 18:43+0100\n" "Last-Translator: Nathan Follens \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: Poedit 3.1.1\n" #: data/io.bassi.Amberol.desktop.in.in:3 #: data/io.bassi.Amberol.appdata.xml.in.in:6 msgid "Amberol" msgstr "Amberol" #: data/io.bassi.Amberol.desktop.in.in:4 msgid "Music Player" msgstr "Muziekspeler" #. Translators: Search terms to find this application. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! #: data/io.bassi.Amberol.desktop.in.in:12 msgid "music;player;media;audio;playlist;" msgstr "muziek;music;speler;player;media;audio;afspeellijst;playlist;" #: data/io.bassi.Amberol.appdata.xml.in.in:7 msgid "Plays music, and nothing else" msgstr "Speelt muziek af, en niets anders" #: data/io.bassi.Amberol.appdata.xml.in.in:9 msgid "" "Amberol is a music player with no delusions of grandeur. If you just want to " "play music available on your local system then Amberol is the music player " "you are looking for." msgstr "" "Amberol is een muziekspeler zonder grootheidswaanzin. Als u alleen muziek " "wilt afspelen die beschikbaar is op uw lokale systeem, dan is Amberol de " "muziekspeler die u zoekt." #: data/io.bassi.Amberol.appdata.xml.in.in:14 msgid "Current features:" msgstr "Huidige functies:" #: data/io.bassi.Amberol.appdata.xml.in.in:16 msgid "adaptive UI" msgstr "adaptieve gebruikersinterface" #: data/io.bassi.Amberol.appdata.xml.in.in:17 msgid "UI recoloring using the album art" msgstr "interfacekleuring gebruikmakend van de albumhoes" #: data/io.bassi.Amberol.appdata.xml.in.in:18 msgid "drag and drop support to queue songs" msgstr "" "ondersteuning voor slepen en neerzetten om nummers in de wachtrij te plaatsen" #: data/io.bassi.Amberol.appdata.xml.in.in:19 msgid "shuffle and repeat" msgstr "in willekeurige volgorde afspelen en herhalen" #: data/io.bassi.Amberol.appdata.xml.in.in:20 msgid "MPRIS integration" msgstr "MPRIS-integratie" #: data/io.bassi.Amberol.appdata.xml.in.in:41 msgid "Emmanuele Bassi" msgstr "Emmanuele Bassi" #: src/audio/inhibit_controller.rs:40 msgid "Playback in progress" msgstr "Bezig met afspelen" #: src/audio/song.rs:328 msgid "Unknown artist" msgstr "Onbekende artiest" #: src/audio/song.rs:335 msgid "Unknown title" msgstr "Onbekende titel" #: src/audio/song.rs:342 msgid "Unknown album" msgstr "Onbekend album" #: src/gtk/help-overlay.ui:11 msgctxt "shortcut window" msgid "General" msgstr "Algemeen" #: src/gtk/help-overlay.ui:14 msgctxt "shortcut window" msgid "Toggle primary menu" msgstr "Primair menu omschakelen" #: src/gtk/help-overlay.ui:20 msgctxt "shortcut window" msgid "Copy song details to the clipboard" msgstr "Nummerdetails naar het klembord kopiëren" #: src/gtk/help-overlay.ui:26 msgctxt "shortcut window" msgid "Show Shortcuts" msgstr "Sneltoetsen tonen" #: src/gtk/help-overlay.ui:32 msgctxt "shortcut window" msgid "Quit" msgstr "Afsluiten" #: src/gtk/help-overlay.ui:40 msgctxt "shortcut window" msgid "Playlist" msgstr "Afspeellijst" #: src/gtk/help-overlay.ui:43 msgctxt "shortcut window" msgid "Add a song to the playlist" msgstr "Een nummer aan de afspeellijst toevoegen" #: src/gtk/help-overlay.ui:49 msgctxt "shortcut window" msgid "Add a folder to the playlist" msgstr "Een map aan de afspeellijst toevoegen" #: src/gtk/help-overlay.ui:55 msgctxt "shortcut window" msgid "Clear the playlist" msgstr "De afspeellijst wissen" #: src/gtk/help-overlay.ui:61 msgctxt "shortcut window" msgid "Toggle the playlist pane" msgstr "Het afspeellijstpaneel omschakelen" #: src/gtk/help-overlay.ui:67 msgctxt "shortcut window" msgid "Toggle shuffling songs" msgstr "Nummers in willekeurige volgorde afspelen omschakelen" #: src/gtk/help-overlay.ui:75 msgctxt "shortcut window" msgid "Playback" msgstr "Afspelen" #: src/gtk/help-overlay.ui:78 msgctxt "shortcut window" msgid "Toggle Play/Pause" msgstr "Afspelen/pauzeren" #: src/gtk/help-overlay.ui:84 msgctxt "shortcut window" msgid "Previous song" msgstr "Vorig nummer" #: src/gtk/help-overlay.ui:90 msgctxt "shortcut window" msgid "Next song" msgstr "Volgend nummer" #: src/gtk/help-overlay.ui:96 msgctxt "shortcut window" msgid "Seek backwards in the current song" msgstr "Achterwaarts zoeken in het huidige nummer" #: src/gtk/help-overlay.ui:102 msgctxt "shortcut window" msgid "Seek forward in the current song" msgstr "Voorwaarts zoeken in het huidige nummer" #: src/gtk/playback-control.ui:30 msgctxt "a11y" msgid "Elapsed time" msgstr "Verstreken tijd" #: src/gtk/playback-control.ui:42 msgctxt "a11y" msgid "Remaining time" msgstr "Resterende tijd" #: src/gtk/playback-control.ui:64 msgid "Play the Previous Song" msgstr "Vorig nummer afspelen" #: src/gtk/playback-control.ui:69 msgctxt "a11y" msgid "Skip backwards" msgstr "Achteruitspoelen" #: src/gtk/playback-control.ui:78 msgid "Toggle Play" msgstr "Afspelen omschakelen" #: src/gtk/playback-control.ui:84 msgctxt "a11y" msgid "Toggle play" msgstr "Afspelen omschakelen" #: src/gtk/playback-control.ui:93 msgid "Play the Next Song" msgstr "Volgend nummer afspelen" #: src/gtk/playback-control.ui:98 msgctxt "a11y" msgid "Skip forward" msgstr "Vooruitspoelen" #: src/gtk/playback-control.ui:121 msgid "Toggle Playlist" msgstr "Afspeellijst omschakelen" #: src/gtk/playback-control.ui:126 msgctxt "a11y" msgid "Toggle playlist" msgstr "Afspeellijst omschakelen" #: src/gtk/playback-control.ui:135 msgid "Shuffle the Playlist" msgstr "De afspeellijst in willekeurige volgorde afspelen" #: src/gtk/playback-control.ui:137 msgctxt "a11y" msgid "Shuffle" msgstr "In willekeurige volgorde afspelen" #: src/gtk/playback-control.ui:156 src/playback_control.rs:153 msgid "Enable Repeat" msgstr "Herhalen inschakelen" #: src/gtk/playback-control.ui:161 msgctxt "a11y" msgid "Repeat" msgstr "Herhalen" #: src/gtk/playback-control.ui:172 msgid "Main Menu" msgstr "Menu" #: src/gtk/playback-control.ui:177 msgctxt "a11y" msgid "Primary menu" msgstr "Primair menu" #: src/gtk/playback-control.ui:193 msgid "Copy" msgstr "Kopiëren" #: src/gtk/playback-control.ui:199 msgid "Add _Song" msgstr "_Nummer toevoegen" #: src/gtk/playback-control.ui:203 msgid "Add _Folder" msgstr "_Map toevoegen" #: src/gtk/playback-control.ui:207 msgid "Clear" msgstr "Wissen" #: src/gtk/playback-control.ui:213 msgid "_Match Cover Art" msgstr "_Overeenkomen met albumhoes" #: src/gtk/playback-control.ui:219 msgid "_ReplayGain" msgstr "_ReplayGain" #: src/gtk/playback-control.ui:221 msgid "_Album" msgstr "_Album" #: src/gtk/playback-control.ui:226 msgid "_Track" msgstr "_Nummer" #: src/gtk/playback-control.ui:231 msgid "_Off" msgstr "_Uit" #: src/gtk/playback-control.ui:239 msgid "_Keyboard Shortcuts" msgstr "_Sneltoetsen" #: src/gtk/playback-control.ui:243 msgid "_About Amberol" msgstr "_Over Amberol" #: src/gtk/playback-control.ui:247 msgid "_Quit" msgstr "_Afsluiten" #: src/gtk/playlist-view.ui:19 msgid "Playlist" msgstr "Afspeellijst" #: src/gtk/playlist-view.ui:49 msgid "Search Songs in the Playlist" msgstr "Nummers in de afspeellijst zoeken" #: src/gtk/playlist-view.ui:61 msgid "Select Songs in the Playlist" msgstr "Nummers in de afspeellijst selecteren" #: src/gtk/playlist-view.ui:74 msgid "Close the Playlist" msgstr "De afspeellijst sluiten" #: src/gtk/playlist-view.ui:135 msgid "Select All Songs" msgstr "Alle nummers selecteren" #: src/gtk/playlist-view.ui:148 msgid "Remove Selected Songs" msgstr "Geselecteerde nummers verwijderen" #: src/gtk/window.ui:12 msgid "Drop a song to add it to the queue" msgstr "Sleep een nummer hierheen om deze aan de wachtrij toe te voegen" #: src/gtk/window.ui:49 msgid "" "Select a file or a folder, or drag files from your file manager to the " "application window to add songs to the playlist" msgstr "" "Selecteer een bestand of map of sleep bestanden van uw bestandsbeheerder " "naar het toepassingsvenster om nummers aan de afspeellijst toe te voegen" #: src/gtk/window.ui:58 msgid "Add Folder" msgstr "Map toevoegen" #: src/gtk/window.ui:68 msgid "Add File" msgstr "Bestand toevoegen" #. Translators: Replace "translator-credits" with your names, one name per line #: src/application.rs:188 msgid "translator-credits" msgstr "" "Philip Goto\n" "Nathan Follens \n" "\n" "Meer info over Gnome-NL http://nl.gnome.org" #: src/playback_control.rs:157 msgid "Repeat All Tracks" msgstr "Alle nummers herhalen" #: src/playback_control.rs:161 msgid "Repeat the Current Track" msgstr "Het huidige nummer herhalen" #: src/window.rs:409 msgid "_Add Song" msgstr "Nummer _toevoegen" #: src/window.rs:410 src/window.rs:450 msgid "_Cancel" msgstr "_Annuleren" #: src/window.rs:412 msgid "Open File" msgstr "Bestand openen" #: src/window.rs:419 msgid "Audio files" msgstr "Audiobestanden" #: src/window.rs:428 src/window.rs:1276 msgid "Unable to access files" msgstr "Geen toegang tot bestanden" #: src/window.rs:449 msgid "_Add Folder" msgstr "Map _toevoegen" #: src/window.rs:452 msgid "Open Folder" msgstr "Map openen" #: src/window.rs:463 msgid "Unable to access folders" msgstr "Geen toegang tot mappen" #: src/window.rs:475 msgid "No available song found" msgstr "Geen beschikbaar nummer gevonden" #: src/window.rs:523 msgid "No songs found" msgstr "Geen nummers gevonden" #: src/window.rs:549 msgid "Added a new song" msgstr "Nieuw nummer toegevoegd" #: src/window.rs:550 msgid "Play" msgstr "Afspelen" #. Translators: the `{}` must be left unmodified; #. it will be expanded to the number of songs added #. to the playlist #: src/window.rs:559 msgid "Added one song" msgid_plural "Added {} songs" msgstr[0] "Eén nummer toegevoegd" msgstr[1] "{} nummers toegevoegd" #: src/window.rs:1012 msgid "Unable to access dropped files" msgstr "Geen toegang tot ingesleepte bestanden" #: src/window.rs:1106 msgid "{} minute" msgid_plural "{} minutes" msgstr[0] "{} minuut" msgstr[1] "{} minuten" #: src/window.rs:1117 #| msgid "{} minute remaining" #| msgid_plural "{} minutes remaining" msgid "{hours} hour {minutes} remaining" msgid_plural "{hours} hours {minutes} remaining" msgstr[0] "{hours} uur {minutes} resterend" msgstr[1] "{hours} uur {minutes} resterend" #. Translators: the '{}' must be left unmodified, and #. it will be replaced by the number of minutes remaining #. in the playlist #: src/window.rs:1127 msgid "{} minute remaining" msgid_plural "{} minutes remaining" msgstr[0] "{} minuut resterend" msgstr[1] "{} minuten resterend" #: src/window.rs:1256 msgid "No song selected" msgstr "Geen nummers geselecteerd" #. Translators: The '{}' must be left unmodified, and #. it is expanded to the number of songs selected #: src/window.rs:1261 msgid "{} song selected" msgid_plural "{} songs selected" msgstr[0] "{} nummer geselecteerd" msgstr[1] "{} nummers geselecteerd" #. Translators: `{title}` and `{artist}` must be left #. untranslated; they will expand to the title and #. artist of the currently playing song, respectively #: src/window.rs:1314 msgid "Currently playing “{title}” by “{artist}”" msgstr "‘{title}’ door ‘{artist}’ aan het afspelen" #: src/window.rs:1360 msgid "Amberol needs to run in the background to play music" msgstr "" "Amberol moet op de achtergrond uitgevoerd worden om muziek te kunnen afspelen" #: src/window.rs:1373 msgid "Amberol cannot run in the background" msgstr "Amberol kan niet op de achtergrond uitgevoerd worden" #~ msgid "Plays music and nothing else" #~ msgstr "Speelt muziek af en niets anders" #~ msgid "Playing next" #~ msgstr "Hierna afspelen" #~ msgid "“{}” is not a supported audio file" #~ msgstr "‘{}’ is geen ondersteund audiobestand" #~ msgid "Unrecognized file type for “{}”" #~ msgstr "Onbekend bestandstype voor ‘{}’" #~ msgctxt "shortcut window" #~ msgid "Songs Queue" #~ msgstr "Wachtrij" #~ msgctxt "shortcut window" #~ msgid "Queue a Song" #~ msgstr "Nummer in de wachtrij plaatsen" #~ msgctxt "shortcut window" #~ msgid "Queue a Folder" #~ msgstr "Map in de wachtrij plaatsen" #~ msgctxt "shortcut window" #~ msgid "Clear" #~ msgstr "Wissen" #~ msgctxt "shortcut window" #~ msgid "Previous Track" #~ msgstr "Vorig nummer" #~ msgid "Choose a file" #~ msgstr "Kies een bestand" #~ msgid "Choose a folder" #~ msgstr "Kies een map" amberol-0.10.3/po/oc.po000066400000000000000000000322161443320625200146000ustar00rootroot00000000000000# Occitan translation for amberol. # Copyright (C) 2022 amberol's COPYRIGHT HOLDER # This file is distributed under the same license as the amberol package. # Quentin PAGÈS , 2022. # msgid "" msgstr "" "Project-Id-Version: amberol main\n" "Report-Msgid-Bugs-To: https://gitlab.gnome.org/World/amberol/issues\n" "POT-Creation-Date: 2023-04-24 22:31+0000\n" "PO-Revision-Date: 2023-04-28 14:19+0200\n" "Last-Translator: Quentin PAGÈS\n" "Language-Team: Occitan \n" "Language: oc\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: Poedit 3.2.2\n" #: data/io.bassi.Amberol.desktop.in.in:3 #: data/io.bassi.Amberol.appdata.xml.in.in:6 msgid "Amberol" msgstr "Amberol" #: data/io.bassi.Amberol.desktop.in.in:4 msgid "Music Player" msgstr "Lector de musica" #. Translators: Search terms to find this application. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! #: data/io.bassi.Amberol.desktop.in.in:12 msgid "music;player;media;audio;playlist;" msgstr "musica;lector;mèdia;audio;àudio;lista de lectura;" #: data/io.bassi.Amberol.appdata.xml.in.in:7 msgid "Plays music, and nothing else" msgstr "Legís de musica, e pas res mai" #: data/io.bassi.Amberol.appdata.xml.in.in:9 msgid "" "Amberol is a music player with no delusions of grandeur. If you just want to " "play music available on your local system then Amberol is the music player " "you are looking for." msgstr "" "Amberol es un lector àudio sens cap de volontat de grandor. Se volètz sonque " "escotar la musica disponible sus vòstre sistèma local, alara Amberol es lo " "lector àudio que vos fa mestièr." #: data/io.bassi.Amberol.appdata.xml.in.in:14 msgid "Current features:" msgstr "Foncionalitats actualas :" #: data/io.bassi.Amberol.appdata.xml.in.in:16 msgid "adaptive UI" msgstr "interfàcia grafica adaptativa" #: data/io.bassi.Amberol.appdata.xml.in.in:17 msgid "UI recoloring using the album art" msgstr "Adaptacion de las colors segon la cobertura de l’album" #: data/io.bassi.Amberol.appdata.xml.in.in:18 msgid "drag and drop support to queue songs" msgstr "lisar depausar de las cançons dins la fila" #: data/io.bassi.Amberol.appdata.xml.in.in:19 msgid "shuffle and repeat" msgstr "lectura aleatòria e repetetiva" #: data/io.bassi.Amberol.appdata.xml.in.in:20 msgid "MPRIS integration" msgstr "integracion MPRIS" #: data/io.bassi.Amberol.appdata.xml.in.in:42 msgid "Emmanuele Bassi" msgstr "Emmanuele Bassi" #: src/audio/inhibit_controller.rs:40 msgid "Playback in progress" msgstr "Lectura en cors" #: src/audio/song.rs:325 msgid "Unknown artist" msgstr "Artista desconegut" #: src/audio/song.rs:332 msgid "Unknown title" msgstr "Títol desconegut" #: src/audio/song.rs:339 msgid "Unknown album" msgstr "Album desconegut" #: src/gtk/help-overlay.ui:11 msgctxt "shortcut window" msgid "General" msgstr "General" #: src/gtk/help-overlay.ui:14 msgctxt "shortcut window" msgid "Toggle primary menu" msgstr "Afichar / Amagar lo menú principal" #: src/gtk/help-overlay.ui:20 msgctxt "shortcut window" msgid "Copy song details to the clipboard" msgstr "Copiar los detalhs de la cançon al quichapapièrs" #: src/gtk/help-overlay.ui:26 msgctxt "shortcut window" msgid "Show shortcuts" msgstr "Afichar los acorchis" #: src/gtk/help-overlay.ui:32 msgctxt "shortcut window" msgid "Quit" msgstr "Quitar" #: src/gtk/help-overlay.ui:40 msgctxt "shortcut window" msgid "Playlist" msgstr "Lista de lectura" #: src/gtk/help-overlay.ui:43 msgctxt "shortcut window" msgid "Add a song to the playlist" msgstr "Apondre una cançon a la lista de lectura" #: src/gtk/help-overlay.ui:49 msgctxt "shortcut window" msgid "Add a folder to the playlist" msgstr "Apondre un dossièr a la lista de lectura" #: src/gtk/help-overlay.ui:55 msgctxt "shortcut window" msgid "Clear the playlist" msgstr "Escafar la lista de lectura" #: src/gtk/help-overlay.ui:61 msgctxt "shortcut window" msgid "Toggle the playlist pane" msgstr "Bascular lo panèl de la lista de lectura" #: src/gtk/help-overlay.ui:67 msgctxt "shortcut window" msgid "Toggle shuffling songs" msgstr "Alternar lectura aleatòria" #: src/gtk/help-overlay.ui:75 msgctxt "shortcut window" msgid "Playback" msgstr "Lectura" #: src/gtk/help-overlay.ui:78 msgctxt "shortcut window" msgid "Toggle play/pause" msgstr "Alternar lectura/pausa" #: src/gtk/help-overlay.ui:84 msgctxt "shortcut window" msgid "Previous song" msgstr "Cançon precedenta" #: src/gtk/help-overlay.ui:90 msgctxt "shortcut window" msgid "Next song" msgstr "Cançon seguenta" #: src/gtk/help-overlay.ui:96 msgctxt "shortcut window" msgid "Seek backwards in the current song" msgstr "Anar en arrièr dins la cançon actuala" #: src/gtk/help-overlay.ui:102 msgctxt "shortcut window" msgid "Seek forward in the current song" msgstr "Avançar dins la cançon actuala" #: src/gtk/playback-control.ui:21 msgid "Play the Previous Song" msgstr "Legir la cançon precedenta" #: src/gtk/playback-control.ui:26 msgctxt "a11y" msgid "Skip backwards" msgstr "Retorn arrièr" #: src/gtk/playback-control.ui:35 msgid "Toggle Play" msgstr "Bascular la lectura" #: src/gtk/playback-control.ui:41 msgctxt "a11y" msgid "Toggle play" msgstr "Alternar la lectura" #: src/gtk/playback-control.ui:50 msgid "Play the Next Song" msgstr "Legir la cançon seguenta" #: src/gtk/playback-control.ui:55 msgctxt "a11y" msgid "Skip forward" msgstr "Avançar" #: src/gtk/playback-control.ui:78 msgid "Toggle Playlist" msgstr "Alternar la lista de lectura" #: src/gtk/playback-control.ui:83 msgctxt "a11y" msgid "Toggle playlist" msgstr "Alternar la lista de lectura" #: src/gtk/playback-control.ui:92 msgid "Shuffle the Playlist" msgstr "Mesclar la lista de lectura" #: src/gtk/playback-control.ui:94 msgctxt "a11y" msgid "Shuffle" msgstr "Aleatòri" #: src/gtk/playback-control.ui:113 src/playback_control.rs:114 msgid "Enable Repeat" msgstr "Activa la lectura en bocla" #: src/gtk/playback-control.ui:118 msgctxt "a11y" msgid "Repeat" msgstr "Repetir" #: src/gtk/playback-control.ui:129 msgid "Main Menu" msgstr "Menú principal" #: src/gtk/playback-control.ui:135 msgctxt "a11y" msgid "Primary menu" msgstr "Menú principal" #: src/gtk/playback-control.ui:151 msgid "Copy" msgstr "Copiar" #: src/gtk/playback-control.ui:157 msgid "Add _Song" msgstr "Apondre una _cançon" #: src/gtk/playback-control.ui:161 msgid "Add _Folder" msgstr "Apondre un _dossièr" #: src/gtk/playback-control.ui:165 msgid "Clear" msgstr "Escafar" #: src/gtk/playback-control.ui:171 msgid "_Match Cover Art" msgstr "_Assortir la cobertura" #: src/gtk/playback-control.ui:175 msgid "_Background Playback" msgstr "_Lectura en rèireplan" #: src/gtk/playback-control.ui:181 msgid "_ReplayGain" msgstr "_Volum recomandat" #: src/gtk/playback-control.ui:183 msgctxt "replaygain-menu" msgid "_Album" msgstr "_Album" #: src/gtk/playback-control.ui:188 msgctxt "replaygain-menu" msgid "_Song" msgstr "_Cançon" #: src/gtk/playback-control.ui:193 msgctxt "replaygain-menu" msgid "_Disabled" msgstr "_Desactivat" #: src/gtk/playback-control.ui:201 msgid "_Keyboard Shortcuts" msgstr "_Acorchis de clavièr" #: src/gtk/playback-control.ui:205 msgid "_About Amberol" msgstr "_A prepaus d’Amberol" #: src/gtk/playback-control.ui:209 msgid "_Quit" msgstr "_Quitar" #: src/gtk/playlist-view.ui:19 msgid "Playlist" msgstr "Lista de lectura" #: src/gtk/playlist-view.ui:49 msgid "Search Songs in the Playlist" msgstr "Cercar de cançons dins la lista de lectura" #: src/gtk/playlist-view.ui:61 msgid "Select Songs in the Playlist" msgstr "Seleccionar de cançons dins la lista de lectura" #: src/gtk/playlist-view.ui:74 msgid "Close the Playlist" msgstr "Tampar la lista de lectura" #: src/gtk/playlist-view.ui:135 msgid "Select All Songs" msgstr "Seleccionar totas las cançons" #: src/gtk/playlist-view.ui:148 msgid "Remove Selected Songs" msgstr "Suprimir las cançons seleccionadas" #: src/gtk/window.ui:12 msgid "Drop a song to add it to the playlist" msgstr "Lisar depausar una cançon per l’apondre a la lista de lectura" #: src/gtk/window.ui:49 msgid "" "Select a file or a folder, or drag files from your file manager to the " "application window to add songs to the playlist" msgstr "" "Seleccionatz un fichièr, un dossièr o lisatz depausatz de fichièr del " "gestionari de fichièrs estant cap a la fenèstra de l’aplicacion per apondre " "las cançons a la lista de lectura" #: src/gtk/window.ui:58 msgid "Restore Playlist" msgstr "Restaurar la lista de lectura" #: src/gtk/window.ui:68 msgid "Add Folder" msgstr "Apondre un dossièr" #: src/gtk/window.ui:77 msgid "Add Song" msgstr "Apondre una cançon" #: src/gtk/window.ui:161 msgctxt "a11y" msgid "Elapsed time" msgstr "Temps passat" #: src/gtk/window.ui:173 msgctxt "a11y" msgid "Remaining time" msgstr "Temps restant" #. Translators: Replace "translator-credits" with your names, one name per line #: src/application.rs:227 msgid "translator-credits" msgstr "Quentin PAGÈS" #: src/application.rs:239 msgid "Amberol needs to run in the background to play music" msgstr "Amberol deu s’executar en rèireplan per legir de musica" #: src/playback_control.rs:118 msgid "Repeat All Songs" msgstr "Repetir totas las cançons" #: src/playback_control.rs:122 msgid "Repeat the Current Song" msgstr "Repetir la cançon actuala" #: src/window.rs:403 msgid "_Add Song" msgstr "Apondre una _cançon" #: src/window.rs:404 src/window.rs:444 msgid "_Cancel" msgstr "_Anullar" #: src/window.rs:406 msgid "Open File" msgstr "Dobrir fichièr" #: src/window.rs:413 msgid "Audio files" msgstr "Fichièrs àudio" #: src/window.rs:422 src/window.rs:1315 msgid "Unable to access files" msgstr "Impossible d'accedir als fichièrs" #: src/window.rs:443 msgid "_Add Folder" msgstr "Apondre un _dossièr" #: src/window.rs:446 msgid "Open Folder" msgstr "Dobrir dossièr" #: src/window.rs:457 msgid "Unable to access folders" msgstr "Impossible d'accedir als dossièrs" #: src/window.rs:475 msgid "No available song found" msgstr "Cap de cançon disponibla pas trobada" #: src/window.rs:532 msgid "No songs found" msgstr "Cap de cançon pas trobada" #: src/window.rs:562 msgid "Added a new song" msgstr "Una cançon novèla aponduda" #: src/window.rs:563 msgid "Play" msgstr "Lectura" #. Translators: the `{}` must be left unmodified; #. it will be expanded to the number of songs added #. to the playlist #: src/window.rs:572 msgid "Added one song" msgid_plural "Added {} songs" msgstr[0] "Una cançon aponduda" msgstr[1] "{} cançons apondudas" #: src/window.rs:1062 msgid "Unable to access dropped files" msgstr "Impossible d'accedir als fichièrs depausats" #: src/window.rs:1152 msgid "{} minute" msgid_plural "{} minutes" msgstr[0] "{} minuta" msgstr[1] "{} minutas" #: src/window.rs:1163 msgid "{hours} hour {minutes} remaining" msgid_plural "{hours} hours {minutes} remaining" msgstr[0] "demòran {hours} ora {minutes}" msgstr[1] "demòran {hours} oras {minutes}" #. Translators: the '{}' must be left unmodified, and #. it will be replaced by the number of minutes remaining #. in the playlist #: src/window.rs:1173 msgid "{} minute remaining" msgid_plural "{} minutes remaining" msgstr[0] "{} minuta restanta" msgstr[1] "{} minutas restantas" #: src/window.rs:1295 msgid "No song selected" msgstr "Cap de cançon pas seleccionada" #. Translators: The '{}' must be left unmodified, and #. it is expanded to the number of songs selected #: src/window.rs:1300 msgid "{} song selected" msgid_plural "{} songs selected" msgstr[0] "{} cançon seleccionada" msgstr[1] "{} cançons seleccionadas" #. Translators: `{title}` and `{artist}` must be left #. untranslated; they will expand to the title and #. artist of the currently playing song, respectively #: src/window.rs:1353 msgid "Currently playing “{title}” by “{artist}”" msgstr "« {title} » per « {artist} » actualament en lectura" #~ msgid "_Track" #~ msgstr "_Pista" #~ msgid "_Off" #~ msgstr "_Desactivat" #~ msgid "Repeat All Tracks" #~ msgstr "Repetir totas las pistas" #~ msgid "Add File" #~ msgstr "Apondre un fichièr" #~ msgid "Amberol cannot run in the background" #~ msgstr "Amberol pòt pas s’executar en rèireplan" #~ msgid "Plays music and nothing else" #~ msgstr "Legís de musica, e pas res mai" #~ msgid "{} hour" #~ msgid_plural "{} hours" #~ msgstr[0] "{} ora" #~ msgstr[1] "{} oras" #~ msgid "“{}” is not a supported audio file" #~ msgstr "« {} » es pas un format àudio pres en carga" #~ msgid "Unrecognized file type for “{}”" #~ msgstr "Tipe de fichièr pas reconegut per « {} »" #~ msgid "Amberol is running in the background" #~ msgstr "Amberol s’executa en rèireplan" #~ msgctxt "shortcut window" #~ msgid "Songs Queue" #~ msgstr "Fila d'espèra" #~ msgctxt "shortcut window" #~ msgid "Queue a Song" #~ msgstr "Metre en espèra una cançon" #~ msgctxt "shortcut window" #~ msgid "Queue a Folder" #~ msgstr "Metre en espèra un dossièr" #~ msgctxt "shortcut window" #~ msgid "Clear" #~ msgstr "Escafar" #~ msgctxt "shortcut window" #~ msgid "Previous Track" #~ msgstr "Pista precedenta" #~ msgid "Playing next" #~ msgstr "Cançon venenta" #~ msgid "Choose a file" #~ msgstr "Causir un fichièr" #~ msgid "Choose a folder" #~ msgstr "Causir un dossièr" amberol-0.10.3/po/pl.po000066400000000000000000000300241443320625200146050ustar00rootroot00000000000000# Polish translation for amberol. # Copyright © 2022-2023 the amberol authors. # This file is distributed under the same license as the amberol package. # Piotr Drąg , 2022-2023. # Aviary.pl , 2022-2023. # msgid "" msgstr "" "Project-Id-Version: amberol\n" "Report-Msgid-Bugs-To: https://gitlab.gnome.org/World/amberol/issues\n" "POT-Creation-Date: 2023-04-24 22:31+0000\n" "PO-Revision-Date: 2023-04-30 12:55+0200\n" "Last-Translator: Piotr Drąg \n" "Language-Team: Polish \n" "Language: pl\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 " "|| n%100>=20) ? 1 : 2);\n" #: data/io.bassi.Amberol.desktop.in.in:3 #: data/io.bassi.Amberol.appdata.xml.in.in:6 msgid "Amberol" msgstr "Amberol" #: data/io.bassi.Amberol.desktop.in.in:4 msgid "Music Player" msgstr "Odtwarzacz muzyki" #. Translators: Search terms to find this application. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! #: data/io.bassi.Amberol.desktop.in.in:12 msgid "music;player;media;audio;playlist;" msgstr "" "muzyka;music;odtwarzacz;player;plejer;media;multimedia;audio;lista " "odtwarzania;playlista;plejlista;MP3;empetrzy;empetrójka;" #: data/io.bassi.Amberol.appdata.xml.in.in:7 msgid "Plays music, and nothing else" msgstr "Odtwarza muzykę i nic ponadto" #: data/io.bassi.Amberol.appdata.xml.in.in:9 msgid "" "Amberol is a music player with no delusions of grandeur. If you just want to " "play music available on your local system then Amberol is the music player " "you are looking for." msgstr "" "Amberol to odtwarzacz muzyki bez megalomanii. Jeśli chcesz tylko odtwarzać " "muzykę dostępną na lokalnym komputerze, to Amberol jest odtwarzaczem muzyki, " "którego szukasz." #: data/io.bassi.Amberol.appdata.xml.in.in:14 msgid "Current features:" msgstr "Obecne funkcje:" #: data/io.bassi.Amberol.appdata.xml.in.in:16 msgid "adaptive UI" msgstr "adaptacyjny interfejs" #: data/io.bassi.Amberol.appdata.xml.in.in:17 msgid "UI recoloring using the album art" msgstr "kolorowanie interfejsu według okładki albumu" #: data/io.bassi.Amberol.appdata.xml.in.in:18 msgid "drag and drop support to queue songs" msgstr "kolejkowanie utworów przez przeciąganie" #: data/io.bassi.Amberol.appdata.xml.in.in:19 msgid "shuffle and repeat" msgstr "mieszanie i powtarzanie" #: data/io.bassi.Amberol.appdata.xml.in.in:20 msgid "MPRIS integration" msgstr "integracja ze standardem MPRIS" #: data/io.bassi.Amberol.appdata.xml.in.in:42 msgid "Emmanuele Bassi" msgstr "Emmanuele Bassi" #: src/audio/inhibit_controller.rs:40 msgid "Playback in progress" msgstr "Trwa odtwarzanie" #: src/audio/song.rs:325 msgid "Unknown artist" msgstr "Nieznany wykonawca" #: src/audio/song.rs:332 msgid "Unknown title" msgstr "Nieznany tytuł" #: src/audio/song.rs:339 msgid "Unknown album" msgstr "Nieznany album" #: src/gtk/help-overlay.ui:11 msgctxt "shortcut window" msgid "General" msgstr "Ogólne" #: src/gtk/help-overlay.ui:14 msgctxt "shortcut window" msgid "Toggle primary menu" msgstr "Przełączenie głównego menu" #: src/gtk/help-overlay.ui:20 msgctxt "shortcut window" msgid "Copy song details to the clipboard" msgstr "Skopiowanie informacji o utworze do schowka" #: src/gtk/help-overlay.ui:26 msgctxt "shortcut window" msgid "Show shortcuts" msgstr "Wyświetlenie skrótów" #: src/gtk/help-overlay.ui:32 msgctxt "shortcut window" msgid "Quit" msgstr "Zakończenie działania" #: src/gtk/help-overlay.ui:40 msgctxt "shortcut window" msgid "Playlist" msgstr "Lista odtwarzania" #: src/gtk/help-overlay.ui:43 msgctxt "shortcut window" msgid "Add a song to the playlist" msgstr "Dodanie utworu do listy odtwarzania" #: src/gtk/help-overlay.ui:49 msgctxt "shortcut window" msgid "Add a folder to the playlist" msgstr "Dodanie katalogu do listy odtwarzania" #: src/gtk/help-overlay.ui:55 msgctxt "shortcut window" msgid "Clear the playlist" msgstr "Wyczyszczenie listy odtwarzania" #: src/gtk/help-overlay.ui:61 msgctxt "shortcut window" msgid "Toggle the playlist pane" msgstr "Przełączenie panelu listy odtwarzania" #: src/gtk/help-overlay.ui:67 msgctxt "shortcut window" msgid "Toggle shuffling songs" msgstr "Przełączenie mieszania utworów" #: src/gtk/help-overlay.ui:75 msgctxt "shortcut window" msgid "Playback" msgstr "Odtwarzanie" #: src/gtk/help-overlay.ui:78 msgctxt "shortcut window" msgid "Toggle play/pause" msgstr "Przełączenie odtwarzania/wstrzymania" #: src/gtk/help-overlay.ui:84 msgctxt "shortcut window" msgid "Previous song" msgstr "Poprzedni utwór" #: src/gtk/help-overlay.ui:90 msgctxt "shortcut window" msgid "Next song" msgstr "Następny utwór" #: src/gtk/help-overlay.ui:96 msgctxt "shortcut window" msgid "Seek backwards in the current song" msgstr "Przewinięcie do tyłu w obecnym utworze" #: src/gtk/help-overlay.ui:102 msgctxt "shortcut window" msgid "Seek forward in the current song" msgstr "Przewinięcie do przodu w obecnym utworze" #: src/gtk/playback-control.ui:21 msgid "Play the Previous Song" msgstr "Odtwarza poprzedni utwór" #: src/gtk/playback-control.ui:26 msgctxt "a11y" msgid "Skip backwards" msgstr "Przejdź do tyłu" #: src/gtk/playback-control.ui:35 msgid "Toggle Play" msgstr "Przełącza odtwarzanie" #: src/gtk/playback-control.ui:41 msgctxt "a11y" msgid "Toggle play" msgstr "Przełącz odtwarzanie" #: src/gtk/playback-control.ui:50 msgid "Play the Next Song" msgstr "Odtwarza następny utwór" #: src/gtk/playback-control.ui:55 msgctxt "a11y" msgid "Skip forward" msgstr "Przejdź do przodu" #: src/gtk/playback-control.ui:78 msgid "Toggle Playlist" msgstr "Przełącza listę odtwarzania" #: src/gtk/playback-control.ui:83 msgctxt "a11y" msgid "Toggle playlist" msgstr "Przełącz listę odtwarzania" #: src/gtk/playback-control.ui:92 msgid "Shuffle the Playlist" msgstr "Miesza listę odtwarzania" #: src/gtk/playback-control.ui:94 msgctxt "a11y" msgid "Shuffle" msgstr "Wymieszaj" #: src/gtk/playback-control.ui:113 src/playback_control.rs:114 msgid "Enable Repeat" msgstr "Włącza powtarzanie" #: src/gtk/playback-control.ui:118 msgctxt "a11y" msgid "Repeat" msgstr "Powtarzaj" #: src/gtk/playback-control.ui:129 msgid "Main Menu" msgstr "Menu główne" #: src/gtk/playback-control.ui:135 msgctxt "a11y" msgid "Primary menu" msgstr "Menu główne" #: src/gtk/playback-control.ui:151 msgid "Copy" msgstr "Skopiuj" #: src/gtk/playback-control.ui:157 msgid "Add _Song" msgstr "Dodaj _utwór" #: src/gtk/playback-control.ui:161 msgid "Add _Folder" msgstr "_Dodaj katalog" #: src/gtk/playback-control.ui:165 msgid "Clear" msgstr "Wyczyść" #: src/gtk/playback-control.ui:171 msgid "_Match Cover Art" msgstr "_Kolor okładki" #: src/gtk/playback-control.ui:175 msgid "_Background Playback" msgstr "_Odtwarzanie w tle" #: src/gtk/playback-control.ui:181 msgid "_ReplayGain" msgstr "_ReplayGain" #: src/gtk/playback-control.ui:183 msgctxt "replaygain-menu" msgid "_Album" msgstr "_Album" #: src/gtk/playback-control.ui:188 msgctxt "replaygain-menu" msgid "_Song" msgstr "_Utwór" #: src/gtk/playback-control.ui:193 msgctxt "replaygain-menu" msgid "_Disabled" msgstr "_Wyłączone" #: src/gtk/playback-control.ui:201 msgid "_Keyboard Shortcuts" msgstr "_Skróty klawiszowe" #: src/gtk/playback-control.ui:205 msgid "_About Amberol" msgstr "_O programie" #: src/gtk/playback-control.ui:209 msgid "_Quit" msgstr "Za_kończ" #: src/gtk/playlist-view.ui:19 msgid "Playlist" msgstr "Lista odtwarzania" #: src/gtk/playlist-view.ui:49 msgid "Search Songs in the Playlist" msgstr "Wyszukuje utwory na liście odtwarzania" #: src/gtk/playlist-view.ui:61 msgid "Select Songs in the Playlist" msgstr "Zaznacza utwory na liście odtwarzania" #: src/gtk/playlist-view.ui:74 msgid "Close the Playlist" msgstr "Zamyka listę odtwarzania" #: src/gtk/playlist-view.ui:135 msgid "Select All Songs" msgstr "Zaznacza wszystkie utwory" #: src/gtk/playlist-view.ui:148 msgid "Remove Selected Songs" msgstr "Usuwa zaznaczone utwory" #: src/gtk/window.ui:12 msgid "Drop a song to add it to the playlist" msgstr "Przeciągnięcie utworu doda go do listy odtwarzania" #: src/gtk/window.ui:49 msgid "" "Select a file or a folder, or drag files from your file manager to the " "application window to add songs to the playlist" msgstr "" "Wybranie pliku lub katalogu albo przeciągnięcie plików z menedżera plików do " "okna programu doda utwory do listy odtwarzania" #: src/gtk/window.ui:58 msgid "Restore Playlist" msgstr "Przywróć listę odtwarzania" #: src/gtk/window.ui:68 msgid "Add Folder" msgstr "Dodaj katalog" #: src/gtk/window.ui:77 msgid "Add Song" msgstr "Dodaj utwór" #: src/gtk/window.ui:161 msgctxt "a11y" msgid "Elapsed time" msgstr "Czas, który upłynął" #: src/gtk/window.ui:173 msgctxt "a11y" msgid "Remaining time" msgstr "Pozostały czas" #. Translators: Replace "translator-credits" with your names, one name per line #: src/application.rs:227 msgid "translator-credits" msgstr "" "Piotr Drąg , 2022-2023\n" "Aviary.pl , 2022-2023" #: src/application.rs:239 msgid "Amberol needs to run in the background to play music" msgstr "Amberol musi działać w tle, aby odtwarzać muzykę" #: src/playback_control.rs:118 msgid "Repeat All Songs" msgstr "Powtarza wszystkie utwory" #: src/playback_control.rs:122 msgid "Repeat the Current Song" msgstr "Powtarza obecny utwór" #: src/window.rs:403 msgid "_Add Song" msgstr "_Dodaj utwór" #: src/window.rs:404 src/window.rs:444 msgid "_Cancel" msgstr "_Anuluj" #: src/window.rs:406 msgid "Open File" msgstr "Otwarcie pliku" #: src/window.rs:413 msgid "Audio files" msgstr "Pliki dźwiękowe" #: src/window.rs:422 src/window.rs:1315 msgid "Unable to access files" msgstr "Nie można otworzyć plików" #: src/window.rs:443 msgid "_Add Folder" msgstr "_Dodaj katalog" #: src/window.rs:446 msgid "Open Folder" msgstr "Otwarcie katalogu" #: src/window.rs:457 msgid "Unable to access folders" msgstr "Nie można otworzyć katalogów" #: src/window.rs:475 msgid "No available song found" msgstr "Nie odnaleziono dostępnego utworu" #: src/window.rs:532 msgid "No songs found" msgstr "Nie odnaleziono żadnych utworów" #: src/window.rs:562 msgid "Added a new song" msgstr "Dodano nowy utwór" #: src/window.rs:563 msgid "Play" msgstr "Odtwórz" #. Translators: the `{}` must be left unmodified; #. it will be expanded to the number of songs added #. to the playlist #: src/window.rs:572 msgid "Added one song" msgid_plural "Added {} songs" msgstr[0] "Dodano jeden utwór" msgstr[1] "Dodano {} utwory" msgstr[2] "Dodano {} utworów" #: src/window.rs:1062 msgid "Unable to access dropped files" msgstr "Nie można otworzyć przeciągniętych plików" #: src/window.rs:1152 msgid "{} minute" msgid_plural "{} minutes" msgstr[0] "{} minuta" msgstr[1] "{} minuty" msgstr[2] "{} minut" #: src/window.rs:1163 msgid "{hours} hour {minutes} remaining" msgid_plural "{hours} hours {minutes} remaining" msgstr[0] "Pozostała {} godzina i {minutes}" msgstr[1] "Pozostały {} godziny i {minutes}" msgstr[2] "Pozostało {} godzin i {minutes}" #. Translators: the '{}' must be left unmodified, and #. it will be replaced by the number of minutes remaining #. in the playlist #: src/window.rs:1173 msgid "{} minute remaining" msgid_plural "{} minutes remaining" msgstr[0] "Pozostała {} minuta" msgstr[1] "Pozostały {} minuty" msgstr[2] "Pozostało {} minut" #: src/window.rs:1295 msgid "No song selected" msgstr "Nie zaznaczono żadnego utworu" #. Translators: The '{}' must be left unmodified, and #. it is expanded to the number of songs selected #: src/window.rs:1300 msgid "{} song selected" msgid_plural "{} songs selected" msgstr[0] "Zaznaczono {} utwór" msgstr[1] "Zaznaczono {} utwory" msgstr[2] "Zaznaczono {} utworów" #. Translators: `{title}` and `{artist}` must be left #. untranslated; they will expand to the title and #. artist of the currently playing song, respectively #: src/window.rs:1353 msgid "Currently playing “{title}” by “{artist}”" msgstr "Odtwarzanie utworu „{title}” — {artist}" amberol-0.10.3/po/pt.po000066400000000000000000000313041443320625200146170ustar00rootroot00000000000000# Portuguese translation for amberol. # Copyright (C) 2022 amberol's COPYRIGHT HOLDER # This file is distributed under the same license as the amberol package. # Hugo Carvalho , 2022, 2023. # msgid "" msgstr "" "Project-Id-Version: amberol main\n" "Report-Msgid-Bugs-To: https://gitlab.gnome.org/World/amberol/issues\n" "POT-Creation-Date: 2023-04-24 22:31+0000\n" "PO-Revision-Date: 2023-05-03 14:04+0100\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: Poedit 3.2.2\n" #: data/io.bassi.Amberol.desktop.in.in:3 #: data/io.bassi.Amberol.appdata.xml.in.in:6 msgid "Amberol" msgstr "Amberol" #: data/io.bassi.Amberol.desktop.in.in:4 msgid "Music Player" msgstr "Reprodutor de música" #. Translators: Search terms to find this application. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! #: data/io.bassi.Amberol.desktop.in.in:12 msgid "music;player;media;audio;playlist;" msgstr "" "música;músicas;music;som;reprodutor;leitor;player;multimédia;áudio;audio;" "lista de reprodução;playlist;" #: data/io.bassi.Amberol.appdata.xml.in.in:7 msgid "Plays music, and nothing else" msgstr "Toca música e nada mais" #: data/io.bassi.Amberol.appdata.xml.in.in:9 msgid "" "Amberol is a music player with no delusions of grandeur. If you just want to " "play music available on your local system then Amberol is the music player " "you are looking for." msgstr "" "O Amberol é um reprodutor de música sem ilusões de grandeza. Se simplesmente " "quer reproduzir as músicas disponíveis no seu sistema local, então o Amberol " "é o reprodutor de música que estava à procura." #: data/io.bassi.Amberol.appdata.xml.in.in:14 msgid "Current features:" msgstr "Funcionalidades atuais:" #: data/io.bassi.Amberol.appdata.xml.in.in:16 msgid "adaptive UI" msgstr "interface adaptável" #: data/io.bassi.Amberol.appdata.xml.in.in:17 msgid "UI recoloring using the album art" msgstr "alteração da cor da interface usando a arte do álbum" #: data/io.bassi.Amberol.appdata.xml.in.in:18 msgid "drag and drop support to queue songs" msgstr "suporte a arrastar e largar para enfileirar músicas" #: data/io.bassi.Amberol.appdata.xml.in.in:19 msgid "shuffle and repeat" msgstr "baralhar e repetir" #: data/io.bassi.Amberol.appdata.xml.in.in:20 msgid "MPRIS integration" msgstr "Integração a MPRIS" #: data/io.bassi.Amberol.appdata.xml.in.in:42 msgid "Emmanuele Bassi" msgstr "Emmanuele Bassi" #: src/audio/inhibit_controller.rs:40 msgid "Playback in progress" msgstr "Reprodução em curso" #: src/audio/song.rs:325 msgid "Unknown artist" msgstr "Artista desconhecido" #: src/audio/song.rs:332 msgid "Unknown title" msgstr "Titulo desconhecido" #: src/audio/song.rs:339 msgid "Unknown album" msgstr "Álbum desconhecido" #: src/gtk/help-overlay.ui:11 msgctxt "shortcut window" msgid "General" msgstr "Geral" #: src/gtk/help-overlay.ui:14 msgctxt "shortcut window" msgid "Toggle primary menu" msgstr "Mostra o menu principal" #: src/gtk/help-overlay.ui:20 msgctxt "shortcut window" msgid "Copy song details to the clipboard" msgstr "Copia os detalhes da música para a área de transferência" #: src/gtk/help-overlay.ui:26 msgctxt "shortcut window" msgid "Show shortcuts" msgstr "Mostrar atalhos" #: src/gtk/help-overlay.ui:32 msgctxt "shortcut window" msgid "Quit" msgstr "Sair" #: src/gtk/help-overlay.ui:40 msgctxt "shortcut window" msgid "Playlist" msgstr "Lista reprodução" #: src/gtk/help-overlay.ui:43 msgctxt "shortcut window" msgid "Add a song to the playlist" msgstr "Adiciona uma música à lista de reprodução" #: src/gtk/help-overlay.ui:49 msgctxt "shortcut window" msgid "Add a folder to the playlist" msgstr "Adiciona uma pasta à lista de reprodução" #: src/gtk/help-overlay.ui:55 msgctxt "shortcut window" msgid "Clear the playlist" msgstr "Limpa a lista de reprodução" #: src/gtk/help-overlay.ui:61 msgctxt "shortcut window" msgid "Toggle the playlist pane" msgstr "Ativa o painel da lista de reprodução" #: src/gtk/help-overlay.ui:67 msgctxt "shortcut window" msgid "Toggle shuffling songs" msgstr "Ativar músicas aleatórias" #: src/gtk/help-overlay.ui:75 msgctxt "shortcut window" msgid "Playback" msgstr "Reproduzir" #: src/gtk/help-overlay.ui:78 msgctxt "shortcut window" msgid "Toggle play/pause" msgstr "Alternar reproduzir/pausa" #: src/gtk/help-overlay.ui:84 msgctxt "shortcut window" msgid "Previous song" msgstr "Música anterior" #: src/gtk/help-overlay.ui:90 msgctxt "shortcut window" msgid "Next song" msgstr "Música seguinte" #: src/gtk/help-overlay.ui:96 msgctxt "shortcut window" msgid "Seek backwards in the current song" msgstr "Retrocede na música atual" #: src/gtk/help-overlay.ui:102 msgctxt "shortcut window" msgid "Seek forward in the current song" msgstr "Avança na música atual" #: src/gtk/playback-control.ui:21 msgid "Play the Previous Song" msgstr "Reproduz a música anterior" #: src/gtk/playback-control.ui:26 msgctxt "a11y" msgid "Skip backwards" msgstr "Recua a reprodução" #: src/gtk/playback-control.ui:35 msgid "Toggle Play" msgstr "Alternar reprodução" #: src/gtk/playback-control.ui:41 msgctxt "a11y" msgid "Toggle play" msgstr "Alternar reprodução" #: src/gtk/playback-control.ui:50 msgid "Play the Next Song" msgstr "Reproduz a música seguinte" #: src/gtk/playback-control.ui:55 msgctxt "a11y" msgid "Skip forward" msgstr "Avança a reprodução" #: src/gtk/playback-control.ui:78 msgid "Toggle Playlist" msgstr "Alternar lista de reprodução" #: src/gtk/playback-control.ui:83 msgctxt "a11y" msgid "Toggle playlist" msgstr "Alternar lista de reprodução" #: src/gtk/playback-control.ui:92 msgid "Shuffle the Playlist" msgstr "Baralhar a lista de reprodução" #: src/gtk/playback-control.ui:94 msgctxt "a11y" msgid "Shuffle" msgstr "Aleatório" #: src/gtk/playback-control.ui:113 src/playback_control.rs:114 msgid "Enable Repeat" msgstr "Ativar repetição" #: src/gtk/playback-control.ui:118 msgctxt "a11y" msgid "Repeat" msgstr "Repetição" #: src/gtk/playback-control.ui:129 msgid "Main Menu" msgstr "Menu principal" #: src/gtk/playback-control.ui:135 msgctxt "a11y" msgid "Primary menu" msgstr "Menu principal" #: src/gtk/playback-control.ui:151 msgid "Copy" msgstr "Copiar" #: src/gtk/playback-control.ui:157 msgid "Add _Song" msgstr "Adicionar mú_sica" #: src/gtk/playback-control.ui:161 msgid "Add _Folder" msgstr "Adicionar _pasta" #: src/gtk/playback-control.ui:165 msgid "Clear" msgstr "Limpar" #: src/gtk/playback-control.ui:171 msgid "_Match Cover Art" msgstr "Co_mbinar arte da capa" #: src/gtk/playback-control.ui:175 msgid "_Background Playback" msgstr "Reprodução em _segundo plano" #: src/gtk/playback-control.ui:181 msgid "_ReplayGain" msgstr "Ganho de repetição" #: src/gtk/playback-control.ui:183 msgctxt "replaygain-menu" msgid "_Album" msgstr "Á_lbum" #: src/gtk/playback-control.ui:188 msgctxt "replaygain-menu" msgid "_Song" msgstr "_Música" #: src/gtk/playback-control.ui:193 msgctxt "replaygain-menu" msgid "_Disabled" msgstr "_Desativado" #: src/gtk/playback-control.ui:201 msgid "_Keyboard Shortcuts" msgstr "_Teclas de atalho" #: src/gtk/playback-control.ui:205 msgid "_About Amberol" msgstr "_Acerca do Amberol" #: src/gtk/playback-control.ui:209 msgid "_Quit" msgstr "_Sair" #: src/gtk/playlist-view.ui:19 msgid "Playlist" msgstr "Lista reprodução" #: src/gtk/playlist-view.ui:49 msgid "Search Songs in the Playlist" msgstr "Procurar músicas na lista de reprodução" #: src/gtk/playlist-view.ui:61 msgid "Select Songs in the Playlist" msgstr "Seleciona músicas na lista de reprodução" #: src/gtk/playlist-view.ui:74 msgid "Close the Playlist" msgstr "Fecha a lista de reprodução" #: src/gtk/playlist-view.ui:135 msgid "Select All Songs" msgstr "Seleciona todas as músicas" #: src/gtk/playlist-view.ui:148 msgid "Remove Selected Songs" msgstr "Remove as músicas selecionadas" #: src/gtk/window.ui:12 msgid "Drop a song to add it to the playlist" msgstr "Largar uma música para a adicionar à lista de reprodução" #: src/gtk/window.ui:49 msgid "" "Select a file or a folder, or drag files from your file manager to the " "application window to add songs to the playlist" msgstr "" "Selecione um ficheiro ou uma pasta, arraste ficheiros do seu gestor de " "ficheiros para a janela da aplicação para adicionar músicas à lista de " "reprodução" #: src/gtk/window.ui:58 msgid "Restore Playlist" msgstr "Restaurar lista de reprodução" #: src/gtk/window.ui:68 msgid "Add Folder" msgstr "Adicionar pasta" #: src/gtk/window.ui:77 msgid "Add Song" msgstr "Adicionar música" #: src/gtk/window.ui:161 msgctxt "a11y" msgid "Elapsed time" msgstr "Tempo decorrido" #: src/gtk/window.ui:173 msgctxt "a11y" msgid "Remaining time" msgstr "Tempo restante" #. Translators: Replace "translator-credits" with your names, one name per line #: src/application.rs:227 msgid "translator-credits" msgstr "Hugo Carvalho " #: src/application.rs:239 msgid "Amberol needs to run in the background to play music" msgstr "" "O Amberol precisa de estar a ser executado em segundo plano para reproduzir " "música" #: src/playback_control.rs:118 msgid "Repeat All Songs" msgstr "Repetir todas as músicas" #: src/playback_control.rs:122 msgid "Repeat the Current Song" msgstr "Repetir a música atual" #: src/window.rs:403 msgid "_Add Song" msgstr "_Adicionar música" #: src/window.rs:404 src/window.rs:444 msgid "_Cancel" msgstr "_Cancelar" #: src/window.rs:406 msgid "Open File" msgstr "Abrir ficheiro" #: src/window.rs:413 msgid "Audio files" msgstr "Ficheiros de áudio" #: src/window.rs:422 src/window.rs:1315 msgid "Unable to access files" msgstr "Impossibilidade de acesso aos ficheiros" #: src/window.rs:443 msgid "_Add Folder" msgstr "_Adicionar pasta" #: src/window.rs:446 msgid "Open Folder" msgstr "Abrir pasta" #: src/window.rs:457 msgid "Unable to access folders" msgstr "Impossibilidade de acesso a pastas" #: src/window.rs:475 msgid "No available song found" msgstr "Nenhuma música disponível encontrada" #: src/window.rs:532 msgid "No songs found" msgstr "Nenhuma música encontrada" #: src/window.rs:562 msgid "Added a new song" msgstr "Adicionada uma nova música" #: src/window.rs:563 msgid "Play" msgstr "Reproduzir" #. Translators: the `{}` must be left unmodified; #. it will be expanded to the number of songs added #. to the playlist #: src/window.rs:572 msgid "Added one song" msgid_plural "Added {} songs" msgstr[0] "Adicionada uma música" msgstr[1] "Adicionadas {} músicas" #: src/window.rs:1062 msgid "Unable to access dropped files" msgstr "Impossibilidade de acesso a ficheiros largados" #: src/window.rs:1152 msgid "{} minute" msgid_plural "{} minutes" msgstr[0] "{} minuto" msgstr[1] "{} minutos" #: src/window.rs:1163 msgid "{hours} hour {minutes} remaining" msgid_plural "{hours} hours {minutes} remaining" msgstr[0] "{hours} hora {minutes} restantes" msgstr[1] "{hours} horas {minutes} restantes" #. Translators: the '{}' must be left unmodified, and #. it will be replaced by the number of minutes remaining #. in the playlist #: src/window.rs:1173 msgid "{} minute remaining" msgid_plural "{} minutes remaining" msgstr[0] "{} minuto restante" msgstr[1] "{} minutos restantes" #: src/window.rs:1295 msgid "No song selected" msgstr "Nenhuma música selecionada" #. Translators: The '{}' must be left unmodified, and #. it is expanded to the number of songs selected #: src/window.rs:1300 msgid "{} song selected" msgid_plural "{} songs selected" msgstr[0] "{} música selecionada" msgstr[1] "{} músicas selecionadas" #. Translators: `{title}` and `{artist}` must be left #. untranslated; they will expand to the title and #. artist of the currently playing song, respectively #: src/window.rs:1353 msgid "Currently playing “{title}” by “{artist}”" msgstr "Atualmente a reproduzir “{title}” de \"{artist}\"." #~ msgid "_Track" #~ msgstr "Faixa" #~ msgid "_Off" #~ msgstr "Desligado" #~ msgid "Repeat All Tracks" #~ msgstr "Repetir todas as faixas" #~ msgid "Add File" #~ msgstr "Adicionar ficheiro" #~ msgid "Plays music and nothing else" #~ msgstr "Reproduz música e nada mais" #~ msgid "Amberol cannot run in the background" #~ msgstr "O Amberol não pode ser executado em segundo plano" #~ msgid "{} hour" #~ msgid_plural "{} hours" #~ msgstr[0] "{} horas" #~ msgstr[1] "{} horas" #~ msgid "“{}” is not a supported audio file" #~ msgstr "“{}” não é um ficheiro de áudio suportado" #~ msgid "Unrecognized file type for “{}”" #~ msgstr "Tipo de ficheiro não reconhecido para “{}”" #~ msgid "Amberol is running in the background" #~ msgstr "O Amberol está a ser executado em segundo plano" amberol-0.10.3/po/pt_BR.po000066400000000000000000000321231443320625200152020ustar00rootroot00000000000000# Brazilian Portuguese translation for amberol. # Copyright (C) 2022 amberol's COPYRIGHT HOLDER # This file is distributed under the same license as the amberol package. # Matheus Barbosa , 2022. # Enrico Nicoletto , 2022. # Rafael Fontenelle , 2022-2023. # msgid "" msgstr "" "Project-Id-Version: amberol main\n" "Report-Msgid-Bugs-To: https://gitlab.gnome.org/World/amberol/issues\n" "POT-Creation-Date: 2023-01-05 10:55+0000\n" "PO-Revision-Date: 2023-01-06 21:49-0300\n" "Last-Translator: Rafael Fontenelle \n" "Language-Team: Brazilian Portuguese \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: Gtranslator 42.0\n" #: data/io.bassi.Amberol.desktop.in.in:3 #: data/io.bassi.Amberol.appdata.xml.in.in:6 msgid "Amberol" msgstr "Amberol" #: data/io.bassi.Amberol.desktop.in.in:4 msgid "Music Player" msgstr "Reprodutor de músicas" #. Translators: Search terms to find this application. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! #: data/io.bassi.Amberol.desktop.in.in:12 msgid "music;player;media;audio;playlist;" msgstr "" "música;músicas;music;som;reprodutor;player;mídia;áudio;audio;lista de " "reprodução;playlist;" #: data/io.bassi.Amberol.appdata.xml.in.in:7 msgid "Plays music, and nothing else" msgstr "Reproduz música, nada mais" #: data/io.bassi.Amberol.appdata.xml.in.in:9 msgid "" "Amberol is a music player with no delusions of grandeur. If you just want to " "play music available on your local system then Amberol is the music player " "you are looking for." msgstr "" "Amberol é um reprodutor de músicas sem ilusões de grandeza. Se você quer " "simplesmente reproduzir as músicas disponíveis em seu sistema local então o " "Amberol é o reprodutor de músicas que você estava procurando." #: data/io.bassi.Amberol.appdata.xml.in.in:14 msgid "Current features:" msgstr "Recursos atuais:" #: data/io.bassi.Amberol.appdata.xml.in.in:16 msgid "adaptive UI" msgstr "interface gráfica adaptável" #: data/io.bassi.Amberol.appdata.xml.in.in:17 msgid "UI recoloring using the album art" msgstr "Mudança da cor da interface usando a arte do álbum" #: data/io.bassi.Amberol.appdata.xml.in.in:18 msgid "drag and drop support to queue songs" msgstr "suporte a arrastar e soltar para enfileirar músicas" #: data/io.bassi.Amberol.appdata.xml.in.in:19 msgid "shuffle and repeat" msgstr "embaralhar e repetir" #: data/io.bassi.Amberol.appdata.xml.in.in:20 msgid "MPRIS integration" msgstr "Integração MPRIS" #: data/io.bassi.Amberol.appdata.xml.in.in:41 msgid "Emmanuele Bassi" msgstr "Emmanuele Bassi" #: src/audio/inhibit_controller.rs:40 msgid "Playback in progress" msgstr "Reprodução em andamento" #: src/audio/song.rs:328 msgid "Unknown artist" msgstr "Artista desconhecido" #: src/audio/song.rs:335 msgid "Unknown title" msgstr "Título desconhecido" #: src/audio/song.rs:342 msgid "Unknown album" msgstr "Álbum desconhecido" #: src/gtk/help-overlay.ui:11 msgctxt "shortcut window" msgid "General" msgstr "Geral" #: src/gtk/help-overlay.ui:14 msgctxt "shortcut window" msgid "Toggle primary menu" msgstr "Mostra o menu primário" #: src/gtk/help-overlay.ui:20 msgctxt "shortcut window" msgid "Copy song details to the clipboard" msgstr "Copia os detalhes da música à área de transferência" #: src/gtk/help-overlay.ui:26 msgctxt "shortcut window" msgid "Show Shortcuts" msgstr "Mostra os atalhos" #: src/gtk/help-overlay.ui:32 msgctxt "shortcut window" msgid "Quit" msgstr "Sai" #: src/gtk/help-overlay.ui:40 msgctxt "shortcut window" msgid "Playlist" msgstr "Lista de reprodução" #: src/gtk/help-overlay.ui:43 msgctxt "shortcut window" msgid "Add a song to the playlist" msgstr "Adiciona uma música à lista de reprodução" #: src/gtk/help-overlay.ui:49 msgctxt "shortcut window" msgid "Add a folder to the playlist" msgstr "Adiciona uma pasta à lista de reprodução" #: src/gtk/help-overlay.ui:55 msgctxt "shortcut window" msgid "Clear the playlist" msgstr "Limpa a lista de reprodução" #: src/gtk/help-overlay.ui:61 msgctxt "shortcut window" msgid "Toggle the playlist pane" msgstr "Mostra o painel de lista de reprodução" #: src/gtk/help-overlay.ui:67 msgctxt "shortcut window" msgid "Toggle shuffling songs" msgstr "Ativa embaralhamento de músicas" #: src/gtk/help-overlay.ui:75 msgctxt "shortcut window" msgid "Playback" msgstr "Reprodução" #: src/gtk/help-overlay.ui:78 msgctxt "shortcut window" msgid "Toggle Play/Pause" msgstr "Alterna Reproduzir/Pausar" #: src/gtk/help-overlay.ui:84 msgctxt "shortcut window" msgid "Previous song" msgstr "Música anterior" #: src/gtk/help-overlay.ui:90 msgctxt "shortcut window" msgid "Next song" msgstr "Próxima música" #: src/gtk/help-overlay.ui:96 msgctxt "shortcut window" msgid "Seek backwards in the current song" msgstr "Retrocede na música atual" #: src/gtk/help-overlay.ui:102 msgctxt "shortcut window" msgid "Seek forward in the current song" msgstr "Avança na música atual" #: src/gtk/playback-control.ui:30 msgctxt "a11y" msgid "Elapsed time" msgstr "Tempo decorrido" #: src/gtk/playback-control.ui:42 msgctxt "a11y" msgid "Remaining time" msgstr "Tempo restante" #: src/gtk/playback-control.ui:64 msgid "Play the Previous Song" msgstr "Reproduz a música anterior" #: src/gtk/playback-control.ui:69 msgctxt "a11y" msgid "Skip backwards" msgstr "Retroceder" #: src/gtk/playback-control.ui:78 msgid "Toggle Play" msgstr "Alterna a reprodução" #: src/gtk/playback-control.ui:84 msgctxt "a11y" msgid "Toggle play" msgstr "Alternar reprodução" #: src/gtk/playback-control.ui:93 msgid "Play the Next Song" msgstr "Reproduz a próxima música" #: src/gtk/playback-control.ui:98 msgctxt "a11y" msgid "Skip forward" msgstr "Avançar" #: src/gtk/playback-control.ui:121 msgid "Toggle Playlist" msgstr "Alterna a lista de reprodução" #: src/gtk/playback-control.ui:126 msgctxt "a11y" msgid "Toggle playlist" msgstr "Alternar lista de reprodução" #: src/gtk/playback-control.ui:135 msgid "Shuffle the Playlist" msgstr "Embaralha a lista de reprodução" #: src/gtk/playback-control.ui:137 msgctxt "a11y" msgid "Shuffle" msgstr "Embaralhar" #: src/gtk/playback-control.ui:156 src/playback_control.rs:153 msgid "Enable Repeat" msgstr "Habilita repetição" #: src/gtk/playback-control.ui:161 msgctxt "a11y" msgid "Repeat" msgstr "Repetir" #: src/gtk/playback-control.ui:172 msgid "Main Menu" msgstr "Menu principal" #: src/gtk/playback-control.ui:178 msgctxt "a11y" msgid "Primary menu" msgstr "Menu primário" #: src/gtk/playback-control.ui:194 msgid "Copy" msgstr "Copiar" #: src/gtk/playback-control.ui:200 msgid "Add _Song" msgstr "Adicionar mú_sica" #: src/gtk/playback-control.ui:204 msgid "Add _Folder" msgstr "Adicionar _pasta" #: src/gtk/playback-control.ui:208 msgid "Clear" msgstr "Limpar" #: src/gtk/playback-control.ui:214 msgid "_Match Cover Art" msgstr "Co_mbinar arte da capa" #: src/gtk/playback-control.ui:220 msgid "_ReplayGain" msgstr "_RepetirGanho" #: src/gtk/playback-control.ui:222 msgid "_Album" msgstr "_Álbum" #: src/gtk/playback-control.ui:227 msgid "_Track" msgstr "_Faixa" #: src/gtk/playback-control.ui:232 msgid "_Off" msgstr "Desligad_o" #: src/gtk/playback-control.ui:240 msgid "_Keyboard Shortcuts" msgstr "A_talhos de teclado" #: src/gtk/playback-control.ui:244 msgid "_About Amberol" msgstr "_Sobre o Amberol" #: src/gtk/playback-control.ui:248 msgid "_Quit" msgstr "_Sair" #: src/gtk/playlist-view.ui:19 msgid "Playlist" msgstr "Lista de reprodução" #: src/gtk/playlist-view.ui:49 msgid "Search Songs in the Playlist" msgstr "Pesquisa músicas na lista de reprodução" #: src/gtk/playlist-view.ui:61 msgid "Select Songs in the Playlist" msgstr "Seleciona músicas na lista de reprodução" #: src/gtk/playlist-view.ui:74 msgid "Close the Playlist" msgstr "Fecha a lista de reprodução" #: src/gtk/playlist-view.ui:135 msgid "Select All Songs" msgstr "Seleciona todas as músicas" #: src/gtk/playlist-view.ui:148 msgid "Remove Selected Songs" msgstr "Remove as músicas selecionadas" #: src/gtk/window.ui:12 msgid "Drop a song to add it to the queue" msgstr "Solte uma música para adicionar à fila" #: src/gtk/window.ui:49 msgid "" "Select a file or a folder, or drag files from your file manager to the " "application window to add songs to the playlist" msgstr "" "Selecione um arquivo ou uma pasta, arraste arquivos do seu gerenciador de " "arquivos para a janela do aplicativo para adicionar músicas à lista de " "reprodução" #: src/gtk/window.ui:58 msgid "Add Folder" msgstr "Adicionar pasta" #: src/gtk/window.ui:68 msgid "Add Song" msgstr "Adicionar música" #. Translators: Replace "translator-credits" with your names, one name per line #: src/application.rs:188 msgid "translator-credits" msgstr "" "Enrico Nicoletto \n" "Matheus Barbosa \n" "Rafael Fontenelle " #: src/playback_control.rs:157 msgid "Repeat All Tracks" msgstr "Repete todas as faixas" #: src/playback_control.rs:161 msgid "Repeat the Current Track" msgstr "Repete a faixa atual" #: src/window.rs:409 msgid "_Add Song" msgstr "_Adicionar música" #: src/window.rs:410 src/window.rs:450 msgid "_Cancel" msgstr "_Cancelar" #: src/window.rs:412 msgid "Open File" msgstr "Abrir arquivo" #: src/window.rs:419 msgid "Audio files" msgstr "Arquivos de áudio" #: src/window.rs:428 src/window.rs:1293 msgid "Unable to access files" msgstr "Não foi possível acessar arquivos" #: src/window.rs:449 msgid "_Add Folder" msgstr "_Adicionar pasta" #: src/window.rs:452 msgid "Open Folder" msgstr "Abrir pasta" #: src/window.rs:463 msgid "Unable to access folders" msgstr "Não foi possível acessar pastas" #: src/window.rs:475 msgid "No available song found" msgstr "Nenhuma música disponível encontrada" #: src/window.rs:532 msgid "No songs found" msgstr "Nenhuma música encontrada" #: src/window.rs:559 msgid "Added a new song" msgstr "Adicionada uma nova música" #: src/window.rs:560 msgid "Play" msgstr "Reproduzir" #. Translators: the `{}` must be left unmodified; #. it will be expanded to the number of songs added #. to the playlist #: src/window.rs:569 msgid "Added one song" msgid_plural "Added {} songs" msgstr[0] "Adicionada uma música" msgstr[1] "Adicionadas {} músicas" #: src/window.rs:1029 msgid "Unable to access dropped files" msgstr "Não foi possível acessar arquivos ignorados" #: src/window.rs:1123 msgid "{} minute" msgid_plural "{} minutes" msgstr[0] "{} minuto" msgstr[1] "{} minutos" #: src/window.rs:1134 msgid "{hours} hour {minutes} remaining" msgid_plural "{hours} hours {minutes} remaining" msgstr[0] "{hours} hora {minutes} restante" msgstr[1] "{hours} horas {minutes} restantes" #. Translators: the '{}' must be left unmodified, and #. it will be replaced by the number of minutes remaining #. in the playlist #: src/window.rs:1144 msgid "{} minute remaining" msgid_plural "{} minutes remaining" msgstr[0] "{} minuto restante" msgstr[1] "{} minutos restantes" #: src/window.rs:1273 msgid "No song selected" msgstr "Nenhuma música selecionada" #. Translators: The '{}' must be left unmodified, and #. it is expanded to the number of songs selected #: src/window.rs:1278 msgid "{} song selected" msgid_plural "{} songs selected" msgstr[0] "{} música selecionada" msgstr[1] "{} músicas selecionadas" #. Translators: `{title}` and `{artist}` must be left #. untranslated; they will expand to the title and #. artist of the currently playing song, respectively #: src/window.rs:1331 msgid "Currently playing “{title}” by “{artist}”" msgstr "Atualmente reproduzindo “{title}” de “{artist}”" #: src/window.rs:1377 msgid "Amberol needs to run in the background to play music" msgstr "Amberol precisa ser executado em segundo plano para reproduzir músicas" #~ msgid "Add File" #~ msgstr "Adicionar arquivo" #~ msgid "Plays music and nothing else" #~ msgstr "Reproduz música e nada mais" #~ msgid "Amberol cannot run in the background" #~ msgstr "Amberol não conseguiu ser executado em segundo plano" #~ msgid "“{}” is not a supported audio file" #~ msgstr "“{}” não é um arquivo de áudio com suporte" #~ msgid "Unrecognized file type for “{}”" #~ msgstr "Tipo de arquivo não reconhecido para “{}”" #~ msgid "Amberol is running in the background" #~ msgstr "Amberol está sendo executado em segundo plano" #~ msgctxt "shortcut window" #~ msgid "Songs Queue" #~ msgstr "Fila de músicas" #~ msgctxt "shortcut window" #~ msgid "Queue a Song" #~ msgstr "Enfileira uma música" #~ msgctxt "shortcut window" #~ msgid "Queue a Folder" #~ msgstr "Enfileira uma pasta" #~ msgctxt "shortcut window" #~ msgid "Clear" #~ msgstr "Limpar" #~ msgctxt "shortcut window" #~ msgid "Previous Track" #~ msgstr "Faixa anterior" #~ msgid "Playing next" #~ msgstr "Reproduzindo a seguir" #~ msgid "Choose a folder" #~ msgstr "Escolha uma pasta" #~ msgctxt "shortcut window" #~ msgid "Seek Backwards" #~ msgstr "Avança" #~ msgctxt "shortcut window" #~ msgid "Seek Forward" #~ msgstr "Retrocede" #~ msgid "Show the playlist" #~ msgstr "Mostrar lista de reprodução" amberol-0.10.3/po/ru.po000066400000000000000000000404561443320625200146320ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # msgid "" msgstr "" "Project-Id-Version: amberol main\n" "Report-Msgid-Bugs-To: https://gitlab.gnome.org/World/amberol/issues\n" "POT-Creation-Date: 2023-04-24 22:31+0000\n" "PO-Revision-Date: 2023-04-25 23:52+1000\n" "Last-Translator: Ser82-png \n" "Language-Team: Русский \n" "Language: ru\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && " "n%10<=4 && (n%100<12 || n%100>14) ? 1 : 2);\n" "X-Generator: Poedit 3.0.1\n" #: data/io.bassi.Amberol.desktop.in.in:3 #: data/io.bassi.Amberol.appdata.xml.in.in:6 msgid "Amberol" msgstr "Amberol" #: data/io.bassi.Amberol.desktop.in.in:4 msgid "Music Player" msgstr "Музыкальный проигрыватель" #. Translators: Search terms to find this application. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! #: data/io.bassi.Amberol.desktop.in.in:12 msgid "music;player;media;audio;playlist;" msgstr "" "music;player;media;audio;playlist;музыка;проигрыватель;медиа;аудио;список " "воспроизведения;" #: data/io.bassi.Amberol.appdata.xml.in.in:7 msgid "Plays music, and nothing else" msgstr "Воспроизводит музыку и ничего больше" #: data/io.bassi.Amberol.appdata.xml.in.in:9 msgid "" "Amberol is a music player with no delusions of grandeur. If you just want to " "play music available on your local system then Amberol is the music player " "you are looking for." msgstr "" "Amberol - это музыкальный проигрыватель без мании величия. Если вы просто " "хотите воспроизводить музыку, доступную в вашей локальной системе, то " "Amberol - это тот музыкальный проигрыватель, который вы ищете." #: data/io.bassi.Amberol.appdata.xml.in.in:14 msgid "Current features:" msgstr "Текущие функции:" #: data/io.bassi.Amberol.appdata.xml.in.in:16 msgid "adaptive UI" msgstr "адаптивный пользовательский интерфейс" #: data/io.bassi.Amberol.appdata.xml.in.in:17 msgid "UI recoloring using the album art" msgstr "" "перекрашивание пользовательского интерфейса с использованием обложки альбома" #: data/io.bassi.Amberol.appdata.xml.in.in:18 msgid "drag and drop support to queue songs" msgstr "поддержка перетаскивания для создания очереди песен" #: data/io.bassi.Amberol.appdata.xml.in.in:19 msgid "shuffle and repeat" msgstr "перемешивание и повторение" #: data/io.bassi.Amberol.appdata.xml.in.in:20 msgid "MPRIS integration" msgstr "интеграция с MPRIS" #: data/io.bassi.Amberol.appdata.xml.in.in:42 msgid "Emmanuele Bassi" msgstr "Emmanuele Bassi" #: src/audio/inhibit_controller.rs:40 msgid "Playback in progress" msgstr "Идет воспроизведение" #: src/audio/song.rs:325 msgid "Unknown artist" msgstr "Неизвестный исполнитель" #: src/audio/song.rs:332 msgid "Unknown title" msgstr "Неизвестное название" #: src/audio/song.rs:339 msgid "Unknown album" msgstr "Неизвестный альбом" #: src/gtk/help-overlay.ui:11 msgctxt "shortcut window" msgid "General" msgstr "Общие" #: src/gtk/help-overlay.ui:14 msgctxt "shortcut window" msgid "Toggle primary menu" msgstr "Показать/Убрать главное меню" #: src/gtk/help-overlay.ui:20 msgctxt "shortcut window" msgid "Copy song details to the clipboard" msgstr "Копировать сведения о песне в буфер обмена" #: src/gtk/help-overlay.ui:26 msgctxt "shortcut window" msgid "Show shortcuts" msgstr "Показать комбинации клавиш" #: src/gtk/help-overlay.ui:32 msgctxt "shortcut window" msgid "Quit" msgstr "Закрыть" #: src/gtk/help-overlay.ui:40 msgctxt "shortcut window" msgid "Playlist" msgstr "Список воспроизведения" #: src/gtk/help-overlay.ui:43 msgctxt "shortcut window" msgid "Add a song to the playlist" msgstr "Добавить песню в список воспроизведения" #: src/gtk/help-overlay.ui:49 msgctxt "shortcut window" msgid "Add a folder to the playlist" msgstr "Добавить папку в список воспроизведения" #: src/gtk/help-overlay.ui:55 msgctxt "shortcut window" msgid "Clear the playlist" msgstr "Очистить список воспроизведения" #: src/gtk/help-overlay.ui:61 msgctxt "shortcut window" msgid "Toggle the playlist pane" msgstr "Показать/Убрать панель списка воспроизведения" #: src/gtk/help-overlay.ui:67 msgctxt "shortcut window" msgid "Toggle shuffling songs" msgstr "Переключение перемешивания песен" #: src/gtk/help-overlay.ui:75 msgctxt "shortcut window" msgid "Playback" msgstr "Воспроизведение" #: src/gtk/help-overlay.ui:78 msgctxt "shortcut window" msgid "Toggle play/pause" msgstr "Переключение воспроизведения/паузы" #: src/gtk/help-overlay.ui:84 msgctxt "shortcut window" msgid "Previous song" msgstr "Предыдущая песня" #: src/gtk/help-overlay.ui:90 msgctxt "shortcut window" msgid "Next song" msgstr "Следующая песня" #: src/gtk/help-overlay.ui:96 msgctxt "shortcut window" msgid "Seek backwards in the current song" msgstr "Перемотка назад в текущей песне" #: src/gtk/help-overlay.ui:102 msgctxt "shortcut window" msgid "Seek forward in the current song" msgstr "Перемотка вперед в текущей песне" #: src/gtk/playback-control.ui:21 msgid "Play the Previous Song" msgstr "Воспроизвести предыдущую песню" #: src/gtk/playback-control.ui:26 msgctxt "a11y" msgid "Skip backwards" msgstr "Перейти назад" #: src/gtk/playback-control.ui:35 msgid "Toggle Play" msgstr "Включить/Остановить воспроизведение" #: src/gtk/playback-control.ui:41 msgctxt "a11y" msgid "Toggle play" msgstr "Включить/Остановить воспроизведение" #: src/gtk/playback-control.ui:50 msgid "Play the Next Song" msgstr "Воспроизвести следующую песню" #: src/gtk/playback-control.ui:55 msgctxt "a11y" msgid "Skip forward" msgstr "Перейти вперед" #: src/gtk/playback-control.ui:78 msgid "Toggle Playlist" msgstr "Показать/Убрать список воспроизведения" #: src/gtk/playback-control.ui:83 msgctxt "a11y" msgid "Toggle playlist" msgstr "Показать/Убрать список воспроизведения" #: src/gtk/playback-control.ui:92 msgid "Shuffle the Playlist" msgstr "Перемешать список воспроизведения" #: src/gtk/playback-control.ui:94 msgctxt "a11y" msgid "Shuffle" msgstr "В случайном порядке" #: src/gtk/playback-control.ui:113 src/playback_control.rs:114 msgid "Enable Repeat" msgstr "Включить повтор" #: src/gtk/playback-control.ui:118 msgctxt "a11y" msgid "Repeat" msgstr "Повторять" #: src/gtk/playback-control.ui:129 msgid "Main Menu" msgstr "Главное меню" #: src/gtk/playback-control.ui:135 msgctxt "a11y" msgid "Primary menu" msgstr "Главное меню" #: src/gtk/playback-control.ui:151 msgid "Copy" msgstr "Копировать" #: src/gtk/playback-control.ui:157 msgid "Add _Song" msgstr "Добавить _песню" #: src/gtk/playback-control.ui:161 msgid "Add _Folder" msgstr "Добавить _папку" #: src/gtk/playback-control.ui:165 msgid "Clear" msgstr "Очистить" #: src/gtk/playback-control.ui:171 msgid "_Match Cover Art" msgstr "_Соответствовать обложке" #: src/gtk/playback-control.ui:175 msgid "_Background Playback" msgstr "_Фоновое воспроизведение" #: src/gtk/playback-control.ui:181 msgid "_ReplayGain" msgstr "_Выравнивание громкости" #: src/gtk/playback-control.ui:183 #| msgid "_Album" msgctxt "replaygain-menu" msgid "_Album" msgstr "_Альбом" #: src/gtk/playback-control.ui:188 #| msgid "Add _Song" msgctxt "replaygain-menu" msgid "_Song" msgstr "_Песня" #: src/gtk/playback-control.ui:193 msgctxt "replaygain-menu" msgid "_Disabled" msgstr "_Отключено" #: src/gtk/playback-control.ui:201 msgid "_Keyboard Shortcuts" msgstr "_Комбинации клавиш" #: src/gtk/playback-control.ui:205 msgid "_About Amberol" msgstr "_О приложении" #: src/gtk/playback-control.ui:209 msgid "_Quit" msgstr "_Закрыть" #: src/gtk/playlist-view.ui:19 msgid "Playlist" msgstr "Список воспроизведения" #: src/gtk/playlist-view.ui:49 msgid "Search Songs in the Playlist" msgstr "Поиск песен в списке воспроизведения" #: src/gtk/playlist-view.ui:61 msgid "Select Songs in the Playlist" msgstr "Выбрать песни в списке воспроизведения" #: src/gtk/playlist-view.ui:74 msgid "Close the Playlist" msgstr "Закрыть список воспроизведения" #: src/gtk/playlist-view.ui:135 msgid "Select All Songs" msgstr "Выбрать все песни" #: src/gtk/playlist-view.ui:148 msgid "Remove Selected Songs" msgstr "Удалить выбранные песни" #: src/gtk/window.ui:12 msgid "Drop a song to add it to the playlist" msgstr "Перетащите песню, чтобы добавить ее в список воспроизведения" #: src/gtk/window.ui:49 msgid "" "Select a file or a folder, or drag files from your file manager to the " "application window to add songs to the playlist" msgstr "" "Выберите файл или папку, или перетащите файлы из файлового менеджера в окно " "приложения, чтобы добавить песни в список воспроизведения" #: src/gtk/window.ui:58 msgid "Restore Playlist" msgstr "Восстановить список воспроизведения" #: src/gtk/window.ui:68 msgid "Add Folder" msgstr "Добавить папку" #: src/gtk/window.ui:77 msgid "Add Song" msgstr "Добавить песню" #: src/gtk/window.ui:161 msgctxt "a11y" msgid "Elapsed time" msgstr "Прошедшее время" #: src/gtk/window.ui:173 msgctxt "a11y" msgid "Remaining time" msgstr "Оставшееся время" #. Translators: Replace "translator-credits" with your names, one name per line #: src/application.rs:227 msgid "translator-credits" msgstr "Aleksandr Melman , 2022-2023" #: src/application.rs:239 msgid "Amberol needs to run in the background to play music" msgstr "Amberol должен работать в фоновом режиме для воспроизведения музыки" #: src/playback_control.rs:118 msgid "Repeat All Songs" msgstr "Повтор всех песен" #: src/playback_control.rs:122 msgid "Repeat the Current Song" msgstr "Повтор текущей песни" #: src/window.rs:403 msgid "_Add Song" msgstr "_Добавить песню" #: src/window.rs:404 src/window.rs:444 msgid "_Cancel" msgstr "_Отменить" #: src/window.rs:406 msgid "Open File" msgstr "Открыть файл" #: src/window.rs:413 msgid "Audio files" msgstr "Аудиофайлы" #: src/window.rs:422 src/window.rs:1315 msgid "Unable to access files" msgstr "Невозможно получить доступ к файлам" #: src/window.rs:443 msgid "_Add Folder" msgstr "_Добавить папку" #: src/window.rs:446 msgid "Open Folder" msgstr "Открыть папку" #: src/window.rs:457 msgid "Unable to access folders" msgstr "Невозможно получить доступ к папкам" #: src/window.rs:475 msgid "No available song found" msgstr "Доступных песен не найдено" #: src/window.rs:532 msgid "No songs found" msgstr "Песни не найдены" #: src/window.rs:562 msgid "Added a new song" msgstr "Добавлена новая песня" #: src/window.rs:563 msgid "Play" msgstr "Воспроизвести" #. Translators: the `{}` must be left unmodified; #. it will be expanded to the number of songs added #. to the playlist #: src/window.rs:572 msgid "Added one song" msgid_plural "Added {} songs" msgstr[0] "Добавлена одна песня" msgstr[1] "Добавлено {} песни" msgstr[2] "Добавлено {} песен" #: src/window.rs:1062 msgid "Unable to access dropped files" msgstr "Невозможно получить доступ к сброшенным файлам" #: src/window.rs:1152 msgid "{} minute" msgid_plural "{} minutes" msgstr[0] "{} минута" msgstr[1] "{} минуты" msgstr[2] "{} минут" #: src/window.rs:1163 msgid "{hours} hour {minutes} remaining" msgid_plural "{hours} hours {minutes} remaining" msgstr[0] "Остался {hours} час {minutes}" msgstr[1] "Осталось {hours} часа {minutes}" msgstr[2] "Осталось {hours} часов {minutes}" #. Translators: the '{}' must be left unmodified, and #. it will be replaced by the number of minutes remaining #. in the playlist #: src/window.rs:1173 msgid "{} minute remaining" msgid_plural "{} minutes remaining" msgstr[0] "Осталась {} минута" msgstr[1] "Осталось {} минуты" msgstr[2] "Осталось {} минут" #: src/window.rs:1295 msgid "No song selected" msgstr "Не выбрана ни одна песня" #. Translators: The '{}' must be left unmodified, and #. it is expanded to the number of songs selected #: src/window.rs:1300 msgid "{} song selected" msgid_plural "{} songs selected" msgstr[0] "Выбрана {} песня" msgstr[1] "Выбрано {} песни" msgstr[2] "Выбрано {} песен" #. Translators: `{title}` and `{artist}` must be left #. untranslated; they will expand to the title and #. artist of the currently playing song, respectively #: src/window.rs:1353 msgid "Currently playing “{title}” by “{artist}”" msgstr "Сейчас играет \"{title}\" от \"{artist}\"" #~ msgid "_Track" #~ msgstr "_Дорожка" #~ msgid "_Off" #~ msgstr "_Выключить" #~ msgid "Repeat All Tracks" #~ msgstr "Повторить все дорожки" #~ msgid "Add File" #~ msgstr "Добавить файл" #~ msgid "Plays music and nothing else" #~ msgstr "Воспроизводит музыку и ничего больше" #~ msgid "Amberol cannot run in the background" #~ msgstr "Amberol не может работать в фоновом режиме" #~ msgid "{} hour" #~ msgid_plural "{} hours" #~ msgstr[0] "{} час" #~ msgstr[1] "{} часа" #~ msgstr[2] "{} часов" #~ msgid "“{}” is not a supported audio file" #~ msgstr "\"{}\" не является поддерживаемым аудиофайлом" #~ msgid "Unrecognized file type for “{}”" #~ msgstr "Нераспознанный тип файла для \"{}\"" #~ msgid "Amberol is running in the background" #~ msgstr "Amberol работает в фоновом режиме" #~ msgid "Playing next" #~ msgstr "Играет следующим" #~ msgctxt "shortcut window" #~ msgid "Songs Queue" #~ msgstr "Очередь песен" #~ msgctxt "shortcut window" #~ msgid "Queue a Song" #~ msgstr "Поставить песню в очередь" #~ msgctxt "shortcut window" #~ msgid "Queue a Folder" #~ msgstr "Поставить папку в очередь" #~ msgctxt "shortcut window" #~ msgid "Clear" #~ msgstr "Очистить" #~ msgctxt "shortcut window" #~ msgid "Previous Track" #~ msgstr "Предыдущая дорожка" #~ msgctxt "shortcut window" #~ msgid "Seek Backwards" #~ msgstr "Перемотка назад" #~ msgctxt "shortcut window" #~ msgid "Seek Forward" #~ msgstr "Перемотка вперед" #~ msgid "Show the playlist" #~ msgstr "Показать список воспроизведения" #~ msgid "Choose a folder" #~ msgstr "Выбрать папку" amberol-0.10.3/po/sl.po000066400000000000000000000303651443320625200146200ustar00rootroot00000000000000# Slovenian translation for amberol. # Copyright (C) 2022 amberol's COPYRIGHT HOLDER # This file is distributed under the same license as the amberol package. # # Matej Urbančič , 2022–. # Martin Srebotnjak , 2022. # msgid "" msgstr "" "Project-Id-Version: amberol main\n" "Report-Msgid-Bugs-To: https://gitlab.gnome.org/World/amberol/issues\n" "POT-Creation-Date: 2023-04-24 22:31+0000\n" "PO-Revision-Date: 2023-04-26 13:07+0200\n" "Last-Translator: Martin Srebotnjak \n" "Language-Team: Slovenian GNOME Translation Team \n" "Language: sl_SI\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=4; plural=(n%100==1 ? 1 : n%100==2 ? 2 : n%100==3 || " "n%100==4 ? 3 : 0);\n" "X-Poedit-SourceCharset: utf-8\n" "X-Generator: Poedit 3.3\n" #: data/io.bassi.Amberol.desktop.in.in:3 #: data/io.bassi.Amberol.appdata.xml.in.in:6 msgid "Amberol" msgstr "Amberol" #: data/io.bassi.Amberol.desktop.in.in:4 msgid "Music Player" msgstr "Predvajalnik glasbe" #. Translators: Search terms to find this application. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! #: data/io.bassi.Amberol.desktop.in.in:12 msgid "music;player;media;audio;playlist;" msgstr "" "music;player;media;audio;playlist;glasba;predvajalnik;predstavna vsebina;" "seznam predvajanja;skladbe;pesmi;" #: data/io.bassi.Amberol.appdata.xml.in.in:7 msgid "Plays music, and nothing else" msgstr "Predvaja glasbo in nič drugega" #: data/io.bassi.Amberol.appdata.xml.in.in:9 msgid "" "Amberol is a music player with no delusions of grandeur. If you just want to " "play music available on your local system then Amberol is the music player " "you are looking for." msgstr "" "Amberol je predvajalnik glasbe brez zablod o svoji veličini. Če želite " "predvajati glasbo, ki je na voljo v krajevnem sistemu, je Amberol " "predvajalnik glasbe, ki ga iščete." #: data/io.bassi.Amberol.appdata.xml.in.in:14 msgid "Current features:" msgstr "Trenutne zmožnosti:" #: data/io.bassi.Amberol.appdata.xml.in.in:16 msgid "adaptive UI" msgstr "prilagodljiv vmesnik" #: data/io.bassi.Amberol.appdata.xml.in.in:17 msgid "UI recoloring using the album art" msgstr "prebarvanje vmesnika z uporabo oblikovanja albuma" #: data/io.bassi.Amberol.appdata.xml.in.in:18 msgid "drag and drop support to queue songs" msgstr "podpora povleci-in-spusti za posnetke v čakalni vrsti" #: data/io.bassi.Amberol.appdata.xml.in.in:19 msgid "shuffle and repeat" msgstr "premešanje in ponavljanje" #: data/io.bassi.Amberol.appdata.xml.in.in:20 msgid "MPRIS integration" msgstr "Podpora MPRIS" #: data/io.bassi.Amberol.appdata.xml.in.in:42 msgid "Emmanuele Bassi" msgstr "Emmanuele Bassi" #: src/audio/inhibit_controller.rs:40 msgid "Playback in progress" msgstr "Predvajanje v teku" #: src/audio/song.rs:325 msgid "Unknown artist" msgstr "Neznan izvajalec" #: src/audio/song.rs:332 msgid "Unknown title" msgstr "Neznan naslov" #: src/audio/song.rs:339 msgid "Unknown album" msgstr "Neznan album" #: src/gtk/help-overlay.ui:11 msgctxt "shortcut window" msgid "General" msgstr "Splošno" #: src/gtk/help-overlay.ui:14 msgctxt "shortcut window" msgid "Toggle primary menu" msgstr "Preklopi osnovni meni" #: src/gtk/help-overlay.ui:20 msgctxt "shortcut window" msgid "Copy song details to the clipboard" msgstr "Kopira podrobnosti posnetka v odložišče" #: src/gtk/help-overlay.ui:26 msgctxt "shortcut window" msgid "Show shortcuts" msgstr "Pokaži tipkovne bližnjice" #: src/gtk/help-overlay.ui:32 msgctxt "shortcut window" msgid "Quit" msgstr "Konča program" #: src/gtk/help-overlay.ui:40 msgctxt "shortcut window" msgid "Playlist" msgstr "Pokaže seznam predvajanja" #: src/gtk/help-overlay.ui:43 msgctxt "shortcut window" msgid "Add a song to the playlist" msgstr "Doda posnetek na seznam predvajanja" #: src/gtk/help-overlay.ui:49 msgctxt "shortcut window" msgid "Add a folder to the playlist" msgstr "Doda mapo na seznam predvajanja" #: src/gtk/help-overlay.ui:55 msgctxt "shortcut window" msgid "Clear the playlist" msgstr "Počisti seznam predvajanja" #: src/gtk/help-overlay.ui:61 msgctxt "shortcut window" msgid "Toggle the playlist pane" msgstr "Preklopi okno seznama predvajanja" #: src/gtk/help-overlay.ui:67 msgctxt "shortcut window" msgid "Toggle shuffling songs" msgstr "Preklopi premešanje posnetkov" #: src/gtk/help-overlay.ui:75 msgctxt "shortcut window" msgid "Playback" msgstr "Začne predvajanje" #: src/gtk/help-overlay.ui:78 msgctxt "shortcut window" msgid "Toggle play/pause" msgstr "Preklopi predvajanje/premor" #: src/gtk/help-overlay.ui:84 msgctxt "shortcut window" msgid "Previous song" msgstr "Skoči na predhodni posnetek" #: src/gtk/help-overlay.ui:90 msgctxt "shortcut window" msgid "Next song" msgstr "Skoči na naslednji posnetek" #: src/gtk/help-overlay.ui:96 msgctxt "shortcut window" msgid "Seek backwards in the current song" msgstr "Išče nazaj po trenutnem posnetku" #: src/gtk/help-overlay.ui:102 msgctxt "shortcut window" msgid "Seek forward in the current song" msgstr "Išče naprej po trenutnem posnetku" #: src/gtk/playback-control.ui:21 msgid "Play the Previous Song" msgstr "Predvajaj predhodni posnetek" #: src/gtk/playback-control.ui:26 msgctxt "a11y" msgid "Skip backwards" msgstr "Preskoči nazaj" #: src/gtk/playback-control.ui:35 msgid "Toggle Play" msgstr "Preklopi predvajanje" #: src/gtk/playback-control.ui:41 msgctxt "a11y" msgid "Toggle play" msgstr "Preklopi predvajanje" #: src/gtk/playback-control.ui:50 msgid "Play the Next Song" msgstr "Predvajaj naslednji posnetek" #: src/gtk/playback-control.ui:55 msgctxt "a11y" msgid "Skip forward" msgstr "Preskoči naprej" #: src/gtk/playback-control.ui:78 msgid "Toggle Playlist" msgstr "Preklopi seznam predvajanja" #: src/gtk/playback-control.ui:83 msgctxt "a11y" msgid "Toggle playlist" msgstr "Preklopi seznam predvajanja" #: src/gtk/playback-control.ui:92 msgid "Shuffle the Playlist" msgstr "Premešaj seznam predvajanja" #: src/gtk/playback-control.ui:94 msgctxt "a11y" msgid "Shuffle" msgstr "Premešaj" #: src/gtk/playback-control.ui:113 src/playback_control.rs:114 msgid "Enable Repeat" msgstr "Omogoči ponavljanje predvajanja" #: src/gtk/playback-control.ui:118 msgctxt "a11y" msgid "Repeat" msgstr "Ponovi" #: src/gtk/playback-control.ui:129 msgid "Main Menu" msgstr "Glavni meni" #: src/gtk/playback-control.ui:135 msgctxt "a11y" msgid "Primary menu" msgstr "Osnovni meni" #: src/gtk/playback-control.ui:151 msgid "Copy" msgstr "Kopiraj" #: src/gtk/playback-control.ui:157 msgid "Add _Song" msgstr "Dodaj _posnetek" #: src/gtk/playback-control.ui:161 msgid "Add _Folder" msgstr "Dodaj _mapo" #: src/gtk/playback-control.ui:165 msgid "Clear" msgstr "Počisti" #: src/gtk/playback-control.ui:171 msgid "_Match Cover Art" msgstr "_Ujemanje naslovnice albuma" #: src/gtk/playback-control.ui:175 msgid "_Background Playback" msgstr "Predvajanje v _ozadju" #: src/gtk/playback-control.ui:181 msgid "_ReplayGain" msgstr "Normaliziraj po _ReplayGain" #: src/gtk/playback-control.ui:183 msgctxt "replaygain-menu" msgid "_Album" msgstr "_Album" #: src/gtk/playback-control.ui:188 msgctxt "replaygain-menu" msgid "_Song" msgstr "_Posnetek" #: src/gtk/playback-control.ui:193 msgctxt "replaygain-menu" msgid "_Disabled" msgstr "_Onemogočeno" #: src/gtk/playback-control.ui:201 msgid "_Keyboard Shortcuts" msgstr "_Tipkovne bližnjice" #: src/gtk/playback-control.ui:205 msgid "_About Amberol" msgstr "_O programu" #: src/gtk/playback-control.ui:209 msgid "_Quit" msgstr "_Končaj" #: src/gtk/playlist-view.ui:19 msgid "Playlist" msgstr "Seznam predvajanja" #: src/gtk/playlist-view.ui:49 msgid "Search Songs in the Playlist" msgstr "Poišči posnetke v seznamu predvajanja" #: src/gtk/playlist-view.ui:61 msgid "Select Songs in the Playlist" msgstr "Izberite posnetke na seznamu predvajanja" #: src/gtk/playlist-view.ui:74 msgid "Close the Playlist" msgstr "Zapri seznam predvajanja" #: src/gtk/playlist-view.ui:135 msgid "Select All Songs" msgstr "Izberi vse posnetke" #: src/gtk/playlist-view.ui:148 msgid "Remove Selected Songs" msgstr "Odstrani izbrane posnetke" #: src/gtk/window.ui:12 msgid "Drop a song to add it to the playlist" msgstr "Spustite skladbo oz. posnetek, da ga dodate v čakalno vrstico" #: src/gtk/window.ui:49 msgid "" "Select a file or a folder, or drag files from your file manager to the " "application window to add songs to the playlist" msgstr "" "Izberite datoteko ali mapo ali povlecite datoteke iz upravitelja datotek v " "okno programa, da dodate posnetke na seznam predvajanja" #: src/gtk/window.ui:58 msgid "Restore Playlist" msgstr "Obnovi seznam predvajanja" #: src/gtk/window.ui:68 msgid "Add Folder" msgstr "Dodaj mapo" #: src/gtk/window.ui:77 msgid "Add Song" msgstr "Dodaj posnetek" #: src/gtk/window.ui:161 msgctxt "a11y" msgid "Elapsed time" msgstr "Pretekli čas" #: src/gtk/window.ui:173 msgctxt "a11y" msgid "Remaining time" msgstr "Preostali čas" #. Translators: Replace "translator-credits" with your names, one name per line #: src/application.rs:227 msgid "translator-credits" msgstr "" "Matej Urbančič \n" "Martin Srebotnjak " #: src/application.rs:239 msgid "Amberol needs to run in the background to play music" msgstr "Amberol se mora za predvajanje glasbe izvajati v ozadju" #: src/playback_control.rs:118 msgid "Repeat All Songs" msgstr "Ponovi vse posnetke" #: src/playback_control.rs:122 msgid "Repeat the Current Song" msgstr "Ponovi trenutni posnetek" #: src/window.rs:403 msgid "_Add Song" msgstr "Dodaj _posnetek" #: src/window.rs:404 src/window.rs:444 msgid "_Cancel" msgstr "_Prekliči" #: src/window.rs:406 msgid "Open File" msgstr "Odpri datoteko" #: src/window.rs:413 msgid "Audio files" msgstr "Zvokovne datoteke" #: src/window.rs:422 src/window.rs:1315 msgid "Unable to access files" msgstr "Dostop do datotek ni možen" #: src/window.rs:443 msgid "_Add Folder" msgstr "Dodaj _mapo" #: src/window.rs:446 msgid "Open Folder" msgstr "Odpri mapo" #: src/window.rs:457 msgid "Unable to access folders" msgstr "Dostop do map ni možen" #: src/window.rs:475 msgid "No available song found" msgstr "Ni najdenih posnetkov" #: src/window.rs:532 msgid "No songs found" msgstr "Ni najdenih posnetkov" #: src/window.rs:562 msgid "Added a new song" msgstr "Dodan nov posnetek oz. skladba" #: src/window.rs:563 msgid "Play" msgstr "Predvajaj" #. Translators: the `{}` must be left unmodified; #. it will be expanded to the number of songs added #. to the playlist #: src/window.rs:572 msgid "Added one song" msgid_plural "Added {} songs" msgstr[0] "Dodanih {} posnetkov" msgstr[1] "Dodan {} posnetek" msgstr[2] "Dodana {} posnetka" msgstr[3] "Dodani {} posnetki" #: src/window.rs:1062 msgid "Unable to access dropped files" msgstr "Dostop do opuščenih datotek ni možen" #: src/window.rs:1152 msgid "{} minute" msgid_plural "{} minutes" msgstr[0] "{} minuta" msgstr[1] "{} minuti" msgstr[2] "{} minute" msgstr[3] "{} minut" #: src/window.rs:1163 msgid "{hours} hour {minutes} remaining" msgid_plural "{hours} hours {minutes} remaining" msgstr[0] "Preostali čas: {hours} ur {minutes} min" msgstr[1] "Preostali čas: {hours} ura {minutes} min" msgstr[2] "Preostali čas: {hours} uri {minutes} min" msgstr[3] "Preostali čas: {hours} ure {minutes} min" #. Translators: the '{}' must be left unmodified, and #. it will be replaced by the number of minutes remaining #. in the playlist #: src/window.rs:1173 msgid "{} minute remaining" msgid_plural "{} minutes remaining" msgstr[0] "Preostali čas: {} minut" msgstr[1] "Preostali čas: {} minuta" msgstr[2] "Preostali čas: {} minuti" msgstr[3] "Preostali čas: {} minute" #: src/window.rs:1295 msgid "No song selected" msgstr "Ni izbranih posnetkov" #. Translators: The '{}' must be left unmodified, and #. it is expanded to the number of songs selected #: src/window.rs:1300 msgid "{} song selected" msgid_plural "{} songs selected" msgstr[0] "{} izbranih posnetkov" msgstr[1] "{} izbran posnetek" msgstr[2] "{} izbrana posnetka" msgstr[3] "{} izbrani posnetki" #. Translators: `{title}` and `{artist}` must be left #. untranslated; they will expand to the title and #. artist of the currently playing song, respectively #: src/window.rs:1353 msgid "Currently playing “{title}” by “{artist}”" msgstr "Trenutno predvaja »{title}« ({artist})" amberol-0.10.3/po/sr.po000066400000000000000000000345531443320625200146310ustar00rootroot00000000000000# Serbian translation for amberol. # Copyright @ 2022 amberol's COPYRIGHT HOLDER # This file is distributed under the same license as the amberol package. # Мирослав Николић , 2022-2023. # msgid "" msgstr "" "Project-Id-Version: amberol main\n" "Report-Msgid-Bugs-To: https://gitlab.gnome.org/World/amberol/issues\n" "POT-Creation-Date: 2023-02-22 13:07+0000\n" "PO-Revision-Date: 2023-03-07 06:42+0100\n" "Last-Translator: Мирослав Николић \n" "Language-Team: Serbian \n" "Language: sr\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=4; plural=n==1? 3 : n%10==1 && n%100!=11 ? 0 : " "n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2\n" #: data/io.bassi.Amberol.desktop.in.in:3 #: data/io.bassi.Amberol.appdata.xml.in.in:6 msgid "Amberol" msgstr "Амберол" #: data/io.bassi.Amberol.desktop.in.in:4 msgid "Music Player" msgstr "Програм за пуштање музике" #. Translators: Search terms to find this application. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! #: data/io.bassi.Amberol.desktop.in.in:12 msgid "music;player;media;audio;playlist;" msgstr "музика;пуштач;медија;аудио;списак;music;player;media;audio;playlist;" #: data/io.bassi.Amberol.appdata.xml.in.in:7 msgid "Plays music, and nothing else" msgstr "Пушта музику, и ништа друго" #: data/io.bassi.Amberol.appdata.xml.in.in:9 msgid "" "Amberol is a music player with no delusions of grandeur. If you just want to " "play music available on your local system then Amberol is the music player " "you are looking for." msgstr "" "Амберол је програм за пуштање музике без разочарења о увећању. Ако желите " "само да пуштате музику доступну на вашем локалном систему тада је Амберол " "програм за пуштање музике који тражите." #: data/io.bassi.Amberol.appdata.xml.in.in:14 msgid "Current features:" msgstr "Текуће могућности:" #: data/io.bassi.Amberol.appdata.xml.in.in:16 msgid "adaptive UI" msgstr "прилагодљиво корисничко сучеље" #: data/io.bassi.Amberol.appdata.xml.in.in:17 msgid "UI recoloring using the album art" msgstr "пребојавање сучеља помоћу уметничког албума" #: data/io.bassi.Amberol.appdata.xml.in.in:18 msgid "drag and drop support to queue songs" msgstr "подршка превлачења и убацивања за стављање песама у ред" #: data/io.bassi.Amberol.appdata.xml.in.in:19 msgid "shuffle and repeat" msgstr "мешање и понављање" #: data/io.bassi.Amberol.appdata.xml.in.in:20 msgid "MPRIS integration" msgstr "МПРИС обједињавање" #: data/io.bassi.Amberol.appdata.xml.in.in:42 msgid "Emmanuele Bassi" msgstr "Емануеле Баси" #: src/audio/inhibit_controller.rs:40 msgid "Playback in progress" msgstr "Пуштање је у току" #: src/audio/song.rs:337 msgid "Unknown artist" msgstr "Непознат извођач" #: src/audio/song.rs:344 msgid "Unknown title" msgstr "Непознат наслов" #: src/audio/song.rs:351 msgid "Unknown album" msgstr "Непознат албум" #: src/gtk/help-overlay.ui:11 msgctxt "shortcut window" msgid "General" msgstr "Опште" #: src/gtk/help-overlay.ui:14 msgctxt "shortcut window" msgid "Toggle primary menu" msgstr "Окида главни изборник" #: src/gtk/help-overlay.ui:20 msgctxt "shortcut window" msgid "Copy song details to the clipboard" msgstr "Умножава податке о песми у оставу" #: src/gtk/help-overlay.ui:26 #| msgctxt "shortcut window" #| msgid "Show Shortcuts" msgctxt "shortcut window" msgid "Show shortcuts" msgstr "Приказује пречице" #: src/gtk/help-overlay.ui:32 msgctxt "shortcut window" msgid "Quit" msgstr "Излази из програма" #: src/gtk/help-overlay.ui:40 msgctxt "shortcut window" msgid "Playlist" msgstr "Списак песама" #: src/gtk/help-overlay.ui:43 msgctxt "shortcut window" msgid "Add a song to the playlist" msgstr "Додаје песму на списак" #: src/gtk/help-overlay.ui:49 msgctxt "shortcut window" msgid "Add a folder to the playlist" msgstr "Додаје фасциклу на списак песама" #: src/gtk/help-overlay.ui:55 msgctxt "shortcut window" msgid "Clear the playlist" msgstr "Чисти списак песама" #: src/gtk/help-overlay.ui:61 msgctxt "shortcut window" msgid "Toggle the playlist pane" msgstr "Окида површ списка песама" #: src/gtk/help-overlay.ui:67 msgctxt "shortcut window" msgid "Toggle shuffling songs" msgstr "Окида мешање песама" #: src/gtk/help-overlay.ui:75 msgctxt "shortcut window" msgid "Playback" msgstr "Пушта песму" #: src/gtk/help-overlay.ui:78 #| msgctxt "shortcut window" #| msgid "Toggle Play/Pause" msgctxt "shortcut window" msgid "Toggle play/pause" msgstr "Окида пуштање/паузирање" #: src/gtk/help-overlay.ui:84 msgctxt "shortcut window" msgid "Previous song" msgstr "Претходна песма" #: src/gtk/help-overlay.ui:90 msgctxt "shortcut window" msgid "Next song" msgstr "Следећа песма" #: src/gtk/help-overlay.ui:96 msgctxt "shortcut window" msgid "Seek backwards in the current song" msgstr "Премотава уназад у текућој песми" #: src/gtk/help-overlay.ui:102 msgctxt "shortcut window" msgid "Seek forward in the current song" msgstr "Премотава унапред у текућој песми" #: src/gtk/playback-control.ui:35 msgctxt "a11y" msgid "Elapsed time" msgstr "Протекло време" #: src/gtk/playback-control.ui:47 msgctxt "a11y" msgid "Remaining time" msgstr "Преостало време" #: src/gtk/playback-control.ui:69 msgid "Play the Previous Song" msgstr "Пусти претходну песму" #: src/gtk/playback-control.ui:74 msgctxt "a11y" msgid "Skip backwards" msgstr "Премотај унназад" #: src/gtk/playback-control.ui:83 msgid "Toggle Play" msgstr "Окини пуштање" #: src/gtk/playback-control.ui:89 msgctxt "a11y" msgid "Toggle play" msgstr "Окините пуштање" #: src/gtk/playback-control.ui:98 msgid "Play the Next Song" msgstr "Пусти следећу песму" #: src/gtk/playback-control.ui:103 msgctxt "a11y" msgid "Skip forward" msgstr "Премотајте унапред" #: src/gtk/playback-control.ui:126 msgid "Toggle Playlist" msgstr "Окини списак песама" #: src/gtk/playback-control.ui:131 msgctxt "a11y" msgid "Toggle playlist" msgstr "Окините списак песама" #: src/gtk/playback-control.ui:140 msgid "Shuffle the Playlist" msgstr "Измешајте списак песама" #: src/gtk/playback-control.ui:142 msgctxt "a11y" msgid "Shuffle" msgstr "Измешај" #: src/gtk/playback-control.ui:161 src/playback_control.rs:153 msgid "Enable Repeat" msgstr "Укључи понављање" #: src/gtk/playback-control.ui:166 msgctxt "a11y" msgid "Repeat" msgstr "Понављај" #: src/gtk/playback-control.ui:177 msgid "Main Menu" msgstr "Главни изборник" #: src/gtk/playback-control.ui:183 msgctxt "a11y" msgid "Primary menu" msgstr "Главни изборник" #: src/gtk/playback-control.ui:199 msgid "Copy" msgstr "Умножите" #: src/gtk/playback-control.ui:205 msgid "Add _Song" msgstr "Додај _песму" #: src/gtk/playback-control.ui:209 msgid "Add _Folder" msgstr "Додај _фасциклу" #: src/gtk/playback-control.ui:213 msgid "Clear" msgstr "Очисти" #: src/gtk/playback-control.ui:219 msgid "_Match Cover Art" msgstr "_Поклопи слику омота" #: src/gtk/playback-control.ui:223 msgid "_Background Playback" msgstr "Пуштање у _позадини" #: src/gtk/playback-control.ui:229 msgid "_ReplayGain" msgstr "_Појачај понављање" #: src/gtk/playback-control.ui:231 msgid "_Album" msgstr "_Албум" #: src/gtk/playback-control.ui:236 msgid "_Track" msgstr "_Нумера" #: src/gtk/playback-control.ui:241 msgid "_Off" msgstr "_Искључи" #: src/gtk/playback-control.ui:249 msgid "_Keyboard Shortcuts" msgstr "_Пречице тастатуре" #: src/gtk/playback-control.ui:253 msgid "_About Amberol" msgstr "_О Амберолу" #: src/gtk/playback-control.ui:257 msgid "_Quit" msgstr "_Изађи" #: src/gtk/playlist-view.ui:19 msgid "Playlist" msgstr "списак песама" #: src/gtk/playlist-view.ui:49 msgid "Search Songs in the Playlist" msgstr "Тражите песме на списку песама" #: src/gtk/playlist-view.ui:61 msgid "Select Songs in the Playlist" msgstr "Изаберите песме на списку песама" #: src/gtk/playlist-view.ui:74 msgid "Close the Playlist" msgstr "Затворите списак песама" #: src/gtk/playlist-view.ui:135 msgid "Select All Songs" msgstr "Изабери све песме" #: src/gtk/playlist-view.ui:148 msgid "Remove Selected Songs" msgstr "Уклони изабране песме" #: src/gtk/window.ui:12 msgid "Drop a song to add it to the queue" msgstr "Убаците песму да је додате у ред" #: src/gtk/window.ui:49 msgid "" "Select a file or a folder, or drag files from your file manager to the " "application window to add songs to the playlist" msgstr "" "Изаберите датотеку или фасциклу, или превуците датотеке из вашег управника " "датотека до прозора програма да додате песме на списак песама" #: src/gtk/window.ui:58 #| msgid "Toggle Playlist" msgid "Restore Playlist" msgstr "Врати списак песама" #: src/gtk/window.ui:68 msgid "Add Folder" msgstr "Додај фасциклу" #: src/gtk/window.ui:77 #| msgid "_Add Song" msgid "Add Song" msgstr "Додај песму" #. Translators: Replace "translator-credits" with your names, one name per line #: src/application.rs:233 msgid "translator-credits" msgstr "" "\"Мирослав Николић \\n\"\n" "\"\\n\"\n" "\"Prevod.org — превод на српски језик.\"" #: src/application.rs:247 msgid "Amberol needs to run in the background to play music" msgstr "Амберол мора да ради у позадини да би пуштао музику" #: src/playback_control.rs:157 msgid "Repeat All Tracks" msgstr "Понови све нумере" #: src/playback_control.rs:161 msgid "Repeat the Current Track" msgstr "Понови текућу нумеру" #: src/window.rs:397 msgid "_Add Song" msgstr "_Додај песму" #: src/window.rs:398 src/window.rs:438 msgid "_Cancel" msgstr "_Откажи" #: src/window.rs:400 msgid "Open File" msgstr "Отвори датотеку" #: src/window.rs:407 msgid "Audio files" msgstr "Аудио датотеке" #: src/window.rs:416 src/window.rs:1306 msgid "Unable to access files" msgstr "Не могу да приступим датотекама" #: src/window.rs:437 msgid "_Add Folder" msgstr "_Додај фасциклу" #: src/window.rs:440 msgid "Open Folder" msgstr "Отворите фасциклу" #: src/window.rs:451 msgid "Unable to access folders" msgstr "Не могу да приступим фасциклама" #: src/window.rs:469 msgid "No available song found" msgstr "Нисам нашао доступних песама" #: src/window.rs:526 msgid "No songs found" msgstr "Нисам нашао ниједну песму" #: src/window.rs:556 msgid "Added a new song" msgstr "Додата је нова песма" #: src/window.rs:557 msgid "Play" msgstr "Пусти" #. Translators: the `{}` must be left unmodified; #. it will be expanded to the number of songs added #. to the playlist #: src/window.rs:566 msgid "Added one song" msgid_plural "Added {} songs" msgstr[0] "Додата је {} песма" msgstr[1] "Додате су {} песме" msgstr[2] "Додато је {} песама" msgstr[3] "Додата је једна песма" #: src/window.rs:1056 msgid "Unable to access dropped files" msgstr "Не могу да приступим убаченим датотекама" #: src/window.rs:1149 msgid "{} minute" msgid_plural "{} minutes" msgstr[0] "{} минут" msgstr[1] "{} минута" msgstr[2] "{} минута" msgstr[3] "Један минут" #: src/window.rs:1160 msgid "{hours} hour {minutes} remaining" msgid_plural "{hours} hours {minutes} remaining" msgstr[0] "Преостаје {} минут" msgstr[1] "Преостало време: {hours} {minutes}" msgstr[2] "Преостало време: {hours} {minutes}" msgstr[3] "Преостало време: {hours} {minutes}" #. Translators: the '{}' must be left unmodified, and #. it will be replaced by the number of minutes remaining #. in the playlist #: src/window.rs:1170 msgid "{} minute remaining" msgid_plural "{} minutes remaining" msgstr[0] "Преостаје {} минут" msgstr[1] "Преостају {} минута" msgstr[2] "Преостаје {} минута" msgstr[3] "Преостаје један минут" #: src/window.rs:1286 msgid "No song selected" msgstr "Није изабрана ниједна песма" #. Translators: The '{}' must be left unmodified, and #. it is expanded to the number of songs selected #: src/window.rs:1291 msgid "{} song selected" msgid_plural "{} songs selected" msgstr[0] "Изабрана је {} песма" msgstr[1] "Изабране су {} песме" msgstr[2] "Изабрано је {} песама" msgstr[3] "Изабрана је једна песма" #. Translators: `{title}` and `{artist}` must be left #. untranslated; they will expand to the title and #. artist of the currently playing song, respectively #: src/window.rs:1344 msgid "Currently playing “{title}” by “{artist}”" msgstr "Тренутно пуштам „{title}“ коју изводи {artist}" #~ msgid "Add File" #~ msgstr "Додај датотеку" #~ msgid "Plays music and nothing else" #~ msgstr "Пуштајте музику и ништа друго" #~ msgid "Amberol cannot run in the background" #~ msgstr "Амберол не може да ради у позадини" amberol-0.10.3/po/sv.po000066400000000000000000000317571443320625200146400ustar00rootroot00000000000000# Swedish translation for amberol. # Copyright © 2022, 2023 amberol's COPYRIGHT HOLDER # This file is distributed under the same license as the amberol package. # Anders Jonsson , 2022, 2023. # Luna Jernberg , 2022, 2023. # msgid "" msgstr "" "Project-Id-Version: amberol main\n" "Report-Msgid-Bugs-To: https://gitlab.gnome.org/World/amberol/issues\n" "POT-Creation-Date: 2023-04-26 13:27+0000\n" "PO-Revision-Date: 2023-04-28 01:47+0200\n" "Last-Translator: Anders Jonsson \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: Poedit 3.2.2\n" #: data/io.bassi.Amberol.desktop.in.in:3 #: data/io.bassi.Amberol.appdata.xml.in.in:6 msgid "Amberol" msgstr "Amberol" #: data/io.bassi.Amberol.desktop.in.in:4 msgid "Music Player" msgstr "Musikspelare" #. Translators: Search terms to find this application. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! #: data/io.bassi.Amberol.desktop.in.in:12 msgid "music;player;media;audio;playlist;" msgstr "musik;spelare;media;audio;spellista;" #: data/io.bassi.Amberol.appdata.xml.in.in:7 msgid "Plays music, and nothing else" msgstr "Spelar upp musik helt enkelt" #: data/io.bassi.Amberol.appdata.xml.in.in:9 msgid "" "Amberol is a music player with no delusions of grandeur. If you just want to " "play music available on your local system then Amberol is the music player " "you are looking for." msgstr "" "Amberol är en musikspelare utan storhetsvansinne. Om du helt enkelt vill " "spela upp musik på ditt system så är Amberol musikspelaren för dig." #: data/io.bassi.Amberol.appdata.xml.in.in:14 msgid "Current features:" msgstr "Funktioner:" #: data/io.bassi.Amberol.appdata.xml.in.in:16 msgid "adaptive UI" msgstr "adaptivt användargränssnitt" #: data/io.bassi.Amberol.appdata.xml.in.in:17 msgid "UI recoloring using the album art" msgstr "färgändring av användargränssnittet enligt albumgrafiken" #: data/io.bassi.Amberol.appdata.xml.in.in:18 msgid "drag and drop support to queue songs" msgstr "stöd för att dra och släppa för att lägga låtar i kö" #: data/io.bassi.Amberol.appdata.xml.in.in:19 msgid "shuffle and repeat" msgstr "blanda och upprepa" #: data/io.bassi.Amberol.appdata.xml.in.in:20 msgid "MPRIS integration" msgstr "MPRIS-integration" #: data/io.bassi.Amberol.appdata.xml.in.in:42 msgid "Emmanuele Bassi" msgstr "Emmanuele Bassi" #: src/audio/inhibit_controller.rs:40 msgid "Playback in progress" msgstr "Uppspelning pågår" #: src/audio/song.rs:325 msgid "Unknown artist" msgstr "Okänd artist" #: src/audio/song.rs:332 msgid "Unknown title" msgstr "Okänd titel" #: src/audio/song.rs:339 msgid "Unknown album" msgstr "Okänt album" #: src/gtk/help-overlay.ui:11 msgctxt "shortcut window" msgid "General" msgstr "Allmänt" #: src/gtk/help-overlay.ui:14 msgctxt "shortcut window" msgid "Toggle primary menu" msgstr "Visa/dölj primär meny" #: src/gtk/help-overlay.ui:20 msgctxt "shortcut window" msgid "Copy song details to the clipboard" msgstr "Kopiera låtdetaljer till urklipp" #: src/gtk/help-overlay.ui:26 msgctxt "shortcut window" msgid "Show shortcuts" msgstr "Visa kortkommandon" #: src/gtk/help-overlay.ui:32 msgctxt "shortcut window" msgid "Quit" msgstr "Avsluta" #: src/gtk/help-overlay.ui:40 msgctxt "shortcut window" msgid "Playlist" msgstr "Spellista" #: src/gtk/help-overlay.ui:43 msgctxt "shortcut window" msgid "Add a song to the playlist" msgstr "Lägg till en låt till spellistan" #: src/gtk/help-overlay.ui:49 msgctxt "shortcut window" msgid "Add a folder to the playlist" msgstr "Lägg till en mapp till spellistan" #: src/gtk/help-overlay.ui:55 msgctxt "shortcut window" msgid "Clear the playlist" msgstr "Töm spellistan" #: src/gtk/help-overlay.ui:61 msgctxt "shortcut window" msgid "Toggle the playlist pane" msgstr "Visa/dölj spellistepanelen" #: src/gtk/help-overlay.ui:67 msgctxt "shortcut window" msgid "Toggle shuffling songs" msgstr "Växla blandning av låtar" #: src/gtk/help-overlay.ui:75 msgctxt "shortcut window" msgid "Playback" msgstr "Uppspelning" #: src/gtk/help-overlay.ui:78 msgctxt "shortcut window" msgid "Toggle play/pause" msgstr "Växla uppspelning/paus" #: src/gtk/help-overlay.ui:84 msgctxt "shortcut window" msgid "Previous song" msgstr "Föregående låt" #: src/gtk/help-overlay.ui:90 msgctxt "shortcut window" msgid "Next song" msgstr "Nästa låt" #: src/gtk/help-overlay.ui:96 msgctxt "shortcut window" msgid "Seek backwards in the current song" msgstr "Spola bakåt i aktuell låt" #: src/gtk/help-overlay.ui:102 msgctxt "shortcut window" msgid "Seek forward in the current song" msgstr "Spola framåt i aktuell låt" #: src/gtk/playback-control.ui:21 msgid "Play the Previous Song" msgstr "Spela upp föregående låt" #: src/gtk/playback-control.ui:26 msgctxt "a11y" msgid "Skip backwards" msgstr "Hoppa bakåt" #: src/gtk/playback-control.ui:35 msgid "Toggle Play" msgstr "Spela upp/pausa" #: src/gtk/playback-control.ui:41 msgctxt "a11y" msgid "Toggle play" msgstr "Spela upp/pausa" #: src/gtk/playback-control.ui:50 msgid "Play the Next Song" msgstr "Spela upp nästa låt" #: src/gtk/playback-control.ui:55 msgctxt "a11y" msgid "Skip forward" msgstr "Hoppa framåt" #: src/gtk/playback-control.ui:78 msgid "Toggle Playlist" msgstr "Visa/dölj spellista" #: src/gtk/playback-control.ui:83 msgctxt "a11y" msgid "Toggle playlist" msgstr "Visa/dölj spellista" #: src/gtk/playback-control.ui:92 msgid "Shuffle the Playlist" msgstr "Blanda spellistan" #: src/gtk/playback-control.ui:94 msgctxt "a11y" msgid "Shuffle" msgstr "Blanda" #: src/gtk/playback-control.ui:113 src/playback_control.rs:114 msgid "Enable Repeat" msgstr "Aktivera upprepning" #: src/gtk/playback-control.ui:118 msgctxt "a11y" msgid "Repeat" msgstr "Upprepa" #: src/gtk/playback-control.ui:129 msgid "Main Menu" msgstr "Huvudmeny" #: src/gtk/playback-control.ui:135 msgctxt "a11y" msgid "Primary menu" msgstr "Primär meny" #: src/gtk/playback-control.ui:151 msgid "Copy" msgstr "Kopiera" #: src/gtk/playback-control.ui:157 msgid "Add _Song" msgstr "Lägg _till låt" #: src/gtk/playback-control.ui:161 msgid "Add _Folder" msgstr "Lägg till _mapp" #: src/gtk/playback-control.ui:165 msgid "Clear" msgstr "Töm" #: src/gtk/playback-control.ui:171 msgid "_Match Cover Art" msgstr "_Matcha omslagsgrafik" #: src/gtk/playback-control.ui:175 msgid "_Background Playback" msgstr "Uppspelning i _bakgrunden" #: src/gtk/playback-control.ui:181 msgid "_ReplayGain" msgstr "_ReplayGain" #: src/gtk/playback-control.ui:183 msgctxt "replaygain-menu" msgid "_Album" msgstr "_Album" #: src/gtk/playback-control.ui:188 msgctxt "replaygain-menu" msgid "_Song" msgstr "_Låt" #: src/gtk/playback-control.ui:193 msgctxt "replaygain-menu" msgid "_Disabled" msgstr "_Inaktiverad" #: src/gtk/playback-control.ui:201 msgid "_Keyboard Shortcuts" msgstr "_Tangentbordsgenvägar" #: src/gtk/playback-control.ui:205 msgid "_About Amberol" msgstr "_Om Amberol" #: src/gtk/playback-control.ui:209 msgid "_Quit" msgstr "A_vsluta" #: src/gtk/playlist-view.ui:19 msgid "Playlist" msgstr "Spellista" #: src/gtk/playlist-view.ui:49 msgid "Search Songs in the Playlist" msgstr "Sök låtar i spellistan" #: src/gtk/playlist-view.ui:61 msgid "Select Songs in the Playlist" msgstr "Välj låtar i spellistan" #: src/gtk/playlist-view.ui:74 msgid "Close the Playlist" msgstr "Stäng spellistan" #: src/gtk/playlist-view.ui:135 msgid "Select All Songs" msgstr "Markera alla låtar" #: src/gtk/playlist-view.ui:148 msgid "Remove Selected Songs" msgstr "Ta bort markerade låtar" #: src/gtk/window.ui:12 msgid "Drop a song to add it to the playlist" msgstr "Släpp en låt för att lägga till den till spellistan" #: src/gtk/window.ui:49 msgid "" "Select a file or a folder, or drag files from your file manager to the " "application window to add songs to the playlist" msgstr "" "Välj en fil eller mapp, eller dra filer från din filhanterare till " "programfönstret för att lägga till låtar till spellistan" #: src/gtk/window.ui:58 msgid "Restore Playlist" msgstr "Återställ spellista" #: src/gtk/window.ui:68 msgid "Add Folder" msgstr "Lägg till mapp" #: src/gtk/window.ui:77 msgid "Add Song" msgstr "Lägg till låt" #: src/gtk/window.ui:161 msgctxt "a11y" msgid "Elapsed time" msgstr "Åtgången tid" #: src/gtk/window.ui:173 msgctxt "a11y" msgid "Remaining time" msgstr "Återstående tid" #. Translators: Replace "translator-credits" with your names, one name per line #: src/application.rs:228 msgid "translator-credits" msgstr "" "Anders Jonsson \n" "Luna Jernberg \n" "\n" "Skicka synpunkter på översättningen till\n" "." #: src/application.rs:240 msgid "Amberol needs to run in the background to play music" msgstr "Amberol behöver köras i bakgrunden för att spela upp musik" #: src/playback_control.rs:118 msgid "Repeat All Songs" msgstr "Upprepa alla låtar" #: src/playback_control.rs:122 msgid "Repeat the Current Song" msgstr "Upprepa den aktuella låten" #: src/window.rs:438 msgid "_Add Song" msgstr "_Lägg till låt" #: src/window.rs:439 src/window.rs:479 msgid "_Cancel" msgstr "A_vbryt" #: src/window.rs:441 msgid "Open File" msgstr "Öppna fil" #: src/window.rs:448 msgid "Audio files" msgstr "Ljudfiler" #: src/window.rs:457 src/window.rs:1393 msgid "Unable to access files" msgstr "Kunde inte komma åt filer" #: src/window.rs:478 msgid "_Add Folder" msgstr "_Lägg till mapp" #: src/window.rs:481 msgid "Open Folder" msgstr "Öppna mapp" #: src/window.rs:492 msgid "Unable to access folders" msgstr "Kunde inte komma åt mappar" #: src/window.rs:510 msgid "No available song found" msgstr "Ingen tillgänglig låt hittades" #: src/window.rs:567 msgid "No songs found" msgstr "Inga låtar hittades" #: src/window.rs:597 msgid "Added a new song" msgstr "Lade till en ny låt" #: src/window.rs:598 msgid "Play" msgstr "Spela upp" #. Translators: the `{}` must be left unmodified; #. it will be expanded to the number of songs added #. to the playlist #: src/window.rs:607 msgid "Added one song" msgid_plural "Added {} songs" msgstr[0] "Lade till en låt" msgstr[1] "Lade till {} låtar" #: src/window.rs:1157 msgid "Unable to access dropped files" msgstr "Kunde inte komma åt släppta filer" #: src/window.rs:1251 msgid "{} minute" msgid_plural "{} minutes" msgstr[0] "{} minut" msgstr[1] "{} minuter" #: src/window.rs:1262 msgid "{hours} hour {minutes} remaining" msgid_plural "{hours} hours {minutes} remaining" msgstr[0] "{hours} timme {minutes} kvarstår" msgstr[1] "{hours} timmar {minutes} kvarstår" #. Translators: the '{}' must be left unmodified, and #. it will be replaced by the number of minutes remaining #. in the playlist #: src/window.rs:1272 msgid "{} minute remaining" msgid_plural "{} minutes remaining" msgstr[0] "{} minut kvarstår" msgstr[1] "{} minuter kvarstår" #: src/window.rs:1372 msgid "No song selected" msgstr "Ingen låt markerad" #. Translators: The '{}' must be left unmodified, and #. it is expanded to the number of songs selected #: src/window.rs:1377 msgid "{} song selected" msgid_plural "{} songs selected" msgstr[0] "{} låt markerad" msgstr[1] "{} låtar markerade" #. Translators: `{title}` and `{artist}` must be left #. untranslated; they will expand to the title and #. artist of the currently playing song, respectively #: src/window.rs:1431 msgid "Currently playing “{title}” by “{artist}”" msgstr "Spelar nu ”{title}” av ”{artist}”" #~ msgid "_Track" #~ msgstr "_Spår" #~ msgid "_Off" #~ msgstr "_Av" #~ msgid "Repeat All Tracks" #~ msgstr "Upprepa alla spår" #~ msgid "Add File" #~ msgstr "Lägg till fil" #~ msgid "Plays music and nothing else" #~ msgstr "Spelar upp musik helt enkelt" #~ msgid "Amberol cannot run in the background" #~ msgstr "Amberol kan inte köras i bakgrunden" #~ msgid "{} hour" #~ msgid_plural "{} hours" #~ msgstr[0] "{} timme" #~ msgstr[1] "{} timmar" #~ msgid "“{}” is not a supported audio file" #~ msgstr "Ljudfilen ”{}” stöds inte" #~ msgid "Unrecognized file type for “{}”" #~ msgstr "Okänd filtyp för ”{}”" #~ msgid "Amberol is running in the background" #~ msgstr "Amberol körs i bakgrunden" #~ msgid "Playing next" #~ msgstr "Spelar härnäst" #~ msgctxt "shortcut window" #~ msgid "Songs Queue" #~ msgstr "Låtkö" #~ msgctxt "shortcut window" #~ msgid "Queue a Song" #~ msgstr "Lägg en låt i kö" #~ msgctxt "shortcut window" #~ msgid "Queue a Folder" #~ msgstr "Lägg en mapp i kö" #~ msgctxt "shortcut window" #~ msgid "Clear" #~ msgstr "Töm" #~ msgctxt "shortcut window" #~ msgid "Previous Track" #~ msgstr "Föregående spår" #~ msgid "Choose a file" #~ msgstr "Välj en fil" #~ msgid "Choose a folder" #~ msgstr "Välj en mapp" #~ msgctxt "shortcut window" #~ msgid "Seek Backwards" #~ msgstr "Spola bakåt" #~ msgctxt "shortcut window" #~ msgid "Seek Forward" #~ msgstr "Spola framåt" #~ msgid "Show the playlist" #~ msgstr "Visa spellistan" amberol-0.10.3/po/tr.po000066400000000000000000000272431443320625200146300ustar00rootroot00000000000000# Turkish translation for amberol. # Copyright (C) 2022-2023 amberol's COPYRIGHT HOLDER # This file is distributed under the same license as the amberol package. # # Sabri Ünal , 2022, 2023. # Emin Tufan Çetin , 2022-2023. # msgid "" msgstr "" "Project-Id-Version: amberol main\n" "Report-Msgid-Bugs-To: https://gitlab.gnome.org/World/amberol/issues\n" "POT-Creation-Date: 2023-04-24 22:31+0000\n" "PO-Revision-Date: 2023-04-25 23:57+0300\n" "Last-Translator: Sabri Ünal \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=1; plural=0;\n" "X-Generator: Poedit 3.2.2\n" "X-Project-Style: gnome\n" #: data/io.bassi.Amberol.desktop.in.in:3 #: data/io.bassi.Amberol.appdata.xml.in.in:6 msgid "Amberol" msgstr "Amberol" #: data/io.bassi.Amberol.desktop.in.in:4 msgid "Music Player" msgstr "Müzik Çalar" #. Translators: Search terms to find this application. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! #: data/io.bassi.Amberol.desktop.in.in:12 msgid "music;player;media;audio;playlist;" msgstr "" "müzik;oynatıcı;çalıcı;çalar;müzik çalar;müzik oynatıcı;medya;ortam;ses;" "oynatma listesi;çalma listesi;" #: data/io.bassi.Amberol.appdata.xml.in.in:7 msgid "Plays music, and nothing else" msgstr "Müzik çalar, daha çoğu değil" #: data/io.bassi.Amberol.appdata.xml.in.in:9 msgid "" "Amberol is a music player with no delusions of grandeur. If you just want to " "play music available on your local system then Amberol is the music player " "you are looking for." msgstr "" "Amberol, görkem sanrıları olmayan bir müzik çalardır. Yalnızca yerel " "sisteminizdeki müzikleri çalmak istiyorsanız, Amberol aradığınız müzik " "çalardır." #: data/io.bassi.Amberol.appdata.xml.in.in:14 msgid "Current features:" msgstr "Geçerli özellikleri:" #: data/io.bassi.Amberol.appdata.xml.in.in:16 msgid "adaptive UI" msgstr "uyarlanır kullanıcı arayüzü" #: data/io.bassi.Amberol.appdata.xml.in.in:17 msgid "UI recoloring using the album art" msgstr "albüm görselini kullanarak kullanıcı arayüzü renklendirme" #: data/io.bassi.Amberol.appdata.xml.in.in:18 msgid "drag and drop support to queue songs" msgstr "şarkıları sıralamak için sürükle ve bırak desteği" #: data/io.bassi.Amberol.appdata.xml.in.in:19 msgid "shuffle and repeat" msgstr "karıştır ve yinele" #: data/io.bassi.Amberol.appdata.xml.in.in:20 msgid "MPRIS integration" msgstr "MPRIS tümleşimi" # Uygulamanın yazarının adı. #: data/io.bassi.Amberol.appdata.xml.in.in:42 msgid "Emmanuele Bassi" msgstr "Emmanuele Bassi" #: src/audio/inhibit_controller.rs:40 msgid "Playback in progress" msgstr "Çalıyor" #: src/audio/song.rs:325 msgid "Unknown artist" msgstr "Bilinmeyen sanatçı" #: src/audio/song.rs:332 msgid "Unknown title" msgstr "Bilinmeyen başlık" #: src/audio/song.rs:339 msgid "Unknown album" msgstr "Bilinmeyen albüm" #: src/gtk/help-overlay.ui:11 msgctxt "shortcut window" msgid "General" msgstr "Genel" #: src/gtk/help-overlay.ui:14 msgctxt "shortcut window" msgid "Toggle primary menu" msgstr "Ana menüyü aç/kapat" #: src/gtk/help-overlay.ui:20 msgctxt "shortcut window" msgid "Copy song details to the clipboard" msgstr "Şarkı ayrıntılarını panoya kopyala" #: src/gtk/help-overlay.ui:26 msgctxt "shortcut window" msgid "Show shortcuts" msgstr "Kısayolları göster" #: src/gtk/help-overlay.ui:32 msgctxt "shortcut window" msgid "Quit" msgstr "Çık" # Grup başlığı #: src/gtk/help-overlay.ui:40 msgctxt "shortcut window" msgid "Playlist" msgstr "Çalma Listesi" #: src/gtk/help-overlay.ui:43 msgctxt "shortcut window" msgid "Add a song to the playlist" msgstr "Şarkıyı çalma listesine ekle" #: src/gtk/help-overlay.ui:49 msgctxt "shortcut window" msgid "Add a folder to the playlist" msgstr "Klasörü çalma listesine ekle" #: src/gtk/help-overlay.ui:55 msgctxt "shortcut window" msgid "Clear the playlist" msgstr "Çalma listesini temizle" #: src/gtk/help-overlay.ui:61 msgctxt "shortcut window" msgid "Toggle the playlist pane" msgstr "Çalma listesi bölmesini aç/kapat" #: src/gtk/help-overlay.ui:67 msgctxt "shortcut window" msgid "Toggle shuffling songs" msgstr "Şarkı karıştırmayı aç/kapat" # Grup başlığı #: src/gtk/help-overlay.ui:75 msgctxt "shortcut window" msgid "Playback" msgstr "Çalma" #: src/gtk/help-overlay.ui:78 msgctxt "shortcut window" msgid "Toggle play/pause" msgstr "Çalma/Bekleme arasında geçiş yap" #: src/gtk/help-overlay.ui:84 msgctxt "shortcut window" msgid "Previous song" msgstr "Önceki şarkı" #: src/gtk/help-overlay.ui:90 msgctxt "shortcut window" msgid "Next song" msgstr "Sonraki şarkı" #: src/gtk/help-overlay.ui:96 msgctxt "shortcut window" msgid "Seek backwards in the current song" msgstr "Geçerli şarkıdan önceki şarkıya atla" #: src/gtk/help-overlay.ui:102 msgctxt "shortcut window" msgid "Seek forward in the current song" msgstr "Geçerli şarkıdan sonraki şarkıya atla" #: src/gtk/playback-control.ui:21 msgid "Play the Previous Song" msgstr "Önceki Şarkıyı Çal" #: src/gtk/playback-control.ui:26 msgctxt "a11y" msgid "Skip backwards" msgstr "Geriye atla" # Düğme altında görünecek ipucu metni. #: src/gtk/playback-control.ui:35 msgid "Toggle Play" msgstr "Çal veya Durdur" # Düğme altında görünecek ipucu metni. #: src/gtk/playback-control.ui:41 msgctxt "a11y" msgid "Toggle play" msgstr "Çal veya durdur" #: src/gtk/playback-control.ui:50 msgid "Play the Next Song" msgstr "Sonraki Şarkıyı Çal" #: src/gtk/playback-control.ui:55 msgctxt "a11y" msgid "Skip forward" msgstr "İleriye atla" #: src/gtk/playback-control.ui:78 msgid "Toggle Playlist" msgstr "Çalma Listesini Aç/Kapat" #: src/gtk/playback-control.ui:83 msgctxt "a11y" msgid "Toggle playlist" msgstr "Çalma listesini aç/kapat" #: src/gtk/playback-control.ui:92 msgid "Shuffle the Playlist" msgstr "Çalma Listesini Karıştır" #: src/gtk/playback-control.ui:94 msgctxt "a11y" msgid "Shuffle" msgstr "Karıştır" #: src/gtk/playback-control.ui:113 src/playback_control.rs:114 msgid "Enable Repeat" msgstr "Yinelemeyi Etkinleştir" #: src/gtk/playback-control.ui:118 msgctxt "a11y" msgid "Repeat" msgstr "Yinele" #: src/gtk/playback-control.ui:129 msgid "Main Menu" msgstr "Ana Menü" #: src/gtk/playback-control.ui:135 msgctxt "a11y" msgid "Primary menu" msgstr "Ana menü" #: src/gtk/playback-control.ui:151 msgid "Copy" msgstr "Kopyala" #: src/gtk/playback-control.ui:157 msgid "Add _Song" msgstr "Şarkı _Ekle" #: src/gtk/playback-control.ui:161 msgid "Add _Folder" msgstr "_Klasör Ekle" #: src/gtk/playback-control.ui:165 msgid "Clear" msgstr "Temizle" #: src/gtk/playback-control.ui:171 msgid "_Match Cover Art" msgstr "_Albüm Kapağıyla Eşleştir" #: src/gtk/playback-control.ui:175 msgid "_Background Playback" msgstr "_Arka Planda Çal" #: src/gtk/playback-control.ui:181 msgid "_ReplayGain" msgstr "_ReplayGain" #: src/gtk/playback-control.ui:183 msgctxt "replaygain-menu" msgid "_Album" msgstr "_Albüm" #: src/gtk/playback-control.ui:188 msgctxt "replaygain-menu" msgid "_Song" msgstr "_Şarkı" #: src/gtk/playback-control.ui:193 msgctxt "replaygain-menu" msgid "_Disabled" msgstr "_Devre Dışı" #: src/gtk/playback-control.ui:201 msgid "_Keyboard Shortcuts" msgstr "_Klavye Kısayolları" #: src/gtk/playback-control.ui:205 msgid "_About Amberol" msgstr "Amberol _Hakkında" #: src/gtk/playback-control.ui:209 msgid "_Quit" msgstr "_Çık" #: src/gtk/playlist-view.ui:19 msgid "Playlist" msgstr "Çalma Listesi" #: src/gtk/playlist-view.ui:49 msgid "Search Songs in the Playlist" msgstr "Çalma Listesindeki Şarkıları Ara" #: src/gtk/playlist-view.ui:61 msgid "Select Songs in the Playlist" msgstr "Çalma Listesindeki Şarkıları Seç" #: src/gtk/playlist-view.ui:74 msgid "Close the Playlist" msgstr "Çalma Listesini Kapat" #: src/gtk/playlist-view.ui:135 msgid "Select All Songs" msgstr "Tüm Şarkıları Seç" #: src/gtk/playlist-view.ui:148 msgid "Remove Selected Songs" msgstr "Seçili Şarkıları Kaldır" #: src/gtk/window.ui:12 msgid "Drop a song to add it to the playlist" msgstr "Çalma listesine eklenecek şarkı bırak" #: src/gtk/window.ui:49 msgid "" "Select a file or a folder, or drag files from your file manager to the " "application window to add songs to the playlist" msgstr "" "Çalma listesine şarkı eklemek için dosya veya klasör seç ya da dosyaları " "dosya yöneticisinden uygulama penceresine sürükle" #: src/gtk/window.ui:58 msgid "Restore Playlist" msgstr "Çalma Listesini Geri Yükle" #: src/gtk/window.ui:68 msgid "Add Folder" msgstr "Klasör Ekle" #: src/gtk/window.ui:77 msgid "Add Song" msgstr "Şarkı Ekle" #: src/gtk/window.ui:161 msgctxt "a11y" msgid "Elapsed time" msgstr "Geçen süre" #: src/gtk/window.ui:173 msgctxt "a11y" msgid "Remaining time" msgstr "Kalan süre" #. Translators: Replace "translator-credits" with your names, one name per line #: src/application.rs:227 msgid "translator-credits" msgstr "" "Emin Tufan Çetin \n" "Sabri Ünal " #: src/application.rs:239 msgid "Amberol needs to run in the background to play music" msgstr "Amberol, müzik çalmak için arka planda çalışmalıdır" #: src/playback_control.rs:118 msgid "Repeat All Songs" msgstr "Tüm Şarkıları Yinele" #: src/playback_control.rs:122 msgid "Repeat the Current Song" msgstr "Geçerli Şarkıyı Yinele" #: src/window.rs:403 msgid "_Add Song" msgstr "Şarkı _Ekle" #: src/window.rs:404 src/window.rs:444 msgid "_Cancel" msgstr "_Vazgeç" #: src/window.rs:406 msgid "Open File" msgstr "Dosya Aç" #: src/window.rs:413 msgid "Audio files" msgstr "Ses dosyaları" #: src/window.rs:422 src/window.rs:1315 msgid "Unable to access files" msgstr "Dosyalara erişilemiyor" #: src/window.rs:443 msgid "_Add Folder" msgstr "_Klasör Ekle" #: src/window.rs:446 msgid "Open Folder" msgstr "Klasör Aç" #: src/window.rs:457 msgid "Unable to access folders" msgstr "Klasörlere erişilemiyor" #: src/window.rs:475 msgid "No available song found" msgstr "Kullanılabilir şarkı bulunamadı" #: src/window.rs:532 msgid "No songs found" msgstr "Şarkı bulunamadı" #: src/window.rs:562 msgid "Added a new song" msgstr "Yeni şarkı eklendi" #: src/window.rs:563 msgid "Play" msgstr "Çal" #. Translators: the `{}` must be left unmodified; #. it will be expanded to the number of songs added #. to the playlist #: src/window.rs:572 msgid "Added one song" msgid_plural "Added {} songs" msgstr[0] "{} şarkı eklendi" #: src/window.rs:1062 msgid "Unable to access dropped files" msgstr "Bırakılan dosyalara erişilemiyor" #: src/window.rs:1152 msgid "{} minute" msgid_plural "{} minutes" msgstr[0] "{} dakika" #: src/window.rs:1163 msgid "{hours} hour {minutes} remaining" msgid_plural "{hours} hours {minutes} remaining" msgstr[0] "{hours} saat {minutes} kaldı" #. Translators: the '{}' must be left unmodified, and #. it will be replaced by the number of minutes remaining #. in the playlist #: src/window.rs:1173 msgid "{} minute remaining" msgid_plural "{} minutes remaining" msgstr[0] "{} dakika kaldı" #: src/window.rs:1295 msgid "No song selected" msgstr "Şarkı seçilmedi" #. Translators: The '{}' must be left unmodified, and #. it is expanded to the number of songs selected #: src/window.rs:1300 msgid "{} song selected" msgid_plural "{} songs selected" msgstr[0] "{} şarkı seçildi" #. Translators: `{title}` and `{artist}` must be left #. untranslated; they will expand to the title and #. artist of the currently playing song, respectively #: src/window.rs:1353 msgid "Currently playing “{title}” by “{artist}”" msgstr "“{artist}”, “{title}” çalıyor" amberol-0.10.3/po/uk.po000066400000000000000000000420751443320625200146220ustar00rootroot00000000000000# Ukrainian translation for amberol. # Copyright (C) 2022 amberol's COPYRIGHT HOLDER # This file is distributed under the same license as the amberol package. # # Yuri Chornoivan , 2022, 2023. msgid "" msgstr "" "Project-Id-Version: amberol main\n" "Report-Msgid-Bugs-To: https://gitlab.gnome.org/World/amberol/issues\n" "POT-Creation-Date: 2023-04-24 22:31+0000\n" "PO-Revision-Date: 2023-04-25 22:59+0300\n" "Last-Translator: Yuri Chornoivan \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=4; plural=n==1 ? 3 : n%10==1 && n%100!=11 ? 0 : n" "%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" "X-Generator: Lokalize 20.12.0\n" #: data/io.bassi.Amberol.desktop.in.in:3 #: data/io.bassi.Amberol.appdata.xml.in.in:6 msgid "Amberol" msgstr "Амберол" #: data/io.bassi.Amberol.desktop.in.in:4 msgid "Music Player" msgstr "Програвач музики" #. Translators: Search terms to find this application. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! #: data/io.bassi.Amberol.desktop.in.in:12 msgid "music;player;media;audio;playlist;" msgstr "" "music;player;media;audio;playlist;музика;звук;програвач;мультимедіа;звук;" "список відтворення;відтворення;" #: data/io.bassi.Amberol.appdata.xml.in.in:7 msgid "Plays music, and nothing else" msgstr "Відтворює музику, нічого більше" #: data/io.bassi.Amberol.appdata.xml.in.in:9 msgid "" "Amberol is a music player with no delusions of grandeur. If you just want to " "play music available on your local system then Amberol is the music player " "you are looking for." msgstr "" "«Амберол» — програма для відтворення музики без особливих претензій на " "грандіозність. Якщо вам потрібно лише відтворити вашу музику у вашій " "локальній системі, «Амберол» — саме той програвач, який вам потрібен." #: data/io.bassi.Amberol.appdata.xml.in.in:14 msgid "Current features:" msgstr "Поточні можливості:" #: data/io.bassi.Amberol.appdata.xml.in.in:16 msgid "adaptive UI" msgstr "адаптивний інтерфейс користувача" #: data/io.bassi.Amberol.appdata.xml.in.in:17 msgid "UI recoloring using the album art" msgstr "перефарбовування інтерфейсу на основі обкладинки альбому" #: data/io.bassi.Amberol.appdata.xml.in.in:18 msgid "drag and drop support to queue songs" msgstr "" "підтримка перетягування зі скиданням для створення черги відтворення " "композицій" #: data/io.bassi.Amberol.appdata.xml.in.in:19 msgid "shuffle and repeat" msgstr "перемішування і повторення" #: data/io.bassi.Amberol.appdata.xml.in.in:20 msgid "MPRIS integration" msgstr "Інтеграція із MPRIS" #: data/io.bassi.Amberol.appdata.xml.in.in:42 msgid "Emmanuele Bassi" msgstr "Emmanuele Bassi" #: src/audio/inhibit_controller.rs:40 msgid "Playback in progress" msgstr "Відбувається відтворення" #: src/audio/song.rs:325 msgid "Unknown artist" msgstr "Невідомий виконавець" #: src/audio/song.rs:332 msgid "Unknown title" msgstr "Невідома назва" #: src/audio/song.rs:339 msgid "Unknown album" msgstr "Невідомий альбом" #: src/gtk/help-overlay.ui:11 msgctxt "shortcut window" msgid "General" msgstr "Загальне" #: src/gtk/help-overlay.ui:14 msgctxt "shortcut window" msgid "Toggle primary menu" msgstr "Увімкнути або вимкнути основне меню" #: src/gtk/help-overlay.ui:20 msgctxt "shortcut window" msgid "Copy song details to the clipboard" msgstr "Скопіювати параметри композиції до буфера обміну" #: src/gtk/help-overlay.ui:26 msgctxt "shortcut window" msgid "Show shortcuts" msgstr "Показати скорочення" #: src/gtk/help-overlay.ui:32 msgctxt "shortcut window" msgid "Quit" msgstr "Вийти з програми" #: src/gtk/help-overlay.ui:40 msgctxt "shortcut window" msgid "Playlist" msgstr "Список відтворення" #: src/gtk/help-overlay.ui:43 msgctxt "shortcut window" msgid "Add a song to the playlist" msgstr "Додати композицію до списку відтворення" #: src/gtk/help-overlay.ui:49 msgctxt "shortcut window" msgid "Add a folder to the playlist" msgstr "Додати теку до списку відтворення" #: src/gtk/help-overlay.ui:55 msgctxt "shortcut window" msgid "Clear the playlist" msgstr "Спорожнити список відтворення" #: src/gtk/help-overlay.ui:61 msgctxt "shortcut window" msgid "Toggle the playlist pane" msgstr "Увімкнути або вимкнути панель списку відтворення" #: src/gtk/help-overlay.ui:67 msgctxt "shortcut window" msgid "Toggle shuffling songs" msgstr "Увімкнути/Вимкнути перемішування композицій у списку" #: src/gtk/help-overlay.ui:75 msgctxt "shortcut window" msgid "Playback" msgstr "Відтворення" #: src/gtk/help-overlay.ui:78 msgctxt "shortcut window" msgid "Toggle play/pause" msgstr "Перемкнути відтворення/призупинення" #: src/gtk/help-overlay.ui:84 msgctxt "shortcut window" msgid "Previous song" msgstr "Попередня композиція" #: src/gtk/help-overlay.ui:90 msgctxt "shortcut window" msgid "Next song" msgstr "Наступна композиція" #: src/gtk/help-overlay.ui:96 msgctxt "shortcut window" msgid "Seek backwards in the current song" msgstr "Позиціювання назад у поточній композиції" #: src/gtk/help-overlay.ui:102 msgctxt "shortcut window" msgid "Seek forward in the current song" msgstr "Позиціювання вперед у поточній композиції" #: src/gtk/playback-control.ui:21 msgid "Play the Previous Song" msgstr "Відтворити попередню композицію" #: src/gtk/playback-control.ui:26 msgctxt "a11y" msgid "Skip backwards" msgstr "Перемотати назад" #: src/gtk/playback-control.ui:35 msgid "Toggle Play" msgstr "Увімкнути або вимкнути відтворення" #: src/gtk/playback-control.ui:41 msgctxt "a11y" msgid "Toggle play" msgstr "Увімкнути або вимкнути відтворення" #: src/gtk/playback-control.ui:50 msgid "Play the Next Song" msgstr "Відтворити наступну композицію" #: src/gtk/playback-control.ui:55 msgctxt "a11y" msgid "Skip forward" msgstr "Перемотати вперед" #: src/gtk/playback-control.ui:78 msgid "Toggle Playlist" msgstr "Перемкнути список відтворення" #: src/gtk/playback-control.ui:83 msgctxt "a11y" msgid "Toggle playlist" msgstr "Перемкнути список відтворення" #: src/gtk/playback-control.ui:92 msgid "Shuffle the Playlist" msgstr "Перемішати список відтворення" #: src/gtk/playback-control.ui:94 msgctxt "a11y" msgid "Shuffle" msgstr "Перемішати" #: src/gtk/playback-control.ui:113 src/playback_control.rs:114 msgid "Enable Repeat" msgstr "Увімкнути повторення" #: src/gtk/playback-control.ui:118 msgctxt "a11y" msgid "Repeat" msgstr "Повторити" #: src/gtk/playback-control.ui:129 msgid "Main Menu" msgstr "Головне меню" #: src/gtk/playback-control.ui:135 msgctxt "a11y" msgid "Primary menu" msgstr "Основне меню" #: src/gtk/playback-control.ui:151 msgid "Copy" msgstr "Копіювати" #: src/gtk/playback-control.ui:157 msgid "Add _Song" msgstr "Додати _композицію" #: src/gtk/playback-control.ui:161 msgid "Add _Folder" msgstr "Додати _теку" #: src/gtk/playback-control.ui:165 msgid "Clear" msgstr "Очистити" #: src/gtk/playback-control.ui:171 msgid "_Match Cover Art" msgstr "_Колір обкладинки" #: src/gtk/playback-control.ui:175 msgid "_Background Playback" msgstr "_Фонове відтворення" #: src/gtk/playback-control.ui:181 msgid "_ReplayGain" msgstr "_Підсилення відтворення" #: src/gtk/playback-control.ui:183 #| msgid "_Album" msgctxt "replaygain-menu" msgid "_Album" msgstr "_Альбом" #: src/gtk/playback-control.ui:188 #| msgid "Add _Song" msgctxt "replaygain-menu" msgid "_Song" msgstr "_Композиція" #: src/gtk/playback-control.ui:193 msgctxt "replaygain-menu" msgid "_Disabled" msgstr "Ви_мкнено" #: src/gtk/playback-control.ui:201 msgid "_Keyboard Shortcuts" msgstr "_Клавіатурні скорочення" #: src/gtk/playback-control.ui:205 msgid "_About Amberol" msgstr "_Про «Амберол»" #: src/gtk/playback-control.ui:209 msgid "_Quit" msgstr "Ви_йти" #: src/gtk/playlist-view.ui:19 msgid "Playlist" msgstr "Список відтворення" #: src/gtk/playlist-view.ui:49 msgid "Search Songs in the Playlist" msgstr "Шукати композиції у списку відтворення" #: src/gtk/playlist-view.ui:61 msgid "Select Songs in the Playlist" msgstr "Вибрати композиції у списку відтворення" #: src/gtk/playlist-view.ui:74 msgid "Close the Playlist" msgstr "Закрити список відтворення" #: src/gtk/playlist-view.ui:135 msgid "Select All Songs" msgstr "Позначити усі композиції" #: src/gtk/playlist-view.ui:148 msgid "Remove Selected Songs" msgstr "Вилучити позначені композиції" #: src/gtk/window.ui:12 #| msgid "Drop a song to add it to the queue" msgid "Drop a song to add it to the playlist" msgstr "Скиньте композицію, щоб додати її до списку відтворення" #: src/gtk/window.ui:49 msgid "" "Select a file or a folder, or drag files from your file manager to the " "application window to add songs to the playlist" msgstr "" "Виберіть файл чи теку або перетягніть файли з вашої програми для керування " "файлами до вікна програми, щоб додати композиції до списку відтворення" #: src/gtk/window.ui:58 msgid "Restore Playlist" msgstr "Відновити список відтворення" #: src/gtk/window.ui:68 msgid "Add Folder" msgstr "Додати теку" #: src/gtk/window.ui:77 msgid "Add Song" msgstr "Додати композицію" #: src/gtk/window.ui:161 msgctxt "a11y" msgid "Elapsed time" msgstr "Час, що минув" #: src/gtk/window.ui:173 msgctxt "a11y" msgid "Remaining time" msgstr "Час, що залишився" #. Translators: Replace "translator-credits" with your names, one name per line #: src/application.rs:227 msgid "translator-credits" msgstr "Юрій Чорноіван , 2022" #: src/application.rs:239 msgid "Amberol needs to run in the background to play music" msgstr "«Амберол» має бути запущено у фоновому режимі для відтворення музики" #: src/playback_control.rs:118 #| msgid "Select All Songs" msgid "Repeat All Songs" msgstr "Повторити усі композиції" #: src/playback_control.rs:122 #| msgid "Repeat the Current Track" msgid "Repeat the Current Song" msgstr "Повторити поточну композицію" #: src/window.rs:403 msgid "_Add Song" msgstr "_Додати композицію" #: src/window.rs:404 src/window.rs:444 msgid "_Cancel" msgstr "_Скасувати" #: src/window.rs:406 msgid "Open File" msgstr "Відкрити файл" #: src/window.rs:413 msgid "Audio files" msgstr "файли звукових даних" #: src/window.rs:422 src/window.rs:1315 msgid "Unable to access files" msgstr "Не вдалося отримати доступ до файлів" #: src/window.rs:443 msgid "_Add Folder" msgstr "_Додати теку" #: src/window.rs:446 msgid "Open Folder" msgstr "Відкрити теку" #: src/window.rs:457 msgid "Unable to access folders" msgstr "Не вдалося отримати доступ до тек" #: src/window.rs:475 msgid "No available song found" msgstr "Не знайдено доступних композицій" #: src/window.rs:532 msgid "No songs found" msgstr "Композицій не знайдено" #: src/window.rs:562 msgid "Added a new song" msgstr "Додано нову композицію" #: src/window.rs:563 msgid "Play" msgstr "Відтворити" #. Translators: the `{}` must be left unmodified; #. it will be expanded to the number of songs added #. to the playlist #: src/window.rs:572 msgid "Added one song" msgid_plural "Added {} songs" msgstr[0] "Додано {} композицію" msgstr[1] "Додано {} композиції" msgstr[2] "Додано {} композицій" msgstr[3] "Додано одну композицію" #: src/window.rs:1062 msgid "Unable to access dropped files" msgstr "Не вдалося отримати доступ до скинутих файлів" #: src/window.rs:1152 msgid "{} minute" msgid_plural "{} minutes" msgstr[0] "{} хвилина" msgstr[1] "{} хвилини" msgstr[2] "{} хвилин" msgstr[3] "{} хвилина" #: src/window.rs:1163 msgid "{hours} hour {minutes} remaining" msgid_plural "{hours} hours {minutes} remaining" msgstr[0] "Лишилася {hours} година {minutes}" msgstr[1] "Лишилося {hours} години {minutes}" msgstr[2] "Лишилося {hours} годин {minutes}" msgstr[3] "Лишилася {hours} година {minutes}" #. Translators: the '{}' must be left unmodified, and #. it will be replaced by the number of minutes remaining #. in the playlist #: src/window.rs:1173 msgid "{} minute remaining" msgid_plural "{} minutes remaining" msgstr[0] "Лишилася {} хвилина" msgstr[1] "Лишилося {} хвилини" msgstr[2] "Лишилося {} хвилин" msgstr[3] "Лишилася хвилина" #: src/window.rs:1295 msgid "No song selected" msgstr "Не вибрано композиції" #. Translators: The '{}' must be left unmodified, and #. it is expanded to the number of songs selected #: src/window.rs:1300 msgid "{} song selected" msgid_plural "{} songs selected" msgstr[0] "Вибрано {} композицію" msgstr[1] "Вибрано {} композиції" msgstr[2] "Вибрано {} композицій" msgstr[3] "Вибрано {} композицію" #. Translators: `{title}` and `{artist}` must be left #. untranslated; they will expand to the title and #. artist of the currently playing song, respectively #: src/window.rs:1353 msgid "Currently playing “{title}” by “{artist}”" msgstr "Зараз відтворюємо «{title}», «{artist}»" #~ msgid "_Track" #~ msgstr "_Композиція" #~ msgid "_Off" #~ msgstr "_Вимкнути" #~ msgid "Repeat All Tracks" #~ msgstr "Повторити усі композиції" #~ msgid "Add File" #~ msgstr "Додати файл" #~ msgid "Plays music and nothing else" #~ msgstr "Відтворює музику, нічого більше" #~ msgid "Amberol cannot run in the background" #~ msgstr "«Амберол» не може бути запущено у фоновому режимі" #~ msgid "{} hour" #~ msgid_plural "{} hours" #~ msgstr[0] "{} година" #~ msgstr[1] "{} години" #~ msgstr[2] "{} годин" #~ msgstr[3] "{} година" #~ msgid "“{}” is not a supported audio file" #~ msgstr "«{}» не є підтримуваним звуковим файлом" #~ msgid "Unrecognized file type for “{}”" #~ msgstr "Нерозпізнаний тип файлів «{}»" #~ msgid "Amberol is running in the background" #~ msgstr "«Амберол» запущено у фоновому режимі" #~ msgid "Playing next" #~ msgstr "Відтворення наступної" #~ msgctxt "shortcut window" #~ msgid "Songs Queue" #~ msgstr "Черга відтворення композицій" #~ msgctxt "shortcut window" #~ msgid "Queue a Song" #~ msgstr "Додати композицію до черги" #~ msgctxt "shortcut window" #~ msgid "Queue a Folder" #~ msgstr "Додати теку до черги" #~ msgctxt "shortcut window" #~ msgid "Clear" #~ msgstr "Очистити" #~ msgctxt "shortcut window" #~ msgid "Previous Track" #~ msgstr "Попередня композиція" #~| msgid "Choose a folder" #~ msgid "Choose a file" #~ msgstr "Виберіть файл" #~ msgid "Choose a folder" #~ msgstr "Виберіть теку" #~ msgctxt "shortcut window" #~ msgid "Seek Backwards" #~ msgstr "Перейти назад" #~ msgctxt "shortcut window" #~ msgid "Seek Forward" #~ msgstr "Перемотати вперед" #~ msgid "Show the playlist" #~ msgstr "Показати список відтворення" amberol-0.10.3/po/zh_CN.po000066400000000000000000000274731443320625200152110ustar00rootroot00000000000000# Chinese (China) translation for amberol. # Copyright (C) 2022 amberol's COPYRIGHT HOLDER # This file is distributed under the same license as the amberol package. # D , 2022. # lumingzh , 2022. # msgid "" msgstr "" "Project-Id-Version: amberol main\n" "Report-Msgid-Bugs-To: https://gitlab.gnome.org/World/amberol/issues\n" "POT-Creation-Date: 2022-09-03 19:22+0000\n" "PO-Revision-Date: 2022-09-10 19:07+0800\n" "Last-Translator: lumingzh \n" "Language-Team: Chinese - China \n" "Language: zh_CN\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0\n" "X-Generator: Gtranslator 42.0\n" #: data/io.bassi.Amberol.desktop.in.in:3 #: data/io.bassi.Amberol.appdata.xml.in.in:6 msgid "Amberol" msgstr "Amberol" #: data/io.bassi.Amberol.desktop.in.in:4 msgid "Music Player" msgstr "音乐播放器" #. Translators: Search terms to find this application. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! #: data/io.bassi.Amberol.desktop.in.in:12 msgid "music;player;media;audio;playlist;" msgstr "music;player;media;audio;playlist;音乐;播放器;媒体;音频;播放列表;" #: data/io.bassi.Amberol.appdata.xml.in.in:7 msgid "Plays music, and nothing else" msgstr "播放音乐,别无其他" #: data/io.bassi.Amberol.appdata.xml.in.in:9 msgid "" "Amberol is a music player with no delusions of grandeur. If you just want to " "play music available on your local system then Amberol is the music player " "you are looking for." msgstr "" "Amberol 是一个没有宏伟妄想的音乐播放器。如果您只想播放您的本地系统上可用的音" "乐,那么 Amberol 就是您正在寻找的音乐播放器。" #: data/io.bassi.Amberol.appdata.xml.in.in:14 msgid "Current features:" msgstr "当前功能:" #: data/io.bassi.Amberol.appdata.xml.in.in:16 msgid "adaptive UI" msgstr "自适应用户界面" #: data/io.bassi.Amberol.appdata.xml.in.in:17 msgid "UI recoloring using the album art" msgstr "使用专辑封面为用户界面重新着色" #: data/io.bassi.Amberol.appdata.xml.in.in:18 msgid "drag and drop support to queue songs" msgstr "支持拖放将歌曲添加到队列" #: data/io.bassi.Amberol.appdata.xml.in.in:19 msgid "shuffle and repeat" msgstr "乱序和重复" #: data/io.bassi.Amberol.appdata.xml.in.in:20 msgid "MPRIS integration" msgstr "MPRIS 集成" #: data/io.bassi.Amberol.appdata.xml.in.in:41 msgid "Emmanuele Bassi" msgstr "Emmanuele Bassi" #: src/audio/inhibit_controller.rs:40 msgid "Playback in progress" msgstr "播放正在进行" #: src/audio/song.rs:328 msgid "Unknown artist" msgstr "未知艺术家" #: src/audio/song.rs:335 msgid "Unknown title" msgstr "未知标题" #: src/audio/song.rs:342 msgid "Unknown album" msgstr "未知专辑" #: src/gtk/help-overlay.ui:11 msgctxt "shortcut window" msgid "General" msgstr "常规" #: src/gtk/help-overlay.ui:14 msgctxt "shortcut window" msgid "Toggle primary menu" msgstr "切换主菜单" #: src/gtk/help-overlay.ui:20 msgctxt "shortcut window" msgid "Copy song details to the clipboard" msgstr "将歌曲详细信息复制到剪贴板" #: src/gtk/help-overlay.ui:26 msgctxt "shortcut window" msgid "Show Shortcuts" msgstr "显示快捷键" #: src/gtk/help-overlay.ui:32 msgctxt "shortcut window" msgid "Quit" msgstr "退出" #: src/gtk/help-overlay.ui:40 msgctxt "shortcut window" msgid "Playlist" msgstr "播放列表" #: src/gtk/help-overlay.ui:43 msgctxt "shortcut window" msgid "Add a song to the playlist" msgstr "将歌曲添加到播放列表" #: src/gtk/help-overlay.ui:49 msgctxt "shortcut window" msgid "Add a folder to the playlist" msgstr "将文件夹添加到播放列表" #: src/gtk/help-overlay.ui:55 msgctxt "shortcut window" msgid "Clear the playlist" msgstr "清除播放列表" #: src/gtk/help-overlay.ui:61 msgctxt "shortcut window" msgid "Toggle the playlist pane" msgstr "切换播放列表窗格" #: src/gtk/help-overlay.ui:67 msgctxt "shortcut window" msgid "Toggle shuffling songs" msgstr "切换乱序歌曲" #: src/gtk/help-overlay.ui:75 msgctxt "shortcut window" msgid "Playback" msgstr "播放" #: src/gtk/help-overlay.ui:78 msgctxt "shortcut window" msgid "Toggle Play/Pause" msgstr "切换播放/暂停" #: src/gtk/help-overlay.ui:84 msgctxt "shortcut window" msgid "Previous song" msgstr "上一首歌曲" #: src/gtk/help-overlay.ui:90 msgctxt "shortcut window" msgid "Next song" msgstr "下一首歌曲" #: src/gtk/help-overlay.ui:96 msgctxt "shortcut window" msgid "Seek backwards in the current song" msgstr "在当前歌曲中快退" #: src/gtk/help-overlay.ui:102 msgctxt "shortcut window" msgid "Seek forward in the current song" msgstr "在当前歌曲中快进" #: src/gtk/playback-control.ui:30 msgctxt "a11y" msgid "Elapsed time" msgstr "已用时间" #: src/gtk/playback-control.ui:42 msgctxt "a11y" msgid "Remaining time" msgstr "剩余时间" #: src/gtk/playback-control.ui:64 msgid "Play the Previous Song" msgstr "播放上一首歌曲" #: src/gtk/playback-control.ui:69 msgctxt "a11y" msgid "Skip backwards" msgstr "快退" #: src/gtk/playback-control.ui:78 msgid "Toggle Play" msgstr "切换播放" #: src/gtk/playback-control.ui:84 msgctxt "a11y" msgid "Toggle play" msgstr "切换播放" #: src/gtk/playback-control.ui:93 msgid "Play the Next Song" msgstr "播放下一首歌曲" #: src/gtk/playback-control.ui:98 msgctxt "a11y" msgid "Skip forward" msgstr "快进" #: src/gtk/playback-control.ui:121 msgid "Toggle Playlist" msgstr "切换播放列表" #: src/gtk/playback-control.ui:126 msgctxt "a11y" msgid "Toggle playlist" msgstr "切换播放列表" #: src/gtk/playback-control.ui:135 msgid "Shuffle the Playlist" msgstr "乱序播放列表" #: src/gtk/playback-control.ui:137 msgctxt "a11y" msgid "Shuffle" msgstr "乱序" #: src/gtk/playback-control.ui:156 src/playback_control.rs:153 msgid "Enable Repeat" msgstr "启用重复" #: src/gtk/playback-control.ui:161 msgctxt "a11y" msgid "Repeat" msgstr "重复" #: src/gtk/playback-control.ui:172 msgid "Main Menu" msgstr "主菜单" #: src/gtk/playback-control.ui:177 msgctxt "a11y" msgid "Primary menu" msgstr "主菜单" #: src/gtk/playback-control.ui:193 msgid "Copy" msgstr "复制" #: src/gtk/playback-control.ui:199 msgid "Add _Song" msgstr "添加歌曲(_S)" #: src/gtk/playback-control.ui:203 msgid "Add _Folder" msgstr "添加文件夹(_F)" #: src/gtk/playback-control.ui:207 msgid "Clear" msgstr "清除" #: src/gtk/playback-control.ui:213 msgid "_Match Cover Art" msgstr "匹配封面(_M)" #: src/gtk/playback-control.ui:219 msgid "_ReplayGain" msgstr "回放增益(_R)" #: src/gtk/playback-control.ui:221 msgid "_Album" msgstr "专辑(_A)" #: src/gtk/playback-control.ui:226 msgid "_Track" msgstr "曲目(_T)" #: src/gtk/playback-control.ui:231 msgid "_Off" msgstr "关闭(_O)" #: src/gtk/playback-control.ui:239 msgid "_Keyboard Shortcuts" msgstr "键盘快捷键(_K)" #: src/gtk/playback-control.ui:243 msgid "_About Amberol" msgstr "关于 Amberol(_A)" #: src/gtk/playback-control.ui:247 msgid "_Quit" msgstr "退出(_Q)" #: src/gtk/playlist-view.ui:19 msgid "Playlist" msgstr "播放列表" #: src/gtk/playlist-view.ui:49 msgid "Search Songs in the Playlist" msgstr "在播放列表中搜索歌曲" #: src/gtk/playlist-view.ui:61 msgid "Select Songs in the Playlist" msgstr "选择播放列表中的歌曲" #: src/gtk/playlist-view.ui:74 msgid "Close the Playlist" msgstr "关闭播放列表" #: src/gtk/playlist-view.ui:135 msgid "Select All Songs" msgstr "选择全部歌曲" #: src/gtk/playlist-view.ui:148 msgid "Remove Selected Songs" msgstr "移除选中歌曲" #: src/gtk/window.ui:12 msgid "Drop a song to add it to the queue" msgstr "放开歌曲以将其添加到队列" #: src/gtk/window.ui:49 msgid "" "Select a file or a folder, or drag files from your file manager to the " "application window to add songs to the playlist" msgstr "" "选择文件或文件夹,或将文件从您的文件管理器拖动到应用程序窗口,以将歌曲添加到" "播放列表" #: src/gtk/window.ui:58 msgid "Add Folder" msgstr "添加文件夹" #: src/gtk/window.ui:68 msgid "Add File" msgstr "添加文件" #: src/application.rs:181 msgid "Plays music and nothing else" msgstr "播放音乐,别无其他" #. Translators: Replace "translator-credits" with your names, one name per line #: src/application.rs:188 msgid "translator-credits" msgstr "" "D , 2022.\n" "lumingzh , 2022." #: src/playback_control.rs:157 msgid "Repeat All Tracks" msgstr "重复全部曲目" #: src/playback_control.rs:161 msgid "Repeat the Current Track" msgstr "重复当前曲目" #: src/window.rs:409 msgid "_Add Song" msgstr "添加歌曲(_A)" #: src/window.rs:410 src/window.rs:450 msgid "_Cancel" msgstr "取消(_C)" #: src/window.rs:412 msgid "Open File" msgstr "打开文件" #: src/window.rs:419 msgid "Audio files" msgstr "音频文件" #: src/window.rs:428 src/window.rs:1276 msgid "Unable to access files" msgstr "无法访问文件" #: src/window.rs:449 msgid "_Add Folder" msgstr "添加文件夹(_A)" #: src/window.rs:452 msgid "Open Folder" msgstr "打开文件夹" #: src/window.rs:463 msgid "Unable to access folders" msgstr "无法访问文件夹" #: src/window.rs:475 msgid "No available song found" msgstr "找不到可用歌曲" #: src/window.rs:523 msgid "No songs found" msgstr "找不到歌曲" #: src/window.rs:549 msgid "Added a new song" msgstr "已添加一首新歌曲" #: src/window.rs:550 msgid "Play" msgstr "播放" #. Translators: the `{}` must be left unmodified; #. it will be expanded to the number of songs added #. to the playlist #: src/window.rs:559 msgid "Added one song" msgid_plural "Added {} songs" msgstr[0] "已添加 {} 首歌曲" #: src/window.rs:1012 msgid "Unable to access dropped files" msgstr "无法访问拖放的文件" #: src/window.rs:1106 msgid "{} minute" msgid_plural "{} minutes" msgstr[0] "{} 分钟" #: src/window.rs:1117 msgid "{hours} hour {minutes} remaining" msgid_plural "{hours} hours {minutes} remaining" msgstr[0] "剩余 {hours} 小时 {minutes} 分钟" #. Translators: the '{}' must be left unmodified, and #. it will be replaced by the number of minutes remaining #. in the playlist #: src/window.rs:1127 msgid "{} minute remaining" msgid_plural "{} minutes remaining" msgstr[0] "剩余 {} 分钟" #: src/window.rs:1256 msgid "No song selected" msgstr "未选择歌曲" #. Translators: The '{}' must be left unmodified, and #. it is expanded to the number of songs selected #: src/window.rs:1261 msgid "{} song selected" msgid_plural "{} songs selected" msgstr[0] "已选择 {} 首歌曲" #. Translators: `{title}` and `{artist}` must be left #. untranslated; they will expand to the title and #. artist of the currently playing song, respectively #: src/window.rs:1314 msgid "Currently playing “{title}” by “{artist}”" msgstr "当前正在播放“{artist}”的“{title}”" #: src/window.rs:1360 msgid "Amberol needs to run in the background to play music" msgstr "Amberol 需要在后台运行以播放音乐" #: src/window.rs:1373 msgid "Amberol cannot run in the background" msgstr "Amberol 无法在后台运行" #~ msgid "“{}” is not a supported audio file" #~ msgstr "“{}”不是受支持的音频文件" #~ msgid "Unrecognized file type for “{}”" #~ msgstr "无法识别“{}”的文件类型" #~ msgid "Amberol is running in the background" #~ msgstr "Amberol 正在后台运行" #~ msgctxt "shortcut window" #~ msgid "Songs Queue" #~ msgstr "歌曲队列" #~ msgctxt "shortcut window" #~ msgid "Queue a Song" #~ msgstr "将歌曲添加到队列" #~ msgctxt "shortcut window" #~ msgid "Queue a Folder" #~ msgstr "将文件夹添加到队列" #~ msgctxt "shortcut window" #~ msgid "Clear" #~ msgstr "清除" #~ msgctxt "shortcut window" #~ msgid "Previous Track" #~ msgstr "上一曲目" #~ msgid "Playing next" #~ msgstr "接下来播放" amberol-0.10.3/src/000077500000000000000000000000001443320625200140045ustar00rootroot00000000000000amberol-0.10.3/src/amberol.gresource.xml000066400000000000000000000051021443320625200201420ustar00rootroot00000000000000 assets/icons/app-remove-symbolic.svg assets/icons/audio-only-symbolic.svg assets/icons/edit-clear-all-symbolic.svg assets/icons/edit-select-all-symbolic.svg assets/icons/folder-music-symbolic.svg assets/icons/go-previous-symbolic.svg assets/icons/media-playback-pause-symbolic.svg assets/icons/media-playback-start-symbolic.svg assets/icons/media-playlist-consecutive-symbolic.svg assets/icons/media-playlist-repeat-song-symbolic.svg assets/icons/media-playlist-repeat-symbolic.svg assets/icons/media-playlist-shuffle-symbolic.svg assets/icons/media-skip-backward-symbolic.svg assets/icons/media-skip-forward-symbolic.svg assets/icons/selection-mode-symbolic.svg assets/icons/view-queue-rtl-symbolic.svg assets/icons/view-queue-symbolic.svg gtk/help-overlay.ui gtk/playback-control.ui gtk/playlist-view.ui gtk/queue-row.ui gtk/song-cover.ui gtk/song-details.ui gtk/style-hc.css gtk/style.css gtk/volume-control.ui gtk/window.ui amberol-0.10.3/src/application.rs000066400000000000000000000220621443320625200166570ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2022 Emmanuele Bassi // SPDX-License-Identifier: GPL-3.0-or-later use std::{cell::RefCell, rc::Rc}; use adw::subclass::prelude::*; #[cfg(any(target_os = "linux", target_os = "freebsd"))] use ashpd::{desktop::background::Background, WindowIdentifier}; use glib::{clone, Receiver}; use gtk::{gio, glib, prelude::*}; use log::{debug, warn}; use crate::{ audio::AudioPlayer, config::{APPLICATION_ID, VERSION}, i18n::i18n, utils, window::Window, }; pub enum ApplicationAction { Present, } mod imp { use super::*; #[derive(Debug)] pub struct Application { pub player: Rc, pub receiver: RefCell>>, pub background_hold: RefCell>, pub settings: gio::Settings, } #[glib::object_subclass] impl ObjectSubclass for Application { const NAME: &'static str = "AmberolApplication"; type Type = super::Application; type ParentType = adw::Application; fn new() -> Self { let (sender, r) = glib::MainContext::channel(glib::PRIORITY_DEFAULT); let receiver = RefCell::new(Some(r)); Self { player: AudioPlayer::new(sender), receiver, background_hold: RefCell::default(), settings: utils::settings_manager(), } } } impl ObjectImpl for Application { fn constructed(&self) { self.parent_constructed(); let obj = self.obj(); obj.setup_channel(); obj.setup_gactions(); obj.setup_settings(); obj.set_accels_for_action("app.quit", &["q"]); obj.set_accels_for_action("queue.add-song", &["s"]); obj.set_accels_for_action("queue.add-folder", &["a"]); obj.set_accels_for_action("queue.clear", &["L"]); obj.set_accels_for_action("queue.toggle", &["F9"]); obj.set_accels_for_action("queue.search", &["F"]); obj.set_accels_for_action("queue.shuffle", &["r"]); obj.set_accels_for_action("win.seek-backwards", &["Left"]); obj.set_accels_for_action("win.seek-forward", &["Right"]); obj.set_accels_for_action("win.previous", &["b"]); obj.set_accels_for_action("win.next", &["n"]); obj.set_accels_for_action("win.play", &["p"]); obj.set_accels_for_action("win.copy", &["c"]); } } impl ApplicationImpl for Application { fn startup(&self) { self.parent_startup(); gtk::Window::set_default_icon_name(APPLICATION_ID); } fn activate(&self) { debug!("Application::activate"); self.obj().present_main_window(); } fn open(&self, files: &[gio::File], _hint: &str) { debug!("Application::open"); let application = self.obj(); application.present_main_window(); if let Some(window) = application.active_window() { window.downcast_ref::().unwrap().open_files(files); } } } impl GtkApplicationImpl for Application {} impl AdwApplicationImpl for Application {} } glib::wrapper! { pub struct Application(ObjectSubclass) @extends gio::Application, gtk::Application, adw::Application, @implements gio::ActionGroup, gio::ActionMap; } impl Default for Application { fn default() -> Self { glib::Object::builder::() .property("application-id", &APPLICATION_ID) .property("flags", gio::ApplicationFlags::HANDLES_OPEN) .property("resource-base-path", &"/io/bassi/Amberol") .build() } } impl Application { pub fn new() -> Self { Self::default() } pub fn player(&self) -> Rc { self.imp().player.clone() } fn setup_settings(&self) { self.imp().settings.connect_changed( Some("background-play"), clone!(@weak self as this => move |settings, _| { let background_play = settings.boolean("background-play"); debug!("GSettings:background-play: {background_play}"); if background_play { this.request_background(); } else { debug!("Dropping background hold"); this.imp().background_hold.replace(None); } }), ); let _dummy = self.imp().settings.boolean("background-play"); } fn setup_channel(&self) { let receiver = self.imp().receiver.borrow_mut().take().unwrap(); receiver.attach( None, clone!(@strong self as this => move |action| this.process_action(action)), ); } fn process_action(&self, action: ApplicationAction) -> glib::Continue { match action { ApplicationAction::Present => self.present_main_window(), // _ => debug!("Received action {:?}", action), } glib::Continue(true) } fn present_main_window(&self) { let window = if let Some(window) = self.active_window() { window } else { let window = Window::new(self); window.upcast() }; #[cfg(any(target_os = "linux", target_os = "freebsd"))] self.request_background(); window.present(); } fn setup_gactions(&self) { self.add_action_entries([ gio::ActionEntry::builder("quit") .activate(|app: &Application, _, _| { app.quit(); }) .build(), gio::ActionEntry::builder("about") .activate(|app: &Application, _, _| { app.show_about(); }) .build(), ]); let background_play = self.imp().settings.boolean("background-play"); self.add_action_entries([gio::ActionEntry::builder("background-play") .state(background_play.to_variant()) .activate(|this: &Application, action, _| { let state = action.state().unwrap(); let action_state: bool = state.get().unwrap(); let background_play = !action_state; action.set_state(background_play.to_variant()); this.imp() .settings .set_boolean("background-play", background_play) .expect("Unable to store background-play setting"); }) .build()]); } fn show_about(&self) { let window = self.active_window().unwrap(); let dialog = adw::AboutWindow::builder() .transient_for(&window) .application_icon(APPLICATION_ID) .application_name("Amberol") .developer_name("Emmanuele Bassi") .version(VERSION) .developers(vec!["Emmanuele Bassi"]) .copyright("© 2022 Emmanuele Bassi") .website("https://apps.gnome.org/app/io.bassi.Amberol/") .issue_url("https://gitlab.gnome.org/World/amberol/-/issues/new") .license_type(gtk::License::Gpl30) // Translators: Replace "translator-credits" with your names, one name per line .translator_credits(&i18n("translator-credits")) .build(); dialog.present(); } #[cfg(any(target_os = "linux", target_os = "freebsd"))] async fn portal_request_background(&self) { if let Some(window) = self.active_window() { let root = window.native().unwrap(); let identifier = WindowIdentifier::from_native(&root).await; let request = Background::request().identifier(identifier).reason(&*i18n( "Amberol needs to run in the background to play music", )); match request.send().await.and_then(|r| r.response()) { Ok(response) => { debug!("Background request successful: {:?}", response); self.imp().background_hold.replace(Some(self.hold())); } Err(err) => { warn!("Background request denied: {}", err); self.imp() .settings .set_boolean("background-play", false) .expect("Unable to set background-play settings key"); } } } } #[cfg(any(target_os = "linux", target_os = "freebsd"))] fn request_background(&self) { let background_play = self.imp().settings.boolean("background-play"); if background_play { let ctx = glib::MainContext::default(); ctx.spawn_local(clone!(@weak self as app => async move { app.portal_request_background().await })); } } #[cfg(not(any(target_os = "linux", target_os = "freebsd")))] fn request_background(&self) {} } amberol-0.10.3/src/assets/000077500000000000000000000000001443320625200153065ustar00rootroot00000000000000amberol-0.10.3/src/assets/icons/000077500000000000000000000000001443320625200164215ustar00rootroot00000000000000amberol-0.10.3/src/assets/icons/app-remove-symbolic.svg000066400000000000000000000003401443320625200230310ustar00rootroot00000000000000amberol-0.10.3/src/assets/icons/audio-only-symbolic.svg000066400000000000000000000054061443320625200230460ustar00rootroot00000000000000 amberol-0.10.3/src/assets/icons/edit-clear-all-symbolic.svg000066400000000000000000000023131443320625200235370ustar00rootroot00000000000000 amberol-0.10.3/src/assets/icons/edit-select-all-symbolic.svg000066400000000000000000000020611443320625200237300ustar00rootroot00000000000000 amberol-0.10.3/src/assets/icons/folder-music-symbolic.svg000066400000000000000000000014371443320625200233570ustar00rootroot00000000000000 amberol-0.10.3/src/assets/icons/go-previous-symbolic.svg000066400000000000000000000011761443320625200232450ustar00rootroot00000000000000 amberol-0.10.3/src/assets/icons/media-playback-pause-symbolic.svg000066400000000000000000000010071443320625200247350ustar00rootroot00000000000000 amberol-0.10.3/src/assets/icons/media-playback-start-symbolic.svg000066400000000000000000000010521443320625200247550ustar00rootroot00000000000000 amberol-0.10.3/src/assets/icons/media-playlist-consecutive-symbolic.svg000066400000000000000000000012241443320625200262230ustar00rootroot00000000000000 amberol-0.10.3/src/assets/icons/media-playlist-repeat-song-symbolic.svg000066400000000000000000000032621443320625200261240ustar00rootroot00000000000000 amberol-0.10.3/src/assets/icons/media-playlist-repeat-symbolic.svg000066400000000000000000000024061443320625200251570ustar00rootroot00000000000000 amberol-0.10.3/src/assets/icons/media-playlist-shuffle-symbolic.svg000066400000000000000000000032671443320625200253410ustar00rootroot00000000000000 amberol-0.10.3/src/assets/icons/media-skip-backward-symbolic.svg000066400000000000000000000013331443320625200245600ustar00rootroot00000000000000 amberol-0.10.3/src/assets/icons/media-skip-forward-symbolic.svg000066400000000000000000000013321443320625200244450ustar00rootroot00000000000000 amberol-0.10.3/src/assets/icons/selection-mode-symbolic.svg000066400000000000000000000031441443320625200236720ustar00rootroot00000000000000 amberol-0.10.3/src/assets/icons/view-queue-rtl-symbolic.svg000066400000000000000000000010731443320625200236550ustar00rootroot00000000000000 amberol-0.10.3/src/assets/icons/view-queue-symbolic.svg000066400000000000000000000010711443320625200230540ustar00rootroot00000000000000 amberol-0.10.3/src/audio/000077500000000000000000000000001443320625200151055ustar00rootroot00000000000000amberol-0.10.3/src/audio/controller.rs000066400000000000000000000005531443320625200176410ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2022 Emmanuele Bassi // SPDX-License-Identifier: GPL-3.0-or-later use crate::audio::{PlaybackState, RepeatMode, Song}; pub trait Controller { fn set_playback_state(&self, state: &PlaybackState); fn set_song(&self, song: &Song); fn set_position(&self, position: u64); fn set_repeat_mode(&self, repeat: RepeatMode); } amberol-0.10.3/src/audio/cover_cache.rs000066400000000000000000000152051443320625200177170ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2022 Emmanuele Bassi // SPDX-License-Identifier: GPL-3.0-or-later use std::{ collections::HashMap, path::{Path, PathBuf}, sync::Mutex, }; use gtk::{gdk, gio, glib, prelude::*}; use log::debug; use once_cell::sync::OnceCell; use sha2::{Digest, Sha256}; use crate::utils; #[derive(Clone, Debug)] pub struct CoverArt { texture: gdk::Texture, palette: Vec, cache: Option, } impl CoverArt { pub fn texture(&self) -> &gdk::Texture { self.texture.as_ref() } pub fn palette(&self) -> &Vec { self.palette.as_ref() } pub fn cache(&self) -> Option<&PathBuf> { self.cache.as_ref() } } #[derive(Debug)] pub struct CoverCache { entries: HashMap, } impl CoverCache { pub fn global() -> &'static Mutex { static CACHE: OnceCell> = OnceCell::new(); CACHE.get_or_init(|| { let c = CoverCache::new(); Mutex::new(c) }) } fn new() -> Self { CoverCache { entries: HashMap::new(), } } fn add_entry(&mut self, uuid: &str, cover: CoverArt) -> &CoverArt { self.entries.entry(uuid.to_string()).or_insert(cover) } fn lookup(&self, uuid: &String) -> Option<&CoverArt> { self.entries.get(uuid) } fn load_cover_art(&self, tag: &lofty::Tag, path: Option<&Path>) -> Option { if let Some(picture) = tag.get_picture_type(lofty::PictureType::CoverFront) { debug!("Found CoverFront"); return Some(glib::Bytes::from(picture.data())); } else { // If we don't have a CoverFront picture, we fall back to Other // and BandLogo types for picture in tag.pictures() { let cover_art = match picture.pic_type() { lofty::PictureType::Other => Some(glib::Bytes::from(picture.data())), lofty::PictureType::BandLogo => Some(glib::Bytes::from(picture.data())), _ => None, }; if cover_art.is_some() { debug!("Found fallback"); return cover_art; } } } // We always favour the cover art in the song metadata because it's going // to be in a hot cache; looking for a separate file will blow a bunch of // caches out of the water, which will slow down loading the song into the // playlist model match path { Some(p) => { let ext_covers = vec!["Cover.jpg", "Cover.png", "cover.jpg", "cover.png"]; for name in ext_covers { let mut cover_file = PathBuf::from(p); cover_file.push(name); debug!("Looking for external cover file: {:?}", &cover_file); let f = gio::File::for_path(&cover_file); if let Ok((res, _)) = f.load_bytes(None::<&gio::Cancellable>) { debug!("Loading cover from external cover file"); return Some(res); } } } None => (), }; debug!("No cover art"); None } pub fn cover_art(&mut self, path: &Path, tag: &lofty::Tag) -> Option<(CoverArt, String)> { let mut album_artist = None; let mut track_artist = None; let mut album = None; fn get_text_value(value: &lofty::ItemValue) -> Option { match value { lofty::ItemValue::Text(s) => Some(s.to_string()), _ => None, } } for item in tag.items() { match item.key() { lofty::ItemKey::AlbumTitle => album = get_text_value(item.value()), lofty::ItemKey::AlbumArtist => album_artist = get_text_value(item.value()), lofty::ItemKey::TrackArtist => track_artist = get_text_value(item.value()), _ => (), }; } // We use the album and artist to ensure we share the // same cover data for every track in the album; if we // don't have an album, we use the file name let mut hasher = Sha256::new(); if let Some(album) = album { hasher.update(&album); if let Some(artist) = album_artist { hasher.update(&artist); } else if let Some(artist) = track_artist { hasher.update(&artist); } if let Some(parent) = path.parent() { hasher.update(parent.to_str().unwrap()); } } else { hasher.update(path.to_str().unwrap()); } let uuid = format!("{:x}", hasher.finalize()); match self.lookup(&uuid) { Some(c) => { debug!("Found cover for UUID '{}'", &uuid); Some((c.clone(), uuid)) } None => { debug!("Loading cover art for UUID: {}", &uuid); let cover_art = self.load_cover_art(tag, path.parent()); // The pixel buffer for the cover art let cover_pixbuf = if let Some(ref cover_art) = cover_art { utils::load_cover_texture(cover_art) } else { None }; // Cache the pixel buffer, so that the MPRIS controller can // reference it later let cache_path = if let Some(ref pixbuf) = cover_pixbuf { utils::cache_cover_art(&uuid, &pixbuf) } else { None }; // The texture we draw on screen let texture = cover_pixbuf.as_ref().map(|p| gdk::Texture::for_pixbuf(&p)); // The color palette we use for styling the UI let palette = if let Some(ref pixbuf) = cover_pixbuf { utils::load_palette(pixbuf) } else { None }; // We want both texture and palette if texture.is_some() && palette.is_some() { let res = CoverArt { texture: texture.unwrap(), palette: palette.unwrap(), cache: cache_path, }; self.add_entry(&uuid, res.clone()); return Some((res, uuid)); } else { return None; } } } } pub fn clear(&mut self) { self.entries.clear(); } } amberol-0.10.3/src/audio/gst_backend.rs000066400000000000000000000145601443320625200177250ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2022 Emmanuele Bassi // SPDX-License-Identifier: GPL-3.0-or-later use glib::{clone, Sender}; use gst::prelude::*; use gtk::glib; use log::{debug, error, warn}; use crate::audio::{PlaybackAction, ReplayGainMode, SeekDirection}; #[derive(Debug)] pub struct GstBackend { sender: Sender, gst_player: gst_player::Player, replaygain: Option, } #[derive(Debug)] pub struct GstReplayGain { rg_filter_bin: gst::Element, rg_volume: gst::Element, } impl GstReplayGain { pub fn new() -> Result> { let rg_volume = gst::ElementFactory::make_with_name("rgvolume", Some("rg volume"))?; let rg_limiter = gst::ElementFactory::make_with_name("rglimiter", Some("rg limiter"))?; let filter_bin = gst::Bin::new(Some("filter bin")); filter_bin.add(&rg_volume)?; filter_bin.add(&rg_limiter)?; rg_volume.link(&rg_limiter)?; let pad_src = rg_limiter.static_pad("src").unwrap(); pad_src.set_active(true).unwrap(); let ghost_src = gst::GhostPad::with_target(Some("src"), &pad_src)?; filter_bin.add_pad(&ghost_src)?; let pad_sink = rg_volume.static_pad("sink").unwrap(); pad_sink.set_active(true).unwrap(); let ghost_sink = gst::GhostPad::with_target(Some("sink"), &pad_sink)?; filter_bin.add_pad(&ghost_sink)?; Ok(Self { rg_filter_bin: filter_bin.upcast(), rg_volume, }) } pub fn set_mode(&self, playbin: gst::Element, replaygain: ReplayGainMode) { let identity = gst::ElementFactory::make_with_name("identity", None).unwrap(); let (filter, album_mode) = match replaygain { ReplayGainMode::Album => (self.rg_filter_bin.as_ref(), true), ReplayGainMode::Track => (self.rg_filter_bin.as_ref(), false), ReplayGainMode::Off => (&identity, true), }; self.rg_volume.set_property("album-mode", album_mode); playbin.set_property("audio-filter", filter); } } impl GstBackend { pub fn new(sender: Sender) -> Self { let dispatcher = gst_player::PlayerGMainContextSignalDispatcher::new(None); let gst_player = gst_player::Player::new( None::, Some(dispatcher.upcast::()), ); gst_player.set_video_track_enabled(false); let mut config = gst_player.config(); config.set_position_update_interval(250); gst_player.set_config(config).unwrap(); let res = Self { sender, gst_player, replaygain: GstReplayGain::new().ok(), }; res.setup_signals(); res } fn setup_signals(&self) { self.gst_player.connect_warning(move |_, warn| { warn!("GStreamer warning: {}", warn); }); self.gst_player .connect_end_of_stream(clone!(@strong self.sender as sender => move |_| { if let Err(e) = sender.send(PlaybackAction::PlayNext) { error!("Failed to send PlayNext: {e}"); } })); self.gst_player.connect_position_updated( clone!(@strong self.sender as sender => move |_, clock| { if let Some(clock) = clock { let pos = clock.seconds(); if let Err(e) = sender.send(PlaybackAction::UpdatePosition(pos)) { error!("Failed to send UpdatePosition({pos}): {e}"); } } }), ); self.gst_player.connect_volume_changed( clone!(@strong self.sender as sender => move |player| { let volume = gst_audio::StreamVolume::convert_volume( gst_audio::StreamVolumeFormat::Linear, gst_audio::StreamVolumeFormat::Cubic, player.volume(), ); if let Err(e) = sender.send(PlaybackAction::VolumeChanged(volume)) { error!("Failed to send VolumeChanged({volume}): {e}"); } }), ); } pub fn set_song_uri(&self, uri: Option<&str>) { // FIXME: https://gitlab.freedesktop.org/gstreamer/gstreamer/-/issues/1124 if uri.is_some() { self.gst_player.set_uri(uri); } } pub fn seek(&self, position: u64, duration: u64, offset: u64, direction: SeekDirection) { let offset = gst::ClockTime::from_seconds(offset); let position = gst::ClockTime::from_seconds(position); let duration = gst::ClockTime::from_seconds(duration); let destination = match direction { SeekDirection::Backwards if position >= offset => position.checked_sub(offset), SeekDirection::Backwards if position < offset => Some(gst::ClockTime::from_seconds(0)), SeekDirection::Forward if !duration.is_zero() && position + offset <= duration => { position.checked_add(offset) } SeekDirection::Forward if !duration.is_zero() && position + offset > duration => { Some(duration) } _ => None, }; if let Some(destination) = destination { self.gst_player.seek(destination); } } pub fn seek_position(&self, position: u64) { self.gst_player.seek(gst::ClockTime::from_seconds(position)); } pub fn seek_start(&self) { self.gst_player.seek(gst::ClockTime::from_seconds(0)); } pub fn play(&self) { self.gst_player.play(); } pub fn pause(&self) { self.gst_player.pause(); } pub fn stop(&self) { self.gst_player.stop(); } pub fn set_volume(&self, volume: f64) { let linear_volume = gst_audio::StreamVolume::convert_volume( gst_audio::StreamVolumeFormat::Cubic, gst_audio::StreamVolumeFormat::Linear, volume, ); debug!("Setting volume to: {}", &linear_volume); self.gst_player.set_volume(linear_volume); } pub fn set_replaygain(&self, replaygain: ReplayGainMode) { self.replaygain .as_ref() .map(|r| r.set_mode(self.gst_player.pipeline(), replaygain)); } pub fn replaygain_available(&self) -> bool { self.replaygain.is_some() } } amberol-0.10.3/src/audio/inhibit_controller.rs000066400000000000000000000030641443320625200213470ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2022 Emmanuele Bassi // SPDX-License-Identifier: GPL-3.0-or-later use std::cell::Cell; use gtk::{gio, prelude::*}; use log::debug; use crate::{ audio::{Controller, PlaybackState, RepeatMode, Song}, i18n::i18n, }; #[derive(Debug, Default)] pub struct InhibitController { cookie: Cell, } impl InhibitController { pub fn new() -> Self { Self::default() } } impl Controller for InhibitController { fn set_playback_state(&self, playback_state: &PlaybackState) { let app = gio::Application::default() .expect("Failed to retrieve application singleton") .downcast::() .unwrap(); let win = app .active_window() .and_then(|win| Some(win.downcast::().unwrap())); if playback_state == &PlaybackState::Playing { if self.cookie.get() == 0 { let cookie = app.inhibit( win.as_ref(), gtk::ApplicationInhibitFlags::SUSPEND, Some(&i18n("Playback in progress")), ); self.cookie.set(cookie); debug!("Suspend inhibited"); } } else { let cookie = self.cookie.take(); if cookie != 0 { app.uninhibit(cookie); debug!("Suspend uninhibited"); } } } fn set_song(&self, _song: &Song) {} fn set_position(&self, _position: u64) {} fn set_repeat_mode(&self, _mode: RepeatMode) {} } amberol-0.10.3/src/audio/mod.rs000066400000000000000000000047451443320625200162440ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2022 Emmanuele Bassi // SPDX-License-Identifier: GPL-3.0-or-later // Audio playback is slightly more complicated than simple UI handling code. // // We want to bind the state of the UI to the state of the player through // well established patterns of property bindings and signal emissions, but // the player can be updated from different threads and by different contexts // which has an effect on the types that are in play. Of course, we can work // around it by telling GStreamer that we want to receive signals in the // default main context, but it's always largely iffy to do so as it requires // working against the type system through the use of wrappers like Rc and // Fragile. // To avoid this mess, the best practice is to use message passing. // // In this particular case, the design of the audio playback interface is // split into the following components: // // AudioPlayer: the main object managing the audio playback // ├── PlayerState: the state tracker GObject used by the UI // ├── Queue: the playlist tracker GListModel // ├── GstBackend: a GstPlayer wrapper // ╰── controllers: external bits of code that interact with the state // ╰── MprisController: an MPRIS wrapper // // The AudioPlayer object creates a glib::Sender/Receiver channel pair, and // passes the sender to the controllers; whenever the controllers update their // state, they will use the glib::Sender to notify the AudioPlayer, which will // update the PlayerState. // // The GstBackend uses a similar sender/receiver pair to communicate with the // AudioPlayer whenever the GStreamer state changes. // // The UI side connects to the PlayerState object for state tracking; all // changes to the state object happen in the main context by design. // // Playback actions are proxied to the AudioPlayer object from the controllers. mod controller; pub use controller::Controller; mod cover_cache; pub use cover_cache::{CoverArt, CoverCache}; mod inhibit_controller; mod mpris_controller; pub use inhibit_controller::InhibitController; pub use mpris_controller::MprisController; mod gst_backend; pub use gst_backend::GstBackend; mod player; mod queue; mod shuffle; mod song; mod state; mod waveform_generator; pub use player::{ AudioPlayer, PlaybackAction, PlaybackState, RepeatMode, ReplayGainMode, SeekDirection, }; pub use queue::Queue; pub use shuffle::ShuffleListModel; pub use song::Song; pub use state::PlayerState; pub use waveform_generator::WaveformGenerator; amberol-0.10.3/src/audio/mpris_controller.rs000066400000000000000000000154771443320625200210660ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2022 Emmanuele Bassi // SPDX-License-Identifier: GPL-3.0-or-later use std::{cell::RefCell, sync::Arc, time::Duration}; use glib::{clone, Sender}; use gtk::{gio, glib, prelude::*}; use log::error; use mpris_player::{LoopStatus, Metadata, MprisPlayer, OrgMprisMediaPlayer2Player, PlaybackStatus}; use crate::{ audio::{Controller, PlaybackAction, PlaybackState, RepeatMode, Song}, config::APPLICATION_ID, }; #[derive(Debug)] pub struct MprisController { sender: Sender, mpris: Arc, song: RefCell>, } impl MprisController { pub fn new(sender: Sender) -> Self { let mpris = MprisPlayer::new( APPLICATION_ID.to_string(), "Amberol".to_string(), APPLICATION_ID.to_string(), ); mpris.set_can_raise(true); mpris.set_can_play(false); mpris.set_can_pause(true); mpris.set_can_seek(true); mpris.set_can_go_next(true); mpris.set_can_go_previous(true); mpris.set_can_set_fullscreen(false); let res = Self { sender, mpris, song: RefCell::new(None), }; res.setup_signals(); res } fn setup_signals(&self) { self.mpris.connect_play_pause( clone!(@weak self.mpris as mpris, @strong self.sender as sender => move || { match mpris.get_playback_status().unwrap().as_ref() { "Paused" => { if let Err(e) = sender.send(PlaybackAction::Play) { error!("Unable to send Play: {e}"); } }, "Stopped" => { if let Err(e) = sender.send(PlaybackAction::Stop) { error!("Unable to send Stop: {e}"); } }, _ => { if let Err(e) = sender.send(PlaybackAction::Pause) { error!("Unable to send Pause: {e}"); } }, }; }), ); self.mpris .connect_play(clone!(@strong self.sender as sender => move || { if let Err(e) = sender.send(PlaybackAction::Play) { error!("Unable to send Play: {e}"); } })); self.mpris .connect_stop(clone!(@strong self.sender as sender => move || { if let Err(e) = sender.send(PlaybackAction::Stop) { error!("Unable to send Stop: {e}"); } })); self.mpris .connect_pause(clone!(@strong self.sender as sender => move || { if let Err(e) = sender.send(PlaybackAction::Pause) { error!("Unable to send Pause: {e}"); } })); self.mpris .connect_previous(clone!(@strong self.sender as sender => move || { if let Err(e) = sender.send(PlaybackAction::SkipPrevious) { error!("Unable to send SkipPrevious: {e}"); } })); self.mpris .connect_next(clone!(@strong self.sender as sender => move || { if let Err(e) = sender.send(PlaybackAction::SkipNext) { error!("Unable to send SkipNext: {e}"); } })); self.mpris .connect_raise(clone!(@strong self.sender as sender => move || { if let Err(e) = sender.send(PlaybackAction::Raise) { error!("Unable to send Raise: {e}"); } })); self.mpris .connect_loop_status(clone!(@strong self.sender as sender => move |status| { let mode = match status { LoopStatus::None => RepeatMode::Consecutive, LoopStatus::Track => RepeatMode::RepeatOne, LoopStatus::Playlist => RepeatMode::RepeatAll, }; if let Err(e) = sender.send(PlaybackAction::Repeat(mode)) { error!("Unable to send Repeat({mode}): {e}"); } })); self.mpris .connect_seek(clone!(@strong self.sender as sender => move |position| { let pos = Duration::from_micros(position as u64).as_secs(); if let Err(e) = sender.send(PlaybackAction::Seek(pos)) { error!("Unable to send Seek({pos}): {e}"); } })); } fn update_metadata(&self) { let mut metadata = Metadata::new(); if let Some(song) = self.song.take() { metadata.artist = Some(vec![song.artist()]); metadata.title = Some(song.title()); metadata.album = Some(song.album()); let length = Duration::from_secs(song.duration()).as_micros() as i64; metadata.length = Some(length); // MPRIS should really support passing a bytes buffer for // the cover art, instead of requiring this ridiculous // charade if let Some(cache) = song.cover_cache() { let file = gio::File::for_path(&cache); match file.query_info( "standard::type", gio::FileQueryInfoFlags::NONE, gio::Cancellable::NONE, ) { Ok(info) if info.file_type() == gio::FileType::Regular => { metadata.art_url = Some(file.uri().to_string()); } _ => metadata.art_url = None, } } self.song.replace(Some(song)); } self.mpris.set_metadata(metadata); } } impl Controller for MprisController { fn set_playback_state(&self, state: &PlaybackState) { self.mpris.set_can_play(true); match state { PlaybackState::Playing => self.mpris.set_playback_status(PlaybackStatus::Playing), PlaybackState::Paused => self.mpris.set_playback_status(PlaybackStatus::Paused), _ => self.mpris.set_playback_status(PlaybackStatus::Stopped), }; } fn set_song(&self, song: &Song) { self.song.replace(Some(song.clone())); self.update_metadata(); } fn set_position(&self, position: u64) { let msecs = Duration::from_secs(position).as_micros(); self.mpris.set_position(msecs as i64); } fn set_repeat_mode(&self, repeat: RepeatMode) { match repeat { RepeatMode::Consecutive => self.mpris.set_loop_status(LoopStatus::None), RepeatMode::RepeatOne => self.mpris.set_loop_status(LoopStatus::Track), RepeatMode::RepeatAll => self.mpris.set_loop_status(LoopStatus::Playlist), } } } amberol-0.10.3/src/audio/player.rs000066400000000000000000000345371443320625200167630ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2022 Emmanuele Bassi // SPDX-License-Identifier: GPL-3.0-or-later use std::{ cell::RefCell, fmt::{self, Display, Formatter}, rc::Rc, }; use glib::{clone, Receiver, Sender}; use gtk::glib; use log::{debug, error}; use crate::{ application::ApplicationAction, audio::{ Controller, CoverCache, GstBackend, InhibitController, MprisController, PlayerState, Queue, Song, WaveformGenerator, }, }; #[derive(Clone, Debug)] pub enum PlaybackAction { Play, Pause, Stop, SkipPrevious, SkipNext, UpdatePosition(u64), VolumeChanged(f64), Repeat(RepeatMode), Seek(u64), PlayNext, Raise, } #[derive(Clone, Copy, Debug, PartialEq)] pub enum PlaybackState { Stopped, Playing, Paused, } impl Default for PlaybackState { fn default() -> Self { PlaybackState::Stopped } } #[derive(Clone, Copy, Debug, glib::Enum, PartialEq)] #[enum_type(name = "AmberolRepeatMode")] pub enum RepeatMode { Consecutive, RepeatAll, RepeatOne, } impl Default for RepeatMode { fn default() -> Self { RepeatMode::Consecutive } } impl Display for RepeatMode { fn fmt(&self, f: &mut Formatter) -> fmt::Result { match self { RepeatMode::Consecutive => write!(f, "consecutive"), RepeatMode::RepeatAll => write!(f, "repeat-all"), RepeatMode::RepeatOne => write!(f, "repeat-one"), } } } #[derive(Clone, Copy, Debug, glib::Enum, PartialEq)] #[enum_type(name = "AmberolReplayGainMode")] pub enum ReplayGainMode { #[enum_value(name = "album")] Album, #[enum_value(name = "track")] Track, #[enum_value(name = "off")] Off, } impl Default for ReplayGainMode { fn default() -> Self { Self::Off } } impl From for ReplayGainMode { fn from(value: i32) -> Self { match value { 0 => Self::Album, 1 => Self::Track, 2 => Self::Off, _ => panic!("invalid ReplayGainMode enum key"), } } } impl From for i32 { fn from(value: ReplayGainMode) -> Self { match value { ReplayGainMode::Album => 0, ReplayGainMode::Track => 1, ReplayGainMode::Off => 2, } } } #[derive(Debug)] pub enum SeekDirection { Forward, Backwards, } pub struct AudioPlayer { app_sender: Sender, receiver: RefCell>>, backend: GstBackend, controllers: Vec>, queue: Queue, state: PlayerState, waveform_generator: WaveformGenerator, } impl fmt::Debug for AudioPlayer { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { f.debug_struct("AudioPlayer").finish() } } impl AudioPlayer { pub fn new(app_sender: Sender) -> Rc { let (sender, r) = glib::MainContext::channel(glib::PRIORITY_DEFAULT); let receiver = RefCell::new(Some(r)); let mut controllers: Vec> = Vec::new(); let mpris_controller = MprisController::new(sender.clone()); controllers.push(Box::new(mpris_controller)); let inhibit_controller = InhibitController::new(); controllers.push(Box::new(inhibit_controller)); let waveform_generator = WaveformGenerator::new(); controllers.push(Box::new(waveform_generator.clone())); let backend = GstBackend::new(sender); let queue = Queue::default(); let state = PlayerState::default(); let res = Rc::new(Self { app_sender, receiver, backend, controllers, queue, state, waveform_generator, }); res.clone().setup_channel(); res } fn setup_channel(self: Rc) { let receiver = self.receiver.borrow_mut().take().unwrap(); receiver.attach( None, clone!(@strong self as this => move |action| this.clone().process_action(action)), ); } fn process_action(&self, action: PlaybackAction) -> glib::Continue { match action { PlaybackAction::Play => self.set_playback_state(PlaybackState::Playing), PlaybackAction::Pause => self.set_playback_state(PlaybackState::Paused), PlaybackAction::Stop => self.set_playback_state(PlaybackState::Stopped), PlaybackAction::SkipPrevious => self.skip_previous(), PlaybackAction::SkipNext => self.skip_next(), PlaybackAction::UpdatePosition(pos) => self.update_position(pos), PlaybackAction::VolumeChanged(vol) => self.update_volume(vol), PlaybackAction::PlayNext => self.play_next(), PlaybackAction::Raise => self.present(), PlaybackAction::Repeat(mode) => self.update_repeat_mode(mode), PlaybackAction::Seek(pos) => self.seek_position_abs(pos), // _ => debug!("Received action {:?}", action), } glib::Continue(true) } fn set_playback_state(&self, state: PlaybackState) { if let Some(current_song) = self.state.current_song() { debug!("Current song: {}", current_song.uri()); self.state.set_playback_state(&state); for c in &self.controllers { c.set_playback_state(&state); } match state { PlaybackState::Playing => self.backend.play(), PlaybackState::Paused => self.backend.pause(), PlaybackState::Stopped => self.backend.stop(), } } else { debug!("Getting the next song"); if let Some(next_song) = self.queue.next_song() { debug!("Next song: {}", next_song.uri()); for c in &self.controllers { c.set_song(&next_song); } next_song.set_playing(true); self.backend.set_song_uri(Some(&next_song.uri())); self.state.set_current_song(Some(next_song)); self.state.set_playback_state(&state); for c in &self.controllers { c.set_playback_state(&state); } match state { PlaybackState::Playing => self.backend.play(), PlaybackState::Paused => self.backend.pause(), PlaybackState::Stopped => self.backend.stop(), } } else { debug!("No songs left"); self.backend.set_song_uri(None); self.state.set_current_song(None); self.state.set_playback_state(&PlaybackState::Stopped); for c in &self.controllers { c.set_playback_state(&PlaybackState::Stopped); } } } } fn play_next(&self) { self.skip_next(); } pub fn toggle_play(&self) { if self.queue.is_empty() { return; } if self.state.playing() { self.set_playback_state(PlaybackState::Paused); } else { self.set_playback_state(PlaybackState::Playing); } } pub fn play(&self) { if !self.state.playing() { self.set_playback_state(PlaybackState::Playing); } } pub fn pause(&self) { if self.state.playing() { self.set_playback_state(PlaybackState::Paused); } } pub fn stop(&self) { self.set_playback_state(PlaybackState::Stopped); } pub fn skip_previous(&self) { if self.queue.is_empty() { return; } if let Some(current_song) = self.state.current_song() { // We only skip to the previous song if we are // within a seek backward step, otherwise we just // restart the song if self.state.position() >= 10 { self.backend.seek_start(); return; } if self.queue.is_first_song() { return; } debug!("Marking '{}' as not playing", current_song.uri()); current_song.set_playing(false); } if let Some(prev_song) = self.queue.previous_song() { debug!("Playing previous: {}", prev_song.uri()); let was_playing = self.state.playing(); if was_playing { self.set_playback_state(PlaybackState::Paused); } for c in &self.controllers { c.set_song(&prev_song); } self.backend.set_song_uri(Some(&prev_song.uri())); self.backend.seek_start(); debug!("Marking '{}' as playing", prev_song.uri()); prev_song.set_playing(true); self.state.set_current_song(Some(prev_song)); if was_playing { self.set_playback_state(PlaybackState::Playing); } } } pub fn skip_next(&self) { if self.queue.is_empty() { return; } if let Some(current_song) = self.state.current_song() { current_song.set_playing(false); } if let Some(next_song) = self.queue.next_song() { debug!("Playing next (skip-next): {}", next_song.uri()); let was_playing = self.state.playing(); if was_playing { self.set_playback_state(PlaybackState::Paused); } for c in &self.controllers { c.set_song(&next_song); } self.backend.set_song_uri(Some(&next_song.uri())); self.backend.seek_start(); next_song.set_playing(true); self.state.set_current_song(Some(next_song)); if was_playing { self.set_playback_state(PlaybackState::Playing); } } else { self.skip_to(0); self.set_playback_state(PlaybackState::Stopped); } } pub fn skip_to(&self, pos: u32) { if self.queue.is_empty() { return; } if Some(pos) == self.queue.current_song_index() { return; } if let Some(current_song) = self.state.current_song() { current_song.set_playing(false); } if let Some(song) = self.queue.skip_song(pos) { debug!("Playing next (skip-to): {}", song.uri()); let was_playing = self.state.playing(); if was_playing { self.set_playback_state(PlaybackState::Paused); } for c in &self.controllers { c.set_song(&song); } self.backend.set_song_uri(Some(&song.uri())); self.backend.seek_start(); song.set_playing(true); self.state.set_current_song(Some(song)); if was_playing { self.set_playback_state(PlaybackState::Playing); } } else { self.backend.set_song_uri(None); self.state.set_current_song(None); self.set_playback_state(PlaybackState::Stopped); } } fn seek(&self, offset: u64, direction: SeekDirection) { self.backend.seek( self.state.position(), self.state.duration(), offset, direction, ); } pub fn seek_start(&self) { let position = self.state.position() + 1; self.backend.seek( position, self.state.duration(), position, SeekDirection::Backwards, ); } pub fn seek_backwards(&self) { self.seek(10, SeekDirection::Backwards); } pub fn seek_forward(&self) { self.seek(10, SeekDirection::Forward); } pub fn seek_position_rel(&self, position: f64) { let duration = self.state.duration() as f64; let pos = (duration * position).clamp(0.0, duration); self.backend.seek_position(pos as u64); } pub fn seek_position_abs(&self, position: u64) { let pos = u64::max(position, self.state.duration()); self.backend.seek_position(pos); } pub fn queue(&self) -> &Queue { &self.queue } pub fn state(&self) -> &PlayerState { &self.state } pub fn waveform_generator(&self) -> &WaveformGenerator { &self.waveform_generator } pub fn set_current_song(&self, song: Option) { self.state.set_current_song(song); } fn update_position(&self, position: u64) { self.state.set_position(position); for c in &self.controllers { c.set_position(position); } } fn update_volume(&self, volume: f64) { debug!("Updating volume to: {}", &volume); self.state.set_volume(volume); } pub fn set_volume(&self, volume: f64) { self.backend.set_volume(volume); } pub fn toggle_repeat_mode(&self) { let cur_mode = self.queue.repeat_mode(); let new_mode = match cur_mode { RepeatMode::Consecutive => RepeatMode::RepeatAll, RepeatMode::RepeatAll => RepeatMode::RepeatOne, RepeatMode::RepeatOne => RepeatMode::Consecutive, }; self.queue.set_repeat_mode(new_mode); for c in &self.controllers { c.set_repeat_mode(new_mode); } } fn update_repeat_mode(&self, repeat: RepeatMode) { if repeat != self.queue.repeat_mode() { self.queue.set_repeat_mode(repeat); for c in &self.controllers { c.set_repeat_mode(repeat); } } } fn present(&self) { if let Err(e) = self.app_sender.send(ApplicationAction::Present) { error!("Unable to send Present: {e}"); } } pub fn clear_queue(&self) { self.stop(); self.state.set_current_song(None); self.queue.clear(); let mut cover_cache = CoverCache::global().lock().unwrap(); cover_cache.clear(); } pub fn remove_song(&self, song: &Song) { if song.playing() { self.skip_next(); } self.queue.remove_song(song); if self.queue.is_empty() { self.state.set_current_song(None); } } pub fn set_replaygain(&self, replaygain: ReplayGainMode) { self.backend.set_replaygain(replaygain); } pub fn replaygain_available(&self) -> bool { self.backend.replaygain_available() } } amberol-0.10.3/src/audio/queue.rs000066400000000000000000000221741443320625200166050ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2022 Emmanuele Bassi // SPDX-License-Identifier: GPL-3.0-or-later use std::cell::Cell; use gtk::{gio, glib, prelude::*, subclass::prelude::*}; use crate::audio::{RepeatMode, ShuffleListModel, Song}; mod imp { use glib::{ParamSpec, ParamSpecEnum, ParamSpecObject, ParamSpecUInt, Value}; use once_cell::sync::Lazy; use super::*; #[derive(Debug, Default)] pub struct Queue { pub model: ShuffleListModel, pub store: gio::ListStore, pub repeat_mode: Cell, pub current_pos: Cell>, pub shuffled: Cell, } #[glib::object_subclass] impl ObjectSubclass for Queue { const NAME: &'static str = "AmberolQueue"; type Type = super::Queue; fn new() -> Self { let store = gio::ListStore::new(Song::static_type()); let model = ShuffleListModel::new(Some(&store)); Self { store, model, repeat_mode: Cell::new(RepeatMode::default()), current_pos: Cell::new(None), shuffled: Cell::new(false), } } } impl ObjectImpl for Queue { fn properties() -> &'static [ParamSpec] { static PROPERTIES: Lazy> = Lazy::new(|| { vec![ ParamSpecObject::builder::("current") .read_only() .build(), ParamSpecEnum::builder::("repeat-mode") .read_only() .build(), ParamSpecUInt::builder("n-songs").read_only().build(), ] }); PROPERTIES.as_ref() } fn property(&self, _id: usize, pspec: &ParamSpec) -> Value { match pspec.name() { "current" => self.obj().current_song().to_value(), "repeat-mode" => self.repeat_mode.get().to_value(), "n-songs" => self.store.n_items().to_value(), _ => unimplemented!(), } } } } glib::wrapper! { pub struct Queue(ObjectSubclass); } impl Default for Queue { fn default() -> Self { glib::Object::new() } } impl Queue { pub fn n_songs(&self) -> u32 { self.imp().model.n_items() } pub fn is_empty(&self) -> bool { self.imp().model.n_items() == 0 } pub fn model(&self) -> &gio::ListModel { self.imp().model.as_ref() } pub fn song_at(&self, pos: u32) -> Option { if let Some(song) = self.imp().model.item(pos) { return Some(song.downcast::().unwrap()); } None } pub fn current_song(&self) -> Option { if let Some(pos) = self.imp().current_pos.get() { return self.song_at(pos); } None } pub fn set_current_song(&self, song: Option) { if let Some(song) = song { for i in 0..self.n_songs() { let s = self.song_at(i).unwrap(); if song.equals(&s) { self.imp().current_pos.replace(Some(i)); self.notify("current"); return; } } } else { self.imp().current_pos.replace(None); self.notify("current"); } } pub fn current_song_index(&self) -> Option { self.imp().current_pos.get() } pub fn add_song(&self, song: &Song) -> bool { if !song.equals(&Song::default()) { // Add song to the backing store self.imp().store.append(song); self.notify("n-songs"); true } else { false } } pub fn add_songs(&self, songs: &[impl IsA]) { self.imp() .store .splice(self.imp().model.n_items(), 0, songs); self.notify("n-songs"); } pub fn remove_song(&self, song: &Song) { let was_shuffled = self.imp().model.shuffled(); let n_songs = self.n_songs(); for pos in 0..n_songs { let s = self .imp() .store .item(pos) .unwrap() .downcast::() .unwrap(); if s.equals(song) { self.imp().store.remove(pos); break; } } if n_songs != self.n_songs() { if was_shuffled { self.imp().model.reshuffle(0); } self.notify("n-songs"); } if self.is_empty() { self.imp().current_pos.replace(None); } } pub fn clear(&self) { self.imp().current_pos.replace(None); self.imp().store.remove_all(); self.notify("n-songs"); } pub fn skip_song(&self, pos: u32) -> Option { self.imp().current_pos.replace(Some(pos)); self.notify("current"); self.song_at(pos) } pub fn previous_song(&self) -> Option { if let Some(current_pos) = self.imp().current_pos.get() { if current_pos > 0 { let prev = current_pos - 1; self.imp().current_pos.replace(Some(prev)); self.notify("current"); return self.song_at(current_pos - 1); } } None } pub fn next_song(&self) -> Option { let store = &self.imp().model; let n_songs = store.n_items(); if n_songs == 0 { return None; } let repeat_mode = self.imp().repeat_mode.get(); if let Some(current) = self.current_song_index() { let next: Option = match repeat_mode { RepeatMode::Consecutive if current < n_songs - 1 => Some(current + 1), RepeatMode::Consecutive if current == n_songs - 1 => None, RepeatMode::RepeatOne => Some(current), RepeatMode::RepeatAll if current < n_songs - 1 => Some(current + 1), RepeatMode::RepeatAll if current == n_songs - 1 => Some(0), _ => None, }; if let Some(next) = next { self.imp().current_pos.replace(Some(next)); self.notify("current"); self.song_at(next) } else { self.imp().current_pos.replace(None); self.notify("current"); None } } else { // Return the first song self.imp().current_pos.replace(Some(0)); self.notify("current"); self.song_at(0) } } pub fn repeat_mode(&self) -> RepeatMode { self.imp().repeat_mode.get() } pub fn set_repeat_mode(&self, repeat_mode: RepeatMode) { let old_mode = self.imp().repeat_mode.replace(repeat_mode); if old_mode != repeat_mode { self.notify("repeat-mode"); } } pub fn is_first_song(&self) -> bool { if let Some(current_pos) = self.imp().current_pos.get() { return current_pos == 0; } false } pub fn is_last_song(&self) -> bool { let n_items = self.imp().model.n_items(); if let Some(current_pos) = self.imp().current_pos.get() { if n_items > 0 { return current_pos == n_items - 1; } } false } pub fn is_shuffled(&self) -> bool { self.imp().shuffled.get() } pub fn set_shuffled(&self, shuffled: bool) { if shuffled != self.imp().shuffled.replace(shuffled) { if shuffled { let current_pos = self.imp().current_pos.get().unwrap_or(0); self.imp().model.reshuffle(current_pos); } else { let current_pos = self.current_song_index().unwrap_or(0); let current_song = self.song_at(current_pos); self.imp().model.unshuffle(); self.set_current_song(current_song); } } } pub fn select_song_at(&self, index: u32) { if let Some(song) = self.imp().model.item(index) { let song = song.downcast_ref::().unwrap(); let is_selected = !song.selected(); song.set_selected(is_selected); } } pub fn unselect_all_songs(&self) { for i in 0..self.imp().store.n_items() { let song = self.imp().store.item(i).unwrap(); song.downcast_ref::().unwrap().set_selected(false); } } pub fn n_selected_songs(&self) -> u32 { let mut count = 0; for i in 0..self.imp().store.n_items() { let song = self.imp().store.item(i).unwrap(); if song.downcast_ref::().unwrap().selected() { count += 1; } } count } pub fn contains(&self, s: &Song) -> bool { for i in 0..self.imp().store.n_items() { let song = self.imp().store.item(i).unwrap(); if song.downcast_ref::().unwrap().equals(&s) { return true; } } false } } amberol-0.10.3/src/audio/shuffle.rs000066400000000000000000000126011443320625200171070ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2022 Emmanuele Bassi // SPDX-License-Identifier: GPL-3.0-or-later use std::cell::RefCell; use glib::clone; use gtk::{gio, glib, prelude::*, subclass::prelude::*}; use rand::prelude::*; mod imp { use glib::{ParamSpec, ParamSpecObject, Value}; use once_cell::sync::Lazy; use super::*; #[derive(Debug, Default)] pub struct ShuffleListModel { pub model: RefCell>, pub shuffle: RefCell>>, } #[glib::object_subclass] impl ObjectSubclass for ShuffleListModel { const NAME: &'static str = "ShuffleListModel"; type Type = super::ShuffleListModel; type Interfaces = (gio::ListModel,); } impl ObjectImpl for ShuffleListModel { fn properties() -> &'static [ParamSpec] { static PROPERTIES: Lazy> = Lazy::new(|| { vec![ParamSpecObject::builder::("model") .explicit_notify() .build()] }); PROPERTIES.as_ref() } fn property(&self, _id: usize, pspec: &ParamSpec) -> Value { match pspec.name() { "model" => self.model.borrow().to_value(), _ => unimplemented!(), } } fn set_property(&self, _id: usize, value: &Value, pspec: &ParamSpec) { match pspec.name() { "model" => self .obj() .set_model(value.get::().ok().as_ref()), _ => unimplemented!(), }; } } impl ListModelImpl for ShuffleListModel { fn item_type(&self) -> glib::Type { if let Some(ref model) = *self.model.borrow() { return model.item_type(); } glib::Object::static_type() } fn n_items(&self) -> u32 { if let Some(ref model) = *self.model.borrow() { return model.n_items(); } 0 } fn item(&self, position: u32) -> Option { if let Some(ref model) = *self.model.borrow() { if let Some(ref shuffle) = *self.shuffle.borrow() { if let Some(shuffled_pos) = shuffle.get(position as usize) { return model.item(*shuffled_pos); } } return model.item(position); } None } } } glib::wrapper! { pub struct ShuffleListModel(ObjectSubclass) @implements gio::ListModel; } impl Default for ShuffleListModel { fn default() -> Self { Self::new(gio::ListModel::NONE) } } impl ShuffleListModel { pub fn new(model: Option<&impl IsA>) -> Self { glib::Object::builder::() .property("model", &model.map(|m| m.as_ref())) .build() } pub fn model(&self) -> Option { self.imp().model.borrow().as_ref().cloned() } pub fn set_model(&self, model: Option<&gio::ListModel>) { if let Some(model) = model { self.imp().model.replace(Some(model.clone())); model.connect_items_changed( clone!(@strong self as this => move |_, position, removed, added| { if let Some(ref shuffle) = *this.imp().shuffle.borrow() { if let Some(shuffled_pos) = shuffle.get(position as usize) { this.items_changed(*shuffled_pos, removed, added); return; } } this.items_changed(position, removed, added); }), ); } else { self.imp().model.replace(None); } self.notify("model"); } pub fn shuffled(&self) -> bool { self.imp().shuffle.borrow().is_some() } pub fn reshuffle(&self, anchor: u32) { if let Some(ref model) = *self.imp().model.borrow() { let n_songs = model.n_items(); let mut rng = thread_rng(); let positions: Vec = if anchor == 0 { let mut before: Vec = vec![0]; let mut after: Vec = (1..n_songs).collect(); after.shuffle(&mut rng); before.extend(after); before } else if anchor == n_songs - 1 { let mut before: Vec = (0..n_songs - 1).collect(); let after: Vec = vec![n_songs - 1]; before.shuffle(&mut rng); before.extend(after); before } else { let mut before: Vec = (0..anchor).collect(); let mut after: Vec = (anchor + 1..n_songs).collect(); after.shuffle(&mut rng); before.push(anchor); before.extend(after); before }; self.imp().shuffle.replace(Some(positions)); self.items_changed(0, model.n_items(), model.n_items()); } else { self.imp().shuffle.replace(None); } } pub fn unshuffle(&self) { if let Some(ref model) = *self.imp().model.borrow() { self.imp().shuffle.replace(None); self.items_changed(0, model.n_items(), model.n_items()); } } } amberol-0.10.3/src/audio/song.rs000066400000000000000000000270351443320625200164300ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2022 Emmanuele Bassi // SPDX-License-Identifier: GPL-3.0-or-later use std::{ cell::{Cell, RefCell}, fmt::{self, Display, Formatter}, path::PathBuf, time::Instant, }; use glib::{ParamSpec, ParamSpecBoolean, ParamSpecObject, ParamSpecString, ParamSpecUInt, Value}; use gtk::{gdk, gio, glib, prelude::*, subclass::prelude::*}; use lofty::{Accessor, TaggedFileExt}; use log::{debug, warn}; use once_cell::sync::Lazy; use sha2::{Digest, Sha256}; use crate::{ audio::cover_cache::{CoverArt, CoverCache}, i18n::i18n, }; #[derive(Debug, Clone)] pub struct SongData { artist: Option, title: Option, album: Option, cover_art: Option, cover_uuid: Option, uuid: Option, duration: u64, file: gio::File, } impl SongData { pub fn artist(&self) -> Option<&str> { self.artist.as_deref() } pub fn title(&self) -> Option<&str> { self.title.as_deref() } pub fn album(&self) -> Option<&str> { self.album.as_deref() } pub fn uuid(&self) -> Option<&str> { self.uuid.as_deref() } pub fn cover_uuid(&self) -> Option<&str> { self.cover_uuid.as_deref() } pub fn duration(&self) -> u64 { self.duration } pub fn cover_texture(&self) -> Option<&gdk::Texture> { if let Some(cover) = &self.cover_art { return Some(&cover.texture()); } None } pub fn cover_palette(&self) -> Option<&Vec> { if let Some(cover) = &self.cover_art { return Some(&cover.palette()); } None } pub fn cover_cache(&self) -> Option<&PathBuf> { if let Some(cover) = &self.cover_art { return cover.cache(); } None } pub fn from_uri(uri: &str) -> Self { let now = Instant::now(); let file = gio::File::for_uri(uri); let path = file.path().expect("Unable to find file"); let tagged_file = match lofty::read_from_path(&path) { Ok(f) => f, Err(e) => { warn!("Unable to open file {:?}: {}", path, e); return SongData::default(); } }; let mut cover_cache = CoverCache::global().lock().unwrap(); let mut artist = None; let mut title = None; let mut album = None; let mut cover_art = None; let mut cover_uuid = None; if let Some(tag) = tagged_file.primary_tag() { debug!("Found primary tag"); artist = tag.artist().map(|s| s.to_string()); title = tag.title().map(|s| s.to_string()); album = tag.album().map(|s| s.to_string()); match cover_cache.cover_art(&path, &tag) { Some(res) => { cover_art = Some(res.0); cover_uuid = Some(res.1); } None => (), }; } else { warn!("Unable to load primary tag for: {}", uri); for tag in tagged_file.tags() { debug!("Found tag: {:?}", tag.tag_type()); artist = tag.artist().map(|s| s.to_string()); title = tag.title().map(|s| s.to_string()); album = tag.album().map(|s| s.to_string()); match cover_cache.cover_art(&path, &tag) { Some(res) => { cover_art = Some(res.0); cover_uuid = Some(res.1); } None => (), }; if artist.is_some() && title.is_some() { break; } } }; let uuid = match file.query_info( "standard::display-name", gio::FileQueryInfoFlags::NONE, gio::Cancellable::NONE, ) { Ok(info) => { let mut hasher = Sha256::new(); hasher.update(&info.display_name().as_str()); if let Some(ref artist) = artist { hasher.update(&artist); } if let Some(ref title) = title { hasher.update(&title); } if let Some(ref album) = album { hasher.update(&album); } Some(format!("{:x}", hasher.finalize())) } _ => None, }; let properties = lofty::AudioFile::properties(&tagged_file); let duration = properties.duration().as_secs(); debug!( "Song {:?} ('{:?}') loading time: {} ms", &uuid, &title, now.elapsed().as_millis() ); SongData { artist, title, album, cover_art, cover_uuid, uuid, duration, file, } } pub fn uri(&self) -> String { self.file.uri().to_string() } pub fn file(&self) -> gio::File { self.file.clone() } } impl Default for SongData { fn default() -> Self { SongData { artist: Some("Invalid Artist".to_string()), title: Some("Invalid Title".to_string()), album: Some("Invalid Album".to_string()), cover_art: None, cover_uuid: None, uuid: None, duration: 0, file: gio::File::for_path("/does-not-exist"), } } } mod imp { use super::*; #[derive(Debug, Default)] pub struct Song { pub data: RefCell, pub playing: Cell, pub selected: Cell, } #[glib::object_subclass] impl ObjectSubclass for Song { const NAME: &'static str = "AmberolSong"; type Type = super::Song; } impl ObjectImpl for Song { fn properties() -> &'static [ParamSpec] { static PROPERTIES: Lazy> = Lazy::new(|| { vec![ ParamSpecString::builder("uri").construct_only().build(), ParamSpecString::builder("artist").read_only().build(), ParamSpecString::builder("title").read_only().build(), ParamSpecString::builder("album").read_only().build(), ParamSpecUInt::builder("duration").read_only().build(), ParamSpecObject::builder::("cover") .read_only() .build(), ParamSpecBoolean::builder("playing").build(), ParamSpecBoolean::builder("selected").build(), ] }); PROPERTIES.as_ref() } fn set_property(&self, _id: usize, value: &Value, pspec: &ParamSpec) { match pspec.name() { "uri" => { let obj = self.obj(); if let Ok(p) = value.get::<&str>() { self.data.replace(SongData::from_uri(p)); obj.notify("artist"); obj.notify("title"); obj.notify("album"); obj.notify("duration"); obj.notify("cover"); } } "playing" => { let p = value.get::().expect("Value must be a boolean"); self.playing.set(p); } "selected" => { let p = value.get::().expect("Value must be a boolean"); self.selected.set(p); } _ => unimplemented!(), } } fn property(&self, _id: usize, pspec: &ParamSpec) -> Value { let obj = self.obj(); match pspec.name() { "artist" => obj.artist().to_value(), "title" => obj.title().to_value(), "album" => obj.album().to_value(), "duration" => obj.duration().to_value(), "uri" => obj.uri().to_value(), "cover" => obj.cover_texture().to_value(), "playing" => self.playing.get().to_value(), "selected" => self.selected.get().to_value(), _ => unimplemented!(), } } } } glib::wrapper! { pub struct Song(ObjectSubclass); } impl Song { pub fn new(uri: &str) -> Self { glib::Object::builder::() .property("uri", &uri) .build() } pub fn from_uri(uri: &str) -> Result { let res = Song::new(uri); if res.equals(&Song::default()) { Err("Invalid song") } else { Ok(res) } } pub fn empty() -> Self { glib::Object::new() } pub fn equals(&self, other: &Self) -> bool { if self.uuid().is_some() && other.uuid().is_some() { self.uuid() == other.uuid() } else { self.uri() == other.uri() } } pub fn uri(&self) -> String { self.imp().data.borrow().uri() } pub fn artist(&self) -> String { match self.imp().data.borrow().artist() { Some(artist) => artist.to_string(), None => i18n("Unknown artist"), } } pub fn title(&self) -> String { match self.imp().data.borrow().title() { Some(title) => title.to_string(), None => i18n("Unknown title"), } } pub fn album(&self) -> String { match self.imp().data.borrow().album() { Some(album) => album.to_string(), None => i18n("Unknown album"), } } pub fn cover_texture(&self) -> Option { self.imp().data.borrow().cover_texture().cloned() } pub fn cover_color(&self) -> Option { self.imp().data.borrow().cover_palette().map(|p| p[0]) } pub fn cover_palette(&self) -> Option> { self.imp().data.borrow().cover_palette().cloned() } pub fn cover_uuid(&self) -> Option { self.imp().data.borrow().cover_uuid().map(|s| s.to_string()) } pub fn cover_cache(&self) -> Option { self.imp().data.borrow().cover_cache().cloned() } pub fn duration(&self) -> u64 { self.imp().data.borrow().duration() } pub fn playing(&self) -> bool { self.imp().playing.get() } pub fn set_playing(&self, playing: bool) { let was_playing = self.imp().playing.replace(playing); if was_playing != playing { self.notify("playing"); } } pub fn selected(&self) -> bool { self.imp().selected.get() } pub fn set_selected(&self, selected: bool) { let was_selected = self.imp().selected.replace(selected); if was_selected != selected { self.notify("selected"); } } pub fn uuid(&self) -> Option { self.imp().data.borrow().uuid().map(|s| s.to_string()) } pub fn search_key(&self) -> String { format!("{} {} {}", self.artist(), self.album(), self.title()) } pub fn file(&self) -> gio::File { self.imp().data.borrow().file() } } impl Default for Song { fn default() -> Self { Self::empty() } } impl Display for Song { fn fmt(&self, f: &mut Formatter) -> fmt::Result { write!( f, "Song {{ uuid: {}, uri: {}, artist: '{}', title: '{}' }}", self.uuid().unwrap(), self.uri(), self.artist(), self.title() ) } } amberol-0.10.3/src/audio/state.rs000066400000000000000000000136141443320625200166000ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2022 Emmanuele Bassi // SPDX-License-Identifier: GPL-3.0-or-later use std::cell::{Cell, RefCell}; use gtk::{gdk, glib, prelude::*, subclass::prelude::*}; use crate::audio::{PlaybackState, Song}; mod imp { use glib::{ ParamSpec, ParamSpecBoolean, ParamSpecDouble, ParamSpecObject, ParamSpecString, ParamSpecUInt64, }; use once_cell::sync::Lazy; use super::*; #[derive(Debug)] pub struct PlayerState { pub playback_state: Cell, pub position: Cell, pub current_song: RefCell>, pub volume: Cell, } #[glib::object_subclass] impl ObjectSubclass for PlayerState { const NAME: &'static str = "AmberolPlayerState"; type Type = super::PlayerState; fn new() -> Self { Self { playback_state: Cell::new(PlaybackState::Stopped), position: Cell::new(0), current_song: RefCell::new(None), volume: Cell::new(1.0), } } } impl ObjectImpl for PlayerState { fn properties() -> &'static [ParamSpec] { static PROPERTIES: Lazy> = Lazy::new(|| { vec![ ParamSpecBoolean::builder("playing").read_only().build(), ParamSpecUInt64::builder("position").read_only().build(), ParamSpecObject::builder::("song").read_only().build(), ParamSpecString::builder("title").read_only().build(), ParamSpecString::builder("artist").read_only().build(), ParamSpecString::builder("album").read_only().build(), ParamSpecUInt64::builder("duration").read_only().build(), ParamSpecObject::builder::("cover") .read_only() .build(), ParamSpecDouble::builder("volume") .minimum(0.0) .maximum(1.0) .default_value(1.0) .read_only() .build(), ] }); PROPERTIES.as_ref() } fn property(&self, _id: usize, pspec: &ParamSpec) -> glib::Value { let obj = self.obj(); match pspec.name() { "playing" => obj.playing().to_value(), "position" => obj.position().to_value(), "song" => self.current_song.borrow().to_value(), "volume" => obj.volume().to_value(), // These are proxies for Song properties "title" => obj.title().to_value(), "artist" => obj.artist().to_value(), "album" => obj.album().to_value(), "duration" => obj.duration().to_value(), "cover" => obj.cover().to_value(), _ => unimplemented!(), } } } } // PlayerState is a GObject that we can use to bind to // widgets and other objects; it contains the current // state of the audio player: song metadata, playback // position and duration, etc. glib::wrapper! { pub struct PlayerState(ObjectSubclass); } impl PlayerState { pub fn title(&self) -> Option { if let Some(song) = &*self.imp().current_song.borrow() { return Some(song.title()); } None } pub fn artist(&self) -> Option { if let Some(song) = &*self.imp().current_song.borrow() { return Some(song.artist()); } None } pub fn album(&self) -> Option { if let Some(song) = &*self.imp().current_song.borrow() { return Some(song.album()); } None } pub fn duration(&self) -> u64 { if let Some(song) = &*self.imp().current_song.borrow() { return song.duration(); } 0 } pub fn cover(&self) -> Option { if let Some(song) = &*self.imp().current_song.borrow() { return song.cover_texture(); } None } pub fn playing(&self) -> bool { let playback_state = self.imp().playback_state.get(); matches!(playback_state, PlaybackState::Playing) } pub fn set_playback_state(&self, playback_state: &PlaybackState) -> bool { let old_state = self.imp().playback_state.replace(*playback_state); if old_state != *playback_state { self.notify("playing"); return true; } false } pub fn current_song(&self) -> Option { (*self.imp().current_song.borrow()).as_ref().cloned() } pub fn set_current_song(&self, song: Option) { self.imp().current_song.replace(song); self.imp().position.replace(0); self.notify("song"); self.notify("title"); self.notify("artist"); self.notify("album"); self.notify("duration"); self.notify("cover"); self.notify("position"); } pub fn position(&self) -> u64 { self.imp().position.get() } pub fn set_position(&self, position: u64) { self.imp().position.replace(position); self.notify("position"); } pub fn volume(&self) -> f64 { self.imp().volume.get() } pub fn set_volume(&self, volume: f64) { let old_volume = self.imp().volume.replace(volume); // We only care about two digits of precision, to avoid // notification cycles when we update the volume with a // similar value coming from the volume control let old_rounded = format!("{:.2}", old_volume); let new_rounded = format!("{:.2}", volume); if old_rounded != new_rounded { self.notify("volume"); } } } impl Default for PlayerState { fn default() -> Self { glib::Object::new() } } amberol-0.10.3/src/audio/waveform_generator.rs000066400000000000000000000217701443320625200213560ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2022 Emmanuele Bassi // SPDX-License-Identifier: GPL-3.0-or-later use std::cell::RefCell; use glib::clone; use gst::prelude::*; use gtk::{gio, glib, prelude::*, subclass::prelude::*}; use log::{debug, warn}; use crate::audio::{Controller, PlaybackState, RepeatMode, Song}; mod imp { use glib::{ParamSpec, ParamSpecBoolean, Value}; use once_cell::sync::Lazy; use super::*; #[derive(Debug, Default)] pub struct WaveformGenerator { pub song: RefCell>, pub peaks: RefCell>>, pub pipeline: RefCell>, } #[glib::object_subclass] impl ObjectSubclass for WaveformGenerator { const NAME: &'static str = "WaveformGenerator"; type Type = super::WaveformGenerator; } impl ObjectImpl for WaveformGenerator { fn dispose(&self) { if let Some(pipeline) = self.pipeline.take() { pipeline.send_event(gst::event::Eos::new()); match pipeline.set_state(gst::State::Null) { Ok(_) => {} Err(err) => warn!("Unable to set existing pipeline to Null state: {}", err), } } } fn properties() -> &'static [ParamSpec] { static PROPERTIES: Lazy> = Lazy::new(|| vec![ParamSpecBoolean::builder("has-peaks").read_only().build()]); PROPERTIES.as_ref() } fn property(&self, _id: usize, pspec: &ParamSpec) -> Value { match pspec.name() { "has-peaks" => self.obj().peaks().is_some().to_value(), _ => unimplemented!(), } } } } glib::wrapper! { pub struct WaveformGenerator(ObjectSubclass); } impl Default for WaveformGenerator { fn default() -> Self { glib::Object::new() } } impl Controller for WaveformGenerator { fn set_playback_state(&self, _playback_state: &PlaybackState) {} fn set_song(&self, song: &Song) { self.imp().song.replace(Some(song.clone())); self.load_peaks(); } fn set_position(&self, _position: u64) {} fn set_repeat_mode(&self, _mode: RepeatMode) {} } impl WaveformGenerator { pub fn new() -> Self { WaveformGenerator::default() } pub fn peaks(&self) -> Option> { (*self.imp().peaks.borrow()).as_ref().cloned() } fn save_peaks(&self) { if let Some(peaks) = self.peaks() { let song = match self.imp().song.borrow().as_ref() { Some(s) => s.clone(), None => { self.notify("has-peaks"); return; } }; if let Some(uuid) = song.uuid() { let mut cache = glib::user_cache_dir(); cache.push("amberol"); cache.push("waveforms"); glib::mkdir_with_parents(&cache, 0o755); cache.push(format!("{}.json", uuid)); let j = serde_json::to_string(&peaks).unwrap(); let file = gio::File::for_path(&cache); file.replace_contents_async( j, None, false, gio::FileCreateFlags::NONE, gio::Cancellable::NONE, move |_| { debug!("Waveform cached at: {:?}", &cache); }, ); } } self.notify("has-peaks"); } fn load_peaks(&self) { let song = match self.imp().song.borrow().as_ref() { Some(s) => s.clone(), None => return, }; if let Some(uuid) = song.uuid() { let mut cache = glib::user_cache_dir(); cache.push("amberol"); cache.push("waveforms"); cache.push(format!("{}.json", uuid)); let file = gio::File::for_path(&cache); file.load_contents_async( gio::Cancellable::NONE, clone!(@strong self as this => move |res| { match res { Ok((bytes, _tag)) => { let p: Vec<(f64, f64)> = serde_json::from_slice(&bytes[..]).unwrap(); this.imp().peaks.replace(Some(p)); this.notify("has-peaks"); } Err(err) => { debug!("Could not read waveform cache file: {}", err); this.generate_peaks(); } } }), ); } } fn generate_peaks(&self) { if let Some(pipeline) = self.imp().pipeline.take() { // Stop any running pipeline, and ensure that we have nothing to // report self.imp().peaks.replace(None); pipeline.send_event(gst::event::Eos::new()); match pipeline.set_state(gst::State::Null) { Ok(_) => {} Err(err) => warn!("Unable to set existing pipeline to Null state: {}", err), } } let song = match self.imp().song.borrow().as_ref() { Some(s) => s.clone(), None => { self.imp().peaks.replace(None); self.notify("has-peaks"); return; } }; // Reset the peaks vector let peaks: Vec<(f64, f64)> = Vec::new(); self.imp().peaks.replace(Some(peaks)); let pipeline_str = "uridecodebin name=uridecodebin ! audioconvert ! audio/x-raw,channels=2 ! level name=level interval=250000000 ! fakesink name=faked"; let pipeline = match gst::parse_launch(pipeline_str) { Ok(pipeline) => pipeline, Err(err) => { warn!("Unable to generate the waveform: {}", err); self.imp().peaks.replace(None); self.notify("has-peaks"); return; } }; let uridecodebin = pipeline .downcast_ref::() .unwrap() .by_name("uridecodebin") .unwrap(); uridecodebin.set_property("uri", song.uri()); let fakesink = pipeline .downcast_ref::() .unwrap() .by_name("faked") .unwrap(); fakesink.set_property("qos", false); fakesink.set_property("sync", false); let bus = pipeline .bus() .expect("Pipeline without bus. Shouldn't happen!"); debug!("Adding bus watch"); bus.add_watch_local(clone!(@weak self as this, @weak pipeline => @default-return glib::Continue(false), move |_, msg| { use gst::MessageView; match msg.view() { MessageView::Eos(..) => { debug!("End of waveform stream"); pipeline.set_state(gst::State::Null).expect("Unable to set 'null' state"); // We're done this.imp().pipeline.replace(None); this.save_peaks(); return glib::Continue(false); } MessageView::Error(err) => { warn!("Pipeline error: {:?}", err); pipeline.set_state(gst::State::Null).expect("Unable to set 'null' state"); // We're done this.imp().pipeline.replace(None); this.save_peaks(); return glib::Continue(false); } MessageView::Element(element) => { if let Some(s) = element.structure() { if s.has_name("level") { let peaks_array = s.get::<&glib::ValueArray>("peak").unwrap(); let v1 = peaks_array[0].get::().unwrap(); let v2 = peaks_array[1].get::().unwrap(); // Normalize peaks between 0 and 1 let peak1 = f64::powf(10.0, v1 / 20.0); let peak2 = f64::powf(10.0, v2 / 20.0); if let Some(ref mut peaks) = *this.imp().peaks.borrow_mut() { peaks.push((peak1, peak2)); } } } } _ => (), }; glib::Continue(true) })) .expect("failed to add bus watch"); match pipeline.set_state(gst::State::Playing) { Ok(_) => { self.imp().pipeline.replace(Some(pipeline)); } Err(err) => { warn!("Unable to generate the waveform: {}", err); pipeline .set_state(gst::State::Null) .expect("Pipeline reset failed"); self.imp().peaks.replace(None); self.notify("has-peaks"); } }; } } amberol-0.10.3/src/config.rs.in000066400000000000000000000005531443320625200162270ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2022 Emmanuele Bassi // SPDX-License-Identifier: GPL-3.0-or-later pub static VERSION: &str = @VERSION@; pub static GETTEXT_PACKAGE: &str = @GETTEXT_PACKAGE@; pub static LOCALEDIR: &str = @LOCALEDIR@; pub static PKGDATADIR: &str = @PKGDATADIR@; pub static APPLICATION_ID: &str = @APPLICATION_ID@; pub static PROFILE: &str = @PROFILE@; amberol-0.10.3/src/cover_picture.rs000066400000000000000000000121251443320625200172240ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2022 Emmanuele Bassi // SPDX-License-Identifier: GPL-3.0-or-later use std::cell::{Cell, RefCell}; use gtk::{gdk, gio, glib, graphene, gsk, prelude::*, subclass::prelude::*}; #[derive(Clone, Copy, Debug, glib::Enum, PartialEq)] #[enum_type(name = "AmberolCoverSize")] pub enum CoverSize { Large = 0, Small = 1, } impl Default for CoverSize { fn default() -> Self { CoverSize::Large } } impl AsRef for CoverSize { fn as_ref(&self) -> &str { match self { CoverSize::Large => "large", CoverSize::Small => "small", } } } mod imp { use glib::{ParamSpec, ParamSpecEnum, ParamSpecObject, Value}; use once_cell::sync::Lazy; use super::*; const LARGE_SIZE: i32 = 192; const SMALL_SIZE: i32 = 48; #[derive(Debug, Default)] pub struct CoverPicture { pub cover: RefCell>, pub cover_size: Cell, } #[glib::object_subclass] impl ObjectSubclass for CoverPicture { const NAME: &'static str = "AmberolCoverPicture"; type Type = super::CoverPicture; type ParentType = gtk::Widget; fn class_init(klass: &mut Self::Class) { klass.set_css_name("picture"); klass.set_accessible_role(gtk::AccessibleRole::Img); } } impl ObjectImpl for CoverPicture { fn constructed(&self) { self.parent_constructed(); self.obj().add_css_class("cover"); self.obj().set_overflow(gtk::Overflow::Hidden); } fn properties() -> &'static [ParamSpec] { static PROPERTIES: Lazy> = Lazy::new(|| { vec![ ParamSpecObject::builder::("cover").build(), ParamSpecEnum::builder::("cover-size").build(), ] }); PROPERTIES.as_ref() } fn property(&self, _id: usize, pspec: &ParamSpec) -> Value { match pspec.name() { "cover" => self.cover.borrow().to_value(), "cover-size" => self.cover_size.get().to_value(), _ => unimplemented!(), } } fn set_property(&self, _id: usize, value: &Value, pspec: &ParamSpec) { match pspec.name() { "cover" => self .obj() .set_cover(value.get::().ok().as_ref()), "cover-size" => self .obj() .set_cover_size(value.get::().expect("Required CoverSize")), _ => unimplemented!(), }; } } impl WidgetImpl for CoverPicture { fn request_mode(&self) -> gtk::SizeRequestMode { gtk::SizeRequestMode::ConstantSize } fn measure(&self, _orientation: gtk::Orientation, _for_size: i32) -> (i32, i32, i32, i32) { match self.cover_size.get() { CoverSize::Large => (LARGE_SIZE, LARGE_SIZE, -1, -1), CoverSize::Small => (SMALL_SIZE, SMALL_SIZE, -1, -1), } } fn snapshot(&self, snapshot: >k::Snapshot) { if let Some(ref cover) = *self.cover.borrow() { let widget = self.obj(); let width = widget.width() as f64; let height = widget.height() as f64; let ratio = cover.intrinsic_aspect_ratio(); let w; let h; if ratio > 1.0 { w = width; h = width / ratio; } else { w = height * ratio; h = height; } let x = (width - w.ceil()) / 2.0; let y = (height - h).floor() / 2.0; snapshot.save(); snapshot.translate(&graphene::Point::new(x as f32, y as f32)); snapshot.append_scaled_texture( cover, gsk::ScalingFilter::Trilinear, &graphene::Rect::new(0.0, 0.0, w as f32, h as f32), ); snapshot.restore(); } } } } glib::wrapper! { pub struct CoverPicture(ObjectSubclass) @extends gtk::Widget, @implements gio::ActionGroup, gio::ActionMap; } impl Default for CoverPicture { fn default() -> Self { glib::Object::new() } } impl CoverPicture { pub fn new() -> Self { Self::default() } pub fn cover(&self) -> Option { (*self.imp().cover.borrow()).as_ref().cloned() } pub fn set_cover(&self, cover: Option<&gdk::Texture>) { if let Some(cover) = cover { self.imp().cover.replace(Some(cover.clone())); } else { self.imp().cover.replace(None); } self.queue_draw(); self.notify("cover"); } pub fn set_cover_size(&self, cover_size: CoverSize) { self.imp().cover_size.replace(cover_size); self.queue_resize(); self.notify("cover-size"); } } amberol-0.10.3/src/drag_overlay.rs000066400000000000000000000107061443320625200170340ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2022 Maximiliano Sandoval R // SPDX-License-Identifier: GPL-3.0-or-later use gtk::{glib, prelude::*, subclass::prelude::*}; mod imp { use std::cell::RefCell; use adw::subclass::prelude::*; use once_cell::sync::Lazy; use super::*; #[derive(Debug, Default)] pub struct DragOverlay { pub overlay: gtk::Overlay, pub revealer: gtk::Revealer, pub status: adw::StatusPage, pub drop_target: RefCell>, pub handler_id: RefCell>, } #[glib::object_subclass] impl ObjectSubclass for DragOverlay { const NAME: &'static str = "DragOverlay"; type Type = super::DragOverlay; type ParentType = adw::Bin; fn class_init(klass: &mut Self::Class) { klass.set_css_name("dragoverlay"); } } impl ObjectImpl for DragOverlay { fn properties() -> &'static [glib::ParamSpec] { static PROPERTIES: Lazy> = Lazy::new(|| { vec![ glib::ParamSpecString::builder("title").build(), glib::ParamSpecObject::builder::("child").build(), glib::ParamSpecObject::builder::("drop-target") .explicit_notify() .build(), ] }); PROPERTIES.as_ref() } fn property(&self, _id: usize, pspec: &glib::ParamSpec) -> glib::Value { match pspec.name() { "title" => self.status.title().to_value(), "child" => self.overlay.child().to_value(), "drop-target" => self.drop_target.borrow().to_value(), _ => unimplemented!(), } } fn set_property(&self, _id: usize, value: &glib::Value, pspec: &glib::ParamSpec) { match pspec.name() { "title" => self.status.set_title(value.get().unwrap()), "child" => self .overlay .set_child(value.get::().ok().as_ref()), "drop-target" => self .obj() .set_drop_target(&value.get::().unwrap()), _ => unimplemented!(), }; } fn constructed(&self) { self.overlay .set_parent(self.obj().upcast_ref::()); self.overlay.add_overlay(&self.revealer); self.revealer.set_can_target(false); self.revealer .set_transition_type(gtk::RevealerTransitionType::Crossfade); self.revealer.set_reveal_child(false); self.status.set_icon_name(Some("folder-music-symbolic")); self.status.add_css_class("drag-overlay-status-page"); self.revealer.set_child(Some(&self.status)); } fn dispose(&self) { self.overlay.unparent(); } } impl WidgetImpl for DragOverlay {} impl BinImpl for DragOverlay {} } glib::wrapper! { pub struct DragOverlay(ObjectSubclass) @extends gtk::Widget, adw::Bin; } impl Default for DragOverlay { fn default() -> Self { glib::Object::new() } } impl DragOverlay { pub fn new() -> Self { Self::default() } pub fn set_drop_target(&self, drop_target: >k::DropTarget) { let priv_ = self.imp(); if let Some(target) = priv_.drop_target.borrow_mut().take() { self.remove_controller(&target); if let Some(handler_id) = priv_.handler_id.borrow_mut().take() { target.disconnect(handler_id); } } let handler_id = drop_target.connect_current_drop_notify( glib::clone!(@weak priv_.revealer as revealer, @weak priv_.overlay as overlay => move |target| { let reveal = target.current_drop().is_some(); revealer.set_reveal_child(reveal); if reveal { overlay.child().unwrap().add_css_class("blurred"); } else { overlay.child().unwrap().remove_css_class("blurred"); } }), ); priv_.handler_id.replace(Some(handler_id)); self.add_controller(drop_target.clone()); priv_.drop_target.replace(Some(drop_target.clone())); self.notify("drop-target"); } } amberol-0.10.3/src/gtk/000077500000000000000000000000001443320625200145715ustar00rootroot00000000000000amberol-0.10.3/src/gtk/help-overlay.ui000066400000000000000000000121231443320625200175360ustar00rootroot00000000000000 True shortcuts 10 General Toggle primary menu F10 Copy song details to the clipboard win.copy Show shortcuts win.show-help-overlay Quit app.quit Playlist Add a song to the playlist queue.add-song Add a folder to the playlist queue.add-folder Clear the playlist queue.clear Toggle the playlist pane queue.toggle Toggle shuffling songs queue.shuffle Playback Toggle play/pause win.play Previous song win.previous Next song win.next Seek backwards in the current song win.seek-backwards Seek forward in the current song win.seek-forward amberol-0.10.3/src/gtk/playback-control.ui000066400000000000000000000220601443320625200203740ustar00rootroot00000000000000

Copy win.copy
Add _Song queue.add-song Add _Folder queue.add-folder Clear queue.clear
_Match Cover Art win.enable-recoloring _Background Playback app.background-play
_ReplayGain _Album win.replaygain album _Song win.replaygain track _Disabled win.replaygain off
_Keyboard Shortcuts win.show-help-overlay _About Amberol app.about _Quit app.quit
amberol-0.10.3/src/gtk/playlist-view.ui000066400000000000000000000150701443320625200177440ustar00rootroot00000000000000 amberol-0.10.3/src/gtk/queue-row.ui000066400000000000000000000151771443320625200170740ustar00rootroot00000000000000 amberol-0.10.3/src/gtk/song-cover.ui000066400000000000000000000032201443320625200172070ustar00rootroot00000000000000 amberol-0.10.3/src/gtk/song-details.ui000066400000000000000000000034611443320625200175250ustar00rootroot00000000000000 amberol-0.10.3/src/gtk/style-hc.css000066400000000000000000000002551443320625200170350ustar00rootroot00000000000000.main-window button:focus:focus-visible, .main-window row:focus:focus-visible, .main-window scale:focus:focus-visible > trough { outline-color: alpha(currentColor, .5); } amberol-0.10.3/src/gtk/style.css000066400000000000000000000067741443320625200164610ustar00rootroot00000000000000@define-color dimmed_color alpha(currentColor, .55); button.large { min-width: 48px; min-height: 48px; } .main-box { padding: 6px; margin-left: 24px; margin-right: 24px; } songcover { padding-bottom: 24px; } songcover picture.cover, songcover image.card { box-shadow: 0px 1px 6px rgba(0,0,0,0.3), 0px 2px 12px rgba(0,0,0,0.15), 0px 6px 32px rgba(0,0,0,0.1); border-radius: 12px; margin: 6px; } .main-window songcover picture.cover { background: linear-gradient(to bottom, @background_color_0, @background_color_1); } songdetails { padding-top: 12px; padding-bottom: 24px; } songdetails label.song-title { /* match title-1 */ font-size: 15pt; font-weight: 800; padding-left: 12px; padding-right: 12px; } songdetails label.song-title, songdetails label.song-artist, songdetails label.song-album { min-height: 1.5em; } waveformview { padding-bottom: 6px; } playbackcontrol { padding-bottom: 12px; } queuerow .currently-playing { padding-left: 6px; font-weight: 700; } queuerow box.song-details { padding: 6px 0; border-spacing: 12px; } queuerow label.song-title { font-weight: 700; font-size: 85%; } queuerow label.song-artist { font-size: 85%; } queuerow picture.cover, queuerow image.card { box-shadow: none; border-radius: 4px; margin: 0px; } queuerow checkbutton.selection-mode { padding-right: 12px; padding-left: 8px; } .queue-length { padding: 12px; } dragoverlay { box-shadow: none; } .drag-overlay-status-page { background-color: alpha(@accent_bg_color, 0.5); color: @accent_fg_color; } .blurred { filter: blur(6px); } scrolledwindow undershoot.top { box-shadow: inset 0 1px @borders; } .main-window { background: linear-gradient(127deg, alpha(@background_color_0, .55), alpha(@background_color_0, 0) 70.71%), linear-gradient(217deg, alpha(@background_color_1, .55), alpha(@background_color_1, 0) 70.71%), linear-gradient(336deg, alpha(@background_color_2, .55), alpha(@background_color_2, 0) 70.71%); transition-property: background; transition-duration: 250ms; transition-timing-function: ease; } .darken { background-color: rgba(0, 0, 0, 0.08); } .folded playlistview { background: @window_bg_color; } .main-window .folded playlistview { background: linear-gradient(127deg, alpha(@background_color_0, .55), alpha(@background_color_0, 0) 70.71%), linear-gradient(217deg, alpha(@background_color_1, .55), alpha(@background_color_1, 0) 70.71%), linear-gradient(336deg, alpha(@background_color_2, .55), alpha(@background_color_2, 0) 70.71%), @window_bg_color; transition-property: background; transition-duration: 250ms; transition-timing-function: ease; } .main-window button:focus:focus-visible, .main-window row:focus:focus-visible, .main-window scale:focus:focus-visible > trough, .main-window searchbar entry.search { outline-color: alpha(currentColor, .25); } .main-window searchbar { background: transparent; } .main-window searchbar > revealer > box { box-shadow: inset 0 1px @borders; background-color: rgba(0, 0, 0, 0.05); } .main-window scale highlight, .main-window progressbar progress { background: currentColor; color: inherit; } actionbar.flat > revealer > box { background: none; box-shadow: inset 0 1px @borders; } volume > scale { color: @dimmed_color; } volume:hover > scale { color: inherit; } volume > scale trough highlight { min-height: 12px; min-width: 12px; } volume > scale trough slider { opacity: 0; } amberol-0.10.3/src/gtk/volume-control.ui000066400000000000000000000017131443320625200201170ustar00rootroot00000000000000 amberol-0.10.3/src/gtk/window.ui000066400000000000000000000304431443320625200164430ustar00rootroot00000000000000 amberol-0.10.3/src/i18n.rs000066400000000000000000000143151443320625200151350ustar00rootroot00000000000000// i18n.rs // // Copyright 2020 Christopher Davis // // This program is free software: you can 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 . // // SPDX-License-Identifier: GPL-3.0-or-later use gettextrs::{gettext, ngettext, npgettext, pgettext}; use regex::{Captures, Regex}; #[allow(dead_code)] fn freplace(input: String, args: &[&str]) -> String { let mut parts = input.split("{}"); let mut output = parts.next().unwrap_or_default().to_string(); for (p, a) in parts.zip(args.iter()) { output += &(a.to_string() + p); } output } #[allow(dead_code)] fn kreplace(input: String, kwargs: &[(&str, &str)]) -> String { let mut s = input; for (k, v) in kwargs { if let Ok(re) = Regex::new(&format!("\\{{{}\\}}", k)) { s = re .replace_all(&s, |_: &Captures<'_>| v.to_string()) .to_string(); } } s } // Simple translations functions #[allow(dead_code)] pub fn i18n(format: &str) -> String { gettext(format) } #[allow(dead_code)] pub fn i18n_f(format: &str, args: &[&str]) -> String { let s = gettext(format); freplace(s, args) } #[allow(dead_code)] pub fn i18n_k(format: &str, kwargs: &[(&str, &str)]) -> String { let s = gettext(format); kreplace(s, kwargs) } // Singular and plural translations functions #[allow(dead_code)] pub fn ni18n(single: &str, multiple: &str, number: u32) -> String { ngettext(single, multiple, number) } #[allow(dead_code)] pub fn ni18n_f(single: &str, multiple: &str, number: u32, args: &[&str]) -> String { let s = ngettext(single, multiple, number); freplace(s, args) } #[allow(dead_code)] pub fn ni18n_k(single: &str, multiple: &str, number: u32, kwargs: &[(&str, &str)]) -> String { let s = ngettext(single, multiple, number); kreplace(s, kwargs) } // Translations with context functions #[allow(dead_code)] pub fn pi18n(ctx: &str, format: &str) -> String { pgettext(ctx, format) } #[allow(dead_code)] pub fn pi18n_f(ctx: &str, format: &str, args: &[&str]) -> String { let s = pgettext(ctx, format); freplace(s, args) } #[allow(dead_code)] pub fn pi18n_k(ctx: &str, format: &str, kwargs: &[(&str, &str)]) -> String { let s = pgettext(ctx, format); kreplace(s, kwargs) } // Singular and plural with context #[allow(dead_code)] pub fn pni18n(ctx: &str, single: &str, multiple: &str, number: u32) -> String { npgettext(ctx, single, multiple, number) } #[allow(dead_code)] pub fn pni18n_f(ctx: &str, single: &str, multiple: &str, number: u32, args: &[&str]) -> String { let s = npgettext(ctx, single, multiple, number); freplace(s, args) } #[allow(dead_code)] pub fn pni18n_k( ctx: &str, single: &str, multiple: &str, number: u32, kwargs: &[(&str, &str)], ) -> String { let s = npgettext(ctx, single, multiple, number); kreplace(s, kwargs) } #[cfg(test)] mod tests { use super::*; #[test] fn test_i18n() { let out = i18n("translate1"); assert_eq!(out, "translate1"); let out = ni18n("translate1", "translate multi", 1); assert_eq!(out, "translate1"); let out = ni18n("translate1", "translate multi", 2); assert_eq!(out, "translate multi"); } #[test] fn test_i18n_f() { let out = i18n_f("{} param", &["one"]); assert_eq!(out, "one param"); let out = i18n_f("middle {} param", &["one"]); assert_eq!(out, "middle one param"); let out = i18n_f("end {}", &["one"]); assert_eq!(out, "end one"); let out = i18n_f("multiple {} and {}", &["one", "two"]); assert_eq!(out, "multiple one and two"); let out = ni18n_f("singular {} and {}", "plural {} and {}", 2, &["one", "two"]); assert_eq!(out, "plural one and two"); let out = ni18n_f("singular {} and {}", "plural {} and {}", 1, &["one", "two"]); assert_eq!(out, "singular one and two"); } #[test] fn test_i18n_k() { let out = i18n_k("{one} param", &[("one", "one")]); assert_eq!(out, "one param"); let out = i18n_k("middle {one} param", &[("one", "one")]); assert_eq!(out, "middle one param"); let out = i18n_k("end {one}", &[("one", "one")]); assert_eq!(out, "end one"); let out = i18n_k("multiple {one} and {two}", &[("one", "1"), ("two", "two")]); assert_eq!(out, "multiple 1 and two"); let out = i18n_k("multiple {two} and {one}", &[("one", "1"), ("two", "two")]); assert_eq!(out, "multiple two and 1"); let out = i18n_k("multiple {one} and {one}", &[("one", "1"), ("two", "two")]); assert_eq!(out, "multiple 1 and 1"); let out = ni18n_k( "singular {one} and {two}", "plural {one} and {two}", 1, &[("one", "1"), ("two", "two")], ); assert_eq!(out, "singular 1 and two"); let out = ni18n_k( "singular {one} and {two}", "plural {one} and {two}", 2, &[("one", "1"), ("two", "two")], ); assert_eq!(out, "plural 1 and two"); } #[test] fn test_pi18n() { let out = pi18n("This is the context", "translate1"); assert_eq!(out, "translate1"); let out = pni18n("context", "translate1", "translate multi", 1); assert_eq!(out, "translate1"); let out = pni18n("The context string", "translate1", "translate multi", 2); assert_eq!(out, "translate multi"); let out = pi18n_f("Context for translation", "{} param", &["one"]); assert_eq!(out, "one param"); let out = pi18n_k("context", "{one} param", &[("one", "one")]); assert_eq!(out, "one param"); } } amberol-0.10.3/src/main.rs000066400000000000000000000053201443320625200152760ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2022 Emmanuele Bassi // SPDX-License-Identifier: GPL-3.0-or-later mod application; mod audio; mod config; mod cover_picture; mod drag_overlay; mod i18n; mod playback_control; mod playlist_view; mod queue_row; mod search; mod song_cover; mod song_details; mod sort; mod utils; mod volume_control; mod waveform_view; mod window; use std::env; use config::{APPLICATION_ID, GETTEXT_PACKAGE, LOCALEDIR, PKGDATADIR, PROFILE}; use gettextrs::{bind_textdomain_codeset, bindtextdomain, setlocale, textdomain, LocaleCategory}; use gtk::{gio, glib, prelude::*}; use log::{debug, error, LevelFilter}; use self::application::Application; fn main() -> glib::ExitCode { let mut builder = pretty_env_logger::formatted_builder(); if APPLICATION_ID.ends_with("Devel") { builder.filter(Some("amberol"), LevelFilter::Debug); } else { builder.filter(Some("amberol"), LevelFilter::Info); } builder.init(); // Set up gettext translations debug!("Setting up locale data"); setlocale(LocaleCategory::LcAll, ""); bindtextdomain(GETTEXT_PACKAGE, LOCALEDIR).expect("Unable to bind the text domain"); bind_textdomain_codeset(GETTEXT_PACKAGE, "UTF-8") .expect("Unable to set the text domain encoding"); textdomain(GETTEXT_PACKAGE).expect("Unable to switch to the text domain"); debug!("Setting up pulseaudio environment"); let app_id = APPLICATION_ID.trim_end_matches(".Devel"); env::set_var("PULSE_PROP_application.icon_name", &app_id); env::set_var("PULSE_PROP_application.metadata().name", "Amberol"); env::set_var("PULSE_PROP_media.role", "music"); debug!("Loading resources"); let resources = match env::var("MESON_DEVENV") { Err(_) => gio::Resource::load(PKGDATADIR.to_owned() + "/amberol.gresource") .expect("Unable to find amberol.gresource"), Ok(_) => match env::current_exe() { Ok(path) => { let mut resource_path = path; resource_path.pop(); resource_path.push("amberol.gresource"); gio::Resource::load(&resource_path) .expect("Unable to find amberol.gresource in devenv") } Err(err) => { error!("Unable to find the current path: {}", err); return glib::ExitCode::FAILURE; } }, }; gio::resources_register(&resources); debug!("Setting up application (profile: {})", &PROFILE); glib::set_application_name("Amberol"); glib::set_program_name(Some("amberol")); gst::init().expect("Failed to initialize gstreamer"); let ctx = glib::MainContext::default(); let _guard = ctx.acquire().unwrap(); Application::new().run() } amberol-0.10.3/src/meson.build000066400000000000000000000034001443320625200161430ustar00rootroot00000000000000# SPDX-FileCopyrightText: 2022 Emmanuele Bassi # SPDX-License-Identifier: GPL-3.0-or-later pkgdatadir = get_option('prefix') / get_option('datadir') / meson.project_name() gnome.compile_resources('amberol', 'amberol.gresource.xml', gresource_bundle: true, install: true, install_dir: pkgdatadir, ) conf = configuration_data() conf.set_quoted('VERSION', '@0@@1@'.format(meson.project_version(), version_suffix)) conf.set_quoted('GETTEXT_PACKAGE', 'amberol') conf.set_quoted('LOCALEDIR', get_option('prefix') / get_option('localedir')) conf.set_quoted('PKGDATADIR', pkgdatadir) conf.set_quoted('APPLICATION_ID', application_id) conf.set_quoted('PROFILE', get_option('profile')) config_rs = configure_file( input: 'config.rs.in', output: 'config.rs', configuration: conf ) # Copy the config.rs output to the source directory. run_command( 'cp', meson.project_build_root() / 'src' / 'config.rs', meson.project_source_root() / 'src' / 'config.rs', check: true, ) cargo_options = [ '--manifest-path', meson.project_source_root() / 'Cargo.toml' ] cargo_options += [ '--target-dir', meson.project_build_root() / 'src' ] if get_option('profile') == 'default' cargo_options += [ '--release' ] rust_target = 'release' message('Building in release mode') else rust_target = 'debug' message('Building in debug mode') endif cargo_env = [ 'CARGO_HOME=' + meson.project_build_root() / 'cargo-home' ] cargo_release = custom_target( 'cargo-build', build_by_default: true, build_always_stale: true, output: meson.project_name(), console: true, install: true, install_dir: get_option('bindir'), command: [ 'env', cargo_env, cargo, 'build', cargo_options, '&&', 'cp', 'src' / rust_target / meson.project_name(), '@OUTPUT@', ], ) amberol-0.10.3/src/playback_control.rs000066400000000000000000000074301443320625200177040ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2022 Emmanuele Bassi // SPDX-License-Identifier: GPL-3.0-or-later use adw::subclass::prelude::*; use gtk::{gio, glib, prelude::*, CompositeTemplate}; use crate::{audio::RepeatMode, i18n::i18n, volume_control::VolumeControl}; mod imp { use super::*; #[derive(Debug, Default, CompositeTemplate)] #[template(resource = "/io/bassi/Amberol/playback-control.ui")] pub struct PlaybackControl { // Template widgets #[template_child] pub start_box: TemplateChild, #[template_child] pub center_box: TemplateChild, #[template_child] pub end_box: TemplateChild, #[template_child] pub previous_button: TemplateChild, #[template_child] pub play_button: TemplateChild, #[template_child] pub next_button: TemplateChild, #[template_child] pub volume_control: TemplateChild, #[template_child] pub playlist_button: TemplateChild, #[template_child] pub shuffle_button: TemplateChild, #[template_child] pub repeat_button: TemplateChild, #[template_child] pub menu_button: TemplateChild, } #[glib::object_subclass] impl ObjectSubclass for PlaybackControl { const NAME: &'static str = "AmberolPlaybackControl"; type Type = super::PlaybackControl; type ParentType = gtk::Widget; fn class_init(klass: &mut Self::Class) { Self::bind_template(klass); klass.set_layout_manager_type::(); klass.set_css_name("playbackcontrol"); klass.set_accessible_role(gtk::AccessibleRole::Group); } fn instance_init(obj: &glib::subclass::InitializingObject) { VolumeControl::static_type(); obj.init_template(); } } impl ObjectImpl for PlaybackControl { fn dispose(&self) { while let Some(child) = self.obj().first_child() { child.unparent(); } } fn constructed(&self) { self.parent_constructed(); self.menu_button.set_primary(true); } } impl WidgetImpl for PlaybackControl {} } glib::wrapper! { pub struct PlaybackControl(ObjectSubclass) @extends gtk::Widget, @implements gio::ActionGroup, gio::ActionMap; } impl Default for PlaybackControl { fn default() -> Self { glib::Object::new() } } impl PlaybackControl { pub fn new() -> Self { Self::default() } pub fn play_button(&self) -> gtk::Button { self.imp().play_button.get() } pub fn repeat_button(&self) -> gtk::Button { self.imp().repeat_button.get() } pub fn volume_control(&self) -> VolumeControl { self.imp().volume_control.get() } pub fn set_repeat_mode(&self, repeat_mode: RepeatMode) { let repeat_button = self.imp().repeat_button.get(); match repeat_mode { RepeatMode::Consecutive => { repeat_button.set_icon_name("media-playlist-consecutive-symbolic"); repeat_button.set_tooltip_text(Some(&i18n("Enable Repeat"))); } RepeatMode::RepeatAll => { repeat_button.set_icon_name("media-playlist-repeat-symbolic"); repeat_button.set_tooltip_text(Some(&i18n("Repeat All Songs"))); } RepeatMode::RepeatOne => { repeat_button.set_icon_name("media-playlist-repeat-song-symbolic"); repeat_button.set_tooltip_text(Some(&i18n("Repeat the Current Song"))); } } } } amberol-0.10.3/src/playlist_view.rs000066400000000000000000000101151443320625200172430ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2022 Emmanuele Bassi // SPDX-License-Identifier: GPL-3.0-or-later use adw::subclass::prelude::*; use gtk::{gio, glib, prelude::*, CompositeTemplate}; mod imp { use super::*; #[derive(Debug, Default, CompositeTemplate)] #[template(resource = "/io/bassi/Amberol/playlist-view.ui")] pub struct PlaylistView { #[template_child] pub back_button: TemplateChild, #[template_child] pub queue_view: TemplateChild, #[template_child] pub queue_length_label: TemplateChild, #[template_child] pub queue_actionbar: TemplateChild, #[template_child] pub queue_select_all_button: TemplateChild, #[template_child] pub queue_remove_button: TemplateChild, #[template_child] pub queue_selected_label: TemplateChild, #[template_child] pub playlist_progress: TemplateChild, #[template_child] pub playlist_searchbar: TemplateChild, #[template_child] pub playlist_searchentry: TemplateChild, } #[glib::object_subclass] impl ObjectSubclass for PlaylistView { const NAME: &'static str = "AmberolPlaylistView"; type Type = super::PlaylistView; type ParentType = gtk::Widget; fn class_init(klass: &mut Self::Class) { Self::bind_template(klass); klass.set_layout_manager_type::(); klass.set_css_name("playlistview"); klass.set_accessible_role(gtk::AccessibleRole::Group); } fn instance_init(obj: &glib::subclass::InitializingObject) { obj.init_template(); } } impl ObjectImpl for PlaylistView { fn dispose(&self) { while let Some(child) = self.obj().first_child() { child.unparent(); } } fn constructed(&self) { self.parent_constructed(); self.obj().setup_searchbar(); } } impl WidgetImpl for PlaylistView {} } glib::wrapper! { pub struct PlaylistView(ObjectSubclass) @extends gtk::Widget, @implements gio::ActionGroup, gio::ActionMap; } impl Default for PlaylistView { fn default() -> Self { glib::Object::new() } } impl PlaylistView { pub fn new() -> Self { Self::default() } fn setup_searchbar(&self) { let entry = self.imp().playlist_searchentry.get(); self.imp().playlist_searchbar.connect_entry(&entry); } pub fn back_button(&self) -> gtk::Button { self.imp().back_button.get() } pub fn queue_actionbar(&self) -> gtk::ActionBar { self.imp().queue_actionbar.get() } pub fn queue_remove_button(&self) -> gtk::Button { self.imp().queue_remove_button.get() } pub fn queue_select_all_button(&self) -> gtk::Button { self.imp().queue_select_all_button.get() } pub fn queue_selected_label(&self) -> gtk::Label { self.imp().queue_selected_label.get() } pub fn queue_view(&self) -> gtk::ListView { self.imp().queue_view.get() } pub fn queue_length_label(&self) -> gtk::Label { self.imp().queue_length_label.get() } pub fn playlist_searchbar(&self) -> gtk::SearchBar { self.imp().playlist_searchbar.get() } pub fn playlist_searchentry(&self) -> gtk::SearchEntry { self.imp().playlist_searchentry.get() } pub fn begin_loading(&self) { self.imp().playlist_progress.set_fraction(0.0); self.imp().playlist_progress.set_visible(true); } pub fn end_loading(&self) { self.imp().playlist_progress.set_visible(false); } pub fn update_loading(&self, cur: u32, max: u32) { let step = cur as f64 / max as f64; self.imp().playlist_progress.set_fraction(step); } pub fn set_search(&self, search: bool) { self.imp().playlist_searchbar.set_search_mode(search); } } amberol-0.10.3/src/queue_row.rs000066400000000000000000000175661443320625200164040ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2022 Emmanuele Bassi // SPDX-License-Identifier: GPL-3.0-or-later use std::cell::{Cell, RefCell}; use adw::subclass::prelude::*; use glib::clone; use gtk::{gdk, gio, glib, prelude::*, CompositeTemplate}; use crate::{audio::Song, cover_picture::CoverPicture}; mod imp { use glib::{ParamSpec, ParamSpecBoolean, ParamSpecObject, ParamSpecString, Value}; use once_cell::sync::Lazy; use super::*; #[derive(Debug, Default, CompositeTemplate)] #[template(resource = "/io/bassi/Amberol/queue-row.ui")] pub struct QueueRow { // Template widgets #[template_child] pub row_stack: TemplateChild, #[template_child] pub song_cover_stack: TemplateChild, #[template_child] pub song_cover_image: TemplateChild, #[template_child] pub song_title_label: TemplateChild, #[template_child] pub song_artist_label: TemplateChild, #[template_child] pub song_playing_image: TemplateChild, #[template_child] pub selection_title_label: TemplateChild, #[template_child] pub selection_artist_label: TemplateChild, #[template_child] pub selected_button: TemplateChild, #[template_child] pub selection_playing_image: TemplateChild, pub song: RefCell>, pub playing: Cell, pub selection_mode: Cell, } #[glib::object_subclass] impl ObjectSubclass for QueueRow { const NAME: &'static str = "AmberolQueueRow"; type Type = super::QueueRow; type ParentType = gtk::Widget; fn class_init(klass: &mut Self::Class) { Self::bind_template(klass); klass.set_layout_manager_type::(); klass.set_css_name("queuerow"); klass.set_accessible_role(gtk::AccessibleRole::Group); } fn instance_init(obj: &glib::subclass::InitializingObject) { obj.init_template(); } } impl ObjectImpl for QueueRow { fn dispose(&self) { while let Some(child) = self.obj().first_child() { child.unparent(); } } fn constructed(&self) { self.parent_constructed(); self.obj().init_widgets(); } fn properties() -> &'static [ParamSpec] { static PROPERTIES: Lazy> = Lazy::new(|| { vec![ ParamSpecObject::builder::("song").build(), ParamSpecString::builder("song-artist").build(), ParamSpecString::builder("song-title").build(), ParamSpecObject::builder::("song-cover").build(), ParamSpecBoolean::builder("playing").build(), ParamSpecBoolean::builder("selection-mode").build(), ParamSpecBoolean::builder("selected").build(), ] }); PROPERTIES.as_ref() } fn set_property(&self, _id: usize, value: &Value, pspec: &ParamSpec) { match pspec.name() { "song" => { let song = value.get::>().unwrap(); self.song.replace(song); } "song-artist" => { let p = value.get::<&str>().expect("The value needs to be a string"); self.obj().set_song_artist(p); } "song-title" => { let p = value.get::<&str>().expect("The value needs to be a string"); self.obj().set_song_title(p); } "song-cover" => { let p = value.get::().ok(); self.obj().set_song_cover(p); } "playing" => { let p = value .get::() .expect("The value needs to be a boolean"); self.obj().set_playing(p); } "selection-mode" => { let p = value .get::() .expect("The value needs to be a boolean"); self.obj().set_selection_mode(p); } "selected" => { let p = value .get::() .expect("The value needs to be a boolean"); self.selected_button.set_active(p); } _ => unimplemented!(), } } fn property(&self, _id: usize, pspec: &ParamSpec) -> Value { match pspec.name() { "song" => self.song.borrow().to_value(), "song-artist" => self.song_artist_label.text().to_value(), "song-title" => self.song_title_label.text().to_value(), "song-cover" => self.song_cover_image.cover().to_value(), "playing" => self.playing.get().to_value(), "selection-mode" => self.selection_mode.get().to_value(), "selected" => self.selected_button.is_active().to_value(), _ => unimplemented!(), } } } impl WidgetImpl for QueueRow {} } glib::wrapper! { pub struct QueueRow(ObjectSubclass) @extends gtk::Widget, @implements gio::ActionGroup, gio::ActionMap; } impl Default for QueueRow { fn default() -> Self { glib::Object::new() } } impl QueueRow { pub fn new() -> Self { Self::default() } fn init_widgets(&self) { self.imp().selected_button.connect_active_notify( clone!(@strong self as this => move |button| { if let Some(ref song) = *this.imp().song.borrow() { song.set_selected(button.is_active()); } this.notify("selected"); }), ); } fn set_playing(&self, playing: bool) { if playing != self.imp().playing.replace(playing) { self.update_mode(); self.notify("playing"); } } fn set_selection_mode(&self, selection_mode: bool) { if selection_mode != self.imp().selection_mode.replace(selection_mode) { self.update_mode(); self.notify("selection-mode"); } } fn update_mode(&self) { let imp = self.imp(); if imp.selection_mode.get() { imp.row_stack.set_visible_child_name("selection-mode"); let opacity = if imp.playing.get() { 1.0 } else { 0.0 }; imp.selection_playing_image.set_opacity(opacity); } else { imp.row_stack.set_visible_child_name("song-details"); let opacity = if imp.playing.get() { 1.0 } else { 0.0 }; imp.song_playing_image.set_opacity(opacity); } } fn set_song_title(&self, title: &str) { let imp = self.imp(); imp.song_title_label.set_text(Some(title)); imp.selection_title_label.set_text(Some(title)); } fn set_song_artist(&self, artist: &str) { let imp = self.imp(); imp.song_artist_label.set_text(Some(artist)); imp.selection_artist_label.set_text(Some(artist)); } fn set_song_cover(&self, cover: Option) { let imp = self.imp(); if let Some(texture) = cover { imp.song_cover_image.set_cover(Some(&texture)); imp.song_cover_stack.set_visible_child_name("cover"); } else { imp.song_cover_image.set_cover(None); imp.song_cover_stack.set_visible_child_name("no-cover"); } } pub fn song(&self) -> Option { self.imp().song.borrow().clone() } } amberol-0.10.3/src/search.rs000066400000000000000000000050551443320625200156240ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2022 John Toohey // SPDX-License-Identifier: GPL-3.0-or-later use gtk::{glib, prelude::*, subclass::prelude::*}; mod imp { use std::cell::RefCell; use fuzzy_matcher::{skim::SkimMatcherV2, FuzzyMatcher}; use gtk::{ glib::{self, ParamSpec, ParamSpecString, Value}, prelude::*, subclass::prelude::*, }; use once_cell::sync::Lazy; use crate::audio::Song; #[derive(Default)] pub struct FuzzyFilter { pub search: RefCell>, } #[glib::object_subclass] impl ObjectSubclass for FuzzyFilter { const NAME: &'static str = "AmberolFuzzyFilter"; type Type = super::FuzzyFilter; type ParentType = gtk::Filter; } impl ObjectImpl for FuzzyFilter { fn properties() -> &'static [ParamSpec] { static PROPERTIES: Lazy> = Lazy::new(|| vec![ParamSpecString::builder("search").build()]); PROPERTIES.as_ref() } fn set_property(&self, _id: usize, value: &Value, pspec: &ParamSpec) { match pspec.name() { "search" => { let p = value .get::>() .expect("Value must be a string"); self.obj().set_search(p); } _ => unimplemented!(), } } } impl FilterImpl for FuzzyFilter { fn strictness(&self) -> gtk::FilterMatch { gtk::FilterMatch::Some } fn match_(&self, song: &glib::Object) -> bool { let song = song.downcast_ref::().unwrap(); if let Some(search) = self.search.borrow().as_ref() { let key = song.search_key(); let matcher = SkimMatcherV2::default(); matcher.fuzzy_match(&key, search).is_some() || search.is_empty() } else { true } } } } glib::wrapper! { pub struct FuzzyFilter(ObjectSubclass) @extends gtk::Filter; } impl FuzzyFilter { pub fn new() -> Self { glib::Object::new() } pub fn search(&self) -> Option { self.imp().search.borrow().as_ref().map(ToString::to_string) } pub fn set_search(&self, search: Option) { if &*self.imp().search.borrow() != &search { *self.imp().search.borrow_mut() = search.map(|x| x.to_lowercase()); self.changed(gtk::FilterChange::Different); } } } amberol-0.10.3/src/song_cover.rs000066400000000000000000000041061443320625200165170ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2023 Emmanuele Bassi // SPDX-License-Identifier: GPL-3.0-or-later use adw::subclass::prelude::*; use gtk::{glib, prelude::*, CompositeTemplate}; use crate::cover_picture::CoverPicture; mod imp { use super::*; #[derive(Debug, Default, CompositeTemplate)] #[template(resource = "/io/bassi/Amberol/song-cover.ui")] pub struct SongCover { // Template widgets #[template_child] pub cover_stack: TemplateChild, #[template_child] pub album_image: TemplateChild, } #[glib::object_subclass] impl ObjectSubclass for SongCover { const NAME: &'static str = "AmberolSongCover"; type Type = super::SongCover; type ParentType = gtk::Widget; fn class_init(klass: &mut Self::Class) { Self::bind_template(klass); klass.set_layout_manager_type::(); klass.set_css_name("songcover"); klass.set_accessible_role(gtk::AccessibleRole::Group); } fn instance_init(obj: &glib::subclass::InitializingObject) { CoverPicture::static_type(); obj.init_template(); } } impl ObjectImpl for SongCover { fn dispose(&self) { while let Some(child) = self.obj().first_child() { child.unparent(); } } } impl WidgetImpl for SongCover {} } glib::wrapper! { pub struct SongCover(ObjectSubclass) @extends gtk::Widget; } impl Default for SongCover { fn default() -> Self { glib::Object::new::() } } impl SongCover { pub fn new() -> Self { Self::default() } pub fn album_image(&self) -> CoverPicture { self.imp().album_image.get() } pub fn show_cover_image(&self, has_image: bool) { let cover_stack = self.imp().cover_stack.get(); if has_image { cover_stack.set_visible_child_name("cover-image"); } else { cover_stack.set_visible_child_name("no-image"); } } } amberol-0.10.3/src/song_details.rs000066400000000000000000000040011443320625200170200ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2022 Emmanuele Bassi // SPDX-License-Identifier: GPL-3.0-or-later use adw::subclass::prelude::*; use gtk::{glib, prelude::*, CompositeTemplate}; mod imp { use super::*; #[derive(Debug, Default, CompositeTemplate)] #[template(resource = "/io/bassi/Amberol/song-details.ui")] pub struct SongDetails { // Template widgets #[template_child] pub song_title_label: TemplateChild, #[template_child] pub song_artist_label: TemplateChild, #[template_child] pub song_album_label: TemplateChild, } #[glib::object_subclass] impl ObjectSubclass for SongDetails { const NAME: &'static str = "AmberolSongDetails"; type Type = super::SongDetails; type ParentType = gtk::Widget; fn class_init(klass: &mut Self::Class) { Self::bind_template(klass); klass.set_layout_manager_type::(); klass.set_css_name("songdetails"); klass.set_accessible_role(gtk::AccessibleRole::Group); } fn instance_init(obj: &glib::subclass::InitializingObject) { obj.init_template(); } } impl ObjectImpl for SongDetails { fn dispose(&self) { while let Some(child) = self.obj().first_child() { child.unparent(); } } } impl WidgetImpl for SongDetails {} } glib::wrapper! { pub struct SongDetails(ObjectSubclass) @extends gtk::Widget; } impl Default for SongDetails { fn default() -> Self { glib::Object::new() } } impl SongDetails { pub fn new() -> Self { Self::default() } pub fn artist_label(&self) -> gtk::Label { self.imp().song_artist_label.get() } pub fn title_label(&self) -> gtk::Label { self.imp().song_title_label.get() } pub fn album_label(&self) -> gtk::Label { self.imp().song_album_label.get() } } amberol-0.10.3/src/sort.rs000066400000000000000000000055761443320625200153560ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2022 John Toohey // SPDX-License-Identifier: GPL-3.0-or-later use gtk::{glib, prelude::*, subclass::prelude::*}; mod imp { use std::cell::RefCell; use fuzzy_matcher::{skim::SkimMatcherV2, FuzzyMatcher}; use gtk::{ glib::{self, ParamSpec, ParamSpecString, Value}, prelude::*, subclass::prelude::*, }; use once_cell::sync::Lazy; use crate::{audio::Song, utils::cmp_two_files}; #[derive(Default)] pub struct FuzzySorter { pub search: RefCell>, } #[glib::object_subclass] impl ObjectSubclass for FuzzySorter { const NAME: &'static str = "AmberolFuzzySorter"; type Type = super::FuzzySorter; type ParentType = gtk::Sorter; } impl ObjectImpl for FuzzySorter { fn properties() -> &'static [ParamSpec] { static PROPERTIES: Lazy> = Lazy::new(|| vec![ParamSpecString::builder("search").build()]); PROPERTIES.as_ref() } fn set_property(&self, _id: usize, value: &Value, pspec: &ParamSpec) { match pspec.name() { "search" => { let p = value .get::>() .expect("Value must be a string"); self.obj().set_search(p); } _ => unimplemented!(), } } } impl SorterImpl for FuzzySorter { fn compare(&self, item1: &glib::Object, item2: &glib::Object) -> gtk::Ordering { let item1 = item1.downcast_ref::().unwrap(); let item2 = item2.downcast_ref::().unwrap(); if let Some(search) = self.search.borrow().as_ref() { let matcher = SkimMatcherV2::default(); let item1_key = item1.search_key(); let item2_key = item2.search_key(); let item1_score = matcher.fuzzy_match(&item1_key, search); let item2_score = matcher.fuzzy_match(&item2_key, search); item1_score.cmp(&item2_score).reverse().into() } else { cmp_two_files(None, &item1.file(), &item2.file()).into() } } fn order(&self) -> gtk::SorterOrder { gtk::SorterOrder::Partial } } } glib::wrapper! { pub struct FuzzySorter(ObjectSubclass) @extends gtk::Sorter; } impl FuzzySorter { pub fn new() -> Self { glib::Object::new() } pub fn search(&self) -> Option { self.imp().search.borrow().as_ref().map(ToString::to_string) } pub fn set_search(&self, search: Option) { if &*self.imp().search.borrow() != &search { *self.imp().search.borrow_mut() = search; self.changed(gtk::SorterChange::Different); } } } amberol-0.10.3/src/utils.rs000066400000000000000000000226731443320625200155240ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2022 Emmanuele Bassi // SPDX-License-Identifier: GPL-3.0-or-later use core::cmp::Ordering; use std::path::PathBuf; use color_thief::{get_palette, ColorFormat}; use glib::clone; use gtk::{gdk, gio, glib, prelude::*}; use log::{debug, warn}; use crate::{ audio::{Queue, Song}, config::APPLICATION_ID, }; pub fn settings_manager() -> gio::Settings { // We ship a single schema for both default and development profiles let app_id = APPLICATION_ID.trim_end_matches(".Devel"); gio::Settings::new(app_id) } pub fn format_remaining_time(t: i64) -> String { // We use an explicit LRM character so the MINUS SIGN character // stays in front of the remaining time even in RTL locales, instead // of getting flipped at the end of the text format!("\u{200e}\u{2212}{}:{:02}", (t - (t % 60)) / 60, t % 60) } pub fn format_time(t: i64) -> String { format!("{}:{:02}", (t - (t % 60)) / 60, t % 60) } // The base cover size is 192px, but we need to account for HiDPI; // better to scale down when rendering on displays with a scaling // factor of 1 than having to scale up on displays with a scaling // factor of 2. const COVER_SIZE: i32 = 192 * 2; pub fn load_cover_texture(buffer: &glib::Bytes) -> Option { let stream = gio::MemoryInputStream::from_bytes(buffer); if let Ok(pixbuf) = gdk_pixbuf::Pixbuf::from_stream(&stream, gio::Cancellable::NONE) { let width = pixbuf.width(); let height = pixbuf.height(); let ratio = width as f32 / height as f32; let w: i32; let h: i32; if ratio > 1.0 { w = COVER_SIZE; h = (COVER_SIZE as f32 / ratio) as i32; } else { w = (COVER_SIZE as f32 * ratio) as i32; h = COVER_SIZE; } debug!("Cover size {width} x {height} (ratio: {ratio}), scaled: {w} x {h}"); pixbuf.scale_simple(w, h, gdk_pixbuf::InterpType::Nearest) } else { warn!("Unable to load cover art"); None } } pub fn cache_cover_art(uuid: &str, pixbuf: &gdk_pixbuf::Pixbuf) -> Option { let mut cache_dir = glib::user_cache_dir(); cache_dir.push("amberol"); cache_dir.push("covers"); glib::mkdir_with_parents(&cache_dir, 0o755); cache_dir.push(format!("{}.png", &uuid)); let file = gio::File::for_path(&cache_dir); match file.create(gio::FileCreateFlags::NONE, gio::Cancellable::NONE) { Ok(stream) => { debug!("Creating cover data cache at {:?}", &cache_dir); pixbuf.save_to_streamv_async( &stream, "png", &[("tEXt::Software", "amberol")], gio::Cancellable::NONE, move |res| { match res { Err(e) => warn!("Unable to cache cover data: {}", e), _ => (), }; }, ); } Err(e) => { if let Some(file_error) = e.kind::() { match file_error { glib::FileError::Exist => (), _ => { warn!("Unable to create cache file: {}", e); return None; } }; } } }; Some(cache_dir) } fn color_format(has_alpha: bool) -> ColorFormat { if has_alpha { ColorFormat::Rgba } else { ColorFormat::Rgb } } pub fn load_palette(pixbuf: &gdk_pixbuf::Pixbuf) -> Option> { if let Ok(palette) = get_palette( pixbuf.pixel_bytes().unwrap().as_ref(), color_format(pixbuf.has_alpha()), 5, 4, ) { let colors: Vec = palette .iter() .map(|c| { gdk::RGBA::new( c.r as f32 / 255.0, c.g as f32 / 255.0, c.b as f32 / 255.0, 1.0, ) }) .collect(); return Some(colors); } None } fn load_files_from_folder_internal( base: &gio::File, folder: &gio::File, recursive: bool, ) -> Vec { let mut enumerator = folder .enumerate_children( "standard::name,standard::type", gio::FileQueryInfoFlags::NOFOLLOW_SYMLINKS, None::<&gio::Cancellable>, ) .expect("Unable to enumerate"); let mut files = Vec::new(); while let Some(info) = enumerator.next().and_then(|s| s.ok()) { let child = enumerator.child(&info); if recursive && info.file_type() == gio::FileType::Directory { let mut res = load_files_from_folder_internal(&base, &child, recursive); files.append(&mut res); } else if info.file_type() == gio::FileType::Regular { files.push(child.clone()); } } // gio::FileEnumerator has no guaranteed order, so we should // rely on the basename being formatted in a way that gives us an // implicit order; if anything, this will queue songs in the same // order in which they appear in the directory when browsing its // contents files.sort_by(|a, b| cmp_two_files(Some(base), a, b)); files } pub fn cmp_two_files(base: Option<&gio::File>, a: &gio::File, b: &gio::File) -> Ordering { let parent_a = a.parent().unwrap(); let parent_b = b.parent().unwrap(); let parent_basename_a = if let Some(base) = base { if let Some(path) = base.relative_path(&parent_a) { path } else { parent_a.basename().unwrap() } } else { parent_a.basename().unwrap() }; let parent_basename_b = if let Some(base) = base { if let Some(path) = base.relative_path(&parent_b) { path } else { parent_b.basename().unwrap() } } else { parent_b.basename().unwrap() }; let basename_a = a.basename().unwrap(); let basename_b = b.basename().unwrap(); let mut order = cmp_like_nautilus( &parent_basename_a.to_string_lossy(), &parent_basename_b.to_string_lossy(), ); if order.is_eq() { order = cmp_like_nautilus(&basename_a.to_string_lossy(), &basename_b.to_string_lossy()); } order } fn cmp_like_nautilus(filename_a: &str, filename_b: &str) -> Ordering { let order; let sort_last_a = filename_a.as_bytes()[0] == b'.' || filename_a.as_bytes()[0] == b'#'; let sort_last_b = filename_b.as_bytes()[0] == b'.' || filename_b.as_bytes()[0] == b'#'; if !sort_last_a && sort_last_b { order = Ordering::Less; } else if sort_last_a && !sort_last_b { order = Ordering::Greater; } else { let key_a = glib::FilenameCollationKey::from(filename_a); let key_b = glib::FilenameCollationKey::from(filename_b); order = key_a.partial_cmp(&key_b).unwrap(); } order } pub fn load_files_from_folder(folder: &gio::File, recursive: bool) -> Vec { use std::time::Instant; let now = Instant::now(); let res = load_files_from_folder_internal(folder, folder, recursive); debug!( "Folder enumeration: {} us (recursive: {}), total files: {}", now.elapsed().as_micros(), recursive, res.len() ); res } async fn store_current_pls(queue: &Queue) { let pls = glib::KeyFile::new(); pls.set_string("playlist", "X-GNOME-Title", "Amberol's current playlist"); pls.set_int64("playlist", "NumberOfEntries", queue.n_songs() as i64); let model = queue.model(); for i in 0..model.n_items() { let item = model.item(i).unwrap(); let song = item.downcast_ref::().unwrap(); let path = song.file().path().expect("Unknown file"); let path_str = path.to_string_lossy(); pls.set_value("playlist", &format!("File{i}"), &path_str); } let mut pls_cache = glib::user_cache_dir(); pls_cache.push("amberol"); pls_cache.push("playlists"); glib::mkdir_with_parents(&pls_cache, 0o755); pls_cache.push("current.pls"); match pls.save_to_file(&pls_cache) { Ok(_) => debug!("Current playlist updated to: {:?}", &pls_cache), Err(e) => debug!("Unable to save current playlist: {e}"), } } pub fn store_playlist(queue: &Queue) { let ctx = glib::MainContext::default(); ctx.spawn_local(clone!(@weak queue => async move { store_current_pls(&queue).await })); } pub fn load_cached_songs() -> Option> { let mut pls_cache = glib::user_cache_dir(); pls_cache.push("amberol"); pls_cache.push("playlists"); pls_cache.push("current.pls"); let pls = glib::KeyFile::new(); match pls.load_from_file(&pls_cache, glib::KeyFileFlags::NONE) { Err(e) => { debug!("Unable to load current playlist: {e}"); return None; } Ok(_) => (), } let n_entries: usize = match pls.int64("playlist", "NumberOfEntries") { Ok(n) => n as usize, Err(_) => 0, }; let mut res = Vec::with_capacity(n_entries); for i in 0..n_entries { match pls.value("playlist", &format!("File{i}")) { Ok(p) => res.push(gio::File::for_path(p)), Err(e) => debug!("Skipping File{i} from playlist: {e}"), } } Some(res) } pub fn has_cached_playlist() -> bool { let mut pls_cache = glib::user_cache_dir(); pls_cache.push("amberol"); pls_cache.push("playlists"); pls_cache.push("current.pls"); pls_cache.exists() } amberol-0.10.3/src/volume_control.rs000066400000000000000000000137151443320625200174300ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2022 Emmanuele Bassi // SPDX-License-Identifier: GPL-3.0-or-later use adw::subclass::prelude::*; use glib::clone; use gtk::{gio, glib, prelude::*, CompositeTemplate}; use log::debug; use std::cell::Cell; mod imp { use glib::{subclass::Signal, ParamSpec, ParamSpecBoolean, ParamSpecDouble, Value}; use once_cell::sync::Lazy; use super::*; #[derive(Debug, Default, CompositeTemplate)] #[template(resource = "/io/bassi/Amberol/volume-control.ui")] pub struct VolumeControl { // Template widgets #[template_child] pub volume_low_button: TemplateChild, #[template_child] pub volume_scale: TemplateChild, #[template_child] pub volume_high_image: TemplateChild, pub toggle_mute: Cell, pub prev_volume: Cell, } #[glib::object_subclass] impl ObjectSubclass for VolumeControl { const NAME: &'static str = "AmberolVolumeControl"; type Type = super::VolumeControl; type ParentType = gtk::Widget; fn class_init(klass: &mut Self::Class) { Self::bind_template(klass); klass.set_layout_manager_type::(); klass.set_css_name("volume"); klass.set_accessible_role(gtk::AccessibleRole::Group); klass.install_property_action("volume.toggle-mute", "toggle-mute"); } fn instance_init(obj: &glib::subclass::InitializingObject) { obj.init_template(); } } impl ObjectImpl for VolumeControl { fn constructed(&self) { self.parent_constructed(); self.obj().setup_adjustment(); self.obj().setup_controller(); } fn dispose(&self) { while let Some(child) = self.obj().first_child() { child.unparent(); } } fn properties() -> &'static [ParamSpec] { static PROPERTIES: Lazy> = Lazy::new(|| { vec![ ParamSpecDouble::builder("volume") .minimum(0.0) .maximum(1.0) .default_value(1.0) .build(), ParamSpecBoolean::builder("toggle-mute").build(), ] }); PROPERTIES.as_ref() } fn set_property(&self, _id: usize, value: &Value, pspec: &ParamSpec) { match pspec.name() { "volume" => { let v = value.get::().expect("Failed to get f64 value"); self.volume_scale.set_value(v); } "toggle-mute" => { let v = value.get::().expect("Failed to get a boolean value"); self.obj().toggle_mute(v); } _ => unimplemented!(), } } fn property(&self, _id: usize, pspec: &ParamSpec) -> Value { match pspec.name() { "volume" => self.volume_scale.value().to_value(), "toggle-mute" => self.toggle_mute.get().to_value(), _ => unimplemented!(), } } fn signals() -> &'static [Signal] { static SIGNALS: Lazy> = Lazy::new(|| { vec![Signal::builder("volume-changed") .param_types([f64::static_type()]) .build()] }); SIGNALS.as_ref() } } impl WidgetImpl for VolumeControl {} } glib::wrapper! { pub struct VolumeControl(ObjectSubclass) @extends gtk::Widget, @implements gio::ActionGroup, gio::ActionMap; } impl Default for VolumeControl { fn default() -> Self { glib::Object::new() } } impl VolumeControl { pub fn new() -> Self { Self::default() } fn setup_adjustment(&self) { let adj = gtk::Adjustment::builder() .lower(0.0) .upper(1.0) .step_increment(0.05) .value(1.0) .build(); self.imp().volume_scale.set_adjustment(&adj); adj.connect_notify_local( Some("value"), clone!(@strong self as this => move |adj, _| { let value = adj.value(); if value == adj.lower() { this.imp().volume_low_button.set_icon_name("audio-volume-muted-symbolic"); } else { this.imp().volume_low_button.set_icon_name("audio-volume-low-symbolic"); } this.notify("volume"); this.emit_by_name::<()>("volume-changed", &[&value]); }), ); } fn setup_controller(&self) { let controller = gtk::EventControllerScroll::builder() .name("volume-scroll") .flags(gtk::EventControllerScrollFlags::VERTICAL) .build(); controller.connect_scroll(clone!(@strong self as this => move |_, _, dy| { debug!("Scroll delta: {}", dy); let adj = this.imp().volume_scale.adjustment(); let delta = dy * adj.step_increment(); let d = (adj.value() - delta).clamp(adj.lower(), adj.upper()); adj.set_value(d); gtk::Inhibit(true) })); self.imp().volume_scale.add_controller(controller); } fn toggle_mute(&self, muted: bool) { if muted != self.imp().toggle_mute.replace(muted) { if muted { let prev_value = self.imp().volume_scale.value(); self.imp().prev_volume.replace(prev_value); self.imp().volume_scale.set_value(0.0); } else { let prev_value = self.imp().prev_volume.get(); self.imp().volume_scale.set_value(prev_value); } self.notify("toggle-mute"); } } pub fn volume(&self) -> f64 { self.imp().volume_scale.value() } } amberol-0.10.3/src/waveform_view.rs000066400000000000000000000525151443320625200172420ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2022 Emmanuele Bassi // SPDX-License-Identifier: GPL-3.0-or-later // Based on gnome-sound-recorder/src/waveform.js: // - Copyright 2013 Meg Ford // - Copyright 2022 Kavan Mevada // Released under the terms of the LGPL 2.0 or later #![allow(deprecated)] use std::{ cell::{Cell, RefCell}, ops::DivAssign, }; use adw::subclass::prelude::*; use glib::clone; use gtk::{gdk, glib, graphene, prelude::*}; use log::{debug, warn}; #[derive(Debug, PartialEq)] pub struct PeakPair { pub left: f64, pub right: f64, } impl PeakPair { pub fn new(left: f64, right: f64) -> Self { Self { left, right } } } impl DivAssign for PeakPair { fn div_assign(&mut self, rhs: f64) { self.left /= rhs; self.right /= rhs; } } mod imp { use glib::{subclass::Signal, ParamSpec, ParamSpecDouble, Value}; use once_cell::sync::Lazy; use super::*; #[derive(Debug, Default)] pub struct WaveformView { pub position: Cell, pub hover_position: Cell>, // left and right channel peaks, normalised between 0 and 1 pub peaks: RefCell>>, pub next_peaks: RefCell>>, pub tick_id: RefCell>, pub first_frame_time: Cell>, pub factor: Cell>, } #[glib::object_subclass] impl ObjectSubclass for WaveformView { const NAME: &'static str = "AmberolWaveformView"; type Type = super::WaveformView; type ParentType = gtk::Widget; fn class_init(klass: &mut Self::Class) { klass.set_css_name("waveformview"); klass.set_accessible_role(gtk::AccessibleRole::Slider); } } impl ObjectImpl for WaveformView { fn properties() -> &'static [ParamSpec] { static PROPERTIES: Lazy> = Lazy::new(|| { vec![ParamSpecDouble::builder("position") .minimum(0.0) .maximum(1.0) .default_value(0.0) .build()] }); PROPERTIES.as_ref() } fn set_property(&self, _id: usize, value: &Value, pspec: &ParamSpec) { match pspec.name() { "position" => self.position.replace(value.get::().unwrap()), _ => unimplemented!(), }; } fn property(&self, _id: usize, pspec: &ParamSpec) -> Value { match pspec.name() { "position" => self.position.get().to_value(), _ => unimplemented!(), } } fn signals() -> &'static [Signal] { static SIGNALS: Lazy> = Lazy::new(|| { vec![Signal::builder("position-changed") .param_types([f64::static_type()]) .build()] }); SIGNALS.as_ref() } fn constructed(&self) { self.parent_constructed(); self.obj().set_focusable(true); self.obj().setup_gesture(); self.obj() .upcast_ref::() .update_property(&[ (gtk::accessible::Property::ValueMin(0.0)), (gtk::accessible::Property::ValueMax(1.0)), (gtk::accessible::Property::ValueNow(0.0)), ]); } fn dispose(&self) { if let Some(tick_id) = self.tick_id.replace(None) { tick_id.remove(); } } } impl WidgetImpl for WaveformView { fn focus(&self, direction: gtk::DirectionType) -> bool { debug!("WaveformView::focus({})", direction); let widget = self.obj(); if !widget.is_focus() { widget.grab_focus(); return true; } let pos = self.position.get(); match direction { gtk::DirectionType::Left if pos == 0.0 => false, gtk::DirectionType::Left if pos > 0.0 => true, gtk::DirectionType::Right if pos < 1.0 => true, gtk::DirectionType::Right if pos == 1.0 => false, _ => false, } } fn request_mode(&self) -> gtk::SizeRequestMode { gtk::SizeRequestMode::ConstantSize } fn measure(&self, orientation: gtk::Orientation, _for_size: i32) -> (i32, i32, i32, i32) { match orientation { gtk::Orientation::Horizontal => { // We ask for as many samples we can fit within a 256 pixels wide area if let Some(ref peaks) = *self.peaks.borrow() { let n_peaks = peaks.len() as i32; let width = i32::min(n_peaks * 4, 256); (width, width, -1, -1) } else { (256, 256, -1, -1) } } gtk::Orientation::Vertical => (48, 48, -1, -1), _ => (0, 0, -1, -1), } } fn snapshot(&self, snapshot: >k::Snapshot) { let widget = self.obj(); let w = widget.width(); let h = widget.height(); if w == 0 || h == 0 { return; } // Our reference line let center_y = h as f32 / 2.0; // Grab the colors let hc = adw::StyleManager::default().is_high_contrast(); let style_context = widget.style_context(); let color = style_context.color(); let empty_opacity = if hc { 0.4 } else { 0.2 }; let hover_opacity = if hc { 0.7 } else { 0.45 }; let empty_color = gdk::RGBA::new( color.red(), color.green(), color.blue(), color.alpha() * empty_opacity, ); let is_rtl = match widget.direction() { gtk::TextDirection::Rtl => true, _ => false, }; let bar_size = 2; let space_size = 2; let block_size = bar_size + space_size; let available_width = w; if let Some(ref peaks) = *self.peaks.borrow() { let n_peaks = peaks.len() as i32; let waveform_width = w as f64; // We have two cursors: // // 1. the state position, updated by the player // 2. the hover position, updated by the motion controller // // The hover position may be behind the state position, if we are // scrubbing backwards; or after the state position, if we are // scrubbing forward. // // The area between the state position and the hover position is // meant to be shown as a dimmed cursor color; the area between // the start of the waveform and the state position is meant to be // shown as a full cursor color; and the area between the hover // position and the end of the waveform is meant to be shown as a // current foreground color. let position = if is_rtl { 1.0 - self.position.get() } else { self.position.get() }; let mut cursor_pos: [f64; 2] = [ position * waveform_width as f64, position * waveform_width as f64, ]; if let Some(hover) = self.hover_position.get() { if is_rtl { if hover <= position { cursor_pos[1] = hover * waveform_width as f64; } else { cursor_pos[0] = hover * waveform_width as f64; } } else { if hover <= position { cursor_pos[0] = hover * waveform_width as f64; } else { cursor_pos[1] = hover * waveform_width as f64; } } } // If the number of samples is too big to fit into the available // width, we average the samples that fit within a bar let pixels_per_sample = if available_width > n_peaks * block_size { block_size as f64 } else { (available_width as f64 / 2.0) / n_peaks as f64 }; let mut current_pixel = 0.0; let mut samples_in_accum = 0; let mut accum = PeakPair::new(0.0, 0.0); let mut offset = if is_rtl { waveform_width } else { 0.0 }; for (i, sample) in peaks.iter().enumerate() { current_pixel += pixels_per_sample; samples_in_accum += 1; accum.left += sample.left; accum.right += sample.right; if current_pixel > bar_size as f64 || i == peaks.len() - 1 { accum /= samples_in_accum as f64; // Scale by half: left goes in the upper half of the // available space, and right goes in the lower half let mut left = accum.left / 2.0; let mut right = accum.right / 2.0; // We optionally apply the scaling factor computed // during the animation if let Some(factor) = self.factor.get() { left *= factor.clamp(0.0, 1.0); right *= factor.clamp(0.0, 1.0); } // The block rectangle, clamped to avoid overdrawing let x = if is_rtl { offset as f32 - bar_size as f32 } else { offset as f32 }; let y = f32::clamp( center_y as f32 - right as f32 * h as f32, 0.0, h as f32 / 2.0, ); let width: f32 = 2.0; let height = f32::clamp( right as f32 * h as f32 + left as f32 * h as f32, 2.0, h as f32, ); if is_rtl { if offset > cursor_pos[0] { snapshot.append_color( &color, &graphene::Rect::new(x, y, width, height), ); } else if offset > cursor_pos[1] { let hover_color = gdk::RGBA::new( color.red(), color.green(), color.blue(), color.alpha() * hover_opacity, ); snapshot.append_color( &hover_color, &graphene::Rect::new(x, y, width, height), ); } else { snapshot.append_color( &empty_color, &graphene::Rect::new(x, y, width, height), ); } } else { if offset < cursor_pos[0] { snapshot.append_color( &color, &graphene::Rect::new(x, y, width, height), ); } else if offset < cursor_pos[1] { let hover_color = gdk::RGBA::new( color.red(), color.green(), color.blue(), color.alpha() * hover_opacity, ); snapshot.append_color( &hover_color, &graphene::Rect::new(x, y, width, height), ); } else { snapshot.append_color( &empty_color, &graphene::Rect::new(x, y, width, height), ); } } accum.left = 0.0; accum.right = 0.0; samples_in_accum = 0; current_pixel -= bar_size as f64; if is_rtl { offset -= block_size as f64; } else { offset += block_size as f64; } } } } else { let mut offset = space_size; while offset < w - space_size { let x = offset as f32; let y = center_y as f32 - 1.0; let width = bar_size as f32; let height: f32 = 2.0; snapshot.append_color(&color, &graphene::Rect::new(x, y, width, height)); offset += block_size; } } } } } glib::wrapper! { pub struct WaveformView(ObjectSubclass) @extends gtk::Widget, @implements gtk::Accessible; } fn ease_out_cubic(t: f64) -> f64 { let p = t - 1.0; p * p * p + 1.0 } impl Default for WaveformView { fn default() -> Self { glib::Object::new() } } const ANIMATION_USECS: f64 = 250_000.0; impl WaveformView { pub fn new() -> Self { Self::default() } fn setup_gesture(&self) { let drag_gesture = gtk::GestureDrag::new(); drag_gesture.set_name(Some("waveform-drag")); drag_gesture.set_button(0); drag_gesture.connect_drag_begin( clone!(@strong self as this => move |gesture, start_x, _| { if !this.has_focus() { this.grab_focus(); } gesture.set_state(gtk::EventSequenceState::Claimed); this.seek_to_coord(start_x); }), ); drag_gesture.connect_drag_update( clone!(@strong self as this => move |gesture, offset_x, _| { if !this.has_focus() { this.grab_focus(); } gesture.set_state(gtk::EventSequenceState::Claimed); this.seek_to_coord(gesture.start_point().unwrap().0 + offset_x); }), ); self.add_controller(drag_gesture); let motion_gesture = gtk::EventControllerMotion::new(); motion_gesture.set_name(Some("waveform-motion")); motion_gesture.connect_motion(clone!(@strong self as this => move |_, x, _| { let width = this.width() as f64; let position = x as f64 / width; this.imp().hover_position.replace(Some(position)); this.queue_draw(); })); motion_gesture.connect_leave(clone!(@strong self as this => move |_| { this.imp().hover_position.replace(None); this.queue_draw(); })); self.add_controller(motion_gesture); let key_controller = gtk::EventControllerKey::new(); key_controller.set_name(Some("waveform-key")); key_controller.connect_key_released( clone!(@strong self as this => move |_, keyval, _, _| { let delta = match keyval { gdk::Key::Left => -0.05, gdk::Key::Right => 0.05, _ => return, }; let position = this.imp().position.get() + delta; this.emit_by_name::<()>("position-changed", &[&position]); }), ); self.add_controller(key_controller); } fn seek_to_coord(&self, pos: f64) { let width = self.width(); let position = match self.direction() { gtk::TextDirection::Rtl => 1.0 - (pos as f64 / width as f64), _ => pos as f64 / width as f64, }; debug!( "Seeking to coord {} (width: {}, position: {})", pos, width, position ); self.emit_by_name::<()>("position-changed", &[&position]); } fn normalize_peaks(&self, peaks: Vec<(f64, f64)>) -> Vec { let right_channel: Vec = peaks.iter().map(|p| p.0).collect(); let left_channel: Vec = peaks.iter().map(|p| p.1).collect(); let max_left: f64 = left_channel .iter() .copied() .fold(f64::NEG_INFINITY, f64::max); let max_right: f64 = right_channel .iter() .copied() .fold(f64::NEG_INFINITY, f64::max); let normalized: Vec = peaks .iter() .map(|p| PeakPair::new(p.0 / max_left, p.1 / max_right)) .collect(); debug!("Peaks: {}", normalized.len()); normalized } pub fn set_peaks(&self, peaks: Option>) { if let Some(tick_id) = self.imp().tick_id.replace(None) { tick_id.remove(); } let peak_pairs = match peaks { Some(p) => Some(self.normalize_peaks(p)), None => None, }; let enable_animations = self.settings().is_gtk_enable_animations(); if !enable_animations { self.imp().peaks.replace(peak_pairs); self.queue_resize(); return; } self.imp().next_peaks.replace(peak_pairs); self.imp().factor.set(None); self.imp().first_frame_time.set(None); let tick_id = self.add_tick_callback(clone!(@strong self as this => move |_, clock| { let frame_time = clock.frame_time(); if let Some(first_frame_time) = this.imp().first_frame_time.get() { if frame_time < first_frame_time { warn!("Frame clock going backwards"); return glib::Continue(true); } let has_peaks = match *this.imp().peaks.borrow() { Some(_) => true, None => false, }; let has_next_peaks = match *this.imp().next_peaks.borrow() { Some(_) => true, None => false, }; if has_peaks && has_next_peaks { // Animate the existing peaks to zero let progress = 1.0 - ((frame_time - first_frame_time) as f64 / ANIMATION_USECS); let delta = ease_out_cubic(progress); if delta < 0.0 { this.imp().peaks.replace(None); this.imp().factor.replace(None); } else { this.imp().factor.replace(Some(delta)); this.queue_draw(); } } else if has_peaks && !has_next_peaks { // Animate the peaks from zero let progress = (frame_time - first_frame_time) as f64 / ANIMATION_USECS; let delta = ease_out_cubic(progress); if delta > 1.0 { // Animation complete this.imp().factor.replace(None); this.imp().first_frame_time.replace(None); this.imp().tick_id.replace(None); this.queue_resize(); return glib::Continue(false); } else { this.imp().factor.replace(Some(delta)); this.queue_draw(); } } else if !has_peaks && has_next_peaks { // Swap peaks let next_peaks = this.imp().next_peaks.take(); this.imp().peaks.replace(next_peaks); this.imp().factor.replace(None); this.imp().first_frame_time.replace(None); this.queue_resize(); } else { // No peaks this.imp().factor.replace(None); this.imp().tick_id.replace(None); this.queue_resize(); return glib::Continue(false); } } else { this.imp().first_frame_time.replace(Some(frame_time)); } glib::Continue(true) })); self.imp().tick_id.replace(Some(tick_id)); self.queue_resize(); } pub fn set_position(&self, position: f64) { let pos = position.clamp(0.0, 1.0); self.imp().position.replace(pos); self.update_property(&[gtk::accessible::Property::ValueNow(pos)]); self.queue_draw(); } } amberol-0.10.3/src/window.rs000066400000000000000000001546751443320625200157030ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2022 Emmanuele Bassi // SPDX-License-Identifier: GPL-3.0-or-later use std::{ cell::{Cell, RefCell}, rc::Rc, time::Instant, }; use adw::subclass::prelude::*; use glib::{clone, closure_local, FromVariant}; use gtk::{gdk, gio, glib, prelude::*, CompositeTemplate}; use log::debug; use crate::{ audio::{AudioPlayer, RepeatMode, ReplayGainMode, Song}, config::APPLICATION_ID, drag_overlay::DragOverlay, i18n::{i18n, i18n_k, ni18n_f, ni18n_k}, playback_control::PlaybackControl, playlist_view::PlaylistView, queue_row::QueueRow, search::FuzzyFilter, song_cover::SongCover, song_details::SongDetails, sort::FuzzySorter, utils, volume_control::VolumeControl, waveform_view::WaveformView, }; pub enum WindowMode { InitialView, MainView, } mod imp { use glib::{ParamSpec, ParamSpecBoolean, ParamSpecEnum, Value}; use once_cell::sync::Lazy; use super::*; #[derive(CompositeTemplate)] #[template(resource = "/io/bassi/Amberol/window.ui")] pub struct Window { // Template widgets #[template_child] pub drag_overlay: TemplateChild, #[template_child] pub toast_overlay: TemplateChild, #[template_child] pub main_stack: TemplateChild, #[template_child] pub status_page: TemplateChild, #[template_child] pub song_cover: TemplateChild, #[template_child] pub song_details: TemplateChild, #[template_child] pub waveform_view: TemplateChild, #[template_child] pub elapsed_label: TemplateChild, #[template_child] pub remaining_label: TemplateChild, #[template_child] pub playback_control: TemplateChild, #[template_child] pub queue_revealer: TemplateChild, #[template_child] pub playlist_view: TemplateChild, #[template_child] pub add_folder_button: TemplateChild, #[template_child] pub restore_playlist_button: TemplateChild, pub provider: gtk::CssProvider, pub settings: gio::Settings, pub playlist_shuffled: Cell, pub playlist_visible: Cell, pub playlist_selection: Cell, pub playlist_search: Cell, pub replaygain_mode: Cell, pub playlist_filtermodel: RefCell>, pub notify_playing_id: RefCell>, pub notify_position_id: RefCell>, pub notify_song_id: RefCell>, pub notify_cover_id: RefCell>, pub notify_nsongs_id: RefCell>, pub notify_current_id: RefCell>, pub notify_peaks_id: RefCell>, } #[glib::object_subclass] impl ObjectSubclass for Window { const NAME: &'static str = "AmberolWindow"; type Type = super::Window; type ParentType = adw::ApplicationWindow; fn class_init(klass: &mut Self::Class) { Self::bind_template(klass); klass.install_action("win.play", None, move |win, _, _| { debug!("Window::win.play()"); win.player().map(|p| p.toggle_play()); }); klass.install_action("win.seek-backwards", None, move |win, _, _| { debug!("Window::win.seek-backwards"); win.player().map(|p| p.seek_backwards()); }); klass.install_action("win.seek-forward", None, move |win, _, _| { debug!("Window::win.seek-forward"); win.player().map(|p| p.seek_forward()); }); klass.install_action("win.previous", None, move |win, _, _| { debug!("Window::win.previous()"); win.player().map(|p| p.skip_previous()); }); klass.install_action("win.next", None, move |win, _, _| { debug!("Window::win.next()"); win.player().map(|p| p.skip_next()); }); klass.install_action("queue.repeat-mode", None, move |win, _, _| { debug!("Window::queue.repeat()"); win.player().map(|p| p.toggle_repeat_mode()); }); klass.install_action("queue.add-song", None, move |win, _, _| { debug!("Window::win.add-song()"); win.add_song(); }); klass.install_action("queue.add-folder", None, move |win, _, _| { debug!("Window::win.add-folder()"); win.add_folder(); }); klass.install_action("queue.restore-playlist", None, move |win, _, _| { debug!("Window::queue.restore-playlist()"); win.restore_playlist(); }); klass.install_action("win.copy", None, move |win, _, _| { debug!("Window::win.copy()"); win.copy_song(); }); klass.install_action("queue.clear", None, move |win, _, _| { debug!("Window::queue.clear()"); win.clear_queue(); }); klass.install_property_action("queue.toggle", "playlist-visible"); klass.install_property_action("queue.shuffle", "playlist-shuffled"); klass.install_property_action("queue.select", "playlist-selection"); klass.install_property_action("queue.search", "playlist-search"); klass.install_property_action("win.replaygain", "replaygain-mode"); klass.install_action("win.skip-to", Some("u"), move |win, _, param| { if let Some(pos) = param.and_then(u32::from_variant) { if let Some(player) = win.player() { player.skip_to(pos); player.play(); } } }); } fn instance_init(obj: &glib::subclass::InitializingObject) { obj.init_template(); } fn new() -> Self { Self { song_details: TemplateChild::default(), song_cover: TemplateChild::default(), queue_revealer: TemplateChild::default(), toast_overlay: TemplateChild::default(), drag_overlay: TemplateChild::default(), playback_control: TemplateChild::default(), waveform_view: TemplateChild::default(), elapsed_label: TemplateChild::default(), remaining_label: TemplateChild::default(), main_stack: TemplateChild::default(), status_page: TemplateChild::default(), add_folder_button: TemplateChild::default(), restore_playlist_button: TemplateChild::default(), playlist_view: TemplateChild::default(), playlist_shuffled: Cell::new(false), playlist_visible: Cell::new(true), playlist_selection: Cell::new(false), playlist_search: Cell::new(false), playlist_filtermodel: RefCell::default(), replaygain_mode: Cell::new(ReplayGainMode::default()), provider: gtk::CssProvider::new(), settings: utils::settings_manager(), notify_playing_id: RefCell::new(None), notify_position_id: RefCell::new(None), notify_song_id: RefCell::new(None), notify_cover_id: RefCell::new(None), notify_nsongs_id: RefCell::new(None), notify_current_id: RefCell::new(None), notify_peaks_id: RefCell::new(None), } } } impl ObjectImpl for Window { fn constructed(&self) { self.parent_constructed(); if APPLICATION_ID.ends_with("Devel") { self.obj().add_css_class("devel"); } } fn properties() -> &'static [ParamSpec] { static PROPERTIES: Lazy> = Lazy::new(|| { vec![ ParamSpecBoolean::builder("playlist-shuffled").build(), ParamSpecBoolean::builder("playlist-visible").build(), ParamSpecBoolean::builder("playlist-selection").build(), ParamSpecBoolean::builder("playlist-search").build(), ParamSpecEnum::builder::("replaygain-mode").build(), ] }); PROPERTIES.as_ref() } fn set_property(&self, _id: usize, value: &Value, pspec: &ParamSpec) { let obj = self.obj(); match pspec.name() { "playlist-shuffled" => obj.set_playlist_shuffled(value.get::().unwrap()), "playlist-visible" => obj.set_playlist_visible(value.get::().unwrap()), "playlist-selection" => obj.set_playlist_selection(value.get::().unwrap()), "playlist-search" => obj.set_playlist_search(value.get::().unwrap()), "replaygain-mode" => obj.set_replaygain(value.get::().unwrap()), _ => unimplemented!(), } } fn property(&self, _id: usize, pspec: &ParamSpec) -> Value { let obj = self.obj(); match pspec.name() { "playlist-shuffled" => obj.playlist_shuffled().to_value(), "playlist-visible" => obj.playlist_visible().to_value(), "playlist-selection" => obj.playlist_selection().to_value(), "playlist-search" => obj.playlist_search().to_value(), "replaygain-mode" => obj.replaygain().to_value(), _ => unimplemented!(), } } } impl WidgetImpl for Window {} impl WindowImpl for Window {} impl ApplicationWindowImpl for Window {} impl AdwApplicationWindowImpl for Window {} } glib::wrapper! { pub struct Window(ObjectSubclass) @extends gtk::Widget, gtk::Window, gtk::ApplicationWindow, adw::ApplicationWindow, @implements gio::ActionGroup, gio::ActionMap; } impl Window { pub fn new>(application: &P) -> Self { let win = glib::Object::builder::() .property("application", application) .build(); win.setup_waveform(); win.setup_actions(); win.setup_playlist(); win.setup_drop_target(); win.setup_provider(); win.bind_state(); win.bind_queue(); win.connect_signals(); win.restore_window_state(); win.set_initial_state(); win } fn player(&self) -> Option> { if let Some(app) = self.application() { let player = app .downcast::() .unwrap() .player(); return Some(player); } None } fn setup_actions(&self) { let enable_recoloring = self.imp().settings.boolean("enable-recoloring"); self.add_action_entries([gio::ActionEntry::builder("enable-recoloring") .state(enable_recoloring.to_variant()) .activate(|this: &Window, action, _| { let state = action.state().unwrap(); let action_state: bool = state.get().unwrap(); let enable_recoloring = !action_state; action.set_state(enable_recoloring.to_variant()); this.imp() .settings .set_boolean("enable-recoloring", enable_recoloring) .expect("Unable to store setting"); }) .build()]) } fn setup_waveform(&self) { if let Some(player) = self.player() { let peaks = player.waveform_generator().peaks(); self.imp().waveform_view.set_peaks(peaks); let notify_peaks_id = player.waveform_generator().connect_notify_local( Some("has-peaks"), clone!(@weak self as win => move |gen, _| { let peaks = gen.peaks(); win.imp().waveform_view.set_peaks(peaks); }), ); self.imp().notify_peaks_id.replace(Some(notify_peaks_id)); } } fn unbind_waveform(&self) { if let Some(player) = self.player() { if let Some(id) = self.imp().notify_peaks_id.take() { player.waveform_generator().disconnect(id); } } } fn restore_window_state(&self) { let settings = utils::settings_manager(); let width = settings.int("window-width"); let height = settings.int("window-height"); self.set_default_size(width, height); } fn reset_queue(&self) { self.set_playlist_visible(false); self.set_playlist_shuffled(false); self.set_playlist_selection(false); self.update_style(None); } fn clear_queue(&self) { self.player().map(|p| p.clear_queue()); } fn playlist_visible(&self) -> bool { self.imp().playlist_visible.get() } fn set_playlist_visible(&self, visible: bool) { if visible != self.imp().playlist_visible.replace(visible) { self.imp().queue_revealer.set_reveal_flap(visible); self.notify("playlist-visible"); } } fn playlist_shuffled(&self) -> bool { self.imp().playlist_shuffled.get() } fn set_playlist_shuffled(&self, shuffled: bool) { let imp = self.imp(); if shuffled != imp.playlist_shuffled.replace(shuffled) { if let Some(player) = self.player() { let queue = player.queue(); let state = player.state(); let reset_song = queue.is_first_song() && !state.playing(); queue.set_shuffled(shuffled); if reset_song { player.skip_to(0); } } self.notify("playlist-shuffled"); } } fn playlist_selection(&self) -> bool { self.imp().playlist_selection.get() } fn set_playlist_selection(&self, selection: bool) { let imp = self.imp(); if selection != imp.playlist_selection.replace(selection) { if !selection { if let Some(player) = self.player() { let queue = player.queue(); queue.unselect_all_songs(); } } self.imp() .playlist_view .queue_actionbar() .set_revealed(selection); self.notify("playlist-selection"); } } fn playlist_search(&self) -> bool { self.imp().playlist_search.get() } fn set_playlist_search(&self, search: bool) { let imp = self.imp(); if search != imp.playlist_search.replace(search) { imp.playlist_view.set_search(search); self.notify("playlist-search"); } } fn add_song(&self) { let ctx = glib::MainContext::default(); ctx.spawn_local(clone!(@weak self as win => async move { let filters = gio::ListStore::new(gtk::FileFilter::static_type()); let filter = gtk::FileFilter::new(); gtk::FileFilter::set_name(&filter, Some(&i18n("Audio files"))); filter.add_mime_type("audio/*"); filters.append(&filter); let dialog = gtk::FileDialog::builder() .accept_label(&i18n("_Add Song")) .filters(&filters) .modal(true) .title(&i18n("Open File")) .build(); if let Ok(files) = dialog.open_multiple_future(Some(&win)).await { if files.n_items() == 0 { win.add_toast(i18n("Unable to access files")); } else { win.add_files_to_queue(&files); } } })); } fn add_folder(&self) { let ctx = glib::MainContext::default(); ctx.spawn_local(clone!(@weak self as win => async move { let dialog = gtk::FileDialog::builder() .accept_label(&i18n("_Add Folder")) .modal(true) .title(&i18n("Open Folder")) .build(); if let Ok(res) = dialog.select_multiple_folders_future(Some(&win)).await { if let Some(files) = res { if files.n_items() == 0 { win.add_toast(i18n("Unable to access files")); } else { win.add_files_to_queue(&files); } } } })); } fn restore_playlist(&self) { if let Some(songs) = utils::load_cached_songs() { self.queue_songs(songs); } } fn queue_songs(&self, queue: Vec) { if queue.is_empty() { self.add_toast(i18n("No available song found")); return; } self.switch_mode(WindowMode::MainView); // Disable actions on the queue; loading is "atomic" self.action_set_enabled("queue.add-song", false); self.action_set_enabled("queue.add-folder", false); self.action_set_enabled("queue.clear", false); self.set_playlist_visible(true); self.imp().playlist_view.begin_loading(); // Begin the trace let now = Instant::now(); // Turn the list of files into songs one at a time into the main loop let n_files = queue.len() as u32; let mut files = queue.into_iter(); let mut songs = Vec::new(); let mut cur_file: u32 = 0; let mut duplicates: u32 = 0; glib::idle_add_local( clone!(@weak self as win => @default-return glib::Continue(false), move || { files.next() .map(|f| { win.imp().playlist_view.update_loading(cur_file, n_files); match Song::from_uri(f.uri().as_str()) { Ok(s) => { if let Some(player) = win.player() { let queue = player.queue(); if queue.contains(&s) { duplicates += 1; } else { songs.push(s); cur_file += 1; } } } Err(_) => () } }) .map(|_| glib::Continue(true)) .unwrap_or_else(|| { debug!("Total loading time for {} files: {} ms", n_files, now.elapsed().as_millis()); // Re-enable the actions win.action_set_enabled("queue.add-song", true); win.action_set_enabled("queue.add-folder", true); win.action_set_enabled("queue.clear", true); if songs.is_empty() { if duplicates == 0 { win.add_toast(i18n("No songs found")); } } else { if let Some(player) = win.player() { let queue = player.queue(); let was_empty = queue.is_empty(); win.imp().playlist_view.end_loading(); // Bulk add to avoid hammering the UI with list model updates queue.add_songs(&songs); // Store the current state of the playlist utils::store_playlist(&queue); debug!("Queue was empty: {}, new size: {}", was_empty, queue.n_songs()); if was_empty { player.skip_to(0); } // Allow jumping to the song we just added if songs.len() == 1 { // If we added a single song, and the queue was empty, we // dispense with the pleasantries and we start playing // immediately; otherwise, we let the user choose whether // to jump to the newly added song if was_empty { player.play(); } else { win.add_skip_to_toast( i18n("Added a new song"), i18n("Play"), queue.n_songs() - 1, ); } } else { let msg = ni18n_f( // Translators: the `{}` must be left unmodified; // it will be expanded to the number of songs added // to the playlist "Added one song", "Added {} songs", songs.len() as u32, &[&songs.len().to_string()], ); win.add_toast(msg); } } } glib::Continue(false) }) }), ); } fn add_files_to_queue(&self, model: &gio::ListModel) { let mut queue: Vec = vec![]; for pos in 0..model.n_items() { let file = model.item(pos).unwrap().downcast::().unwrap(); if let Ok(info) = file.query_info( "standard::name,standard::display-name,standard::type,standard::content-type", gio::FileQueryInfoFlags::NOFOLLOW_SYMLINKS, gio::Cancellable::NONE, ) { match info.file_type() { gio::FileType::Regular => { if let Some(content_type) = info.content_type() { if gio::content_type_is_mime_type(&content_type, "audio/*") { debug!("Adding file '{}' to the queue", file.uri()); queue.push(file); } } } gio::FileType::Directory => { debug!("Adding folder '{}' to the queue", file.uri()); let files = utils::load_files_from_folder(&file, true); queue.extend(files); } _ => (), } } } self.queue_songs(queue); } // Bind the PlayerState to the UI fn bind_state(&self) { let imp = self.imp(); if let Some(player) = self.player() { let state = player.state(); // Use the PlayerState:playing property to control the play/pause button self.update_play_button(); let notify_playing_id = state.connect_notify_local( Some("playing"), clone!(@weak self as win => move |_, _| { win.set_playlist_selection(false); win.update_play_button(); }), ); imp.notify_playing_id.replace(Some(notify_playing_id)); // Update the position labels self.update_position_labels(); let notify_position_id = state.connect_notify_local( Some("position"), clone!(@weak self as win => move |_, _| { win.update_position_labels(); }), ); imp.notify_position_id.replace(Some(notify_position_id)); // Update the UI self.update_song(); let notify_song_id = state.connect_notify_local( Some("song"), clone!(@weak self as win => move |_, _| { win.update_song(); }), ); imp.notify_song_id.replace(Some(notify_song_id)); // Update the cover, if any is available self.update_cover(); let notify_cover_id = state.connect_notify_local( Some("cover"), clone!(@weak self as win => move |_, _| { win.update_cover(); }), ); imp.notify_cover_id.replace(Some(notify_cover_id)); // Bind the song properties to the UI state .bind_property("title", &imp.song_details.get().title_label(), "label") .flags(glib::BindingFlags::DEFAULT | glib::BindingFlags::SYNC_CREATE) .build(); state .bind_property("artist", &imp.song_details.get().artist_label(), "label") .flags(glib::BindingFlags::DEFAULT | glib::BindingFlags::SYNC_CREATE) .build(); state .bind_property("album", &imp.song_details.get().album_label(), "label") .flags(glib::BindingFlags::DEFAULT | glib::BindingFlags::SYNC_CREATE) .build(); state .bind_property( "volume", &imp.playback_control.get().volume_control(), "volume", ) .flags(glib::BindingFlags::DEFAULT | glib::BindingFlags::SYNC_CREATE) .build(); } } fn unbind_state(&self) { if let Some(player) = self.player() { let state = player.state(); if let Some(id) = self.imp().notify_playing_id.take() { state.disconnect(id); } if let Some(id) = self.imp().notify_position_id.take() { state.disconnect(id); } if let Some(id) = self.imp().notify_song_id.take() { state.disconnect(id); } if let Some(id) = self.imp().notify_cover_id.take() { state.disconnect(id); } } } // Bind the Queue to the UI fn bind_queue(&self) { if let Some(player) = self.player() { let queue = player.queue(); let notify_nsongs_id = queue.connect_notify_local( Some("n-songs"), clone!(@weak self as win => move |queue, _| { debug!("queue.n_songs() = {}", queue.n_songs()); if queue.is_empty() { win.set_initial_state(); win.reset_queue(); } else { win.action_set_enabled("queue.toggle", true); win.action_set_enabled("queue.shuffle", queue.n_songs() > 1); win.action_set_enabled("win.play", true); win.action_set_enabled("win.previous", true); win.action_set_enabled("win.next", queue.n_songs() > 1); } if queue.n_songs() == 1 { win.player().map(|p| p.skip_next()); } win.update_playlist_time(); }), ); self.imp().notify_nsongs_id.replace(Some(notify_nsongs_id)); queue.connect_notify_local( Some("repeat-mode"), clone!(@weak self as win => move |queue, _| { win.imp().playback_control.set_repeat_mode(queue.repeat_mode()); }), ); let notify_current_id = queue.connect_notify_local( Some("current"), clone!(@weak self as win => move |queue, _| { if queue.is_last_song() { match queue.repeat_mode() { RepeatMode::Consecutive => { win.action_set_enabled("win.next", false); }, _ => { win.action_set_enabled("win.next", true); } } } else { win.action_set_enabled("win.next", true); } }), ); self.imp() .notify_current_id .replace(Some(notify_current_id)); } } fn unbind_queue(&self) { if let Some(player) = self.player() { let queue = player.queue(); if let Some(id) = self.imp().notify_nsongs_id.take() { queue.disconnect(id); } if let Some(id) = self.imp().notify_current_id.take() { queue.disconnect(id); } } } fn connect_signals(&self) { self.imp().queue_revealer.connect_notify_local( Some("folded"), clone!(@weak self as win => move |flap, _| { win.set_playlist_visible(flap.reveals_flap()); if flap.is_folded() { win.imp().playlist_view.back_button().set_visible(win.playlist_visible()); } else { win.imp().playlist_view.back_button().set_visible(false); } }), ); self.imp().queue_revealer.connect_notify_local( Some("reveal-flap"), clone!(@weak self as win => move |flap, _| { win.set_playlist_visible(flap.reveals_flap()); if flap.is_folded() { win.imp().playlist_view.back_button().set_visible(win.playlist_visible()); } else { win.imp().playlist_view.back_button().set_visible(false); } }), ); self.imp().waveform_view.connect_closure( "position-changed", false, closure_local!(@watch self as win => move |_wv: WaveformView, position: f64| { debug!("New position: {}", position); if let Some(player) = win.player() { let state = player.state(); if state.current_song().is_some() { player.seek_position_rel(position); player.play(); } } }), ); self.imp() .playback_control .volume_control() .connect_closure( "volume-changed", false, closure_local!(@watch self as win => move |_vc: VolumeControl, volume: f64| { debug!("Volume changed: {}", volume); win.player().map(|p| p.set_volume(volume)); }), ); self.imp() .playlist_view .queue_select_all_button() .connect_clicked(clone!(@weak self as win => move |_| { if win.playlist_search() { if let Some(ref model) = *win.imp().playlist_filtermodel.borrow() { for idx in 0..model.n_items() { let item = model.item(idx).unwrap(); let song = item.downcast_ref::().unwrap(); song.set_selected(true); } } } else { if let Some(player) = win.player() { let queue = player.queue(); for idx in 0..queue.n_songs() { let song = queue.song_at(idx).unwrap(); song.set_selected(true); } } } })); self.imp() .playlist_view .queue_remove_button() .connect_clicked(clone!(@weak self as win => move |_| { if let Some(player) = win.player() { let queue = player.queue(); let mut remove_songs: Vec = Vec::new(); // Collect all songs to be removed first, since we can't // remove objects from the model while we're iterating it for idx in 0..queue.n_songs() { let song = queue.song_at(idx).unwrap(); if song.selected() { remove_songs.push(song); } } for song in remove_songs { win.remove_song(&song); } // Store the current state of the playlist utils::store_playlist(&queue); } })); self.imp() .playlist_view .playlist_searchbar() .connect_notify_local( Some("search-mode-enabled"), clone!(@weak self as win => move |searchbar, _| { win.set_playlist_search(searchbar.is_search_mode()); }), ); self.imp().settings.connect_changed( Some("enable-recoloring"), clone!(@weak self as this => move |settings, _| { debug!("GSettings:enable-recoloring: {}", settings.boolean("enable-recoloring")); if let Some(player) = this.player() { let state = player.state(); this.update_style(state.current_song().as_ref()); } }), ); let _dummy = self.imp().settings.boolean("enable-recoloring"); self.connect_close_request(move |window| { debug!("Saving window state"); let width = window.default_size().0; let height = window.default_size().1; let settings = utils::settings_manager(); settings .set_int("window-width", width) .expect("Unable to store window-width"); settings .set_int("window-height", height) .expect("Unable to stop window-height"); window.unbind_queue(); window.unbind_state(); window.unbind_waveform(); glib::signal::Inhibit(false) }); self.imp() .playlist_view .playlist_searchbar() .set_key_capture_widget(Some(self.upcast_ref::())); } // The initial state of the playback actions fn set_initial_state(&self) { if let Some(player) = self.player() { let queue = player.queue(); self.action_set_enabled("win.play", !queue.is_empty()); self.action_set_enabled("win.previous", !queue.is_empty()); self.action_set_enabled("win.next", !queue.is_last_song()); self.action_set_enabled("queue.toggle", !queue.is_empty()); self.action_set_enabled("queue.shuffle", queue.n_songs() > 1); self.action_set_enabled("win.replaygain", player.replaygain_available()); let replaygain = self.imp().settings.enum_("replay-gain").into(); self.set_replaygain(replaygain); // Manually set player state, because set_replaygain // only updates player state when the value changes. player.set_replaygain(replaygain); self.imp() .playback_control .set_repeat_mode(queue.repeat_mode()); self.set_playlist_shuffled(queue.is_shuffled()); // Manually update the icon on the initial empty state // to avoid generating the UI definition file at build // time self.imp().status_page.set_icon_name(Some(APPLICATION_ID)); if utils::has_cached_playlist() { self.imp().restore_playlist_button.set_visible(true); self.imp() .restore_playlist_button .add_css_class("suggested-action"); self.imp() .add_folder_button .remove_css_class("suggested-action"); } else { self.imp().restore_playlist_button.set_visible(false); self.imp() .restore_playlist_button .remove_css_class("suggested-action"); self.imp() .add_folder_button .add_css_class("suggested-action"); } let state = player.state(); if state.playing() || !queue.is_empty() { self.switch_mode(WindowMode::MainView); } else { self.switch_mode(WindowMode::InitialView); } } } fn setup_playlist(&self) { let imp = self.imp(); let factory = gtk::SignalListItemFactory::new(); factory.connect_setup(clone!(@weak self as win => move |_, item| { let row = QueueRow::default(); let list_item = item.downcast_ref::().unwrap(); list_item.set_child(Some(&row)); row.connect_notify_local( Some("selected"), clone!(@weak win => move |_, _| { win.update_selected_count(); }), ); win .bind_property("playlist-selection", &row, "selection-mode") .flags(glib::BindingFlags::DEFAULT | glib::BindingFlags::SYNC_CREATE) .build(); list_item .bind_property("item", &row, "song") .flags(glib::BindingFlags::DEFAULT | glib::BindingFlags::SYNC_CREATE) .build(); list_item .property_expression("item") .chain_property::("artist") .bind(&row, "song-artist", gtk::Widget::NONE); list_item .property_expression("item") .chain_property::("title") .bind(&row, "song-title", gtk::Widget::NONE); list_item .property_expression("item") .chain_property::("cover") .bind(&row, "song-cover", gtk::Widget::NONE); list_item .property_expression("item") .chain_property::("playing") .bind(&row, "playing", gtk::Widget::NONE); list_item .property_expression("item") .chain_property::("selected") .bind(&row, "selected", gtk::Widget::NONE); })); imp.playlist_view .queue_view() .set_factory(Some(&factory.upcast::())); if let Some(player) = self.player() { let queue = player.queue(); let filter = FuzzyFilter::new(); let filter_model = gtk::FilterListModel::new(Some(queue.model().clone()), Some(filter.clone())); let sorter = FuzzySorter::new(); let sorter_model = gtk::SortListModel::new(Some(filter_model), Some(sorter.clone())); let selection = gtk::NoSelection::new(Some(sorter_model.clone())); imp.playlist_view .queue_view() .set_model(Some(selection.upcast_ref::())); imp.playlist_view.queue_view().connect_activate( clone!(@weak self as win, @weak selection => move |_, pos| { let song = selection .upcast::() .item(pos) .unwrap() .downcast::() .unwrap(); if let Some(player) = win.player() { let queue = player.queue(); let mut real_pos = None; for i in 0..queue.model().n_items() { if let Some(item) = queue.model().item(i) { let s = item.downcast::().unwrap(); if s.equals(&song) { real_pos = Some(i); break; } } } if let Some(real_pos) = real_pos { if win.playlist_selection() { queue.select_song_at(real_pos); } else if queue.current_song_index() != Some(real_pos) { player.skip_to(real_pos); player.play(); } else if !player.state().playing() { player.play(); } } } }), ); imp.playlist_filtermodel .replace(Some(sorter_model.upcast::())); imp.playlist_view .playlist_searchentry() .bind_property("text", &filter, "search") .flags(glib::BindingFlags::SYNC_CREATE) .build(); imp.playlist_view .playlist_searchentry() .bind_property("text", &sorter, "search") .flags(glib::BindingFlags::SYNC_CREATE) .build(); imp.playlist_view .playlist_searchentry() .connect_search_changed(clone!(@weak self as win => move |_| { if let Some(adjustment) = win.imp().playlist_view.queue_view().vadjustment() { adjustment.set_value(0.0); } })); } } fn setup_drop_target(&self) { let drop_target = gtk::DropTarget::builder() .name("file-drop-target") .actions(gdk::DragAction::COPY) .formats(&gdk::ContentFormats::for_type(gdk::FileList::static_type())) .build(); drop_target.connect_drop( clone!(@weak self as win => @default-return false, move |_, value, _, _| { if let Ok(file_list) = value.get::() { if file_list.files().is_empty() { win.add_toast(i18n("Unable to access dropped files")); return false; } let model = gio::ListStore::new(gio::File::static_type()); for f in file_list.files() { model.append(&f); } win.add_files_to_queue(model.upcast_ref::()); return true; } false }), ); self.imp().drag_overlay.set_drop_target(&drop_target); } fn update_play_button(&self) { if let Some(player) = self.player() { let state = player.state(); let play_button = self.imp().playback_control.play_button(); if state.playing() { play_button.set_icon_name("media-playback-pause-symbolic"); } else { play_button.set_icon_name("media-playback-start-symbolic"); } } } fn update_position_labels(&self) { if let Some(player) = self.player() { let state = player.state(); if state.current_song().is_some() { let elapsed = state.position(); let duration = state.duration(); let remaining = duration.checked_sub(elapsed).unwrap_or_default(); self.set_song_time(Some(elapsed), Some(remaining)); let position = state.position() as f64 / state.duration() as f64; self.set_song_position(position); } else { self.set_song_time(None, None); self.set_song_position(0.0); } } } fn update_song(&self) { if let Some(player) = self.player() { let state = player.state(); self.scroll_playlist_to_song(); self.update_playlist_time(); self.update_title(state.current_song().as_ref()); self.update_style(state.current_song().as_ref()); } } fn update_cover(&self) { if let Some(player) = self.player() { let state = player.state(); let song_cover = self.imp().song_cover.get(); if let Some(cover) = state.cover() { song_cover.album_image().set_cover(Some(&cover)); song_cover.show_cover_image(true); } else { song_cover.album_image().set_cover(None); song_cover.show_cover_image(false); } } } fn update_playlist_time(&self) { if let Some(player) = self.player() { let queue = player.queue(); let n_songs = queue.n_songs(); if let Some(current) = queue.current_song_index() { let mut remaining_time = 0; for pos in 0..n_songs { let song = queue.song_at(pos).unwrap(); if pos >= current { remaining_time += song.duration(); } } let remaining_min = ((remaining_time - (remaining_time % 60)) / 60) as u32; let remaining_hrs = ((remaining_min - (remaining_min % 60)) / 60) as u32; let remaining_str = if remaining_hrs > 0 { // Translators: the `{}` must be left unmodified, and // it will be replaced by the number of minutes remaining // in the string "N hours M minutes remaining" let minutes = ni18n_f( "{} minute", "{} minutes", remaining_min % 60, &[&(remaining_min % 60).to_string()], ); // Translators: `{hours}` and `{minutes}` must be left // unmodified, and they will be replaced by number of // hours and by the translated number of minutes // remaining, respectively ni18n_k( "{hours} hour {minutes} remaining", "{hours} hours {minutes} remaining", remaining_hrs, &[("hours", &remaining_hrs.to_string()), ("minutes", &minutes)], ) } else { ni18n_f( // Translators: the '{}' must be left unmodified, and // it will be replaced by the number of minutes remaining // in the playlist "{} minute remaining", "{} minutes remaining", remaining_min, &[&remaining_min.to_string()], ) }; self.imp() .playlist_view .queue_length_label() .set_label(&remaining_str); self.imp() .playlist_view .queue_length_label() .set_visible(true); } else { self.imp() .playlist_view .queue_length_label() .set_visible(false); } } } fn scroll_playlist_to_song(&self) { let queue_view = self.imp().playlist_view.queue_view(); if let Some(player) = self.player() { if let Some(current_idx) = player.queue().current_song_index() { debug!("Scrolling playlist to {}", current_idx); queue_view .upcast_ref::() .activate_action("list.scroll-to-item", Some(¤t_idx.to_variant())) .expect("Failed to activate action"); } } } fn setup_provider(&self) { let imp = self.imp(); if let Some(display) = gdk::Display::default() { gtk::style_context_add_provider_for_display(&display, &imp.provider, 400); } } fn update_style(&self, song: Option<&Song>) { let imp = self.imp(); if !imp.settings.boolean("enable-recoloring") { imp.provider.load_from_data(""); imp.main_stack.remove_css_class("main-window"); return; } if let Some(song) = song { if let Some(bg_colors) = song.cover_palette() { let mut css = String::new(); let n_colors = bg_colors.len(); for (i, color) in bg_colors.iter().enumerate().take(n_colors) { let s = format!("@define-color background_color_{} {};", i, color); css.push_str(&s); } for i in n_colors - 1..5 { css.push_str(&format!( "@define-color background_color_{} @window_bg_color;", i )); } imp.provider.load_from_data(&css); if !imp.main_stack.has_css_class("main-window") { imp.main_stack.add_css_class("main-window"); } self.action_set_enabled("win.enable-recoloring", true); return; } } imp.provider.load_from_data(""); imp.main_stack.remove_css_class("main-window"); self.action_set_enabled("win.enable-recoloring", false); } fn update_title(&self, song: Option<&Song>) { if let Some(song) = song { self.set_title(Some(&format!("{} - {}", song.artist(), song.title()))); } else { self.set_title(Some("Amberol")); } } fn update_selected_count(&self) { if let Some(player) = self.player() { let queue = player.queue(); let n_selected = queue.n_selected_songs(); let selected_str = if n_selected == 0 { i18n("No song selected") } else { ni18n_f( // Translators: The '{}' must be left unmodified, and // it is expanded to the number of songs selected "{} song selected", "{} songs selected", n_selected, &[&n_selected.to_string()], ) }; self.imp() .playlist_view .queue_selected_label() .set_label(&selected_str); } } pub fn open_files(&self, files: &[gio::File]) { if files.is_empty() { self.add_toast(i18n("Unable to access files")); return; } let model = gio::ListStore::new(gio::File::static_type()); for f in files { model.append(f); } self.add_files_to_queue(model.upcast_ref::()); } pub fn remove_song(&self, song: &Song) { self.player().map(|p| p.remove_song(song)); self.update_selected_count(); self.update_playlist_time(); } pub fn add_toast(&self, msg: String) { let toast = adw::Toast::new(&msg); self.imp().toast_overlay.add_toast(toast); } pub fn add_skip_to_toast(&self, msg: String, button: String, pos: u32) { let toast = adw::Toast::new(&msg); toast.set_button_label(Some(&button)); toast.set_action_name(Some("win.skip-to")); toast.set_action_target_value(Some(&pos.to_variant())); self.imp().toast_overlay.add_toast(toast); } fn copy_song(&self) { if let Some(player) = self.player() { let state = player.state(); if let Some(song) = state.current_song() { let s = i18n_k( // Translators: `{title}` and `{artist}` must be left // untranslated; they will expand to the title and // artist of the currently playing song, respectively "Currently playing “{title}” by “{artist}”", &[("title", &song.title()), ("artist", &song.artist())], ); self.clipboard().set_text(&s); } } } pub fn switch_mode(&self, mode: WindowMode) { let stack = self.imp().main_stack.get(); match mode { WindowMode::InitialView => { stack.set_visible_child_name("initial-view"); self.set_default_widget(Some(&self.imp().add_folder_button.get())); } WindowMode::MainView => { stack.set_visible_child_name("main-view"); self.set_default_widget(Some(&self.imp().playback_control.play_button())); } }; } pub fn set_replaygain(&self, replaygain: ReplayGainMode) { let imp = self.imp(); if replaygain != imp.replaygain_mode.replace(replaygain) { self.player().map(|p| p.set_replaygain(replaygain)); self.imp() .settings .set_enum("replay-gain", replaygain.into()) .expect("Unable to store setting"); self.notify("replaygain-mode"); } } pub fn replaygain(&self) -> ReplayGainMode { self.imp().replaygain_mode.get() } pub fn set_song_time(&self, elapsed: Option, remaining: Option) { if let Some(elapsed) = elapsed { self.imp() .elapsed_label .set_text(&utils::format_time(elapsed as i64)); } else { self.imp().elapsed_label.set_text("0:00"); } if let Some(remaining) = remaining { self.imp() .remaining_label .set_text(&utils::format_remaining_time(remaining as i64)); } else { self.imp().remaining_label.set_text("0:00"); } } pub fn set_song_position(&self, position: f64) { self.imp().waveform_view.set_position(position); } }