qjackctl-0.4.2/PaxHeaders.14935/AUTHORS0000644000000000000000000000013212700760152014123 xustar0030 mtime=1459871850.607902288 30 atime=1459871850.607902288 30 ctime=1459871850.607902288 qjackctl-0.4.2/AUTHORS0000644000175000001440000000004212700760152014663 0ustar00rncbcusers00000000000000Rui Nuno Capela qjackctl-0.4.2/PaxHeaders.14935/autogen.sh0000644000000000000000000000013212700760152015051 xustar0030 mtime=1459871850.608902788 30 atime=1459871850.608902788 30 ctime=1459871850.608902788 qjackctl-0.4.2/autogen.sh0000755000175000001440000000004412700760152015616 0ustar00rncbcusers00000000000000#!/bin/sh # make -f Makefile.git $* qjackctl-0.4.2/PaxHeaders.14935/ChangeLog0000644000000000000000000000013212700760152014625 xustar0030 mtime=1459871850.607902288 30 atime=1459871850.607902288 30 ctime=1459871850.607902288 qjackctl-0.4.2/ChangeLog0000644000175000001440000015502012700760152015374 0ustar00rncbcusers00000000000000QjackCtl - JACK Audio Connection Kit Qt GUI Interface ----------------------------------------------------- ChangeLog 0.4.2 2016-04-05 Spring'16 release frenzy. - Added a brand new "Enable JACK D-BUS interface" option, split from the old common "Enable D-BUS interface" setup option which now refers to its own self D-BUS interface exclusively. - Dropped old "Start minimized to system tray" option from setup. - Add double-click action (toggle start/stop) to systray (a pull request by Joel Moberg, thanks). - Added application keywords to freedesktop.org's AppData. - System-tray icon context menu has been fixed/hacked to show up again on Plasma 5 (aka. KDE5) notification status area. - Switched column entries in the unified interface device combo- box to make it work for macosx/coreaudio again. - Blind fix to a FTBFS on macosx/coreaudio platforms, a leftover from the unified interface device selection combo-box inception, almost two years ago. - Prevent x11extras module from use on non-X11/Unix plaforms. - Late French (fr) translation update (by Olivier Humbert, thanks). 0.4.1 2015-10-28 A Fall'15 release. - Probing portaudio audio device in a separate thread (by Kjetil Matheussen, thanks). - Messages standard output capture has been improved again, now in both ways a non-blocking pipe may get. - Regression fix for invalid system-tray icon dimensions reported by some desktop environment frameworks. - New hi-res application icon (by Uttrup Renzel, Max Christian Pohle, thanks). - System tray icon red background now blinks when a XRUN occurs. - Desktop environment session shutdown/logout management has been also adapted to Qt5 framework. - Single/unique application instance control adapted to Qt5/X11. - Prefer Qt5 over Qt4 by default with configure script. - Overrideable tooltips with latency info (re. Connections JACK client/ports: patch by Xavier Mendez, thanks). - Complete rewrite of Qt4 vs. Qt5 configure builds. - French (fr) translation update (by Olivier Humbert, thanks). 0.4.0 2015-07-15 Summer'15 release frenzy. - Some windows fixes added (patch by Kjetil Matheussen, thanks). - Most advanced Setup/Settings are moved into new Setup/Advanced settings tab; limit range for the real-time priority setting, now having 6 as absolute minimum valid value (after patches by Robin Gareus, thanks). - A new top-level widget window geometry state save and restore sub-routine is now in effect (EXPERIMENTAL). - Delayed geometry setup for widget windows upon startup has been deprecated and scrapped altogether. - Setup/settings dialog tab is going into some layout changes; also got rid of old patchbay auto-refresh timer cruft, which was previously hidden/disabled. - New socket names are now automatically inferred from selected client names while on the Patchbay widget, Socket dialog. - Fixed for some strict tests for Qt4 vs. Qt5 configure builds. - German (de) translation update (by Guido Scholz, thanks). 0.3.13 2015-03-25 Pre-LAC2015 release frenzy. - Added application description as freedesktop.org's AppData. - Setup dialog form is now modeless. - Introducing brand new active patchbay reset/disconnect-all user preference option. - Current highlighted client/port connections are now drawn with thicker connector lines. - New user preference option on whether to show the nagging 'program will keep running in the system tray' message, on main window close. - Connections lines now drawn with anti-aliasing; connections splitter handles width is now reduced. - Drop missing or non-existent patchbay definition files from the most recent used list. 0.3.12 2014-10-19 JACK Pretty-names aliasing. - JACK client/port pretty-name (metadata) support is being introduced and seamlessly integrated with old Connections client/port aliases editing (rename) (refactored from an original patch by Paul Davis, thanks). (EXPERIMENTAL) - Application close confirm warning is now raising the main window as visible and active for due top level display, especially applicable when minimized to the system tray. - Messages standard output capture has been slightly improved as for non-blocking i/o, whenever available. - Translations install directory change. - Allow the build system to include an user specified LDFLAGS. - Missing input/output-latency parameter settings now settled for the D-BUS controlled JACK server and firewire back-end driver. 0.3.11 2013-12-31 A fifth of a Jubilee. - More preparations for Qt5 configure build. - Interface device selection is now unified, by moving the old '>' pop-up menu into the customized combo-box drop-down list showing all available card/device names and descriptions (on a patch by Arnout Engelen, thanks). - Added include to shut up gcc 4.7 build failures (patch by Alexis Ballier, thanks). 0.3.10 2013-04-01 The singing swan rehersal. - Session infra-client management finally being added. - Preparations for Qt5 migration. - Transport tempo (BPM) precision display fixed to 4 digits. - Color-candy (dang old ANSI terminal?) escape sequences are now silently stripped from jackdbus messages captured log (onliner from original patch by Brendan Jones, thanks). - List ALSA device card id. string instead of device number, while on setup dialog. - Japanese (ja) translation added (by Takashi Sakamoto). 0.3.9 2012-05-18 The last of the remnants. - Killing D-BUS controlled JACK server is now made optional, cf. Setup/Misc/Stop JACK audio server on application exit. (a patch by Roland Mas, thanks). - Added include to shut up gcc 4.7 build failures. - Make(ing) -jN parallel builds now available for the masses. - A mis-quoting bug at the command line argument string may have been crippling the (unmaintained) Windows port since ever, leaving its main function to start jackd dead in the water, belly down :) now hopefully fixed (following a mail transaction with Stephane Letz and Mathias Nagorni, thanks). - Currently a JACK2-only feature, the JACK version string display at the About dialog box, must now be explicitly enabled on configure time (--enable-jack-version). - A new so called "Server Suffix" parameter option appears to rescue on the situations where QjackCtl falls short on extra, exquisite and/or esoteric command line options eg. (net)jack1/2 differences. - Fixed D-Bus Input/Output device parameter settings, filled when either interface is selected for Capture/Playback only. (probable fix for bug #3441860). - Fixed Makefile.in handling of installation directories to the configure script eg. --datadir, --localedir, --mandir. (after an original patch from h3xx, thanks). - Main window is now brought to front and (re)activated when clicking on the system tray icon instead of just hiding it. - Add current xrun count to the system tray icon tooltip, if not zero (after patch #3314633 by Colin Fletcher, thanks). 0.3.8 2011-07-01 JACK Session versioning. - Debugging stacktrace now applies to all working threads. - Session "Save" button now a drop-down menu, replacing the session save type combo-box/drop-down list selection. Also, an early session directory versioning/numbering scheme is now in place, although optional. - Probable fix to debian bug report #624198 - segfault when pressing the stop button (by Grant Adrian Diffey, after a patch from Adrian Knoth, thanks). - Desktop environment session shutdown (eg. logout) is now tapped for graceful application exit, even though the main window is active (visible) and minimizing to system tray is enabled. Both were causing first shutdown/logout attempt to abort. Not anymore, hopefully ;). - Make sure all activated patchbay definition files are in their complete and absolute directory path forms. - Connections refresh button now does an immediate and true reconstruction of all clients and their respective ports and connections, unconditionally. - Command line server start option (-s, --start) is now made independent from configuration setup option (cf. Setup/Misc /Start JACK audio server on application startup). - Now handling cable socket types properly to let patchbay definitions work correctly, whenever having sockets with the very same literal name (twisted from patch #3183467, by Karsten, thanks;). - Abrupt focus behavior when any of the keyboard modifiers (Shift, Ctrl, Alt, Caps Lock) is hit while on Connections client/port aliases editing (rename) has been fixed. - Russian (ru) translation updated (by Alexandre Prokoudine). - Added include "errno.h" alegedly missing for BSD style systems (applying patch for bug #3126091). 0.3.7 2010-11-30 JACK Session managerism. - Session widget has session save type preserved as well. - Connections and the new Messages/Status widgets now have their last open tab preserved across program run-cycles. - Connections and Patchbay widgets have been finally given up on an old feature request: an Expand All items button. - A significant UI layout has been made: the Messages and Status widgets were merged into one, giving space to the brand new Session wigdet to be easy accessible from the main panel control window. - libX11 is now being added explicitly to the build link phase, as seen necessary on some bleeding-edge distros eg. Fedora 13, Debian 6. (closing bug #3050915). - Input/Output latency options were missing but now finally enabled for the firewire back-end. - General standard dialog buttons layout is now in place. - Avoid pre-loading a stalled patchbay definition filename and its nagging error on startup (fixes bug #3017078). - Client connection retrial logic scrapped. Being a leftover from early ages, when machines were slower and JACK server startup times were longer... now, if it can't connect first time as client, it will tear down the server whether it's starting up still or not at all. (cf. Setup/Settings/Start Delay for the rescue). - Server name is finally part of the server settings presets, thanks to Fons Adriaensen for the heads-up. - As a workaround regarding issues switching jack2's backends, Robin Gareus sends us yet another D-Bus method slot: "preset", (dbus-send --system / org.rncbc.qjackctl.preset string:PRESET). Thanks again. - Another D-Bus interface slot makes it through implementation: "quit" (eg. usage: dbus-send --system / org.rncbc.qjackctl.quit). Besides, there's also these new JACK session management actions which were being overlooked as well: "load", "save", "savequit" and "savetemplate" are also available as D-Bus method slots. - Make sure that Patchbay socket names are unique when adding or copying, fixing previous patch by Dominic Sacre. - JACK version is now being shown on the About box (jack2). - Slight Connections widget behavioral change: (dis)connecting a client (from) to one single port, (dis)connections will be applied in sequence from (to) all client output ports to (from) as many input ports there are in below, one by one (satisfying a 5 year old request from Yann Orlarey, thanks:). - JACK session support is being introduced. - Ignore first XRUN occurrence option dropped from statistics. - Initial widget geometry and visibility persistence logic has been slightly revised as much to avoid crash failures due to wrong main widget hidden state. - Double-quotes are now being added to device names which include blank characters and were rendering invalid all command line invocation of the classic JACK server (eg. specially due for Portaudio device names on Windows). - Transport play (rolling) status is now being guarded to avoid backfiring from extraneous transport state changes. - General source tree layout and build configuration change. - Italian (it) translation added (by Sergio Atzori). - Post-shutdown script invocation logic slightly refactored in attempt to enforce its execution on application quit. 0.3.6 2010-03-09 Full D-Busification! - Make sure socket names are unique on each side of the Patchbay (another patch from Dominic Sacre, thanks). - A bunch of primitive D-Bus interface slots have been added, allowing shortcut access to most of main applications actions like toggling Messages, Status, Connections, Patchbay widget pop-ups, reset stats, transport and so on. New bindings are given eg. via dbus-send --system / org.rncbc.qjackctl.(main, messages, status, connections, patchbay, setup, about, reset, rewind, backward, play, pause, forward). (from an original idea from Sebastian Gutsfeld, thanks). - Patchbay snapshot now tolerates JACK client port strings that have more than one semi-colon in it, honoring just the first one exactly as everywhere else eg. Connections. (a glitch as reported by Geoff Beasley while using a2jmidid). - Most modal message dialog boxes (eg. critical errors) are now replaced by system tray icon bubble messages where available (mitigating feature request #2936455). - Comply with jackd >= 0.118.0 which nowruns in real-time mode by default; use of -R is now deprecated from the jackd command line interface options; use -r to run in non-real-time-scheduling. - A man page has beed added. - Got rid of a pretty old and never really useful "jackd-realtime" server path option--actually, it was only seen available on the now defunct old Mandrake Linux distro. - D-Bus support, as provided by org.jackaudio.service aka jackdbus, is now being introduced and used wherever available and whenever enabled. Configuring, starting, stopping and logging the JACK back-end server through the "infamous" jackdbus service is now being seamlessly exploited. - Global configuration state is now explicitly saved/committed to disk when Setup dialog changes are accepted and applied. - Server name command line option added (-n, --server-name). - Single application instance restriction option added (X11). - Setup for the netjack (slave) "net" driver has now sample-rate and frames per buffer (period size) settings disabled and/or ignored, as those are pretty much auto-detected by default; also, a new "netone" backend driver option has been introduced (as suggested by Torben Hohn). - Czech (cs) translation added (by Pavel Fric). - Fixed some main window keyboard shortcuts. Escape key now closes Connections, Patchbay, Status and Messages widgets as usual (bug #2871548). - Fixed glitch on configure portaudio support, specially when the library is not detected as available. 0.3.5 2009-09-30 Slipped away! - Late support for UTF-8 encoded client/port names. - Allow only one single patchbay connection to or from an exclusive socket (mitigating bug #2859119). - Automatic crash-dump reports, debugger stack-traces (gdb), back- traces, whatever, are being introduced as a brand new configure option (--enable-stacktrace) and default enabled on debug build targets (--enable-debug). - Probable fix on the audio connections with regard to client/port (re)name changes (an ancient bug reported by Fons Adriaensen). - Portaudio device selector is now available (after a patch handed by Torben Hohn and Stephane Letz). - A couple of primitive D-Bus interface slots have been introduced, giving the option to start/stop the jackd server from the system bus eg. via dbus-send --system / org.rncbc.qjackctl.start (.stop), (a nice addition supplied by Robin Gareus, thanks). - New command line option (-a, --active-patchbay=[path]) to specify and activate a given patchbay definition file (a simple patch sent by John Schneiderman, thanks). - Added one significant digit to DSP Load percentage status display. - Tentative support for netjack (slave) by adding the "net" driver to the existing backend driver options on the Setup/Settings section. - Converted obsolete QMessageBox forms to standard buttons. - New patchbay snapshot now raises the dirty flag and allows for the immediate salvage of patchbay definition profile. - Conditional build for JACK port aliases support (JACK >= 0.109.2). - Alternate icon sizes other than default 16x16, are now effective to the Connections widget (Setup/Dislay/Connections Window/Icon size). 0.3.4 2008-12-05 Patchbay snapshot revamp. - Introducing the very first and complete translations in-package: German (de), Spanish (es), French (fr) and Russian (ru); credits in TRANSLATORS. - At last, after years of retarded procrastination, the old infamous patchbay snapshot feature has been the subject of a almost complete rewrite and it does try to give a way better mapping of all actual and current running client/port connections, both JACK (audio, MIDI) and ALSA MIDI, of course ;) - On Setup/Settings/Parameters dialog, all device selection options are now reset to default when disabled interactively. - Grayed/disabled palette color group fix for dark color themes. - Qt Software logo update. - Fait-divers: desktop menu file touched to openSUSE conventions. - ALSA PCM devices now only listed/enumerated iif strictly compliant with the audio mode criteria (Duplex, Capture-only or Playback-only) as kindly suggested by Nedko Ardaunov. - JACK client/port aliases may now be displayed as a global user option (see Setup/Display/Connections/JACK client/port aliases). - Lighten up the connections line and highlight colors, as seen to fit best on some darker background themes. - Patchbay snapshot fixed to differentiate socket clients according to its type (Audio, MIDI or ALSA-Seq), avoiding the mess and gross mistake of hanging disparate type ports under the same client item. - JACK_DEFAULT_SERVER environment variable is now appended to the X11 unique application identifier, allowing for having multiple instances each controlling its own JACK server, besides the default one. - Due to some trouble with newer Qt >= 4.4 applications regarding font size configuration, a new global user option is now available to the rescue: Setup/Misc/Defaults/Base font size (default is no-op). 0.3.3 2008-06-07 Patchbay JACK-MIDI, file logging and X11 uniqueness. - Attempt to load Qt's own translation support and get rid of the ever warning startup message, unless built in debug mode. (transaction by Guido Scholz, while on qsynth-devel, thanks). - Messages file logging makes its first long overdue appearance, with user configurable settings in Setup/Options/Logging. - Only one application instance is now allowed to be up and running, with immediate but graceful termination upon startup iif an already running instance is detected, which will see its main widget shown up and the server started automatically (Qt/X11 platform only). - Finally, full JACK MIDI support sneaks into the patchbay; socket types now differ in Audio, MIDI and ALSA, following the very same nomenclature as found on the Connections widget tabs. - Sun driver support (by Jacob Meuser). - Delay window positioning at startup option is now being disabled, on the Setup/Misc tab, when Minimize to system tray is enabled. - Cosmetic fix: Setup/Settings tab, 'Input Device' text label was using a slightly smaller font than the rest of the application (bug#1872545, reported by Jouni Rinne). 0.3.2 2007-12-20 Patchbay heads-up with season greetings. - Patchbay port matching has been slightly extended, this time allowing for the multiple or as many-to-many connections between socket plugs, provided these are specified in proper regex form (after a patch proposed by Dave Moore, thanks). - A new option to start the program minimized when the system tray icon is enabled, is now available from Setup/Misc/Start minimized to system tray (as kindly suggested by Marc-Olivier Barre). - Regression from QSystemTrayIcon (Qt4 >= 4.2) implementation, at least on X11 environments: while the main application widget was minimized to the system-tray, closing any other top-level widget was causing the immediate and unexpected application shutdown. - Some portaudio backend settings are now being enabled, specially suited for the jackdmp flavouring. - Server mode display blinking, usually shown as the RT indicator, is now an option (Setup/Display/Blink server mode indicator when started). - Tool/child windows position and size preservation fixed. - The connections/patchbay auto-refresh option has been finally removed due to several user requests, although deprecated for quite some time now it has been the probable cause of some periodic xrun occurrences due to graph-locking in jackd (while making Geoff Beasley angry in the process:). - Messages line limit was not being checked, now honored. - Simple as it could ever be, the build executive summary report is now given on configure. - Patchbay snapshot ot its socket and port ordering back. - ALSA Sequencer support is now an optional feature on setup, preventing the annoying "MIDI patchbay will be not available" warning message, ruining window placement on Linux systems where the snd-midi-seq kernel module is not loaded or not favorable (eg. OSS) at startup (by request from Jussi Laako). - Get configure to try and detect the correct qmake location and insert it the search order, so let the qt4 tools take precedence when --with-qt option is given and older qt3 ones coexist and are found located ahead in the PATH. - The connections widget is now being properly refreshed, due to some quirk in the QTreeWidget which was preventing some items, specially the expanded ones, to disappear in the void. Meanwhile, with a hand from Stephane Letz, the client/port lookup method was changed to prevent duplicated, missing entries or worse, crashes due to weird behaved windows applications. - The xrun count stats can now be reset simply by middle clicking on the systray icon or the main window's display area (thanks to patch sent by Dominic Sacre). - An improved version of the "shiny" background image was issued. The original somehow looked like two different images put together, probably most apparent on a bright TFT screen (by Dominic Sacre). - A warning is now being issued, asking whether one wants to remove a corresponding Patchbay connection, when client/ports are being disconnected over the Connections window, thus avoiding automatic reconnection annoyance due to normal active Patchbay behavior. - The infamous "Keep child windows always on top" global option is now supposed to behave a little better when disabled, layering child windows as naturally as far the window manager dictates. - Input/Output Channel setting is now allowed to be greater than 32; the special default text is now displayed, also on Input/Output Latency and Priority settings spin-boxes. - Andreas Persson just sent a patch that makes it possible to compile and run qjackctl with Qt version 4.1. Applied without hesitation, thanks. 0.3.1a 2007-07-19 System-tray tooltip icon crash fix. - An immediate showstopper crash upon client start was irradicated, which was affecting those with the system-tray icon disabled, as is the default (thanks to Ken Ellinwood for first reporting this sloppy one). 0.3.1 2007-07-18 Shallowed bug-fix release. - The current DSP load percentage activity is now also displayed on the system-tray icon tooltip. - An illusive but nasty Connections/Patchbay item tooltip crash bug has been hopefully fixed (Qt >= 4.3). - Now using QSystemTrayIcon class facility if available (Qt4 >= 4.2) making the system-tray option available on most platforms, notably on Windows and Mac OS X. - Usage of QProcess class has been severely refactored, now using QProcess::start() instead of QProcess::startDetached(), giving much tighter control over the started jackd(mp) process. Downside is that QjackCtl lost its ability and option to leave the process detached upon quitting the application. Too bad. - A new eye-candy bit has sneaked in: server mode display, that is the RT indicator, now blinks when server/client is started/active. - Combo-box setup history has been corrected on restore, which was discarding the very initial default (factory) contents. - Now that Qt4 is accessible to open-source Windows appplications, there's some experimental stuff sneaking in for jackdmp support on win32 (http://www.grame.fr/~letz/jackdmp.html). - Connections list items were initially sorted in descending order by default. Fixed. Client items are now naturally sorted, again. 0.3.0 2007-07-10 Qt4 migration was complete. - Qt4 migration was complete. Care must be taken with this new configuration file and location: this release starts a new one from scratch and won't reuse any of the previous existing ones, although cut and paste might help if you know what you're doing :) - On a last-minute addition, the "firewire" audio backend driver option has been also included, supporting the ffado.org project which is evolving where "freebob" is leaving (thanks to Klaus Zimmermann for this one). 0.2.23 2007-07-02 JACK MIDI support debut. - JACK MIDI support is now being introduced. Connections window now has a brand new MIDI tab, the older being renamed to ALSA, as for the ALSA/MIDI sequencer conveniency. The server settings now include the MIDI driver setup option (ALSA backend only). - Application icon is now installed to ${prefix}/share/pixmaps; application desktop entry file is now included in installation; spec file (RPM) is now a bit more openSUSE compliant; initial debianization. - Invalidation of the JACK client handle is now forced right on jack_shutdown notification, preventing a most probable fatal crash due to jack_deactivate and/or jack_client_close being called after the jack_watchdog kicks in. - Default font option names were adjusted to "Sans Serif" and "Monospace", wherever available. - The "keep child windows always on top" option is not set as default anymore, because window focus behavior gets tricky on some desktop environments (eg. Mac OS X, Gnome). - Autoconf (configure) scripting gets an update. 0.2.22 2007-03-31 Long overdue but better late than never. - Fixed default settings for the freebob backend (JACK >= 0.103.0). - CPU Load status label now says correctly DSP Load. - The most recently used patchbay definitions can now be correctly selected in round-robin fashion from its drop-down list widget. - Avoid mixing JACK MIDI ports with regular audio ports on the Connections and Patchbay widgets; strictly list only audio ports. - Added 192k sample rate to setup settings drop down list (as kindly reminded by Klaus Zimmermann, thanks). - Most top-level widgets were missing the normal-widget flag, which were causing some sticky size behavior on some window managers. 0.2.21 2006-10-07 Shrinking on screen real-estate. - GPL address update. - All window captions can now be set smaller as tool-widgets. This option takes effect when child windows are kept always on top. - For the brave of heart, specially the ones brave enough to try with Stephane Letz's jackdmp, a win32 build should be now possible. - The main window button text labels are now optional (after a kind suggestion by Geoff Beasley, thanks). - Increse default maximum number of ports setting from 128 to 256. - Initial freebob backend driver support. Also changed the coreaudio backend driver command line device name/id parameter. - Closing the main window while not as an active JACK client, nor under a server running state, will just quit the whole application, even though the system-tray icon option is in effect. - The most relevant transport commands (Rewind, Play and Pause) are now made available on the main window context popup menu. - The post-shutdown script is now also being called when using the Stop button, whether the jackd server has been started internally or not. The initial hard-coded default is now on and set to `killall jackd` (as a workaround to an old request from Stephane Letz). - The main window buttons display are now optional. One can choose whether the left, right and/or transport buttons are hidden, making it for a total of six different modes for the main window presentation (after a much simpler suggestion from Paul Davis and Stephane Letz). - Added configure support for x86_64 libraries (UNTESTED). 0.2.20 2006-03-05 Featuring patchbay socket forwarding. - Server path setting now accepts custom command line parameters (after a kind suggestion from Jussi Laako). - The internal XRUN callback notification statistics and reporting has been changed to be a bit less intrusive. - Patchbay socket dialog gets some more eye-candy as icons have been added to the client and plug selection (combobox) widgets. - Connections and patchbay lines coloring has changed just slightly :) - New patchbay socket forwarding feature. Any patchbay socket can now be set to have all its connections replicated (i.e. forwarded) to another one, which will behave actively as a clone of the former. Forward connections are shown by vertical directed colored lines, and can be selected either on socket dialog or from context menu (currently experimental, only applicable to input/writable sockets). - Optional specification of alternate JACK and/or ALSA installation paths on configure time (after a patch from Lucas Brasilino, thanks). 0.2.19a 2005-11-28 MIDI aliases are back in town. - ALSA sequencer client/port name aliases are functional again; all actual MIDI sequencer client/port numerical identifier prefixes are also back in business. 0.2.19 2005-11-19 MRU patchbay selection, Mac OS X and other fixes. - Connections widget views are now properly refreshed after renaming client/ports (aliases). - Disabled system tray and ALSA sequencer support on configure time, whenever building for MacOSX as default. - Fixed the major issues with selecting an audio interface on Mac OSX; the button the right of the interface combo is now much better looking than it was before; input/output channel counts are also updated automatically now (thanks to Jesse Chappell for the patch). - Prevent the setting of the coreaudio device id on the jackd command line (-n) whenever the default interface is being selected. - The connections and patchbay windows are now allowed to have a wider connection lines frame panel; splitter width sizes are now persistent across application sessions (thanks to Filipe Tomas for the hint). - Activation toggling feedback on the patchbay widget has been fixed; additionally and as found convenient, the most recently used patchbay definitions can now be loaded immediately by selecting from a drop-down list widget, which replaces the old static patchbay name status text, and adds a lil'icon too :) - All widget captions changed to include proper application title prefix. - Attempt to bring those aging autoconf templates to date; sample SPEC file for RPM build is now being included and generated at configure time. - The current selected device is now shown with a checkmark on the device selection menu(s), while on the settings dialog. - Set to use QApplication::setMainWidget() instead of registering the traditional lastWindowClosed() signal to quit() slot, just to let the -geometry command line argument have some effect on X11. 0.2.18 2005-07-18 The mantra of bugfixes stays on. - A freezing and endless loop condition on the patchbay socket item duplication (copy) has been fixed. - Fixed output disability when messages limit option is turned off (thanks again to Wolfgang Woehl for spotting this one). 0.2.17 2005-06-17 Systemic I/O Latency settings are in. - Systemic I/O Latency settings are now featured for the alsa, oss and coreaudio backends, letting you specify the known latency of external hardware for client aware compensation purposes (thanks to Wolfgang Woehl, for the reminder). - Update on last backstage changes to the coreaudio backend options (due to Stephane Letz. Thanks). 0.2.16 2005-06-13 OSS device name selection and Mac OS X breakthrough. - ALSA sequencer client/port name changes are now properly detected on the MIDI connections widget (as noted by Chris Cannam. Thanks). - Long overdue transport buttons (rewind, backward and forward) finally landed onto the main control window, at last :). - Duplication (copy) of patchbay socket items was added. - Do not ever try to start the JACK server if there's one already found running, on which case the client-only mode of operation is then activated (as kindly suggested by Orm Finnendahl, thanks). - After several Mac OS X user requests, ALSA/MIDI sequencer support is now an option, otherwise detected at configure time and conditionally compiled in if, and only if, ALSA is found available (which has been a primordial assumption on Linux systems:). Ah, and that just makes for the blind inclusion of another backend driver option: coreaudio. - Actual OSS device selection menu now featured on setup dialog; these adds to the device selection button menus for the OSS driver settings. - Delayed geometry setup of windows upon startup was added as an optional workaround to subtle problems due to window decoration information not being available at window creation time on some window managers (as patch proposed by Dirk Jagdmann. Thanks). - Fixed some minor but rather old bug that was quitting the application abruptly, when one switches off the system tray icon while the main application widget is hidden. - Cancel is now an option when creating a new patchbay definition. - Context menus are finally littered with icons. - Minor configure and Makefile install fixes, as Debian and Mac OS X specialties. Also, install does the right thing with target file modes (thanks to Matt Flax and Ebrahim Mayat, for pointing these out). 0.2.15a 2005-02-09 Return of the paranoid. - Regression from 0.2.13, of the not so stupid pseudo-mutex guards on the connections management framework, after fixing some crash reports from Fernando Pablo Lopez-Lezcano and Dave Phillips (thanks!); it pays to be such a paranoid after all :). 0.2.15 2005-02-06 Client/port names aliasing and other minors. - JACK/ALSA client and port name aliasing (renaming) is now an optional feature for the connections window; all client/port aliases are saved on a per preset basis (as proposed for Lionstracs' Mediastation). - Server state now shown (back gain) on the system tray icon tooltip; speaking of which, tooltips are now also featured on connections, status and patchbay windows. - New actual hardware device selection menu featured on setup dialog; these new button menus are only available for the ALSA driver settings. - Server path factory default to jackd instead of jackstart; preset setup button icons are back. - Fixed rare connection port item removal/disconnection dangling pointer bug. 0.2.14 2005-01-23 More progressive optimizations. - Put a limit on XRUN callback messages and statistics report rate, preventing the potential hosing of the GUI due to a XRUN cascade storm. The maximum reasonable report rate has been fixed to be one XRUN callback occurrence per second. - Set to ignore the SIGPIPE ("Broken pipe") signal, where available, as the default handler is usually fatal when a JACK client is zombified abruptly. - All conection view items are now sorted in natural case insensitive order, not just as audio port names as was before. - Got rid of those nonsense paranoid and rather stupid pseudo-mutex guards on the connections management framework and event notifications (nuff said :). - Optional confirmation warning on audio server shutdown, if there's some audio clients still active and connected (as suggested by Sampo Savolainen). - Check for on configure time (as of JACK 0.99.42+ CVS). - "Unlock memory" server setup option was added, allowing the release of memory used by common toolkit libraries (GTK+, Qt, FLTK, Wine) that were being superfluously locked on every GUI JACK client; number of periods has now the minimum allowed value of 2; server start delay widget converted to spinbox; setup dialog layout slighly changed. - Removed stand-alone usx2y driver support. Since JACK 0.99.41+ CVS, the special "rawusb" support on the Tascam US-122/224/428 USB Audio/MIDI interface controllers have been merged and properly integrated into the regular alsa backend driver. Being still experimental, this special mode of operation is now triggered only when "hw:N,2" is specified as the alsa device name (N = soundcard index of snd-usb-usx2y module). - Messages window limit is now enforced only when the line count exceeds in one third the user configured line count maximum; if Qt 3.2.0+ is in use, the QTextView widget is otherwise set to the optimized Qt::LogText format. - XRUN status items are kept double-dashed if none has been detected. 0.2.13 2004-11-21 Retouches and minor optimizations. - Main window is now properly minimized instead of simply hidden when the system tray icon is not available nor opted in (as suggested by Florian Schmidt). - Some informational status items are now updated 10 times less frequently (e.g. CPU Load, Sample Rate, Buffer Size, Realtime Mode, etc.), lowering the CPU burden of most probably redundant status updates. - XRUN detection and statistics are being conditionally included if jack_get_xrun_delayed_usecs() is available (as of JACK 0.99.7+ CVS). - Fixed ancient bug on client shutdown event handling, which was invoking the xrun notification handler by mistake. - Support for maximum scheduling delay status added; this status relies on jack_get_max_delayed_usecs() function availability at configure time, depending on a Lee Revell's non-official JACK patch. - Patchbay Activate button is now a toggle button widget, allowing the deactivation of the current patchbay profile. - Reset-status icon has been changed to a simple red circle instead of previous one which was much like a power-switch symbol. - Preset selection has been added to the context menu. 0.2.12a 2004-10-11 Audio connections now naturally sorted. - Client port list on audio connections are now hopefully fixed for good; the sort comparison function now takes full natural order into account. 0.2.12 2004-10-08 Larger icons and font option on connections/patchbay. - Fixed some old and slow memory-leak due to redundand and repetitive call to jack_port_by_name() (discovered and solved, thanks to Jesse Chappell); some other free() and configure fixes were also applied. - Shiny display effect toggling has immediate feedback on setup dialog. - Added new usx2y driver support. - New scaled connections/patchbay icons were added; meanwhile, all inline XPM icons were removed and brainlessly converted to PNG format. - New setup options as for the connections/patchbay view apprearence: larger icon sizes and font selection are now possible, to better ease manipulation on a touchscreen (feature requested for Lionstracs' Mediastation). - Connection line width follows icon size in discrete proportion. - "Other" setup options moved to a new dialog tab, "Misc"; new extreme item values, 32 and 16 frames, added to the drop-down list of the Frames/Buffer setting (as suggested by Mark Knetch). 0.2.11 2004-09-10 Shiny display now optional and other fixes. - Fixed Input/Output channels settings, being now either enabled when the ALSA driver is selected for Capture/Playback only. - Shiny display effect: after some conservative user complaints this pure cosmetic feature is now made optional ;) 0.2.10 2004-09-04 Shiny display and curved connections. - New pre-shutdown script setup option, allowing to specify a shell-script to be run before the JACK server daemon is shutted-down. This overrides any previous shutdown script setting, which should be now moved onto the existing post-shutdown script option, as to keep old procedural behaviour. - Avoid stopping JACK prematurely with QProcess::kill() (oneliner fix); stopping JACK will now take a little bit longer, but hopefully will take the time to cleanup properly (thanks to Kjetil Matheussen). - ALSA driver Duplex mode accepts alternate Input or Output device name. - Context menu reset option is now always enabled (yet another suggestion from Sampo Savolainen). - Main display background gets shinny effect; adjusted system tray background palette color mode. - Priority and setup control is now a spinbox ranging from 0..89 (as suggested by Florian Schmidt). Same for Periods/Buffer. - Patchbay connection lines are now drawn correctly when items are scrolled out of view. Additionally, the connection lines can now be optionally drawn as bezier spline curves (big thanks to Wilfried Huss). 0.2.9 2004-07-04 Sloppy boy fixes and minor featuritis. - Patchbay socket dialog client and plug list option items are now properly escaped as regular expressions. - JACK callbacks are now internally mapped to QCustomeEvent's instead of using the traditional pipe notifications. - The system tray popup menu is now featured as a context menu on the main application window too. - The reset status option is now included in the system tray popup menu. - Server stop command button now enabled during client startup interval; this makes it possible to stop the server just in case the client can't be activated for any reason. - Top level sub-windows are now always raised and set with active focus when shown to visibility. 0.2.8 2004-04-30 System tray icon and menu option. - New option for system tray icon and menu, which is known to be effective on KDE enabled desktops; support for freedesktop.org's system tray protocol specification has been included so this maybe also effective on Gnome2. - Capture or Playback-only optional alternate device interface name may now be specified for the ALSA audio driver server settings. - Maximum number of ports setting was added to server setup. - The dash (-) is now a legal character for preset names. 0.2.7b 2004-04-05 OSS driver setup fix. - OSS driver halfduplex setup operation is now fixed, thanks to Jussi Laako. 0.2.7a 2004-04-05 Compilation fix for Qt 3.1. - QSplitter::setChildrenCollapsible call is now conditionally compiled, applied only on Qt 3.2+. 0.2.7 2004-04-04 User-interface refinements and OSS driver support. - Connections and patchbay windows horizontal layout are now user configurable via splitter widgets. - Refresh on connections window now take effect on both tabs, Audio (JACK) and MIDI (ALSA). - OSS driver support and no-mlock option added to server settings, setup dialog (as of JACK 0.95.7+). - Temporary server configuration option added, applicable to the auto-start server feature on client applications, whether the server shall exit once all clients are closed. - Server mode (RT) status display added. - Warning messages are now prompted to the user when there are any pending changes not saved nor applied while on the setup dialog. - Translation support for the default preset name "(default)". - Messages window pops up whenever a critical error message is issued. 0.2.6 2004-02-29 More work in progress. - Message window line limit is now a configurable option on setup, as is whether the command-line local configuration file gets saved at all; the first argument of the command-line configuration is stuffed to be the executable server command absolute path, when possible. - Warning message issued if ALSA sequencer is not available on startup; also if server settings are changed while client is currently active. - Server autostart magic is locally disabled by forcing the environment variable JACK_NO_START_SERVER at startup; with any luck this will maintain qjackctl's behaviour whether the JACK server is already started or not. - Makefile.cvs makes its late entrance on the build toolset. 0.2.5 2004-02-16 Server survival option and command-line wrapper feature. - New option on application exit for leaving the JACK server daemon running, surviving the parent process; the confirmation prompt on application close now features a "Terminate", "Leave" and "Cancel" button options. - New command-line wrapper feature for JACK client applications, thus giving a convenient head start for the JACK audio server as needed (as suggested by Fernando Pablo Lopez-Lezcano, of Planet CCRMA fame). - Messages, Status, Connections and Patchbay pop-up windows are not hinted as dialogs anymore and thus are not centered relative to parent main window which has become a strict Qt dialog widget behaviour (as of Qt 3.3+). - Patchbay window content changes are now properly updated, without the need for a later manual refresh to redraw stalled connection lines. - The snapshot option for creating a new patchbay definition from current actual connections now takes client and port names as regular expressions and smart enough when regarding more than two contiguous decimal digits :) - Patchbay socket list view ordering is now properly preserved; socket dialog gets plug list handling ehancements; active patchbay gets reloaded when commited and saved to file; connections redraw on socket removal has been fixed. - Server literal command-line is now saved into local configuration file (~/.jackdrc) for convenience of future auto-start client applications. - New setup option on whether all child windows are kept on top of the main window, or otherwise floating with probable taskbar entries of their own. - Setup changes that are only effective next time the program is run gets an informational message box shown to the user. 0.2.4 2004-02-01 Exclusive patchbay sockets. - Patchbay definitions may now be configured with exclusive sockets; this way, only one defined connection is allowed as soon as it's available, being all others immediatelly disconnected whenever attempted. - On the connections view, current connected client ports are now slightly highlighted (blue) whenever a client or port is selected on the opposite column (as suggested by Lawrie Abbott). - Connections and patchbay drag and drop feature is now bilateral; you can now drag and drop an item from right to left to establish the connection. 0.2.3a 2004-01-19 Time format combo-box tooltip fix. - A qt-designer copy-paste leftover has been fixed; sloppy boy I am ;) 0.2.3 2004-01-19 Tenths, hundredths, milliseconds, whatever. - Custom time format setup for all elapsed times, allowing the display of tenths, hundredths or even milliseconds instead of just hundredths of second for transport time code. 0.2.2 2004-01-16 Hundredths are back. - Transport time is now shown with hundredths of second (hh:mm:ss.dd), as it was once before but not constant zero. - Client start delay now configurable on setup; this may be of help for slow machines or unusual long server driver startups (e.g. portaudio). - Client-only mode restart has been fixed. - Messages color retouching. - Popup menus memory leak fixed. 0.2.1 2003-12-29 The fix of fixes. - Fixed jackstart/jackd command line parameter argument concatenation. - Front panel status display font can now be customized. - Some connection graph changes were being silently missed, now fixed. - Messages window fallback fix; stdout handling has been retouched to be more line buffer oriented. 0.2.0 2003-12-12 ALSA sequencer patchbay entrance. - ALSA sequencer subscription patchbay feature, complementing current audio service with a MIDI application connection graph, gracefuly included on the same front-end. - Current preset name is shown on main window caption title. New button and form icons. Messages window blankness rendering fix. - Immediate server startup option was made persistent and therefore remembered across sessions. - Standard output/error stream capture setup option. 0.1.3 2003-11-26 Server settings profile/preset feature. - Server setup settings can now be profiled, named and saved as presets. Command line preset name option and scripting argument meta-symbols are also featured for convenience (kindly suggested by Sampo Savolainen). - New configure time argument debugging support (--enable-debug). 0.1.2 2003-11-16 More work in progress. - Qmake project file (qjackctl.pro) now generated by configure (autoconf), introducing the explicit binding support to libqt-mt (multi-thread). - Main window is not hinted as a dialog anymore, giving room to the minimize button on some other window managers; application close confirm warning is now an option. - Removed deprecated settings options: temporary directory and ASIO mode; new available settings for the ALSA driver: force 16bit format, maximum input channels and output channels (as of JACK 0.90.x). - Transport time display looses static hundredth seconds decimal digits. 0.1.1a 2003-11-01 Whatever happened to OK button icons. - Restored missing OK button icons. 0.1.1 2003-10-29 Minor feature enhancements and bugfixes. - Main window display items are now made fixed in width, at least those more prone to change frequently and thus caused some display jitter. - Messages, status, connections and patchbay module windows are now reopened automagicaly on startup as they were on previous session. - New patchbay definition snapshot option from current actual connections; current active patchbay filename status indication on title. - New icons patchbay editor window and socket dialogs; own stdout/stdin is now properly captured and shown on messages log window. - Fixed an obvious patchbay connection scan freezing bug; default .xml file extension enforcement on save. 0.1.0 2003-10-22 Major user interface redesign. - Main application window complete redesign, now more like a multimedia/LCD control panel -- old main window dialog tabs are now splitted in separate pop-up windows/dialogs; big time display options. In other words, this sums up to a nice complete application rewrite. - Deprecated options for forcing aRTs and jackd daemons are no longer available; this functionality can be officially superceded by the more generic startup/shutdown script options. - Seamless support for externally started JACK server, providing a client-only mode of operation; if the JACK daemon is already started, qjackctl enters in client detached mode automagically. - Messages window font is configurable and saved across sessions (by Jack O'Quin's humble request). Some colorization has been introduced on some event messages. - Preliminary patchbay persistence feature is under way. A patchbay definition editor is already included, following an alternative socket-plug patchbay model that aliases and is a direct map to the client-port JACK connections model. The patchbay definitions are stored as text/xml files. - New post-startup script option; immediate JACK server startup command line option (as suggested by Kasper Souren). 0.0.9a 2003-10-03 Tiny bugfixes. - Startup/shutdown script options now correctly saved and restored. - Dummy driver wait parameter is now properly set on startup. - Confirmation warning on disconnecting all ports (as suggested by Robert Jonsson). 0.0.9 2003-09-25 Work in progress. - New connection port item pixmaps that distinguishes physical from logical ports. - History of most recently used values gets saved for some settings and options comboboxes widgets. - New startup and shutdown script options, intended to supersede the mess of forcing artsd and jackd itself, in a near future ;) this way, one can also include the operation of the LADCCA daemon (following a suggestion from Kasper Souren). - Connections command buttons are now shortly disabled after clicking, avoiding accidental duplicated connections. 0.0.8 2003-09-19 Preliminary transport and buffer size status control. - Transport status and control introduced (requires JACK 0.80.0+); - Statistics tab renamed to Status, where the transport state info and simple play/pause control buttons are now placed; - Buffer size status is yet another item on the list view. 0.0.7 2003-09-15 Minor bugfixes. - Inverse alphabetic ordering fixed on Connections port listing. - Verbose option added; messages view font size fix; about Qt dialog; logo pixmap retouched. - Configure script now checks for Qt 3.1.1 or greater. 0.0.6 2003-09-12 Drag-n-drop and more feature enhancements and bufixes. - Patchbay connection user interface handling has been fairly rewritten; (features new bugs while fixing old ones ;-) - Reset XRUN statistics button added; reset time recorded on statistics; calculated latency is now shown on settings; ASIO mode disables Periods/Buffer setting (all suggestions by Lawrie Abbott). - Context popup menu introduced for port connection handling; includes new command for disconnecting all currently connected ports. - Closing the application while JACK is running, is now presented with a warning confirmation message (preventing accidental Esc key press? :). - Patchbay port lists ordering are now more numerical-friendly than ever, taking account for sub-numbering port names (following yet another suggestion from Lawrie). - Connection drag-and-drop is now featured after many, many requests. - Corrected the configure script to properly recognize Qt 3.0.1 or greater. 0.0.5 2003-09-05 Minor feature enhancements and bugfixes. - Internationalization support added; future qjackctl_${LANG}.qm translation files are located on ${prefix}/share/locale . - New dummy and portaudio driver support (as of JACK release 0.80.0+). - A couple of silent memory leak bugs have been corrected. 0.0.4 2003-08-29 Minor changes and bugfixes. - The patchbay port lists are now sorted in a more numerical friendly manner (as suggested by Steve Harris); the sort code has been "borrowed" from qjackconnect, yet again. - Patchbay port connection lines are now always visible, even if their respective connected port items aren't. - Multiple simultaneous port connections can now be handled when a client application item is selected for connection/disconnection (again, suggested by Steve Harris), replicating and extending qjackconnect's similar behaviour. - An auto-refresh option for the patchbay connections is now available, for those cases when client code just can't handle properly some callbacks. - Window positioning and sizing is now almost persistent across sessions; as before, position is saved for the minimal view mode; but now, the details dialog view mode gets its position and size independantly saved also. 0.0.3 2003-08-07 Integrated visual patchbay. - A patchbay for jack port connections is now integrated, much like the greatest Mathias Nagorni's qjackconnect (http://www.suse.de/~mana/jack.html). 0.0.2 2003-08-02 Client code features introduced. - JACK library and header files are checked on configure. - Server CPU load, sample rate and time elapsed since last XRUN detected, are now displayed on statistics. 0.0.1 2003-07-26 Initial release. qjackctl-0.4.2/PaxHeaders.14935/configure0000644000000000000000000000013212700760155014762 xustar0030 mtime=1459871853.718456838 30 atime=1459871853.622408836 30 ctime=1459871853.718456838 qjackctl-0.4.2/configure0000755000175000001440000057610712700760155015551 0ustar00rncbcusers00000000000000#! /bin/sh # Guess values for system-dependent variables and create Makefiles. # Generated by GNU Autoconf 2.69 for QjackCtl 0.4.2. # # Report bugs to . # # # Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc. # # # This configure script is free software; the Free Software Foundation # gives unlimited permission to copy, distribute and modify it. ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi as_nl=' ' export as_nl # Printing a long string crashes Solaris 7 /usr/bin/printf. as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo # Prefer a ksh shell builtin over an external printf program on Solaris, # but without wasting forks for bash or zsh. if test -z "$BASH_VERSION$ZSH_VERSION" \ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='print -r --' as_echo_n='print -rn --' elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='printf %s\n' as_echo_n='printf %s' else if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' as_echo_n='/usr/ucb/echo -n' else as_echo_body='eval expr "X$1" : "X\\(.*\\)"' as_echo_n_body='eval arg=$1; case $arg in #( *"$as_nl"*) expr "X$arg" : "X\\(.*\\)$as_nl"; arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; esac; expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" ' export as_echo_n_body as_echo_n='sh -c $as_echo_n_body as_echo' fi export as_echo_body as_echo='sh -c $as_echo_body as_echo' fi # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. as_myself= case $0 in #(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # Unset variables that we do not need and which cause bugs (e.g. in # pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" # suppresses any "Segmentation fault" message there. '((' could # trigger a bug in pdksh 5.2.14. for as_var in BASH_ENV ENV MAIL MAILPATH do eval test x\${$as_var+set} = xset \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # CDPATH. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH # Use a proper internal environment variable to ensure we don't fall # into an infinite loop, continuously re-executing ourselves. if test x"${_as_can_reexec}" != xno && test "x$CONFIG_SHELL" != x; then _as_can_reexec=no; export _as_can_reexec; # We cannot yet assume a decent shell, so we have to provide a # neutralization value for shells without unset; and this also # works around shells that cannot unset nonexistent variables. # Preserve -v and -x to the replacement shell. BASH_ENV=/dev/null ENV=/dev/null (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV case $- in # (((( *v*x* | *x*v* ) as_opts=-vx ;; *v* ) as_opts=-v ;; *x* ) as_opts=-x ;; * ) as_opts= ;; esac exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} # Admittedly, this is quite paranoid, since all the known shells bail # out after a failed `exec'. $as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 as_fn_exit 255 fi # We don't want this to propagate to other subprocesses. { _as_can_reexec=; unset _as_can_reexec;} if test "x$CONFIG_SHELL" = x; then as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which # is contrary to our usage. Disable this feature. alias -g '\${1+\"\$@\"}'='\"\$@\"' setopt NO_GLOB_SUBST else case \`(set -o) 2>/dev/null\` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi " as_required="as_fn_return () { (exit \$1); } as_fn_success () { as_fn_return 0; } as_fn_failure () { as_fn_return 1; } as_fn_ret_success () { return 0; } as_fn_ret_failure () { return 1; } exitcode=0 as_fn_success || { exitcode=1; echo as_fn_success failed.; } as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; } as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; } as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; } if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then : else exitcode=1; echo positional parameters were not saved. fi test x\$exitcode = x0 || exit 1 test -x / || exit 1" as_suggested=" as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" && test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1 test \$(( 1 + 1 )) = 2 || exit 1" if (eval "$as_required") 2>/dev/null; then : as_have_required=yes else as_have_required=no fi if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null; then : else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR as_found=false for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. as_found=: case $as_dir in #( /*) for as_base in sh bash ksh sh5; do # Try only shells that exist, to save several forks. as_shell=$as_dir/$as_base if { test -f "$as_shell" || test -f "$as_shell.exe"; } && { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$as_shell"; } 2>/dev/null; then : CONFIG_SHELL=$as_shell as_have_required=yes if { $as_echo "$as_bourne_compatible""$as_suggested" | as_run=a "$as_shell"; } 2>/dev/null; then : break 2 fi fi done;; esac as_found=false done $as_found || { if { test -f "$SHELL" || test -f "$SHELL.exe"; } && { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$SHELL"; } 2>/dev/null; then : CONFIG_SHELL=$SHELL as_have_required=yes fi; } IFS=$as_save_IFS if test "x$CONFIG_SHELL" != x; then : export CONFIG_SHELL # We cannot yet assume a decent shell, so we have to provide a # neutralization value for shells without unset; and this also # works around shells that cannot unset nonexistent variables. # Preserve -v and -x to the replacement shell. BASH_ENV=/dev/null ENV=/dev/null (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV case $- in # (((( *v*x* | *x*v* ) as_opts=-vx ;; *v* ) as_opts=-v ;; *x* ) as_opts=-x ;; * ) as_opts= ;; esac exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} # Admittedly, this is quite paranoid, since all the known shells bail # out after a failed `exec'. $as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 exit 255 fi if test x$as_have_required = xno; then : $as_echo "$0: This script requires a shell more modern than all" $as_echo "$0: the shells that I found on your system." if test x${ZSH_VERSION+set} = xset ; then $as_echo "$0: In particular, zsh $ZSH_VERSION has bugs and should" $as_echo "$0: be upgraded to zsh 4.3.4 or later." else $as_echo "$0: Please tell bug-autoconf@gnu.org and rncbc@rncbc.org $0: about your system, including any error possibly output $0: before this message. Then install a modern shell, or $0: manually run the script under such a shell if you do $0: have one." fi exit 1 fi fi fi SHELL=${CONFIG_SHELL-/bin/sh} export SHELL # Unset more variables known to interfere with behavior of common tools. CLICOLOR_FORCE= GREP_OPTIONS= unset CLICOLOR_FORCE GREP_OPTIONS ## --------------------- ## ## M4sh Shell Functions. ## ## --------------------- ## # as_fn_unset VAR # --------------- # Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset # as_fn_set_status STATUS # ----------------------- # Set $? to STATUS, without forking. as_fn_set_status () { return $1 } # as_fn_set_status # as_fn_exit STATUS # ----------------- # Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } # as_fn_exit # as_fn_mkdir_p # ------------- # Create "$as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" } # as_fn_mkdir_p # as_fn_executable_p FILE # ----------------------- # Test if FILE is an executable regular file. as_fn_executable_p () { test -f "$1" && test -x "$1" } # as_fn_executable_p # as_fn_append VAR VALUE # ---------------------- # Append the text in VALUE to the end of the definition contained in VAR. Take # advantage of any shell optimizations that allow amortized linear growth over # repeated appends, instead of the typical quadratic growth present in naive # implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : eval 'as_fn_append () { eval $1+=\$2 }' else as_fn_append () { eval $1=\$$1\$2 } fi # as_fn_append # as_fn_arith ARG... # ------------------ # Perform arithmetic evaluation on the ARGs, and store the result in the # global $as_val. Take advantage of shells that can avoid forks. The arguments # must be portable across $(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : eval 'as_fn_arith () { as_val=$(( $* )) }' else as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } fi # as_fn_arith # as_fn_error STATUS ERROR [LINENO LOG_FD] # ---------------------------------------- # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are # provided, also output the error to LOG_FD, referencing LINENO. Then exit the # script with STATUS, using 1 if that was 0. as_fn_error () { as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi $as_echo "$as_me: error: $2" >&2 as_fn_exit $as_status } # as_fn_error if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || $as_echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits as_lineno_1=$LINENO as_lineno_1a=$LINENO as_lineno_2=$LINENO as_lineno_2a=$LINENO eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" && test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || { # Blame Lee E. McMahon (1931-1989) for sed's syntax. :-) sed -n ' p /[$]LINENO/= ' <$as_myself | sed ' s/[$]LINENO.*/&-/ t lineno b :lineno N :loop s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/ t loop s/-\n.*// ' >$as_me.lineno && chmod +x "$as_me.lineno" || { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; } # If we had to re-execute with $CONFIG_SHELL, we're ensured to have # already done that, so ensure we don't try to do so again and fall # in an infinite loop. This has already happened in practice. _as_can_reexec=no; export _as_can_reexec # Don't try to exec as it changes $[0], causing all sort of problems # (the dirname of $[0] is not the place where we might find the # original and so on. Autoconf is especially sensitive to this). . "./$as_me.lineno" # Exit status is that of the last command. exit } ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in #((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # In both cases, we have to default to `cp -pR'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -pR' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -pR' fi else as_ln_s='cp -pR' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi as_test_x='test -x' as_executable_p=as_fn_executable_p # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" test -n "$DJDIR" || exec 7<&0 &1 # Name of the host. # hostname on some systems (SVR3.2, old GNU/Linux) returns a bogus exit status, # so uname gets run too. ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` # # Initializations. # ac_default_prefix=/usr/local ac_clean_files= ac_config_libobj_dir=. LIBOBJS= cross_compiling=no subdirs= MFLAGS= MAKEFLAGS= # Identity of this package. PACKAGE_NAME='QjackCtl' PACKAGE_TARNAME='qjackctl' PACKAGE_VERSION='0.4.2' PACKAGE_STRING='QjackCtl 0.4.2' PACKAGE_BUGREPORT='rncbc@rncbc.org' PACKAGE_URL='' ac_unique_file="src/qjackctl.cpp" ac_default_prefix=/usr/local # Factoring default headers for most tests. ac_includes_default="\ #include #ifdef HAVE_SYS_TYPES_H # include #endif #ifdef HAVE_SYS_STAT_H # include #endif #ifdef STDC_HEADERS # include # include #else # ifdef HAVE_STDLIB_H # include # endif #endif #ifdef HAVE_STRING_H # if !defined STDC_HEADERS && defined HAVE_MEMORY_H # include # endif # include #endif #ifdef HAVE_STRINGS_H # include #endif #ifdef HAVE_INTTYPES_H # include #endif #ifdef HAVE_STDINT_H # include #endif #ifdef HAVE_UNISTD_H # include #endif" ac_subst_vars='LTLIBOBJS LIBOBJS ac_ldflags ac_cflags ac_incpath ac_libs ac_lrelease ac_lupdate ac_uic ac_moc ac_cv_qmake ac_qmake EGREP GREP CXXCPP ac_ct_CXX CXXFLAGS CXX CPP OBJEXT EXEEXT ac_ct_CC CPPFLAGS LDFLAGS CFLAGS CC ac_qdbus ac_debug ac_prefix target_alias host_alias build_alias LIBS ECHO_T ECHO_N ECHO_C DEFS mandir localedir libdir psdir pdfdir dvidir htmldir infodir docdir oldincludedir includedir localstatedir sharedstatedir sysconfdir datadir datarootdir libexecdir sbindir bindir program_transform_name prefix exec_prefix PACKAGE_URL PACKAGE_BUGREPORT PACKAGE_STRING PACKAGE_VERSION PACKAGE_TARNAME PACKAGE_NAME PATH_SEPARATOR SHELL' ac_subst_files='' ac_user_opts=' enable_option_checking enable_debug enable_qt4 enable_qt5 enable_system_tray enable_jack_midi enable_jack_session enable_jack_port_aliases enable_jack_metadata enable_jack_version enable_alsa_seq enable_portaudio enable_dbus enable_xunique enable_stacktrace with_qt4 with_qt5 with_jack with_alsa with_portaudio ' ac_precious_vars='build_alias host_alias target_alias CC CFLAGS LDFLAGS LIBS CPPFLAGS CPP CXX CXXFLAGS CCC CXXCPP' # Initialize some variables set by options. ac_init_help= ac_init_version=false ac_unrecognized_opts= ac_unrecognized_sep= # The variables have the same names as the options, with # dashes changed to underlines. cache_file=/dev/null exec_prefix=NONE no_create= no_recursion= prefix=NONE program_prefix=NONE program_suffix=NONE program_transform_name=s,x,x, silent= site= srcdir= verbose= x_includes=NONE x_libraries=NONE # Installation directory options. # These are left unexpanded so users can "make install exec_prefix=/foo" # and all the variables that are supposed to be based on exec_prefix # by default will actually change. # Use braces instead of parens because sh, perl, etc. also accept them. # (The list follows the same order as the GNU Coding Standards.) bindir='${exec_prefix}/bin' sbindir='${exec_prefix}/sbin' libexecdir='${exec_prefix}/libexec' datarootdir='${prefix}/share' datadir='${datarootdir}' sysconfdir='${prefix}/etc' sharedstatedir='${prefix}/com' localstatedir='${prefix}/var' includedir='${prefix}/include' oldincludedir='/usr/include' docdir='${datarootdir}/doc/${PACKAGE_TARNAME}' infodir='${datarootdir}/info' htmldir='${docdir}' dvidir='${docdir}' pdfdir='${docdir}' psdir='${docdir}' libdir='${exec_prefix}/lib' localedir='${datarootdir}/locale' mandir='${datarootdir}/man' ac_prev= ac_dashdash= for ac_option do # If the previous option needs an argument, assign it. if test -n "$ac_prev"; then eval $ac_prev=\$ac_option ac_prev= continue fi case $ac_option in *=?*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;; *=) ac_optarg= ;; *) ac_optarg=yes ;; esac # Accept the important Cygnus configure options, so we can diagnose typos. case $ac_dashdash$ac_option in --) ac_dashdash=yes ;; -bindir | --bindir | --bindi | --bind | --bin | --bi) ac_prev=bindir ;; -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) bindir=$ac_optarg ;; -build | --build | --buil | --bui | --bu) ac_prev=build_alias ;; -build=* | --build=* | --buil=* | --bui=* | --bu=*) build_alias=$ac_optarg ;; -cache-file | --cache-file | --cache-fil | --cache-fi \ | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) ac_prev=cache_file ;; -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) cache_file=$ac_optarg ;; --config-cache | -C) cache_file=config.cache ;; -datadir | --datadir | --datadi | --datad) ac_prev=datadir ;; -datadir=* | --datadir=* | --datadi=* | --datad=*) datadir=$ac_optarg ;; -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \ | --dataroo | --dataro | --datar) ac_prev=datarootdir ;; -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \ | --dataroot=* | --dataroo=* | --dataro=* | --datar=*) datarootdir=$ac_optarg ;; -disable-* | --disable-*) ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid feature name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval enable_$ac_useropt=no ;; -docdir | --docdir | --docdi | --doc | --do) ac_prev=docdir ;; -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*) docdir=$ac_optarg ;; -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv) ac_prev=dvidir ;; -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*) dvidir=$ac_optarg ;; -enable-* | --enable-*) ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid feature name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval enable_$ac_useropt=\$ac_optarg ;; -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ | --exec | --exe | --ex) ac_prev=exec_prefix ;; -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ | --exec=* | --exe=* | --ex=*) exec_prefix=$ac_optarg ;; -gas | --gas | --ga | --g) # Obsolete; use --with-gas. with_gas=yes ;; -help | --help | --hel | --he | -h) ac_init_help=long ;; -help=r* | --help=r* | --hel=r* | --he=r* | -hr*) ac_init_help=recursive ;; -help=s* | --help=s* | --hel=s* | --he=s* | -hs*) ac_init_help=short ;; -host | --host | --hos | --ho) ac_prev=host_alias ;; -host=* | --host=* | --hos=* | --ho=*) host_alias=$ac_optarg ;; -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht) ac_prev=htmldir ;; -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \ | --ht=*) htmldir=$ac_optarg ;; -includedir | --includedir | --includedi | --included | --include \ | --includ | --inclu | --incl | --inc) ac_prev=includedir ;; -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ | --includ=* | --inclu=* | --incl=* | --inc=*) includedir=$ac_optarg ;; -infodir | --infodir | --infodi | --infod | --info | --inf) ac_prev=infodir ;; -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) infodir=$ac_optarg ;; -libdir | --libdir | --libdi | --libd) ac_prev=libdir ;; -libdir=* | --libdir=* | --libdi=* | --libd=*) libdir=$ac_optarg ;; -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ | --libexe | --libex | --libe) ac_prev=libexecdir ;; -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ | --libexe=* | --libex=* | --libe=*) libexecdir=$ac_optarg ;; -localedir | --localedir | --localedi | --localed | --locale) ac_prev=localedir ;; -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*) localedir=$ac_optarg ;; -localstatedir | --localstatedir | --localstatedi | --localstated \ | --localstate | --localstat | --localsta | --localst | --locals) ac_prev=localstatedir ;; -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*) localstatedir=$ac_optarg ;; -mandir | --mandir | --mandi | --mand | --man | --ma | --m) ac_prev=mandir ;; -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) mandir=$ac_optarg ;; -nfp | --nfp | --nf) # Obsolete; use --without-fp. with_fp=no ;; -no-create | --no-create | --no-creat | --no-crea | --no-cre \ | --no-cr | --no-c | -n) no_create=yes ;; -no-recursion | --no-recursion | --no-recursio | --no-recursi \ | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) no_recursion=yes ;; -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ | --oldin | --oldi | --old | --ol | --o) ac_prev=oldincludedir ;; -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) oldincludedir=$ac_optarg ;; -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) ac_prev=prefix ;; -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) prefix=$ac_optarg ;; -program-prefix | --program-prefix | --program-prefi | --program-pref \ | --program-pre | --program-pr | --program-p) ac_prev=program_prefix ;; -program-prefix=* | --program-prefix=* | --program-prefi=* \ | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) program_prefix=$ac_optarg ;; -program-suffix | --program-suffix | --program-suffi | --program-suff \ | --program-suf | --program-su | --program-s) ac_prev=program_suffix ;; -program-suffix=* | --program-suffix=* | --program-suffi=* \ | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) program_suffix=$ac_optarg ;; -program-transform-name | --program-transform-name \ | --program-transform-nam | --program-transform-na \ | --program-transform-n | --program-transform- \ | --program-transform | --program-transfor \ | --program-transfo | --program-transf \ | --program-trans | --program-tran \ | --progr-tra | --program-tr | --program-t) ac_prev=program_transform_name ;; -program-transform-name=* | --program-transform-name=* \ | --program-transform-nam=* | --program-transform-na=* \ | --program-transform-n=* | --program-transform-=* \ | --program-transform=* | --program-transfor=* \ | --program-transfo=* | --program-transf=* \ | --program-trans=* | --program-tran=* \ | --progr-tra=* | --program-tr=* | --program-t=*) program_transform_name=$ac_optarg ;; -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd) ac_prev=pdfdir ;; -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*) pdfdir=$ac_optarg ;; -psdir | --psdir | --psdi | --psd | --ps) ac_prev=psdir ;; -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*) psdir=$ac_optarg ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) silent=yes ;; -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) ac_prev=sbindir ;; -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ | --sbi=* | --sb=*) sbindir=$ac_optarg ;; -sharedstatedir | --sharedstatedir | --sharedstatedi \ | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ | --sharedst | --shareds | --shared | --share | --shar \ | --sha | --sh) ac_prev=sharedstatedir ;; -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ | --sha=* | --sh=*) sharedstatedir=$ac_optarg ;; -site | --site | --sit) ac_prev=site ;; -site=* | --site=* | --sit=*) site=$ac_optarg ;; -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) ac_prev=srcdir ;; -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) srcdir=$ac_optarg ;; -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ | --syscon | --sysco | --sysc | --sys | --sy) ac_prev=sysconfdir ;; -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) sysconfdir=$ac_optarg ;; -target | --target | --targe | --targ | --tar | --ta | --t) ac_prev=target_alias ;; -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) target_alias=$ac_optarg ;; -v | -verbose | --verbose | --verbos | --verbo | --verb) verbose=yes ;; -version | --version | --versio | --versi | --vers | -V) ac_init_version=: ;; -with-* | --with-*) ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid package name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval with_$ac_useropt=\$ac_optarg ;; -without-* | --without-*) ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid package name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval with_$ac_useropt=no ;; --x) # Obsolete; use --with-x. with_x=yes ;; -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ | --x-incl | --x-inc | --x-in | --x-i) ac_prev=x_includes ;; -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) x_includes=$ac_optarg ;; -x-libraries | --x-libraries | --x-librarie | --x-librari \ | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) ac_prev=x_libraries ;; -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) x_libraries=$ac_optarg ;; -*) as_fn_error $? "unrecognized option: \`$ac_option' Try \`$0 --help' for more information" ;; *=*) ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` # Reject names that are not valid shell variable names. case $ac_envvar in #( '' | [0-9]* | *[!_$as_cr_alnum]* ) as_fn_error $? "invalid variable name: \`$ac_envvar'" ;; esac eval $ac_envvar=\$ac_optarg export $ac_envvar ;; *) # FIXME: should be removed in autoconf 3.0. $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2 expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && $as_echo "$as_me: WARNING: invalid host type: $ac_option" >&2 : "${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}" ;; esac done if test -n "$ac_prev"; then ac_option=--`echo $ac_prev | sed 's/_/-/g'` as_fn_error $? "missing argument to $ac_option" fi if test -n "$ac_unrecognized_opts"; then case $enable_option_checking in no) ;; fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;; *) $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;; esac fi # Check all directory arguments for consistency. for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \ datadir sysconfdir sharedstatedir localstatedir includedir \ oldincludedir docdir infodir htmldir dvidir pdfdir psdir \ libdir localedir mandir do eval ac_val=\$$ac_var # Remove trailing slashes. case $ac_val in */ ) ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'` eval $ac_var=\$ac_val;; esac # Be sure to have absolute directory names. case $ac_val in [\\/$]* | ?:[\\/]* ) continue;; NONE | '' ) case $ac_var in *prefix ) continue;; esac;; esac as_fn_error $? "expected an absolute directory name for --$ac_var: $ac_val" done # There might be people who depend on the old broken behavior: `$host' # used to hold the argument of --host etc. # FIXME: To remove some day. build=$build_alias host=$host_alias target=$target_alias # FIXME: To remove some day. if test "x$host_alias" != x; then if test "x$build_alias" = x; then cross_compiling=maybe elif test "x$build_alias" != "x$host_alias"; then cross_compiling=yes fi fi ac_tool_prefix= test -n "$host_alias" && ac_tool_prefix=$host_alias- test "$silent" = yes && exec 6>/dev/null ac_pwd=`pwd` && test -n "$ac_pwd" && ac_ls_di=`ls -di .` && ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` || as_fn_error $? "working directory cannot be determined" test "X$ac_ls_di" = "X$ac_pwd_ls_di" || as_fn_error $? "pwd does not report name of working directory" # Find the source files, if location was not specified. if test -z "$srcdir"; then ac_srcdir_defaulted=yes # Try the directory containing this script, then the parent directory. ac_confdir=`$as_dirname -- "$as_myself" || $as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_myself" : 'X\(//\)[^/]' \| \ X"$as_myself" : 'X\(//\)$' \| \ X"$as_myself" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_myself" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` srcdir=$ac_confdir if test ! -r "$srcdir/$ac_unique_file"; then srcdir=.. fi else ac_srcdir_defaulted=no fi if test ! -r "$srcdir/$ac_unique_file"; then test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .." as_fn_error $? "cannot find sources ($ac_unique_file) in $srcdir" fi ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work" ac_abs_confdir=`( cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error $? "$ac_msg" pwd)` # When building in place, set srcdir=. if test "$ac_abs_confdir" = "$ac_pwd"; then srcdir=. fi # Remove unnecessary trailing slashes from srcdir. # Double slashes in file names in object file debugging info # mess up M-x gdb in Emacs. case $srcdir in */) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;; esac for ac_var in $ac_precious_vars; do eval ac_env_${ac_var}_set=\${${ac_var}+set} eval ac_env_${ac_var}_value=\$${ac_var} eval ac_cv_env_${ac_var}_set=\${${ac_var}+set} eval ac_cv_env_${ac_var}_value=\$${ac_var} done # # Report the --help message. # if test "$ac_init_help" = "long"; then # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat <<_ACEOF \`configure' configures QjackCtl 0.4.2 to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... To assign environment variables (e.g., CC, CFLAGS...), specify them as VAR=VALUE. See below for descriptions of some of the useful variables. Defaults for the options are specified in brackets. Configuration: -h, --help display this help and exit --help=short display options specific to this package --help=recursive display the short help of all the included packages -V, --version display version information and exit -q, --quiet, --silent do not print \`checking ...' messages --cache-file=FILE cache test results in FILE [disabled] -C, --config-cache alias for \`--cache-file=config.cache' -n, --no-create do not create output files --srcdir=DIR find the sources in DIR [configure dir or \`..'] Installation directories: --prefix=PREFIX install architecture-independent files in PREFIX [$ac_default_prefix] --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX [PREFIX] By default, \`make install' will install all the files in \`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify an installation prefix other than \`$ac_default_prefix' using \`--prefix', for instance \`--prefix=\$HOME'. For better control, use the options below. Fine tuning of the installation directories: --bindir=DIR user executables [EPREFIX/bin] --sbindir=DIR system admin executables [EPREFIX/sbin] --libexecdir=DIR program executables [EPREFIX/libexec] --sysconfdir=DIR read-only single-machine data [PREFIX/etc] --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] --localstatedir=DIR modifiable single-machine data [PREFIX/var] --libdir=DIR object code libraries [EPREFIX/lib] --includedir=DIR C header files [PREFIX/include] --oldincludedir=DIR C header files for non-gcc [/usr/include] --datarootdir=DIR read-only arch.-independent data root [PREFIX/share] --datadir=DIR read-only architecture-independent data [DATAROOTDIR] --infodir=DIR info documentation [DATAROOTDIR/info] --localedir=DIR locale-dependent data [DATAROOTDIR/locale] --mandir=DIR man documentation [DATAROOTDIR/man] --docdir=DIR documentation root [DATAROOTDIR/doc/qjackctl] --htmldir=DIR html documentation [DOCDIR] --dvidir=DIR dvi documentation [DOCDIR] --pdfdir=DIR pdf documentation [DOCDIR] --psdir=DIR ps documentation [DOCDIR] _ACEOF cat <<\_ACEOF _ACEOF fi if test -n "$ac_init_help"; then case $ac_init_help in short | recursive ) echo "Configuration of QjackCtl 0.4.2:";; esac cat <<\_ACEOF Optional Features: --disable-option-checking ignore unrecognized --enable/--with options --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) --enable-FEATURE[=ARG] include FEATURE [ARG=yes] --enable-debug enable debugging (default=no) --enable-qt4 enable Qt4 build (default=no) --enable-qt5 enable Qt5 build (default=yes) --enable-system-tray enable system tray (default=yes) --enable-jack-midi enable JACK MIDI support (default=yes) --enable-jack-session enable JACK session support (default=yes) --enable-jack-port-aliases enable JACK port aliases support (default=yes) --enable-jack-metadata enable JACK metadata support (default=yes) --enable-jack-version enable JACK version support (default=no) --enable-alsa-seq enable ALSA/MIDI sequencer support (default=yes) --enable-portaudio enable PortAudio interface (default=yes) --enable-dbus enable D-Bus interface (default=yes) --enable-xunique enable X11 unique/single instance (default=yes) --enable-stacktrace enable debugger stack-trace (default=no) Optional Packages: --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) --with-qt4=PATH use alternate Qt4 install path --with-qt5=PATH use alternate Qt5 install path --with-jack=PATH use alternate JACK install path --with-alsa=PATH use alternate ALSA install path --with-portaudio=PATH use alternate PortAudio install path Some influential environment variables: CC C compiler command CFLAGS C compiler flags LDFLAGS linker flags, e.g. -L if you have libraries in a nonstandard directory LIBS libraries to pass to the linker, e.g. -l CPPFLAGS (Objective) C/C++ preprocessor flags, e.g. -I if you have headers in a nonstandard directory CPP C preprocessor CXX C++ compiler command CXXFLAGS C++ compiler flags CXXCPP C++ preprocessor Use these variables to override the choices made by `configure' or to help it to find libraries and programs with nonstandard names/locations. Report bugs to . _ACEOF ac_status=$? fi if test "$ac_init_help" = "recursive"; then # If there are subdirs, report their specific --help. for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue test -d "$ac_dir" || { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } || continue ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix cd "$ac_dir" || { ac_status=$?; continue; } # Check for guested configure. if test -f "$ac_srcdir/configure.gnu"; then echo && $SHELL "$ac_srcdir/configure.gnu" --help=recursive elif test -f "$ac_srcdir/configure"; then echo && $SHELL "$ac_srcdir/configure" --help=recursive else $as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2 fi || ac_status=$? cd "$ac_pwd" || { ac_status=$?; break; } done fi test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF QjackCtl configure 0.4.2 generated by GNU Autoconf 2.69 Copyright (C) 2012 Free Software Foundation, Inc. This configure script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it. _ACEOF exit fi ## ------------------------ ## ## Autoconf initialization. ## ## ------------------------ ## # ac_fn_c_try_compile LINENO # -------------------------- # Try to compile conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_compile # ac_fn_c_try_cpp LINENO # ---------------------- # Try to preprocess conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_cpp () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if { { ac_try="$ac_cpp conftest.$ac_ext" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } > conftest.i && { test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || test ! -s conftest.err }; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_cpp # ac_fn_cxx_try_compile LINENO # ---------------------------- # Try to compile conftest.$ac_ext, and return whether this succeeded. ac_fn_cxx_try_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_cxx_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_cxx_try_compile # ac_fn_cxx_try_cpp LINENO # ------------------------ # Try to preprocess conftest.$ac_ext, and return whether this succeeded. ac_fn_cxx_try_cpp () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if { { ac_try="$ac_cpp conftest.$ac_ext" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } > conftest.i && { test -z "$ac_cxx_preproc_warn_flag$ac_cxx_werror_flag" || test ! -s conftest.err }; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_cxx_try_cpp # ac_fn_cxx_try_link LINENO # ------------------------- # Try to link conftest.$ac_ext, and return whether this succeeded. ac_fn_cxx_try_link () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext conftest$ac_exeext if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_cxx_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && { test "$cross_compiling" = yes || test -x conftest$ac_exeext }; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would # interfere with the next link command; also delete a directory that is # left behind by Apple's compiler. We do this before executing the actions. rm -rf conftest.dSYM conftest_ipa8_conftest.oo eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_cxx_try_link # ac_fn_cxx_try_run LINENO # ------------------------ # Try to link conftest.$ac_ext, and return whether this succeeded. Assumes # that executables *can* be run. ac_fn_cxx_try_run () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { ac_try='./conftest$ac_exeext' { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; }; then : ac_retval=0 else $as_echo "$as_me: program exited with status $ac_status" >&5 $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=$ac_status fi rm -rf conftest.dSYM conftest_ipa8_conftest.oo eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_cxx_try_run # ac_fn_cxx_check_header_mongrel LINENO HEADER VAR INCLUDES # --------------------------------------------------------- # Tests whether HEADER exists, giving a warning if it cannot be compiled using # the include files in INCLUDES and setting the cache variable VAR # accordingly. ac_fn_cxx_check_header_mongrel () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if eval \${$3+:} false; then : { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } else # Is the header compilable? { $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 usability" >&5 $as_echo_n "checking $2 usability... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 #include <$2> _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_header_compiler=yes else ac_header_compiler=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_compiler" >&5 $as_echo "$ac_header_compiler" >&6; } # Is the header present? { $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 presence" >&5 $as_echo_n "checking $2 presence... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include <$2> _ACEOF if ac_fn_cxx_try_cpp "$LINENO"; then : ac_header_preproc=yes else ac_header_preproc=no fi rm -f conftest.err conftest.i conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_preproc" >&5 $as_echo "$ac_header_preproc" >&6; } # So? What about this header? case $ac_header_compiler:$ac_header_preproc:$ac_cxx_preproc_warn_flag in #(( yes:no: ) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&5 $as_echo "$as_me: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 $as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} ;; no:yes:* ) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: present but cannot be compiled" >&5 $as_echo "$as_me: WARNING: $2: present but cannot be compiled" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: check for missing prerequisite headers?" >&5 $as_echo "$as_me: WARNING: $2: check for missing prerequisite headers?" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: see the Autoconf documentation" >&5 $as_echo "$as_me: WARNING: $2: see the Autoconf documentation" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&5 $as_echo "$as_me: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 $as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} ( $as_echo "## ------------------------------ ## ## Report this to rncbc@rncbc.org ## ## ------------------------------ ##" ) | sed "s/^/$as_me: WARNING: /" >&2 ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else eval "$3=\$ac_header_compiler" fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_cxx_check_header_mongrel # ac_fn_cxx_check_header_compile LINENO HEADER VAR INCLUDES # --------------------------------------------------------- # Tests whether HEADER exists and can be compiled using the include files in # INCLUDES, setting the cache variable VAR accordingly. ac_fn_cxx_check_header_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 #include <$2> _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : eval "$3=yes" else eval "$3=no" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_cxx_check_header_compile # ac_fn_cxx_check_func LINENO FUNC VAR # ------------------------------------ # Tests whether FUNC exists, setting the cache variable VAR accordingly ac_fn_cxx_check_func () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Define $2 to an innocuous variant, in case declares $2. For example, HP-UX 11i declares gettimeofday. */ #define $2 innocuous_$2 /* System header to define __stub macros and hopefully few prototypes, which can conflict with char $2 (); below. Prefer to if __STDC__ is defined, since exists even on freestanding compilers. */ #ifdef __STDC__ # include #else # include #endif #undef $2 /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char $2 (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ #if defined __stub_$2 || defined __stub___$2 choke me #endif int main () { return $2 (); ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : eval "$3=yes" else eval "$3=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_cxx_check_func cat >config.log <<_ACEOF This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. It was created by QjackCtl $as_me 0.4.2, which was generated by GNU Autoconf 2.69. Invocation command line was $ $0 $@ _ACEOF exec 5>>config.log { cat <<_ASUNAME ## --------- ## ## Platform. ## ## --------- ## hostname = `(hostname || uname -n) 2>/dev/null | sed 1q` uname -m = `(uname -m) 2>/dev/null || echo unknown` uname -r = `(uname -r) 2>/dev/null || echo unknown` uname -s = `(uname -s) 2>/dev/null || echo unknown` uname -v = `(uname -v) 2>/dev/null || echo unknown` /usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown` /bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown` /bin/arch = `(/bin/arch) 2>/dev/null || echo unknown` /usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown` /usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown` /usr/bin/hostinfo = `(/usr/bin/hostinfo) 2>/dev/null || echo unknown` /bin/machine = `(/bin/machine) 2>/dev/null || echo unknown` /usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown` /bin/universe = `(/bin/universe) 2>/dev/null || echo unknown` _ASUNAME as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. $as_echo "PATH: $as_dir" done IFS=$as_save_IFS } >&5 cat >&5 <<_ACEOF ## ----------- ## ## Core tests. ## ## ----------- ## _ACEOF # Keep a trace of the command line. # Strip out --no-create and --no-recursion so they do not pile up. # Strip out --silent because we don't want to record it for future runs. # Also quote any args containing shell meta-characters. # Make two passes to allow for proper duplicate-argument suppression. ac_configure_args= ac_configure_args0= ac_configure_args1= ac_must_keep_next=false for ac_pass in 1 2 do for ac_arg do case $ac_arg in -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) continue ;; *\'*) ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; esac case $ac_pass in 1) as_fn_append ac_configure_args0 " '$ac_arg'" ;; 2) as_fn_append ac_configure_args1 " '$ac_arg'" if test $ac_must_keep_next = true; then ac_must_keep_next=false # Got value, back to normal. else case $ac_arg in *=* | --config-cache | -C | -disable-* | --disable-* \ | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \ | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \ | -with-* | --with-* | -without-* | --without-* | --x) case "$ac_configure_args0 " in "$ac_configure_args1"*" '$ac_arg' "* ) continue ;; esac ;; -* ) ac_must_keep_next=true ;; esac fi as_fn_append ac_configure_args " '$ac_arg'" ;; esac done done { ac_configure_args0=; unset ac_configure_args0;} { ac_configure_args1=; unset ac_configure_args1;} # When interrupted or exit'd, cleanup temporary files, and complete # config.log. We remove comments because anyway the quotes in there # would cause problems or look ugly. # WARNING: Use '\'' to represent an apostrophe within the trap. # WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug. trap 'exit_status=$? # Save into config.log some information that might help in debugging. { echo $as_echo "## ---------------- ## ## Cache variables. ## ## ---------------- ##" echo # The following way of writing the cache mishandles newlines in values, ( for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #( *${as_nl}ac_space=\ *) sed -n \ "s/'\''/'\''\\\\'\'''\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p" ;; #( *) sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) echo $as_echo "## ----------------- ## ## Output variables. ## ## ----------------- ##" echo for ac_var in $ac_subst_vars do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac $as_echo "$ac_var='\''$ac_val'\''" done | sort echo if test -n "$ac_subst_files"; then $as_echo "## ------------------- ## ## File substitutions. ## ## ------------------- ##" echo for ac_var in $ac_subst_files do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac $as_echo "$ac_var='\''$ac_val'\''" done | sort echo fi if test -s confdefs.h; then $as_echo "## ----------- ## ## confdefs.h. ## ## ----------- ##" echo cat confdefs.h echo fi test "$ac_signal" != 0 && $as_echo "$as_me: caught signal $ac_signal" $as_echo "$as_me: exit $exit_status" } >&5 rm -f core *.core core.conftest.* && rm -f -r conftest* confdefs* conf$$* $ac_clean_files && exit $exit_status ' 0 for ac_signal in 1 2 13 15; do trap 'ac_signal='$ac_signal'; as_fn_exit 1' $ac_signal done ac_signal=0 # confdefs.h avoids OS command line length limits that DEFS can exceed. rm -f -r conftest* confdefs.h $as_echo "/* confdefs.h */" > confdefs.h # Predefined preprocessor variables. cat >>confdefs.h <<_ACEOF #define PACKAGE_NAME "$PACKAGE_NAME" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_TARNAME "$PACKAGE_TARNAME" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_VERSION "$PACKAGE_VERSION" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_STRING "$PACKAGE_STRING" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_URL "$PACKAGE_URL" _ACEOF # Let the site file select an alternate cache file if it wants to. # Prefer an explicitly selected file to automatically selected ones. ac_site_file1=NONE ac_site_file2=NONE if test -n "$CONFIG_SITE"; then # We do not want a PATH search for config.site. case $CONFIG_SITE in #(( -*) ac_site_file1=./$CONFIG_SITE;; */*) ac_site_file1=$CONFIG_SITE;; *) ac_site_file1=./$CONFIG_SITE;; esac elif test "x$prefix" != xNONE; then ac_site_file1=$prefix/share/config.site ac_site_file2=$prefix/etc/config.site else ac_site_file1=$ac_default_prefix/share/config.site ac_site_file2=$ac_default_prefix/etc/config.site fi for ac_site_file in "$ac_site_file1" "$ac_site_file2" do test "x$ac_site_file" = xNONE && continue if test /dev/null != "$ac_site_file" && test -r "$ac_site_file"; then { $as_echo "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5 $as_echo "$as_me: loading site script $ac_site_file" >&6;} sed 's/^/| /' "$ac_site_file" >&5 . "$ac_site_file" \ || { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "failed to load site script $ac_site_file See \`config.log' for more details" "$LINENO" 5; } fi done if test -r "$cache_file"; then # Some versions of bash will fail to source /dev/null (special files # actually), so we avoid doing that. DJGPP emulates it as a regular file. if test /dev/null != "$cache_file" && test -f "$cache_file"; then { $as_echo "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5 $as_echo "$as_me: loading cache $cache_file" >&6;} case $cache_file in [\\/]* | ?:[\\/]* ) . "$cache_file";; *) . "./$cache_file";; esac fi else { $as_echo "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5 $as_echo "$as_me: creating cache $cache_file" >&6;} >$cache_file fi # Check that the precious variables saved in the cache have kept the same # value. ac_cache_corrupted=false for ac_var in $ac_precious_vars; do eval ac_old_set=\$ac_cv_env_${ac_var}_set eval ac_new_set=\$ac_env_${ac_var}_set eval ac_old_val=\$ac_cv_env_${ac_var}_value eval ac_new_val=\$ac_env_${ac_var}_value case $ac_old_set,$ac_new_set in set,) { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 $as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} ac_cache_corrupted=: ;; ,set) { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5 $as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} ac_cache_corrupted=: ;; ,);; *) if test "x$ac_old_val" != "x$ac_new_val"; then # differences in whitespace do not lead to failure. ac_old_val_w=`echo x $ac_old_val` ac_new_val_w=`echo x $ac_new_val` if test "$ac_old_val_w" != "$ac_new_val_w"; then { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5 $as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} ac_cache_corrupted=: else { $as_echo "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5 $as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;} eval $ac_var=\$ac_old_val fi { $as_echo "$as_me:${as_lineno-$LINENO}: former value: \`$ac_old_val'" >&5 $as_echo "$as_me: former value: \`$ac_old_val'" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: current value: \`$ac_new_val'" >&5 $as_echo "$as_me: current value: \`$ac_new_val'" >&2;} fi;; esac # Pass precious variables to config.status. if test "$ac_new_set" = set; then case $ac_new_val in *\'*) ac_arg=$ac_var=`$as_echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;; *) ac_arg=$ac_var=$ac_new_val ;; esac case " $ac_configure_args " in *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy. *) as_fn_append ac_configure_args " '$ac_arg'" ;; esac fi done if $ac_cache_corrupted; then { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5 $as_echo "$as_me: error: changes in the environment can compromise the build" >&2;} as_fn_error $? "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5 fi ## -------------------- ## ## Main body of script. ## ## -------------------- ## ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu ac_config_headers="$ac_config_headers src/config.h" ac_config_files="$ac_config_files Makefile qjackctl.spec src/src.pri src/qjackctl.desktop" # Set default installation prefix. ac_prefix=$prefix if test "x$ac_prefix" = "xNONE"; then ac_prefix=$ac_default_prefix fi cat >>confdefs.h <<_ACEOF #define CONFIG_PREFIX "$ac_prefix" _ACEOF # Enable debugging argument option. # Check whether --enable-debug was given. if test "${enable_debug+set}" = set; then : enableval=$enable_debug; ac_debug="$enableval" fi if test "x$ac_debug" = "xyes"; then $as_echo "#define CONFIG_DEBUG 1" >>confdefs.h ac_stacktrace="yes" ac_debug="debug" else ac_stacktrace="no" ac_debug="release" fi # Enable Qt4/5 availability. # Check whether --enable-qt4 was given. if test "${enable_qt4+set}" = set; then : enableval=$enable_qt4; ac_qt4="$enableval" else ac_qt4="no" fi # Check whether --enable-qt5 was given. if test "${enable_qt5+set}" = set; then : enableval=$enable_qt5; ac_qt5="$enableval" else ac_qt5="yes" fi # Disable system tray argument option. # Check whether --enable-system_tray was given. if test "${enable_system_tray+set}" = set; then : enableval=$enable_system_tray; ac_system_tray="$enableval" else ac_system_tray="yes" fi # Disable JACK MIDI support option. # Check whether --enable-jack_midi was given. if test "${enable_jack_midi+set}" = set; then : enableval=$enable_jack_midi; ac_jack_midi="$enableval" else ac_jack_midi="yes" fi # Enable JACK session support. # Check whether --enable-jack_session was given. if test "${enable_jack_session+set}" = set; then : enableval=$enable_jack_session; ac_jack_session="$enableval" else ac_jack_session="yes" fi # Enable JACK port aliases support. # Check whether --enable-jack_port_aliases was given. if test "${enable_jack_port_aliases+set}" = set; then : enableval=$enable_jack_port_aliases; ac_jack_port_aliases="$enableval" else ac_jack_port_aliases="yes" fi # Enable JACK metadata support. # Check whether --enable-jack_metadata was given. if test "${enable_jack_metadata+set}" = set; then : enableval=$enable_jack_metadata; ac_jack_metadata="$enableval" else ac_jack_metadata="yes" fi # Enable JACK version support. # Check whether --enable-jack_version was given. if test "${enable_jack_version+set}" = set; then : enableval=$enable_jack_version; ac_jack_version="$enableval" else ac_jack_version="no" fi # Disable ALSA sequencer support option. # Check whether --enable-alsa_seq was given. if test "${enable_alsa_seq+set}" = set; then : enableval=$enable_alsa_seq; ac_alsa_seq="$enableval" else ac_alsa_seq="yes" fi # Enable PortAudio argument option. # Check whether --enable-portaudio was given. if test "${enable_portaudio+set}" = set; then : enableval=$enable_portaudio; ac_portaudio="$enableval" else ac_portaudio="yes" fi # Enable D-Bus argument option. # Check whether --enable-dbus was given. if test "${enable_dbus+set}" = set; then : enableval=$enable_dbus; ac_dbus="$enableval" else ac_dbus="yes" fi if test "x$ac_dbus" = "xyes"; then $as_echo "#define CONFIG_DBUS 1" >>confdefs.h ac_qdbus="qdbus" fi # Enable X11 unique/single instance. # Check whether --enable-xunique was given. if test "${enable_xunique+set}" = set; then : enableval=$enable_xunique; ac_xunique="$enableval" else ac_xunique="yes" fi # Enable debugger stack-trace option (assumes --enable-debug). # Check whether --enable-stacktrace was given. if test "${enable_stacktrace+set}" = set; then : enableval=$enable_stacktrace; ac_stacktrace="$enableval" fi # Standard installation base dirs. ac_with_paths="/usr /usr/local" # Set for alternate Qt4/5 installation dir. # Check whether --with-qt4 was given. if test "${with_qt4+set}" = set; then : withval=$with_qt4; ac_qt4_path="$withval" else ac_qt4_path="no" fi # Check whether --with-qt5 was given. if test "${with_qt5+set}" = set; then : withval=$with_qt5; ac_qt5_path="$withval" else ac_qt5_path="no" fi if test "x$ac_qt4_path" != "xno"; then ac_with_paths="$ac_with_paths $ac_qt4_path" ac_qt4="yes" fi if test "x$ac_qt5_path" != "xno"; then ac_with_paths="$ac_with_paths $ac_qt5_path" ac_qt5="yes" fi if test "x$ac_qt5" = "xno"; then ac_qt4="yes" fi if test "x$ac_qt4" = "xyes"; then ac_qt5="no" fi # Set for alternate JACK installation dir. # Check whether --with-jack was given. if test "${with_jack+set}" = set; then : withval=$with_jack; ac_with_paths="$ac_with_paths $withval" fi # Set for alternate ALSA installation dir. # Check whether --with-alsa was given. if test "${with_alsa+set}" = set; then : withval=$with_alsa; ac_with_paths="$ac_with_paths $withval" fi # Set for alternate PortAudio installation dir. # Check whether --with-portaudio was given. if test "${with_portaudio+set}" = set; then : withval=$with_portaudio; ac_with_paths="$ac_with_paths $withval" fi # Honor user specified flags. ac_cflags=$CFLAGS ac_ldflags=$LDFLAGS # Checks for programs. ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. set dummy ${ac_tool_prefix}gcc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}gcc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_CC"; then ac_ct_CC=$CC # Extract the first word of "gcc", so it can be a program name with args. set dummy gcc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="gcc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi else CC="$ac_cv_prog_CC" fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. set dummy ${ac_tool_prefix}cc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}cc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi fi if test -z "$CC"; then # Extract the first word of "cc", so it can be a program name with args. set dummy cc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else ac_prog_rejected=no as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then ac_prog_rejected=yes continue fi ac_cv_prog_CC="cc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS if test $ac_prog_rejected = yes; then # We found a bogon in the path, so make sure we never use it. set dummy $ac_cv_prog_CC shift if test $# != 0; then # We chose a different compiler from the bogus one. # However, it has the same basename, so the bogon will be chosen # first if we set CC to just the basename; use the full file name. shift ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@" fi fi fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then for ac_prog in cl.exe do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$CC" && break done fi if test -z "$CC"; then ac_ct_CC=$CC for ac_prog in cl.exe do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_ct_CC" && break done if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi fi fi test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "no acceptable C compiler found in \$PATH See \`config.log' for more details" "$LINENO" 5; } # Provide some information about the compiler. $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 set X $ac_compile ac_compiler=$2 for ac_option in --version -v -V -qversion; do { { ac_try="$ac_compiler $ac_option >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compiler $ac_option >&5") 2>conftest.err ac_status=$? if test -s conftest.err; then sed '10a\ ... rest of stderr output deleted ... 10q' conftest.err >conftest.er1 cat conftest.er1 >&5 fi rm -f conftest.er1 conftest.err $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } done cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out" # Try to create an executable without -o first, disregard a.out. # It will help us diagnose broken compilers, and finding out an intuition # of exeext. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler works" >&5 $as_echo_n "checking whether the C compiler works... " >&6; } ac_link_default=`$as_echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'` # The possible output files: ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*" ac_rmfiles= for ac_file in $ac_files do case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; * ) ac_rmfiles="$ac_rmfiles $ac_file";; esac done rm -f $ac_rmfiles if { { ac_try="$ac_link_default" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link_default") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : # Autoconf-2.13 could set the ac_cv_exeext variable to `no'. # So ignore a value of `no', otherwise this would lead to `EXEEXT = no' # in a Makefile. We should not override ac_cv_exeext if it was cached, # so that the user can short-circuit this test for compilers unknown to # Autoconf. for ac_file in $ac_files '' do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; [ab].out ) # We found the default executable, but exeext='' is most # certainly right. break;; *.* ) if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no; then :; else ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` fi # We set ac_cv_exeext here because the later test for it is not # safe: cross compilers may not add the suffix if given an `-o' # argument, so we may need to know it at that point already. # Even if this section looks crufty: it has the advantage of # actually working. break;; * ) break;; esac done test "$ac_cv_exeext" = no && ac_cv_exeext= else ac_file='' fi if test -z "$ac_file"; then : { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error 77 "C compiler cannot create executables See \`config.log' for more details" "$LINENO" 5; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler default output file name" >&5 $as_echo_n "checking for C compiler default output file name... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5 $as_echo "$ac_file" >&6; } ac_exeext=$ac_cv_exeext rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out ac_clean_files=$ac_clean_files_save { $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5 $as_echo_n "checking for suffix of executables... " >&6; } if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : # If both `conftest.exe' and `conftest' are `present' (well, observable) # catch `conftest.exe'. For instance with Cygwin, `ls conftest' will # work properly (i.e., refer to `conftest.exe'), while it won't with # `rm'. for ac_file in conftest.exe conftest conftest.*; do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` break;; * ) break;; esac done else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot compute suffix of executables: cannot compile and link See \`config.log' for more details" "$LINENO" 5; } fi rm -f conftest conftest$ac_cv_exeext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5 $as_echo "$ac_cv_exeext" >&6; } rm -f conftest.$ac_ext EXEEXT=$ac_cv_exeext ac_exeext=$EXEEXT cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { FILE *f = fopen ("conftest.out", "w"); return ferror (f) || fclose (f) != 0; ; return 0; } _ACEOF ac_clean_files="$ac_clean_files conftest.out" # Check that the compiler produces executables we can run. If not, either # the compiler is broken, or we cross compile. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5 $as_echo_n "checking whether we are cross compiling... " >&6; } if test "$cross_compiling" != yes; then { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } if { ac_try='./conftest$ac_cv_exeext' { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; }; then cross_compiling=no else if test "$cross_compiling" = maybe; then cross_compiling=yes else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot run C compiled programs. If you meant to cross compile, use \`--host'. See \`config.log' for more details" "$LINENO" 5; } fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5 $as_echo "$cross_compiling" >&6; } rm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out ac_clean_files=$ac_clean_files_save { $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5 $as_echo_n "checking for suffix of object files... " >&6; } if ${ac_cv_objext+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF rm -f conftest.o conftest.obj if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : for ac_file in conftest.o conftest.obj conftest.*; do test -f "$ac_file" || continue; case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;; *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'` break;; esac done else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot compute suffix of object files: cannot compile See \`config.log' for more details" "$LINENO" 5; } fi rm -f conftest.$ac_cv_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5 $as_echo "$ac_cv_objext" >&6; } OBJEXT=$ac_cv_objext ac_objext=$OBJEXT { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5 $as_echo_n "checking whether we are using the GNU C compiler... " >&6; } if ${ac_cv_c_compiler_gnu+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { #ifndef __GNUC__ choke me #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_compiler_gnu=yes else ac_compiler_gnu=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_c_compiler_gnu=$ac_compiler_gnu fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5 $as_echo "$ac_cv_c_compiler_gnu" >&6; } if test $ac_compiler_gnu = yes; then GCC=yes else GCC= fi ac_test_CFLAGS=${CFLAGS+set} ac_save_CFLAGS=$CFLAGS { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 $as_echo_n "checking whether $CC accepts -g... " >&6; } if ${ac_cv_prog_cc_g+:} false; then : $as_echo_n "(cached) " >&6 else ac_save_c_werror_flag=$ac_c_werror_flag ac_c_werror_flag=yes ac_cv_prog_cc_g=no CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes else CFLAGS="" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : else ac_c_werror_flag=$ac_save_c_werror_flag CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_c_werror_flag=$ac_save_c_werror_flag fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5 $as_echo "$ac_cv_prog_cc_g" >&6; } if test "$ac_test_CFLAGS" = set; then CFLAGS=$ac_save_CFLAGS elif test $ac_cv_prog_cc_g = yes; then if test "$GCC" = yes; then CFLAGS="-g -O2" else CFLAGS="-g" fi else if test "$GCC" = yes; then CFLAGS="-O2" else CFLAGS= fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5 $as_echo_n "checking for $CC option to accept ISO C89... " >&6; } if ${ac_cv_prog_cc_c89+:} false; then : $as_echo_n "(cached) " >&6 else ac_cv_prog_cc_c89=no ac_save_CC=$CC cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include struct stat; /* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ struct buf { int x; }; FILE * (*rcsopen) (struct buf *, struct stat *, int); static char *e (p, i) char **p; int i; { return p[i]; } static char *f (char * (*g) (char **, int), char **p, ...) { char *s; va_list v; va_start (v,p); s = g (p, va_arg (v,int)); va_end (v); return s; } /* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has function prototypes and stuff, but not '\xHH' hex character constants. These don't provoke an error unfortunately, instead are silently treated as 'x'. The following induces an error, until -std is added to get proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an array size at least. It's necessary to write '\x00'==0 to get something that's true only with -std. */ int osf4_cc_array ['\x00' == 0 ? 1 : -1]; /* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters inside strings and character constants. */ #define FOO(x) 'x' int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1]; int test (int i, double x); struct s1 {int (*f) (int a);}; struct s2 {int (*f) (double a);}; int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); int argc; char **argv; int main () { return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; ; return 0; } _ACEOF for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \ -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" do CC="$ac_save_CC $ac_arg" if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_c89=$ac_arg fi rm -f core conftest.err conftest.$ac_objext test "x$ac_cv_prog_cc_c89" != "xno" && break done rm -f conftest.$ac_ext CC=$ac_save_CC fi # AC_CACHE_VAL case "x$ac_cv_prog_cc_c89" in x) { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 $as_echo "none needed" >&6; } ;; xno) { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 $as_echo "unsupported" >&6; } ;; *) CC="$CC $ac_cv_prog_cc_c89" { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 $as_echo "$ac_cv_prog_cc_c89" >&6; } ;; esac if test "x$ac_cv_prog_cc_c89" != xno; then : fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C preprocessor" >&5 $as_echo_n "checking how to run the C preprocessor... " >&6; } # On Suns, sometimes $CPP names a directory. if test -n "$CPP" && test -d "$CPP"; then CPP= fi if test -z "$CPP"; then if ${ac_cv_prog_CPP+:} false; then : $as_echo_n "(cached) " >&6 else # Double quotes because CPP needs to be expanded for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp" do ac_preproc_ok=false for ac_c_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok; then : break fi done ac_cv_prog_CPP=$CPP fi CPP=$ac_cv_prog_CPP else ac_cv_prog_CPP=$CPP fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CPP" >&5 $as_echo "$CPP" >&6; } ac_preproc_ok=false for ac_c_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok; then : else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "C preprocessor \"$CPP\" fails sanity check See \`config.log' for more details" "$LINENO" 5; } fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu if test -z "$CXX"; then if test -n "$CCC"; then CXX=$CCC else if test -n "$ac_tool_prefix"; then for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CXX+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CXX"; then ac_cv_prog_CXX="$CXX" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CXX="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CXX=$ac_cv_prog_CXX if test -n "$CXX"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CXX" >&5 $as_echo "$CXX" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$CXX" && break done fi if test -z "$CXX"; then ac_ct_CXX=$CXX for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CXX+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CXX"; then ac_cv_prog_ac_ct_CXX="$ac_ct_CXX" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CXX="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CXX=$ac_cv_prog_ac_ct_CXX if test -n "$ac_ct_CXX"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CXX" >&5 $as_echo "$ac_ct_CXX" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_ct_CXX" && break done if test "x$ac_ct_CXX" = x; then CXX="g++" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CXX=$ac_ct_CXX fi fi fi fi # Provide some information about the compiler. $as_echo "$as_me:${as_lineno-$LINENO}: checking for C++ compiler version" >&5 set X $ac_compile ac_compiler=$2 for ac_option in --version -v -V -qversion; do { { ac_try="$ac_compiler $ac_option >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compiler $ac_option >&5") 2>conftest.err ac_status=$? if test -s conftest.err; then sed '10a\ ... rest of stderr output deleted ... 10q' conftest.err >conftest.er1 cat conftest.er1 >&5 fi rm -f conftest.er1 conftest.err $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } done { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C++ compiler" >&5 $as_echo_n "checking whether we are using the GNU C++ compiler... " >&6; } if ${ac_cv_cxx_compiler_gnu+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { #ifndef __GNUC__ choke me #endif ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_compiler_gnu=yes else ac_compiler_gnu=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_cxx_compiler_gnu=$ac_compiler_gnu fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_cxx_compiler_gnu" >&5 $as_echo "$ac_cv_cxx_compiler_gnu" >&6; } if test $ac_compiler_gnu = yes; then GXX=yes else GXX= fi ac_test_CXXFLAGS=${CXXFLAGS+set} ac_save_CXXFLAGS=$CXXFLAGS { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CXX accepts -g" >&5 $as_echo_n "checking whether $CXX accepts -g... " >&6; } if ${ac_cv_prog_cxx_g+:} false; then : $as_echo_n "(cached) " >&6 else ac_save_cxx_werror_flag=$ac_cxx_werror_flag ac_cxx_werror_flag=yes ac_cv_prog_cxx_g=no CXXFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_cv_prog_cxx_g=yes else CXXFLAGS="" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : else ac_cxx_werror_flag=$ac_save_cxx_werror_flag CXXFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_cv_prog_cxx_g=yes fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cxx_werror_flag=$ac_save_cxx_werror_flag fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cxx_g" >&5 $as_echo "$ac_cv_prog_cxx_g" >&6; } if test "$ac_test_CXXFLAGS" = set; then CXXFLAGS=$ac_save_CXXFLAGS elif test $ac_cv_prog_cxx_g = yes; then if test "$GXX" = yes; then CXXFLAGS="-g -O2" else CXXFLAGS="-g" fi else if test "$GXX" = yes; then CXXFLAGS="-O2" else CXXFLAGS= fi fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C++ preprocessor" >&5 $as_echo_n "checking how to run the C++ preprocessor... " >&6; } if test -z "$CXXCPP"; then if ${ac_cv_prog_CXXCPP+:} false; then : $as_echo_n "(cached) " >&6 else # Double quotes because CXXCPP needs to be expanded for CXXCPP in "$CXX -E" "/lib/cpp" do ac_preproc_ok=false for ac_cxx_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if ac_fn_cxx_try_cpp "$LINENO"; then : else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_cxx_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok; then : break fi done ac_cv_prog_CXXCPP=$CXXCPP fi CXXCPP=$ac_cv_prog_CXXCPP else ac_cv_prog_CXXCPP=$CXXCPP fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CXXCPP" >&5 $as_echo "$CXXCPP" >&6; } ac_preproc_ok=false for ac_cxx_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if ac_fn_cxx_try_cpp "$LINENO"; then : else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_cxx_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok; then : else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "C++ preprocessor \"$CXXCPP\" fails sanity check See \`config.log' for more details" "$LINENO" 5; } fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5 $as_echo_n "checking for grep that handles long lines and -e... " >&6; } if ${ac_cv_path_GREP+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$GREP"; then ac_path_GREP_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in grep ggrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_GREP" || continue # Check for GNU ac_path_GREP and select it if it is found. # Check for GNU $ac_path_GREP case `"$ac_path_GREP" --version 2>&1` in *GNU*) ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo 'GREP' >> "conftest.nl" "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_GREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_GREP_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_GREP"; then as_fn_error $? "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_GREP=$GREP fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5 $as_echo "$ac_cv_path_GREP" >&6; } GREP="$ac_cv_path_GREP" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5 $as_echo_n "checking for egrep... " >&6; } if ${ac_cv_path_EGREP+:} false; then : $as_echo_n "(cached) " >&6 else if echo a | $GREP -E '(a|b)' >/dev/null 2>&1 then ac_cv_path_EGREP="$GREP -E" else if test -z "$EGREP"; then ac_path_EGREP_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in egrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_EGREP" || continue # Check for GNU ac_path_EGREP and select it if it is found. # Check for GNU $ac_path_EGREP case `"$ac_path_EGREP" --version 2>&1` in *GNU*) ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo 'EGREP' >> "conftest.nl" "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_EGREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_EGREP_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_EGREP"; then as_fn_error $? "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_EGREP=$EGREP fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5 $as_echo "$ac_cv_path_EGREP" >&6; } EGREP="$ac_cv_path_EGREP" if test $ac_cv_c_compiler_gnu = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC needs -traditional" >&5 $as_echo_n "checking whether $CC needs -traditional... " >&6; } if ${ac_cv_prog_gcc_traditional+:} false; then : $as_echo_n "(cached) " >&6 else ac_pattern="Autoconf.*'x'" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include Autoconf TIOCGETP _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "$ac_pattern" >/dev/null 2>&1; then : ac_cv_prog_gcc_traditional=yes else ac_cv_prog_gcc_traditional=no fi rm -f conftest* if test $ac_cv_prog_gcc_traditional = no; then cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include Autoconf TCGETA _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "$ac_pattern" >/dev/null 2>&1; then : ac_cv_prog_gcc_traditional=yes fi rm -f conftest* fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_gcc_traditional" >&5 $as_echo "$ac_cv_prog_gcc_traditional" >&6; } if test $ac_cv_prog_gcc_traditional = yes; then CC="$CC -traditional" fi fi # Checks for languages. ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu # Check for proper flags. ac_arch=`uname -m` # Check for install paths and alternatives... ac_libdirs="lib" if test "x$ac_arch" = "xx86_64"; then ac_libdirs="$ac_libdirs lib64" fi CFLAGS="-fPIC $CFLAGS" CPPFLAGS="-fPIC $CPPFLAGS" # Prepend alternate dependencies paths. ac_path=$PATH for X in $ac_with_paths; do if test -d $X/bin; then ac_path="$X/bin:$ac_path" fi if test -d $X/include; then CFLAGS="-I$X/include $CFLAGS " CPPFLAGS="-I$X/include $CPPFLAGS" ac_incpath="$X/include $ac_incpath" fi for Y in $ac_libdirs; do if test -d $X/$Y; then LIBS="-L$X/$Y $LIBS" ac_libs="-L$X/$Y $ac_libs" fi done done # A common error message: ac_errmsg="not found in current PATH. Maybe QT development environment isn't available." if test "x$ac_qt4" = "xyes"; then # Extract the first word of "qmake-qt4", so it can be a program name with args. set dummy qmake-qt4; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_ac_qmake+:} false; then : $as_echo_n "(cached) " >&6 else case $ac_qmake in [\\/]* | ?:[\\/]*) ac_cv_path_ac_qmake="$ac_qmake" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $ac_path do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_ac_qmake="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS test -z "$ac_cv_path_ac_qmake" && ac_cv_path_ac_qmake="no" ;; esac fi ac_qmake=$ac_cv_path_ac_qmake if test -n "$ac_qmake"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_qmake" >&5 $as_echo "$ac_qmake" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test "x$ac_qt5" = "xyes"; then # Extract the first word of "qmake-qt5", so it can be a program name with args. set dummy qmake-qt5; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_ac_qmake+:} false; then : $as_echo_n "(cached) " >&6 else case $ac_qmake in [\\/]* | ?:[\\/]*) ac_cv_path_ac_qmake="$ac_qmake" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $ac_path do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_ac_qmake="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS test -z "$ac_cv_path_ac_qmake" && ac_cv_path_ac_qmake="no" ;; esac fi ac_qmake=$ac_cv_path_ac_qmake if test -n "$ac_qmake"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_qmake" >&5 $as_echo "$ac_qmake" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test "x$ac_qmake" = "xno"; then # Extract the first word of "qmake", so it can be a program name with args. set dummy qmake; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_ac_cv_qmake+:} false; then : $as_echo_n "(cached) " >&6 else case $ac_cv_qmake in [\\/]* | ?:[\\/]*) ac_cv_path_ac_cv_qmake="$ac_cv_qmake" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $ac_path do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_ac_cv_qmake="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS test -z "$ac_cv_path_ac_cv_qmake" && ac_cv_path_ac_cv_qmake="no" ;; esac fi ac_cv_qmake=$ac_cv_path_ac_cv_qmake if test -n "$ac_cv_qmake"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_qmake" >&5 $as_echo "$ac_cv_qmake" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi ac_qmake=$ac_cv_qmake fi if test "x$ac_qmake" = "xno"; then as_fn_error $? "qmake $ac_errmsg" "$LINENO" 5 fi # Check for proper Qt4/5 major version. ac_qt_version_major=`$ac_qmake -query QT_VERSION | cut -d. -f1` if test "x$ac_qt4" = "xyes" -a "x$ac_qt_version_major" != "x4"; then as_fn_error $? "qmake-qt4 $ac_errmsg (qt4-devel)" "$LINENO" 5 fi if test "x$ac_qt5" = "xyes" -a "x$ac_qt_version_major" != "x5"; then as_fn_error $? "qmake-qt5 $ac_errmsg (qt5-devel)" "$LINENO" 5 fi ac_qt_install_bins=`$ac_qmake -query QT_INSTALL_BINS` if test -d $ac_qt_install_bins; then ac_path="$ac_qt_install_bins:$ac_path" fi # Check it again, now with updated PATH, just in case... # Extract the first word of "qmake", so it can be a program name with args. set dummy qmake; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_ac_cv_qmake+:} false; then : $as_echo_n "(cached) " >&6 else case $ac_cv_qmake in [\\/]* | ?:[\\/]*) ac_cv_path_ac_cv_qmake="$ac_cv_qmake" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $ac_path do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_ac_cv_qmake="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS test -z "$ac_cv_path_ac_cv_qmake" && ac_cv_path_ac_cv_qmake="no" ;; esac fi ac_cv_qmake=$ac_cv_path_ac_cv_qmake if test -n "$ac_cv_qmake"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_qmake" >&5 $as_echo "$ac_cv_qmake" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi ac_qmake=$ac_cv_qmake if test "x$ac_qmake" = "xno"; then as_fn_error $? "qmake $ac_errmsg" "$LINENO" 5 fi ac_qt_install_headers=`$ac_qmake -query QT_INSTALL_HEADERS` if test -d $ac_qt_install_headers; then CFLAGS="-I$ac_qt_install_headers $CFLAGS " CPPFLAGS="-I$ac_qt_install_headers $CPPFLAGS" ac_incpath="$ac_qt_install_headers $ac_incpath" fi ac_qt_install_libs=`$ac_qmake -query QT_INSTALL_LIBS` if test -d $ac_qt_install_libs; then LIBS="-L$ac_qt_install_libs $LIBS" ac_libs="-L$ac_qt_install_libs $ac_libs" fi # Check for proper Qt4/5 version. if test "x$ac_qt4" = "xyes"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Qt library version >= 4.4" >&5 $as_echo_n "checking for Qt library version >= 4.4... " >&6; } if ${ac_cv_qtversion+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include "QtCore/qglobal.h" int main () { #if QT_VERSION < 0x040400 || QT_VERSION >= 0x050000 #error Qt library 4.4 or greater required. #endif ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_cv_qtversion="yes" else echo "no; Qt 4.4 or greater is required" exit 1 fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_qtversion" >&5 $as_echo "$ac_cv_qtversion" >&6; } fi if test "x$ac_qt5" = "xyes"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Qt library version >= 5.1" >&5 $as_echo_n "checking for Qt library version >= 5.1... " >&6; } if ${ac_cv_qtversion+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include "QtCore/qglobal.h" int main () { #if QT_VERSION < 0x050100 || QT_VERSION >= 0x060000 #error Qt library 5.1 or greater required. #endif ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_cv_qtversion="yes" else echo "no; Qt 5.1 or greater is required" exit 1 fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_qtversion" >&5 $as_echo "$ac_cv_qtversion" >&6; } fi # Check for Qt moc utility. # Extract the first word of "moc", so it can be a program name with args. set dummy moc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_ac_moc+:} false; then : $as_echo_n "(cached) " >&6 else case $ac_moc in [\\/]* | ?:[\\/]*) ac_cv_path_ac_moc="$ac_moc" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $ac_path do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_ac_moc="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS test -z "$ac_cv_path_ac_moc" && ac_cv_path_ac_moc="no" ;; esac fi ac_moc=$ac_cv_path_ac_moc if test -n "$ac_moc"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_moc" >&5 $as_echo "$ac_moc" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_moc" = "xno"; then as_fn_error $? "moc $ac_errmsg" "$LINENO" 5 fi # Check for Qt uic utility. # Extract the first word of "uic", so it can be a program name with args. set dummy uic; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_ac_uic+:} false; then : $as_echo_n "(cached) " >&6 else case $ac_uic in [\\/]* | ?:[\\/]*) ac_cv_path_ac_uic="$ac_uic" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $ac_path do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_ac_uic="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS test -z "$ac_cv_path_ac_uic" && ac_cv_path_ac_uic="no" ;; esac fi ac_uic=$ac_cv_path_ac_uic if test -n "$ac_uic"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_uic" >&5 $as_echo "$ac_uic" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_uic" = "xno"; then as_fn_error $? "uic $ac_errmsg" "$LINENO" 5 fi # Check for Qt lupdate utility. # Extract the first word of "lupdate", so it can be a program name with args. set dummy lupdate; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_ac_lupdate+:} false; then : $as_echo_n "(cached) " >&6 else case $ac_lupdate in [\\/]* | ?:[\\/]*) ac_cv_path_ac_lupdate="$ac_lupdate" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $ac_path do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_ac_lupdate="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS test -z "$ac_cv_path_ac_lupdate" && ac_cv_path_ac_lupdate="no" ;; esac fi ac_lupdate=$ac_cv_path_ac_lupdate if test -n "$ac_lupdate"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_lupdate" >&5 $as_echo "$ac_lupdate" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_lupdate" = "xno"; then as_fn_error $? "lupdate $ac_errmsg" "$LINENO" 5 fi # Check for Qt lrelease utility. # Extract the first word of "lrelease", so it can be a program name with args. set dummy lrelease; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_ac_lrelease+:} false; then : $as_echo_n "(cached) " >&6 else case $ac_lrelease in [\\/]* | ?:[\\/]*) ac_cv_path_ac_lrelease="$ac_lrelease" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $ac_path do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_ac_lrelease="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS test -z "$ac_cv_path_ac_lrelease" && ac_cv_path_ac_lrelease="no" ;; esac fi ac_lrelease=$ac_cv_path_ac_lrelease if test -n "$ac_lrelease"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_lrelease" >&5 $as_echo "$ac_lrelease" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_release" = "xno"; then as_fn_error $? "lrelease $ac_errmsg" "$LINENO" 5 fi # Checks for libraries. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for main in -lm" >&5 $as_echo_n "checking for main in -lm... " >&6; } if ${ac_cv_lib_m_main+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lm $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { return main (); ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : ac_cv_lib_m_main=yes else ac_cv_lib_m_main=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_m_main" >&5 $as_echo "$ac_cv_lib_m_main" >&6; } if test "x$ac_cv_lib_m_main" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_LIBM 1 _ACEOF LIBS="-lm $LIBS" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for main in -lX11" >&5 $as_echo_n "checking for main in -lX11... " >&6; } if ${ac_cv_lib_X11_main+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lX11 $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { return main (); ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : ac_cv_lib_X11_main=yes else ac_cv_lib_X11_main=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_X11_main" >&5 $as_echo "$ac_cv_lib_X11_main" >&6; } if test "x$ac_cv_lib_X11_main" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_LIBX11 1 _ACEOF LIBS="-lX11 $LIBS" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for main in -lXext" >&5 $as_echo_n "checking for main in -lXext... " >&6; } if ${ac_cv_lib_Xext_main+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lXext $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { return main (); ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : ac_cv_lib_Xext_main=yes else ac_cv_lib_Xext_main=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_Xext_main" >&5 $as_echo "$ac_cv_lib_Xext_main" >&6; } if test "x$ac_cv_lib_Xext_main" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_LIBXEXT 1 _ACEOF LIBS="-lXext $LIBS" fi # Check for round math function. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for lroundf in -lm" >&5 $as_echo_n "checking for lroundf in -lm... " >&6; } if ${ac_cv_lib_m_lroundf+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lm $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char lroundf (); int main () { return lroundf (); ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : ac_cv_lib_m_lroundf=yes else ac_cv_lib_m_lroundf=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_m_lroundf" >&5 $as_echo "$ac_cv_lib_m_lroundf" >&6; } if test "x$ac_cv_lib_m_lroundf" = xyes; then : ac_round="yes" else ac_round="no" fi if test "x$ac_round" = "xyes"; then $as_echo "#define CONFIG_ROUND 1" >>confdefs.h fi # Check for JACK libraries. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for main in -ljack" >&5 $as_echo_n "checking for main in -ljack... " >&6; } if ${ac_cv_lib_jack_main+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ljack $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { return main (); ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : ac_cv_lib_jack_main=yes else ac_cv_lib_jack_main=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_jack_main" >&5 $as_echo "$ac_cv_lib_jack_main" >&6; } if test "x$ac_cv_lib_jack_main" = xyes; then : ac_jack_lib="yes" else ac_jack_lib="no" fi if test "x$ac_jack_lib" = "xno"; then as_fn_error $? "JACK library not found." "$LINENO" 5 fi ac_libs="$ac_libs -ljack" # Check for ALSA libraries and primarily # for ALSA/MIDI sequencer support. if test "x$ac_alsa_seq" = "xyes"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for main in -lasound" >&5 $as_echo_n "checking for main in -lasound... " >&6; } if ${ac_cv_lib_asound_main+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lasound $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { return main (); ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : ac_cv_lib_asound_main=yes else ac_cv_lib_asound_main=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_asound_main" >&5 $as_echo "$ac_cv_lib_asound_main" >&6; } if test "x$ac_cv_lib_asound_main" = xyes; then : ac_alsa_lib="yes" else ac_alsa_lib="no" fi if test "x$ac_alsa_lib" = "xno"; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** ALSA library not found." >&5 $as_echo "$as_me: WARNING: *** ALSA library not found." >&2;} ac_alsa_seq="no" else ac_libs="$ac_libs -lasound" fi fi if test "x$ac_portaudio" = "xyes"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for main in -lportaudio" >&5 $as_echo_n "checking for main in -lportaudio... " >&6; } if ${ac_cv_lib_portaudio_main+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lportaudio $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { return main (); ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : ac_cv_lib_portaudio_main=yes else ac_cv_lib_portaudio_main=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_portaudio_main" >&5 $as_echo "$ac_cv_lib_portaudio_main" >&6; } if test "x$ac_cv_lib_portaudio_main" = xyes; then : ac_portaudio_lib="yes" else ac_portaudio_lib="no" fi if test "x$ac_portaudio_lib" = "xno"; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** PortAudio library not found." >&5 $as_echo "$as_me: WARNING: *** PortAudio library not found." >&2;} ac_portaudio="no" else ac_libs="$ac_libs -lportaudio" fi fi # Checks for header files. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5 $as_echo_n "checking for ANSI C header files... " >&6; } if ${ac_cv_header_stdc+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include #include int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_cv_header_stdc=yes else ac_cv_header_stdc=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext if test $ac_cv_header_stdc = yes; then # SunOS 4.x string.h does not declare mem*, contrary to ANSI. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "memchr" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "free" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. if test "$cross_compiling" = yes; then : : else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #if ((' ' & 0x0FF) == 0x020) # define ISLOWER(c) ('a' <= (c) && (c) <= 'z') # define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) #else # define ISLOWER(c) \ (('a' <= (c) && (c) <= 'i') \ || ('j' <= (c) && (c) <= 'r') \ || ('s' <= (c) && (c) <= 'z')) # define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c)) #endif #define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) int main () { int i; for (i = 0; i < 256; i++) if (XOR (islower (i), ISLOWER (i)) || toupper (i) != TOUPPER (i)) return 2; return 0; } _ACEOF if ac_fn_cxx_try_run "$LINENO"; then : else ac_cv_header_stdc=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5 $as_echo "$ac_cv_header_stdc" >&6; } if test $ac_cv_header_stdc = yes; then $as_echo "#define STDC_HEADERS 1" >>confdefs.h fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for sys/wait.h that is POSIX.1 compatible" >&5 $as_echo_n "checking for sys/wait.h that is POSIX.1 compatible... " >&6; } if ${ac_cv_header_sys_wait_h+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #ifndef WEXITSTATUS # define WEXITSTATUS(stat_val) ((unsigned int) (stat_val) >> 8) #endif #ifndef WIFEXITED # define WIFEXITED(stat_val) (((stat_val) & 255) == 0) #endif int main () { int s; wait (&s); s = WIFEXITED (s) ? WEXITSTATUS (s) : 1; ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_cv_header_sys_wait_h=yes else ac_cv_header_sys_wait_h=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_sys_wait_h" >&5 $as_echo "$ac_cv_header_sys_wait_h" >&6; } if test $ac_cv_header_sys_wait_h = yes; then $as_echo "#define HAVE_SYS_WAIT_H 1" >>confdefs.h fi # On IRIX 5.3, sys/types and inttypes.h are conflicting. for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \ inttypes.h stdint.h unistd.h do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_cxx_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default " if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done for ac_header in fcntl.h sys/ioctl.h unistd.h poll.h signal.h do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_cxx_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default" if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done # Check for JACK headers. ac_fn_cxx_check_header_mongrel "$LINENO" "jack/jack.h" "ac_cv_header_jack_jack_h" "$ac_includes_default" if test "x$ac_cv_header_jack_jack_h" = xyes; then : ac_jack_h="yes" else ac_jack_h="no" fi if test "x$ac_jack_h" = "xno"; then as_fn_error $? "JACK headers not found." "$LINENO" 5 fi # Check for jack/statistics.h header. ac_fn_cxx_check_header_mongrel "$LINENO" "jack/statistics.h" "ac_cv_header_jack_statistics_h" "$ac_includes_default" if test "x$ac_cv_header_jack_statistics_h" = xyes; then : ac_jack_statistics_h="yes" else ac_jack_statistics_h="no" fi if test "x$ac_jack_statistics_h" = "xyes"; then $as_echo "#define CONFIG_JACK_STATISTICS 1" >>confdefs.h fi # Check for CoreAudio/CoreAudio.h header (MacOSX). ac_fn_cxx_check_header_mongrel "$LINENO" "CoreAudio/CoreAudio.h" "ac_cv_header_CoreAudio_CoreAudio_h" "$ac_includes_default" if test "x$ac_cv_header_CoreAudio_CoreAudio_h" = xyes; then : ac_coreaudio="yes" else ac_coreaudio="no" fi if test "x$ac_coreaudio" = "xyes"; then $as_echo "#define CONFIG_COREAUDIO 1" >>confdefs.h ac_alsa_seq="no" ac_libs="$ac_libs -framework CoreAudio -framework CoreFoundation" fi # Check for JACK MIDI headers availability. if test "x$ac_jack_midi" = "xyes"; then ac_fn_cxx_check_header_mongrel "$LINENO" "jack/midiport.h" "ac_cv_header_jack_midiport_h" "$ac_includes_default" if test "x$ac_cv_header_jack_midiport_h" = xyes; then : ac_jack_midi="yes" else ac_jack_midi="no" fi if test "x$ac_jack_midi" = "xyes"; then $as_echo "#define CONFIG_JACK_MIDI 1" >>confdefs.h else { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** jack/midiport.h file not found." >&5 $as_echo "$as_me: WARNING: *** jack/midiport.h file not found." >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** JACK 0.103.0 or later may be required." >&5 $as_echo "$as_me: WARNING: *** JACK 0.103.0 or later may be required." >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** JACK MIDI support will be disabled." >&5 $as_echo "$as_me: WARNING: *** JACK MIDI support will be disabled." >&2;} fi fi # Check for JACK session headers availability. if test "x$ac_jack_session" = "xyes"; then ac_fn_cxx_check_header_mongrel "$LINENO" "jack/session.h" "ac_cv_header_jack_session_h" "$ac_includes_default" if test "x$ac_cv_header_jack_session_h" = xyes; then : ac_jack_session="yes" else ac_jack_session="no" fi if test "x$ac_jack_session" = "xyes"; then $as_echo "#define CONFIG_JACK_SESSION 1" >>confdefs.h else { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** jack/session.h file not found." >&5 $as_echo "$as_me: WARNING: *** jack/session.h file not found." >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** JACK 0.118.3 or later may be required." >&5 $as_echo "$as_me: WARNING: *** JACK 0.118.3 or later may be required." >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** JACK session support will be disabled." >&5 $as_echo "$as_me: WARNING: *** JACK session support will be disabled." >&2;} fi fi # Check for JACK metadata headers availability. if test "x$ac_jack_metadata" = "xyes"; then ac_fn_cxx_check_header_mongrel "$LINENO" "jack/metadata.h" "ac_cv_header_jack_metadata_h" "$ac_includes_default" if test "x$ac_cv_header_jack_metadata_h" = xyes; then : ac_jack_metadata="yes" else ac_jack_metadata="no" fi if test "x$ac_jack_metadata" = "xyes"; then $as_echo "#define CONFIG_JACK_METADATA 1" >>confdefs.h else { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** jack/metadata.h file not found." >&5 $as_echo "$as_me: WARNING: *** jack/metadata.h file not found." >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** JACK 0.124.1 or later may be required." >&5 $as_echo "$as_me: WARNING: *** JACK 0.124.1 or later may be required." >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** JACK metadata support will be disabled." >&5 $as_echo "$as_me: WARNING: *** JACK metadata support will be disabled." >&2;} fi fi # Check for ALSA headers and ultimately # for ALSA/MIDI sequencer support. if test "x$ac_alsa_seq" = "xyes"; then ac_fn_cxx_check_header_mongrel "$LINENO" "alsa/asoundlib.h" "ac_cv_header_alsa_asoundlib_h" "$ac_includes_default" if test "x$ac_cv_header_alsa_asoundlib_h" = xyes; then : ac_alsa_h="yes" else ac_alsa_h="no" fi if test "x$ac_alsa_h" = "xyes"; then $as_echo "#define CONFIG_ALSA_SEQ 1" >>confdefs.h else { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** ALSA headers not found." >&5 $as_echo "$as_me: WARNING: *** ALSA headers not found." >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** ALSA/MIDI sequencer support will be disabled." >&5 $as_echo "$as_me: WARNING: *** ALSA/MIDI sequencer support will be disabled." >&2;} ac_alsa_seq="no" fi fi # Check for PortAudio headers and library support. if test "x$ac_portaudio" = "xyes"; then ac_fn_cxx_check_header_mongrel "$LINENO" "portaudio.h" "ac_cv_header_portaudio_h" "$ac_includes_default" if test "x$ac_cv_header_portaudio_h" = xyes; then : ac_portaudio_h="yes" else ac_portaudio_h="no" fi if test "x$ac_portaudio_h" = "xyes"; then $as_echo "#define CONFIG_PORTAUDIO 1" >>confdefs.h else { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** PortAudio headers not found." >&5 $as_echo "$as_me: WARNING: *** PortAudio headers not found." >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** PortAudio interface support will be disabled." >&5 $as_echo "$as_me: WARNING: *** PortAudio interface support will be disabled." >&2;} ac_portaudio="no" fi fi # Check for X11 unique/single instance. if test "x$ac_xunique" = "xyes"; then $as_echo "#define CONFIG_XUNIQUE 1" >>confdefs.h # Some recent distros (eg. fedora, debian) require this. ac_libs="$ac_libs -lX11" fi # Check for debugging stack-trace. if test "x$ac_stacktrace" = "xyes"; then $as_echo "#define CONFIG_STACKTRACE 1" >>confdefs.h fi # Checks for typedefs, structures, and compiler characteristics. # AC_C_CONST # Checks for library functions. for ac_func in system do : ac_fn_cxx_check_func "$LINENO" "system" "ac_cv_func_system" if test "x$ac_cv_func_system" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_SYSTEM 1 _ACEOF fi done # Check for system-tray icon. if test "x$ac_system_tray" = "xyes"; then $as_echo "#define CONFIG_SYSTEM_TRAY 1" >>confdefs.h fi # Check for jack_transport_query function. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for jack_transport_query in -ljack" >&5 $as_echo_n "checking for jack_transport_query in -ljack... " >&6; } if ${ac_cv_lib_jack_jack_transport_query+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ljack $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char jack_transport_query (); int main () { return jack_transport_query (); ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : ac_cv_lib_jack_jack_transport_query=yes else ac_cv_lib_jack_jack_transport_query=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_jack_jack_transport_query" >&5 $as_echo "$ac_cv_lib_jack_jack_transport_query" >&6; } if test "x$ac_cv_lib_jack_jack_transport_query" = xyes; then : ac_jack_transport="yes" else ac_jack_transport="no" fi if test "x$ac_jack_transport" = "xno"; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** jack_transport_query: function not found." >&5 $as_echo "$as_me: WARNING: *** jack_transport_query: function not found." >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** JACK 0.80.0 or later may be required." >&5 $as_echo "$as_me: WARNING: *** JACK 0.80.0 or later may be required." >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** Transport features will be disabled." >&5 $as_echo "$as_me: WARNING: *** Transport features will be disabled." >&2;} else $as_echo "#define CONFIG_JACK_TRANSPORT 1" >>confdefs.h fi # Check for jack_is_realtime function. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for jack_is_realtime in -ljack" >&5 $as_echo_n "checking for jack_is_realtime in -ljack... " >&6; } if ${ac_cv_lib_jack_jack_is_realtime+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ljack $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char jack_is_realtime (); int main () { return jack_is_realtime (); ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : ac_cv_lib_jack_jack_is_realtime=yes else ac_cv_lib_jack_jack_is_realtime=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_jack_jack_is_realtime" >&5 $as_echo "$ac_cv_lib_jack_jack_is_realtime" >&6; } if test "x$ac_cv_lib_jack_jack_is_realtime" = xyes; then : ac_jack_realtime="yes" else ac_jack_realtime="no" fi if test "x$ac_jack_realtime" = "xyes"; then $as_echo "#define CONFIG_JACK_REALTIME 1" >>confdefs.h fi # Check for jack_get_xrun_delayed_usecs function. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for jack_get_xrun_delayed_usecs in -ljack" >&5 $as_echo_n "checking for jack_get_xrun_delayed_usecs in -ljack... " >&6; } if ${ac_cv_lib_jack_jack_get_xrun_delayed_usecs+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ljack $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char jack_get_xrun_delayed_usecs (); int main () { return jack_get_xrun_delayed_usecs (); ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : ac_cv_lib_jack_jack_get_xrun_delayed_usecs=yes else ac_cv_lib_jack_jack_get_xrun_delayed_usecs=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_jack_jack_get_xrun_delayed_usecs" >&5 $as_echo "$ac_cv_lib_jack_jack_get_xrun_delayed_usecs" >&6; } if test "x$ac_cv_lib_jack_jack_get_xrun_delayed_usecs" = xyes; then : ac_jack_xrun_delay="yes" else ac_jack_xrun_delay="no" fi if test "x$ac_jack_xrun_delay" = "xyes"; then $as_echo "#define CONFIG_JACK_XRUN_DELAY 1" >>confdefs.h fi # Check for jack_get_max_delayed_usecs function. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for jack_get_max_delayed_usecs in -ljack" >&5 $as_echo_n "checking for jack_get_max_delayed_usecs in -ljack... " >&6; } if ${ac_cv_lib_jack_jack_get_max_delayed_usecs+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ljack $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char jack_get_max_delayed_usecs (); int main () { return jack_get_max_delayed_usecs (); ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : ac_cv_lib_jack_jack_get_max_delayed_usecs=yes else ac_cv_lib_jack_jack_get_max_delayed_usecs=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_jack_jack_get_max_delayed_usecs" >&5 $as_echo "$ac_cv_lib_jack_jack_get_max_delayed_usecs" >&6; } if test "x$ac_cv_lib_jack_jack_get_max_delayed_usecs" = xyes; then : ac_jack_max_delay="yes" else ac_jack_max_delay="no" fi if test "x$ac_jack_max_delay" = "xyes"; then $as_echo "#define CONFIG_JACK_MAX_DELAY 1" >>confdefs.h fi # Check for jack_port_get_aliases function. if test "x$ac_jack_port_aliases" = "xyes"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for jack_port_get_aliases in -ljack" >&5 $as_echo_n "checking for jack_port_get_aliases in -ljack... " >&6; } if ${ac_cv_lib_jack_jack_port_get_aliases+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ljack $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char jack_port_get_aliases (); int main () { return jack_port_get_aliases (); ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : ac_cv_lib_jack_jack_port_get_aliases=yes else ac_cv_lib_jack_jack_port_get_aliases=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_jack_jack_port_get_aliases" >&5 $as_echo "$ac_cv_lib_jack_jack_port_get_aliases" >&6; } if test "x$ac_cv_lib_jack_jack_port_get_aliases" = xyes; then : ac_jack_port_aliases="yes" else ac_jack_port_aliases="no" fi if test "x$ac_jack_port_aliases" = "xyes"; then $as_echo "#define CONFIG_JACK_PORT_ALIASES 1" >>confdefs.h fi fi # Check for jack_get_version_string function. if test "x$ac_jack_version" = "xyes"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for jack_get_version_string in -ljack" >&5 $as_echo_n "checking for jack_get_version_string in -ljack... " >&6; } if ${ac_cv_lib_jack_jack_get_version_string+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ljack $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char jack_get_version_string (); int main () { return jack_get_version_string (); ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : ac_cv_lib_jack_jack_get_version_string=yes else ac_cv_lib_jack_jack_get_version_string=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_jack_jack_get_version_string" >&5 $as_echo "$ac_cv_lib_jack_jack_get_version_string" >&6; } if test "x$ac_cv_lib_jack_jack_get_version_string" = xyes; then : ac_jack_version="yes" else ac_jack_version="no" fi if test "x$ac_jack_version" = "xyes"; then $as_echo "#define CONFIG_JACK_VERSION 1" >>confdefs.h fi fi # Check for jack_free function. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for jack_free in -ljack" >&5 $as_echo_n "checking for jack_free in -ljack... " >&6; } if ${ac_cv_lib_jack_jack_free+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ljack $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char jack_free (); int main () { return jack_free (); ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : ac_cv_lib_jack_jack_free=yes else ac_cv_lib_jack_jack_free=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_jack_jack_free" >&5 $as_echo "$ac_cv_lib_jack_jack_free" >&6; } if test "x$ac_cv_lib_jack_jack_free" = xyes; then : ac_jack_free="yes" else ac_jack_free="no" fi if test "x$ac_jack_free" = "xyes"; then $as_echo "#define CONFIG_JACK_FREE 1" >>confdefs.h fi # Finally produce a configure header file and the main makefile. cat >confcache <<\_ACEOF # This file is a shell script that caches the results of configure # tests run on this system so they can be shared between configure # scripts and configure runs, see configure's option --config-cache. # It is not useful on other systems. If it contains results you don't # want to keep, you may remove or edit it. # # config.status only pays attention to the cache file if you give it # the --recheck option to rerun configure. # # `ac_cv_env_foo' variables (set or unset) will be overridden when # loading this file, other *unset* `ac_cv_foo' will be assigned the # following values. _ACEOF # The following way of writing the cache mishandles newlines in values, # but we know of no workaround that is simple, portable, and efficient. # So, we kill variables containing newlines. # Ultrix sh set writes to stderr and can't be redirected directly, # and sets the high bit in the cache file unless we assign to the vars. ( for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space=' '; set) 2>&1` in #( *${as_nl}ac_space=\ *) # `set' does not quote correctly, so add quotes: double-quote # substitution turns \\\\ into \\, and sed turns \\ into \. sed -n \ "s/'/'\\\\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" ;; #( *) # `set' quotes correctly as required by POSIX, so do not add quotes. sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) | sed ' /^ac_cv_env_/b end t clear :clear s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/ t end s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ :end' >>confcache if diff "$cache_file" confcache >/dev/null 2>&1; then :; else if test -w "$cache_file"; then if test "x$cache_file" != "x/dev/null"; then { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5 $as_echo "$as_me: updating cache $cache_file" >&6;} if test ! -f "$cache_file" || test -h "$cache_file"; then cat confcache >"$cache_file" else case $cache_file in #( */* | ?:*) mv -f confcache "$cache_file"$$ && mv -f "$cache_file"$$ "$cache_file" ;; #( *) mv -f confcache "$cache_file" ;; esac fi fi else { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5 $as_echo "$as_me: not updating unwritable cache $cache_file" >&6;} fi fi rm -f confcache test "x$prefix" = xNONE && prefix=$ac_default_prefix # Let make expand exec_prefix. test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' DEFS=-DHAVE_CONFIG_H ac_libobjs= ac_ltlibobjs= U= for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue # 1. Remove the extension, and $U if already installed. ac_script='s/\$U\././;s/\.o$//;s/\.obj$//' ac_i=`$as_echo "$ac_i" | sed "$ac_script"` # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR # will be set to the directory where LIBOBJS objects are built. as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext" as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo' done LIBOBJS=$ac_libobjs LTLIBOBJS=$ac_ltlibobjs : "${CONFIG_STATUS=./config.status}" ac_write_fail=0 ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files $CONFIG_STATUS" { $as_echo "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5 $as_echo "$as_me: creating $CONFIG_STATUS" >&6;} as_write_fail=0 cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1 #! $SHELL # Generated by $as_me. # Run this file to recreate the current configuration. # Compiler output produced by configure, useful for debugging # configure, is in config.log if it exists. debug=false ac_cs_recheck=false ac_cs_silent=false SHELL=\${CONFIG_SHELL-$SHELL} export SHELL _ASEOF cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1 ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi as_nl=' ' export as_nl # Printing a long string crashes Solaris 7 /usr/bin/printf. as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo # Prefer a ksh shell builtin over an external printf program on Solaris, # but without wasting forks for bash or zsh. if test -z "$BASH_VERSION$ZSH_VERSION" \ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='print -r --' as_echo_n='print -rn --' elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='printf %s\n' as_echo_n='printf %s' else if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' as_echo_n='/usr/ucb/echo -n' else as_echo_body='eval expr "X$1" : "X\\(.*\\)"' as_echo_n_body='eval arg=$1; case $arg in #( *"$as_nl"*) expr "X$arg" : "X\\(.*\\)$as_nl"; arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; esac; expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" ' export as_echo_n_body as_echo_n='sh -c $as_echo_n_body as_echo' fi export as_echo_body as_echo='sh -c $as_echo_body as_echo' fi # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. as_myself= case $0 in #(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # Unset variables that we do not need and which cause bugs (e.g. in # pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" # suppresses any "Segmentation fault" message there. '((' could # trigger a bug in pdksh 5.2.14. for as_var in BASH_ENV ENV MAIL MAILPATH do eval test x\${$as_var+set} = xset \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # CDPATH. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH # as_fn_error STATUS ERROR [LINENO LOG_FD] # ---------------------------------------- # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are # provided, also output the error to LOG_FD, referencing LINENO. Then exit the # script with STATUS, using 1 if that was 0. as_fn_error () { as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi $as_echo "$as_me: error: $2" >&2 as_fn_exit $as_status } # as_fn_error # as_fn_set_status STATUS # ----------------------- # Set $? to STATUS, without forking. as_fn_set_status () { return $1 } # as_fn_set_status # as_fn_exit STATUS # ----------------- # Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } # as_fn_exit # as_fn_unset VAR # --------------- # Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset # as_fn_append VAR VALUE # ---------------------- # Append the text in VALUE to the end of the definition contained in VAR. Take # advantage of any shell optimizations that allow amortized linear growth over # repeated appends, instead of the typical quadratic growth present in naive # implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : eval 'as_fn_append () { eval $1+=\$2 }' else as_fn_append () { eval $1=\$$1\$2 } fi # as_fn_append # as_fn_arith ARG... # ------------------ # Perform arithmetic evaluation on the ARGs, and store the result in the # global $as_val. Take advantage of shells that can avoid forks. The arguments # must be portable across $(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : eval 'as_fn_arith () { as_val=$(( $* )) }' else as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } fi # as_fn_arith if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || $as_echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in #((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # In both cases, we have to default to `cp -pR'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -pR' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -pR' fi else as_ln_s='cp -pR' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null # as_fn_mkdir_p # ------------- # Create "$as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" } # as_fn_mkdir_p if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi # as_fn_executable_p FILE # ----------------------- # Test if FILE is an executable regular file. as_fn_executable_p () { test -f "$1" && test -x "$1" } # as_fn_executable_p as_test_x='test -x' as_executable_p=as_fn_executable_p # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" exec 6>&1 ## ----------------------------------- ## ## Main body of $CONFIG_STATUS script. ## ## ----------------------------------- ## _ASEOF test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1 cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Save the log message, to keep $0 and so on meaningful, and to # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" This file was extended by QjackCtl $as_me 0.4.2, which was generated by GNU Autoconf 2.69. Invocation command line was CONFIG_FILES = $CONFIG_FILES CONFIG_HEADERS = $CONFIG_HEADERS CONFIG_LINKS = $CONFIG_LINKS CONFIG_COMMANDS = $CONFIG_COMMANDS $ $0 $@ on `(hostname || uname -n) 2>/dev/null | sed 1q` " _ACEOF case $ac_config_files in *" "*) set x $ac_config_files; shift; ac_config_files=$*;; esac case $ac_config_headers in *" "*) set x $ac_config_headers; shift; ac_config_headers=$*;; esac cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 # Files that config.status was made for. config_files="$ac_config_files" config_headers="$ac_config_headers" _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 ac_cs_usage="\ \`$as_me' instantiates files and other configuration actions from templates according to the current configuration. Unless the files and actions are specified as TAGs, all are instantiated by default. Usage: $0 [OPTION]... [TAG]... -h, --help print this help, then exit -V, --version print version number and configuration settings, then exit --config print configuration, then exit -q, --quiet, --silent do not print progress messages -d, --debug don't remove temporary files --recheck update $as_me by reconfiguring in the same conditions --file=FILE[:TEMPLATE] instantiate the configuration file FILE --header=FILE[:TEMPLATE] instantiate the configuration header FILE Configuration files: $config_files Configuration headers: $config_headers Report bugs to ." _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" ac_cs_version="\\ QjackCtl config.status 0.4.2 configured by $0, generated by GNU Autoconf 2.69, with options \\"\$ac_cs_config\\" Copyright (C) 2012 Free Software Foundation, Inc. This config.status script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it." ac_pwd='$ac_pwd' srcdir='$srcdir' test -n "\$AWK" || AWK=awk _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # The default lists apply if the user does not specify any file. ac_need_defaults=: while test $# != 0 do case $1 in --*=?*) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'` ac_shift=: ;; --*=) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg= ac_shift=: ;; *) ac_option=$1 ac_optarg=$2 ac_shift=shift ;; esac case $ac_option in # Handling of the options. -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) ac_cs_recheck=: ;; --version | --versio | --versi | --vers | --ver | --ve | --v | -V ) $as_echo "$ac_cs_version"; exit ;; --config | --confi | --conf | --con | --co | --c ) $as_echo "$ac_cs_config"; exit ;; --debug | --debu | --deb | --de | --d | -d ) debug=: ;; --file | --fil | --fi | --f ) $ac_shift case $ac_optarg in *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; '') as_fn_error $? "missing file argument" ;; esac as_fn_append CONFIG_FILES " '$ac_optarg'" ac_need_defaults=false;; --header | --heade | --head | --hea ) $ac_shift case $ac_optarg in *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; esac as_fn_append CONFIG_HEADERS " '$ac_optarg'" ac_need_defaults=false;; --he | --h) # Conflict between --help and --header as_fn_error $? "ambiguous option: \`$1' Try \`$0 --help' for more information.";; --help | --hel | -h ) $as_echo "$ac_cs_usage"; exit ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil | --si | --s) ac_cs_silent=: ;; # This is an error. -*) as_fn_error $? "unrecognized option: \`$1' Try \`$0 --help' for more information." ;; *) as_fn_append ac_config_targets " $1" ac_need_defaults=false ;; esac shift done ac_configure_extra_args= if $ac_cs_silent; then exec 6>/dev/null ac_configure_extra_args="$ac_configure_extra_args --silent" fi _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 if \$ac_cs_recheck; then set X $SHELL '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion shift \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6 CONFIG_SHELL='$SHELL' export CONFIG_SHELL exec "\$@" fi _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 exec 5>>config.log { echo sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX ## Running $as_me. ## _ASBOX $as_echo "$ac_log" } >&5 _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Handling of arguments. for ac_config_target in $ac_config_targets do case $ac_config_target in "src/config.h") CONFIG_HEADERS="$CONFIG_HEADERS src/config.h" ;; "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;; "qjackctl.spec") CONFIG_FILES="$CONFIG_FILES qjackctl.spec" ;; "src/src.pri") CONFIG_FILES="$CONFIG_FILES src/src.pri" ;; "src/qjackctl.desktop") CONFIG_FILES="$CONFIG_FILES src/qjackctl.desktop" ;; *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;; esac done # If the user did not use the arguments to specify the items to instantiate, # then the envvar interface is used. Set only those that are not. # We use the long form for the default assignment because of an extremely # bizarre bug on SunOS 4.1.3. if $ac_need_defaults; then test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files test "${CONFIG_HEADERS+set}" = set || CONFIG_HEADERS=$config_headers fi # Have a temporary directory for convenience. Make it in the build tree # simply because there is no reason against having it here, and in addition, # creating and moving files from /tmp can sometimes cause problems. # Hook for its removal unless debugging. # Note that there is a small window in which the directory will not be cleaned: # after its creation but before its name has been assigned to `$tmp'. $debug || { tmp= ac_tmp= trap 'exit_status=$? : "${ac_tmp:=$tmp}" { test ! -d "$ac_tmp" || rm -fr "$ac_tmp"; } && exit $exit_status ' 0 trap 'as_fn_exit 1' 1 2 13 15 } # Create a (secure) tmp directory for tmp files. { tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && test -d "$tmp" } || { tmp=./conf$$-$RANDOM (umask 077 && mkdir "$tmp") } || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5 ac_tmp=$tmp # Set up the scripts for CONFIG_FILES section. # No need to generate them if there are no CONFIG_FILES. # This happens for instance with `./config.status config.h'. if test -n "$CONFIG_FILES"; then ac_cr=`echo X | tr X '\015'` # On cygwin, bash can eat \r inside `` if the user requested igncr. # But we know of no other shell where ac_cr would be empty at this # point, so we can use a bashism as a fallback. if test "x$ac_cr" = x; then eval ac_cr=\$\'\\r\' fi ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' /dev/null` if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then ac_cs_awk_cr='\\r' else ac_cs_awk_cr=$ac_cr fi echo 'BEGIN {' >"$ac_tmp/subs1.awk" && _ACEOF { echo "cat >conf$$subs.awk <<_ACEOF" && echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' && echo "_ACEOF" } >conf$$subs.sh || as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_num=`echo "$ac_subst_vars" | grep -c '^'` ac_delim='%!_!# ' for ac_last_try in false false false false false :; do . ./conf$$subs.sh || as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X` if test $ac_delim_n = $ac_delim_num; then break elif $ac_last_try; then as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 else ac_delim="$ac_delim!$ac_delim _$ac_delim!! " fi done rm -f conf$$subs.sh cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 cat >>"\$ac_tmp/subs1.awk" <<\\_ACAWK && _ACEOF sed -n ' h s/^/S["/; s/!.*/"]=/ p g s/^[^!]*!// :repl t repl s/'"$ac_delim"'$// t delim :nl h s/\(.\{148\}\)..*/\1/ t more1 s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/ p n b repl :more1 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t nl :delim h s/\(.\{148\}\)..*/\1/ t more2 s/["\\]/\\&/g; s/^/"/; s/$/"/ p b :more2 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t delim ' >$CONFIG_STATUS || ac_write_fail=1 rm -f conf$$subs.awk cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 _ACAWK cat >>"\$ac_tmp/subs1.awk" <<_ACAWK && for (key in S) S_is_set[key] = 1 FS = "" } { line = $ 0 nfields = split(line, field, "@") substed = 0 len = length(field[1]) for (i = 2; i < nfields; i++) { key = field[i] keylen = length(key) if (S_is_set[key]) { value = S[key] line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3) len += length(value) + length(field[++i]) substed = 1 } else len += 1 + keylen } print line } _ACAWK _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g" else cat fi < "$ac_tmp/subs1.awk" > "$ac_tmp/subs.awk" \ || as_fn_error $? "could not setup config files machinery" "$LINENO" 5 _ACEOF # VPATH may cause trouble with some makes, so we remove sole $(srcdir), # ${srcdir} and @srcdir@ entries from VPATH if srcdir is ".", strip leading and # trailing colons and then remove the whole line if VPATH becomes empty # (actually we leave an empty line to preserve line numbers). if test "x$srcdir" = x.; then ac_vpsub='/^[ ]*VPATH[ ]*=[ ]*/{ h s/// s/^/:/ s/[ ]*$/:/ s/:\$(srcdir):/:/g s/:\${srcdir}:/:/g s/:@srcdir@:/:/g s/^:*// s/:*$// x s/\(=[ ]*\).*/\1/ G s/\n// s/^[^=]*=[ ]*$// }' fi cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 fi # test -n "$CONFIG_FILES" # Set up the scripts for CONFIG_HEADERS section. # No need to generate them if there are no CONFIG_HEADERS. # This happens for instance with `./config.status Makefile'. if test -n "$CONFIG_HEADERS"; then cat >"$ac_tmp/defines.awk" <<\_ACAWK || BEGIN { _ACEOF # Transform confdefs.h into an awk script `defines.awk', embedded as # here-document in config.status, that substitutes the proper values into # config.h.in to produce config.h. # Create a delimiter string that does not exist in confdefs.h, to ease # handling of long lines. ac_delim='%!_!# ' for ac_last_try in false false :; do ac_tt=`sed -n "/$ac_delim/p" confdefs.h` if test -z "$ac_tt"; then break elif $ac_last_try; then as_fn_error $? "could not make $CONFIG_HEADERS" "$LINENO" 5 else ac_delim="$ac_delim!$ac_delim _$ac_delim!! " fi done # For the awk script, D is an array of macro values keyed by name, # likewise P contains macro parameters if any. Preserve backslash # newline sequences. ac_word_re=[_$as_cr_Letters][_$as_cr_alnum]* sed -n ' s/.\{148\}/&'"$ac_delim"'/g t rset :rset s/^[ ]*#[ ]*define[ ][ ]*/ / t def d :def s/\\$// t bsnl s/["\\]/\\&/g s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ D["\1"]=" \3"/p s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2"/p d :bsnl s/["\\]/\\&/g s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ D["\1"]=" \3\\\\\\n"\\/p t cont s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2\\\\\\n"\\/p t cont d :cont n s/.\{148\}/&'"$ac_delim"'/g t clear :clear s/\\$// t bsnlc s/["\\]/\\&/g; s/^/"/; s/$/"/p d :bsnlc s/["\\]/\\&/g; s/^/"/; s/$/\\\\\\n"\\/p b cont ' >$CONFIG_STATUS || ac_write_fail=1 cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 for (key in D) D_is_set[key] = 1 FS = "" } /^[\t ]*#[\t ]*(define|undef)[\t ]+$ac_word_re([\t (]|\$)/ { line = \$ 0 split(line, arg, " ") if (arg[1] == "#") { defundef = arg[2] mac1 = arg[3] } else { defundef = substr(arg[1], 2) mac1 = arg[2] } split(mac1, mac2, "(") #) macro = mac2[1] prefix = substr(line, 1, index(line, defundef) - 1) if (D_is_set[macro]) { # Preserve the white space surrounding the "#". print prefix "define", macro P[macro] D[macro] next } else { # Replace #undef with comments. This is necessary, for example, # in the case of _POSIX_SOURCE, which is predefined and required # on some systems where configure will not decide to define it. if (defundef == "undef") { print "/*", prefix defundef, macro, "*/" next } } } { print } _ACAWK _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 as_fn_error $? "could not setup config headers machinery" "$LINENO" 5 fi # test -n "$CONFIG_HEADERS" eval set X " :F $CONFIG_FILES :H $CONFIG_HEADERS " shift for ac_tag do case $ac_tag in :[FHLC]) ac_mode=$ac_tag; continue;; esac case $ac_mode$ac_tag in :[FHL]*:*);; :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5;; :[FH]-) ac_tag=-:-;; :[FH]*) ac_tag=$ac_tag:$ac_tag.in;; esac ac_save_IFS=$IFS IFS=: set x $ac_tag IFS=$ac_save_IFS shift ac_file=$1 shift case $ac_mode in :L) ac_source=$1;; :[FH]) ac_file_inputs= for ac_f do case $ac_f in -) ac_f="$ac_tmp/stdin";; *) # Look for the file first in the build tree, then in the source tree # (if the path is not absolute). The absolute path cannot be DOS-style, # because $ac_f cannot contain `:'. test -f "$ac_f" || case $ac_f in [\\/$]*) false;; *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";; esac || as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5;; esac case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac as_fn_append ac_file_inputs " '$ac_f'" done # Let's still pretend it is `configure' which instantiates (i.e., don't # use $as_me), people would be surprised to read: # /* config.h. Generated by config.status. */ configure_input='Generated from '` $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g' `' by configure.' if test x"$ac_file" != x-; then configure_input="$ac_file. $configure_input" { $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5 $as_echo "$as_me: creating $ac_file" >&6;} fi # Neutralize special characters interpreted by sed in replacement strings. case $configure_input in #( *\&* | *\|* | *\\* ) ac_sed_conf_input=`$as_echo "$configure_input" | sed 's/[\\\\&|]/\\\\&/g'`;; #( *) ac_sed_conf_input=$configure_input;; esac case $ac_tag in *:-:* | *:-) cat >"$ac_tmp/stdin" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; esac ;; esac ac_dir=`$as_dirname -- "$ac_file" || $as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$ac_file" : 'X\(//\)[^/]' \| \ X"$ac_file" : 'X\(//\)$' \| \ X"$ac_file" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$ac_file" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` as_dir="$ac_dir"; as_fn_mkdir_p ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix case $ac_mode in :F) # # CONFIG_FILE # _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # If the template does not know about datarootdir, expand it. # FIXME: This hack should be removed a few years after 2.60. ac_datarootdir_hack=; ac_datarootdir_seen= ac_sed_dataroot=' /datarootdir/ { p q } /@datadir@/p /@docdir@/p /@infodir@/p /@localedir@/p /@mandir@/p' case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in *datarootdir*) ac_datarootdir_seen=yes;; *@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 $as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;} _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_datarootdir_hack=' s&@datadir@&$datadir&g s&@docdir@&$docdir&g s&@infodir@&$infodir&g s&@localedir@&$localedir&g s&@mandir@&$mandir&g s&\\\${datarootdir}&$datarootdir&g' ;; esac _ACEOF # Neutralize VPATH when `$srcdir' = `.'. # Shell code in configure.ac might set extrasub. # FIXME: do we really want to maintain this feature? cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_sed_extra="$ac_vpsub $extrasub _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 :t /@[a-zA-Z_][a-zA-Z_0-9]*@/!b s|@configure_input@|$ac_sed_conf_input|;t t s&@top_builddir@&$ac_top_builddir_sub&;t t s&@top_build_prefix@&$ac_top_build_prefix&;t t s&@srcdir@&$ac_srcdir&;t t s&@abs_srcdir@&$ac_abs_srcdir&;t t s&@top_srcdir@&$ac_top_srcdir&;t t s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t s&@builddir@&$ac_builddir&;t t s&@abs_builddir@&$ac_abs_builddir&;t t s&@abs_top_builddir@&$ac_abs_top_builddir&;t t $ac_datarootdir_hack " eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$ac_tmp/subs.awk" \ >$ac_tmp/out || as_fn_error $? "could not create $ac_file" "$LINENO" 5 test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && { ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } && { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' \ "$ac_tmp/out"`; test -z "$ac_out"; } && { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined" >&5 $as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined" >&2;} rm -f "$ac_tmp/stdin" case $ac_file in -) cat "$ac_tmp/out" && rm -f "$ac_tmp/out";; *) rm -f "$ac_file" && mv "$ac_tmp/out" "$ac_file";; esac \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; :H) # # CONFIG_HEADER # if test x"$ac_file" != x-; then { $as_echo "/* $configure_input */" \ && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" } >"$ac_tmp/config.h" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 if diff "$ac_file" "$ac_tmp/config.h" >/dev/null 2>&1; then { $as_echo "$as_me:${as_lineno-$LINENO}: $ac_file is unchanged" >&5 $as_echo "$as_me: $ac_file is unchanged" >&6;} else rm -f "$ac_file" mv "$ac_tmp/config.h" "$ac_file" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 fi else $as_echo "/* $configure_input */" \ && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" \ || as_fn_error $? "could not create -" "$LINENO" 5 fi ;; esac done # for ac_tag as_fn_exit 0 _ACEOF ac_clean_files=$ac_clean_files_save test $ac_write_fail = 0 || as_fn_error $? "write failure creating $CONFIG_STATUS" "$LINENO" 5 # configure is writing to config.log, and then calls config.status. # config.status does its own redirection, appending to config.log. # Unfortunately, on DOS this fails, as config.log is still kept open # by configure, so config.status won't be able to write to it; its # output is simply discarded. So we exec the FD to /dev/null, # effectively closing config.log, so it can be properly (re)opened and # appended to by config.status. When coming back to configure, we # need to make the FD available again. if test "$no_create" != yes; then ac_cs_success=: ac_config_status_args= test "$silent" = yes && ac_config_status_args="$ac_config_status_args --quiet" exec 5>/dev/null $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false exec 5>>config.log # Use ||, not &&, to avoid exiting from the if with $? = 1, which # would make configure fail if this is the last instruction. $ac_cs_success || as_fn_exit 1 fi if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5 $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;} fi # make clean > /dev/null 2>&1 # Output summary message echo echo " $PACKAGE_NAME $PACKAGE_VERSION" echo echo " Build target . . . . . . . . . . . . . . . . . . .: $ac_debug" echo echo " JACK Audio Connection Kit support . . . . . . . .: $ac_jack_lib" echo " JACK Realtime support . . . . . . . . . . . . . .: $ac_jack_realtime" echo " JACK Transport support . . . . . . . . . . . . . .: $ac_jack_transport" echo " JACK XRUN delay support . . . . . . . . . . . . .: $ac_jack_xrun_delay" echo " JACK Maximum scheduling delay support . . . . . .: $ac_jack_max_delay" echo " JACK Port aliases support . . . . . . . . . . . .: $ac_jack_port_aliases" echo " JACK Metadata support . . . . . . . . . . . . . .: $ac_jack_metadata" echo " JACK MIDI support . . . . . . . . . . . . . . . .: $ac_jack_midi" echo " JACK Session support . . . . . . . . . . . . . . .: $ac_jack_session" echo " JACK Version support (JACK2) . . . . . . . . . . .: $ac_jack_version" echo " ALSA MIDI Sequencer support . . . . . . . . . . .: $ac_alsa_seq" echo " System tray icon support . . . . . . . . . . . . .: $ac_system_tray" echo " D-Bus interface support . . . . . . . . . . . . .: $ac_dbus" echo " PortAudio interface support . . . . . . . . . . .: $ac_portaudio" echo " CoreAudio interface support . . . . . . . . . . .: $ac_coreaudio" echo echo " X11 Unique/Single instance . . . . . . . . . . . .: $ac_xunique" echo " Debugger stack-trace (gdb) . . . . . . . . . . . .: $ac_stacktrace" echo echo " Install prefix . . . . . . . . . . . . . . . . . .: $ac_prefix" echo echo "Now type 'make', followed by 'make install' as root." echo qjackctl-0.4.2/PaxHeaders.14935/configure.ac0000644000000000000000000000013212700760152015341 xustar0030 mtime=1459871850.608902788 30 atime=1459871850.608902788 30 ctime=1459871850.608902788 qjackctl-0.4.2/configure.ac0000644000175000001440000004336512700760152016120 0ustar00rncbcusers00000000000000# Process this file with autoconf to produce a configure script. AC_INIT(QjackCtl, 0.4.2, rncbc@rncbc.org, qjackctl) AC_CONFIG_SRCDIR(src/qjackctl.cpp) AC_CONFIG_HEADERS(src/config.h) AC_CONFIG_FILES(Makefile qjackctl.spec src/src.pri src/qjackctl.desktop) # Set default installation prefix. AC_PREFIX_DEFAULT(/usr/local) ac_prefix=$prefix if test "x$ac_prefix" = "xNONE"; then ac_prefix=$ac_default_prefix fi AC_SUBST(ac_prefix) AC_DEFINE_UNQUOTED(CONFIG_PREFIX, ["$ac_prefix"], [Default installation prefix.]) # Enable debugging argument option. AC_ARG_ENABLE(debug, AC_HELP_STRING([--enable-debug], [enable debugging (default=no)]), [ac_debug="$enableval"]) if test "x$ac_debug" = "xyes"; then AC_DEFINE(CONFIG_DEBUG, 1, [Define if debugging is enabled.]) ac_stacktrace="yes" ac_debug="debug" else ac_stacktrace="no" ac_debug="release" fi AC_SUBST(ac_debug) # Enable Qt4/5 availability. AC_ARG_ENABLE(qt4, AC_HELP_STRING([--enable-qt4], [enable Qt4 build (default=no)]), [ac_qt4="$enableval"], [ac_qt4="no"]) AC_ARG_ENABLE(qt5, AC_HELP_STRING([--enable-qt5], [enable Qt5 build (default=yes)]), [ac_qt5="$enableval"], [ac_qt5="yes"]) # Disable system tray argument option. AC_ARG_ENABLE(system_tray, AC_HELP_STRING([--enable-system-tray], [enable system tray (default=yes)]), [ac_system_tray="$enableval"], [ac_system_tray="yes"]) # Disable JACK MIDI support option. AC_ARG_ENABLE(jack_midi, AC_HELP_STRING([--enable-jack-midi], [enable JACK MIDI support (default=yes)]), [ac_jack_midi="$enableval"], [ac_jack_midi="yes"]) # Enable JACK session support. AC_ARG_ENABLE(jack_session, AC_HELP_STRING([--enable-jack-session], [enable JACK session support (default=yes)]), [ac_jack_session="$enableval"], [ac_jack_session="yes"]) # Enable JACK port aliases support. AC_ARG_ENABLE(jack_port_aliases, AC_HELP_STRING([--enable-jack-port-aliases], [enable JACK port aliases support (default=yes)]), [ac_jack_port_aliases="$enableval"], [ac_jack_port_aliases="yes"]) # Enable JACK metadata support. AC_ARG_ENABLE(jack_metadata, AC_HELP_STRING([--enable-jack-metadata], [enable JACK metadata support (default=yes)]), [ac_jack_metadata="$enableval"], [ac_jack_metadata="yes"]) # Enable JACK version support. AC_ARG_ENABLE(jack_version, AC_HELP_STRING([--enable-jack-version], [enable JACK version support (default=no)]), [ac_jack_version="$enableval"], [ac_jack_version="no"]) # Disable ALSA sequencer support option. AC_ARG_ENABLE(alsa_seq, AC_HELP_STRING([--enable-alsa-seq], [enable ALSA/MIDI sequencer support (default=yes)]), [ac_alsa_seq="$enableval"], [ac_alsa_seq="yes"]) # Enable PortAudio argument option. AC_ARG_ENABLE(portaudio, AC_HELP_STRING([--enable-portaudio], [enable PortAudio interface (default=yes)]), [ac_portaudio="$enableval"], [ac_portaudio="yes"]) # Enable D-Bus argument option. AC_ARG_ENABLE(dbus, AC_HELP_STRING([--enable-dbus], [enable D-Bus interface (default=yes)]), [ac_dbus="$enableval"], [ac_dbus="yes"]) if test "x$ac_dbus" = "xyes"; then AC_DEFINE(CONFIG_DBUS, 1, [Define if D-Bus interface is enabled.]) ac_qdbus="qdbus" fi AC_SUBST(ac_qdbus) # Enable X11 unique/single instance. AC_ARG_ENABLE(xunique, AC_HELP_STRING([--enable-xunique], [enable X11 unique/single instance (default=yes)]), [ac_xunique="$enableval"], [ac_xunique="yes"]) # Enable debugger stack-trace option (assumes --enable-debug). AC_ARG_ENABLE(stacktrace, AC_HELP_STRING([--enable-stacktrace], [enable debugger stack-trace (default=no)]), [ac_stacktrace="$enableval"]) # Standard installation base dirs. ac_with_paths="/usr /usr/local" # Set for alternate Qt4/5 installation dir. AC_ARG_WITH(qt4, AC_HELP_STRING([--with-qt4=PATH], [use alternate Qt4 install path]), [ac_qt4_path="$withval"], [ac_qt4_path="no"]) AC_ARG_WITH(qt5, AC_HELP_STRING([--with-qt5=PATH], [use alternate Qt5 install path]), [ac_qt5_path="$withval"], [ac_qt5_path="no"]) if test "x$ac_qt4_path" != "xno"; then ac_with_paths="$ac_with_paths $ac_qt4_path" ac_qt4="yes" fi if test "x$ac_qt5_path" != "xno"; then ac_with_paths="$ac_with_paths $ac_qt5_path" ac_qt5="yes" fi if test "x$ac_qt5" = "xno"; then ac_qt4="yes" fi if test "x$ac_qt4" = "xyes"; then ac_qt5="no" fi # Set for alternate JACK installation dir. AC_ARG_WITH(jack, AC_HELP_STRING([--with-jack=PATH], [use alternate JACK install path]), [ac_with_paths="$ac_with_paths $withval"]) # Set for alternate ALSA installation dir. AC_ARG_WITH(alsa, AC_HELP_STRING([--with-alsa=PATH], [use alternate ALSA install path]), [ac_with_paths="$ac_with_paths $withval"]) # Set for alternate PortAudio installation dir. AC_ARG_WITH(portaudio, AC_HELP_STRING([--with-portaudio=PATH], [use alternate PortAudio install path]), [ac_with_paths="$ac_with_paths $withval"]) # Honor user specified flags. ac_cflags=$CFLAGS ac_ldflags=$LDFLAGS # Checks for programs. AC_PROG_CC AC_PROG_CPP AC_PROG_CXX AC_PROG_CXXCPP AC_PROG_GCC_TRADITIONAL # Checks for languages. AC_LANG_C AC_LANG_CPLUSPLUS # Check for proper flags. ac_arch=`uname -m` # Check for install paths and alternatives... ac_libdirs="lib" if test "x$ac_arch" = "xx86_64"; then ac_libdirs="$ac_libdirs lib64" fi CFLAGS="-fPIC $CFLAGS" CPPFLAGS="-fPIC $CPPFLAGS" # Prepend alternate dependencies paths. ac_path=$PATH for X in $ac_with_paths; do if test -d $X/bin; then ac_path="$X/bin:$ac_path" fi if test -d $X/include; then CFLAGS="-I$X/include $CFLAGS " CPPFLAGS="-I$X/include $CPPFLAGS" ac_incpath="$X/include $ac_incpath" fi for Y in $ac_libdirs; do if test -d $X/$Y; then LIBS="-L$X/$Y $LIBS" ac_libs="-L$X/$Y $ac_libs" fi done done # A common error message: ac_errmsg="not found in current PATH. Maybe QT development environment isn't available." if test "x$ac_qt4" = "xyes"; then AC_PATH_PROG(ac_qmake, qmake-qt4, [no], $ac_path) fi if test "x$ac_qt5" = "xyes"; then AC_PATH_PROG(ac_qmake, qmake-qt5, [no], $ac_path) fi if test "x$ac_qmake" = "xno"; then AC_PATH_PROG(ac_cv_qmake, qmake, [no], $ac_path) ac_qmake=$ac_cv_qmake fi if test "x$ac_qmake" = "xno"; then AC_MSG_ERROR([qmake $ac_errmsg]) fi # Check for proper Qt4/5 major version. ac_qt_version_major=`$ac_qmake -query QT_VERSION | cut -d. -f1` if test "x$ac_qt4" = "xyes" -a "x$ac_qt_version_major" != "x4"; then AC_MSG_ERROR([qmake-qt4 $ac_errmsg (qt4-devel)]) fi if test "x$ac_qt5" = "xyes" -a "x$ac_qt_version_major" != "x5"; then AC_MSG_ERROR([qmake-qt5 $ac_errmsg (qt5-devel)]) fi ac_qt_install_bins=`$ac_qmake -query QT_INSTALL_BINS` if test -d $ac_qt_install_bins; then ac_path="$ac_qt_install_bins:$ac_path" fi # Check it again, now with updated PATH, just in case... AC_PATH_PROG(ac_cv_qmake, qmake, [no], $ac_path) ac_qmake=$ac_cv_qmake if test "x$ac_qmake" = "xno"; then AC_MSG_ERROR([qmake $ac_errmsg]) fi AC_SUBST(ac_qmake) ac_qt_install_headers=`$ac_qmake -query QT_INSTALL_HEADERS` if test -d $ac_qt_install_headers; then CFLAGS="-I$ac_qt_install_headers $CFLAGS " CPPFLAGS="-I$ac_qt_install_headers $CPPFLAGS" ac_incpath="$ac_qt_install_headers $ac_incpath" fi ac_qt_install_libs=`$ac_qmake -query QT_INSTALL_LIBS` if test -d $ac_qt_install_libs; then LIBS="-L$ac_qt_install_libs $LIBS" ac_libs="-L$ac_qt_install_libs $ac_libs" fi # Check for proper Qt4/5 version. if test "x$ac_qt4" = "xyes"; then AC_CACHE_CHECK([for Qt library version >= 4.4], ac_cv_qtversion, [ AC_TRY_COMPILE([#include "QtCore/qglobal.h"], [ #if QT_VERSION < 0x040400 || QT_VERSION >= 0x050000 #error Qt library 4.4 or greater required. #endif ], ac_cv_qtversion="yes", [ echo "no; Qt 4.4 or greater is required" exit 1 ]) ]) fi if test "x$ac_qt5" = "xyes"; then AC_CACHE_CHECK([for Qt library version >= 5.1], ac_cv_qtversion, [ AC_TRY_COMPILE([#include "QtCore/qglobal.h"], [ #if QT_VERSION < 0x050100 || QT_VERSION >= 0x060000 #error Qt library 5.1 or greater required. #endif ], ac_cv_qtversion="yes", [ echo "no; Qt 5.1 or greater is required" exit 1 ]) ]) fi # Check for Qt moc utility. AC_PATH_PROG(ac_moc, moc, [no], $ac_path) if test "x$ac_moc" = "xno"; then AC_MSG_ERROR([moc $ac_errmsg]) fi AC_SUBST(ac_moc) # Check for Qt uic utility. AC_PATH_PROG(ac_uic, uic, [no], $ac_path) if test "x$ac_uic" = "xno"; then AC_MSG_ERROR([uic $ac_errmsg]) fi AC_SUBST(ac_uic) # Check for Qt lupdate utility. AC_PATH_PROG(ac_lupdate, lupdate, [no], $ac_path) if test "x$ac_lupdate" = "xno"; then AC_MSG_ERROR([lupdate $ac_errmsg]) fi AC_SUBST(ac_lupdate) # Check for Qt lrelease utility. AC_PATH_PROG(ac_lrelease, lrelease, [no], $ac_path) if test "x$ac_release" = "xno"; then AC_MSG_ERROR([lrelease $ac_errmsg]) fi AC_SUBST(ac_lrelease) # Checks for libraries. AC_CHECK_LIB(m, main) AC_CHECK_LIB(X11, main) AC_CHECK_LIB(Xext, main) # Check for round math function. AC_CHECK_LIB(m, lroundf, [ac_round="yes"], [ac_round="no"]) if test "x$ac_round" = "xyes"; then AC_DEFINE(CONFIG_ROUND, 1, [Define if round is available.]) fi # Check for JACK libraries. AC_CHECK_LIB(jack, main, [ac_jack_lib="yes"], [ac_jack_lib="no"]) if test "x$ac_jack_lib" = "xno"; then AC_MSG_ERROR([JACK library not found.]) fi ac_libs="$ac_libs -ljack" # Check for ALSA libraries and primarily # for ALSA/MIDI sequencer support. if test "x$ac_alsa_seq" = "xyes"; then AC_CHECK_LIB(asound, main, [ac_alsa_lib="yes"], [ac_alsa_lib="no"]) if test "x$ac_alsa_lib" = "xno"; then AC_MSG_WARN([*** ALSA library not found.]) ac_alsa_seq="no" else ac_libs="$ac_libs -lasound" fi fi if test "x$ac_portaudio" = "xyes"; then AC_CHECK_LIB(portaudio, main, [ac_portaudio_lib="yes"], [ac_portaudio_lib="no"]) if test "x$ac_portaudio_lib" = "xno"; then AC_MSG_WARN([*** PortAudio library not found.]) ac_portaudio="no" else ac_libs="$ac_libs -lportaudio" fi fi AC_SUBST(ac_libs) # Checks for header files. AC_HEADER_STDC AC_HEADER_SYS_WAIT AC_CHECK_HEADERS(fcntl.h sys/ioctl.h unistd.h poll.h signal.h) # Check for JACK headers. AC_CHECK_HEADER(jack/jack.h, [ac_jack_h="yes"], [ac_jack_h="no"]) if test "x$ac_jack_h" = "xno"; then AC_MSG_ERROR([JACK headers not found.]) fi # Check for jack/statistics.h header. AC_CHECK_HEADER(jack/statistics.h, [ac_jack_statistics_h="yes"], [ac_jack_statistics_h="no"]) if test "x$ac_jack_statistics_h" = "xyes"; then AC_DEFINE(CONFIG_JACK_STATISTICS, 1, [Define if jack/statistics.h is available.]) fi # Check for CoreAudio/CoreAudio.h header (MacOSX). AC_CHECK_HEADER(CoreAudio/CoreAudio.h, [ac_coreaudio="yes"], [ac_coreaudio="no"]) if test "x$ac_coreaudio" = "xyes"; then AC_DEFINE(CONFIG_COREAUDIO, 1, [Define if CoreAudio/CoreAudio.h is available (Mac OS X).]) ac_alsa_seq="no" ac_libs="$ac_libs -framework CoreAudio -framework CoreFoundation" fi # Check for JACK MIDI headers availability. if test "x$ac_jack_midi" = "xyes"; then AC_CHECK_HEADER(jack/midiport.h, [ac_jack_midi="yes"], [ac_jack_midi="no"]) if test "x$ac_jack_midi" = "xyes"; then AC_DEFINE(CONFIG_JACK_MIDI, 1, [Define if JACK MIDI support is available.]) else AC_MSG_WARN([*** jack/midiport.h file not found.]) AC_MSG_WARN([*** JACK 0.103.0 or later may be required.]) AC_MSG_WARN([*** JACK MIDI support will be disabled.]) fi fi # Check for JACK session headers availability. if test "x$ac_jack_session" = "xyes"; then AC_CHECK_HEADER(jack/session.h, [ac_jack_session="yes"], [ac_jack_session="no"]) if test "x$ac_jack_session" = "xyes"; then AC_DEFINE(CONFIG_JACK_SESSION, 1, [Define if JACK session support is available.]) else AC_MSG_WARN([*** jack/session.h file not found.]) AC_MSG_WARN([*** JACK 0.118.3 or later may be required.]) AC_MSG_WARN([*** JACK session support will be disabled.]) fi fi # Check for JACK metadata headers availability. if test "x$ac_jack_metadata" = "xyes"; then AC_CHECK_HEADER(jack/metadata.h, [ac_jack_metadata="yes"], [ac_jack_metadata="no"]) if test "x$ac_jack_metadata" = "xyes"; then AC_DEFINE(CONFIG_JACK_METADATA, 1, [Define if JACK metadata support is available.]) else AC_MSG_WARN([*** jack/metadata.h file not found.]) AC_MSG_WARN([*** JACK 0.124.1 or later may be required.]) AC_MSG_WARN([*** JACK metadata support will be disabled.]) fi fi # Check for ALSA headers and ultimately # for ALSA/MIDI sequencer support. if test "x$ac_alsa_seq" = "xyes"; then AC_CHECK_HEADER(alsa/asoundlib.h, [ac_alsa_h="yes"], [ac_alsa_h="no"]) if test "x$ac_alsa_h" = "xyes"; then AC_DEFINE(CONFIG_ALSA_SEQ, 1, [Define if ALSA/MIDI sequencer support is enabled.]) else AC_MSG_WARN([*** ALSA headers not found.]) AC_MSG_WARN([*** ALSA/MIDI sequencer support will be disabled.]) ac_alsa_seq="no" fi fi # Check for PortAudio headers and library support. if test "x$ac_portaudio" = "xyes"; then AC_CHECK_HEADER(portaudio.h, [ac_portaudio_h="yes"], [ac_portaudio_h="no"]) if test "x$ac_portaudio_h" = "xyes"; then AC_DEFINE(CONFIG_PORTAUDIO, 1, [Define if PortAudio interface is enabled.]) else AC_MSG_WARN([*** PortAudio headers not found.]) AC_MSG_WARN([*** PortAudio interface support will be disabled.]) ac_portaudio="no" fi fi # Check for X11 unique/single instance. if test "x$ac_xunique" = "xyes"; then AC_DEFINE(CONFIG_XUNIQUE, 1, [Define if X11 unique/single instance is enabled.]) # Some recent distros (eg. fedora, debian) require this. ac_libs="$ac_libs -lX11" fi # Check for debugging stack-trace. if test "x$ac_stacktrace" = "xyes"; then AC_DEFINE(CONFIG_STACKTRACE, 1, [Define if debugger stack-trace is enabled.]) fi AC_SUBST(ac_incpath) AC_SUBST(ac_cflags) AC_SUBST(ac_ldflags) # Checks for typedefs, structures, and compiler characteristics. # AC_C_CONST # Checks for library functions. AC_CHECK_FUNCS(system) # Check for system-tray icon. if test "x$ac_system_tray" = "xyes"; then AC_DEFINE(CONFIG_SYSTEM_TRAY, 1, [Define if system tray is enabled.]) fi # Check for jack_transport_query function. AC_CHECK_LIB(jack, jack_transport_query, [ac_jack_transport="yes"], [ac_jack_transport="no"]) if test "x$ac_jack_transport" = "xno"; then AC_MSG_WARN([*** jack_transport_query: function not found.]) AC_MSG_WARN([*** JACK 0.80.0 or later may be required.]) AC_MSG_WARN([*** Transport features will be disabled.]) else AC_DEFINE(CONFIG_JACK_TRANSPORT, 1, [Define if jack_tranport_query is available.]) fi # Check for jack_is_realtime function. AC_CHECK_LIB(jack, jack_is_realtime, [ac_jack_realtime="yes"], [ac_jack_realtime="no"]) if test "x$ac_jack_realtime" = "xyes"; then AC_DEFINE(CONFIG_JACK_REALTIME, 1, [Define if jack_is_realtime is available.]) fi # Check for jack_get_xrun_delayed_usecs function. AC_CHECK_LIB(jack, jack_get_xrun_delayed_usecs, [ac_jack_xrun_delay="yes"], [ac_jack_xrun_delay="no"]) if test "x$ac_jack_xrun_delay" = "xyes"; then AC_DEFINE(CONFIG_JACK_XRUN_DELAY, 1, [Define if jack_get_xrun_delayed_usecs is available.]) fi # Check for jack_get_max_delayed_usecs function. AC_CHECK_LIB(jack, jack_get_max_delayed_usecs, [ac_jack_max_delay="yes"], [ac_jack_max_delay="no"]) if test "x$ac_jack_max_delay" = "xyes"; then AC_DEFINE(CONFIG_JACK_MAX_DELAY, 1, [Define if jack_get_max_delayed_usecs is available.]) fi # Check for jack_port_get_aliases function. if test "x$ac_jack_port_aliases" = "xyes"; then AC_CHECK_LIB(jack, jack_port_get_aliases, [ac_jack_port_aliases="yes"], [ac_jack_port_aliases="no"]) if test "x$ac_jack_port_aliases" = "xyes"; then AC_DEFINE(CONFIG_JACK_PORT_ALIASES, 1, [Define if jack_port_get_aliases is available.]) fi fi # Check for jack_get_version_string function. if test "x$ac_jack_version" = "xyes"; then AC_CHECK_LIB(jack, jack_get_version_string, [ac_jack_version="yes"], [ac_jack_version="no"]) if test "x$ac_jack_version" = "xyes"; then AC_DEFINE(CONFIG_JACK_VERSION, 1, [Define if jack_get_version_string is available.]) fi fi # Check for jack_free function. AC_CHECK_LIB(jack, jack_free, [ac_jack_free="yes"], [ac_jack_free="no"]) if test "x$ac_jack_free" = "xyes"; then AC_DEFINE(CONFIG_JACK_FREE, 1, [Define if jack_free is available.]) fi # Finally produce a configure header file and the main makefile. AC_OUTPUT # make clean > /dev/null 2>&1 # Output summary message echo echo " $PACKAGE_NAME $PACKAGE_VERSION" echo echo " Build target . . . . . . . . . . . . . . . . . . .: $ac_debug" echo echo " JACK Audio Connection Kit support . . . . . . . .: $ac_jack_lib" echo " JACK Realtime support . . . . . . . . . . . . . .: $ac_jack_realtime" echo " JACK Transport support . . . . . . . . . . . . . .: $ac_jack_transport" echo " JACK XRUN delay support . . . . . . . . . . . . .: $ac_jack_xrun_delay" echo " JACK Maximum scheduling delay support . . . . . .: $ac_jack_max_delay" echo " JACK Port aliases support . . . . . . . . . . . .: $ac_jack_port_aliases" echo " JACK Metadata support . . . . . . . . . . . . . .: $ac_jack_metadata" echo " JACK MIDI support . . . . . . . . . . . . . . . .: $ac_jack_midi" echo " JACK Session support . . . . . . . . . . . . . . .: $ac_jack_session" echo " JACK Version support (JACK2) . . . . . . . . . . .: $ac_jack_version" echo " ALSA MIDI Sequencer support . . . . . . . . . . .: $ac_alsa_seq" echo " System tray icon support . . . . . . . . . . . . .: $ac_system_tray" echo " D-Bus interface support . . . . . . . . . . . . .: $ac_dbus" echo " PortAudio interface support . . . . . . . . . . .: $ac_portaudio" echo " CoreAudio interface support . . . . . . . . . . .: $ac_coreaudio" echo echo " X11 Unique/Single instance . . . . . . . . . . . .: $ac_xunique" echo " Debugger stack-trace (gdb) . . . . . . . . . . . .: $ac_stacktrace" echo echo " Install prefix . . . . . . . . . . . . . . . . . .: $ac_prefix" echo echo "Now type 'make', followed by 'make install' as root." echo qjackctl-0.4.2/PaxHeaders.14935/COPYING0000644000000000000000000000013212700760152014106 xustar0030 mtime=1459871850.607902288 30 atime=1459871850.607902288 30 ctime=1459871850.607902288 qjackctl-0.4.2/COPYING0000644000175000001440000004310312700760152014653 0ustar00rncbcusers00000000000000 GNU GENERAL PUBLIC LICENSE Version 2, June 1991 Copyright (C) 1989, 1991 Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Lesser General Public License instead.) You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things. To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it. For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software. Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations. Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all. The precise terms and conditions for copying, distribution and modification follow. GNU GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you". Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does. 1. You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change. b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License. c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program. In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following: a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.) The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code. 4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it. 6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License. 7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 9. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation. 10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Also add information on how to contact you by electronic and paper mail. If the program is interactive, make it output a short notice like this when it starts in an interactive mode: Gnomovision version 69, Copyright (C) year name of author Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, the commands you use may be called something other than `show w' and `show c'; they could even be mouse-clicks or menu items--whatever suits your program. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the program, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the program `Gnomovision' (which makes passes at compilers) written by James Hacker. , 1 April 1989 Ty Coon, President of Vice This General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. qjackctl-0.4.2/PaxHeaders.14935/INSTALL0000644000000000000000000000013212700760152014104 xustar0030 mtime=1459871850.608902788 30 atime=1459871850.608902788 30 ctime=1459871850.608902788 qjackctl-0.4.2/INSTALL0000644000175000001440000003634012700760152014656 0ustar00rncbcusers00000000000000Installation Instructions ************************* Copyright (C) 1994, 1995, 1996, 1999, 2000, 2001, 2002, 2004, 2005, 2006, 2007, 2008, 2009, 2010 Free Software Foundation, Inc. Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. This file is offered as-is, without warranty of any kind. Basic Installation ================== Briefly, the shell commands `./configure; make; make install' should configure, build, and install this package. The following more-detailed instructions are generic; see the `README' file for instructions specific to this package. Some packages provide this `INSTALL' file but do not implement all of the features documented below. The lack of an optional feature in a given package is not necessarily a bug. More recommendations for GNU packages can be found in *note Makefile Conventions: (standards)Makefile Conventions. The `configure' shell script attempts to guess correct values for various system-dependent variables used during compilation. It uses those values to create a `Makefile' in each directory of the package. It may also create one or more `.h' files containing system-dependent definitions. Finally, it creates a shell script `config.status' that you can run in the future to recreate the current configuration, and a file `config.log' containing compiler output (useful mainly for debugging `configure'). It can also use an optional file (typically called `config.cache' and enabled with `--cache-file=config.cache' or simply `-C') that saves the results of its tests to speed up reconfiguring. Caching is disabled by default to prevent problems with accidental use of stale cache files. If you need to do unusual things to compile the package, please try to figure out how `configure' could check whether to do them, and mail diffs or instructions to the address given in the `README' so they can be considered for the next release. If you are using the cache, and at some point `config.cache' contains results you don't want to keep, you may remove or edit it. The file `configure.ac' (or `configure.in') is used to create `configure' by a program called `autoconf'. You need `configure.ac' if you want to change it or regenerate `configure' using a newer version of `autoconf'. The simplest way to compile this package is: 1. `cd' to the directory containing the package's source code and type `./configure' to configure the package for your system. Running `configure' might take a while. While running, it prints some messages telling which features it is checking for. 2. Type `make' to compile the package. 3. Optionally, type `make check' to run any self-tests that come with the package, generally using the just-built uninstalled binaries. 4. Type `make install' to install the programs and any data files and documentation. When installing into a prefix owned by root, it is recommended that the package be configured and built as a regular user, and only the `make install' phase executed with root privileges. 5. Optionally, type `make installcheck' to repeat any self-tests, but this time using the binaries in their final installed location. This target does not install anything. Running this target as a regular user, particularly if the prior `make install' required root privileges, verifies that the installation completed correctly. 6. You can remove the program binaries and object files from the source code directory by typing `make clean'. To also remove the files that `configure' created (so you can compile the package for a different kind of computer), type `make distclean'. There is also a `make maintainer-clean' target, but that is intended mainly for the package's developers. If you use it, you may have to get all sorts of other programs in order to regenerate files that came with the distribution. 7. Often, you can also type `make uninstall' to remove the installed files again. In practice, not all packages have tested that uninstallation works correctly, even though it is required by the GNU Coding Standards. 8. Some packages, particularly those that use Automake, provide `make distcheck', which can by used by developers to test that all other targets like `make install' and `make uninstall' work correctly. This target is generally not run by end users. Compilers and Options ===================== Some systems require unusual options for compilation or linking that the `configure' script does not know about. Run `./configure --help' for details on some of the pertinent environment variables. You can give `configure' initial values for configuration parameters by setting variables in the command line or in the environment. Here is an example: ./configure CC=c99 CFLAGS=-g LIBS=-lposix *Note Defining Variables::, for more details. Compiling For Multiple Architectures ==================================== You can compile the package for more than one kind of computer at the same time, by placing the object files for each architecture in their own directory. To do this, you can use GNU `make'. `cd' to the directory where you want the object files and executables to go and run the `configure' script. `configure' automatically checks for the source code in the directory that `configure' is in and in `..'. This is known as a "VPATH" build. With a non-GNU `make', it is safer to compile the package for one architecture at a time in the source code directory. After you have installed the package for one architecture, use `make distclean' before reconfiguring for another architecture. On MacOS X 10.5 and later systems, you can create libraries and executables that work on multiple system types--known as "fat" or "universal" binaries--by specifying multiple `-arch' options to the compiler but only a single `-arch' option to the preprocessor. Like this: ./configure CC="gcc -arch i386 -arch x86_64 -arch ppc -arch ppc64" \ CXX="g++ -arch i386 -arch x86_64 -arch ppc -arch ppc64" \ CPP="gcc -E" CXXCPP="g++ -E" This is not guaranteed to produce working output in all cases, you may have to build one architecture at a time and combine the results using the `lipo' tool if you have problems. Installation Names ================== By default, `make install' installs the package's commands under `/usr/local/bin', include files under `/usr/local/include', etc. You can specify an installation prefix other than `/usr/local' by giving `configure' the option `--prefix=PREFIX', where PREFIX must be an absolute file name. You can specify separate installation prefixes for architecture-specific files and architecture-independent files. If you pass the option `--exec-prefix=PREFIX' to `configure', the package uses PREFIX as the prefix for installing programs and libraries. Documentation and other data files still use the regular prefix. In addition, if you use an unusual directory layout you can give options like `--bindir=DIR' to specify different values for particular kinds of files. Run `configure --help' for a list of the directories you can set and what kinds of files go in them. In general, the default for these options is expressed in terms of `${prefix}', so that specifying just `--prefix' will affect all of the other directory specifications that were not explicitly provided. The most portable way to affect installation locations is to pass the correct locations to `configure'; however, many packages provide one or both of the following shortcuts of passing variable assignments to the `make install' command line to change installation locations without having to reconfigure or recompile. The first method involves providing an override variable for each affected directory. For example, `make install prefix=/alternate/directory' will choose an alternate location for all directory configuration variables that were expressed in terms of `${prefix}'. Any directories that were specified during `configure', but not in terms of `${prefix}', must each be overridden at install time for the entire installation to be relocated. The approach of makefile variable overrides for each directory variable is required by the GNU Coding Standards, and ideally causes no recompilation. However, some platforms have known limitations with the semantics of shared libraries that end up requiring recompilation when using this method, particularly noticeable in packages that use GNU Libtool. The second method involves providing the `DESTDIR' variable. For example, `make install DESTDIR=/alternate/directory' will prepend `/alternate/directory' before all installation names. The approach of `DESTDIR' overrides is not required by the GNU Coding Standards, and does not work on platforms that have drive letters. On the other hand, it does better at avoiding recompilation issues, and works well even when some directory options were not specified in terms of `${prefix}' at `configure' time. Optional Features ================= If the package supports it, you can cause programs to be installed with an extra prefix or suffix on their names by giving `configure' the option `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'. Some packages pay attention to `--enable-FEATURE' options to `configure', where FEATURE indicates an optional part of the package. They may also pay attention to `--with-PACKAGE' options, where PACKAGE is something like `gnu-as' or `x' (for the X Window System). The `README' should mention any `--enable-' and `--with-' options that the package recognizes. For packages that use the X Window System, `configure' can usually find the X include and library files automatically, but if it doesn't, you can use the `configure' options `--x-includes=DIR' and `--x-libraries=DIR' to specify their locations. Some packages offer the ability to configure how verbose the execution of `make' will be. For these packages, running `./configure --enable-silent-rules' sets the default to minimal output, which can be overridden with `make V=1'; while running `./configure --disable-silent-rules' sets the default to verbose, which can be overridden with `make V=0'. Particular systems ================== On HP-UX, the default C compiler is not ANSI C compatible. If GNU CC is not installed, it is recommended to use the following options in order to use an ANSI C compiler: ./configure CC="cc -Ae -D_XOPEN_SOURCE=500" and if that doesn't work, install pre-built binaries of GCC for HP-UX. On OSF/1 a.k.a. Tru64, some versions of the default C compiler cannot parse its `' header file. The option `-nodtk' can be used as a workaround. If GNU CC is not installed, it is therefore recommended to try ./configure CC="cc" and if that doesn't work, try ./configure CC="cc -nodtk" On Solaris, don't put `/usr/ucb' early in your `PATH'. This directory contains several dysfunctional programs; working variants of these programs are available in `/usr/bin'. So, if you need `/usr/ucb' in your `PATH', put it _after_ `/usr/bin'. On Haiku, software installed for all users goes in `/boot/common', not `/usr/local'. It is recommended to use the following options: ./configure --prefix=/boot/common Specifying the System Type ========================== There may be some features `configure' cannot figure out automatically, but needs to determine by the type of machine the package will run on. Usually, assuming the package is built to be run on the _same_ architectures, `configure' can figure that out, but if it prints a message saying it cannot guess the machine type, give it the `--build=TYPE' option. TYPE can either be a short name for the system type, such as `sun4', or a canonical name which has the form: CPU-COMPANY-SYSTEM where SYSTEM can have one of these forms: OS KERNEL-OS See the file `config.sub' for the possible values of each field. If `config.sub' isn't included in this package, then this package doesn't need to know the machine type. If you are _building_ compiler tools for cross-compiling, you should use the option `--target=TYPE' to select the type of system they will produce code for. If you want to _use_ a cross compiler, that generates code for a platform different from the build platform, you should specify the "host" platform (i.e., that on which the generated programs will eventually be run) with `--host=TYPE'. Sharing Defaults ================ If you want to set default values for `configure' scripts to share, you can create a site shell script called `config.site' that gives default values for variables like `CC', `cache_file', and `prefix'. `configure' looks for `PREFIX/share/config.site' if it exists, then `PREFIX/etc/config.site' if it exists. Or, you can set the `CONFIG_SITE' environment variable to the location of the site script. A warning: not all `configure' scripts look for a site script. Defining Variables ================== Variables not defined in a site shell script can be set in the environment passed to `configure'. However, some packages may run configure again during the build, and the customized values of these variables may be lost. In order to avoid this problem, you should set them in the `configure' command line, using `VAR=value'. For example: ./configure CC=/usr/local2/bin/gcc causes the specified `gcc' to be used as the C compiler (unless it is overridden in the site shell script). Unfortunately, this technique does not work for `CONFIG_SHELL' due to an Autoconf bug. Until the bug is fixed you can use this workaround: CONFIG_SHELL=/bin/bash /bin/bash ./configure CONFIG_SHELL=/bin/bash `configure' Invocation ====================== `configure' recognizes the following options to control how it operates. `--help' `-h' Print a summary of all of the options to `configure', and exit. `--help=short' `--help=recursive' Print a summary of the options unique to this package's `configure', and exit. The `short' variant lists options used only in the top level, while the `recursive' variant lists options also present in any nested packages. `--version' `-V' Print the version of Autoconf used to generate the `configure' script, and exit. `--cache-file=FILE' Enable the cache: use and save the results of the tests in FILE, traditionally `config.cache'. FILE defaults to `/dev/null' to disable caching. `--config-cache' `-C' Alias for `--cache-file=config.cache'. `--quiet' `--silent' `-q' Do not print messages saying which checks are being made. To suppress all normal output, redirect it to `/dev/null' (any error messages will still be shown). `--srcdir=DIR' Look for the package's source code in directory DIR. Usually `configure' can determine that directory automatically. `--prefix=DIR' Use DIR as the installation prefix. *note Installation Names:: for more details, including other options available for fine-tuning the installation locations. `--no-create' `-n' Run the configure checks, but stop before creating any output files. `configure' also accepts some other, not widely useful, options. Run `configure --help' for more details. qjackctl-0.4.2/PaxHeaders.14935/Makefile.git0000644000000000000000000000013212700760152015275 xustar0030 mtime=1459871850.608902788 30 atime=1459871850.608902788 30 ctime=1459871850.608902788 qjackctl-0.4.2/Makefile.git0000644000175000001440000000047412700760152016046 0ustar00rncbcusers00000000000000all: configure configure: Makefile.in configure.ac @autoheader @autoconf @rm -rf *.cache clean: @if [ -f Makefile ]; then make clean; fi || true @rm -rvf Makefile configure config.* src/.ui src/.obj src/.moc @rm -rvf src/Makefile src/config.* src/*.pri src/*.desktop @rm -rvf *.cache *.log *.status *.spec qjackctl-0.4.2/PaxHeaders.14935/Makefile.in0000644000000000000000000000013212700760152015120 xustar0030 mtime=1459871850.608902788 30 atime=1459871850.608902788 30 ctime=1459871850.608902788 qjackctl-0.4.2/Makefile.in0000644000175000001440000000671512700760152015675 0ustar00rncbcusers00000000000000prefix = @ac_prefix@ name = qjackctl target = src/$(name) headers = \ src/config.h \ src/qjackctlAbout.h \ src/qjackctlAlsaConnect.h \ src/qjackctlConnect.h \ src/qjackctlConnectAlias.h \ src/qjackctlInterfaceComboBox.h \ src/qjackctlJackConnect.h \ src/qjackctlPatchbay.h \ src/qjackctlPatchbayFile.h \ src/qjackctlPatchbayRack.h \ src/qjackctlSession.h \ src/qjackctlSetup.h \ src/qjackctlStatus.h \ src/qjackctlSystemTray.h \ src/qjackctlAboutForm.h \ src/qjackctlConnectionsForm.h \ src/qjackctlMainForm.h \ src/qjackctlMessagesStatusForm.h \ src/qjackctlPatchbayForm.h \ src/qjackctlSessionForm.h \ src/qjackctlSetupForm.h \ src/qjackctlSocketForm.h sources = \ src/qjackctl.cpp \ src/qjackctlAlsaConnect.cpp \ src/qjackctlConnect.cpp \ src/qjackctlConnectAlias.cpp \ src/qjackctlInterfaceComboBox.cpp \ src/qjackctlJackConnect.cpp \ src/qjackctlPatchbay.cpp \ src/qjackctlPatchbayFile.cpp \ src/qjackctlPatchbayRack.cpp \ src/qjackctlSession.cpp \ src/qjackctlSetup.cpp \ src/qjackctlSystemTray.cpp \ src/qjackctlAboutForm.cpp \ src/qjackctlConnectionsForm.cpp \ src/qjackctlMainForm.cpp \ src/qjackctlMessagesStatusForm.cpp \ src/qjackctlPatchbayForm.cpp \ src/qjackctlSessionForm.cpp \ src/qjackctlSetupForm.cpp \ src/qjackctlSocketForm.cpp forms = \ src/qjackctlAboutForm.ui \ src/qjackctlConnectionsForm.ui \ src/qjackctlMainForm.ui \ src/qjackctlMessagesStatusForm.ui \ src/qjackctlPatchbayForm.ui \ src/qjackctlSessionForm.ui \ src/qjackctlSetupForm.ui \ src/qjackctlSocketForm.ui resources = \ src/qjackctl.qrc translations_sources = \ src/translations/qjackctl_cs.ts \ src/translations/qjackctl_de.ts \ src/translations/qjackctl_es.ts \ src/translations/qjackctl_fr.ts \ src/translations/qjackctl_it.ts \ src/translations/qjackctl_ja.ts \ src/translations/qjackctl_nl.ts \ src/translations/qjackctl_ru.ts translations_targets = \ src/translations/qjackctl_cs.qm \ src/translations/qjackctl_de.qm \ src/translations/qjackctl_es.qm \ src/translations/qjackctl_fr.qm \ src/translations/qjackctl_it.qm \ src/translations/qjackctl_ja.qm \ src/translations/qjackctl_nl.qm \ src/translations/qjackctl_ru.qm export datarootdir = @datarootdir@ export datadir = @datadir@ export mandir = @mandir@ translations_dir = $(datadir)/$(name)/translations export QMAKE = @ac_qmake@ export LUPDATE = @ac_lupdate@ export LRELEASE = @ac_lrelease@ all: $(target) $(target): $(name).mak $(resources) ${forms} $(sources) $(headers) @$(MAKE) -f $(name).mak $(name).mak: $(name).pro @$(QMAKE) -o $(name).mak $(name).pro translations_lupdate: $(name).pro @$(LUPDATE) -verbose -no-obsolete $(name).pro translations_lrelease: translations_lupdate $(translations_targets) %.qm: %.ts @$(LRELEASE) -verbose $< -qm $@ install: $(target) translations_lrelease $(name).1 @$(MAKE) INSTALL_ROOT=$(DESTDIR) -f $(name).mak install @install -d -v -m 0755 $(DESTDIR)$(translations_dir) @install -d -v -m 0755 $(DESTDIR)$(mandir)/man1 @install -v -m 0644 $(translations_targets) $(DESTDIR)$(translations_dir) @install -v -m 0644 $(name).1 $(DESTDIR)$(mandir)/man1 @gzip -vf $(DESTDIR)$(mandir)/man1/$(name).1 uninstall: $(DESTDIR)$(prefix)/bin/$(name) @$(MAKE) INSTALL_ROOT=$(DESTDIR) -f $(name).mak uninstall @rm -rvf $(DESTDIR)$(translations_dir) @rm -vf $(DESTDIR)$(mandir)/man1/$(name).* clean: $(name).mak @$(MAKE) -f $(name).mak distclean @rm -f $(target) $(target).mak $(name).mak @rm -rf *.cache *.log *.status $(translations_targets) qjackctl-0.4.2/PaxHeaders.14935/qjackctl.10000644000000000000000000000013212700760152014731 xustar0030 mtime=1459871850.609903288 30 atime=1459871850.609903288 30 ctime=1459871850.609903288 qjackctl-0.4.2/qjackctl.10000644000175000001440000000254212700760152015500 0ustar00rncbcusers00000000000000.TH QJACKCTL 1 "June 17, 2014" .SH NAME qjackctl \- User interface for controlling JACK (Jack Audio Connection Kit) .SH SYNOPSIS .B qjackctl [\fIoptions\fR] .SH DESCRIPTION This manual page documents briefly the .B qjackctl command. .PP .PP \fBQjackCtl\fP is used for controlling the Jack Audio Connection Kit (JACK) and as a patchbay for ALSA MIDI devices. QjackCtl also has support for the JACK transport control protocol, so you can use it to start and stop the JACK transport. Once you start qjackctl, you get presented with a single GUI window, the buttons are self-explanatory and have tooltips. .SH OPTIONS .HP \fB\-s\fR, \fB\-\-start\fR .IP Start JACK audio server immediately .HP \fB\-p\fR, \fB\-\-preset\fR=[\fIlabel\fR] .IP Set default settings preset name .HP \fB\-a\fR, \fB\-\-active\-patchbay\fR=[\fIpath\fR] .IP Set active patchbay definition file .HP \fB\-n\fR, \fB\-\-server\-name\fR=[\fIlabel\fR] .IP Set default JACK audio server name .HP \fB\-h\fR, \fB\-\-help\fR .IP Show help about command line options .HP \fB\-v\fR, \fB\-\-version\fR .IP Show version information. .SH SEE ALSO .BR jackd (1) .SH FILES Configuration settings are stored in ~/.config/rncbc.org/QjackCtl.conf .SH AUTHOR QjackCtl was written by Rui Nuno Capela. .PP This manual page was written by Guenter Geiger , for the Debian project (but may be used by others). qjackctl-0.4.2/PaxHeaders.14935/qjackctl.pro0000644000000000000000000000013212700760152015371 xustar0030 mtime=1459871850.609903288 30 atime=1459871850.609903288 30 ctime=1459871850.609903288 qjackctl-0.4.2/qjackctl.pro0000644000175000001440000000006212700760152016133 0ustar00rncbcusers00000000000000# qjackctl.pro # TEMPLATE = subdirs SUBDIRS = src qjackctl-0.4.2/PaxHeaders.14935/qjackctl.spec.in0000644000000000000000000000013212700760152016130 xustar0030 mtime=1459871850.609903288 30 atime=1459871850.609903288 30 ctime=1459871850.609903288 qjackctl-0.4.2/qjackctl.spec.in0000644000175000001440000001027612700760152016702 0ustar00rncbcusers00000000000000%define name @PACKAGE_TARNAME@ %define version @PACKAGE_VERSION@ %define release 25 %define _prefix @ac_prefix@ Summary: JACK Audio Connection Kit Qt GUI Interface Name: %{name} Version: %{version} Release: %{release} License: GPL-2.0+ Group: Productivity/Multimedia/Sound/Utilities Source0: %{name}-%{version}.tar.gz URL: http://qjackctl.sourceforge.net/ #Packager: rncbc.org BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-buildroot #BuildRequires: libqt4-devel >= 4.4 %if %{defined fedora} BuildRequires: qt5-qtbase-devel >= 5.1, qt5-linguist BuildRequires: qt5-qtx11extras-devel >= 5.1 %else BuildRequires: libqt5-qtbase-devel >= 5.1, libqt5-linguist BuildRequires: libqt5-qtx11extras-devel >= 5.1 %endif BuildRequires: libjack-devel >= 0.100.0 BuildRequires: alsa-devel %description JACK Audio Connection Kit - Qt GUI Interface: A simple Qt application to control the JACK server. Written in C++ around the Qt framework for X11, most exclusively using Qt Designer. Provides a simple GUI dialog for setting several JACK server parameters, which are properly saved between sessions, and a way control of the status of the audio server. With time, this primordial interface has become richer by including a enhanced patchbay and connection control features. %prep %setup [ -f Makefile.git ] && %__make -f Makefile.git %build %configure %__make %{?_smp_mflags} %install %__make DESTDIR=%{buildroot} install %clean [ -d %{buildroot} -a "%{buildroot}" != "" ] && %__rm -rf %{buildroot} %files %defattr(-,root,root) %doc AUTHORS COPYING ChangeLog README TODO #dir %{_datadir}/applications %dir %{_datadir}/icons/hicolor %dir %{_datadir}/icons/hicolor/32x32 %dir %{_datadir}/icons/hicolor/32x32/apps %dir %{_datadir}/%{name} %dir %{_datadir}/%{name}/translations %dir %{_datadir}/appdata #dir %{_datadir}/man #dir %{_datadir}/man/man1 %{_bindir}/%{name} %{_datadir}/applications/%{name}.desktop %{_datadir}/icons/hicolor/32x32/apps/%{name}.png %{_datadir}/%{name}/translations/%{name}_*.qm %{_datadir}/appdata/%{name}.appdata.xml %{_datadir}/man/man1/%{name}.1.gz %changelog * Tue Apr 5 2016 Rui Nuno Capela 0.4.2 - Spring'16 release frenzy. * Wed Oct 28 2015 Rui Nuno Capela 0.4.1 - A Fall'15 release. * Wed Jul 15 2015 Rui Nuno Capela 0.4.0 - Summer'15 release frenzy. * Wed Mar 25 2015 Rui Nuno Capela 0.3.13 - Pre-LAC2015 release frenzy. * Sun Oct 19 2014 Rui Nuno Capela 0.3.12 - JACK Pretty-names aliasing. * Tue Dec 31 2013 Rui Nuno Capela 0.3.11 - A fifth of a Jubilee release. * Tue Apr 2 2013 Rui Nuno Capela 0.3.10 - The singing swan rehersal. * Fri May 18 2012 Rui Nuno Capela 0.3.9 - The last of the remnants. * Fri Jul 1 2011 Rui Nuno Capela 0.3.8 - JACK Session versioning. * Tue Nov 30 2010 Rui Nuno Capela 0.3.7 - JACK Session managerism. * Mon May 17 2010 Rui Nuno Capela - Standard desktop icon fixing. * Mon Jan 11 2010 Rui Nuno Capela 0.3.6 - Full D-Busification! * Mon Jan 11 2010 Rui Nuno Capela - Man page added. * Wed Sep 30 2009 Rui Nuno Capela 0.3.5 - Slipped away! * Fri Dec 05 2008 Rui Nuno Capela 0.3.4 - Patchbay snapshot revamp. * Sat Jun 07 2008 Rui Nuno Capela 0.3.3 - Patchbay JACK-MIDI, file logging and X11 uniqueness. * Thu Dec 20 2007 Rui Nuno Capela 0.3.2 - Patchbay heads-up with season greetings. * Thu Jul 19 2007 Rui Nuno Capela - System-tray tooltip icon crash fix. * Wed Jul 18 2007 Rui Nuno Capela 0.3.1 - Shallowed bug-fix release.. * Tue Jul 10 2007 Rui Nuno Capela 0.3.0 - Qt4 migration was complete. * Mon Jun 25 2007 Rui Nuno Capela - Application icon is now installed to (prefix)/share/pixmaps. - Declared fundamental build and run-time requirements. - Destination install directory prefix is now in spec. - Spec is now a bit more openSUSE compliant. * Wed May 31 2006 Rui Nuno Capela - Changed copyright to license attribute * Wed Aug 24 2005 Rui Nuno Capela - Created initial qjackctl.spec qjackctl-0.4.2/PaxHeaders.14935/README0000644000000000000000000000013212700760152013733 xustar0030 mtime=1459871850.608902788 30 atime=1459871850.608902788 30 ctime=1459871850.608902788 qjackctl-0.4.2/README0000644000175000001440000001111612700760152014477 0ustar00rncbcusers00000000000000QjackCtl - JACK Audio Connection Kit Qt GUI Interface ----------------------------------------------------- QjackCtl is a simple Qt application to control the JACK sound server (http://jackaudio.org), for the Linux Audio infrastructure. Written in C++ around the Qt framework for X11, most exclusively using Qt Designer. Provides a simple GUI dialog for setting several JACK server parameters, which are properly saved between sessions, and a way control of the status of the audio server. With time, this primordial interface has become richer by including a enhanced patchbay and connection control features. Homepage: http://qjackctl.sourceforge.net License: GNU General Public License (GPL) Requirements ------------ The software requirements for build and runtime are listed as follows: Mandatory: - Qt framework, C++ class library and tools for cross-platform application and UI development http://qt.io/ - JACK Audio Connection Kit http://jackaudio.org/ Optional (opted-in at build time): - ALSA, Advanced Linux Sound Architecture http://www.alsa-project.org/ Installation ------------ The installation procedure follows the standard for source distributions: ./configure [--prefix=/usr/local] make and optionally as root: make install This procedure will end installing the following files: ${prefix}/bin/qjackctl ${prefix}/share/pixmaps/qjackctl.png ${prefix}/share/applications/qjackctl.desktop ${prefix}/share/qjackctl/translations/qjackctl_*.qm ${prefix}/share/man/man1/qjackctl.1 Just launch ${prefix}/bin/qjackctl and you're off (hopefully). If you're checking out from Git, you'll have to prepare the configure script just before you proceed with the above instructions: make -f Makefile.git Configuration ------------- QjackCtl holds its settings and configuration state per user, in a file located as $HOME/.config/rncbc.org/QjackCtl.conf . Normally, there's no need to edit this file, as it is recreated and rewritten everytime qjackctl is run. Bugs ---- Probably plenty still, QjackCtl maybe considered on beta stage already. It has been locally tested since JACK release 0.98.0, with custom 2.4 kernels with low-latency, preemptible and capabilities enabling patches. As for 2.6 kernels, the emergence of Ingo Molnar's Realtime Preemption kernel patch it's being now recommended for your taking benefit of the realtime and low-latency audio pleasure JACK can give. Support ------- QjackCtl is open source free software. For bug reports, feature requests, discussion forums, mailling lists, or any other matter related to the development of this piece of software, please use the Sourceforge project page (http://sourceforge.net/projects/qjackctl). You can also find timely and closer contact information on my personal web site (http://www.rncbc.org). Acknowledgments --------------- QjackCtl's user interface layout (and the whole idea for that matter) was partially borrowed from origoinal Lawrie Abbott's jacko project, which was taken from wxWindow/Python into the Qt/C++ arena. Since 2003-08-06, qjackctl has been included in the awesome Planet CCRMA (http://ccrma-www.stanford.edu/planetccrma/software/) software collection. Thanks a lot Fernando! Here are some people who helped this project in one way or another, and in fair and strict alphabetic order: Alexandre Prokoudine Kasper Souren Andreas Persson Kjetil Matheussen Arnout Engelen Ken Ellinwood Austin Acton Lawrie Abbott Ben Powers Lee Revell Chris Cannam Lucas Brasilino Dan Nigrin Marc-Olivier Barre Dave Moore Mark Knecht Dave Phillips Matthias Nagorni Dirk Jagdmann Melanie Dominic Sacre Nedko Arnaudov Fernando Pablo Lopez-Lezcano Orm Finnendahl Filipe Tomas Paul Davis Florian Schmidt Robert Jonsson Fons Adriaensen Robin Gareus Geoff Beasley Roland Mas Jack O'Quin Sampo Savolainen Jacob Meuser Stephane Letz Jesse Chappell Steve Harris Joachim Deguara Taybin Rutkin John Schneiderman Wilfried Huss Jussi Laako Wolfgang Woehl Karsten Wiese A special mention should go to the translators of QjackCtl (see TRANSLATORS). Thanks to you all. -- rncbc aka Rui Nuno Capela rncbc@rncbc.org qjackctl-0.4.2/PaxHeaders.14935/src0000644000000000000000000000013212700760155013570 xustar0030 mtime=1459871853.461328333 30 atime=1459871850.609903288 30 ctime=1459871853.461328333 qjackctl-0.4.2/src/0000755000175000001440000000000012700760155014411 5ustar00rncbcusers00000000000000qjackctl-0.4.2/src/PaxHeaders.14935/qjackctlConnectAlias.cpp0000644000000000000000000000013212700760152020426 xustar0030 mtime=1459871850.617907288 30 atime=1459871850.617907288 30 ctime=1459871850.617907288 qjackctl-0.4.2/src/qjackctlConnectAlias.cpp0000644000175000001440000001565412700760152021205 0ustar00rncbcusers00000000000000// qjackctlConnectAlias.cpp // /**************************************************************************** Copyright (C) 2003-2014, rncbc aka Rui Nuno Capela. All rights reserved. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. *****************************************************************************/ #include "qjackctlConnectAlias.h" #include //---------------------------------------------------------------------- // class qjackctlClientAlias -- Client item alias map. // Constructor. qjackctlClientAlias::qjackctlClientAlias ( const QString& sClientName, const QString& sClientAlias ) { if (sClientAlias.isEmpty()) { m_rxClientName.setPattern(escapeRegExpDigits(sClientName)); m_sClientAlias = sClientName; } else { m_rxClientName.setPattern(sClientName); m_sClientAlias = sClientAlias; } } // Default destructor. qjackctlClientAlias::~qjackctlClientAlias (void) { m_ports.clear(); } // Client name method. QString qjackctlClientAlias::clientName (void) const { return m_rxClientName.pattern(); } // Client name matcher. bool qjackctlClientAlias::matchClientName ( const QString& sClientName ) const { return m_rxClientName.exactMatch(sClientName); } // Client aliasing methods. const QString& qjackctlClientAlias::clientAlias (void) const { return m_sClientAlias; } void qjackctlClientAlias::setClientAlias ( const QString& sClientAlias ) { m_sClientAlias = sClientAlias; } // Port aliasing methods. QString qjackctlClientAlias::portAlias ( const QString& sPortName ) const { QString sPortAlias = m_ports[sPortName]; if (sPortAlias.isEmpty()) sPortAlias = sPortName; return sPortAlias; } void qjackctlClientAlias::setPortAlias ( const QString& sPortName, const QString& sPortAlias ) { m_ports[sPortName] = sPortAlias; } // Save client/port aliases definitions. void qjackctlClientAlias::saveSettings ( QSettings& settings, const QString& sClientKey ) { settings.beginGroup(sClientKey); settings.setValue("/Name", m_rxClientName.pattern()); settings.setValue("/Alias", m_sClientAlias); int iPort = 0; QMap::ConstIterator iter = m_ports.begin(); while (iter != m_ports.end()) { settings.beginGroup("/Port" + QString::number(++iPort)); settings.setValue("/Name", iter.key()); settings.setValue("/Alias", iter.value()); settings.endGroup(); ++iter; } settings.endGroup(); } // Escape and format a string as a regular expresion. QString qjackctlClientAlias::escapeRegExpDigits ( const QString& s, int iThreshold ) { QString sDigits; QString sResult; QString sEscape = QRegExp::escape(s); int iDigits = 0; for (int i = 0; i < sEscape.length(); i++) { const QChar& ch = sEscape.at(i); if (ch.isDigit()) { if (iDigits < iThreshold) sDigits += ch; else sDigits = "[0-9]+"; iDigits++; } else { if (iDigits > 0) { sResult += sDigits; sDigits = QString::null; iDigits = 0; } sResult += ch; } } if (iDigits > 0) sResult += sDigits; return sResult; } // Need for generic sort. bool qjackctlClientAlias::operator< ( const qjackctlClientAlias& other ) { return (m_sClientAlias < other.clientAlias()); } //---------------------------------------------------------------------- // class qjackctlConnectAlias -- Client list alias map. // Constructor. qjackctlConnectAlias::qjackctlConnectAlias (void) { } // Default destructor. qjackctlConnectAlias::~qjackctlConnectAlias (void) { qDeleteAll(*this); clear(); } // Client finders. qjackctlClientAlias *qjackctlConnectAlias::findClientName ( const QString& sClientName ) { QListIterator iter(*this); while (iter.hasNext()) { qjackctlClientAlias *pClient = iter.next(); if (pClient->matchClientName(sClientName)) return pClient; } return NULL; } // Client aliasing methods. void qjackctlConnectAlias::setClientAlias ( const QString& sClientName, const QString& sClientAlias ) { qjackctlClientAlias *pClient = findClientName(sClientName); if (pClient == NULL) { pClient = new qjackctlClientAlias(sClientName); append(pClient); } pClient->setClientAlias(sClientAlias); } QString qjackctlConnectAlias::clientAlias ( const QString& sClientName ) { qjackctlClientAlias *pClient = findClientName(sClientName); if (pClient == NULL) return sClientName; return pClient->clientAlias(); } // Client/port aliasing methods. void qjackctlConnectAlias::setPortAlias ( const QString& sClientName, const QString& sPortName, const QString& sPortAlias ) { qjackctlClientAlias *pClient = findClientName(sClientName); if (pClient == NULL) { pClient = new qjackctlClientAlias(sClientName); append(pClient); } pClient->setPortAlias(sPortName, sPortAlias); } QString qjackctlConnectAlias::portAlias ( const QString& sClientName, const QString& sPortName ) { qjackctlClientAlias *pClient = findClientName(sClientName); if (pClient == NULL) return sPortName; return pClient->portAlias(sPortName); } // Load/save aliases definitions. void qjackctlConnectAlias::loadSettings ( QSettings& settings, const QString& sAliasesKey ) { clear(); settings.beginGroup(sAliasesKey); QStringListIterator iter(settings.childGroups()); while (iter.hasNext()) { QString sClientKey = iter.next(); QString sClientName = settings.value(sClientKey + "/Name").toString(); QString sClientAlias = settings.value(sClientKey + "/Alias").toString(); if (!sClientName.isEmpty() && !sClientAlias.isEmpty()) { qjackctlClientAlias *pClient = new qjackctlClientAlias(sClientName, sClientAlias); append(pClient); settings.beginGroup(sClientKey); QStringListIterator it(settings.childGroups()); while (it.hasNext()) { QString sPortKey = it.next(); QString sPortName = settings.value(sPortKey + "/Name").toString(); QString sPortAlias = settings.value(sPortKey + "/Alias").toString(); if (!sPortName.isEmpty() && !sPortAlias.isEmpty()) pClient->setPortAlias(sPortName, sPortAlias); } settings.endGroup(); } } settings.endGroup(); } void qjackctlConnectAlias::saveSettings ( QSettings& settings, const QString& sAliasesKey ) { qSort(*this); settings.beginGroup(sAliasesKey); int iClient = 0; QListIterator iter(*this); while (iter.hasNext()) { (iter.next())->saveSettings(settings, "Client" + QString::number(++iClient)); } settings.endGroup(); } // end of qjackctlConnectAlias.cpp qjackctl-0.4.2/src/PaxHeaders.14935/qjackctlConnectionsForm.ui0000644000000000000000000000013212700760152021024 xustar0030 mtime=1459871850.618907789 30 atime=1459871850.617907288 30 ctime=1459871850.618907789 qjackctl-0.4.2/src/qjackctlConnectionsForm.ui0000644000175000001440000004036112700760152021574 0ustar00rncbcusers00000000000000 rncbc aka Rui Nuno Capela JACK Audio Connection Kit - Qt GUI Interface. Copyright (C) 2003-2014, rncbc aka Rui Nuno Capela. All rights reserved. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. qjackctlConnectionsForm 0 0 480 320 1 1 0 0 Connections - JACK Audio Connection Kit :/images/connections1.png 4 4 0 Audio 4 4 7 7 0 0 Qt::TabFocus 4 4 Connect currently selected ports &Connect :/images/connect1.png Disconnect currently selected ports &Disconnect :/images/disconnect1.png Disconnect all currently connected ports Disconnect &All :/images/disconnectall1.png Qt::Horizontal QSizePolicy::Expanding 8 8 Expand all client ports E&xpand All :/images/expandall1.png Qt::Horizontal QSizePolicy::Expanding 8 8 Refresh current connections view &Refresh :/images/refresh1.png MIDI 4 4 7 7 0 0 Qt::TabFocus 4 4 Connect currently selected ports &Connect :/images/connect1.png Disconnect currently selected ports &Disconnect :/images/disconnect1.png Disconnect all currently connected ports Disconnect &All :/images/disconnectall1.png Qt::Horizontal QSizePolicy::Expanding 8 8 Expand all client ports E&xpand All :/images/expandall1.png Qt::Horizontal QSizePolicy::Expanding 8 8 Refresh current connections view &Refresh :/images/refresh1.png ALSA 4 4 7 7 0 0 Qt::TabFocus 4 4 Connect currently selected ports &Connect :/images/connect1.png Disconnect currently selected ports &Disconnect :/images/disconnect1.png Disconnect all currently connected ports Disconnect &All :/images/disconnectall1.png Qt::Horizontal QSizePolicy::Expanding 8 8 Expand all client ports E&xpand All :/images/expandall1.png Qt::Horizontal QSizePolicy::Expanding 8 8 Refresh current connections view &Refresh :/images/refresh1.png qjackctlConnectView QWidget
qjackctlConnect.h
ConnectionsTabWidget AudioConnectView AudioConnectPushButton AudioDisconnectPushButton AudioDisconnectAllPushButton AudioExpandAllPushButton AudioRefreshPushButton MidiConnectView MidiConnectPushButton MidiDisconnectPushButton MidiDisconnectAllPushButton MidiExpandAllPushButton MidiRefreshPushButton AlsaConnectView AlsaConnectPushButton AlsaDisconnectPushButton AlsaDisconnectAllPushButton AlsaExpandAllPushButton AlsaRefreshPushButton
qjackctl-0.4.2/src/PaxHeaders.14935/qjackctlSessionForm.ui0000644000000000000000000000013212700760152020165 xustar0030 mtime=1459871850.625911288 30 atime=1459871850.623910288 30 ctime=1459871850.625911288 qjackctl-0.4.2/src/qjackctlSessionForm.ui0000644000175000001440000002016312700760152020733 0ustar00rncbcusers00000000000000 rncbc aka Rui Nuno Capela JACK Audio Connection Kit - Qt GUI Interface. Copyright (C) 2003-2013, rncbc aka Rui Nuno Capela. All rights reserved. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. qjackctlSessionForm 0 0 480 320 Session - JACK Audio Connection Kit :/images/session1.png Load session &Load... :/images/open1.png Recent session &Recent Qt::Horizontal 20 20 Save session &Save :/images/save1.png Save session versioning &Versioning Qt::Horizontal 20 20 Update session Re&fresh :/images/refresh1.png Qt::Vertical Session clients / connections false true false true Client / Ports UUID Command Infra-clients / commands false true false true Infra-client Infra-command Add infra-client &Add :/images/add1.png Edit infra-client &Edit :/images/edit1.png Remove infra-client Re&move :/images/remove1.png Qt::Vertical 20 8 LoadSessionPushButton RecentSessionPushButton SaveSessionPushButton SaveSessionVersionCheckBox UpdateSessionPushButton SessionTreeView InfraClientListView AddInfraClientPushButton EditInfraClientPushButton RemoveInfraClientPushButton qjackctl-0.4.2/src/PaxHeaders.14935/qjackctlMessagesStatusForm.ui0000644000000000000000000000013212700760152021515 xustar0030 mtime=1459871850.621909288 30 atime=1459871850.621909288 30 ctime=1459871850.621909288 qjackctl-0.4.2/src/qjackctlMessagesStatusForm.ui0000644000175000001440000001444112700760152022265 0ustar00rncbcusers00000000000000 rncbc aka Rui Nuno Capela JACK Audio Connection Kit - Qt GUI Interface. Copyright (C) 2003-2014, rncbc aka Rui Nuno Capela. All rights reserved. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. qjackctlMessagesStatusForm 0 0 480 320 0 0 Messages / Status - JACK Audio Connection Kit :/images/messagesstatus1.png 0 :/images/messages1.png &Messages Messages log 320 80 Messages output log false QTextEdit::NoWrap true :/images/status1.png &Status Status information 0 0 240 0 Statistics since last server startup true QAbstractItemView::NoSelection true true false true Description Value Reset XRUN statistic values Re&set :/images/reset1.png Qt::Horizontal QSizePolicy::Expanding 313 16 Refresh XRUN statistic values &Refresh :/images/refresh1.png MessagesTextView StatsListView ResetPushButton RefreshPushButton qjackctl-0.4.2/src/PaxHeaders.14935/images0000644000000000000000000000013212700760152015032 xustar0030 mtime=1459871850.615906288 30 atime=1459871850.609903288 30 ctime=1459871850.615906288 qjackctl-0.4.2/src/images/0000755000175000001440000000000012700760152015653 5ustar00rncbcusers00000000000000qjackctl-0.4.2/src/images/PaxHeaders.14935/aportpni.png0000644000000000000000000000013212700760152017451 xustar0030 mtime=1459871850.610903788 30 atime=1459871850.610903788 30 ctime=1459871850.610903788 qjackctl-0.4.2/src/images/aportpni.png0000644000175000001440000000025512700760152020217 0ustar00rncbcusers00000000000000‰PNG  IHDRķŻāRPLTEpH@€€€€€ĄĄĄf’’’’’­ĆvtRNS@ęŲfFIDATxŚcHb€e(ƒ)) ŹTŹ&:ŗA„E Bj‚j!¦Ä„ĀÄŌdØjaP3•R`b0{B0G0«9I o09˜IEND®B`‚qjackctl-0.4.2/src/images/PaxHeaders.14935/remove1.png0000644000000000000000000000013212700760152017173 xustar0030 mtime=1459871850.615906288 30 atime=1459871850.615906288 30 ctime=1459871850.615906288 qjackctl-0.4.2/src/images/remove1.png0000644000175000001440000000030512700760152017735 0ustar00rncbcusers00000000000000‰PNG  IHDRó’asRGB®ĪéIDAT8˵SÉ€ \©Ģjhź°ėĄŹāĆAŃ,Æü`$ĖüPį!¶ ŃĀB„-ģLHšØ0æazOLD Ū9\īˆéJVxŽ] —ĪNŌ ‹ēā,@dS8Ņ]²xā „i³jµ²Ų»[i§ƒŽ§ xóY>ÆR£h ū¬#IEND®B`‚qjackctl-0.4.2/src/images/PaxHeaders.14935/mcliento_64x64.png0000644000000000000000000000013212700760152020302 xustar0030 mtime=1459871850.611904288 30 atime=1459871850.611904288 30 ctime=1459871850.611904288 qjackctl-0.4.2/src/images/mcliento_64x64.png0000644000175000001440000000632512700760152021054 0ustar00rncbcusers00000000000000‰PNG  IHDR@@·ģśPLTE   #  *.2#6- ;@.6H($-"MR-+0+&X6*%S ]b!T&71,h Z& >1,76*l$T.q'x'N9+[5 @>=~,@B5E?9„+K>:z/ .EF4PA3-p9JG;‹1b>+LFB~8›0—4—4cF8TMGSPNTRESTA\RB–@iODWVT`SO]VP @lUI^_Kb\Ua]\i[VoZR‰T;ebU„L›O+deOgf^efdqb\jedmf`ŖV+okjooXroPrlexjf®[5use„b>­`7˜hRxsqww`qlztmˆpb|zlµhC~bzt{yœub¬pS¶oNƒ„oŽ{†‡i†…w‰ƒ|ˆƒ‚¶z^¼zVŒx•‡‚ŽŽ‹Š”Œ†‘‘u†“”m·ˆo“–‡Į…f˜“’›“”–“²Œy™˜ ™“ŸĒq ½“£¤|¦ž˜É•|„؆Ŗ§‰§¦œ©¤¢¬¤ÅžŠµ¤Īžƒ°¬‹®­’²Ŗ£°±‰ÆÆ¦²­¬Š„‘²³·ÆØæÆØ·²±ŗ¹ŠŹ­”¹·œ¶¶­¼“­Öƙ¼»²Ų²šĄŗ¹Ćŗ“ĆĀ“½æ¼ĮĮ±Š»±ĒæøÜø„ÅÅ­Ęɦɏ Ü¾°ĢȦĢĽŹĘÄĶ̜ÕĆøŽĆ“ŃČĮÉĶ¼ŃŠ ĶĢÄŠŃØŠÓÆŚĖÅÖĪĒåÉŗŌÕ«ŌĻĪÕŌøŲŌ²ÓÖĘŪŁ©čĪÅÖŚ¶×ŲĀÜÜ²ŽŚøŻ×ŌŻŪæčÕŹßą¶äß½įąĆßā¾ļÜŃåįŅćäĪåąŽęäČźéøćēÖńįÜéźÓėģĆģźĪčģŪķčęńéāšķŻšńĢ óņÕōšįóņčųöÅöšļōõŽņöåņōńöõģśłšż÷öžśėłūų’żąśžķž’ē@LtRNS@ęŲf ‰IDATxŚķWkTSWVDE‰E@@D^*T†žZ‹RĒZ„5č4ā  •‡($ˆŠ4š h¢B™ӀLAˆ—€„GØP1¢ŅšµfŸøÖŌśsÖ¬łĪͽY+kēŪß>ēžiÓžW`°ķ±·˜ ńy9ti»ézJ’“‰€ 0$ĢäuÖš4 Ž*•E¾GSSĻ„¦¦žj#ŅE"‘ącÅl&Ęd\¦Ó(Ō3T2ŁÉt;" p‚†jĶ:€·hĮŖƒĒŽ;tģŠ÷RüƒŹŹJ$Ą óņ ‚TJ"9*ŹĘ5ˆ€ Š×ŸYŽX5©@9¢Č]¶ū¾C"2QÄēßåņ‹a1Y×PAj||llIĻĻÉĶO0ŠQŚŚĄÓ(x”āŲķŽ§ƒįt- bH€ Ši@˜HŽŽ•ćoU] x—Źdcy9ų ¶IŒŠŠš×öÜ820ŠGfh•6 nkLŒ=ąōšńB7÷ƘgG3Æ3Vļ`OŽ&zŹBēāń0’Ģņ÷SIs¹ųųx”įåćķ²©0VŪ5‰Ī°š VäčŠņuaó!}d ā5ņnOń@V`ģgpłøų^fzŹĶŒT*¹ÜÜĻČĮœ0U€ ‹'€TńÜ4 I*Ķ5öĄĆ½Ō ŽK" //P9L—;Čõ<ĆHNó 5B¼–¼Ÿ(˜€S8Ś'1hPžØDrčrGńČ0`†J„āU n»M üDš˜ąķƒĪŃKģlüü<]Ķ?10Ę·Z‚øZŁ³)U€zzžäᭁ—»œĆų9§€%¼D'¶€:•–<ą%˜8Ճ'’śŌÖŁećG µ5¼MĘgן£. „«äNŅ—Į ›‡”“=ż)#9--A}ééŌøRRŅSŅļæ{Ł(ü°tœĄiøgZ¹įį_5 źŸ?}†š Ż~žågt©Q%.,˜čó>č=½=}½b¼‹Ū;››µ×74jźjźjŖ«Ŗ««Q0|nÄiĶå” ģéķėU‡CŁŽ.®‡. bPl]µ ŗ\P.šąāń~ø·`J³»õHBĀįH@Tä®ČH4nĒŽ†¶0ęšž˜˜Čż1{¾l@X³į‹„æŪx;@æÉ)Čeå^JONŽŒÜŗyóśÕ+?[¾tį,łĒµīØń„õˆ“§åį;×®eŸ=³’·ßlXš‘½(“Ī£ ™L*ėii†ģŒ³Ēćāö|ūŻĒĄi=śö…B •ķE ·²³Īžˆ ’8ÖĮ‰’ž––œ–œ Ęމܵk3`õ77=üēÅ“õÜæ_öüåųķķ;ųĻńį× <+/æ•}Öķó?@x čėėzŚÕŁŁÕÜÕÕŚÜŚŚŚØćݾqįäwæÆĮ”½O,īj$nĘQ÷­Įźź:ųTUWó~āäž5HbOöÕģģģ,ō¹z5;++ėāÕ¬‹/dĮøpįģÉø8(ꚅ ˜>ė?A[{–¶śĖt€ÜaŚ’ń߆sĄńGĢEŚŌIEND®B`‚qjackctl-0.4.2/src/images/PaxHeaders.14935/aportlto_32x32.png0000644000000000000000000000013212700760152020322 xustar0030 mtime=1459871850.610903788 30 atime=1459871850.610903788 30 ctime=1459871850.610903788 qjackctl-0.4.2/src/images/aportlto_32x32.png0000644000175000001440000000206712700760152021073 0ustar00rncbcusers00000000000000‰PNG  IHDR D¤ŠĘmPLTE   ## !!!&&"""(('' ((%%%)) (*&))$,,//***!..00%33000'5511188666,;;777??==@@0BB===??3>>>3EE@@@>AAAAABBBGGGHHHQQSSz‹‹‹ršš˜˜@””csœœvœœœœ6tžžx’’’žžB””;¢¢D””S››…z¦¦¢¢OŸ£Z›››„„K¦¦E¦¦G~Ŗ§§§J€«Ø©©E€­­€®®°°¢¢¢‚°°¬«\„³³Š¼¼‹½½øøaŒ¾¾ĄĄ±±±ŽĮĮĀĆĆææYææ_‘ÄÄ···ĄĄsĆĆf¹¹¹ŗŗŗ»»»ĮĘ|¾¾¾ČČuæææÉÉrĖĖeĀĀĀĶĶlĪĪjŌŌpÕÕpŲŲrŻŻƒß߈āāƒēēįįįåååņņŒņņŽóóöö÷ų‘üü–żż—jŠÓtRNS@ęŲfxIDATxŚc` ŲŖŚŲā‘7k_µlķlœņ Õ5+Ö.[5W—łéÕu+V-›“‹ĆŪ„Ė:ŖkV.ī/SĘ®@nŚZ ŠŖ…Ķ©źŲ”ēĻ\»¢µ2£$V«¼SŪĪ-3ĶĻNtÅźĶ¢ÉĒNO¬h(šó”Ē&Æ2k’¶«“Ācģ…±ÉĖNŁwņĢ„/knv¬ę‹ö,š9ø3ĮFG u-ńŽā"ŽCž³qCšę”sŒ8äŁjw‡åĻž=‹]^æxo^łĢży›ĄņŲč'īoڑǪB?j’ń>˜¼)¦½Ž“gÖšAä-:³0äY§Zæ3AdöYóĪu3˜Ńø>5ÕYĀ̚al§†*/µēD·»$œ+aźkˆŖĄhG©.‚[8O,E^#‡Ÿ™?i«N2_°ÕĄķėt¢5 ōAsņ‘å:ž–®cŗŸvµ(YX!ø"Žč ŽÓŖG2 ]AP( —!‘ٰ‹Yo=¢IEND®B`‚qjackctl-0.4.2/src/images/PaxHeaders.14935/aportpti_32x32.png0000644000000000000000000000013212700760152020320 xustar0030 mtime=1459871850.610903788 30 atime=1459871850.610903788 30 ctime=1459871850.610903788 qjackctl-0.4.2/src/images/aportpti_32x32.png0000644000175000001440000000257712700760152021077 0ustar00rncbcusers00000000000000‰PNG  IHDR D¤ŠĘ÷PLTE02/ %((' &('(&,-..*.!.-&-.,0013  5267 575524187463=<:7,685<=<<%9;8>=!DB>>'BA AA>@=FFCF#ACAJLGH IG+JJIH1IK(FJ¼Ńŗ\HY'½’ĀŪ³O*¬2?Ž»śĶóėėÆöžźvĢ_žāן³W <śłżŲń»‡÷-;žöģEž_žü9±IųŻ»»Ū÷-˜Ų6÷øū…?w€Ņ~o.…+`NIq³¬/**šrÜxįŸ{æA`it \‹Ÿ·…zBrdJŪ^ćå.|żśķŪÆCsŹŁn8ynŸ—wHddŻ^÷£æg^xöāķ‡Oęˆ#{÷ĪK×/$¤puŚćĒłĖ—_ø÷ųŠ«H”Õ9ŃIĢÅĻ;a.Š›éłż@%›ßĻA) E]VoļĄis–÷ēÄå“L]2įU-Flq†Ų¶mx¼¼%=*?æ?ćv8ftJøµµ?¾°<Ø"'`Ž>–ō Z8wį„åżłéaö‰FŲRŒe_ļ½å³óc•l2ű)`Ėž±ēŌņī²0I½`ģ¹ĒnŠ…åĖeõ\±'k±Ā¹¦-łJ¼bÕø²Ÿł²<>^>¾Š\Y‹ÉézŸuÅ|Üł—QcŁó‡Õxó7?‹(B–°ņ,ÉÖIEND®B`‚qjackctl-0.4.2/src/images/PaxHeaders.14935/displaybg1.png0000644000000000000000000000013212700760152017654 xustar0030 mtime=1459871850.610903788 30 atime=1459871850.610903788 30 ctime=1459871850.610903788 qjackctl-0.4.2/src/images/displaybg1.png0000644000175000001440000002022412700760152020420 0ustar00rncbcusers00000000000000‰PNG  IHDRP’` _ IDATxŚķ]M³$ÉQō|Ægw„†ĢĄ8pžæŻ9ņą 20!c53Ņ9TuUfdDdduĻj$u­½™×_UÕ‘éWæś±$‘RŖžNī7‡÷˜õų™×ōŽņ5 ¾—õXäóGĪń–Ļé ćÖ£\ó½Ē4›čŁČŚq€ł×ĆĻłsüõ/~‰—gü÷ƍßü×ošöéw˜ß_šžöŽ%‰Ūo½Ėē»Oāöp2Ÿ’zį/ń·ų»žüÓ?ż#&>įņ’Ž·é>|ūÆ?"=½`z~Ć2O@š°, ž¬Ī9é @SŚÆŒŹ%,dz’ ėßsæ‡Ń4Ī€Ö=¬żĮõ§oØÕĪQŃõ^«—µA†Ęź<»w¬łĘ“±ī@ū[°ģģzŚć•“KžyW·Jł¾ČŌż>€DķLR{¹–3°Š[łŻ*qŻ€äu’[¬=ßøįģ ĒģJ:’ųp¹ąĻ¾’ žž»oš‘Ą~ųĻO )­;;pŻį‰œ¹"ƒ ÅĖė:ĖĒ®_žČ<õv7$…!7’6œ•ÅZ8ĻqØ7›­›[SŖƾ˜ø/īõqŖļQ;“4nˆUÕī¾8±Śģ‡€|Ć"”x‰–cö|BėļÕÜ“ųj0¢ŻŹŽ—%ń©×Kē®5~‹źc-˜cąėgż"*(ČB—Ė3žę/~†ļSĀ· ųŁ÷ßćłr|nfH,9H»#Ų oƒōdŽ~Źpą°ąŚėlļ‡Ņ‘°øøkHQx–«|3¤3šŒNyÜp “WŖb¤ėg׈ švDo›ØˆĘÓ°)51¤œ…¹7§±÷ė¹ óv0šņä#’}ø"‘dÜ×=*įžPł·{ĪtsÉzq Ų°ÖM Ł÷˜ÉFoÓ3žź'?EJ HüłwßįƇ 0#/Ē×EžsŽ s5ų ģNµ#( ;Qī’,@ŖŲŠŁ_*œĀĮ'@w *PŠU‹脯TįóīäĶ÷Œ8|Ę̇ć²戩źńucDaŹó*C Ć·;4ĖMV ¾{W–üū¹9 6įf R'LN•Čg%qčĘ®,ŁD7L H¹ž/xŗ\vĀā§ß^öåĢ ¬r ƒcgĻ[Į«³ø’…óØü@eīč $‹m'Ł8ƒA”š¼rlwF6¤ ]/ķ‘y%yŲķEÜ J*uY_øg”ģ¢Ī"'eėćˆ÷€Ā ŗi“&Ģ#ąS¾ln–ö5¦īé²ćĢŲ:œŅē0ČtC· {æu²‡XŠCųęŪ ¾ŻLóūź2°,@^ŽŻ’ŗ€s–Y‚õæ\ ¹ ³A¬€+q…’ÅėėćX(Ī t å ¦Āi Fzųj h¬8cɉDL[G’ÉėŹ#ėsŠÄg% Qs‡ĆuL{’hčŅFD°›õš-…¾Õ¤ŲCaFŅ7fjdp/ģō²BÉ„ćS„bھVŖ1˜”G¶į»Ÿ<ć»ē§żĮ>ILSƲpO#’yż+Ńø#€‚S€Hī!Sś‚‚2T‚p(ø °J–”5ä ÜēīA"}HĶc»I ™•H*įh. ń®•RķÜl¹[u[d7žn‹=#`ĖŲßzŲ“ßŁsī;©{Ō$tku4ĒĘ6šr£§¤³’ųžū žžŽśé}ĮēĻÄ<­HEž’0ś| ‚,cśŖ®@üW9Ņq4܂@D†ĪC:Œvē§DņF²ŽćHmĻŌ]}õ9‚9·j ŌŠfd„“'”æ“6Ģ>q£wŒ”ņģF6õ=SĶļ(ŽŻ\MDhY/’ÆŽuóĆS'ą©å²o|fzv Ņó—bį¾Ī+‘˜RĘSʼ-bų’0DÉīg„čč°ń’<Ø~WžoåDRAPÖaźā%Õ)ŲĪ@5H²ż2+ÄįĒät˜C*»Žf¢=žNē>āK„Ź!CŪd-|)XĶ›ˆš§]žIśS„KŲqü'5ØäVe&(ł”Ę•hæŃŌ%£“ƒ†/šōōŒK*>§>d¤§¼Õd伞`ÆLĢ5PV- G”!V¦@ ØIĖ=QȐ3 Üå „ ‚“4Q“®Ō”^źšż%1ė™-«™ńmB%Ž"Łŗ8—He3’9į˜QSF½ AĘ?˜'/Ą¬ÉäĮņT9īD•Q³…c.$qłęy·ƒ ąåuĮ<ē­iūŁ^µ²bŁH=²āZ”Š ‰Š÷ØøĖP"j­Ī -qö·A+ü°Āń»žCnjī{0 ›z FøĄ4Ó³ĆęŃ{fCŅr£†=ņL¦`Pa\W ~v'dJ†ē cž‰„g)»Ą¼„bšś6cš–-“°-ģ²2QĖ2Ȍƾ„ÖYˆ!HtY›ĄŹ[°śgķ ,@q·ØĘŽtÖu®€s/ī¾OĪQē…ÜÓŅ+ņ‰ŽŻŅ"–&Ÿ9µg·Ÿ7üµGżEÆ"H&J hO±[Ė/…€t"”PšBéépĻ䅘ē„ Ŗ¬Āę ö:…#Tؚ†r“VPjź”"‹°”¬]82 µzĪFˆ@—£§«ß”Sö¬V@j»cpŌÉlųP“ »ńŹčāåų’…·S51Å9žNv0ŠsBƃŽčĮ2ŽĆÜŽšf-ŸµtłX<˜H¤üŽ“%…ÆÜAĪł€ŁJŗqū÷ĪETŽA”U… MˆB”ŖŠ°ˆ¹kā 3D°›žģźFv Ž*»ØgŲōW ¬Ę©“ÄĪ" Č@1ĻÆ|6Æg'\æOŚ3ś-°nIŪī/cN”ĻN1"śžŲB"„r].ĢøĢrž×¬AaüyÉb€(S>võķ±\:Č²&%B= <^r `“&lH: ÅŁ#KD’£×»b”ŲÆ‘w¢Z*<–źä‰ˆž§ŅC9c`wH÷š5ŠŹ£DųŽ^ł4CōģIĪcģÕąB<_Ā<ćŪy^rŃ“%ø}%9Šæ,WvŠĮ*Ī@uØ{”.ʦ{Ń š#­Øˆ†#pśŲō_{܂ŻnĶ‘/–ģ.c×0ó@(Ą;9„ž7BT“7ą°SeMĀ5kÄ`!üp+5(1±įShĢöP+©ųžńJą»üśå æ}›öĪE°6ŠŻ1äƒC(ӎ½ī£ƒņ})« Ńņ U ³Üł g …ž3h“LhÆ7LŁ(‚żtž_Clr4BėÓéwŪĒ÷ć`¼wĪĮźK:¤ ź@OŌkØaƒ×©½G]ØÓ¦Ķ{!7!Ć<Ķx%ńą7?|ĘĖ4įę}·G”€T)eÖNbK?•ŠEŹP¢ŌF}5Ų–›Økʲd6^¼4ī¶ŸĀ‚’4ÓB0¢ō$Ct“ķKtÖA>’óŸ0Oņ²lmĶR€(3Ž ’d;ō&b43‰,b…ŌjFQ¬Tõ(PYŲB‚­į Ē@C éioc]œa4£!9žr÷$^9z·BŠ[ćŸx€é}ĀŪŸš2-x{ÅėūZƒ0O «|zÉ!\[¢Yu–iF½µ±vTśD±½Š¢ęZg Ū‹­lAi“¶¾"M¾ ĖwP€Oҁxƒ [m¤ Ź©™É]:ž§՞ńŚ#žŲÅGcž3äa~ęüūĘ/‹µC˜ē Ÿ>~Ęē÷ļooxy]3 Ӝ}9³BYr YiH*²h‚(9mڤY)(½]‚,œAK,Ź§å ,ō@/–¤·i*č҃óę:ļo ²żø5cŽmģģceöŠD8†6xÜpœŚB9@źÓįąą©Jjc5DyŁóó¬Cę Ÿ^^šņ6įķuŚ›pÉČ˚1XӎTK—eS„H* j”ŖÄF5IŒBĒ1ź Ģš@H°Uļ'É7Ķ {aA³‹DvcŗÅ,ŌB 2¼`LīćÄīÄ!2Š”•8„Ōć]†*ū×7ā(xŅG1L^š¤S+ž0ćóĖ+ŽŽf¼|~ĒŪėrŁøæ÷4Ųӗdč f U% ]E%iU ¶§V©²p JŚ’ZE¢įjƒäPjÉ/X¢Łż×‹Æ‚§½*É0 s”t;cųśļ ĻĀÆ=3Vš¶žĆ‹\)Č󄷷7¼½NX¦wäe·:„e©…P€¶a—c掐«zØ„$ųUnMIEźåČm½Ż¾&*ŅęfWUnŗ’”šwOz‰ŚIėźŹøŃхą#/3–yAŚę1īJIą!¹ĪŗīP²ć2Œ€ŠZqVžĶćP6‡”uZ‚2ĄSg¶¹ƲŽAõ=éųvv`„»ĮĒ·~ŠĮ £ ‹@F x„óøżZ¢”oxmõPŠ“ŃÓæĄūū„ōü„é}Ę2O ÆeĖÅų¶¢©‚ó›B;ha×Ŗ3C–'TÜC.PķZ¤?”E›“Š *¢Ķo`;Ć0Ī>÷Lu^l“‘jLĶ› !9šāćż Ź æ¬‹K®éÅĶ<ļ)N:‹‘,…ćż:ņvŃ&“&dHČ˲!ƒ«CXSŽy¹ź)RݵÆN¢!˜iĪØŃB…c‡G„w µ0Wˆ@ādȬUŽśĪ)Œ—TĖL³%gW³ūį@d‡§³Ø¢¢¬Cā­#:ˆtĪr;ęL~„Šč&ņ‘ĮļsH˜Š!%äe¼¤Ķ!,`^¶JÅ2µØ•,×åęÓs•žįšnC*b«Nø Š®B—q—ćäuG`)5[q8mķś;!ƈC_p£Ć[Յ,ĒVN KH9fPCā-Ć!Ģ8¹Ź›¹~™sh7¬ĶMyĮūūJ&Nӄ¼Ģ˜7ǐó‚¼läā–nÜ'@37^:…¶Ž ņŃ(r2³`… jØ G „™ŻtŖ‘Ī$5† S-„źŚŲł]Ž\@ĆjĒćĀĘ/Ņq|.吣īĄūÓ žx]OÖ?ąlĪ”V_š”0Mę÷ rAž—-„ČHūp×uNŠƒ,5 ņ>f¬®#ØėDŻAS”TKø«†oń JßA#¶¢†"P …Ä{ČVhĖ­1ŗóؤż5o( Ę N‚+”ę oÉÕßhųoČĮU{®•ŠÓ‚y&ĄĖ2oL ’P+sˆMCSaÕ_ŖBżWŃÄŌgr\Z«‚± -TŅ“†”iŽ@#9oꢠń”`ø ‰Z×3C1}”*Ź„oČ52Žėi¦ß¼œž`”Ódģ`×ćų5:¤āxµ½× <rėq ‰Ż'ßĘļFˆ„8%ąyŻ@²õ2dd®BĪĖę  aū* „Ē©¼±MVAŒ„—: "&… ōŽOĶih’pšż½Š.U ŅŃ:“‘ÅB C‘}`‘Ēė F¬£‘øå ‰XmĪmY’ϰ3½°lā©ąyR:bO++‰øó¤ØD;ż†ņĖT†¾7[d'£ĢRgSV0Q† čĪĀWkÖµBuŒ/Ō: sgw āH­½jdpó©ē‹”ĒżŸŹć(~3w‡ŌĒӆCMd‘ģĒd`ޤĻXOS†¬ < ĒĢ.°ž©PU'VĄä,H'!"’j•'WĘoi!°gXtśfōé,z–¾>¢²ĖŸNķ¹½ŪĢ „:D{½„ ļ憄€Rļ@8rÓD¤€ ä§ŗų(ZŸ•l‚,knŗ%” Į%(S‰¬†"³ŃHŃd“śōI0Žq š¦b_u¹7OĮ5Ņ!Åߣü4LØ —ķ¶#’ģóēc·’ŃBa”™y ²ą"‰2õŲVjõUĘBJ­IŁõj6Ģŗa²eČpBW‹• b`„]§ ėŻyŽNˆ F»¶vŖį¦×@ESš¤FšåC†mĮĪ@ü}(‹ÖĀ\l«[£Łd$ŌNFQÄĦķY«1 Ł¼$ćRjAÉų•„4²šĮf(S„Ż“]Ļ&ć±=UĶÕńš¤Oxx…;'š{ ¤:R;w±™ŗR)!St6Ė z­,T–”Ī(Ōs(.;|•FTu Čūmkq',›3zįūŗŒŻ€ž^)āŃ”\xüW2@ĶTIĆfŠę”«%IvY‘(³2\Øōé:ƒ*$—ÅEŌ‘„‡Ō"i¶G›ŹĘĮf(o\Tެ=ŻqŁöóé¾ųG=œĮWH*Rx‡čˆ¬.*ģXŌčU ³€ö™­’hf<²†ž>2€(P²—UD !0;¶ę< ØnµE³«‡“;ń u{żÓ JĆ’½?B“µe P4W”‡ą5 vJ„RgŹQq®3P‡¼Ęcõ%Ąo‹V+pTĮØmø tM–3ŗćO2dhjTė­w=]IėrŌK”Jʈ·Z2M4-YĪ É:ˆZ†Źųd”Ŗv䐃īl×0}±É¤(ŃXq%Åž8B†2Ēæ79•Sʘi’źZ,k”(·’j…żČNGPUIRµT`‡‘Y‘§µŸ ¼ŽeŠz~• ŠĮ<łć8Ć!€ME ²RĀuŁÆŠ–$ל–†”aCC.²ī/ ”B,‹”ą8‹Öą½ęźŖ]rP Õ±Xö{÷¬<2Šéq<Ž.‡ŗSf”š‰Tt J®@ŃD­÷įą6š>”i M~V¹3$0f9h€†ŚŅ0Ųp†įŸšųuMčćųŗBUȃµH‰¢Ū•Ō¹Æ†ŌGbڳR¤Ō4<üK> )8ŅKšeęĮ#j{Žvėéi=śŗiUś8~䐔$ŽD®æ4@jM8l9†RüŠŗ2µ"$P­D„:„¬•4„'ŖNU#”õ+dÓ¼öc«^ĄźŽ|8ƒĒńõ!©ØÓ† MfQéLl'8Į­S(@ć ų*ŅlL¢×čŌu½: ’āčįaļćėtR‚z悊Ԛ>B#åŲGQ‹Pv` C Gf|‰ćįMĒļC8vė$ź@*ŒJ”QOڊl{©‰]„$ƒKŠ9 n Ī|Y[ūćųZ‚Ö“(L¶*F’ćÖ …Xђ}B=­EƒSLjb«¼t–RX$†ĄöR‰gĮưoq†{÷ÕrZķD4(EVµ²øzbs/³@m’“ßF!–ĀŚ»P%š2ˆ¤ĒćxxŖ¹˜…^Æ;ØßĆŹ,h= 4R¬ƒž9Ø6öĒō Ēmn‘ĮSOIDATĶ"×f Ā0ŗ’°ŃA3J:—Ŗ‘øIEND®B`‚qjackctl-0.4.2/src/images/PaxHeaders.14935/aclienti_64x64.png0000644000000000000000000000013212700760152020260 xustar0030 mtime=1459871850.609903288 30 atime=1459871850.609903288 30 ctime=1459871850.609903288 qjackctl-0.4.2/src/images/aclienti_64x64.png0000644000175000001440000000605712700760152021034 0ustar00rncbcusers00000000000000‰PNG  IHDR@@·ģPLTE # ) / 5:@DH10&MR Q J W[ X^c @B5h$AC>EF4j [52Q8o#JG;#dDWnt(z&3d%mCb QQD2b@+RUB{ †)TVS!|/@hNƒ ‘+Bv^_LVbX ”-™1B}›4ebUcdPOnZfeL’;Ÿ?gf^efd ž/ž'^sf8–E‘srXqr^sqgkvk¤P`)/”E,«(}ˆk‰3'©N`•l‘x†An—}p9„]NØ‚‚e€€z7°H7®Zƒ„oŒ‹5x ‚™Œ˜t¦ CµEL«mŒ˜,B³fŒxˆ™IŒ¢V»,••S‘‘u‡~±“”m’ƒŠ­ Nŗu_¾9”Ŗ_¾Fd³|˜˜jĆ*©.Ÿ°pĀ6ŠĀ 𻣤|fĆ}¤¢‡£”•hƆ©Ŗ_”¹HuĘYqÅr¦Ø†|æ”Æ“W°®‹—ҁ́}Ė’ÆÆ¦³²™”Ų”ÕA Łŗ¹Š¶¶­»ĄvŠŃ¢‹Ņ›æĖ=¦Ū/›ŹŖ¾Ó#¹Ų¢Ł_²Ā³ĮČl«Ž>ĆĀ“·ć½æŗ“ß(ÄĄ²›ŲƱąMÅÅ­Čɦɏ”¶į\ĪĢ¼ćV²ą…¶ŌĄŃŁ\Ėé"ŖŽ¼æähæęqŹźBŅÓ©ĻĻǶāØĪģ4ÓŌ±ĄēĻÓĆŻļŪŽsÄŚĢŲ×§»äĘ׌¶Ąē“Īė}ŪŁ¾āń3ÜŻ³ßŪøĮčÉŚš^Ńģ‘Ā芣ļu×ķˆŽńpąā¼āąÄéöEęõTÖļ„ćäĪ×ī»ŠģŁąņ¢źéøēęŻßņ³īłkš÷xéźÓģźĪŚńįģķĘčģŪźģéšģŻżżaśżsłū…öüŽóņÕīł¾öņĻčõėöś¬īłČöņćóõŽüżœśż§ņöåõōź’ü°üż¾üżŌśłšłū÷üüģżžćž'+ĖtRNS@ęŲfŻIDATxŚķW{T“ē¹DŹĀeø™“jö!« QJ ¬X«r§8¤ŗÖ¢ˆ× 27ŃČňhŠV$VH€”€a[1#’r‹6 BL!x! ™€ ū½_Hg§č;ggĻū~ł¾s8Ļó>æß{ū1kÖ’ ,\V½^8ą½ŹßßßÅB>‡7ŠcD‹×Õė”śśś&æśśžõõuĆ+}ŽN€7IĒÕZ(Tj•BƒN9“6ĶĶč45„ė Œj ØÕ££ˆ+SĖåj™½äm *4<ų•“I$ĶŠ$m.ž“r—™ =—?ZI;¢CܑøøŲČøō|‰D,ŁN ¬Āéa¶Ė—|ššpuu]²d‰ƒƒƒ„ƒ„9ÉŅ’4—„Ć@$š;}+n–ˆė < (¾(..ĪĪĪNIIŁ·/&&&8x-ĆÓĆ07g ęL„R)dGņ|§f±X²`J`ä‰ķ·]ϟwuuÕ×ß.)ɾš•šz4>fkpx8‹É`øĮƒ€až4•Bq$$R±hJ`d”·üŒ‚ÄżŪ·K®fe„=æukÄŽ½kX txĄ‚3š©Ą·'ņ›¦‡ĄūčV¼ĄÄĄX;H9Š+ģŻ½†Å¢3Xt&C+|² 1æ[߄ݣˆß?öĻ«Wq ¾…Åb0éŠYn SɎ66øŻ,ŒŒ>į ĄĄėžžžīÉāć#Ö²čh|&† P4ęókōØGP]0ŠžtųYYēž~ 0‚ŻüO0ߏT$• m§å øž~׿ūĆż>mĻJm}õąoļÓJe fR€£½µ•)æI,Ō9€%Œ @~ė‹žs_4(Ą,$$°”¹×•Ž˜369ƒˆ?—Ąo’N[‰<āŪõõõ?"­użw_U—Õ¾š-̆;œŒŽÆ0Ś$Ÿlc=ņ’ĆAvIÉķ’‡[¶¶Ö½xõ²““ą_ˆŲ½{·2ƒĶ¾P€Ę§Rq> ų5B‘Vö_¦””“½µīīpCYiŃą7k@  …Ćf_üĮē˜…B!C`|Ʉ/éfĮ ¶0Ļ5å*Ģ~ūÓÖŗŗŹ»ÕĄ/Čk،Ųāż•2—ĶNLüįŚµK>GȀµ••%ÉĢ„_SĆ×ęĄkä¹šē‘’ŌįeAQmuŽ §¢ƒüÄóē£žżd©&€¹$sc~“pZŅ\SR`ņūļæ² ųyEy7”½Źlöé‰;vDGķ:‘üéB0›šhĢÆó­Ÿ×}©©)ē^5TVWĆųyyy9=ƒ×•=¹0>āGGmŚ“ł‹ķŸĪ›G2#‚€T(š6 KöŖ,«ll|TZ[[ŌR{ćĪ;=w¾ļ¹÷ż•‹]8tš`Ō—›7’qŻēŸÆ[“čWæBĪJ-Ų~§^5–––•A\ī•Į{¹?÷¢ DļŠŽ6¬Ū¾qŃ{ęꦦF©P ›pé{ē/K‹ŠĄ~N7‡{„·÷ēG”¢7lŲšÅöļ‘HD3SS‚æŖf*Ŗ!ųŗĘ äp9×;ø//^ưgϦĶŪ7žĮŽEȁ`ˆB˜r C¶*€Ÿƒč\.§„`õÕ!ØÉNvŸo…ŽUÄ71Ņρ×Ȑ,Ķ!8–ž7ƒˆS1x…ĆĪhL »…„; œżl£ū<“ˆp(LŒ UzIR«2-=#֮ޫä¢Ń[^¶°9ŲAXˆOČ„]Q›¾üł·óš`†ų&ʆ|½$®R=—eZÆYæ~}ųą.—Ķķ½®Ģąäö®Ę0ŗķŅĮčM'Üa ZZYB¦Č€‘@?µB XkYk×++€Ÿ« ,hÉø×ą†9‡ųŅ>;µ'ł}€LÄ`ll4!ØL%Q„„‘0Ÿ¬²ėœ ö½RļĄ†GŹ@Ģs©Ū2*ķXr²;ŠaĀųD€±įæŖš²ĪĮА<“„сĻ8ŻĮfgō`Ń 1ggš/Å~į'īh’tŒŒ ßč'ŃK„Bąšf0•¹œŠoų‚Ū NA_8ģń=h9×̜H051Ń .OĶ‚\šŪėtOnļ7ü€kŒ²l)BdėÉ=ˆ€L€@”ĄNē`HŽ;@7Ąźe­7“į†ßB4ŖÆ/:Å­a’šˆ04>$q* $@G10™Ž«½a|Öä5¶ģ}{{kąk š &ĘĮĮeƒy'ˆĮķƒSs c4 ®QŹļį²±²ĘHĄg LL¼™Ż­? *…¼ķ74–éĘb¹ŃAńÉ Ś Ś-`b¤ ąĖ0$qʁB!»é`1£øaņØ4 ~5ÓGĀ0A“ƒ7oĘmeż……g“–ĖåŠ6…ü»ż±ūgĘķGłX?LĀm‘µ@%œ¢s``H[ āµ`ß³īg}ŻÓńS÷OT&é śP ¶u¶u ŒĆ‹A±¤¹ J9(„$b‘X$ÖUŠ„Dœ Õš¶łš"R† ĮfT¶‚ŗHŒÓq„|¾@ („ē2ąäĪ9zÅ®WXllXPPPX@PĄĒqŪ !lƒČøHüVjšĄÉā ļqTqņP‰¹?66ČßßkÅāÅ XXXĢ·Ņ/<ᲑĖoJņæKO?|x[ddØß‡XĢzgD‡ĢŹ%“ _‡"…9ļ,€ųŠ;Ū@Ÿ q_‡†śł½ƒƒq[“Vb‚bĆ"!«+W®X±ŲÉĪnžē™ų.å²ņņr™öŽ×cS†ŽÄēC8v3ŒÆčŌąńćĒŅgRisSs³“©”ŖŖ¦FXxłLŅNæ_ö0Žž„Ā2ŌAĖ=x aõ'ķÜź4C§Ÿ<ž~<żäÉĆŠNĒ‘„zRRŅqąB&?t²˜A`|ö[šÖ,ž’ü(3§mT&b<IEND®B`‚qjackctl-0.4.2/src/images/PaxHeaders.14935/pause1.png0000644000000000000000000000013212700760152017013 xustar0030 mtime=1459871850.611904288 30 atime=1459871850.611904288 30 ctime=1459871850.611904288 qjackctl-0.4.2/src/images/pause1.png0000644000175000001440000000032012700760152017552 0ustar00rncbcusers00000000000000‰PNG  IHDRó’asRGB®ĪébKGD’’’ ½§“ pHYs  šœtIMEŚ%7ƒ]CĻPIDAT8Ėc`hĄˆĀKū’ĪžÅ襥Ąp#Š‚³g†=ĖĄĄQˆGމR/Œ0j:°g`˜łź!bųå1 A‰”#Ņö# NIZiIEND®B`‚qjackctl-0.4.2/src/images/PaxHeaders.14935/msocketi.png0000644000000000000000000000013212700760152017433 xustar0030 mtime=1459871850.611904288 30 atime=1459871850.611904288 30 ctime=1459871850.611904288 qjackctl-0.4.2/src/images/msocketi.png0000644000175000001440000000115112700760152020175 0ustar00rncbcusers00000000000000‰PNG  IHDR(-SPPLTEind  #%;*+;.0;87$DD=IG$JH$HG=IH=LK=ML=ON=QP=WT1UT=VU=ZW3ZX=^[=b_:a_=b_=eb=fc=hf=jg=li=fffnk=pm=so=tq=ws=yu={w=}x:}x={wIAœ$}|4B$|=‚~=}Iˆ‡…€=†=ƒƒHŠ„=‹…:ˆ=Žˆ=‘‹=’Œ=”Ž=–=˜’:˜’=•’Tš”=œ•=ž˜=Ÿ˜=£œ=§Ÿ:’„ŸiŖ¤IhĢAhĶA³«Iµ­:®©jŗ²:ŗ²IĮ·-Į¹IȾ:ĄŗkĀŗhĒæI¼jÉĄIĪÄ:ĒĄhŹÄLĪÄIŃĘ:ŃÉ9ŃĒIŌĢ1ŌĖI×Ļ9ŻŅ:ŪŅBŽÕ7ßÕ7įÖ>įŲ9įŲAćŁ9ėą:ėą?ķć?šå@šåAõźBńvJĆtRNS@ęŲfĒIDATxŚc`ĄĪN¶Vf&Fzj`ĒĢÄčųØØ€@_y€}"KprZ^Fd«XĄ:<4ISQP3ŻG,`›¬É¤)ØÉ¬) 0ĖŃĮ,i°€I@P=Ļ˜' 0ōĖņH$[ , ė• )®™đ¢` wć8°-)vB`Uļ ķ˜Ō<;OO.°€² ››ææ‡««X@ŃĘT]_S“SK‹, '#%!&**ĢĻĖĶ`G Ąd%TYäÅ„IEND®B`‚qjackctl-0.4.2/src/images/PaxHeaders.14935/render.sh0000644000000000000000000000013212700760152016722 xustar0030 mtime=1459871850.615906288 30 atime=1459871850.615906288 30 ctime=1459871850.615906288 qjackctl-0.4.2/src/images/render.sh0000755000175000001440000000073012700760152017471 0ustar00rncbcusers00000000000000#!/bin/bash # This script is supposed to generate icons from blender files. At the time # of writing blender does not have command line parameters to control size of # the output and limited possibilities setting an output file name. To render # in different resolutions a python script might be an option or file output # nodes in the compositor blender --background qjackctl.blend --render-output //####_qjackctl.png --render-frame 1 mv 0001_qjackctl.png qjackctl.png qjackctl-0.4.2/src/images/PaxHeaders.14935/aportlni_32x32.png0000644000000000000000000000013212700760152020306 xustar0030 mtime=1459871850.609903288 30 atime=1459871850.609903288 30 ctime=1459871850.609903288 qjackctl-0.4.2/src/images/aportlni_32x32.png0000644000175000001440000000151512700760152021054 0ustar00rncbcusers00000000000000‰PNG  IHDR D¤ŠĘŻPLTE©œ’     "'.&!!!!"""'"###-$ $$$,% .& &&&((()))*****+,,,2, ---9-...///00(000111:8333444666:63999;;;==5BBBDDDFFFIIILLLUL˜¹sĪcŒ7UCļĪż`­ķDdJ)Ķ÷¤”f™¬µŻ#u[™ę?‘ @»©* „ÓĖéō+JēD4ŌÖlˆĢÜcÖägkŒ1`ęźq4Ģ ēܱF\«€Ę9‡ć­F\«€&ĘUsĪkņhBĪŖ:nYÜó\!"Ļń±µ"R.ošŽ_ū¾’ņŽ_‹µ’:éÅzX UEø³Ü¾–įą Ž¼żIEND®B`‚qjackctl-0.4.2/src/images/PaxHeaders.14935/aportpto_32x32.png0000644000000000000000000000013212700760152020326 xustar0030 mtime=1459871850.610903788 30 atime=1459871850.610903788 30 ctime=1459871850.610903788 qjackctl-0.4.2/src/images/aportpto_32x32.png0000644000175000001440000000206212700760152021072 0ustar00rncbcusers00000000000000‰PNG  IHDR D¤ŠĘjPLTE\X   && ##(( '' ))//!!!"""*(%%%00(())&***,,$88..!??@@000==11133%55'666777QQ;;,SS3??===>>>@@@BB0AA>AAABBBEE3 ]]ddGGGHHHhh ff*YYiiQQ<%bbPPPkkSSSWW@P__V^^\\\]]\Tbb^^^aaG}}3qq___~~```bbbddVTiiffN6zzakkhhhVsslll9‚‚nqT)ŽŽ=‡‚7‰‰qqqvvW<ŠŠttsxxX<[vvvxxx>’’zzz{{{~~l6œœ@˜˜‚‚_ƒƒ`„„dBžž;””‡‡cb””D¢¢ŠŠeˆˆ†‰‰‡gE¦¦O¢¢G¦¦S””ŽŽiK„„Œk‹‹‹E©©J§§ŽŽyZ£Ÿzz’’’\««…››ššrœœsœœvxžžt›››aøøYææ¦¦z¢¢¢_ææ§Ŗ~Ø«€gĆĆ­­€sĄĄ®®€°°°°‚eĖ˳³„rÉÉuČČ|ĘĮlĶĶjĪα±±pŌŌ¼¼ŠpÕÕ···½½‹¾¾Œ¹¹¹rŲŲŗŗŗĄĄ»»»ĮĮŽĀĀĆƐ¾¾¾ÄÄ‘æææƒŻŻĀĀˆß߃āāēēŒņņŽņņóóöö‘ų÷–üü—żżįįįååå:ö|tRNS@ęŲfvIDATxŚc` ųk9›ść‘7›ŗkŪž–8å•j»wģŁ¶k±>.óK¦ŌöģŲµmQ[œ7m›RŪ½sć¬fģ dęīŖč\6©H»G’y{vL®ÉÆK—Ē._°ŌŽŗ%„iažXŻ œŌrų„ėÄźlņrķ+öĶ öOńÅ&/QæžX`ƒ“½;Vó…«ś=, 0ÄD|e3¼¶G¹Łįg+œļ»=ė¬'y֜Uį@ł3gĪ`—WK]ƒW>nKęV°>zgD¬¦’’>?{uõŹ2ĒR–—tßß©śųš%ߟļ‰2€C@‰YăGį2Ė·÷æŁ~żÉšųxɛ/Ļö¤000ü%äju’Ķ­l<ŗ’’żÖ`AøėĻM†Äø€ONŁęĒ{]&²ށń?ŒĶDi, X`ĮĀ/ē,ød??;/Ć?¼ČČĄrgĒs“ļļž@ ųžīĻ÷™$ĖTļīüż‘‘@*d``ųżU€įLJS žČČĄĄĄ Ø»Œįß?×’’ē„’’¾ææņōē‡ė^žh`¶ĮĀMwIEND®B`‚qjackctl-0.4.2/src/images/PaxHeaders.14935/qjackctl_512x512.png0000644000000000000000000000013212700760152020420 xustar0030 mtime=1459871850.614905788 30 atime=1459871850.613905288 30 ctime=1459871850.614905788 qjackctl-0.4.2/src/images/qjackctl_512x512.png0000644000175000001440000043677612700760152021213 0ustar00rncbcusers00000000000000‰PNG  IHDRōxŌś pHYs  šœ?tEXtFile/home/max/tmp/u-urenzel-qjackctl/src/images/qjackctl.blendĒø`:tEXtDate2015/08/26 01:09:35+—ŁtEXtTime00:00:00:01ģĆ&Ā tEXtFrame001ĮQ" tEXtCameraCamerah’ļé tEXtSceneSceneå!]–tEXtRenderTime00:11.38Ėe IDATxŚģ½w˜]wuļżŁżō2½wõn[¶AdĒ6Ŕøæ0Ü“„Ü^7$į’ų’š$!b;˜‡\q–dKĀE–5’5£Ń؍f4½ž~vßūżc4 ¶Eī ©ģĻóĢ?3ūģŁ{ķßyÖŚė·Öw ü+³uėVåųĄšłłł›c±Ų ’$­hiiQŽņ–·ŠÜÜL??śŃčķķe``Ą+ ŗ®ės¦iŽŲ¶}Bŧ|ß²\.üBž5Nś‘|D’$©+NߐL&oÅbė¶mŪ¦n޼Y–_÷3ŸūÜēxąš<ß÷q]Ļóš<ϵ,«×²¬/{ž÷“afšŲžeȿȓuttpÅW¼3¾¾¾ž¢•+W†Æ»ī:ĀįšĻżģŗuėhll¤P(P(EqéO’¦i[ Ćų”®ė/…B”/Ū¶½Óu];x|’Ī€††”»»ūś 6Ü·qćĘų'?łÉ oŪ6'Oždpp×u©©©Į÷}NŸ>Ķ‘#G8yņ$d2ań2]×E×uĒ0Œ<Ļū#`išNšž€¦¦&øaćĘß¹łę›£·ß~ūėēŗ.»wļ&—ĖQUUÅŚµkihhxĶqår™k®¹†‰‰ \×Åu]ĒĮó<šćć擵µqć7"IŅž«T*ńƒü€S§NĒY±b­­­|Ć0$‰t:M±XD×ulŪFEB”²,·Ū¶½³T*żV"‘ø;ŸĻūĮć ųe’ɤ iŚūEł;I’"‚ PUUEoo/<š;vģ`xxAŲ½{wåsßłĪwŲ·o‘H„+®ø‚›o¾ł‚’ēĮdļŽ½hš†ļūtwwÓŚŚŹąą ”Ėefff( ĢĪĪ’Éd0MŪ¶-Ó4’‡®ė_‚L@@@@@@Ą/"ØÆÆ›,ĖO.9ß÷I„RlŪ¶ą8™L†įįįŹg¾ņ•ÆpśōiŠÅ"_ųĀXæ~żkĪkŪ6_’ś×9}ś4’$Ēپ};W_}õė^Ē·¾õ-ī½÷^2™Ģ²-Ū¶1 Ćvēł¾’õR©4<ꀀ€€€€AP__Eq·¢(—.9Ēq°, Y–QAččč`Ļž=|žóŸgppééiī¼óNn¹å–eē¼ė®»čļļGÓ4ŚŪŪyӛŽÄÆüŹÆ\š:¾łĶorņäILÓDUUŹå2¹\Y–™™™!›Ķ244„ć8gMÓüø®ė;‚GšSžj|ß’ˆ$I[—œæėŗ•Ö†eY$“I.¾ųb>ō”‰DŽšš^yå¾ūŻļbY555$“Iš›› ‡Ćœ8q‚ŁŁYČēóĢĢĢ`Y¢(bY‚ `Ū¶U.—†qÆmŪł¾?,‡€€€€€ 8GMMM¤ŗŖjg4}S6›Ćqt]Ēqb±XeP®ė”ĖeŅéōł“ü0M“H$‚mŪĖ”Ÿžyš››ŁµkßųĘ7p‡t:Ķē?’yzzz^÷Züq~ņ“ŸĻē‰D"“¶¶²iÓ&®¼ņŹ×=žā‹/&—Ėįŗnå:5MĆ0 b±X„¦ \.Ļ …§ǹŲdž«ós·jkk?,ĀeĶMH’ĢŲŲX„õĻu]$IĀ4MŠÅ"©TŖāü}ßG×uLÓD„Jj Ŗ*Mss3wŻu=ö®ė’L&¹óĪ;_ćü}ōQöģŁC±X¤ŖŖŠ††nøį.»ģ²Ÿ{sW]ućććȲL¹\®Ō)8ŽC>Ÿ'299‰¦iµ‚ |Čqœ†qŸ,˟‰Åb¹™™™`…üņeŚŪŪUU=XW[Żųž÷¼į‘|šAĀįš’śår™|>,ĖD£ŃŠó?'ĻK,«t‚@WW‘H„ĮĮA–: ŗŗŗŲ±ć§Żz÷Ž{{öģ%•JQUUÅŹ•+y’ūß’sočŲ±cģܹ“±±1āń8š¦”i„R‰L&ĆŲŲÓÓÓLNNR*•š<ÆrĶ‚ `Y–oYÖėŗł¾’}×uėŗnK% ą—& Šā'C”Pćŗõٰa=SÓS$“Iźėj1-›b±ˆēyø®K"‘@–åJq a•ß-9X×u1M“#GŽ …*™L¦2ņ÷®»īā•W^!‘H°aĆ>ö±½į5Z–ÅŽ;čė;B>_@’$zzzxē;ßÉöķŪ—›Ķf¹ęšk˜››«8üH$‚ižŌæ‡B!AUÕnŪ¶Ū4ĶOĒc±ŲC¦i~϶ķćm„’•€d2Ņ4ķW“É›6nĄ²NŸ:Euu5±xŒŚp”cĒŽQ.—I„Rhš†eY8ŽSŁųYē_.—ÅqæKõK]o{Ū[yšĮyą(—Ė“¶¶rŁe—½”óß½{7/¾ų"SSSŌÖÖŅŻŻĶʍٰaĆŽl*•¢ŗŗš™™™J¢®ė‹†e\×]oŒ$I(Š"›¦¹Ī²¬u”PčSŠ¢ü÷r¹ü@ü— źźźŗDQ\‘N%ioke`pń‰I¶n½Œ¶ÖŽ9B<'‰ąū>Š,‘Ėå*o÷ē;’„žüó?€ėŗ477ćŲ_ūŚ×°m›¶¶6zzzųÄ'>±ģš¾ņ <ś¹l-¢©©‰[o½µ"tˆž£G&^, ¼ōŅĖXæ~=ĶĶĶÆłĢ5×\ƗæüeĪž=[łŻR³T£ IįpXŌ4­Ć¶ķ˜¦łß,˚s]wO,ūżb±8,©€€€€€’“@kKs›ē³) ŃŅŅĀŠé! …mmm¬_·Žž¾~&§fhmmaŪ¶m¬[·†ēŸ¾ŅP]]ėŗŒŽŽ"Š"įpxŁ–€(¾C”dG*]¾ļW*öA`nv†—^ü ™<«WÆęŚkÆåĘo|ĶõNNLšŌÓO1p“Ÿ™Ł9E„££ƒ~ō×Yµj---4¾}ū˜››«t,Õ,1®ėāŗn„p©­QQĮuŻZĒqnrgk,»­X,ž$XV’)ŪqÆ!ŚÜÜL4ćčŃ>Ē„½­ -ā„—^ ³³“Ķ›7ņņžŒŽŽ …hnnbŻŗuœ8q’S§N‰D–śž¢hä-—H$ŗ¬@Ą£P( i- iöķŪ‹®—éģZĮĶ7ßÄŪßžŽeףŪŪ˳»wńźįƒ8.$Si¶o撋.ŗˆĶ›7_šĘu]ē‘Gaxx˜cĒŽŃŅŅ‚a,,, Ŗ*étŗ2–XQLÓÄóK*•¢»§‡©©iN S__ĻE[¶P,–øļ;ßA–eZZZøį†1 ƒ‡~¤" ‹Uö¦ibš6ŒA4]–š>---8p€d2IGG…|ŽĆ‡ŸÕ»‘+޲¾#GŲ¹s'Ńh”X,FKK3==+8qāÅb‘h4ZŁó_’åµ-“¦‘łœ‹KUżiM€ēy|ę3ŸįK_ü}źŖŅČŖÄ©įér2™:½f͚έ[·ĘŽČł?ōŠC ķgdxˆB±D”P¤½£“ÕkėiooēņĖ/gõźÕ4Ššš0O>ł$°X  Šb%£!Ižē-»'I’$)āyŽ&Y–7ł¾’ŃhōEQ~ÆP(äƒeš.°m»=S]S‹¢HŒž%¤…hnnatō,Łl–ĪĪNŚŪ;<~¼2XgŪ¶mK%ī¹÷ļQUMÓX·n-W_}5#Ćgčļ{•p8ŒŖŖēī8žėÕl²O#ŸW >–mcł:®,3—•˜_ČĶĖf±®¾qݵ×^+ŽrĖ-Ė®æ\.óķo’=ƒ} ö‹…¼ŠŲÜĘĘM[H„R¬\¹’«Æ¾śēę©§žb`ą(½½½„Ćat]Æ8}Yq\d2‰ļū”J%jjjˆF£1¤b±x®čQ”dYžøļūk¢ŃčGJ„RŠ-š.hX,F.W`tlŒęęf::»xā‰'š<öÖfŅé8?ž#4Mcżśu“·µq÷=÷’Ļē+›nŗ‰łłžŽń Ś9ē‹#%Q ¶™Ķ«(ŠZ)ō}×s°LƒtTFÖj½é¹üŒeŁįh4ŚqÉ%—š³Ī’ńĒćåż/2tźŲp©¤’„eŁ’ćWoø„)³}ūö7œ2øÄ±cĒxöŁg9ur\¾„®ėŲf‰x ą?F‹Åź5M#Jā8‘H„ŗŗ:t½L__éTжöŽ;N>Ÿ§ŗŗšĶ›633;Ćɓ'I„R477sՕW”Č2»v=Ćää$Š¢TbUUŁl×*3›YQ–9ß÷qlpIĘdJŖ3:3–‹Åbµ’$I¢(ņ§ś§•k. |ūŪ÷røwæ;3»š°a:?øģņ7}±³³³) ń|ą‚Føļ¾ū8~ü8X–I”P X, ‡‰ĘālŲ°”27ąņĖ/ēā‹/¦³³sŁ9{ģ1¾łĶorāÄ Ē© ‚Pé‚PU•P(Ōģ8ĪcŽćģEńĻEŁ;11Ōüū–eÖŁ–E4”|N'ŊĢNOP(čģ줩©‰Ē €t:MKK3Ļ<ócņł<Éd’+·æ®ī.žzźIvīÜ]Iż+ŠĀÖ­[ń}—žW’· $9“LĄu]|×$¬:„4•©×QŪĒćU¢( uuµ•ėż»oż-żÆ233· —óW7\÷žķ_,£õõõ¼ūŻļ~Żęžį~FFFČår”Ė:ŁĢ<Š¢Q]SC:]E"‘ ‹±~żzn»ķ¶e…?Ėż÷ßĻĄĄ@ÅńĖ‚€%ĪÕhš¦]ćyŽvą…¦¦¦ÆŲ¶½kvv6ČüŪ‰DB,K5©Tš¦R.ė(ŠB*™`’Ė/Fééīb!³@’±XŒĶ›6āŗ6Ļģ܍¦itvv²vĶ*Žö÷óä?"‹ …hlØåņ7½™TŖŠ'ǜ£l©hšr®x\wq[ ˆ„4’Ų™āH"‘hUE;߉.ĢĻńÅ?ų3“g0ŹY,Ū}įą‘”æZ½zͧ¶lŁņęC‡ æ÷{æGww÷knų~Ÿ½{Ÿczf×q™žž^œQŃŚÖA:Ęó<źźźx’ūßĻŖU«.hĄ§Ÿ~šßżŻßeaaY–+C‘lŪĘó<Ņé4årŪ¶+YŽ„{EQń<ļm‚ lSUõĮ†††ßšššš –e@@@@Ąæi`Ū¶R__ŸŒ„5DI&7?‡(ų ,,,‡ikkēčŃ£‚@*•bķŚµō:Œ TUU±fõ*¢ŃĻģ܉nŲD£QÖ­[Ē7Ž€a<łäSĢ/d˜ĻIhšZ©¢w]HHĄŌĖųB˜į)}(‘HŌ+Š"-9Ģ„ AL-ńāžR.•tŻæ!‡ė¦ÆŗźW¾‘J„Ņ/¾ų"wß}7µµµ?ćųąé§Ÿba~UXȔ0m‡X<Ļ#‹±uėVOœäųńD£ŃEq ėßGuU?ž8§Ž÷‘Ė. iįJŸ’RŖ\  31S˜’åpµ¢(±ó‹]×”»Ye!“”XĢ>3¦’iŗŗīś·_ŗį·Ž=*NNNņąƒ.sž®ėš_ų9sśÅbž|ÉĀŌĖ“¶wR[[‹®ė$“I>üį³eĖ–74Ō©S§xę™gčė{•ĢĀó Y¢ŃŖŖ±bÅ jkŖ±l‡t:ėŗ•΁„āĄ„ĪÓ4qI’ˆÅb‹EĒĮ4ĶՎćüX–åÆ:޳8 ‚ešÆhšõó 3³3ņy,Ū¦\ցp8L2™BÅs…6Žćą8Ī¢8R<ަiȲŒ(ŠŒŽŽ288ČŌŌ†aT‚Ÿ%µDUUń®·xüC?ü'öæōÅ?Ü?'Ož@/ėĢĪĻć:6ŗaQWWGSSńx˲Š4šš6mŚÄM7ŻōĻ2öWæśUņł|Åł/É‹¢XQˆD"čē:0$IŠF£Ń/J’ōŽ\.w‡išÆĖ6 ąH’T,•J žē„]×EQ5Ā‘…BPHĆ4 †Ī ‹Åhj¬cßó/P.—ihhą’K.aaa–cĒQU•ŗŗ:.½t+gĻŽŠß÷*†é’N%¹üMoęWß÷^ęēēŁ»ēYd?ĒDĘĀ“šb±HR$QĄõ||ßcEgåü˜}x°ōūeÓæ¼ŗŗśżKĪ©uP<Ņ1‡ĆÆģįä@œb©Ąō¼A8Įōę‘$‰\.GOOŸżģgY·nŻ2#ō÷õńūīačĢžē‘É,`;>‚ ŠŚÖŽ,+•ńĄŠ¢°zõj>ųĮR]]}Aćóģ³ĻņČ#pźŌ)ęę権©!“É …š=„E!!˲P(T©XŹ0B(ŗL–å=Åbń …oł¾oĖ7 ąĢĻĻ[ŻŻŻ†atĻĢ̲°0OuUЉń1\×Ēu<ĻCUU ÓꊔĆD"ŚŪŪhhhąÉ§ž¦P(Ē¹hĖfb±/¼ų"33³„ĀQźźŲöę7!I2Ƽņ 3cä‹®'F•„7b×óń\‹štŒ™©§µ!ü§%Ćk¬ŖŖśd(Ļwž6šdÓÓāŲŲ¦5e›¶5l»ŅŠ˜iV¦÷%“I>žńæĘłßõ§_¦·÷ „’N±¬S(,Ī+hhØAÓ4\×E’$jkkŁŗuėkŌ–];Ÿį…^ “YąŌ©!lŪ&—Ļ£i ØŖJ4Å÷}b±°8tč\˲Čd2Ų¶M©T¢T*įŗīRĘ ‹ÅžB–åk …Āķ¶mOK8 ą_”J„MÓ®Čåsų€@6W ¤)dsy–d‚Kē*Śćń8ėÖ­G|öīŻ[ŁūßrŃFĒĘč=xL6G*•ā¢-›ččhćĄ+½œ>uŠ-‰pX©ōĒū¾mŪŌ§\ŒņŒoYößķųÉ|1N9‰Hē;Ū²ˆĒLņEƒć"SsŽø¢†¾‘Ļ—nL„RX–UŁū”}ˆ+®ø¢rŸ/¾wGNŒ¢ė:¹|‘D"Awwwe?NSWWĒ{ßūŽ Žć{’š]É,ĢcŚn„µŃó\B”étšššdYƲ,E©Œ^J’—J%$IĀ4M ĆĄ0ŒŠfĄRq”ēy¢ēyļ’ey »=Ļūć8{7XĪ’’ąt4!—ĖŽÄŠ ˲e™ĢĀÜ¢0P*ÅģÜńxœp8Lww/8ˆć8„B!6nÜ@*•¦÷`/ 󳍀­[/!—/288H1?G¦`£…ćø®Kuu–e“Ļ-„ŗÅŅ IDATŒ™hŠā'cźƒūś“ÉŌ×¢ŃhåZƒ‹źø…iŚ(JČĶ–ĆOf²“}ŃØūéx<^»TCL&łä'?Y¹ĒÆ}ķ/ųÉŽg1 \®ŒeȲLccc%ƱaĆn½õVšššŽŠxƒĒųö·æĶ«G^E–rŁ,beN@,£¶¶¶2=šü·~MÓšĻi„B!,Ė¢X,rčŠ!ĒĮ0ŒŠ,ņ9õ@TU­“jš¶ŹuŻU®ėŽnŪöż„Ré|ߟ –t@@@@Ą’U‹ÅNū>ņ9diq\ÆŖ*ØŖF¾P¶mb±óss”J%ZZšQ™^|‰D­>ūģĖOĘ㉿ÅbŚł×č¹.Ŗ žg‰ØŽÉ‘ņŻŽ[šŒÅb‰D䄿sß_ÜĒ_æ~=Žć°sēNžüŃ#Œœ„\.!K įHQ’Ø©©Į²,Ņé47näĪ;ļ|C£żć?~½{žc~vŠ¢ī033ēG"adY,Ė¢””d2‰(Š-„Ķ›7sķµ×žÜņŁĻ~–£Gāy޲N„ĢĒRŃąR@hžē}TQ”wäół/ø®ū€,퀀€€€’£ ›ĶŽø®ėOLN Š¢€ !I‹©źB”@8BEĘĘ'$‰źź&&¦8sęĢ¢óÜ“…šŚ:~ņ“ŸPČgPµŠbµüĘ d39įXe²łmķ\zée¼÷}ļćä‰róøŽN,–ģ}ā'c‰Dæ•H$¢ēĖ;Žƒč•ˆ‡,7äĻĶ–žĮ²”X,öå󝒲lYā+üN:ĶŌģåR‘•«×ŅÕÕÅžżˆF£ˆ¢Hkk+×^{-ļz×»^cؑį3Ü’żœ:~”‰™TEF× ĘĘĒńH}}}¢¦¦¦3¢( µµµ¬ZµŠ«Æ¾śē .‘Ļē)‹„B!J„Ҳ@Q<Ļ[&%\›,IÄćńfUUļÉd2ļ·,ė3@?v@@@@@Ą?7š<ļ¬ėŗśĀĀBDQ C'‘H‡Éf³ŌŌT>ł|MSinnfōģ0‘H„H$Ā–Ķ›°LcǙ𙧮¦Š­—\Dm]=ūöķerlˆŃ‰iŖŖjhnnę²Ė/§\*³’„Y˜ĄõB'szč®p8ņW©T*ł³Ī_ņĖT§UĒflŖš˜e;/E£ŃæˆF£ŹłĪß÷}|Ļ”±J 77B½e|&ˆ ė‘$…Ƈ`š&š¦Q__ĻæųEŖŖŖ–Ł£ÆÆ{īž¹¹qr%‡¹ł ’$’ĖšŲŽC[[;MMM4M‰‘H„«Æ¾zY½Į…Čf3<’ü ōõõńč£2;;{nn€ˆv.óR,•°,«RĖ[—l¤išT[[{M.—{¾T*ż…ļū_rĮ2ų¹€ėŗc’$±,ėņb±H<G–%ęēPUu±G½\>—†VˆF#ō÷õ!IUUUtuwńņžżĢĶĶŠÄ¹ųā­d2śūś˜ŸĻ`Y65µUlÜø‘ʆ^zé%Īž"Pg #ōÅŁ¬žgu¶māy‹oøŽć`ejā6–Å¢µŪ²ģ'Ā‘Č×b±˜¶4r|<ĻDzLVµ‡QE“¹łyJfŽBÉ$ ŃtX¬ ˆD"lÜø‘?ł“?yqī¹ū[<óćĢgrøŽ‹ć.÷ ¢HSs3Ńh”P(D"‘»»»¹į†hhhø Į¼ü2'NœąģŁz{{)ė:Ł…Y Ė%¬‰$‹5–eįłąX%ŖŖŖP…p8Œm/Ŗ ĪĻĻc¶m/’$‰t:…B’3—Ė]nŪö@ pįĄq/—ĖMɲL,Ć4 ¢ˆĻā\{UÕ([ÓB!X4ĀŠ™!E”¹© Ū²™˜˜dbb‚źźj.¹x355U<ńäSLOM`Ł.”p”5«WséÖK˜›ŸēČ«½”r³¾ļ–ž2Æ+Ÿ•$§]EEĆ4‹<Ŗb6¦#āŲź+ŗQŗO …¾Ē£?užąy>®mR5˜‡²įą šŖĶf ‡Ć•©}mmmÆqžÓS“|łOžˆ‘3'ȕ\ŹåÅb߇•+zˆÅLJĆa¶mŪĘĶ7ß|A#›¦É·’ž^޼ŚĖ™3gˆĒä‹:¦iāū>¦ķQ•J‚(KHē‚Š8®»( …Čēó …ŠŠ ¢,vNX–…ć8X–…®ėØŖŠmۈ¢H,»Ę0Œ/ØŖś…\.t ¼q¬¶,ėź„4]×3jkkŪ¶™šš:WńĘ0mĒ„¦:ACc¾ļrōčŃJļüŗlejjŠį3C„CssÕ5ulٲ…H4Ę+{Ÿcvz Q``h|A‰$7išF4„¶¶–ɉ ęĘIĒ%$)ĶČųĀĄBnžĻ5Mūėd2‘XjŁ« Ā&¤ØŖĘ™ ––&jk<~]7‡Ć‚PĪsõÕW/»ło}ė[<÷ģ.ęē¦1,ŸĘʆ‡GˆD¢tvv’H$H„RÜrĖ-\vŁe4ī‘W_åŃĒåh?Ł\Ž|>® žDĄŪævŻF§””įrMÓ$UU+BCįp×u—fĻē‰Åb bŪö²9KožK®ėVZ }ß5Mū×uc±Ų—J„Ņ™%;Ą2TUŻ,IRŌu]|ßGQ”„Iu‘÷\*¼Ŗ*M.›A\JeƒĘĘFęēXČd‰Ēć¬_»’¦†:vīŽC±¤#Ź!-J{G=+V099Éą@?¶Qt'gęīÅź?ÆŖ*›6®ćĶo¾‚ٹ9žśŃC4V‹ŒNęilj=³›ü²ŖŖ_K$5KΉDŲ#ó™Ė(œ™0øņŹķŌÕÕóƇ® ļ‘$©ŅJēyGŽa~~ž“'óčĆqlpĆ0A¹āŠĖ) ”Ėz% éččą3ŸłĢśŠ’‰§žz‚…… 3³ó~>Ÿ÷C”‹EQuq«¤«kE:N„ÓiqóęĶtwwÓÓÓS’ōzÜyēģڵkI`ŁßĪļXʊų¾Æŗ®ūa]×ߍF’Ś÷żæ*•J ĮŅ€eˆ¢ųˆ {EQ|›ć8”Ėeāń8¢ąŸkŒ`ö¹7į4cćć8žHM"A4åōéÓų¾G,¦gåęrœ8~š(•uŖ«Rlٲ…x,ĀīŻ»(dʱgOѐ¶Ō×ĒjøōŅĖhimįPļA,}žp8Iuµ2uØļäTUżr2™lŠ“Ÿv.é¤jM±X× ½{ŖŖ259ĮRqßöķŪ¹ńĘ_א33Ó|ļ{ßc’žż”Je¦§§=499łĒ×\sĶļȲü–śŗ:Ré4‘H„¶¶¶Ŗµkמ³‹ēĪé.ȲŒišø®[Q\*<’žĪļEI’Ŗ Ćų¢aRåOlŪžČ Ą"†a”5Mū Ó4āŗn*‰`[yĒ9—böŃĖeE! sųŌɊŌnUU»vķBRé*jkŖĮsŹ4ŌÕ±ä ėׯgķšÕ įŌń#LNĶMz,N%JŅŻÕIss+żżżŒœ:Œ'ʘ˜ZX(•²Ÿ•eå ‰D¢CUUDQ\| >§ø„[ _†³S¦eÓŠŲČć?ĪĢĢL„ĶoÉńø®K"¦œ›äՉQ Å2““ŲŽGuu5Š¢ŅŪŪK*•"•JqĒw°vķŚ×šŁgwóČC?`zz𙹠åR‰ā¹ ³£õīė®»ĪD"-¾æ8©­­Ūn»P(ōĻz@óóóLLŒ³k×n¦§§ˆÅ¢”Ky{Ńwk‚MŁQ;D‰Ø&`øR%#p~f  Š¢tJ’t®ė3Mó‹ĄnĮ€€€€ 0MóØŖŖü9 č†A<§P(,īQG"xžĒää$'Nœ¤¶¶–¶ÖVD|ĘĒ'ęęĀ‘(3³³6ŒŸC2™ \.311AccćĒī÷~‡ża ™źŖ“DcqU£§§‡źźź?‰Ē橞žqÓ¦MlŪ¶ķē>ŃŃQJ„ƒƒƒĢĻĶp°÷ćc£ŒćłœŪ’0…B†‰+EŠ$D I”p=Ń÷ŠuPĻĶ3P…ÅĀJ…x<.(Šry©Tś‘iš’Ÿėŗ’°ƒÆC@@@Ą/y`YÖ7AxŸao“e¹Rx&‹“ėB”Ć#£•Ö³Ö–&tĆ`||œD"AmM‚“““hjˆ™™.»ģ26lXĒųų3g‡ŌlŃ h²vK}}=7n¢¾¾ž§ž|’Rné…ā>ŪvŽ–L&·D£ŃŹŽ·ļūD5¬"³ó6¦#ƒļRW[EY7šĪÉīž¬ó|‹ =a†ĒĖ薍¬@S]š‘É̹BŗEѝŗŚZ¶oßĪĒ?žń×Ųę‰'~Ľ÷ÜĆĢģū÷æ4–J„_¹žśėÕ4M|Ļ&‰ĒY±bEÕŪßžv:::.ų&''ٱći:ÄĀĀ<ų>LMĻx¦iŚ®ėjńxQń}čč좾¾Ū¶‰ĒćH’ÄéÓ§1 ˲*3ĒĮ¶m\×9§- U~4MCQÕ0ŒŪ‹Åā ˲¾J €nŪöo ‚°WÓ“t(B–eĒ«”éś¢€ēŗÄā ĘĘ'PEQhoļ ›Éā¹§‡†hnnęĶo~3ŠāČ«‡ŸœÅóC’`š…GeEZŃÓĆŖU«ąōÉcŲś$ӓ ŗ#Ä_H&“æ‰DMÓš\Ėv°­2²čbøa²ł"ĶõiJ&Ų¶SqŒē;E“i«‡™ł¹‚ÅŹÕ©©­elt”B”€¦iØŖJMM žo’ķ5Š€¾ļńńē<śčcĢĪLR($Éļ¦ÓéöŚŚ …EæuėÖqżõדH$.hü°kēyį…ò,āQ“§ĻR(^ŗå–[¾Q[[ūVß÷?ŗ4+sY„įįaŽ=J©TŖĢ€Eķ„„7ž„¢Ē„ŗ„`īÜ|1‘Hüa&“és]÷éą+xž×ļ8Ī­¾ļß'Ėr“¦iH’D”P ‘H Šų>²²Øp¤ÆXŲ©««åŌ©Ó”Jet]§„„…žī.ĪŽ 3>1IH„pōÄDØ„„„»””žM›7!I"¼ĢäųYŅ©8¾ģLeę>’H$dQikk£½­•é™YŽō Id eŻ¢¾6ķB¹\&‹-sž¢ą {$£sYŸ¹ŒĮŗ—R_SÅÄč'OĻ Ŗ*Kķ‡wÜqĒkœ’Ī?ęŃ>ČĄą Šł,†é"Šb¹¾¾~OWW×w2“µµń‰OÜA:]u!›ņÄO°oß>śūūŠC§‡Žwtv^œH$+ŗW]u%]]Żė×®]ū–––Hgg'õõõ•±ĮK<żōÓ<ōŠCär9LÓ\„|®{c‰ók–l‡+mƒē„…"²,ßćūžUžē¾æä€ć8ψ¢ųÓ4ŸUUµ:ŸĻćū~eB Ŗiē Ś|Μ9@]]-±xœŃ±qt½ŒŖŖtv“„9pf]/“Ķåźźź%Q.޲™•=Żōz•…©3D5ˉ%: Å2š¦ŃÓÓÅŖU«Ø­©ajüUI]7)–MjÓ1ę³e׫Tʟ’ęoX6«ŪdF&lr—¶ŽU“¶42zf€£'§QU Y–††nøį†Źē>Ģw<ž½{0L Y “Ŗ’™ž] •J•/¹ä’æE±vķŚµ|źSŸzC;NMM±ó™gxņ©'9yņd&—Ė’]6›½»»»»Ę÷ż,Ė7nÜX“vķŚXOOĻŸĶ¾}ūe¹2'`éĶ~)ų©óš}#‚J`T²’$5—Ėå‡=Ļū¬mŪO{žŌü2–eõ ‚šE]×’Z’$q©żl)l™&™L–ńń |ß§±±Ó0°,ƒ…LIikkĒq]NœHelĒ%‘H Ė2¢žæčü5E¤„Śa|Ź$[p(é>įĀŲČ)zœ&‰.Ėär9śśś=ˁ—_d~n†Į£żäŹ.Ūßv£££ ;Nss3+W®¬©®®®yļ{ßĖöķŪ_×vĻ=÷,ūöīchč4ĒŽ P,éäółūGGG?»bÅ aėÖ­«Źå²°~żzÖÆ_’a¢7Źxä‘GˆD"¬[·Ž™™¦¦¦˜ŸŸC/ėĄb[d8¦T.#K>>¢(-›pž0”sCŒÖ–J„‡AxĪ÷ż/‰¢ų‚®ėA‡@@@@Ą/kpĪŁßkĘå‰Dā6×uŪ¶‘eyńÓ󙜜`vv†źźšš±ééYŠÅE-ū¶¶Vfff)—ĖHr„ģģŒŠŌŌÄĘMilj¦ļHÅĢ4ŽmŅŽ} ²$‘ĻēI§Ó¼ėo§±±3Ć#Ų„ ,ŪĆńDL=‹J‘Ļē+ož‚ TœæćŲØ‚N¾(0>ć >ĶĶ-dꘞĖŽD—e \×ezj‚ßv3›Ö““-¹ŒŽO³-qÓM7RŽ3<āFéī¹™ĻžóÄb±×Ųė„_ą‘‡āł_ņ««kĻóˆ'Rč†E[[Ū‰O|āo~sŊ×­_æ^X³fĶĻ}CCC:tˆ‰±³ Ÿ£T*’Éd™ŸŸcvvĻu°,M•PB2¦m¢Čą8&ų>†ķ'0M|D¦įł‹AŖŖČ²,éŗž+ŗ®_įyŽ‘Hä³år9Ųųe Ē1UUżX©TŅEQüøa,Źź.Ø›@’dTU”©©‰LfR±ø8f·„™ŖŖjśūūÉē²LOOcŁ.uuµ¬]»Ū²9|ų0ŗ^¤¶”›|>Ļ·ļ»p8ĢŗµkXæ~=ƒĒOC H’‚'†X±z3GŽ!‹U“ńaÉł;„eƒź¤Äąˆe94Ō&‰ ef²¢(æf«Ąób#xÕQ¢aįé,²EQ~zė`;šäP.»Ģe|FƳ\tŃE˜¦‰, LMNŅ×?@WWļxĒ;ųą?ųūģß’ßżĪß³oß¾ö=~ēŚµkĶŚŚš¾h,†a”¹āŠ+X½z5×½ė]ķźyJ†?Ėģģ /¾ų½–‡NŽé;Ö …C®c +“ÓÄć1škjNżę§>]VåŚp8,‡B!Ŗ««‘e™r¹Ģ±~¬Ņ4Bi‚¦č¬āy %ŻĮu<|ę Ė –83nāx‹[’$‹ÅpgM±Xüūp8|“®ėÅą+šK‹Å9UU[’¤‡ĒQ]×­ رmAš=Ÿ…łTUEUUjėźČŠä y`q‚]Sc===˜–Å޽{p0¼0…ņāųzYQŲzÉV¬čab|œžW_¦*ĘpED5I”PĄu݊Źß’8ė8¤c ŹQ²‹tÜCŅˆ˜ŒM•ŃĀ˳‹AƒK<ģR›99¢S*é466ā¹6 0<2ĘĀĀÜ~ūķ\wŻuĖlR(äŁńōSÜ}÷=œM šĖX–õ”ŖŖæcŪö_yž'–ĖeLÓ$ « pš<—l6K}}=õuµ” YN×ß|#O=½ƒįįaŚŚŚødėåąū<÷ܳ8Ę<Ł‚éŗ’?{ļ'ē]ž{Ÿ>}fėģ®¶K+­dõf˽¦ƒcƒC18H%$¼99BH=$R:”llÜ«ä¢.­¤ķuvg§?3Oż?ff5’óžń~ޜ`Nęņg?3;ó<Ϭfęēė¾ļßu_7ÉdÕ­ÆN|u—;€Øaa[&¦¢XZ%k!PIƖŠW Ŗģļ ų“ŦęJdó<ś£aņ¹ ®ė"$@ ĄŪŽö¶—’ć=Ę3O=Ā=_ż™l\>ÆmŪ‹{÷ī ļŻ»÷}ķŅŽ;_r^#śéO8~üós3œ<5Ęųł3‡ĪŸ?÷‘²%ˆÅbŪ^ūŚ×¶ģŲ±ƒM›61:ŗ‰M›F’_®4üHA°žń@mpāAOlŠŠÉŽmLĶ˜Y(²i(AKÜąäŁUR&­ń2 Ėe§ŒėĖé=RBĻ©ŠōM“§OO”›¦AM4ŃD’ÕĄ·mū„’-čŗN©TŖ«š)—+$tÕ'‹O“2=5A[K„…„ mm­¬ėķ%rōč1Ņ˳(F‚ļ’ą‡LOO#Iūöīfxhˆ³ēĪ2;qœLĮ'žHņ”ßųm>Ģ×¾ö5"‘’$ŃÓӃeU(å–Šu••Œ`~iŽD,ˆ*»ä²<‚ ć"ņ÷<Yņ™YōYZ­ą č#W(įū~5ø$:;;yē;ß¹vīŹŹ żō~ōĆļ3;·@jy!„'IüŻ­·Ž:²iÓĘ/¶““īæżöŪéķķżwßÄļļߘ™žbffšcĒŽ‹Å˜˜œāģłé±Ūn{ūĮŃŃŃvvv޲}ūöŠĘ‘ $ž]ÆćTķü뮇JĆļĄ½š£h Ø!lz»Ātw„8t,…”Éō÷D‰Šåįz‚t¶‚°\B†P<_śškŽćß3Ükü™āüÄœŻ šh¢‰&ž ¦ēyxž7R*•š<Ó4I&“ØŖZ,4’É$ŗ®2;;Sķ H„čķķ£½£ ×u9ž<†Ŗ ‡ć?y]ף²e”½ūöcŪ<ü¢ C= Óó6óĖe$IB×urłbŻ%oķœb±Č“O>ÉÖ­[y䑇9ōĢ“œ:uIX(ŠĢŹJśģõ×_æ±µ„åŪĆĆėŪļ¼óĪ—¼i•r‰{ļ½—ĒeWŅ+ł|iWgg’¶öN&''hmmåcūŲm{öģ¹3‹Ŗ^:-p ø»ą5Ŗ¾ź%A@żćukéµĄĄ®ŠŚ‚艜\ĒtŲ»­“‰™<Ėc}Œ;“ä –ć3=W _“™[*Ŗ‰éłāūsEūķ–ķ}sóPš/<_Œ•±©J3h¢‰&šų/ąūžwLÓ|O0TJ„Į`°Z2¢ŗĻŽO_ļ:ĢR™³ēĘń|‰p(H{{;Ż]] –S‹ØĮ(«™4Ŗ"Ē¹źąU“··qōȦĻĆsƒ”mEQųƒO|œ™™b±·Ür ū÷ļēš”Cäsŗ¢EŅ«evl"bXär2Ė9™`0pŃL€ŖVĄ¦æK°”¶™M™H’D4ŗĀņKŗ Ņé4ŸśŌ§čļ%·:OĮō¹üņżŒ9Ķ™ó3H’Āu×]×µqćĘ/lŪ¶M}Ē;Žń’÷ė©'å±Ē±r¹Üņ¹ĀēNŸ’5×\³+`Ł{÷ķ§³³“®®®Ä5×\sÉŁĻ?®~ż£“Ø–÷„KŽ•kĮ€ÓP  ”:ą×N0GC"ŽĀĪ]õēe ĢģcÓōnė_š­{ŽŪ7µń„Ɵdl2ėėŽÜ91SųÅóS¹ECWĪoß~”TvKpŹ÷Ō¢H¹³ÓVÓG ‰&šhā’¶xÄó¼‡]×½AÓ“5/śr¹L.—£\± ‡ĆäóyƒÉÉ lĒ££½•h4ŹŲ™S¬.ĻK“pnņ ”p„ŃŃQöķŪ‹i–9tč0²äPōĆtvč9zŒS'ŽÄXæ~=×]{-•J…ƇžĮŠ|²vĄ ŻÉ6¦ĖäĶ<”Pš%ä ćS IDATļŗ6 ‰łe‹¹T I’‘%A0ҁm»/Ń xž Ā'=œBz‚P¬‹o¼‰RŁbbr†D¢•īīnÆyĶkøīŗė^ņF}õ_’™±ÓĒgR+¹÷‚į{’éžÆEn¼ń†Ū³Ł,=›7ÓŪ×Ēšš0ūöķ»äĢÆējY¾ĪŚ~žE™¾hxLT³ü:ŃS©¢ö{=p0@•j÷„ڹN-XŠ “”wo7 Oc;>·Ż²óÓ9–VLömėd]W„£§ÓĘpl W°̊{½®Źøžp5MŹŗ®89“N’6šõ‰9{”¹Üšh¢‰&žļ lĻóī*‹OF"‘MÓ0M«R®µ†±l _*„Ŗj?ģźF×u&&Ę L³‚e{Įž={ˆF£>|˜ŌüY„!µ²Dkk ēŽ!‹Åøįśė‰'āū“„wū_’ͦåŽ;īøóąĮƒżmmmŒŽŽ²}ūöKŽŚæR\(ŻK\(ń»µĒź~½Ģ/Õ«ŪHī¢įZn­’ą7^ķ6P½ÓA1™©é[¶\vŃ{sļĄ“?Āńc/zO<óā§WVV¦¶»īŗėOoŗé¦·/,,Čo~ó› ‰²Ą_4wżļ÷ČŚoČÖė„Oķ¾]ūH­ŁĆ….­į:FķXł’ēōŚł(:‘cą²včHĄR–|ÉęoŬøĢ-•ˆGu®½|_žÖi|_ŠÕ"W°qJ>’²,į Ńéū|D~ųŹŠ:żÆ Eoj%ē5&šh¢‰Ÿ䒈‹8ŽóŪ¶żŗ!ŠÉ“§˜žžF p]Y‘Qd”k“µµŅŽŽĮJ:ĶüÜ›6’+Z |¶\¶h4Źrj‰ÓcēˆÅttöš{æ÷1‰„ƒÄb1\¾M×9vōEĪ:L.oįy>’$_4ØØ‘ü}Ļ„3åRžt¶‚ļ …öÖ E½˜ü}ßGW\ŗZ2.Ł¢Ą¶MŗĘŌŌ$Ļ>ūģŚ±æžĮ]DžēĪžįżõēyšžļrųŠSzžč9Ó4®ųčļ}äŃ}ūö½Ćulå½ļ}oĆßłą³5ņW.łh.Ķź½†¬Ż­‘w©įŲ@ķ:€Įƒßšu@żŚnķ:įj0 )Š4V¦r¼õµ#hė[˜˜Éch2æqēNĀ!åÕ2ė¢ōvEŖĆ‡]“Q©¶C!$Ś%IśMąyC—ž¼³EY?ÜkHĶeŲDM4ńsXØģ3¶mÆķ–e16v³T¤#Iąy‚L&’ģź&‘hazzšhŲĄvŁl–öövś‰EĆ~īd'ĶrŖ@O’Fžņ/’’|>Ogg'×^{-##›˜››åÅēXÉūčZˆ®®nN:EĄŠÖ¦Ž !š\—XDca„ˆe™HŠN, ”ChŠtQµ`ĶŁPup]ŸŒ©£©ÕĒł©ćœŸ^ĮvXÓ\vŁņäįŸr’¾‡SÉpčŠq¦ęVüB±ü·ŻvŪ{vģŲńÉ`0‰Ēc¼į o¬ńšÕ†Œ_mČčihČųkYśšøÆ¾% jŁ}ż£—Thø–˅΁zÖص*T (Ś{" ƒķ‘ÉY|š;H¶łś½ē8ø§›ė_ŃĖOĢŠ“ óĢ‹K„ƒ*c“9„E®nCxÕ¤æEÓä_WU~ٶżŌU飶+š.ƒM4ŃD?o°źŗī4M{§eY†$+ø®[µåE`UŹ «t%“8ŽĆ‘#Gń…Œi:“““ŠÕÕEwO%Óbr| Ļ+£⬮®rčš ÄćqzzzŲæo7BžyęYfĻQ*ūlŚ4Ā]w}ååe~’÷¼Fwš¦”*¾[B•]”h]‘–ķ‘Ķ0 ć%"AŪ¶ié”J&KYŽÖб-ŽœžCÓŖēH@@‡?žĆ²é²]“$āœ<ś4½œ]aq9„˜¼å–[nŗöŚkƛ˜—oŗéF.»lkõŊææpėūń.öFę^Ć1u}€Ńˆ†l_jČśå†kŌ\č, Õ_§¦ š*|ū»c¼ł– œ[„\q™ž+š½&x͵|å;§ Tś{¢ÄĀ£C <_0·T$“·ŸĪsn*K0 ²¼ZA®žÓā Ż ˃®+Ž™+ł«Ķ%ŁDM4ńŸł?č:Ā÷ż»®;gš&•J…śČąbŃÄóŸ£dš ĢĶ/”Ŗ*įp˜Įņł<©„9ņ¦B"‘`)µB0¬Īøęjz×õ2vö, SDZA”,ųņ—’‘o¼‘x€@ €$I†A  „RōP']]Ż‚a*•2ŗ®ÆĘ­“æ,KæŖe@Ņ *FGq}qükēTlŸ'Ÿ=ĀOīż6<ų’ė6’^Ͱ8uŠ\>Ļķo}Ūą–-[n8vōØüKæōKUņ/fŽ j|ļ’LŻ­Æßp[ŖeüVCę/ׂ†UŪæF!`=0Øgó~ķ¼ŗg€Üń« ¤ßų“„x䜝įī’ž Ē|ž;’|ö Ļ Ŗœ›Ź‘/Ł ÷ÅųéS³üŹ[Fłśϱss;†”bV\Ā!•u1ba_ŃĖÕūzøł`Ż!ömļÄó’„ +Æk‰«ßźŃ»šK²‰&šhāē+Ą÷żY˲~Ó²,G±ęĻļ86 ó 8®‡¦iŖ=öÅBJÅ”Ļ0ŗi#ŖŖ03;ƒ™YĄµ²øøD„b …dĻī]J&/<÷ gĪM‘7}>šž÷qöĢ)>ū™’Į /¼€a$“IvļŽĶȆa‚­Ś÷/TvīŚÅ{ßū^F6ŽāłÕ²’šāß÷«³ t“FÉĖĮ8ŗ‘ĘŁń)ĒEŖ …čŠKX« ‘§TvŽøƒTj™g=‡ą®¼B>'›¦Éķ·¾Ždh……§ŽAåüwA0pŪäÅ%¼ŪŲąŚ—nź·6„|õą ~z@oų.tԃŒųKTNŒq’Ża–Ē/šČ³óÜvĖNg™K•ųÅ7lä»LšĘ›†ŸĪ£ė »/ėąGLóī·nį'Ļ°. dŗ„*ɎźVĖP_ŒBÉįĘ+{™O•Ųµ„½Zó ®~0Ų£4—eM4ŃÄĻQP ¾åyŽ}år™J„‚eYŠ%fŲ¶…>¢ö²Žc£jĮ`€ ė‡Šu•Ō¶SĀŠU„¤"ĖRUłæw±XŒS'OręŌ1Œ@]ń˜œēžÆ~Æüć?‰Dhkkć†n`ēŽC¢ĖUłģŸž)wßż÷¼žµÆa||UU/j÷³!|Ēe>U@Vƒ”Ģ2ńpKd²…µĢßP%\ĒĀ,WĄ­T-t‡6ā¹ćg_Ĭ8lŚø‘C‡Ÿgyy™ƒLż2‡ü$™l¢éą•]H—!SŠ žsĄ…]½õlø^5PPÕZ¶lųčD”K ¾Ō 4u Čį9 gĒ(™āÉoœĀ¶=Öu…yņłE®;°Ž€”šÄs ÜšŠ^ĪNd™œĶóęWó/ßćŗėXL•p\Ÿ^ŃĖwīē­ÆįĮ'giKUf‹ ÷Ň5Yb]2Œķų¼bWfÅeßöN@Āń®/ö øo°GßÜ\šM4ŃD?Gą !žÉ²,”ŖjÕügbœ³ē'8sśB€”ėH’  S̤0 ƒX,No_?¦Yęĉć”࣑ÉdŠ4X,Ęʍ›(W,޼ų|Õh(_@Vuzų1īæ’~===¼õ­oåĄ¤–—qm“LŽęĪw½›;īø„ˇ?ü!ęēē/īõ§*čė_ׅY.ӝlÅŖTiŹäL„A' Ŗ’y6šl³°ź’3U ¹UNy‚“§'p—|Ó§OѲ8ūĀæZ<…ŖTÆa;EÓĮvü*łgŹÕj@Å»–å{Ų8>ø“z;Ÿ”¹P¶·¹xO’RĶ€ĢÅ3p˜üyģ“3ų¾ąÄŁU Caó†=4OoW„į¾OæøÄĪĶķDBO<·Ąėnd!ern*ǯ޶…>4žķä‹6ÓóEnĶß¹œ7Ü8Äs'–‰FtZć‡¦ˆ…5ņE›HX#ŅPU™][ŚYZ1¹rw’XXÅ÷¶ėor=ń㾤¶§¹<›h¢‰&~~dY~R–å‚‚RɤP,Q*™hzՎ×ŖŖQ®Ų,ē*ØŖŹČČįp„••ĢĀ*J …‰©\·jĢÓßßO4ca~ž„łIĀA­*2ōņł<†a ė:{öģfļžŻ¤RK,§–Xš;‹iyģŲ~üų»|äw~›‡yl­õNėŗHšJœ›˜¢··—B”H4$#I2E;PS°S«Z8¬f (’ ²F¢„…XXĆ)Nqģä8ȶmƒšhXdR/āŗåj'DĪbiÅ$W°±,×­fćÖjlr0k•ÕrõÖr!”ZĀÆ’P»Õj¤hČņ5.čŒ U*ąĪP9~&³$ۃ¤ŅeYⲑVΌgŃ5™k/_dzG—č튰y} ==ǁIś»£Ü’Ų ÷vS,9Ģ-–xĒ[618ēMļŲĪčś#[;ųČö°øbņž·o%P9z&iyœ:ŸįŁ£)yfžļÜ?Že{üäńöļHrz<‹°q0Ž"Kxžčw\ńĆĪåźęm¢‰&šų?õ?ü‚Ŗŗ`šę³ŃhōFÓ4Y]]„ÆÆ©©iY±m„ļ#c Šuįįa‚Į 33S˜…āķˆ„ X–E,ett±h„3'“J-‹†ˆÅāģŻw9O<ńår™‘‘õ¼āŠK&ccc¬,/P¶|6mį¾ūīgvnŽ'ž|Ć0šżjöģū>‘PE‘pµ8AĻĆ1SÄBP¶$L'€¢Č IØ2„>Ė— !£Ė2²'dČÄCe¦fsČZY®Ł «¢A…P :“Ø\q1ĖŒėłŲŽG[‹¢HȲ |³\ĶŽCQ½ŗE ƒS{ŽŠk€P=$©}}/æ±żĻr0—"³XBSetMa5[AWb…åm‰ [6“09W 5npżuüä‰Y®Ž×Ćå;’|ė¾qŽtó0ķA:ćÜr`SķoØNÄL12˜€ī68·HO2LWGˆt¦‚ļĆoāįgę°,M•éI†¹ļ±,Ūćū?¬mĮų̧J(5ßI!IßélQŽa;ā‡Ł¢ß4 j¢‰&šx9…BĮ‹D"s]÷r]×£årĆ0‡Ć5ā³)•ŠKf٤µ=IWW×u9qā8ĮH'Ŗf°ŗšC×uBĮƒ”JežńŖ\”dGų£Ošńń ¾’żļF9xå•D£QŽ9R­,Ģ‘ĪhéšyųŃĒY]Ķ (Ź…’æ¶ē¢*ÅB†ÖŽu(Ž2A]°øŖbyņE"AĖvČ,,«‚"K„#śA¢!™C/ĪŠ“Ō|ßǐóÄBńXM“É,¢aÉ¹ńØNĄP5†‹,U*ŗķ!„`%kįł‚õׁć‚Uóę×<.ōų×UüŹ‹EYX,āe+¤VĖÄ#:ŪĆq}Z[ƒ 6AC%`(drшκd˜cgVīqpo7eĖ„ķ²nŪ;„čĀąbqaķõMeÓ0ą1·TdėeŠĘ>±ĀuÖUƒ™ Ź–‘V:Zœ<—ĮóżZ@"S*Wŕž'P I_É­®'Ż£k¼Æ³E¹'•i:6ŃDM¼l€@ pØ\.Īó¼O¤ÓiÉu]ŚŪZ±, ß÷XJ„ŠTB<„»«“ÕÕ ™åyāmė;}Ŗšś>Ńh”īīnņ…™•Ā‘8%[F×5žų’Ć0Ų¹s;Ūwģ¤X,1vö™ł“˜–O©ģrīÜ8®ėśš¦Źõҵ+ £*Lliķ@ńóH¾ĶüІÓŲ! žWp‰„ˆ†”m¶øŽpŠĢĪfˆĘZ@Rp\—€œGĀ ę–J -Ø­‘pŠPXÉZ5҃•Õ2±ØŽ®Źœ›Ź”ė ¾/XæRāų3óŒ Å16©Ž-ŻŁ]%ߊ `rĮ¼§&"“R.ce*¼pr™=[; 5V2ŗ;Ƙe—²é IP,9“$C“ټM4¬±ē†Aˆ€8‘5oÆįG£* ¬o=T ½³śĮ»y¢a ’ą”H„M¶¶ÓŽąžļqÕ¾nJe—ē2ō&#DĀóK%ЦƒŖT-× ŖĀŗ,”Ŗ"ź8|ÉóEø«MżŅbŚõ›Ė¶‰&šhā’?ä’]YY®ė~Öqœg«ÖĄ'1Ėe<ĻŶlR©|ĒĀ4M‚Įž'Š Ē“X\˜giyY–1 ƒ;waĢĶĪ0æ°ĢJĘ!ųģgžMÓhmmåąĮ«‡Bœ93ĘĀüe«ĀŅŅBŁ÷żĒs¹Üēń茪VĶn„ØŖ‚ē¹DB½½ė¦P,3»ŖSvd$¹Ž! š|]“éčč$ŸĖąz> ˆ‡ Å 3 ’Š$42ų¾ƒa(5÷;‰åÕ Ė«eņy ĒõYĶY,.—Čl–VLʧsüō©9&f ¼ęUėn©*ćZĘH+( Ńø„@T  ÖŖõ~fĪM“9¶ĢCNR,9lŪŲĘŲDŪńéļ‹ÕJņÓt č*įJ6e¢T:wtܶbC@į‚)\p)lŌŌmˆk•]b;‡ "ĖĘ”żWö²“bŅ×]FC¹¼Å»»0tI–ŠT™PP­f’RÕÄQ®Ż—% ]—†.’•ŖJæŪß„©ĶeŪDM4ń2 ,Ė*:Žóė–eK„KK)\OÉꘙ™an9G8Įv=Š­kĶ„ŪDM4ń2 Ē9ģyŽ?W* :]oy9Åüü<ńh°ęŲ§TµÕUü2…¢ÉÜü"²,ÓՕ¤`Ó,33=AĪ„ULÓ¾/Š4­—mF7 ¦§&9qüó© ŗnp׎曮ōę=…bIĘb5Ė_‰h$̆ ėq]Óņ™ž™ćܹsuśZ»ŸØ™YȒO,¬S*ę1—°^į虩|]בü2²ŸįƒŽ+ØŲ¾€JÅa%S”PtXZ)31W`l2K¾`1»Xāé–xū6!lŁŠŠŌč }}1J¦C<ŖCÄ`f:T›öW)Ō'ž`:Ļ×>’3Ļ/²oGĒõyņ…E:ŗ#Œ·p|,YvŁ4œąųŲ*ł¢M0 ŠŌmØ£# u4=ÓÆ~}ō°hø­ū (\˜$XĪ£ŚąÓu`†’‰”+¼āAW8u>Ć5ū×±w[µ}pļ¶Nz’abU‘ŌµvIIŖVQ¤Ś·T€‚ą·%‰æģуĶåŪDM4ń2 ØZŪ²,Ą4M\ׄ5FHł|Ūrp]Ļ$2ŁŖŖb½½½D"ęēHĶ e 6#¢­­¾¾>lŪfff†R~E ńÕÆž+’Ļ’w¶lŁ‚ļūŒŽnf’žżD£1FFFŠTÉYB’ •J™¦i~Ėqœb½×_P%‡xXA&Į€ė˜„ ˇh,Ž¢ČH¾…,ņkäYÓāūĖöØŲ>BЦCÉ“)™.åŠĖņj…cgŅģÜÜNO„PPeø?Ęģ\³ā‚ć3yF†ąy¤VĖ“nķ¹‚HxgVš*.7_ÕĒOž˜a%SfĻÖ4Uęɧęh‰lmćä¹ ¶ć³q(ćś„·vŲŗäŽÉ« Ä^ßﯷÖ­„i8®n6äpaö@½:øH5c¢e“k_;Fˆł‰,÷öšźkśÉm4Ufø?Ę֑V̲Kk"@( ā $ŖŹU×E’Bx"Iȼø{°G5—pM4ŃÄĖ3@ńœć8)!BęŁD©˜' $”ė®]Fņm„gįŗ.¾ļ³eó(šŖ233EŠP E|ņSŸāšk®‘mŪ¦½½•®d’B”Čōō4®]$ŃŅBwW’Õō2š@<åĄ\wķ5ģܵEÕȦ瘜·fŹåŹgĘĒĒÆ0 #«(J¤.ś“p‘eĒ×P0m1äK>Z J(Ŗ–ß½|µ« VŖ–ėū×ru®ė „Žėć¹>–ķ16™cqÅ$Ń9t4Åžā‹_;É©sžå»gŖŁÆćó“ĒgÉä,*§Ņ9µs&šąōł,Łē¦ø’±ž~q€7ß<Ģ7ī=OÅņøśĄ:BA•ĆĒSØŠĢąŗ(cY";’ō\¹ äŽĘOēRo¼Æ6|=Ū‡ €z• Ž‚XļFØŪ Ē«‡GuHDłT‰×¾i#tV§öuGøf’:ŅŁ ACad0ަŹČ’„”+hŖ¼ö’²,Õ!@Bp;‚{†Öé­ĶeÜDM4ń2 lŪ^õ}’Ó¶mū¶m37æH $Ką8Õ»l¾„ćłX¶K  ™LŅß߇m[Œ>ķBjy•b>Ə~ō#ZQ6n& ‘J„(ęWiiļ! ńWły~ū7?D6›eūölŻD&›Ć¶,d|Ņ©©óéÕ̾ÅÅÅßI&“UQŽ^Ļž}ᣪŠjŠ…d›Ž+BD#…²W#ÉĶ¢(RSQŪ³ö<ėŠj ø¾OÉt(˜.Å¢…ŖČ\6ŅJžńß?vå•’Łu½MÕAļ{x®ƒć8D"qŹå žY*•ˆF£UQš("aWĒ‹*ŻW½‚¤zy!je枭V»üš`n±D¾dcYŒC,¢Ń“ sÕ¾n®»bWļIø4q IDATļįÓæy9ķZøż– ¼ūö-œĢqßcӌ·šĘ›†łēļŽQ(ټń¦!\Ļē¹ćĖÄ":æņ–Ķ Äa  ­|—’?\hßS.Éž/żJü{ŪõræŽpæŃ(X»®q”*2”­ Ht„H% ā üŹ­›ī‹ńd­š±o{CS@‚–˜ŖČų~µkAQ¤µģ–$īoj¢‰&šx™årłt„RłD±Xōół<ćSƒAƒB”Äźj†ŽŽ6ō@CW1ŒA$”P˜ÕÕU7 ś‰D‚õ֍DXĶdX\ZŖR•8”ˆoó}ßooogĻž=Ų¶ĆłóēY]Mcš>üŪüģg?ó¾|ä÷zVŅiI7Ŗvæ]ÓıMŠeĒ+ŪāŪccc?„$&•Q¤2¾/źžõU•z(ė:ŃĄNž_­DĆ”€J­Aˆź_påžn®=°Žń™<”€ŹuW¬£5n ČÕöĄ€”āūՊŠ,׫*u ßģŃÆn)ĶÕŻDM4ńr <ϳ\׿ ć8i]×Ń4b±Čj6Ļōō4ŖVĶž]§j ėŗvÅÄŖ˜“Ätņł,²,“H“00Šm[,ĪĻEQU…üć·Ęćń_‰mŪ¶¢Č «™VÅ$3¹źŖźp¹£/>Ļ'?łI¶nŪĪ+_y3Éd’X<^µ'v õtwī›››ūęššš§5M‹ā;črxT#PščZÕ½N–„ŖŚ_’ÖŹ’Õjø“ÖPŸ' Čŗ® (“%H’DWGįC …"7ßtINŸ>]m3sWĖÉøł¶?3ÕŪŪū6EQ>¬Ź®֋„ƒ2Į€ŗęī§©2ĖĆ÷EĶĮNĘójz€š…­¢Hk÷”ŗ`h EÓÅ÷®ē“JWho šģŃg&²,ÆVøću#Ȳķ~|žŠårė«×ćū‚=2M²=ÄMū8qn•®Ž0]!ĀŪÖQšĶŃæ½‚r¶UāµmPź¶½ug?‡ jžŗćŸ|I¦_.ToėÓ¹Šūß8Ō+ õ濆kÕ«BBæv­"†*AG°?²Ä®Wō’i>’bļ¶Še‡™…›Ö·Š×aj¶Rõ½<ƦƐ„‹¼JÆóńˆ|"WlŽh¢‰&šų™V*ßr]גe™L&ĆÄä»vķ¢³-†¬h(Š’Œ"Ėdó “¶$Ŗ6½²ĀČČVVҘ…|4Nž8ĘŻ’%–—Whiė µµL&K:¦-,ČåJÜūćū¹ē«ß`jjŠ=»w344ÄĢŌ±HYxčFąK÷>žzčŒÕ?  „=Z!’ˆ„TņEĖ®Īp\]ÆZֆ‚ ¶S%U©e§¢ŖüÆ–ķ#üjšąŗ>’¶ćŖXŽĒ·Žņ”wnē©ēł«:Ę­Æ^Ļ­ÆZĻ#ĻĪóo?™ąU×ō³o{'ßø÷GO§łµwļ"W“±m¬ /œX†„"ē¦r\¼æÆRm׫“uż£Æ—ėėī6<ߘłĖkĢz”¤OC% Ž*h7œSÆ8 וضÖ‚ķµž…<;7·A{ vŁ%3ī3Ü£b¹\¶”…BÉĮv|ŗŚC$¢ĀÆzØŖ“öW\¢ ˆ ų{ é=ś ¹¹Ō›h¢‰&^€®ė/8Žó%ß÷±,‹Ć‡“Ėf@6°×u¾i–ÉeóT<< Ć0ˆĒć¬Äu]ęš“bÉäÜł ¾ō÷w£ė:Ū·m#1;;‡ļ˜Ģ„+œ=7ńSoSuŖ»»‡;¶S,™<’Ā  %–—¦&ę rēwīܶmėßDāķCń°O," 먪Lg[pmpM$¤”(ᐊYöeք®ē×Õ«Ŗ *bSÕj'€\ |_ŠÖ`!eņū'Ųæ£“Ož·}Ü’ų ŸüógyĶu\½æ‡ļ?8É=ß;Ė+Æźg]W„lĮ!xā¹āQo2WćpĮü‹‹µŠƒEåÄ2, łJˆK DŻHĪ~ł»—uēæś1rCąP’ iµĢ^¹$øŠøŠPßZp*2(2ś–^@pźģ*7^ŁK’ž.¦ę ŲÕEwg˜ ż1ÖÄŲ¾¹ Ėö ƐQÕ ¶ĮR}¦”€Ä_ŗžųŻĮn½9D؉&šhāg¬®®śŽćüA„R9#Ė2KKK<śŲć y …¾ļ£ė…bǵ©”‹äK6žē±®§›h,A”Xbvś<¾dy%S>~üų?äóyæ½½Į,Ūaa~Ž\6M6›Ī­f2Ÿ( cŃXt݁—ÓՕäü¹³,--‘J-°®wąŌm·żĀ×[ZZžīģč|K_w ]½É0įF8¤”©2ķ­A4MA’Ąs«dÆ©šR%wE•‘ØN²«j~-ólŪĒqŖæg 6»¶“óŃ÷ķ&•.sēGbÓP‚ßśÕ<{4Å'žüYnĶŽōŹaī|†‰Ł<v&9ø§,hX#².ŠÕŁ4Ō”m‰Ćū{@D«µŽiÕŌx-ū®“u½E°fڳę’_'ōKēH—Tź%żĘj@]hxi‹`½”ńõkvžįŚĄ!ÆB>ĪŹŹņš °ēūd³Yf¦gˆÄZ)W*†Q5Ž ł<Ł| ³˜¦b‹BˆsŠ,Ėt%;IÆ®’^]„h:8Žó¼¦i Édē[:::Õ”ĮŹå2'O£\ŹÓŻŁŹ[~įŽW½ņ•Æ¾Ņ¶-]–eŗā&-QU•Ń4YM“kY¾_S„+čš Ų®X£Į:Õõd4Ub}œ ”šģŃž'ų£ļ'Tyļļ?ĀŽmüī{vqäTšO|žYŽņŹaFć䋳ĢS<ųŌ,’ōĶSœĻBĪāžŁ³§h ^ÕØų E6 'øāõ9?G–%¶lhaĒęv×gĆ`œ`@AQ¤ź€#CYk¬·f^d¢Jæ#Iüł`h.ū&šh¢‰Ÿ°ŽćL !Z…—ėŗ.ٶ‹eUKżŪ·o'óāóĻ‘ĖeGŪČēótww³oß^ŅéUN?„]©€k‡÷§Ÿ#Ł"ŃZĀń¶ķ0Źį BA E‚Šķ”ė ¾eĖ#T«ÅmĻÆ>.ŖĢÓHJPk”$®;ŠĆė®䮇§xąÉYn:ŲǾm<ńÜ"ĒĒVyƍC ōDłĮO'™œ-0ŲcĒę6:[ƒ¼öśA6%ŲsY±¾8 ]ęę[6Ąŗ(1Ēgčŗ ØśZ čīBéŠQ:¢ÕŒ[“@pA l ņF“ ĘVĄFė_ĮÅ€>Ŗ;Ö«JCŠøµ`pA?ØāĄtĄ‘›J3ŗ§ $‰‡œ¤Æ+Ā-× pųŲ2cY†śbX¶O:[!Ōp=AÅņÖZ…õfŒz@&{…`8U~’+zvsł7ŃDĶ ĄĻBßqœOU*•SBˆŚx`]Ɩ§ ł? v†ü‹3ą•€”Ģ›µ` qÆ_įb׿:©K ÄŽØžo¬Č C]GąÕ‚Žś<Ę–Ćzˆö‰ŽDt »#ÄķÆ! +zI%¢ėČē Ļ!‹2?æ€ŖŖtuuŃß×K±X`qi‰ÕÕ4Ÿż³æį®»īā oxmķmōõõR6M&'DZĢ<Åb‘ÆÜż·üęo|˜É©I»TBZrÅE‘«$R4]4UĘ0”j/æ&ćŗ>Į N,ŖćūM“iMT’ †^Ż.„ŖĄó|$`ˆ~ńõ#ŗĀ~:ÉÜb‘¾éL…ś •üŅ6ęS&Ÿųü³œĻp|l••Õ2/ž\F–$,Ū# +¼’ķ[ٶ©ßśÕ]\~u?×_ŁĖĒ>°Ö'¹é`/o{÷NhI°w[‰Ż½ ‰õĘ@©ķ ‡jd\'ōz `}Ā_ckŸhČž­†ģ]m śzū ąbc! -…ā’kiTµ *(±Śłyʹ b —ļLB{ˆ|Ѧ-ą×īø CW87•£Æ;ŹŽ­”+.†® W·łeYŗx€ Q#šjŖC„’Ķ’4ŃDĶągŪ¶õ}’ õŒŁq^ųė`ppˆx¢…¹ł’ĶŽ›FI–Žåæ{߻őY¹gVfÖ^Õ՛Ō-µ¤n”„%µ…ĄĘsĘ3c³<ąŸįƒ™1pŽńnj™1#äA€Œ…--„ŌźEźīźjuuwu×¾Wå¾ÄwēĆ{oä­ߐ„ńœ“'#"c¹‘ēž·ē’<Ėlmļ Ķ5’ā—9éå‚MÕ^F:–©ÖKy“bĮ$Nˆf9Ē giŲ–ĪäXžŃŖĆģd‘JÉ&brŽ cü Ģ’u ¢X•Ÿ_mƒsWüĢ’pœ¼cņ‘?9ĖŚFŸ’‰ū(ęMžżž:żĮ›ļ§Ó č»!yĒ@Ó4FŖK󺽐 Œi¶}¾zr…Ļ|ł*ķåæņ[/ņÅgnŠ{õ&’ö?¾@ūRƒÖ©«ü·Ļ\„0`ė…«\zyMā[ŪśŖāŪģĪöng’§AĢ},n Źv ²_)ķŽĒ§ AštÉåtE1äŽ-ØDďéõC(;ųaĢ}ąsS%Ī]n°o¾Ā{žĆ0t¢X2?]¢V±Ńu0 %<0/Öw)Ń$<|~aʚž†bˆaš·‡XJł‹qæØæ•677‰ć˜¾…“ĖÓét(ŠhšN§ÓAÓtv6W)ämFFŖ,--"ŃY¾µĢśś:”ßć…žē—~ł—¹xé2 {±Lƒ›7o²±¾Aßõ»_zā鯜8qņ„iŚĢ6É;1š¦įŲJåϲĀTVĢX–N§16š§Ńņ £˜[k]:½ĆŠq½˜B^  ”aY:±Tmģ÷><‹”šÅƎ䕳›üĆĒ–(L~ėOĒ’’ķ_ÜĆĘvŸ’ó?žäk/®āzWn“¹¶Üau£Ē|ś<§Ļmńgu…Ļ}åķnĄs§Ö˜™(R*[,Ģ–ł‘$æG‰•R®8¼ó”0l¢X²t`Tā(#©īć4€·¹Ż.8ŹT÷Z¦+v‚ĢG˜%ö…|£`ž üY«į4šėIb‘¾€Oūf‹‘7ģrBg“ę J…¼ÉßµĄŌž<ƜŻbr,Ļī#Ÿ3’]‚& D"”é$ÉĄ½ß;ež †bˆaš·„õõõšc@'Žc677yõÕÓųAˆ0,v-Ē!Œb¢0dg§AÆß'—/Šė{är¦&§év»,Æ,}6·›üåæŌ;yņEß¶lfggi·Ū¬­®E¶š’Óźźź»ź£µõŠćR“;H ’0Œ1MĻ°-A„dFŪĢM—YŻč±ÕpÉQ.ZZ¬23žca¶D1obRĮÄó"LCgcŪee½Ē½Gź<žō V7zü“ļŻOK~å·_āŚ­6‹s‚ JīT`­•-LCga¶ĢžzŽzĶįķoš&Ž%wŖsļŃ:ķ–OØ®ĄÕ3[¼v~z!/žZStģskµ EUq/ßh1hõ{aœÓź>Č\N½ø#Ćķ3’ōzгk’Żķ‚ō1vęyī”6PŅĮ‚ŅݳÉõ[;}Ęœ‚’…Š5.Vńƒ˜rÉā]o™a“ępéZ‹bޤ$B$ŠŒéŃé $šļ†CĄ¦¬ū÷ĶŚĆ3ĀC 1Lž6`šęÉ(Š~Õ4MŻn—ķķ-ś^ˆ0L¢(Ä4 <Ļ£×ļcé!}7¤P(R*Éåsø®‡ėŗ“ZM¤dmmmķĮz½~n’ž%jµ*›[[,Ƭ¢…šŌé«ģ©T*—w0ĖŌw‡®‚øÄ8–NĻ ‰% &ū÷Vyų“óc#¦”sm„ĖĘV?é Ø@C¹h‚ƜŪB·½a ųĢ—ÆröŅ?ņ჌8|äg¹r£„œ…5ˆ"E,Ōtõķ>7W;4Z>§ĻoóŁ'®qīJƒ_ųēyā¹[üџŸēŸæČę¶ĖćO^§>’CćŅõ&Õ²7š\ŗŽ„—ö©vZžŖņÆ®BÓz'¢A ˜]W?‰ZķKoĻ*zÉeø}|MŒLšĻ޲ÉC:Čļ>OŠW··<޼oheü›mb)9|p”‰=yF*6o¹’ ˆ)MŽīa~ŗ„H”MC}= ŠVĶĢKųLŹG†§„!†b˜ü-ąŚµkŅuŻ_×4ķ„ēyH) ƈFŪRkv†aŅw=r9› i·ŪA2VŚs†AF  ęēēßŖėśž¹¹9Šłk««ōz=b©ß8rģx°wļŽīˆ^m,į„DZTŗ¦dyGŠs#ņ9“ZÅFhŠįéZ“[k].]k”!)8&Gö՘ž(°o¶H©`RČ«ł}Ž1ĄÉW×éöŽż–,SšŌ +¬möÜĻ‹ C% Ōīx^D§„1Ż^ĄŹz—ŁÉ"żɁ…*³“EŽåG’ńQF*6ļ}d޾k/1õ‘‡Fa4Ļ]Ga±Ni¦ÄŃ{&€”l˜©©j<–@‰]B`¶JO«’;Ł’ŁŪ%·o¤Y‚` ųé*`j;œŽ2ćsBż­ģ@Øtn®tų< ć¼v~›CK5Ęė9¦Ē ĢN•xćń=“»–„36’#NV CßķhŖ¦$R2|jļ”õ½³ćęŠDhˆ!†ų;ļ8yŌķķķn½^’Iß÷Ÿˆćø¬ėjކ†i…!Aą+™ąV\¹‚išäsĀ0é÷[øžKĻ Ń‰ĘkµŚoķenn× X]]”ßm  k®^^ÓMs‚ƒ®Ē’X¦¤1 dLƒe l[pkµ‹:Æ5)MĘjŻ7Į؈C$5 9ƒ йøÖ„R²pż׏(L ŽAĻ yéµMŽįųįQ^>³É§æxUUØŗ602’]vŪŌ1 ?ˆ(åMüPq4ąĘJ›—Ļn±8[fe½Ēł+ je›Ÿ’µēų?x„zĶį?{‘ūńŁ/_ecĒåą¾š§ēÉńžwĒ<óĢ Žś†Iض6ū˜‡“±@߃\ŖåX™*?m™(ķ’¬óéS-ōŃu””ūŪRf?B?”+cĶ—„¹óÓEf' ų”äśr‡n?äĀÕ“{ \¾Ž¢Ū•0M[Ż€jÉ¢bZ4ŚŖĻį:…œI»‚¶©+” X&×S]čöUąo“<Ö6ūņ›²%6yõÜKóź#½}žG˜¢V±™Ÿ.Q98Ź;ܐ‰™2ĢŽš¾GśŒŽ;FĆū:°Š1 ­¤Ёœ•ų4ø§É@–éŸ÷Iē÷YU@‘éd]ÓÆ^v<dĒ –J<œŅ ‘Ż żw>4ƒ¹TćŚ³7ńƒˆ÷=2G©`±¾ÕgļL MÓø¾ÜA0Šń}eÄdeć ‰JrŅķ‘’¢æ'„V[˜¶žó•[ž0 bˆ!† Ą· ­VKęyŽOŲ¶­‡aˆiš†`}cĻŲŁŁ‚DG8Ž¦é“ŪmÜ~R©BŠģ”é&³3ӌŒTxå•WŲŚŚä{?ōƒüĢæüYžż«RČ Cķö뉔Œ%”¦!x¾Ä¶Q,™Ś“§VÉį1[ ŸĶķ>+›=,S§Z¶9“XE×4^9·µ;O‚K£ķćXŪŌńƒ˜Sg6Ń4µ^E1}7Bõś†PŻ‘ÄZĒ6”Ć`$’›‰”0RqŲizLŒå¹pµÉĶ•ėŪ}žza™WĪnń3E‹_üĶųž÷.±4·ÅżÓsüK k[=¾ō՛üĢ”Q.>æLK>šƒ+›0U[S¢AĀ@ õ¤~½ä“ŗÓ «p'1PdŖ#Ó9Š3]†t>6K[«ģ?x„}ū–ƒå[ĖąķšņK'ųßśMΜ;ĻT= ż×UUØ!B'N¤ć ŽĄ T°"I«ć³²ŽÅ±M,SēšR©=ŚŻ€s—w!Ō…ōŗėG䃜Šéö‚ÄŪ@ŻÓ4t“ńC”ČDZÄóCE*”}7¢ŻSŻ^€ēÆ4Ų3šćģ„vš¶%XŁčńž‡ē˜ž(šįGyōķó`č|ą{©æq’śåGŒBIķĻī«©Š»lƒ‰4g[śYUĄ4ˆkÜŽŹwŁŻ,|£8Pœé"ˆ;:)Ń0½ģåä9sI"ąĀröV‡BĪ`ļt æĒ’ĒŽ>ǃ÷Œóæž»Æ)­†©"…¼ÉKÆms \/Lž×éz ÜUTGbJÉ/i•…iė®Üņƒįébˆ!†ų»„ļdŸōŽļū?A@”’k×®¦Q(š…×m`Y&†”Ö¾<×įŗ=bµZ•J„JÆßgy; IDATł®opåźužėĒ>ĪśõӌVŌ¼4 ”#ÓŠŠ¤"摨ļõūJ”DZŽmrp”ĀÜt‰ŃŖĶśVŸÓē·yžŌ^ftœõJ™e}7ÄõBµŠ/Ōܶtt!JćXF)„’ŽwUī ”1=Q¤T°Xš«ŒzĶ”VµŁŲźS++eĀåµ./¼ŗN«įņōÓ×9łź:lōųĢ—®rįrü>ĻZƒHBÆÉ×6’ÆF:>»­žTĀ7»č%ļ*•ūĶZ gČtҤ"«"˜},ÉkŁÉ}¬äuŅŃ@^=~oĄõ"˜(`Ķ”™/ņއēø~«CĘ|Ļ›¦yŪ¦øz³ÅŲØZ£“M„ļ ’N‹Ęīz`š“išÆ„ä?ģš 1ÄĆąŪ†(ŠžkµZ’AJ)ć8Ęó¶ÆöĖ3a/PækĒÖqliéD‘$H„TĒa¦jv‹A)%Šé4Ū>a³²ŃåƊ zü©ė¼~a›_Ūą7>ś2Æ6łżOćźĶ6ŗ®ńźłmŽpläLŗż€™‰ltU·!ˆp/7’¤EĀvÖŗŖŚŽŗIö2 {G€O«ż¬äoܳöĮ·3žµLR@&H] uĮJ:¶ś{ŪSĻÕj1;U„ŅD’\Ī R²Ø8^ŖńCŲĻvÓ%Žal$ĒütI- ĖH©’*-+¼›°éRņ“>²wŹ* OC 1Ä0ų6”ßļ’ūN§sҲ,„t:Ī;Gæß§ŪuŁnzX–…a*sžf³ÉÖv“J}ŠB±L”X@×A !ń#a؟>°8~­ä“1 8–X¦Ą±uüPĶ’5”f¦”Qș ihhx^D³åqs„MKŽķ«2=ž($gļHŪ`~ŗČž½Õģś¾e¬ƒµdW=ŒŌ*`ųĆP­F±ŗ= %½~H³åK5š0„ĪŽ™ņ`7~¤źpĻį:ß’žE:½€7ܵ‡…Ł24]je›\ŁM‰ź09‚Sµ™Ū?¢‚mׇ„1 —¼)#Óp2ļĪČ$w„ĪŁÆ\ź/% ¦#†(sŸ¬£`Ÿoą”ź@JģtŚ×Ü}hėČ$ŗ®qp±†:BčĢO—ųŠ»£˜ Œ­Śj­S(A=łąt-ć É?žpaŚž6†bˆašm€”²Ójµ~ŗÓé“MÓÄ÷}z½š¦„åźØr哒n§G£Ń@‹{“Ū¢(Ą”« ßétˆ1ŠdtśŠb¹źXŖÅnjĪŽė‡äli ¢0Ā2ł¼‰iś^D©ą« Ć4˜Ÿ)3?]"Ÿ3yżĀ^ļ¶ü¹= Č;‚CKUÖ·ś¬oõŲił„IşĪü[ņŽHTź$¦‘pHZ’B™űIJŌĒgYʳ Š$~³¹ÓēÅÓœ:³I«ćóńæøĄśĆӜxyŸżåg8yz’žÉ³|įéėDnČłčĖ|ķė«ps‹üž«œųŚMXYįŁgoĮ„ Ų¾…wv5‹ß­ķ$ą÷3•ŗž äi Żp3>äv^I€73_Ė$ée3 ž¹ä²•ÜßM„ŒŌóY¦ v’, yåģGöÕŲ;W&b,V±-µķ±Œ Zm!4rŽŒŅßéģ„%ļc>5?94bˆ!¾ūa|7dE/4›Ķ_­Õj’6-µÖt“ČļĒ’˜VK‘»žN!ŒŌøi¢é½~]|?¦X*’T½U ! "’Y° Ā~FÉ®},ŃĆxĄŹ—hŒVMŋ«Ł %nĄéó[¼~q炾Ģ\O«ū¾qh©ĘśfŸ ŒČåLVÖŗŖ¶$–”Óė‡ƒ`FCØ …(–ɱéHćł1ŗā¶±P×=¶›…œĮźFĒQ£?ŗČ¾ł ’ó?:̽GĘ(ę ø{±§Ą÷=ŗČčdfŖ¼ė-3Ģ?28Ł×„Y Ą6õ$ųö`t”Įz6»+~©hP” ŲQŅ-€Ū „Ņ@ŸVōéĪæąvĪ@–$˜“ž²Ā–ŗ[µŠZ_ō°sÉWz»Ćüt‰ćļß—wø|½É»ß:Ėüt‰Ļ?y Ö6ūäó²'É;¦ZŪŌT7 JÖt}·S“4„Ö4>·wŹśž«ĖžÕį)dˆ!†&ßāF€ėŗæŽķv“R¾)Š"µūĒ2‡eYAČÖÖ›››^— (ÅBC¢0@J(Žxųį‡k–žŒvU ÓµBChÉ1«c·LA1±Ć„Z|įåu¶Æ=ufŪēĮ{ʙŸ.qåf‹ł©[ õ<éš`'+‚ÉFfE$÷IųÜü¤õ}×Vü³ĆÓČC 1L¾µču:ŸB|Åqœ¢iŖ™¼ļöp]ķķ-¶¶›ģlo` ‰ć8ŌŠ‘č†A†ōz= Å›Ėg™ZP*{)ė^"“ŁzLI5 0td"#E!±ÜŻŃ/ę•[ą„mŚ`·hM‚DŚ˜›(pt’­ŽO«_}q•£ūj\ŗŽda¦L„dįŲÕ²ÅNÓ£ÕńŃu /«?3p°S)Iš%n#ōˆĶ>~c:—®µ(Mņ9ƒÆæ¶ÉĀl™—^ß¤Ż 0 µÕš®·Ģ25_įŸ}’!}Ē’äu*E ĖŒäh“”"dŖF×v?Ō;ĒĄaMć I'ąäšT2ÄC|·A’n:Ų8ŽæEŃÆ¤>š¦ Vī®_»aś}—ķ–O泍ėł |ßĒķ»t:M‚Žc#y 9ƒdĶ^=W²V¶©cb`Č#XźJ—ĪäĖ“Ś>/¼²v[æ’¶„7MćŠ¾N¼¼ĪN˧Łö¹ėą(Göpl’‹³%–ęʌTm\/¢Ó 3źōø¤LŠl N †¢(Y D­)JHt R÷;jŁb¤ź ióÓŁīōx^?dß|…|Ī`łZ“WĻmA$yü“głņ³7aµĆ'žü¼rģwłāÓ×՜½×ęҹ-T+¾ A¤;™€žźčI O[žY‹`™ īę‚4Ų™®AŹ/™$"KH ’ŸyPķĄWŪ:PsÆēųŁ’én&źyĪ^Śaz¢Č÷¾c/…¼‰®«’§ģ®f¦ @Ŗ8øsH>3?i=<<• 1ÄĆĄ·RJł;ažq/ !p·ß„ŁlŠétŲ3>I»Żįźå3Ō§©7i˜ō]!,üP@ø1Ų­—hŲ–PŹIą’ ;)± #‘é5„ŖžĆ(ęé“+»•zj/›éŌk„¼ĮHÕf’|Ó“:^ÓsC¶›ח;“;>c#9ĀP’w4ĀHǶ4\/B×/!mūG‘ŅHEl@‘ĆD3@n_‰†N§Šhyģ›÷9õŚ–%˜ŚSącŸ>Ē’ŠQN¼¼ĪĶÕ.ŻŽĻĘvŸ7ß;¶ Ł؏8Šóńƒ,īÅmś^¤ķV Z>T]n÷Hy½L"m÷§NƒŁėi՟vŅ5Įtę/3ĻC¦ŚO» éćS‚`µœzž°ĒĘNŸŅ=GÓEKŠhłģĶńއēčö^»°ĶÄXÉ=y¶.yĒ Š%B×5õ;Še6ų§©ĢøŸŽ;eżH!g|öµK½įYeˆ!†&ߢ `#‚’Åó¼Oår9# C\/ Ńl±²¼L>Ÿ§ßw¹{ß ėŻ]ØŁ}§Õ Œ"ŗ½.[Ć9¢HÉĆHāz¶©ę½¹ääÆė:†Š0Č$Ž”²č½t­Éµ[Aš×H‚“F*6‡–ŖL$ ¹œĮÅ« ®Žź0Z±iw|.TiwŽīÆ ‹²"hwƒŻQ€”źpō]-{u]@=Nč*Y±-ļGčBc~ŖÄx=Ē;šaq¶ŒačśÆrńZ‹÷ųż?8ĶÕMĶåx곩K‰ej¹ō{PةƓ&QŁ@Ó =Ū§IAšdÓ@en‹2Ż‚4Ų§kƒéOvC M&ōŻĪB¢Ż£¹0!ē^\åļ^@Ķó'r”k?\ēĘJ‡©ń9Ē`m³Oß ±mÄÅH% !īņ?L4ŽÄ­Ļļ“¢”“ąC 1L¾čApYń¶m‹~æÆHžGĒ(a‹CįĻ<ó4žŪeŖn3>ŖˆsŗQ¤‚iߋB­Ņ dw“Ŗ/ŒĄŖŚn¶}ž;µFߍgżģLøX0xč¾I„,čLŽå)-,Sēāµ&[=¶q ęĖH sJPČ6u\?fe½GK-n?šLSǶaćŲ?'»ō`LCt!”0¦31L„†—w 4M#ēčšF»ėS+Ūō¼_ŻąŠR?ū«+Ē Æ¬ćX‚™‰"w!bŠ“XJ,SO¼v;@Ś 0ų’ )łqŠ~w~rh"4ÄC|ēAüxż8ŽĻJ)’qE¶mt]ö^ÆG¹\b’¾}lmmŃh¶Y˜”Ō*¦RØ÷c4M&ė]ŗŠŗ†®«6o)9XŪ20Mµ­>'^^æ½å›Ä0ĖŅy÷C3ņŠ”ŒjÉ¢X0É9&9Ē Żõ‰Āˆ+7Ūl7\fĘ äĮā\…rŃBFÓćāµ&…œÉÉӛ„aD(ŅßĢD0”ņQ¤^ß¶ō›cjH©!cŠ…–é`$~‚(¦Ó ±-ĮVÓcm£Ēx=Ļ“ĻߢŪŃ5?śó Ō*6'Oopāå5ŽłŠ ŸłņU&÷ä9²PåĖOß ^s˜Č¼śś&U+š¹y³Åč˜  š"ØTåz +?õHž©ĢoŚžOĒiuŸ] ĢŖĘܾ`Ü‘ĖŽ©D˜Ž*» ‡ļ‚€/Ždžų8TJ˜Ķ>Q3Ru8¹ĮųXž÷=<ǟé ›;}&Ę Ź3Ā Õ’m°–‰¦ŗ1©X»ƒwip¼RŅovāa'`ˆ!†&ßd\ ‚ ®iŚŽćhé Žc&ĒŽ%–šŚéWYœÖ(ęM„Š1…FŃ0ĒŖqmčD±Śh¦ĄcN¼¼Īźf’¶Ųbč1šąń1ö/ÖŠ›Y]×0M×S;’žŃlūŲ–2ęČžQjĻqlƒ'O¬g.5(—,榊?8J©Ø‰µ „ō—…‘rLdė‘hÄRÖÕ@±’5ŌśbŖqG’|Ī ŃņŗĪ…*Ż~ČŽ™2«l7]ŽłŠ GöpüŠ(3“E榊;0Š=Q¤»Ń恷ĻĆdmĒcāĶJEpTĘ09eŖ&J8Ż@µįCŌ®~Z¹§}©śe¦rO«’,‘0Ģt n÷ČvŅAĖt Ņ„Ą1Tʅ²ö»<÷äuŽņĄöBå ;;0Āę¶Ė©3[ĢN9~h”—^ßD×5Ź%‹8VBL©™TńÕ»PĒ’äūA{h¤,o“£Īš“3ÄC €o.žŃ4-oĘ}–e‰tʇ>•J™™N¼šKÓ&Ž­c:=WķČ{~Œe ”œ÷dĢĄ(ŠŌšŲ‰—וN†ō—2ĆßóČå¢5P拒Ör,%–”)ž¼ÉhĶQ¤BSpsµĖ«ē·)äM6w\ŗo‚ŁÉ"3ćĢ„ĮŸĻ›\»ÕęęJ‡jŁfsĒUrµbł§ÆK±•€hÉ6C*il:ŗPoŠPh%ʃė[}tšASČ ā$`Z¦N”Š»%Ž#T•3ą•M¶Žn™Ń¶¹ļhJŃ" #t |?lō½Ó0CåAļł;Mķ>Bčģ)±8WʶT÷a}«ėEōݐ‹WŌ*6­®Ļį}5Ŗ%‹XJ ]©öܐnO‘‰TÕ/t%œŹB#•lrÅDžŖMm+¦ÕČē›;:[;.żÉõåeśnˆ¦A§°¾‚c ŽtĻļ{ū³3eŖ›żGĒŲæ„‡7ŗ°”Ylõ1Žņ`± Z sڇņ`™ź¼Ēķ3|]Uęƒ >ĢÜ7Ģt¢L 2ɃĖīÜ?»-%ʙ.€²6Ļ%‰ˆ‹ēEŲD“v\~ć$Kļ\ął?9ƒm r¶Įōx‘‘ŖĆŅ|™WĪl”ė¹œ"ö½H¹D¦Æ°«0xEą> ŸŸŸ“>|mÅ?7<ż 1ÄĆĄ7RńBEļ¶,kZA†ÄqĢŹŹ a29 õ~a:aØH]±”8¶ —ģŽGÉöV˜}ń«7wW’²Iš¶7N*õĄH*Ę>©rB'bü0øŹrc£9źUŪTĮ©3›€ĘÕ[mŹE‹½3ef& ŌGrŌ«6BבĄŚfĒ6ŲløųZgDŖj?mł‹T (©F•É‘²N%„-Kyälƒœ£’RQU¶{ņ8– Œ$µŠC¹hqīrƒĆK5®^oń±OŸēѧłõßł:—o“¹o…ßüŻSŌr£%?śÄīš-ƒ8÷ģ-źK5š×;P(¢œSę~˜©ą£LŠēvƒ!Ųó§\€t<­ōӎAČķŪ6·›i(¾«’“&Ę\(c>#E L§¾|7Ż3Ī»ß:Ėė¶9„ɑż#čŗĘŹF™‰Ū (Š–8f@¼cE`Lƒ÷WJā«ĶN“<< 1ÄĆĄ7 ®ė¶‹ÅāOv:'ŹårŃ0 Ā0Ä0Œ„,'”‚_Zµ µ/ļ'D»Įč@*%½œ­sõF‹­ļm5˜Ÿ.21–G×5ģ¤Å®”…1ŗĻ‹B#§ ņżߏ0„Ęęv„ėEŒT^æøC©hb[‚ēO­ńö§yī„UZŸ÷><Ēē¾rzĶA×”\“ųĄ;÷ĀhŽ„ł2ī› ūę+0]‚Õł\ĀŚļt“ųkmvēłéüßēvџ4˜§D?+SÅg‡D&°§Š€éX ķ č™$"+2¤uu½VNnėsćģ³S%(ä8~h”ƒ Uznȓ'–9ŗ„G˜bc«Ļx=G„dćŲ}d²ŠéI4MżIÖ1Ł¤Ų üÅü¤õLC{śā ox&bˆ!† Ą7NēEĒq~½ßļ’‚ć8Zæß'ŻŲÜöØW¤]+(ä-¢ŪĄ"ü„źæĒqĢ©³[·żlpßŃ:ŗ¦‘³ ‚”±)ŁŽ8Vsz]Sr暦6\/¢×ŃuńQ‡j٦Z²©ŚÜZėāłÆ5ŁÜq)'·ßu`ĻXjyıÄ2–‡.4vZ>ż”Vc9P7T*Šō—: F )0Š¢]Æ{o!ŒbGP-ŁŌkÓćFk÷©³¶Ł£×ø’Ų#U‡¾13QTÆq«­Ę#Jˆ€zĶŻ„~ČģDQé0†±² Ą2-±Ęćv—Ą,k?[Į™Ź^p»pČ>ŒģjłŠĀ$‘H‚ŒQ䂨1³K5˜š܁+c„ęšÖ7LņčŪęø±ŅęŌ™M¦ö’›ŌICqGH¼øsEp`Įšēa(xqŚśüå[žP:xˆ!†ų¶Bü]}cš¦½EŃ;MӜ ĆÓTā?{Ŗ„‚j-kš†eźI;\K,†wÉR*§N®Å1»āA•’ÅŪŽ8z~Ž IDAT‰m b)UŠÕHvö9PčŖ-Ü÷beŽ£©Š¼R²ČŁ„‚‰Ä\¾ŽFÖ6ūÄqŒ®kL˜›,P)Z8Ž`sŪeu£šĘ‹§7(ęMÖ7ū˜¦N©hŃ÷"je)•pŗŽ(„ šg}»m‰A²…F’HĀ€øźMćƒRr¹VÆ5ŚŃšŒ4ÄC €æ)ā8€—ć8ža]×-]×1 ƒR.Ę6%a؄]lĖĄ0Ō.},•(L꾚®qńj“ W[hh =P˜ćąB/Ų5ē0 cj„±Ņ‹ CŠ ¶Ą¶ŗ®Öć8f}Ū#H䕒…Ä;0B)Ńhw}že]Óxńµ ĘGsLŽå‰¢˜£FؖmrŽP[‚&cüPÅ VõŒźa*€äł*! ”P¢¤ū^DĪ1ŲÜN‹‚ÉÕ[m y“»Ž²ŻšøļčĒŒ0?]āmoœäĮ»Ē9v`„Źl™Ć3eŽō–˜(Q c޾w *UŖGéžYeōķj˜} ©ŽĶ;‚sv50¾£q•­śÓ5Įl’pgkŻb—(˜ Iß C©y°Bʶ€¢Ķł7BēČó“W»„aĢŅ\™³—\»ÕęīĆu4Mcu½G©h&bOa’L&ęAƒā°"ˆ”XĄc¶ź5ćė;­”‰ŠC 1L¾IĄŠ”RB¼CÓ4LÓd¤¬SČÅX¦ cJ“¼c"ĒŅÉ%$¾0R«r/ŸŁbm«Ÿ„mP?Z¦Ī;Ž<eŖ¢ŖĀ¶-%BäśJ©Gčźy CĒOvö]Oµ·=?&Ÿ3±LA¹hR+[x^„®ėœz}“ÕĶa¤‚ņļajOŁÉłœIŖ¤ćŹnŅ]Ųnx˜¦Ą¢DXGĆHZŅÉV@ļv"Ņe™»+†”);\”S)Ytū!‹slSpźĢ&c£9ŗż/?{‹£ūGųč'ĻšÄ³Ėōįƒä,Į’ż{/S«Ų<üĄ;M—JÉB×5®Žla:£U›n_m$čŗź.„_¤” RKš=š¦Ł•¢žT³3L†bˆo-Œæļ±ĮĻAšĖŽ]©!hµ=zż€½3%K‘ębbj_JÉN;HČmrWā-Q’»ūš(–)0 - ģ1†žōt-õųŌž7bŠy”ūb0M Ķ "‰ch“ݐ0ŠŗNµl3¹'O¹Ų§\²ŲŚv9yzĆK5M¹ésS%ö/TŁ3āšŲ#3hŗN»«fāa$ŁÜqń}„P— E‘r;L­… C'ćĮvčČ8NtķUgĄ¶Ž-Č;]hŻ?ĀśVŸ8’ƒÄ¤Łņ˜Ÿ.‘s ŗ-–G·ķÓ\nskµ«m.¼ŗA£ķ1EÄ„S«,ĪU€’Jėp]ĮČas»ķoJ$¹-­Ž³•}ŗF˜%:ģE&øĆ®aPŹHµ ŅėvęuBRēB#oĀÜŠēŠR b‰Ū X˜-óžwģ%Ž%—®·˜›,rh©ĘśVŸ ŒéõĆDŸ!mŚM&‘»6ÓÉŪĄæÖ5­²wŅś¹«+žP:xˆ!†&CAüæqŸh4{ŸīÕ­I-ÆaŪ:†PÕw>g†źĢ&–š!ļU0QĻ3;QĄ0ŌŖ ēFX¦¦œ÷,]ųԕOÓ(C?šcāXDY-! ÓŒå ”įŲ‚(ŒiuV7ū„aL„h1¹§ĄNÓcn²@·²¹ķŅī†<óā*G÷pžJ“ ŒŁ3šCčc9t]g»é"%ˆD„&Žćßó#5ŗ04¢ˆĮ±jš’·"„YŠwCś^D»šŅÖ&a3¹'Ļs/­qp©Š>ö©sņ&O½Y)å-MӖĆ0ų`ĪÖōJÉblĹčJĄW¤½k7š\¹Łł†$ą­o˜`j¼@IĀH)¦Ģz)µA%®%b<š®&U×4U Ę»3xĖRÕxߍčö‚(Ę:ł¼I¹h1^ĻS)š¬oõ)äM^9»Å­µ.ŗ¦ø§T4Yœ+S,˜ä0}?¦Ż °L׋ŽƒÜ 6šź^€,J……dŅŃŠ‚`IĒĄõ"„®1;Y¢ŻõŁ7_įĄBĒ2xó½ć?8ŹĮÅÓŽx|÷ۃćXĄ=LĮx™h£Ćžw.@q½ŃĀ<“lÜ>8cɁ‰¤ϲųÓąœ^Ī:ż‘ź““N×ū²sž;G2óÜY)įģˆ!M(B( =ū* 9ģ¼¶Ź™‹;Üuļ8Åd“ä-÷OņĢ‹+\æÕį؁Kpk½‹š+ĀP"ō$=ÉØf‰ÉMĒ48V-‰/4:Ѱ0ÄC €oĪjp ©Ś,ĪUŠIUņŌZ`It žņ«7wē’0ؐļ;:F!!ļY†Zń2R”¦%Ę;I+]Ó0ķ' ™d:2VüN7„DŖ7g˜†Ži Ź“®Ņī“{[;}/Āóc-UŁ7_”Z¶‰%l7=‚PYŸ<½I)orcµ«,€måw`ˆL»YŖ­†”˜Fų-S%3*91„Ž!4L”#„®TSŃ”dėįå3[Z¬rźģ_śź ø{œ_łķÆsįj“²-ųµß=Ş’ÅĘÅ->ń¹K,-ĪæxēO­qģP‰+Ļ^eóf›Ń„"“š°ŻR!é(‚^ ī»=”ŌHĖżģü?½.2Ƀ™é$¤ B˜é¤‡ŪEƒ4·ąVFŖx«;ÜżžżPĪsžÅ.ßh Dƒ„Šxąīqžza× UĀ£HžƒnŒśžĄ@! ė3”ipPĀƒÕ’x¼Ł‰ŗĆÓÕC 1Lžˆć8.ēÅ CšOm[äG+6N² Ų÷"¢(F×4ü0ęōłm„Ø (Ly`ŠœcĒ*ȤR»ZB¬ ĆdĖ ’Ų¦N© [ķ„ė9]hÄäĖŌÉ;Bčč@»ŊŁKI±`ŅwŽe¬ę`™‚v'ąé“+LÖs<ńÜ2c5'I^Ō¼¾R²Ø­dEQéō½8YyT¤4!ø¦q¬ͤsą‡j3 ŃVŖ…ė[}š-Ÿ™É"Æ]Ü!"öĪ”yīŌ*õZŽūļŚĆkē¶łįąšĮQzŻ€÷}č “K5ź¶Įžw-0]sŲS“(웦6a3j ؍‚(7A (?‡ŪµžSo€lŠ72—S’_z2 =ÓQHR!“Ż‘BŗF˜jpt٣ҷŪ.Ļ>w‹śĄĘŌłŌ§Ī‘³ fĖ,Æ÷Š4©8ģ4=\?¢˜WŻ™GÉÄĶQOyRī®n*ÕĄ·”Å_6ŚC”!†ā›ćļć›Ī;\„<Ńķ…‘Ä#¤¦Vūl[€”ōś;M_Տ š’gļ=ƒ,;ĻūĪßyOŗēęŌ9÷ōĢōd`€Į 2 ‚T M%K”jW®­Z׌\»[[ž°µ®ZoÉė’dIµLE„ˆœĆ`0ĄäŌ9Ē›ÓIūį=ēv-ļŚ.Ć}Ŗ¦śv÷ī¾§ūŽēy’Ļ?(@OŽBU•ĄeOŹėB«ŻŽ7 AĖńš<–­“]]×ĒńvRćtUž“„¼‚ć˰ p ]%—‰Œė’WąxŲ¶ĒūŸ¬‘ˆ“Z.ŻY‹\&Ā}'ūģŃ²%Ąq$ü_ ȁ›ŪĶ`E!Įf+¢Ņhī 0™”› ¢(ų· 6R”KG0 ›RÅfØ7N£å0æRa 'FWÖbs»AOW”jĶa}­ŹŚVÖZwN/sśü‡oķćå§HÅ ŗipęēÓݟCФrnų±>Ł„Kµ`pw5z{×1łįü_d’ļöm6w}~wōšnĒĄŻØ€DŁį„\ƒ7 Q-·ˆŻĄ×>ß@M¬œ_NJhٟćä±¾óÄ%ķĶRo:!½"¦J”ŌjĒF;®{Cv€¢üG*[}Ÿē‡{õÆĶ­Ų—:/[źT§ž[”ų,>č™å–¼Š²½vxKµęHē6ß§Łt¹:[?€īœ%‰-UȦģū|Ą’ų‹ČxaCąūŌ›Nū”­ŖJ@$›£åįūB]A³UŠDlĒ£R³YX­¶÷É{GSÜ|؋crØBrj —O/mņį§2¶xv±LOŽ"Óéļ‰r`OšŽ®(™”® ’q½}śD‘F@įp"8ž/Ż zӑ;l×c«Ų¤PjQ©Ł\ø¶ÅāJ•«Óžye–¹„ ?ųé~ōĢUꖬüŃ÷ĻņևĖ8®ĒĒ68v †J„j‹ź°\Ęqä×diSz¬•Į+Kņ&PāĘdæĘ®“}d9»¼ņ »o³k@ši»¶æŹƒa^A$@&2€Iģ@N Ūė¼żŃ2ä,z'ó|é¾¾x’o|øÄęvƒĮ¾8÷ŸĄ¶„ļDxe$³$ŹæŸ€Š>ü·%‚ų0©(ʳ#}ĘĶ—­NuŖS’-Jż¬>šXDŌbQż÷»sQÕ4T錦ķœČ/NX߬{’Åģ}·éS ĄŠ„tTAQe"¤ł»Ėk_Ódźž;šäŠŃ‡&$!Na: ¤ģŅ…¢`hŪŽ‰ęõƒŽźz>~4Ø(“ŃMUØÖ% įĒ@ĻõP5™EoYSÅ÷|.MŃT…ÅÕ¶ķ1Ų§T±98‘%—‰Õø:]$7ø2]dy½J,Ŗ³±Ż$“2Ś^!z”ėE€ė҆¦ĆHa”(AØQŠ P$Į÷oŽ6¶dS&®oS(596™ēĒ/L1·Xfd Įæų×ļąū>ÅĶ:ń·88šāōŪ ¼ūń G»c¼žüę—+ŒÄ™ż`Ž•™"ł‰l”T…xD6^· ĀB’wūü¢2Ąż…Ęīģ½ĀÆķśįšŽnrćJv8 *hIŠ®°}~«?ĶĘ„UŽŽ=½Ö®¬S(·ģ±°RÅó|īŗµŸO/m²ŗQ§æ'Žėz“lM•įQ¾·3ÜčŠ~qą1ß÷ĻĘ,q­\ėųuŖSź ’EUkųīŲ@ōj&ežŪń„¦I¦{¹jc*—ÆoRkøņYČSy>įčdŽˆ)į}Ūvq}šÜ@Eźķ…–ķɓ]ą(„Nąż/Żł¤S`˜ąz>qKr š&EÕŗM±Ō_¢ ¦”’Šė öĘIÅu\Ļ'™0ųäā³KJ•WfŠܛ”VwŲ3’¢æ; d“& 5žBȟU!H³k×-Ō“kĒõŪĆBÓöš‚÷«uŲ*4Ø7]b–N¹ŅB( }Ż1.Omst2Ļį½96 ~ó±}ڟc¤?Įįc=ģ9ÜŞī(éćCŒÄé‹č#½¤-Ÿüp¬,( HE@IČSø0‘;};x«r£ńOHā -CŖ‹·«ń‡°¾Ėya£uw ź®Ļ9Į皓j «ЈŖ-Ø“ Ŗrź­yNéfųHS—7‰Z:©„ĮésėÄc]‹åµ*-ŪÊØxøĮ:`wĻ’ķƒ} ”GU”LåRź…ķŠ©Nu꿢ÄgłĮÆlŌf6 śęvƒ–ķŃj9Ä"2ŁĻWD[¢FęõʈF“6S¾åųÄ"Ŗ^&čŗžLŌU‰ų>ͦ½Ėv÷F(ØŖĄŌUb–Ģp]IĄ«Õmé.Ø«äŅ&éd„\:BwĪj-­×¹x}›™…2…²Ķ‘}Yn9ÜÅļ&ÕLH°¶Q£ŃrŪ9!Üļ8^ŪŲ÷}|ß~ž„d„І!ł ¦.ˆZ=ł(ɘŽ`*ɄA£éŠŪE×KkU ]0æ\įÜåMž|į:4žųĮ9~ųōUXŽę„§ÆręĀŠąĶWfq×j@‰źÕķ€"߂ReWc›w؜C˜~7ćß߅„÷ ęn9 Ęn ŽŽ4p÷P "%‰&r•`ßĀCf4XŸ+Įh/ ī=9ĄąĶ½xkUĪ^Žd°7ĘCŸdt0ĮÄHZ&L* 1K£;gįz>©Øh“FĆ(įŚ­Hßq\’ś»4„óRÖ©Nuźæ““ĻņƒæēDßʵŁŅŒŖ*GRIß÷Ių šęµ}ü…»oĻóéŹEeģÆķ!Dh«ė·įp|ŁLõ@Nēū`;^ ¹“0æėJy]«åJ“Ą÷‚dĄ§ĮfꎗŖPoŗ(ų4š.¶ć±]”Z’Ž8‡öfI'tŅÉ՚̈́ėŪٟćÓ+ōä,!ĮŽXūqčš`»Ų¤Žt0t5@$©ŠóNżrU”ƐœHmĒ£Łņh4¶KMLC„Ńt¹2]¤Æ;JµīpńŚ6®ėsźÓ5Ī_Ūę–ĆŻ<’Ɯ¼ŽĒźFˆhŌ£ƒ ŲŖa*åj‹ōVZĆ&¶ŻÜ»–4łÖ®ÓøĶĪ®ŽŁÕąĆĘ­’ĀB”ŁĻn¢`8 čĮūś®Æ©ģŗ¢ >(q¤bĄ„ėp—üŲʧ>]㮜…ČDxōĮQī¼}€sēÖ9{y“{NōńąüżĻÆR.7ØŁĆŻūF<÷ΚōdŠš¶äM€ė{;‘Īrn“…§k"Ż“ÕžĶź–Ӂ:Õ©Nżg—śY~šŸ^.ŗ¹”zHS•ŪzņQZ-ˆ*Ós%Ŗ §mžćłpļmżŅ_ČÓ¾iØĮ‰XH‡· Q;AŚžēłØŖ ū4Mą#Ķ`4U“5U“Oć łSŗö© 2½ØÕ„’ĄŌÕ (ä³¹“I”$3ˆ˜“øĖf”‰Pź 7š(hūÓłRØ(2äČ÷EĮ¶=‰h‚fąØk‚FĖ%—‰ĻDš|˜˰<Ó&ž¼©‡żći,S#4¹ł`z6ŹŅŌ6·Ü1]QÖÆm1zß8XQŲ¬bŒöŹSw£Vz×ģj²£÷‘Š0čbü‡<o×` ģśXذw” ö®’§īś^»żlłÆT…h¢:Ć#1Čõ‚Sē£÷‰*™¤É’š;8>žąĻ¾wšfĖc’p ”*MŸķR‹LŹäk_ŲC³%#Ÿ=¤¤ŽpČg"2÷AQš\ŸĄ6ń^]SŒDT}»Tõ:C@§:Õ©ĪšŸS#}–‹źßXYÆ)Ū…1KGQ®Ģ±m/€aq£“ł¤|npŹ—2®`W˜łŠ&pŗhĒ÷:®D „S„iļęt]E ©ąŽėķäł~°jPeš*04)\Ūl05_¢Žt©ÕŗrɘĮŲP’DÜ@™¤ÉģR…³W¶Č$M>¾°ėŹ` ZMž¼’¤1eŠ ļƒiŹ”½0=PöSłų•P¼Ž$¬™¦Š¦ļ†4…­:¹t„¹å —§ ޟåŪwQ¢=1žå’ł.ł¬ÅōÅMž|aŠƒCIŽzqŠ÷Ϭr¼?ĘĻ]įŻWøi"ĮĀĒó,ĶÉO$am6ʐ¶²Ąfp o²+šiHĀ`x»±k@Ųķز“8øŪ&Ųß5,8æš’Bä!"ÆM4t¬²ųį2Éį8DrLŽ£:Wbs£ŽĒ™ókDb1&Ę2TšpóŃ>¶ Mžå?=Įf±Åäž }]Q†ū椓&=ł(š&ŲŲnHænPm]p§ėÓ·”—Ź5æ3tŖSź ’æ@x•JĶžżJՉ¤S&ż]1*µ³K õKļtĀąŠŽ,–)™“'ŸźęŠXG’¾oŁ”K ĢBA„¬ļĪFuéŲš:®‹ !¹P ¬y[¶D*5™"Ų“]āQƒĮަ©Ń×%›EĖ–2æ·?ZAÓ×ēJäÓūĒ3xžĻĮ=Ņ·?jiTkš&hŚn›ĄJŸ ÉžŹ10B_Éš©ŌltM°¾Y§ŁņHÄu.^Ū¢æ;ĘÄHŠWŽ[ä‘ūFŲ?žĮ÷}¾ņąĒŽ÷¶tŽźb’M= f"äob|½ĘńC] õ'ųéK3üŹĆ{xķ½Eŗr2ŠÉ4¤Ķ“’wŹB[Į[!\_ĄqPFQńórͳ;/oźT§:Ą’G„āj]Ӕ/kš2u•ł• -Ū§\mµƒsDĄÄ¾åpW›!ļ{~ŪĘUŅ:X×DŪ’_īm=¹"„*‚ké`;ī \5ĒõŠŒķmŲCARž‡ļ#P(×ģöéO iš 4P…åµ1KćślåõzŠ(\n=ÜEWÖb°/Žćx4š.š&X\­qeŗ@ŌҘ[ŖŠ²=t]®“`„ö½¢?G(‡44y_]¤&ŠшF"nH4AWQ5ēśtå,r©ÆoÓŪem„ŹKoĻs÷­}|2]ą–}~öÄ%<ßg`_‚žŸ¢'f ņ1ʟ,a¦M)Å«”e PpņŽiō»ć}½] {w¤0»N÷į° īB~1O $ī^˜»Š‚tš± Ø=°p–ęÜ*ƾĶo>¶×ß_¢Æ; І’7 Mr™ÕŗM2nPŖŲmb&(ŠļsŌ÷9”Œ‰ēŹ5ÆŁy‰ėT§:ÕžU¬x~Ü#ŠĀ½VD£\³©ŌlGvg¹–—ö¾#ż14]JG&ēÅ, Ū–®€Rŗ§JhŻóƒęųėĶŽ÷}MĢcj°_—'ź–ķ¾ż”lP¦Ä…ķ§iūD- ƐźÓmŸ–ķR­92uŠ“bņž8{†Sd’&†”2·Xf~©L½éņŽ™Uz¢\›-ŅßcĻp’fĖet0A:iR«;ņD•§{]§A¹Į¬¦-  ×•Ä@€Jզє;ö¹„ ŖŖP«;|tnīœÅ[§–yįĶy¾üĄ?{R„ÅĆ÷ óģk³Œ$™<ŽĖµ ōvEÉēc,ωE5"qRm”Z:ˆ4]°Ä®¦žžģ@ųī®FæŪóßßuŗ½Āiģi怘’ĄP -ł½7¦yļłY JŠÉż½<žģubQ‡ļę¾w–/Ż?B"fš³WfųęÆNņĀ›óä3ö¦yā¹ĖFņ IDATė|żK|šÉ*š*Lp}®Äp‚ÅÕ “ć¶Š Z¶K£įµUŠ„m&}Ÿ©˜x¶\󼝗¹NuŖSą?Qé„j{ž’;Ķ–«( $ćĶ–×Ž’uƒpœGŗŪ«Ŗ*XFĆ hdŅéOä}”ŒĻ ¤z”ĄŠUTA{ąŗ2:Xņ“­ %øķųmņ ėśD#»EJ^“CL% \×£+E…LŅdy£Ī‡Ÿ®a™*sĖbQ‘ŗ®²w4ĶųP’tŹÄq| „&¾ē³¼Q§Ńtqæ ķĖ&ļ·ŽĀ@!”.„\;ȁEÓ-—ˆ)„MŪeØ/NO>Šm{Ų“įąD†C{³$b:wļåęƒyLCel0ÉńĆyō¬ÅŚl‘ćw B>нV„÷Ž!0MZ+eō‘nPMŠ\P³ģņ,vöų±] =dō‡·įFŸ€°éļv܍ģö šŁ1 ß_‡źeØ×xźOĻ yQFF»xń­²i“ĻŻŅĒ«ļ-b*_ø{˜æżŁUŽĢ“M›|÷ÉĖüÖW÷óöG+†Ź­Gŗų÷u–ś‡¹<]`}«Ī”½Y–×kŒ%YŁØ‘KG(–[Ä¢•šĢ ų[DaÜóø'•/”«^©ó,ļT§:ÕžJĘŌ²¢š»@\FāJką€hPbQ‰‘4–‹ēym&}„fcź”3 ņónß÷|©ó÷ż¶™ćśØš*‡‹ ©J‡?‚€!ÉhīR$„AD2`ȗ»}Ļ'bH>‚*Ó+äŽ^Ó«u6 *UU(LīÉҰ]ö §ˆZͦKÄŅųčģ:[…&ŽėqīŹ6Ʉ@ż>żŻ1š-—Ø„cE4šM™`¢Ž.{EQŚaCrĀ®õĀ!£ŽpHÄuĪ]ŁāźL‘Cū²üń÷ϲøZe°7Ī’ņ‡ļ”©‚Śzo’ŻEöõǹšĮļ|“¾”ÉŪ?æĘŌ|‰‰‘8ĖgX»¾Mv<Å"¬W D ūMPB2 Ė$ĮpēÆrc:ąnIąīų`}×SĘbĒ–ø¬Ać,łńßĢ‘'Žšģks¤S&÷ģēåwŃ4…/Ż?Ā3ÆĢšÕ‡Ęłóžg’Xš›ęyźÅ)~żŃ}¼ōĪé¤Éēļęæ’)_}hŒåµ…R“”¾8«›uzb¬oÕJ²±Ż •ŠŁÜnµÆy0 zŸOĘÄĻĖ5o«óLļT§:Õ~”ā–hꚸßõü½ŗ¶“4ēzm½5ńØĪųpR67”`źBŗzČP›—§q%0xŃi„ņø@ź§krĻļz †®(ƒ@²éūžtŲS„‚ejmt i{_:źš‚eć…FÓ„Rsš$KLҤ+k‘ĻZhŖ Xn”k‚©ł×f‹X©ł{†SŒ%Ń4Į¾‘$‰„Ø ¤ß@Ō“=D`¼{:ՅŠ7p lŁ.B(Ō¦GŌŅŲ,HÓ„|&ĀĒ6HĘMöަ9}nīdb$E­īš•_cro–ī¬ÅM'ś9ŅEVōŻ9Źųž41Ļ'±€DN'›4 ‘ƒˆ)+8õ7A‰ŚŽه¼€Żė•怿]O;</hž~ŠųÆĀöĢÕyż„uśrIOęyē£e1»nķćõ÷ń<ŸūNšüs”«6Ü1ț§–@QųÆģåńgÆ3:`b$Åųįy~ļėųōŅ&Ėė5}`”æüŃE¾ņą„ŠĶģR™Ćūrœ½¼Å±y–ÖäŠōń…Mņ; f†C€¢(ŻžĻ#ɘx­\óÖ:ĻöNuŖS`W•k©øSUåQĒ•ßśĮ–XT'“4ń}MO6<#Ųć׎Ōōk‚ˆ©¢*P¬ŚD `³ŗ¦“¹Z`ģūrePoŗķ¾0FóJ“@®|äąz~ S”±½µ†¬%41CW‰E4JU›éł2Š¢°²QĒv<¢AŌšį}92É]ٮ뱓^#78we‹„Õ*VDcm³AÄTq=‰>Ä£ŖŖH©ŸFč ŲęEߓ«+X]$憮¢ė‚|&"ć•»¢ø®OĢŅɤLŅIƒ©łƒ½1Ö7ź<óŹ ÷ŽŚĒϟæĪŌ|‰Cć)Žy†Jͦ2ÅÅWfP]«ßĄ¾øš3AŃĮ©ŠƒfßdGøūŌźūC­ŲčC[į"!j0 Õk0ėrśĆ ™t”ŃĮ$ưD:irōXÆæ½@2apŪͽ¼sj…ˆ©rūĶ=\›-¢*Ü>ș‹œ»²ÅÆ}q‚<}…‰‘÷Ż>Ą’ń§ń{_?ČŅj•łå æž•}üłĻsŪŃn"¦Ę§—6ø’öN]gt0ÉĀJ•[t3·T T±Ū„Ģą8‹Ļcɘx·\ó:ĻųNuŖS`W„bEQ”ßō}āį)Žv$ä ²‘Å£²±š¦4¾i4åŽ;„æõ PŠLĢ ą{yBöƒÓ¼„É5UJC2”HüL]mó<ĻĆ󤹎*ŚDĒ•»xĒ‘C€” ¬ąū9ŽG±ŌÄue⟢€ejøžĻž”$餁iŹFžĪétM0·\įŚl‘±Į3‹ŽģĖ1Ü—M?¦£kŖ“ V…4 rż¶€ēKYbč&(ŗžZ»N„•j Ļ“&DĖ5Ŗ5›fĖåķÓ+›Ģńā[ó|pfŪŽõšķ'.±°\į w 󏻋D#‡oīåģĒ«DL•Įė eR]QœB­Ų‚œåx6čüzą—;’»o‹_xJ“ä@AīłC2ą “®Ąl…+>Élœ¤„qžŚ6C½qöģĖqźō ])“Cūåc‰[:·īāŻWh4\ī99Ą+ļ,P©Łœ8ŚC©ŅāņT_yxƾ·ˆPేĘųæČ×>?F„ęšĪé~ēW&ł›§Æpņę^4Mšź»‹<śą(Óó%ķĖņÖGņśĶ-–色“֐QŌ(JĀ“CĄé|Z›ī$ vŖSź Aueō²ėŅP勾ā”±ŖŅõ¤¾¢,K#jér%4>]4›N ŪNūŠlīŅBWARš'>ĖU•p»œömG6Wߗˆ‚xĆ{gĖń‚żæB$¢!A£åŅjyhšŌŽ+B!jŖ$&™¤‰ėzX–Ęå™"SsE\×gu½Ī‰4Ē&sX\ZŗųÕ.Ū T!(–›mĶ­.C„tmG.(eŒJ{²Æ}¤ÄpxˆEu"•R¹ÅP‚ž®ėspo–ńĮ$ŗ”rŪŃī¹­Ÿ»OōaE4†śāœČĶYŌ¶źÜrĻ0d-”­}wƒĆ]/¢MŹ€[ƒX—ląŠ@÷Ažvƒś®Õ@x[ ƒX€ l×`yoEG1£ŲM»į’č‹“źœ>·N:Ŗ³÷@žē^ž!f霼}€·ƒĄ7÷ņéå-*U›»OōsńŚ6k›5ī½m€¹„2ēÆnń«ļįµmju‡/Ž;Ā·~t;÷āłpźģ:æū«ųĪ—80ža°/ĪO^œā;¹xm›6¶LŒ¦˜[Ŗ’N¬m6ŪC€ĢP¢¾ĻW\ןʄ“‹…JgčT§:@§Ų*¹dź9EšK¾Ļ Š6ń ¬® zŗd³ņƒfķ8>•šC4¢į82@åØD ¹÷½TUĮv!b©·×T|||ZĮ~$ü1Tt]•œ“N( шļĄ 4ż(J°"*®ų÷«Ēqi¶<–×k”+-<’1ƒƒiLS£+%ni¬nԈG Ž<µŒēś¬lԘ™/ӝ³Ų*4‰‚ˆ©Qo[K3Pƒ“CßoŸ8ƒ•†Ņ^ ȤDٌG"Ķ–‡lšhŖĀÜR™•€éžķæ»ČµŁ"'²üÆų>Ū œR‹æ|ü"Ż1ķ©ϼ:ĖHDełņ*]goFƒķm¶ŹXż”·”T‡X„  V'ø*B#ų«(ÓP‡)ŸFU£eū†J4"‰”«‹erqzćĢ-”1…#ūs\Ÿ-āµ_žžå÷‰˜’ĢgčҊ×u}× F„&źyņ歀1µ¶3aųs„vĮĶ–‡xąčŖB_O]ōuE±]Ÿ©ł"©„ĮÅėV«Ea»Ōä–Ć]dÓzcōä£ä²„8®×n&ŽćŽJ[²šĻo ¢9®¼ŸėŹA䊤ŽtÉg#LĻ—©5F¼}z…TĀdb$ÅĒ6øćę^ļĻńž™Už»|š-—/<¶ž}9ŗ4ĮŠƒä“Ø•™ć#Ø„&jW˜ Ō›Ņ='ųM‡š~xźwŲ!źHÕĄ"”®Q=S@iÄPuJĶ&bŖ8¶‡Ŗ@$¢Qoø8u‡ˆ&H' >½“I6ah,ĶÅK›øŽĒń›z8snõ:÷Ž=ÄŌt‘ ×¶ųāCć¶¼õŃ ’č+{ŁÜ¬óÖGĖÜy¼O˹w˜?ūĮ9Žź"•0łžS—łgæs”—ŽYĄv<øco’Ż%ī:ŃĒ;­pņ¦®Ģ$EUˆĒ4*U»ķC!EŠ<āyT2 õĆĪŠ©Nu€N¦ĘŠŅÆŖŹ‰öER/€dÅ{ ÷'Š4•rÕ&Õ©ÖlV7ė¤&'c”€ė+$¢:•ŗ#Oē¦Dd’ mt ­–‹P•¶ !Š@ĮA»_©Cöæ” ļš¶ü9AĮxńØÖĪŠuĮV±I­Ö¢X¶©ÖōąqLŽgŲ;š&“2å× åš*ųųü…r×õ(”d䮄÷=b–†ėŹE߃šgŠ4ĒõŃ+c|™`YšD:LHD#ÕŃ4A<Ŗ14&FR}² æ'ŹņZ‰Ń¦”ńĮ'«œ˜ĢqõÓ5Žłh…cGŗYųx……Õ*ƇsTĪ­I²dOÖ¶!¢Æ Š ”p˜üą:ŽĒ«(nWŃŲ*6ƒ„Gˆ&LyÆR‹VĖ#›6XŁØ“ÉGéĻ[œ>æŻt8|°‹«S<ĒćčdŽåµ*³s%ī¾”µ• ×®8~؋ˆ©ńŚ{‹|ńŽlĒćŌŁuśÜ åŖĶ;§Wųś#<ńÜuļĻrl2Ļæżö'ü‹ßæ‰ēߘĆu}¾t’ž7ēłÆģćĢÅ Žźby½ĘžįÅrE‘k”†xĄ÷鄶v©z\vŖSź ŸŃŖ·|<Ļ?­iŹ?VU%¾`Ŗ°čļ}_źńCw¼XTņāQE‘§ųP! „‚¢Ho!"`Ķ;®‡¦É wßE|Oī’Ćd½0-$ć^ī(ķ¶Ŗ ”Ą ĒG6ŚŠK jI~€¬Ŗ5{‡k$bB(ģIj¤’&åŖĶ«ļ-Ņ×哋ėŌź6™”ÉŌ\‰›ęééŠR«;ä3Ŗ*°L‰28mrč(ÄND½®‰öĒ\×o*Ž#W)ÕŗC³%‰… +ٰƼ³ĄĮ½YŽųp‰g_›ćŠŽ,ßņŸßą”Ļ ńķĒ/Č]ū[ólššČpö“UWŖ Ē)Np MŒ^J pm0Ā]Čƒ@øSó°e²“å²¾Y'4q]ŸR„…ŃŠ…`³Š$féŅ“)¦£*1See„Ši، %ŁŲ¬£ …ń9ĪŸßĄv<̳“TavŗĄ]·R*69unŪŽuS«;<÷ś_}xµšĆ³ÆĶņš=Ć4[.ž]ć7ŪĒžžūĒŅÜū’śĻNóĻæyg/m²UhņkLš½'/ó¹ć},®VźK°¶Y +t]”VwŪ×?pŸT}øĒóH¦ćź«$ĮNuŖ3|ęĖv©xž_0MńØ¢HB`˜†§ A$¢²¾Õ Vkѝ¶ŗ4»ķ&‘@jWoŗ4›.ŗ.Óödj½+å€ŅW_īĻA6IMČ$=ߗ9š2ōEi‡ŁŽļ–5žÜ”ū¾ßŽ6tŃ&†Ž!Œé8ŽŌįkŖ„‰MCåÜÕmꖬ4›.Žć±w,CĖń™ĻŠ•ŠßÅ0䎻\ Ā~¶TėRe`;½T!żšå„‚Œ[cĖ–Å0õ†CÄŌ0tA£éŅ•µH& „&·éfl0Éč`’}£i>w¼Ūoī!“4¹ķX·īĀĢGé65ŽßŅ]QŅ®Ļųż#`ĉ“šū{$ųµ``Ķæ;ų/{ ĪVyīķm&†SÄ£:«u<ϧg,M\lņĘ ŠåńøĪŚZ˜©µ½Ŗ5›˜„aE4VÖkD…`|,ĶÕ©mu‡Ćū²¬nŌ¹:µĶ-GŗBįćóėšø%{=×°Ōå{”€©Iåø¢Šl¹$b:-ĒĒ ŲövĖĆ zM“M“'}C“©‚¦Ōš‡§fų H37 AØB \ų¤*Ą "aCäĄ2Õ¶R!4āń<Ū•}ÄPq]O~@¶·Uh°²QĒq=źM—ž# LC%“4dbĄśśåYśŗ£\ž*°]lŅ·X^ÆŃŪŊȓ:ÓPŃ4ŁÄ½ Ó L< ”BŌü¶A 躊iØ“œ‚”ŖŹuÉŹzSg×88‘åõ—xéķ>÷’źß}Ą…kŪģ‹óĻž÷7с¤ķńćēÆ# MržĶ³ÆĢ0d*čf‹ė.“ķÖĮČ!µ’ė@.~ˆ·GI$éĪDųū×fŁ?–¦§;ĘāJ…łŁ"łLUll×I%LIŲōeš“”xzÄc:µŗĆv±I×`’\ĘāĢŁuā•=ci66ėl›LīɰUhrīŹ&wžč£^wxć½ENė&“4yźÅiī¹­ŸØ„óĢ+3œ8ŚMOŒē_Ÿćīć•÷š<Ÿ/?0Ź’żOųĀ=ĆTėW§‹üŽ×šožāc>×õ¦Kwζ=lĒ£\µŪQĀĶ–ć p³ė²?a‰*õNˆP§:Õ>Ćåūø¶ćæ¤«ŹƒŖ¦ōy;Ģ{×Ēu}2Iƒ„µŪE©¹G „"‚Āˆ\MķaŪ–«ōŹx®‡ķŹ=wȘ7tµCšė„C¾źśåiÓŠQK dw;”6aäpÄŌŚč„$ł9ŽćI©”ēC"¦3ŌĆs}zb”«6‹«UR “‹×·Y߬S«KcrO†dLgd0I.!7$08Ķ·$Ď* üž^ą ąµŽ” [šBQ(µh4=āQé……R‹tBŖ„P˜Ü“į•w¹ł@žcņ<õā4æõÕ}LŹSÜlš¾²—Äx†Ķłw}ejĪ¢±Več®!°tZĖā{ņņ:-ĻĮĘ&hUŖėqžzeį¾8©t„ŽœÅkļ/ћ·NŃØI®D.m,®T°"RŹč:yQ…B„&ś,Kci±L:g‘‹,¬T %™_,S(5¹éP×õłąĢ*wß6@:aņ÷ÆĪrņ¦zņQ~ų³«|įīa†ūćüõOÆšąƒd’&?{ņĖ“œ:»F©bó[_ŻĻ’õó/ļ„e»¼sz•?ųõĆüäēÓtē,E!•0Ø7ŅI“­BŠ”F`>Hśp</”k^­ó*Š©Nu€ĻīUĒå%ÓP¾ģūJ…ąt*Éxn€Dt…DÜ`ø/N¹ę`Rø¼^#›4ƒ(]éܧ©ĆPĮ§ŻÄCM½P|jķutŌ8A“ ƅ¤ÄPEŠ»AīķLM(ø^čą·#|UUA‚dLrbQ))œž/5ź ‡dĢ \søł@žŃ‰ø!É~ž\;D#o“‚ķų“Z…RĒńہG®·Cü“VĀr’6n°QwIMC>ītĀ 7ˆ˜*=ł(™”“4Ż»óQś»cØŖL<ĢDtfʌöĒ1šƽæČńC]ŠņXš+Ņ7Ł(ĝ*īü¢' Ž*WŽ^¢“m’I[;ēĒĻ_gØ7N:iŅ“ņĢ+3ģNŅ•µXßnPoødrÉØĪŌ|‰\Zś čšŅę0ØŖ‚7HX:3Óŗŗ¢äūćlmŌ)›ģ›Ģ±µYgf”ĢŃ£=ąś¼}j‰ĒzŠU…'ž›ā®[{ź‹óē?<Ļw 2ŲēOpŽ»Oōӝ‹ņ£g®ņG÷qęĀsĖ~ė«ūłĆoŸįÖ#ŻÄ£:Ͼ6Ėo~u?ϼæm³«¤C?Õ©šŌłKB‡*\w'{Ą0Ž †&ŃMUØ7ä~^ „°LCŹ =Ļg³Š¤Łņ$z ń˜Į`o U($ė›uŽūx•|&Ā‹oĶ2ōh~¹Ź‰£Ż¤’&•ŖMOŽB RĀ(į%@NB—@!Ÿś“E~IX“mZ@ T„ĀģB¹³šā[ódR&óĖe¾óćKÜt Ļ3ÆĪšż§.sņX/’ż5¦JTiļ8J‰ŸēIh?Ģ Š5×fyĖ«Ƈ®Ėµ€ćx4[nŠģ½vҟėɕ†iØŗ”$^š*P­:,­×š<8²?‡ēłÜ|0O.ax !%e>TėŅK5ˆķŒA!ą×l‡ē •~[IŃl¹»Ü]ä:„R³1 •{2\.pļmL §Ų.6yųŽaMd9ŗ?ĒmĒzųÜ-}Ž—%ŁćĄį.ŽLf`ØT(žŸ„6WęĆk Ö7[ uĒNņę©e† Ūgr8ÅÓ/MÓ×%›µé‹óŅŪ ģLMEĄńXYŖK[Äc:‹«U|[¦CŚŽäLø=³‚"ļ³T!fiä3ÕŗM„ŲbļX!Μ]ćŲĮ.„ļ}“±yŽNęųįĻ®rņX&2|÷Ē—øó–^n;ÖĆ·~t‘“Ēz8q“›ļžųßxt/åŖĶĒÖłĶÆīē[?ŗĄį}YŽģĻņä S|ćŃ}\™)в]&FR¬mÕŁ;šāźt\&B©Ņj’ż(»d‚ JļuB„:Õ©ĪŠ)śņĘ“ė3Ļ—<]Uw™ėŹz"¦³Ulāū[Å1KC×ä^?ÓŪ°xˆzꇤ¼šō/æ¦ģge÷}It\y_?ˆÕ |‹ēŹb50 ņ}”J3#Ē•ūjMAŌ°ä¬PŠ„&Ėė5j é.8:˜ ÓH“Yś®' }ž{}Žįg.l°ŗY'—6)UlqT‰–*-’[•9 ޳óųĀcE‘’G]mCČP… e»Ä,jŻĘ÷a«Ų¤;g±“Z•rŗ£Ż<łĀϽ6Ē_ž :³…19 ė+\żÉ[l—]Rż½=ÜĆkļ.R©ŁŒe˜NņÜk³¤,\ÖbļHŠ—ßY$4É %éI<÷ś,“£ib1ƒzĶf«Ō$—‰ˆld’f;"béŠM¢ -!eØ,®V‰Zé¾8K‹eju›Į”$*pśÜ:·ŽÜKĀŅųń S?ŌE6įož¾Źż'9¼/ǟ|’,GöēøūDßyā"‡öf9yS/żÓ+<ō¹A„<łĀ’Ó7ń×?½Ģį}9&Ē2|ē‰KüŚ#,,W˜]*³w4͵Ł"7̳ŗ^c’x†ķ:¾µŗ”„*“]³¾Ļc‰NˆP§:Õ>˵Ur1t傦)%ßē!!”iAhOŪõNņ6 MāQī¼…ķų!M{V6ķ•€čßCē¾ŠįĻ0D0((m„É%¾°ĮśFž&2<żņ QS„·'ĪųP’ĒŸ½Ī¾ž81K£'åÕ÷芒ėŠQÆŁ\™.*B©E2eā9>Žć¶Ć—jÅ&š&×k›uI“|Ņ`³Š¤Õpčļ‹cź*§>YcßXš=ĆI^xsž#ūr;ēæ–Ūo’'žļ=y™Éń4wļć/æĄŲ`’»n‘·ļ>ŃG:ašĢ+3üóoŽÄ³ÆĶ’N™Üukś×ēųņż£ŌĖk5n橇sWdœš©³kÜv“›©łC„Tq‚į“=$|ŸÆ&bāt¹ęMu^ :Õ©Īš™¬ZĆ'f‰„@xw+;kģ@Ūīį{Ņ€§ÖpȦ"ll7°"†”āū`E“6ćæi{¤F;,Ē÷%‰N"Ź…Y“wähī… i»ˆ  Ģp\ח¶æ>;Ę;¦”āzr@©7ܶn]U•6䟌ŗäl.3‹LC05_bu³N&i²]lrt2Ēž‘™t$ČIŒķx\ŗ¶‰PŪ„劍®«G€$'ś»¬ƒ„k |«+ƒP*čyrh W ¹LDš-é*Ć}q¢–Ī`_œžœÅPœ[wѕµų„Ļ ņ…ĻõAe“å³—BšWĻ—Ų3šįÖ£=\›)pu¶Č”½Yn>˜ēŚl‰åµ# ŽČóÖ©„PčNqÓD–<}•ń”Łt„l*Ā›§–źŽ‘Hą5®Ķģ‹h\Ÿ-ŠÉÕØ7]’qƒFĆŌhD# ó%RY‹LĪby¹B”Ųdd"K_ŚäŻW9x O&nšŌϧ9q¤›C{³|÷ÉĖÜ|0ĻńC]|ū‰‹LŒ¤$Śńā4±ØĪļį[?ŗČĒ{éĖGłÖćłķÆķē©§ń¶ćµ‘ˆĮ4„y ۜ`Ą76XݬQ,µčŹZ<żņ […&æõŲ^fg6xžµYÖVėt„MŽŻqˆĖÓE^yw‘‰įwŽŅĖō|‰K×·éĪYŒ'¹4µĶźF=ö¤xćƒ%,U!ŪēČx†§^œ"›ŽŠ;–b(å—ļ‹“źK` …łå ]Ż1’Q]†&™*–KJ¶'¶G„ܤ·+JĢŅyūĆeķĶŅ×ćĒĻ_ēČž‡öfłÖß^`b$ŝĒ{yöÕYņ‹ūNšó·(×l¾öłqŽų`‰Ž8‹+UNŸ_§e{¤“&#ż ŗrQ¦Jōå£|łQ „&’ćļmē ŲŽĢ6XŪ¬£Ŗ‚RÅĮŠ•]ƒ:š0PIĘ:!BźTgųŒV¹ęى˜xQQ”;…`dw”Šēƒ"äÉŗe{l›‹ ²é†®‹j’ąmŸ’p- kņtÆkŃŽÅŹÆ+/‚čßŠėŸ IJEŅŸß `\EF‹ĄĆĄ œ ķĄµPS%10$6Źp!٬=ßg~¹Źf”I±"с½ci|ĻcrO–TĀ@Q|LCce£Ī‡gן‹óīéU¶ ¢–ĘŚfCWH&Lj ‡d\‡0%Š“¤ĄŠSA"!“I‘ŗ&Uaŗ]4ōą×U¬ˆJ>kѓ‹šČ]\¼^ąÄ„Å–gd’(Ÿ\ŚäܕMś{bĖ-¶‹MFĒÓ¤¢:ožZꦃyŗ²ž}žŃ÷ß1Č3ÆĢ29–ęčdŽ'_œBU÷Ÿ §+J÷<‡\ž*pļÉ~öޤxēō ³‹{h !žą‡XZ­qē-½Ü|0Ļ_’ä æü…=œ:·ĪŃÉW¦‹Œ %)W[ŗ \qŪ%Bó}~IŖFŌ·‹•NˆP§:Õ>›C@#W_PV”¶±|PR‡Æė‚bEŚ«˜ČP¬“d *(•›TŖ6Ŗ*ˆF4ׄRsŖĄŌv “ŻŠ0(śŁ{Ļļ:ĻóÜó÷–Ż{6°Ń{aÆ¢ Õ-ɲ-Ė–dĒĒ-²}’'99“Ys·YóiÖ“œ3“™5“9™Ä;v\āŲ–-Y’U(Š›H‚D!ˆl`oģŻė[ęĆó”ēOˆö½±Aą}ī羯ėwY ƒ@ß;ŲEĘ4 ĮŲ¶J‚õoXą!U‘0 ćc7~±Z°©²µ—7qŲÅ»a…õø*‘ “hȉ×m#pžC§Z3ø|{Y–ø=›ĮaWė’ĢT 1а¢ŽUE¦\ŃvnōŪą"ae”¬Õ†uŪ“&õ†¹&T­źB'a˜dsul6­”1=›fvµĘ@ÜMb9ĮOO$yą`;35·Åé‰uz;|Ü·/Ęāj‘ ×6Ų=f|0ĢŹz‰/%1Öā֝ Ė«ŚĀ.†zƒœ™H kѰ‹įįļY¦%āĀp2Üķēµ÷élqć8°)2 «ŚN¼n•äf»Õ\9ø¤ė&¹\wĄI0čąÖ­Mb‘Ø›b±Īņrž¾}q/ƾ;ĻįŻ­ öųń«3Œō…š•iŗŚ½*5Ć4­, ė»Ś2æĒu_Š«œj†5«YĶąYł’Qx•÷$Iś¼$ųŲMIüjķWšI”Ō ‘,ļüTUĘaWT: ō œ°Ć.‹²)”ŹņNĄ6ło;-ЦžžčIš"3@¶ń~0ō^’$œvįØkފ/ÖtÓŹ–@PĮį˜¦éllVńzl,¬•Xß,ļxö÷ŽFģńÓŁęEUd\ŸĒ† ĢÆPd‰­\B©aŁ«!1-ĶvĄ‘i!—­Xa+I7D¢hÆ =(1æV&Žāfw‡ÉąxŻż¼ńž—n¦Ų7åžmœ¾”ąęL†®v/ng}³ĢoO.2ŠąĮCm$Ó&n¦Ų?at ĢŌģĖėE{ü õ¹x#)öć]~†:ü¼żĮ»BøĖĻX§ŸwNÆoqˆø yķܘJÓŃ)艉N»"°G”Źv»‚Ń0PŻ6‚.•dŗ‚ש 9Qd‰é;:b^¢a'g&ÖŻÕĀ”±?ųåŻ:ց/ęEźŸĻś1®A>ÅÄÓ|pa½#¦ę²ØŠÄ‹Ÿą'ÆŽį³÷ąv©¼~r‘o|a˜.$šymģ‰š/oÜå‹O÷ss:ĶHˆ­\īvSsY¼n•\AŪ±qZœ‰c†A<äSŽĶ—š!BĶjV³ųV®hl†üŹY¾ Iøw¾ø–‚½^7dńš7L“Ž˜wĒņf³É`‚ÖŠ1…Oܼ ”w:T SŲ5Ķ“nüŅNōnµnZUUvtŪšÉr IŲPEØšuS0¬C×±Ķ%@č¶­†† Œ†¦”ʲ$¬y¹BįŽ ż]ž„¼dŗŹZRpņOœ[”TŃ)ė,'ŠŒö)Wu6‰¶V…–v Ūė‹ Ļdė““ Õś7KÖŚ$ä‘ūdö„h˜ 7ī–8wm“ēžčć؁Ɵ\äŹķM¹/Ī#G朞XēÓĖ txähœB©Įļ/2Śd’x”ŵē.oŠŁīeø/øzŌŻīcdO gĪÆRŲŖ‹ø‰šęū‹„œ6üa#}A^ykŽĪ7n—J8ąd~1G¤ÅC ęas£„ĒmC–$Ü.Õb9HuKh©Ź$Re‚^; ×&7éķš¹9uv…n?GŽuāmP'x}@؊ćd’ó'ź 0æR`-YāŁG{8weƒõT™Ļ?ŁĒ’õ£›Ū£+ī凯LóåĻqžņA惷óż_Lqüp;ė)!äLg«8ķ >ÆM+Œmš”čI% ¤ŗa‡|ŹŪłR3DØYĶj6ŸĄr;¤UYę–$IŸ—DĄ¼°¼Y»mĄM­nōŁ©×54ėš6ÉźD‚ģŖ`ųŪlbē-[cüRE³œā€ß>,%D4°Ŗˆ]¹iZ  ś£ėāv½=ņÆÕ…0Ą4¶›h€ķĻSBµÖµŗ€žxŻ*6U¶öī*”€‡M&ŽöÉ»ā¦9³Ūóä‹u8ŲFwÜGkÄEĄē vŅŠLņÅ:šfģD—ŹĀ{ŽŠŒl0XaH–£Į0„ER±hˆł’Ė”véüŁwŽošÖ‡ĖœžHšĶ/޲w,Ź[,ńįÅnēĮCķLÜJ13—„%āāšžV Å:]MŅŽźaßh”ÅÕ篮sdoŒ}{[9{)A”T§»ÕĆŲ‘8×Pd™ĻĮžŃo}°DKĄ‰§ÅÅīžæ¶0ĀŽ€·]įņõ$m~~ŸōVĶr@x|ŖUREĆiW°ūx- AŲkĒķwrŪ™YČŅ3e`W RgüqĄfżŲ*€ÉĢŪ“TüN•‹W7(–<ń@'3óY¦ē³¼šĢ·ļdH¤Ź|éŁA~öś,‡÷“ŅŁęå’łé-¾ūµŻLÜH±øZąĖĻņ³ßĪrdo+3ó9:ڼ”«AŸÕ *W5ń½#ķƒ$ i—n˜B>åĶ|ÉØ4ŸĶjV³ųDU”lš*³²$­"IĻJ’ųŚJ›_±Tge£L8čÄåTŠtƒ€ßAĄē P֬ѿ=bž®‹CßåTQÅ:čŠmr^CÜĶŲfšß³Ņ ųčJLD®J˜¦Å%Øėā†gŠa›MĮ®Šē²€EŪŲŲåD‘d¦J©,¦m>4Ķ`|0DkŌeq„ČšöŻ,ѐ‹Ū³[,Ɨś„ŅÜ4Lœ…ZŻĄéPp[Éķō@Óüx~€5É0Mü.AÜėŠū9{«Ą•Ūi¾ņŁ!†ūƒœśh÷Ī­ņŧś9²·•ēV8yn•'īļą±c¼õį3ó9ŗ;|\v…l”F8äć«”@3P\*•µNUĘqtŁPūŚĄÕø¬ļ Šac‘Ō­U¢!'§>Z#—Æń©G{ø~{“™łŸ²—dŗĀk'xéŁAfę³LĶmńõĻš_~r‹ŽN?Gö¶ņ£WfxéӃ,¬˜_)šü§śųæ|“‡ĘÉėŲ-„µ‰bę 5°¤²|(! ź†y<äk†5«YĶą“¹ Ąļ•ÆUI’Cˆ„vTīŪÖ½jMGUeZ#.źV¼ļ6gn)O8ąĄnSØ7tj ‡Mģą®UC–Å*@(ł…Š_3LtͰÖB[ !Ä}š.Ä| M„iš‰Ćf5lēŁ›8lĀ’(~1‰°[ÓŻ„Z]§P^U•‰†\ų=6<.•pĄM•PU…l¾ĘÄĶ>óW#` ŪĒ™ {GŒ †(–4"!'±ˆ›JUL7Je‘'°øĆV°Öm~‰°W„X5Q ’ę»G ś\½ęōÄ:ōć“D\¼}z™óW7xīÉ>Žģmåõ“‹\¼žäį£q>ēŅäÅļéćŻĖ ~żĪ<»‡#ŚÕĀÅ7R ö±±YęÖtšįžƒƒ!®ŻŚD«jDcĘzƒ¼wn§]!ó2ÖŁż!dU¦5ģāņ­Ѱ K%•©ą°[(hÄŗG7LrŁ*^Ÿ@ČIµ¬a¢¶õnėą—óĪ õõŖ*óöÉE"!÷ķ‹qõö&s‹9>óXóĖī.åøo ›MįĢD‚ēžģ£XŅ83‘ąž`æywžĪ6/ūĒ"üųÕ;¼ųé~fę³\ŗ‘ä?žńA^=1ĻŲ@h‡Ų(ĖåŖ†ĻcAM5Mē÷u’Ō„ė擯ün”ddšO„f5«Ł|āš€€W¹ IR@’¤cH¾'ĘšŪü{§C!­²•«!I†µ[õyģ„ƒN4M܊%¤=¾® T°"ĖŌ5Cż"bWÓLkB`€,Ā^­nXVBń1 ģvyē÷1Å*@·V²#*”µ« ‰æ;ģŹĪįåõŲš8:leķpnEšęu]¬öE‰„ tłEĀ`̽³ņXK–°+ÉL…\”~/=Šd‡ XkC8årͤV7x;)‰õĶ Ļ=ŁG½”3q3Å{ēVł÷/ļÅaWųšb‚+·SüĮg†8“§…ēV93±ĪĆGāŽÓŹé4ē®lŠŁęįŲžÉt•/%ˆEŻŻcsK‡zƒōw˜šĖ²’(2Ųdp,ĀʼnuŖå±Ø›ž§'(@¤ĶĖ@w€7Ž[ tāõŪ xģLĪnŃŽā¶nŃuŹ »M4jŪ„ČJEĆŽåĒŽŻrP­6f!—ĮØjüöä"QŸżcQNž_EQ$Žīme9Qd3Sįч»YZŹs{v‹O=ŲE._ēÄŁ>÷x/»Ā‰³+|żłžłõY¢a'Ē·ó×ßæĪKŸĄ0į­–łā3¼sfEĄŸģ²•öč¶°ĢņNC­až^~€„3 >šČ'›!BĶjV³ų$6FČÆ¼fæŖŹ{ Ɣd+AP7Ģķ@<*$čūQU »zļęžĢTp: Ü£’Ķ×ĢG–p¹T!,“füšÅŚW Y–­TBF·mƒ¢Ń0i4 LģŪÖ4CÜžuSĄ‹j 1)@’P•{¢@1P™ĢV(—Ō5Ż€t¶ŹųP˜žø—Ó†Ū„R×L6·XęƒK źšA„¦1=/ŗåŖ&“D\TŖš@{m–^BŲ(É@•@’eŗŪÜ<ōš8ė›fr¬o–łĆĘ0L“ėÓi.\Kņ_g?±Ø›ßZāoŽå;_£·ÓĻėļ‹IĄcĒ:8¼§•K7’\ø¶A4ģā‘£q’é ļœYf| Ģž‘+E.^O²g8Āž‘·g·Hg*t·ørķz’rE£½ÓĻp·Ÿ®n`“$‚AC=N_LŠŁźĮót(ĢĢg‰·zšxģT«šhŲTYRl ö±8Ųć ɶ÷>«l-ųčR‚žīcCaĪ\J :9°«…·O/S­ėŲüāĶ9¾ó„1Nœ]„RÕłŅ³ƒüõ÷Æń™G{ œ¾˜ąėĻóī™Ś[›[UœvMä8ÆĒ¶37 ‘6(KŅNPaȊŒĒ©b³Fś2ā}om5ŻD‘_]ÆŪ«ńI ś»“sšßū‚ĖiC×Ä-ÆŃŠič&՚ŽĖ©‚)¦ƃ€ĻŽ,ID‚ŹUėSi:Z=\Üdc³BĄė •©°k(,肊Ģp_€x«įńŹ j5ƒzĆ „„K0ÕŌÉWÅ$ā‹O÷sm*ĶŻÅÆ'ł³ÆļAÓL>ŗŗĮÄ­ßżźn"A'ēÆnšöé¾ó„1v …yćä"®mšģc=~÷Į2Æ'9v GļėąĢD‚Ózā>:ÜĪģbŽSֈĒ<²”(ręR‚īø—}ćQnL§™¼»ÅHw€ö7³‹96ÖKtö‰šĪÉEZCN<­ŗüœ8½LĄ©ārŖżnĶdˆ…Ż(!'Jo¤÷¢ž3Aéśr¶†'ābj:G‘ułé‰ø™™ĻāvŚčļ ņīéb!'{öĒøyk“R„ĮĮm,Æø6™ęį£q"A'ožZāųįvÜ.•Ÿæ1˧ģ$óšÓWļš§_Ū͹+¬n”xłÅQ¾’Ė)öŽDŁ=ᯒįß|a”…Õ"é­ŖO*²w8ĀzŖL4ģ$‘,ć÷ŚČå:x„$¹M“ēüłNЧLåKMh`³šÕl>Qė½ä÷ČļššiI"²}ąZ+zźucĒ)ąńŲi‹ŗŲŹV‘e›]„P¬#Ė^—Š$IJuEAU„w_ " œ®ĶĀśźŗqOM(’„]•vvž"ƒĄ‚ąvŖ–(!²öž²,ōšnbS„¢¦CµŚ RÓw¦6EĘnWųģÄ¢nÆŪ†n˜œ™HousįĘ&3 9:ۼܸ“!ąµ3>¦\ӝōtx)ŖTė&ŗ)JØ;ūwĒśķ¬l”H¤Ź4ĻŖ™…“³[\¼‘āß~yœ\”ʙ‰u’›e¾śÜ0”€ƒ·?\ęķÓĖü»?ÜK·Ÿ÷Ī­2q3ÅĮ]-<õP^Jp}*Ķ®”0ė _¬óö‡Ėōw‰”L¶Ę„›Iz;|Œ†I„+,'Šōtųč rūN†R¾N,ą`÷žN“J5_£µĶĆ`Ow?\&ŽźĮ×ī£-āBź €ÆĆ÷o3tź°¾Li>‹Ė„R©éHŗIkŌE6_£®ˆyP ±īˆ·ø óŽŁģ’ľż1ęr,Æxųh\čn$yųŃÜŖÄ_½Ć“tŅÖāę{?Ÿäųį8½]>~ņź^~q”t¶Ę© k¼üĀ(?}ķ»†Ć?ēgæ½Ćžźēę +öF˜ø™b|8ĢŌ\–¾.?³ yĀ!;[y ū6¬I¬œ¦Éē “ÕhH½Ž jV³š Ą'm ś”S =/Iųv(Ö$@ˆĄJ„‹«KÄ6U!ź·įrnGłvQ¹ IDATŲķ*§²c‘3 ŅQ¬ŠU±Ņō¬Ż¾ ŹÖCŁVAÅ 2·õbl[« QĆ Ųž<%+čH³š ŻrȒ°:*^·ŠĆ&ćõŚ­÷/Ö·f2¬&KT*µŗAW܇aŒō‡čhóŠ÷Ń÷ H’!ŠĒ՚KÕIēų= ÆJYW™ŗ›%ó‹øČ,ÆQ™gīfv1O._„XÖxłÅQÖ7Ė|x1ĮĢB–—_C7L&n&łčźß~iŒ=#žłY.ßJńšŃ8÷ķoćÕ ,¬člórlŒ…•§/%čėņshO+ė©2—on²w4BW»—«“i63śzƒōwų˜YȒŹTˆ·zģ qńjI7ˆų õłšāƒ½AčéŁoŻśuńk9Iöś2ŖabSd*M7h4 Üa.Y¦PjP)։vč¹8weƒī6H4¼›ÅŌ v …ŁŹ×XX)šąįvv…wŽ_ܙüśŻyöF9“»…¾2űmōwłłĮƦxśx„ŠĘ© Ā)š?’—ĖtÄ<Ü·/f„ ŽP­éĢĢgyčp;Ss[ģŠ0uw‹Ž.kÉ~J¶ €OklĄ3šfęĆåR®Ų jV³š Ą'kō{äK2Ųõń·É’d©÷ōŽéT R(Öɗ5ģv•RY£\Õwxél‡*QÓĢ%yŻŹж'­Ö“AÓÅæ” ūž”‹ĘLĖĘ%šݼǰ[š»*YYVB”,[Fpī=.…zĆ \s«J"UFÓE£Š×é#raS ³Ż‹"YŖIāņ­”•‡ qéFŠ ßNkČĮÅķŲŽ&ŪČęė|V ōvłq:ÖSe’›e*5ē?ÕĒŅZ‰[³–ÖŠ|ė„QŠe‹×“,­łīWwcSe.ŻHrz"Į¾8Źpo7O-qśb‚O?ŚĶcĒ:x÷Ģ ÓsYŗ?gu£Ä»gVéq`ŽĖ’ō·—łņg‡Pd‰·>\ęŁG{Ä×Ŗ' ‚|v ÓD–L %›5 eIEāSŗŽ Ŗg²½¹hV³š Ą'§¢!uÉ4™é9I'€d½&Tkā€ĻźTk:«É2†aōŁq:šA$čd›‰«Ŗ —mgæ/˜’`č1\­‹$7Aū³nō’ō{;‚ h”‚mbX9‚3°Ķį—%A.4-ų@C3xČzœė† ¶EŻD‚NŖuĪv՚F:[#t2q3ŝ…ŗ +:Ū½|v֒%Ęū|”Ź "!ė©2‘Ø—­|PĄA:[„­ÅĶŻ„<wµ`Se’é [¹õ†ĮSĒ»ø1a)Q$›ÆńĶ/޲“VąĀµ$·f3üå·ö'Ī®ps&Ć –0īäłUĪ^^穇ŗø’@^L0yw‹žė ™®pņü*1÷ķkc9!Ü#AŗŚ}Ģ/ē™[ĪÓßé§Æ/ČĢŻ-ÖSeŗBō“ø™šŪ¢ūž^B֏œ”`s ÖKLßÉą±+ų;|˜r¾&ŠĮŠD½”ćø)gkŲģ Ī “ŗ5 p»lt“z˜ø™¢%ą¤w0Äņrž\¦ŹŽ½­hus—7xč”.næzė.O>ŅMw›—ߝZbl0đ=āv?Ōd’X„ļż|’GļėĄķTłÅļęųĖoķć÷©Öu^śō ’łļÆņŁĒ{‰E]¼c… }paĆ{„ ±;ī#_¬#Iˆ&ĄšȒ5K’¤‡šéŌ“¹¢Ž jV³š Ą'£¶ņ:ѐ:£ėę¦$ńŌĒæžŪćvÕ:X „†i2Ų¤ZÕ0Lvxņ™\ æĒ†Ż®P­éTkšņ>}Éā蛖ŠģvŽ5-4 a˜PģčĘ=mBClRE™²¼³bŲFųjša!z «an§ŠĖ„ār(”k:©2N‡ĢĀj‘b©‰D½aŠÕęa|0L4ģ¤#ę!ą³ćv*,¬–źņPÜŹ±”i‡—ŹęV•hŠI„ŖÓssóŽH¬ låŖ$’%\NĒÄYY/rw1O¾Xēåʘ_És}:Õۛüå·÷ćuŪ8y~•+·7łŅ³ƒ ÷łšR‚®'łō#݌†8y~•»–Ņżų‘8ė©2ļ_„£ÕƱ1ÖS®Nn²w$Źp_•sĖyBōõ‡˜ŸĻ²ŗ”§g(L÷Ć ‚`0˜?9 —[%āwpīņ-^;¾7Ša’+ˆŽī²”WEO£a :UģhšĮĘf™P‹›Ī؛ ×7h :‰÷øtyB¾Ęų®ŹÅ:W78r°ŽV7?ūĶī?ŲFkÄÅĻß¼ĖżbģŽš½ŸßfØ7Č#÷ÅłĮƦ8~$NČļąGÆLóŻÆļįüÕ VÖKü›ē†łßžį*G÷ĘPU™/®ńü§ś¹»”ćCķÜ]Ģ »Ŗ•/Ük¤®“tT×ĶīH@}7[Ō›!BĶjV³ųÄ4fȧ^pé8–so»ŗiüDŒo4ä`ÅJ”ŪęåÆn”h‰ø-KŸ8Ōķ6Å¢bx ģV⠘4XM’…ńĮšnī v·ƒ’$öžvEDōŚmbśŠŠĢ  ¢7€,Ėøœ6LS$ŠŲ^b¹"KV“b £eżÓ4ƒ¶HW'7‰†]T* fjÉÉÖTŠerUĆķɂÅr§Cei½DG›‡ł•ƒ=AL*UŁÅAæcō³‘*“/ÖłćÆģbe£ČäŻ-nŻÉšņ‹cTŖ:§>ZćōD‚?ūśb-nŽ<µÄÄĶ_śĢ ćƒaŽžp‰åD‘Ž˜Ēāėē8wuŃžż]~ę—óܘīŻCaę–ņ\»•¢#ābx0„Ė”ā‹@®N7 A*©<”ˆ‹©™4¹|–ž]®%é;±9mŌŖÕŗŽ]‘Ql2`óŲX_Éć÷Łq:Ä !‘(jńõ;øp=IČmc×x”Äz‰¹ł,GÄŃjļŸ[åč‘8m!Ɵ\䚎VĘCüŻĻ&Ł7įŲž6~žĘ,ń˜—ĒīļąožéĒöĒŲ3įožé&_~„ÅÕ—o&łóoģåūæ˜bĻH„ž?æ|ė.O<ŠÅµ)± ±Y$ŹrEĆ0 *ÖjH’° TH ķkčęHČÆ¼•/6C„šÕ¬fš ©lQ7^å Š*I¶fĀ8ģņ½i€$Ę鉔 åEB. k/ÜrāõŲŃ5 U!=`īģŻV­iŠæ³­Š  VUĮźĒdGŠ×ФČn5&‚$X«i8ģB`³É;.ƒjM€Œ$ÄśB¬„ŠŠfƒiJ„K+ b"19»…®¬oVHg«=2^·jMĒ/—¹½¢ÓŃī„” ¢`½ašŁ‰„œl¤+x\*‰d™īø—É»YŽīme#]A‘%‘ŖēwšÄż|t-I*S!›Æó­—Ęø6µÉäŻ-fņü‡»$‰óW78})Įwæŗ›Ž˜—7Ž_āĢÄ:O=ŲÉtqf"Į…ktÄ<?g~¹Ą õv…Ī]Yg| L¬ÅM±Ō`f>Kw»’6Ą¦6”6yūWÓ‹uŚā>ŚŪ½\¹–ÄØjDūBtÜ˜ÉšŲšølø<663œv U-5PĮšFŻ8=6 Ł*Ł­*-1=½A®\ß 5ä¤3.V)Ó3hĆmWxūż%ī?ŲFĄēąµ÷øo_l'ąŠžŽīkå'ÆĪ 8xöŃ~žś]öŒDź šƒ_LńåĻ ’-Ō™žĖņ­GłŪŸÜb°'ĄĮŻ-üšWS<~‹«EÖDÓW³¾GJe}'żŃz‘$¤1C7¼Źļņ%£Ü|24«YĶąQ¹¢aøņ{Š"Ić ą=†•ģ·}Ū6-W»—rU§\Ńq3ŸœĶ ŗp:Ä* _j`We˳/ķXśtŻÄ® q ¢H–.@ą} +>XQĪÕnW>ö± dM”m}€E4¬DBĶZ'(’„Ż.y›Ŗ ĖāĘē°)¤¶*ÜỴʂ8 É­'•šNO›KĄŽ4[ó% U“l®Ęp_ˆjM£RÕČė8*‘ ƒd¦B,āf3#āyÆN¦Ł5Ęķ²‘ÉVIgEņŽ3÷pc:ĶŹF‰L¶ĘW??ĢōÜÓsY–׋|ćłŖu‰Āšļ_އĒmćŌGkœ<æŹ Ļō3:āÄŁUÖ7…°ļŃūā\ŸJ3q3E¼U(äē–ņ\¾•b| ,č~²L÷ā?ŗ\‹¹÷& 9zLĶn‘ŪŖŅq30bfv ³Ņ Ōį#čPø>¦#ęA’„„3“­bSeœ^;6Y¦(” 5l`Ń"Ņ™ ¾ “ξ ソD{‹›x_Ķd‰Ė7R=§«ÕĶ?žrš'īļ tņż_Lqhw jēļ~v‹n‹ƒšĖßĶaSdž:ŽĶO_»CGĢĆżŪųßæ—_åĪbŽ/®ń/ļćæœ"rņš‘8’ņ»»;#•©ņ;(–8b2ešā{MÓĢÄGIBB’ Ć|$ąUŽČ—ŒBóÉŠ¬f5€ODˆō)o÷K½`„ķY¾żķĄU•É—”J5dģv›"c³+“·zØV„FĄķT±Ūd$+DGÓ ÜNŚȖ•Š*žķæ±ĶIŁ ņ le 8l÷ø ·āĻØŖ„Ó.>¦l!Ö“”RÕ(”4tĆ@µ)„ŚZŻĻ}ūc¼ņö<‹+ā1Ÿ}¢—„µ"WooŅŽźįĄx ¹BÆ„Ė9ŽEa2C– 삵燯Lņ;xä¾8ē®lĶ×ųśó#¼vb[åÉ»ųĮƦxčp;ဓŸżv–?’ĘN}“F:[åĖĻņėwęŲ;„XnąóŲvŖõ†±³rŅu1Śž•$©Ķ0yÖļ•ßo Ł’[ł¦A YĶj6Ÿ€Ź—ŒBЧ¾Ņg%‰ą’’ķ¦ >Æ O‡ĆĘR¢„Ó”ątØdr5<.—’¬ĆZUeģŖL„¦S×Äa®Y»ż«Ŗ2Šd±öU1Yhh`¢7ŗ!Tžŗ!MÓj$‰JU·ąC¢¹n+]PIĘ"Tk: Ķ`+W„-ģ [hPĪXŲ4ŃM“bYL3†{Rr…ƒ=AlŖD¶P'™® :q8²ł:Ŗ"“H•čļ 0;æÅĮ]­äŠudEāźķMā­ķnaz>ĖzŖĀV¾ĘĖ/Žqéf’Ū³[$Režōė{ØÕtN]XćęL†o|a„x«‡S×ø5“į”ĆķŽŪŹÄĶ×'ӌ „xšP;él•#{[©nVp)2Յ4Żqč6»Āśz‰éł,}AŗZ=¬n”X\-Š=¢§ĖĻĢ- „mq/Żq×&7A3ˆ†]“„œ\ŸN ‡Dȉݮ°ø”'p ZvL‘šhRÉ× „nO§i‰ŗ‰µŗ¹|#‰Ó¦Š1"›.söb‚CŪhøųŁkw8ŗÆ•]Ca~łÖœ hćķÓĖØŖĢēžčåģåuV |žIńŗn˜<ūHó£<|$N_§ŸśĶ /æ0ŹģbŽõT™'źā•·ēéa·)`š„$I4Ūõ†‰Ŗ°c=•$)b˜¤Ö0(””«Żķ>ģ6™t¶ŠŪ„’+Ōéj÷qłÖ&Gö¶róN†ž«ėBA÷ˆqžź©ŒH'üŹē†Hf*œ¾˜`#]įæ²‹t¶Źł«|pq?żŚnÜNļœ^ꏭĻ>ŚĆPok“›œæ²Ī”=­;ćĢD‚½#QR‰"g/Æsg!ĖŪ§ģō3:e-QäĢ…5öŒG‰E\äņuÖEĀ^;ƒūc,ŽŻbc£L{§ŸŽ›i!ü µūčč pżZÆ]Åé±į±+låŖŲÕ„ŠĘLĀO§Cü8‡ƒN–W ƒN:cRé å|”Ż­ÄüvN“ʞ1Ę{ƒüą—SÜ؝ŻC!~š«iFś‚ģ sśR]7łŌCݜ¹¼ĪÜRžēžčćĀõ$[¹/<=Ą’ūóIĘCŒ„ų_æw•o}iŒłå<ÓóY>÷Dæywž‡µ#I"ķ1‘, ¹p»l–Å@µĖfü†a>š*WB~u.WlNšÕ¬fšÉ˜¬}źu>Æ(’cÅ˽t?‡jW»—–ˆ‹µd™FCŒĀ3¹ŚĪx] żO•Įļµ£é&õ†p8T‰jĆÜĮkĘĪ’Ż"ŚTU•0 a 4‰€Ūc I’Qä{$CY ÄöØ·V×-ǁ„%°ÅŖ ¦i°0Ÿęę-7 $zā$I"“«’Ķ×i » łä‹uJR„ĮPo€bY£Pl°–,1Ų %ģ"­ķ| ĘC\ŸĪpxO+é­*²,qc&Ćī”0ūĘ"\›L³²^ĀįPłü½œžH°øV$™®šø—\”Īå›)nĻnńļ¾¹»]įŌ…5&nmņųżģsg!‡Ć®płę&š¹!Ž;æĀ_żŻžy¤›ń”0Ł|óW7ģš3Ō _lpéF’Ż#bQ+‰ó+zŪ½t“øInVH%KÄbĀŻīN§ŁL•‰EÜÄBN&g·ˆųģŲżÜN«‰"ELoPÄĶōģµbx»˜ø²NW»—??śõ4»†ĀM•±;ŃĄXŽCÓpŁL4 ōj™ĶšRE#³UÅfSč é&„Š8("A;Ż6ŅĀΧiG÷ÅČź”+«%v‡qŚV6J8ģ*՚N_—Ÿ…Õ{G#ܜɩŽāfj.KkÄĶĮ]-\¹•bu½ˆĆ®ņåĻ1æ\ąŹķŲĘwæŗ›t¶Źé‰ +¾ūÕŻż^?¹ČÄĶOļāŹķ4”€ƒÆ|nˆ’ō÷WśDC‚rŲŁęå¾}166+œ½²ĪĮńŗć>r…:—®' ÓŃį£^Õø1¹IoO°ĻĪÜJž|®NkŌE<ę!—­Q,Ö GŻÄ;}Üŗ½‰]§e±¬ŌtÜ.Uąž+N§‚a€¢›ø¼vd VÖK„ĀN:‚Tņ5¶²Uŗ;||Nœ]įŠį8‡Ē¢üš!|šP;?śõ4-asīŹ:‰d‰‡ÄÉź¼sf™ž`9QäŅßžŅæ|sŽžNėd׳{æoŒżuķĢ]½M5‘å?žÕy֒%׊dr5K`©I­ —É6¢ZpJĻa²š*7š“€f5«Łü«Æ­¼ŽĒ)ߐe©"IŅć€lX£tL1š× į(”4:Ū<ōvśŁÜŖ`”€“’uĖr:Ō?±+O[»]Į¦HHņöĮ/‹‘æM·xs[->®¾mMŌEœ±ŖJ Įö3\ˁ ć°É–ĶPÓL‹hRÆiøT‡ĆĘāĀ&7—ŖÄZ¼„|6*5JUĆ0Lś»|huZĆ$“«ćóŲķ ²¾Yf3S„\Õ88%[ØQ*7H¦«ōwp;UÖ6Źä 5juįŽ×§2ܰé9$4q3ÉųP˜żćQ®O„™[ĪÓhč¼ųéĪ_Łąöl†T¦ŹŸ}m7+ė%Nž_ee½Če’$qör‚·OÆP*7xüžžźļ®°±Yᩇŗ8¼§•»KyĪ_Y§æĖĻŽŃ(él•SDv@GĢC„ŖńĮÅćż!|^ļ|k:ĶąP˜ī0k+y–stō‰“z˜½“!“©ŅŚāA•`-YĘåTńؒD*]ĮėVQŗÅū7 “b¹A&[£Z³lä,€Ó”P*7p쐅•¬\Õ¬X_”Üßfˆ²ąȲŒŪ”Pkˆ³n€,’ź“{5†aønģX·ŃĮ6›Œ h d…t¦ÄĶ™4sėu Ż$t¢*2ŁBMą‚M‰]ĆaŹQ°RŃśtµłHg«drUŖucQr…:Ł|D²ÄŽŃ(ÆŹśfK%½UćĄx”®npßž‹kŗ;|\¹µIg›—ńĮWnoR,7p¹l¼ųĢ —o¦ø9#š€’ź[ū˜_)pf"Įäģ’ęsCœæ²A¶ r^x¦›*3·œgz.K—Ÿū¶±²^ä3+ vŲ;!™®ps&C_§Ž6/•ŖĪ•[›“µøč³•®pk*Mw€¶„|å„‡‚Ķ®€MĘķwR+5$ 5ąĄk“YN xl“wŲŲ(’J–éėōÓvńÖKŒ „Ł=ęūæ˜b÷p„Ć{ZłĶ»óų}v9ŚĮÕÉM%ææ›*sm*Ķ—žāO»R|ī¾šĮ_ż?ēõ÷łļ’—säĖ&°•«”Č+ĻBŲO­õ–“Ż>ņ{ĄöėÖģqE‘ģ>·ņA¾ŌlšÕ¬fšÆ¼rEĆō{”S@·$±¶ošŖ*[<±ÆÆT5ź ƒžN…Š&„"!'„Š&nƒ§ß4…`L’DJąö^^ÜČDmC7Pįė7?F 4 sG±mZܬ¦A•\ČDĀ‘ ' .€Ć.cE„Żø½Žäō”ČĀǟ/Ōb Q, Ÿ×c£ÆSŲש2é\N±Ø‡l^ś6›ĀŃ}­llV(õ¶f IDAT,'ŠbąPÅŗ@+ŒžW'7Ł?ŽĀ™ mQÆoŠ×ķ§·ĆĻÕÉMŅ™*&š­—Ęx’£Uī.å(”4žģė»YX)pöŹ:Ƽ3O”Ōą3õR*78weƒ§wÓŽāęŹķ·īlŃÕęa÷p˜Õõļ[a¤/Ğ‘K‰"g&Ö 1<&µYfi­H[ŠIĻ`ˆäF™ŪÓizƒDz¬.äø=“¦æ7@KŌMj³Bb­H,ź"u3}w ÆE ōd2‹)ŗ9­aPoH ›×ŽlĄājØĻAKĢC©Ō`e½Hoo±ž ’ņę,ūwµrx· öøļX'œ[„RÕxüžNÉ qų O³÷~qpūløĀĢTš’ó×éļ0:bāf M3čļ €$nżÕŗhDÄ“Č 0·7ļ~搁$‰Ö O9‘+Zó Ѭf5€Օ/zЧ¼Ņ~Ibh›¼gę,Č0ÄXŽnSˆĒ<ä BØ(2Ŗ"sėNŸ×.|÷¦I¾PG–…{Ąn“i覠õŁ+õĻÄfa‚Ķmįž"ÄŠ*[#\”0LĖhķ4‘K ŹØVl°Ć&žŽCŃq»LM­swC'ąsąqʘŗĮņzY‘čö#+élB±ŽĆ®ŅŪé%›Æ“ÉÕȕ4ŗüD‚Ö7+$R" ųĮƒmlźä‹u–ÖŠŪßF½”“+ŌXß,ćs«ŒEų蟇÷“2·”gl0ĵÉ4ćƒ!v E˜šĖ²ŗ^Äķ²ń¹'z™[*pūNšB¹Į O÷óĘūKŲķ 1½>>ŗ–dźn–]CaŒGYO•¹pmƒŽN?{F"ä uŽ;æŹž”0C!Ö7ŹĢĢgéjõŠ;¢R¬3qmƒ”6/ńĮŁĶ s‹9ŗ{“tX[ʑڪŅr 3?»…"KøüœŠÄüræŪ†‰ĶcĆ®›¦^Óń†’?öŽ,H®ūJóūŻżŽÜ׌÷ ;€ ĮEq“DŠM-ŻR{ŗÕ-Én{Ā3n{fżä‡ßüb{¢'üŠį‰™iGŻ­•E$b!–ĀR…* ö%++÷}½÷śįŽ,$©ī§™'*ODFŽŹŹLT²žē;ē|ēū¼ 6 h²H_æ—R©IbÆBßh€#£žżĻļ39ąČt˜Ÿ½æNŲ«pīÜ0WÆļqōłq&FDN~ÖĪCxX¦µ°‰¤ŹŌ+mžĆ/Vš2_{fŌqKœ sd&ĢĶ…4‚Ė/i6-TWņŚt?{‚ąŖCrĄCżq€ ĪŚ6ć~ųn©jõL„zыųŅwš>CxG„įƒ€–éž²äTļ{nBtÄzgĄ`@cøĻCĖuļS ŸG”mZų<ŽĮŽ}pŲ  m²,Ņhŗā>īėlTÅ!õ)RĒ*Ųao·Ż•.ÉķRX¶ćXgŁ`·›’L"‘ēĮv•D¶‰eŪōE=ØŖD­i’/:Ź~‡&CH¢@¦ŠĄl·‰†tŽĶE(•›lģ”(WŪ™3÷°¾S"Wh i2Oźc'Y!_l±±SāłĒE‘rµÅÖ^U9u$ĘŹfĮ!.¤™ qw9˱Ł£ƒ>v÷+¬m‰†t¾÷õ.\Ūc~1Ćo.lcćlR”Ź-¼…łćÓØŠČo>ŁāŅĶ=ŽzyŠÓĒāüöĀ6«[EM†yī±!Ö¶K\žOrx*Ģ™cqņÅ—o&™ 21 ›o0æ˜ęšD¾ÕJ‹Ļnķ37dp,H)Wgi9Ėų؟ĮįŁT•Ä~•žØA< ±¼žwˆŖŒ TŻÕOEp\5UBŠł^æFĄ«p­@ŲÆļóŅn™$vJÄē¢LÅ Ī_ŁåČt˜GŽĘłÕ‡›e†CÓ!¼¾$Š ¶½ƒZG*·ų伏˜äpHā[ÆĻ°—¬ņĮ„‚>•„µ<±ˆNćˆżś£M9ef2D­Žęć« †b&¦ĀŌkmnŽN13ģ'1(–›ģļUčļó¤35²™±q/Ū»%Y"÷ X¶£i8ĀQ².#¹­ōjµ…'jó«,<Čö©„ćŚ “µ„ #3F£’śß-pīå)Ž?’8 ƒqų̹&‡āQ‘F§!¬ćoŌńH"«×¶ųõG›ŠÓÉY^ĶóÆL1=ä£+»x IČęx …HP§XjLuœm ˆ’Š8ąįż!ą\Ą+½S¬XåŽ Ń‹^ōĄ—}PśÄ€o ~ūįUgwŪ¶ŃU‘R„M£e‘+6P‘HP'_l<“ńÕ$Š.ILźJ•ÖAĄŠn“Ū–\™`Ł/Ų¶c d[öAÕPÕ¹]M]•X]˰qĘ”€Š Šl'+x …ž˜GWh¶L’© ŗ.3ÜļE–Ń L®F,āalŲO³e²—Ŗ‘ŹÖ8{"NĢý•<ū™^Āљ0;É …R“Õ­"/<>D³iQ¬4ŁŁs$‚ēĘ\¼¾ĒkĻóīĒۜ<åśs“!&FüÜ[ɳ“šēņĶ$‚ ŠhšhŖÄĢDńćSdņ ®Ģļsõö>’ĆĮc(|zc{«9^~fŒÓGc¼óń&»ūM…9u4N&Wēņü>s“!NŠR©µ¹x}į~/3ć!Š„&ĖėyęfĀōG š-“łÅ Ó³aśū½Ō«-ī.¤ Ņ7 “¬°¹U¤?jsA€`Ł~B&WĒ£+Ų.QSVØZ©‰҉ū5ī­äčųś¼(ܹ“büH”sßü6ģ­8ä>V P<Hä $mČVQfĒOö1,·™{y„Śā—ļoąõ(Tj-ī,g9y8ʓ§øx}M•ČźÖҚŚEtS|÷8@xØCÕ“‚Ą AŸōėBŁ*öNˆ^ō¢¾ģć€TĄ']į[€į“ž]Muѹ¶m'‘×mF|Ųī.«m9µ.3_S%ĒŚW‘QĮõlØĻŽŁŻ7-é`eĖåXŽśŸeƒ®‰“Mhµy`Muƒ,‰“Ū&жiq-O„-Ņ6mTE$čW‰…4v“UTY$2śņ„™\ CW˜ Šl[dņMö3uśc¦FTkm¶Ż$d:L<¬±“¬°²U$äWyå™–× ä‹ ÖwJ¼üō0õ†I2]„Pj2÷07āÖ½ OœźēĪR–³'b\¼žäōŃūŁ ÷snĆęĶ—&i4MV7‹4š&ßcŽĶŻ2ŸŻŽ'‘ŖņO’ų†.ńÓw×X^ĻóõƌóÄ©žö7kܽŸåčL„GĒÉęüāĆ āŽĻE©ÕŪüāĆMŽL‡84¦Ż¶ųšÓfǃ ōū(–›\æµĻģ\”PX§˜kp{!ĶdŸ‡HŲQ~\^Ė3ó‹Ü_ĶÓn[¢^× ĮįwČNī“ĶŽz„‰v:w—2Dt_Ÿ—įĒĻ€Ļ!t“Ė=&tĄDy`B¶Œ¤¶),īņŃÕ]ŽĘ  łU^|nŒxPēļß[gf<Čö^™­D™hHgb$@"UEUÄ+iĒ‘R8tßw€ĄbHx%蓮/”­tļ„čE/ząKр¼ic/oŲ6ŹAåķ%Qp4€˜‡hX'™®Q©µń{W‰­yĄ /–Ō›ÖĮ««2mÓz8ó—ņ ›?ÖMÓB’ Z3wPMw¾+į­¬¤H!č×(”=C•d ŸWa}§DĄ£Š÷ édóuҹ‘ ĘčÓ²ŁJ”±m›˜A,lŠn[l&ŹTŖmNōklķ–ŁŻÆ ė5Bµęüī6‹Lčyø{?Ē”©ŸŻIńāĆüŻ{k¬m—ØÖ¤4=ęē„§GłÖK|z#ɽÕ–eógßv …nÜŻēÖr–æųžqLĖęüåī­ęłĪėÓš ń«ó›<Ų(pī‘~N‰’+4ør3ÉōDĆÓź “ó—w™ 0>ģą£+ ŽĻEöSÆ“ø»brĄGߐF­Ķ•ł$³ć!ĀQƒjµÅśV‰į>/ż‡¢ä÷ŹX- Ć«ņ«¤sutM¢Õ²h¹ ¶mÓ¬¶ŠT™¾ØŌļ…ų@&k@ŠÜ¤/8ɞ¶{ė€ ).ƒŽ‡>dX5яö³{}—K7“HĄV¢L£irņPŒgāŻO¶˜²¶U¤Rk£«ŗī€FIō.¤ŽAuā!_€8ššß#}\¬X{½¢½č€/mäK&±²dšvJ–…—-¹k6źī߃אŁMVŲKW©ÖZqĻÕ0-‹Oužœ ÆįųŲ;•¢;uYŖ,”b¶m»Š‚mĖ9ØmWU°³•ąl˜Ø²³=p}!‹fØH’@Ą«HÕš{BŸGĮēQYß)l+|„r“l±¦ŹL›­½ •J‹Į~/ćƎmšV¢L³eqśHÆGįžFT¶ĪPæ—gdi5O*W'±_į'ØÖŚ+-V·JŒū™ńsc!ĶįÉ0–`gæź#m8{"Ž®ÉŽš^@ćÕēĘłģĪ>+›Eš-‹}÷w–³,ÜĻ‘Ī׳ēzŪ†.ķpe~Ÿ·_™āųl”[K.Ļ'ösd:L&_ēāõ$ÓcM†Ø6Ś|tu—ىCż^-“ėwRLśš‹ŠŖ“øxmÉAż^DnŽK35ā':ā'½Wae«ĄXH'ŠŲŁ«P*5 Å<< ‰ż*į €įU±Mė ż.zŒi` XÖšŗ€÷k¹«`»×uHäĮ/C„@a·Œo$Š,ʉøFß¹1ĘG¼¬.e8q(Ź/?ŲąĮf‘ćsŽ|i’óWv]PjŅh9«§ĪgĖ>š•萿°šÅn@Dx3䗮ŹÖFļ”čE/ząK¹¢IČ/ݰdAąY7÷®2r„U0M›XDēŌŃŁBƒFĆ$6$GNX…‡æJ„å“ü%Ap4¤ĪhöźuÕé 8Ū­,;ÜŁn#Éū;¶Ä"²$¢kƒqƒ­½Šć5 ‰ųż*± ŹņF‘€We|Ų‡×PŲĻ8 Æ.qx&‚eŁÜZŹ"#ƒ>F|Ōėm6wĖĖ ž<=€G“ŲŲ-³¼V`lČĒécq–Vó¤s ūe^ynœżLvŪbį~–±!?£ƒ~ęļ„©ŗŻŪ†HPćæ5‡"KK 6wʆĢė/Œóž§;l%Źx= ?xsŽĖóū\æ›"•©ńĆo”Tiqåf’ūė¾żŚ4cC~~u~“Żd…GõqźHŒõ×ļ¦ņó䣃”+->¾ŗĖÜdˆé‰…bƒĻn§˜Œ{é¢Śpł¦³ 6M–ÖņŒD ś½Č¢Ąå,#ż^¢qõj›l¦Fp$@P—)•›xƒ˜6²*”‰!ʞwX @Ō­ü;=mĄr;rWõ/;Żæį€UĆ×ŖBŲ qqw>ŽäpX%›(ć5F}¼ōĀ8·Ҝ:ć—n°“¬px:Œ”Ė–Öķ¶…Ł¶µÉ źļ |!|ĄAŸt§T±īŪ½c¢½č€/kŹ– JŸ˜&QQä1@eGŠĒ¶óžVŪBSDŖuĒ<'sTōTE¢Õ¶IģWˆG0ąˆżp° (ŅŃĻńsi·mdÉѧOŪ!’9²æš*Ī5Xڬ08`m»„×£øė_±°ĘņzhXCUd ]¦\n²›Ŗb#0=ęĒk(lķUØÖŪD‚S£~, īoщ¾˜‡±A?©lõ–móĢ£‚Ąśv‰•ĶÓcAž<ÕĒüb†t®A2]ćĶ—&ŲKUi4MÖ¶JōĒ=,ŗ¶Ą¶-ą5d~šĘ,Wę÷9{"N³eQ(5ŁN”ōóņ3£\æ›āĘŻ4¢ šß’ÉIn/e˜æ—a}»Äæüńi©*—n$¹¹˜ę›/Nščń>Ī_ŁåĮfC—yžń!v’U~}~ƒ±A?§ŽÄHgė|rÕi’OŒi5-Ž»øÅŃń ±˜Eøxm¹Ń”A?¹t•wÓĢL†šG ʇó0<äĆēW)$¶‹¼ ž€ĘŹJ]•P?<āVųŪĄ ŃÆĻ=·źļ>"4·ņ—]0`;JīsĪ“@Žā qtDG˜ģĆc¶˜æ“f|ŲĻ’żļx°YäÄ”(Ļ?>Äå›Iś¢Źg»#Šh4ĶŻU t8.`Ū;×v»U]`Ą¼é÷J+>øPŖöD{ыų²vJ¦ōIēA˜ŽZBĒTŶlW]ĶIźÕZ›R„Å#‡£ĖM|'éõy±,ūĄ((ąS\ó!g„°£>(øŪŖ*¹‰ßvē¶m|¬V I’XŗŸ"Urų‘N„ŚDÓ Ū _%6ŲN” 5t]"Ņńč2™\ ” „ü*[‰ mÓ&ä×ō#‰ĖėEYdlŲO_Ģ Z3YŁ(R­›|åܦåč"¬l86ęŃćq–Öņ$Ó5ŹÕÆæ0΃Õz›ėwÓK-dŁ&OŸdq%ĻóņŽ…^yv”l”6,Æ;…'N pķNŠåÕ†įtī­ęø~7Ķ^ŗŹ_žŁ#¤²5®ŽŚgq%ĻŪÆN¼wa‹õķ"s“!ž<=Ąī~… ×ö4ž}|ˆl”Į‡—w™ 21¤Ż4¹z;ÅHŸ—žAŖ$ņŽĒ[  hų½*Ÿ\Łev,H|2„Po3æ&Ō‰„tvö*Ī’k@#rf „’ t[ł·€]7oś¾Põ·p“wZ])·“iU÷čŠÜk7—J`ȐÜgévŠŲt€™˜ķXœĒĪ ”ÖŪæÉń™0ScALÓāćĻœ˜‰Šx ™ß\Ųāä±8~/“,®ßŁgz,€ß§"wļg™˜Ž00ĄŖ·ŃžpZõ<‚3ė_r}Ō­ź;U'*]I_ę”,éŽ,49ą~g,ąó󘱏@*Ļ;l01ųÕß.‘+48<晳ƒlļ•yįÜ0÷× Ü[ĶćŃe<†LµīhW“M Ór¤åņR„Ļ~wc ė‡Õ²©jŠp„Z·{^ō¢¾œ‘/™MæGśµ(ņ² 0IS¶Ūš7Mg„m?S#±_EVD ]v”āPPCSdA Ö01T ]“\É_W Uv’}Ē@ R3Z²‚m¢ČWnķÓ×ļŲųÄ<ŌŽOŠÆ’LWńxTTEBnĄŹV‘hH#ąWńč2¦I¾Ų@Ebƒ”>/ rˆ’óõpÜ@Q$īŽĻ¢H"³AāƒlĮióŪ¼ōŌµ†É½Õ<ėŪ%Ī‹s|.Ģ… ‰”#”LUhŗ4Q“yōd?š*±½W”?ęai­ĄÓgųÕł ^{~Œķ½ –m³²Q`dŠĻcōss!ĶņzŸWåGß=Ź—vøu/K*[ć/¾œL”ĮÅė{¬mł£oĪ ė\¼¾ĒV¢Ā±ŁgŽÅŁNTųčź.'Ē81„mZü§wV91eøß‹eĆ;m2; >DhZ\¼–ąšxčD©ińŽłMŽL… TtUā֝£OŒ¢xAxŲ–Œ[õėnrĒ jŗÕ÷µŌ5č†W Šī×5h·Į@Pcęx"Qf甓fŽĘų«’ē6KkyNŠ Ølī–yśŒ#į¼¶]"Ń©5L°Śn»ŹĖ•„.Kį. /*² }ŅĒ…rĻDؽč€/o' öĖļo!ą@XEą![æŻ¶DĒNÄ)WZŽŹ\¶Ęč€ÓröÄmĖ"Piµm÷1GGĄ«Ė4ZøĀC`Ś6š« b£Č©żK[5lAdØĻC&Wg ę$ēH@AUe’éńØįˆiCq«[%tM&Ō04™T¦F©Ś"PźsoŽĖ )"įAĢĄŠeWrØŖĢĈ«œWj°•(Sk˜<÷ŲłRƒÕĶ"‹+9ž<ŻĻ”©ć:¤²uF½ōÅ Zm›µ­‹įóŖģ$Ė ųX|åٳƒ¼’é/?;Źv¢Œ®IÜZŹrh*Ääh€ŪKYīÆē ś5~ōŻ£Ģ/¦łģNнT…õ“ÓTŖmĪ_Łeq%Ē[/O29äĆK;lī–˜rīT?K«yę§ĀGŽÄh4M~žĮ:'ǘ P«µłōF’cćAś£ĪļžŃå]ų …uTIäŅ=ę&BųātQĄ;ņ]4·źĻ» ½ĻMꢛĢM7™jīuwŲ]@ “čŪ]u¶dThĪūŚuP$Hēųčg÷?'ghŲĄņŲ¹aęā^Īžģćāµ=>ųt‡¹©0 °—Ŗ2<ąĆ£Ė¤rwJQp>ĒM G_ņs΁_ xˆų<ā„JĻDؽč€/k' lf}†ų±( ߥgŪ®O€…ė¼&H­ęŠ Ŗõ6ÅrŪ²ˆF ö3uv“†¼ŗL„ڦŁtl€m‚~•zƁ°\”,KÄ£ö³u†ū å6C&ŌHģWˆ„t@ĄcČčŖÄƒ<±°Žß§ ėlī”iµm‚~…ń!/”€Ę„ł$į€Źč€ÆGA@ą“k{DC:³A4U"“køŽ€/?=B³e±¶]b3Q&ąU9%A8ØŃ6m¦Ē¼żŹ4ó÷2‚ĄÅIž=;ˆ¢ˆ,®äł56ež?7ÄĻ~»ĪŁ“}lģ– ųī­ä86įčL˜«·’,Æģóš½ÆĻps!åpR5žņĻa;Yįć« äų£oĢź\ø¶ĒƒÓćž~Ōi‹æwaūĄ”Dzl.Ļļ3÷rx:„(:ž³!āƒ~tIąŻ6™    ]Mpč+ÆćÄ!ł5”øš×Š•ōŮĎiõ[]Uæé&u©kŠétq@ćįk<*ćGƒ zŃu‹ėŸ%šņožÆk\žO26čc|ȏ( ¼ųäū™*ó‹iĀAdYĄėq:UM—ujŗœQä |²|ž18+ LöL„zыųRG<,'l›[8jŚ§ŸŽŅŸĆģÆÖŚLś“ü- ś¢ńˆA³e¹ŗ6>ÆzP6&Š,Øʲ“ šM ‹|©I2oR®™DB:™\ Æ.č”*m"!R¹EŲ%°%ÓUFś½ŽF€OEöR5‚~_exĄĖżõ¦I8Ø3óąó(|rmC“S·“š`£€,‰›qV˶ŽO€…Ą Q®“ŲŽ-±²YāÉS}Ü^ŹŅ3ø~7CĄÆņęW'¹s?‹ Ģ/¦łźS#Ō&…r“pPćĮzž×_ēüå¾łÕIÖwćÅk»<ūŲ‡§#Ü^Źpćnšžø‡?xeŠ+óIīŽĻ±½WęśŃ)*µ6®'XøŸćŪÆM3óš‹7HģW™ńóäé–×ó,Æč‹¼²Ć±É”ćq›Į”ä8-+ś€ūēŽ©üķ®„Žtæ×BWkæé>·ŻÕvŗ@‚ŅuŒČ]ƒ¼óøU‚õD" 4;‡@˜3Oöq¼ĻĖŠćC|üŽæų`'O°°’£Ł²xż…q‚µ-Ē3¢Pl"Ά†eŁ|žcżEū é IDATĖ >o+č[žEįDĄ+żŗXé™õ¢=š%Œ\ɤP¶Vü^qSųŗ ˲ˆķ"U‘ć ‚ĄÜDˆÕ­"É“#Š#Ū‰2š*šk‚@"UESg9IQeŃ]Ćrl^ĶV M•Ųß͐ŖŲ DuŖÕ&}Qļ«?PŁKU‰… ʵ6!æ‚(Ф²5|ˆhX£Õ²ŲĻֈ† ‚~•_e3QĮ“œŸlČOЧpįF’XÄ ?Ŗ 딪ŽĄŖJ› £)"¹bƒµĶ"CaøßĖĪ~³'ćl'Ź<óŲ cC~nŻK»ŽußųŹ8ó‹i$Iäüå]Ž|i‚VĖr•ź&™|ƒ§Ļ š‹6ųڳcÜ\ĢŠõpõÖ>Oœ`j4ČüRšėwS Ä<üąĶ9Žæ“Ćāƒé\õ“3¬o•ø2ļčüń·ęčy8e—åµ<Ē9œ€õķ"Woķ33āŠdˆFÓāĆĖ;œ˜ 3Ōē>ŗ²Ė±‰Ń!?^YäžzįOO7€ 'Q 1īšwČ}ķ/‡Ńßr×!w%}”«K`v„®®»€³i ;ć‡ˆź¼·PēĮ‡DF nür…Z½M_ŌĆDĢĆWžęč‰>šUĒ#!čW¹vgŸVĖäŲlE)•±MĖCuó\†’8ŻO怳AŸō«bÅŖöN‹^ō@/¾””«Ā]YŠ‚ĄK–e‹ąŒZmėĄvU×$j6«®,kŪ“ˆ†4, Tՙ߷M›Z½,‹®é®É4Zęä°eڶC ¼æYfsƆßēTų–m‹xŲŻÆąõŖx …fĖb0¦SŖ™D‚‚f›xDGć…r‹\”AŠÆŃ5é÷0æ˜ĘēUųœĮXHćµ=¼…ŃńˆAµÖfu«„Ļ«rl6‚$ $ÓUV·J”*-f'ƒÜXH³²Y@“^aœxÄpęļ÷2DC:o|u’>K I ÷s|ż…±k]Ó¶ŁIVxęģ æüpƒWŸcc·Ä@ĢąŚŻčcf<Čķ„ Ėky¢!?’Ī>ž,Įµ;)v’žÅOS(7yļĀ«›EžąÕif'B\ßēŽjžÓGcȧ7öyį‰!~sa›ĆSan.¦94bv"ÄŻYä1t™ņÖ!®ßMso%G”Ōä‡oac§Ä„›IÖwJ|ėå)F}üę“mv’fʃ ŸW#ÖŠUŃY;Œč Ę=„C:élµ­]¦\maŽR$Øsd:Ģ£ĒūŲKU¹æ^ “«ńʳ£ØŠ##üŁƒq/o¼4Éū—vĄ†K7“|ūµö³56vKhŖD”Ųä‰ÓüōŻ5¾ūŗC"Œuęļe8u4ĘHæ{«9lˆ„tžš3|t5ĮĶÅ4­¶Å?ūӓ$Ó5®Ģ'YŻ,ņ×¦čópžņ r‰pöDKkyīē˜ńsh2D&Wē·xźÜ0ž€ĮÆBŠĆŹ{GD`,ų»’¶Ö•¬;śž-÷ŚīŖś÷¾3hw%v±+”Š_8B:I¶ŃL÷u– 4T'ł£ĻfżÓmB£×µĀŹJŽ±ØŽdYœ9ŽĒģxėwŅܽŸcm»H©Ür«}@dŶ?ļšĢ’…īVĄ µbŁzæwRō¢zń„ŒRÕ²^é}AN‡:"6® Ž‹ŸąŲ—Ź-NŠŅl™ŌŖ"Š504™–éśčš„Ļ£ø6˜m4MāžjAR$”ąQE6ʇ†CCa/]elŠG³eŃ2mĀb„ÉŌH€t¶†( ų¼ ¦ £>6vK4›C&ąSé‹zø±˜!Ō ų5āa M¹xcŸ”~/ƒ}‚~•L®Įż¦i3Üļ”Z·Hekģgj ÷yxśŃ~rÅ&Æ'Iåź¼żŹ²,²¶UäśBšž˜‡·^žä·Ÿī`čŸŻNńżoĪRŖ“_ „Oąüå^|r„‹7öņqe~Ÿć³†ś½¬nø½”atŠĒ·_ęŅĶ$Wo§°,›öƓ¬nłčŹ.›‰2ß’ę,’$rķvŠDŖĀńCQžytŻż ļ~¼Åš€³:gš6“Ļ~Ē©śwß”ŗś€ž™f„™Ŗ Å}NB®”AuÆiv€ė滲ŗŗŻūżĒ»Wņ:­’Ī­{ƒ™aÜq@Ż-Bƒ <ģgPi<Äśķ}2¹:ū›5V·ŠX–M­ŃĘtEL lĖ1ŖśTäĮ)š,`žĪhĄiˆvĄ+żu±bõ„‚zѽųrF±b5}†šŽ Ļ £]U£éo>Ü÷×U‰`@Er…„J‹XŲpŒƒ\+`!cŪP¬“Eš{dv÷Ź\½›E$^I0 • Oam«ČİŸzÓĀŠD Ca;YabÄŁm—e‡WP©µ™ń³•Ø`č2]ĘrAĄśN ¹ŠńˆĮ'Ww‰…uĀA¾ˆŽ*‹\½"Ōņa2zhµmFś< Ľ<ŲȓĪ:­üĒNō‘ŹÖøū G©Üä_™ åŠŃÜ[É1;ä›/Žóž§» Ą»ižšė3¬o—°lŲJ8R»Oœīē§æY歗§øxmĆS!nÜŻēŧF ¹löŪĖYFż|’Y®ßŁēņü>×E0[hšÉµ=–×ņüä{G ųT>¼¼Ć½•rXr¼ó7·tüGF"RƄPĄIśĶ6Ø>?óļ¤B‰‡’æbW…ÜQl» ¾SÉw¾×źJśõ®×u4ŗÉ…Ž>€ŠÕqp¼jw¶Pś š‹ ŌŃh>śtJūU2ł:;É*•j›J­åŲ·­/l8ÉŽF¶e,[AĆ4tldGĄŹ~Ø(tƒšˆ¢šW…²ŁŪ čEōāKŻ Ø…üņ; ¼&Ä»Ū£ąžü†H½e“Ķ7ČŠ ju“į~¦Åö^…±/¢(ø9 Ū¤Ń0y°UF”vöJhŖL܃iZż¢čˆ»Œ łi4Lü>®°•Ø03`?S'äן¶ĶųH€E~ME‘”~/›»%4M"ąSŠ5™¾˜‡Æ&š¢ė Cqm WņiZ“Ū6¦é$ÆĮ>/³ćtUāŽZR„I<āįŌŃ»É*KkŹåoæ6ƒ`[,¬ä¹~7Ķ”É_{f„/ļāõ(Ī’7gYŁ( ©©lVĖā‰SżüņĆ ŽüŚ$ŸŻI11ąÓė{¼ōĢ1/‹rÜXp8/œ棫 WrŌ&?śĪ2ł_Iš`³ĄżGĒ0t™K7’ģ$+š ó¹!‚ń!ąlŻęÖł†|ŒžY‡Jā^§W½]ęĀĘŸvW²vēõüīdkóyå  AųĀX ³rßģź(ÆSśā€„¹ E€fjŗŹ­{ҹū™*„JėĄŪĀį±HXŲ¢A2@4$ QŅeÕ¹I ¢¤"J‚Ø‚ `Ł’ˆćf)ŗ ?-”ĶŻŽ ыčŗ: e³ņ‹ļŪ6o č<®("¦iŃ2óĶ–ÅŌX€p@#Wl°±[bz,H4bŠj;|˶iT›ˆ¶Iµn"É”€ĪŹVŸG!čWi6M‚>Õ]„«19ā§V7 śU$I Pj19ģc{ĻŁ©·°,‹±/wīēčČ®üšŲ —ŪĖ9gœąQłU‚~•÷/'ōį1āarµÅµ»idŁłx ¢H2]„Rk hŒ śŠ5™ i,Ėf fšČį(™|‹r…:ß~m†b¹Å½•‹+9N€€b¹ÅŚv‰ļ¼6Ķå AæĘŹV.sī‘~Žæ“ĖWŸf~1Ćģd÷>Łę±“} öyXß*ńɵ‡§Ā¼õŹ®ķ±¼–£Pnń?8ĪśN‰‹×÷øz{ŸņÖa<ŗĢĻ?Ų \mńŹ÷Ž2~ęMø‹ģźžÓĻ—‰Ē¼<Ų(šąÖ>s!‰;×÷X½µĻȱ¬„Ų¾»K`,””P=čŽ:­xWŗ÷@øŁ•ä›]Ąą‹RĮvWR·»’~tÆ*]ÆotēcŲ9†Ŗ.³t/ĶūYŅŁ:™|Ė“h“”ђh[¦ąAuDQF8ø‰¢„ ˆNūßõA”¢†mYĪxB“mę‹ėjļtčEōā÷Xé€Wŗ"ˆ|K0:΁²$Šn?dLkŖH„Ś&TIeė“Ū6~Ɗ, \»“¢/j ]¢Ti²±×pd^5‰`@sŖš°ī˜™6}1•Z‹fŪbØĻėČG ź “zĆdlČĻī~•¾°īĮİŸķ½ ~Ƃ(€¢ŹÄBWo§TbA•`P'äWųčJ‚‘!ဆףŠl™x ™¶e37btŠĖ­{YZm ŸWalČĒøx#‰mYŒ x™›’É7ø~7M³eńö+“d‹M’é–ąÜ#ż<}f€ĖóūTjmV7‹üšķĆÜ}C•%ī­:æó‰¹æ½øĶ«Ļńo’~™gäņĶ$_{zIŁŚ+sc!ĶäH€·_uFó‹*Õ6’ćNq­ĄƒĶ"7Óüč{GŒ{ų§’Ķž·’õSž~9čOVyē£Mžģ'2pfˆāFž^œ€ńb¾ŹÜ”Ø3Šl! —ē÷~¾É‘>Cęźķ­¶ĶPæ—#SaR¹:KkJÕ?ųę,‰ż ėŪ%®ŻMóĢ£ƒœ=ē“ĻŹ-6wJ|’³,­å‰„tV7 xt™ćsžī½u~ųöa~öžŠšŽ§Ū|åÉaTEbu«ČŻūYŽN‡łŹS#Ü]Ī2/6üÅ޳¼–ēśŻ;%Ī`āé·8;\äĒ?ł[F‡×?Ÿ$kÜ»µĻŌX‚ė·ÄéÉÉ, „Żd]Is“¾ÅC2`G ø#õŪ©Ōņ^·n@·3`G"øZW· #$}tŗ z×Ų év#š ؈˜Š°X\)qõN½œD£­B§ŹļJüµ’»u.:—P "ˆŖė_ŃŗS¬X?ė ½č€^üŽ„” Ė ģ‰Ærē,ErˆmÓF’Į “‡¢ģī•)”›H’H_Ō Vk²±S"‘ŖŃ6JK‘ʆoł _åęb†™± CĘ4mF|$ÓULÓ¦?ę!_lz(W½hXg?]#Ö©VŪų< ƒq ņ õŲšĢ@Ģąņ|’ž˜]“4 ]ęžFŃ1=2ŽE¶Š \n鄃ѐʕ[)gKA—ņ#I" r“Ū6#>&†}lī–Y\ÉŃjŪ|ūÕi „«[.ŽHņņÓ#żb“rlŻŁcpĪ yZ‰RÜļ$öb4—(HĶ­ĘŪnBÖŗŚōš›Ä.(ų¢‡@·s`7 ® J.ąš|įČi~p8oqłÓ&ó~›rĶv¼*~‡g ügžA@TlA[ōśü?+—Ė=·Ą^ō@/~?¢\µĄę¦G—LAą+tł§˜ÖĆi®Ē©×MŠå&…²#Ģ£ŖĪąĘN lšzL[ PjøŻGūæŁ²ˆ…t–Ö „š3ć·aøßĖāJŽpPcøßC”ŌdtĄĖö^]“5’)GæTi¢«Žę’Ņjø$‚ĒPé{ŻżØŖH4Z&µŗ‰$ ų ™£3aʇüÜß(R(5‰…tāQ#ż^>½±‡Ē‰†tāYäĘBA˜ 05źt#äh›ųõiv÷«$ö«\ŗé˜M¹³œ%_j²—,ó_½u˜O®ķ12čćĘb†į~/S£īŽĻrīT?Ÿ|–ąĢ±8’ļÆVxėk“ĪHĘe’Ÿ9ć•gĒx÷ć-–Öņ„X9ó\”GŸŸcžĀ·—s¼żŚ“#…ģ×xõå)N‰ŃØ·9ūācĒūŲ^ŹņĢ›s(Ć1¤|•©³ƒ ‡ YCŠy\R`4ÅMČ`·&€ņ…ö½Ü5"č|Ožž×étV ;zFW‡ {TŠ9‚\Ą‘7ųš=‘Ķ”J*ץ¶Ŗµ:Ųū_€Šņļ? Ņ1A æß¾T*õ@@/z æŃlŁ„Ņ%Ė",<ž;„•ķ¶…iBµnŅjY<{v€¢ šµ3“QźM MsZČé\AtŖ’”>/Ŗ""I";É C>Ē7Ą†é±ŸŽŲ'Ņźó/6ˆ{H¦_ŸW![ØJMBŸOa3Q!Ō›OÅėUY^Ėć1d6wĖH’€Ŗˆ”+m†||*#>nÜMaZ i„Ż5Ā÷/ķā÷)ōEC”€OįƒĖ»x=2“£!F¼ģ&Ė,®ļ¼6ĶV¢ĢźV‘‹×“|ūÕi&G\¾™$_n‘ŹTłž‡ųšņ.±ˆĮ½•q/żOo&yń‰a~žž:O?:Čg·÷yééQM“t¾Īķ„,Ÿģē•ēĘųÕł žĻ÷ßrę¹~^x쯘’ųŪÉ£C~R™:³ćAĒÉ1_g0ęai-ĻH@C1-.\Łåųh<"‹× ‹ƒ(Q]M£Œ†„ÜŖ‚døI¼Ż•ą[]müN‚īÜw¤};ÉŻźźĄĆ¶·€‡sžŽz`÷*bēß5Ų»„pgId7cQ¬+ŌH­fƒr„†eY?‰š_ˆ‚ <)BÜļ÷æ_*•z–Į½č€^ü~D¾dZÆō”(2+ļ$~AÉÕžŻy«, Ž€ä˜ģĢ {YŽ(³¹[bz<„ǐiµ-v÷«öĮ^CFÓ$Ŗõ6+›%&‡}Ž”(rh*Ä„›Iā^ü^…b©Éš€£č÷*hŖD®Ųd8nP®™ų= ¢ LUŠ{Ø6-BM“XZwœ` īEįĮF‘ž˜‡ Oab$ĄĶÅ‚ āõ(ōE bæ¹°C4¬ėD‚>Cįµ=ŽĻ…‰G ūUn-eŠ‘·^™fc§ČfĀ!ņ}ó«ōE >½±G¹Ś&“Æó'oĶqńڱˆĪāƒćĆ>Ęż\½½Ļė/Lš³÷×9{<Īo/nóęצØT[dņ >¼“͟}ē(ćĆžćæ½ÄóĒ#üĶO =¼i‡»ĖY¾rn˜’å’øĪ—vxėkSüw’óĒĢ/¤9wŖŸæž÷ØÖ[ Ē=|va!cek¤¤ŠT‰ķ»ūD|6”›”VRh®@P¹ävź@Õ­Ų;毭Ų;FBFæÄļŠuŗ †ū<‡"Bšy›aaīf3æ”']”i£S,·‘• ß‡¤h`Ū“M“f³‰(:ĘV’…A€<*Ā„ßļ·T*õ,ƒ{ѽųżˆbÅj‡üņ»ĄY¦;[–ė@GNU ›«S,·Ąlƒ(q{9GµaQÆ·84l ]!•­”*"ŗ& „‚µ†ÉN²Ź@Üƒąŗ¹ĶŽ¹pmń?~ŸJ½Ž¢?j°µWa ęĮcČd‹MB~•J­E<¢£i2‰ThH£Õ²iµ-rÅ¢(ā5fĒōG ²…{é*±ˆAĄ+32čē“ė{ŗLŠÆ ōE >ŗ¼KŠÆ éōÅ tMb~1ƒ¢ˆ›‰Ø$Ņ5lž’ģ½y]ēyę÷ūĪwösīÖ÷öŠīF7vB7%Q%Łz“8²"{\žŲžr*[MŹ“T©&U®¤jĘłg’Ŗ¤&“qŹ3©HGöŒbk,[¢D‘āBĮ±7Šh ÷żī÷œ{¶üńŻŪ€(JÖBާJ÷©źźF£»Ńč>ē¼Ļ÷¾Ļū>ĖæņŸxd’ĒŸ½É§?>ĖN5$č&üś's÷'?Ć_ž»gł§’ŪlK2½Oų[ēƒ'Ēń=ƒ»ńį÷Nph™}9łĄ$ļ;1‚eHŽ>8Īģƒć¬\ŁęČ'Sšeg~“żĪ‚W„Zėšˆ¼:Ł›}e~¶w"æ=ßļŪkwt ś…üNƳ÷~«÷łśEŸ;¾–ģżż0›×\ξVg·e$†a„–e¢‰^Ž„H]' CŗŻ.Y–‘¦é»Ń Bˆ{€Žć<ŽjµĀĮ“a€ąµfzŽö„¦‰ ĮÄķ'co ¬÷VŖ4Aše4;)µFS‡8…(IŁÜīpāhE­&×oÕB0>ģā9:¾cPovi¶cöø˜ŗ†Š4f&|ž}i•ĆÓ9ņ9›v'b“ārk„ÉXÅ!M3ĀnB)o„)yß Ža§’óL–J°Ų[łv1 ń…„›;ELĆÓyžüŽ9_Å— Će‡ē_Y„2äP)9ņR¼üę&šÜ{WĻ5ø±ŌąĀÕ†‡l>łŃęnÖøvSŁ’Ö§ć::ēv¹~³NœdüīēŽņķē92[äĢœ8Z¦R²øxm—?4Į·ž[äż÷ńō÷—ł'æ’^~ż÷įæśo¾ĮŹ„K¼ųŹ"ÕfŒ¦Kā$EłRĻ7šIš”i‚f;¢ŃŠŠ…ņnxź{K®­sd¦Č7Ÿ»Éž‰Ŝ‰ļ™”KO~o™±Š£LŒ Išqan]×8qxˆbĪdžVė·ŌfĆ'?:ĆՅė[Ī]Łę7?uĒÖ¹v³Ęźf›4ƒßłģ¾uj‘GŹ<õĀžĮŠ5®Ż¬ńÉG÷óė’č7H6—ło’įWłŽ™6k)¦) »)–„QŹŪģŌB 9“÷be½ÅÉü÷ž¢8å—>8ÉC'F˜÷yģ#Ó><ÄżGĖLŒxŒÆpų}ūØ/֙žČ!†Œ³ta…ƒ; Å¢*ųūK@A|ǧÖ£żõĄžv€xK—Ąķüū#ųŽ@ŸL@0ĘŅ‚N£“’I—n,°m˶Ѥ‹%¤®Ö]ĒĮ“l C'MSr¹¹\)%RJZ­q¬ōzļ‚&ą=q’›f³Ł<€~aPo„ėO¾š‘}6Ėz;ZB™JŌ5Ae˜†F„čPkDdYFŠMh¶"šžĆCtåČwu”NeȦ\“0 ńWĪo໪+eóM CćÜåMŽ()gB!Č{: +MĘG|‚ &[ga¹A'HĄŲ°ĆhŁAJMy lԚ]†‹¶ź0LäxżĀŗ®Vó¾ÉžÉ<ńķyöy8ŽN„čóMž{i•}£>„‚EŽ3 Ā„K×wńƒļ®`š:®©“’ōDŽ?4Ī…¹]n®4ø<_å·?{Mœ½øĶźF ×ŃłĶOęĻžśŚ^Rąƒ'FRĆI£N7Nł—’ļv[Ŗ˜iB  ö¢o5Mģ5ÓŪAB½Ń%盓:1µF—}£ŪՀÕõS#Ļæ¼Ā™7Öyļ± ×^_ć¹3+œ<9­6Ļ={“c'G@d\žž"•C£ź\«m÷Nō­;NüÉE’Ī]’Bļcļ ‚Ūz0Lg³ĢŚfFi$Xd™†ė: 4<ĻC×MLÓÄ2u|/‡¦)ƒ)Ć“H’”b±ˆ”Ó4Ńuß÷bcccoš.“,MÓÆ×ė ƒ'Ā0Ą/ X(ęäuąSB`ō¼ś©jio¼ŪRF‡F†Ō)U 2šķĻ18v°D«‘óMŽø“Ķč°G¹ØŚ½ćĆ./Ū ē› m0T°HRøv³Ę±EŗQŠŌ4\Ē`u½ÅÄØG·›PoÅ,®µŠ„†ėčxށaHt©NØ#.Kėmšķ˜BN‹™}9^:·N>gö>Ggv*Ļ_>¹Ą”é<Ž­SĢ› åM¾ūże&F=*%‡JÉ"®Ż¬b™’ūW0MÉÕU®ÜØrׁ|p‚3g×YŁhsłś.æūkĒčF)·V\½Q#ļü½OāÉ–82[äÕó›ü’üļqߨäæųƒgłæžäQ*H5Ū"•·`čŻ8„ވplÉN-du£M©hqk¹Įó/Æb[:¦”ńæüńė\æUēž÷ ó/žäMWš|ęć3üŁ_ͱ±ÓįįĆCœ~~‘±a·³vu“©1ŸŚĶÜnlV«½q€*.·³śBAP ~źk L°rÓd·‘¢[9Št\×#Š<ßĒu]„X–…m[8Ž‹iź¦I>W ē{øŽC’¦ ī½÷^>÷¹ĻńÉO~]×9žüŽHą&"MÓ õzż…ĮÓ`€ą_^NSv5_žkE€¦©¬õ A½Łer<‡ļģTC„t‚˜F3Ā04ī:8D»į{&—ē«”ņ&„‚EĪ3©øœ»¼ÅĈ‹gÄIĘŲ°K;Hø±XēšžõV„ßĖŲ®Œ»\»Y#IT†ĮĢ„ĻĢdŽjØTćRƒLi –×TloĪ3Š4ŁÉĻžYetŲŵu\Ū`bÄå[§n±_ž¼gĻY˜†äō«kĢNŽ“Ś×nÕŃ4Į}wUpmÉł«;Ģßjpģ@`’KsŪ\¾Qg~±Īļ}ž.j.×oÕxżŅ6#—O}t?WŖßm×.lqļ]Næ¼Źs/­šŠÉq.¼°ÄsgVø’¾QĀkėēć8BhäóyLÓB× ,ĖB×u¤Ō÷Zż†abš®ėāŗīŪ^Ÿ_üā™››£Óéģm¼“ȲLkµZ’*˲dš4`@ų…C½•fž#N“‰1!x@ÜE“¦Y/@å«ļÖBŽ(õFD+ūÖõķGf‹ĢģĖŃhE“ƒ„ŻjH©`SĢŪŲ¶dbÄēÉļ-1;©ZńRƒ‰QŸÅÕÕFÄž Ÿv'ʱ V7Z ®­,‡ ¾I«œ÷į!‡ł„&ß@.5*C6s ULCbšŪŌ90•ēÉӋLēФF1g2Zqyāō§ó8–ĪhŔي8uG9ś•mņy›…å&ĖėMr®Į}LJI’ŒK×vXŁhsļ±2÷ꬍ*W®WYßźš»Ÿ;ĘĘN‡j=dv*O£qżfž„71L­WlzKw½Nzg*dWÄIJ¦Ų¦ds·C¦r&+-V7;ä<õ3yö„ržJBü³æžCÓŽ=Ģ’žÅ7X^ońČŻ#|ć雓ƒ˜÷-sś%å0 Ü8§üü0TZ€Š» šśE¾Ų+žżGF_zŁ’ū<­Õ1®] S¤*ōžŸGÓt<ĻĘ0-0„2lWa“Ņ+üżā· ~ī<ż²y£ĄÜbH®0DghŅD‰iŖł~¾PB‰®ß©ųéqńāE¾üå/óā‹/²±±ADQōnœž¶Ó4ż£f³9°`@ųÅE³Fy_~ų°ßŠ5wÕu°«’ć$£ÖłĄclWā8%Ķ 6wŽsØD!g"„Ęāj ÓŠŠuI„dćŚ:9Ļą…×Ö90•Ē0$¦.˜ĻńŹłMt]ŠhĒ$I†Ō–„c’R΢ފ(ų&­N‚mJŹ›•Ķ9ßܛ­ļUn}£›(œk°oĢćŪ§98G—#eå4xś•Uķ/`[’ŃŠĖŚf›Åµ#C„‚Źø¹Ü`c'@×%÷/“$šņ››ÜZmņŽĆ-šĘåWšdĄGŽĒ_>yƒ§_X¦ŃJBå1ōUž²wü×z†FdŖi=;ę(V¢Ą¾Pß ©ŃŠˆ›`» ¬n¶¹µŅdrĢć›ĻÜdu£Ķwó߾΋g×yųĮq^xņO}o‰'¼¾Å7ž^ą¾Œ!7_[£83‚ZńėmćŽĒ†r LW \ŗ"YŻĶpż"šŌBDzLķNćga©AŲM‰ā”F+āÖJ“÷ß?†®+ŪŽ7Æīą9:ŜE>gQĢ™dĄÅk»˜Ź#Rcf2Ē…«»ŗ†.#e—#³–ÖZŗĄw Z˜BΠъ0uµ9°±Ż!ē›Ä)ø¶¤Rrx­— (4õy£ß|öĒ•Ź%M^»°É”éģńҹu:A‚ļÜ}øDšĀéW×ŲŲī0;•ēż÷QovłŽ++hš`Øč`Ū:i’Q)Z$I†”kaBšŖŸcšŖ"$„ I³ž0P4MąŚFĻ‘1e“āąŲ:NĢįYe†“¾ÕęŠL‘O}l?fÄ£ļŪĒOŽc™’_~dŠ|ĪäČL‘½Ķљ8VfŌÖ±Ž’›C)žūi}6?õ;賂k«‚$Ó ŗ)hYŽćąy.†nąŲFOŠ÷³āŌ©S|ćßąņåĖt:ā8¦ŃhP­VI’wVŸw'™HÓōĘ¹Į]?Ą€ 0@µf²ķ»Ś÷…ŸĶRÜ~”Ņzėa7C×[Õ×ŃłĄ£,®6 CµŪ®ė[>ōą8õfD¹hsįźyß$ē|“œg²¹Óas§ĆäxŽz3bu³ dŌ›£eĖ”QJ¹h±ŗŃ¦ąėH©†Ŗwz:¦©±µāŲ:qœāŲ…œÅ…k» l„&pĒÖ9õ²jżkš`¤¢fģ×n֘ó‘R択<—ē«„aL©hSš ĘG”Ó`’d8¶Ī½w•É2Ø5ŗ¶m”i?ż#ęĢ™3|ķk_cnnŽ­­-’$Įu]¢(" Cvww©×ėļøųļĪÆ•eY­ÓéüĻA“wū0ĄoA„¤_‹ćlE>'HMcĻĘ”O€.• mv2lj£en®4Ā„(ÉØ·":˜Gž`s[ĶÖßø“ÅųˆGĪ3š{"½Ė׫jENS#ƒ}c¾Šń}y•ƒÓLC’„‚Å­•9ßB×qœ‘s%vLŽ3ȲŒŻF—RŽ"ŠR<ץ¶$—ę«Œ»¤™PÄŅxłĶM¦'rX†ĘĈĒĀbf;¦\“° ÉģTŽ3o¬cR}ƞÉä˜Ļ‹ÆÆc?{‹ļ¾°ĢÅk;”}‰Ōu޼²Ćō„ĻpŁaaI‘•ƒÓt ŗ.•ŻoĻ]Ų;é§żŗ$” ßčLSĆ4401ģRĢ[4Z3“9<1ĀÜB•?4ĮśŲ!:aĢOŽóŃ÷ļ#N2>ū‰Tė]Ŗ Õ­±…Ą¶Aōgż*šÜ3/_Ž ‹L¤˜dų¹<†aĒ1žē”I]źøž‡eŪ?õ5õµÆ}§Ÿ~šĶĶM:B,Ė"Žć=’’z½N»Ż~G Ą[Š?Ą©V«õGQ” īō`€Ž‚ŻzBšrĪ4DG|šĄ8ė[mJ‹—Īm°ĀĒ0%¶„cŪ­NDšĀĮ©<Ž-Éy*\čō«kڟļĶĒĮutW›”‹6I¢NÕ¦!•vĄÖÉ2č„ ¶©‘$™"†ĘübƒŃ^ōpeȦÄÜXŖ31ź!„`f2ĻŁK[t‚„‘²ƒiHķĻóĶgoQĢ›ä}“|Īd¤ģ°¾ÕįŽ»*¬m“˜æUćżN21ź1\vŲæ/‡&£>®k„*;ac;Ą±$¢· Äm[`zćMėå1Üį¾ŪßH{Ä Dj|¬ovØ7#Ķ.»õĖ”¼šź›;£OœZäåsœycV'¦Ż‰™™š±%ą÷VüŚßłĖ„ÅMz;#Ķt„&!Ė0LŪ¶IҌ|.Ł3ōń}© t]WÄO€ ¾ųÅ/ržüyšĶ&BŅ4EÓ4Ā0$Žc Ć Ńh°¹¹I»Ż~7‹–$É?ŽŁŁ¹8øĖ€ųčFŜ|©§|8NŠ„T§UŁ;Įö÷Ū/]ßå¾»Źģó¹±T'Ž3‚nĢęN€” Žwļk[<׹+;Œ–m\Ū`k§C·›tÕl昷0¤Ąu lSć„sĢLęŃ˜¦Äµtn®4rčę!Źˆŗ*½Š2%š=£GFŹvĻ“Ąe{7äęJ“ń)5f'ó¼ü¦RĖWŠ*©ī®C%¾ūĀ#C6®-™_¬óWO-PmtŹėärźėłžĮ•ł* fØ`qęģķN„ēč\¹Q”§B³'Ź@ÉŠ5’4Ūė {‚ĮtO©® *‘„cėlJbœ_lŠ&F<¾sz‘Õ %Ą¼8·Ć³gVˆÓ¬ē311āÅ#žD²šZ—o<•±°Ņ¢芄!ŗEšēł¤YFĪ÷0L Ó4ń}ęć¹ŽO¼ö÷ā‹/ņ'ņ'¬ÆÆsgųž‚0 ÷ s°¹¹łŽ­ž½Mń'˲[q’ćV« īš`€~ ź­4õķ9©‰‚_N„ŌŌIU—bĻ2!X\mņčĆų®ĮājS2vj!Ŝɽw•i4#„€«7jTJ6k[m,SRrxęĢ ū÷ł8ށP,Øč›Ww8øæ@Ņ+ģ¦!Y^o3ųą8³“y*%›}#¾göžE)ėŪm¢8„Ÿp÷ĒÜ.śżq@ߕłĪ”>”’R†Iļļ”юh6#‚0ęõ [|ļÕUe¢TPł QœEšģĖ-Ö«õ“"ƒ(N0L‡ ńżFĻŹ7NR,Ó Ķ2*•2Rj†‰®K,Ėž±ķ’……¾ō„/qķŚµ½0Ÿ ŌVC ė:N‡$IHÓto °½½żŽµ’Äé?ˆ¢čænµZ[ƒ»z€`€Ÿµf—ņņ;Bˆg“iv»č*õē L˜_jšéĻŠhvŁÜ z«lÆļr÷‘!ĘG<‚0Įµu†Š6“£Óć>¦!™÷xü¹EŽĶ0M *%‡„µ»µŃŠƒsuĀ(e§0RVķm)U[=ŽŪ ÕŽÕž}OŸļ‘€z³‹ļ™€`jÜēņ|• §ś·LC3Eö咃eźAÄ+ē·ø8·ĶPĮb¤ā1^q ˜į!Ļ5°LI;H°-k7«=EĮ󯬢iĒÖY^kļ~•oŠ„¤Ź(M{ŪųšśŃ#Y}± 2dRć)µz—V'””7¹2_„ŁV¤ÄŠ%š@y$iF;„ó×a½*Ų©lÕT#ļ»i’¦)¶ėõĢwĄ2MlĒEJC×1 Ė2Éē Ų?FųŌSOńõƝZ­¶mĒ1š¦ķģūäAÓ“=1`µZ„ŃhģuŽ…āOš¦Ļ¶Z­Žķvāæ`€~JŠ)åäńX–2œrŪ(H×AW¦V[Ķž?’+Ł­‡¬ouh¶b4 ėÓ0ˆć×ó°Ó4š=ÆŻką8ĆĆĆ?ņśųņ—æĢ«Æ¾Źöö6qĒ1išā8õz}Oń/„üBŠl6ŹÉü  IDATi6›Ōj5Ņ~{ä.ž@Ēńģģģ¼9ø“€ųŁH@½˜“Ļ€ųOŅ”¼:É©†µ. ŠuĮN5$č&|ścū¹±T§ŃŠčF)a”rżVBŽ¢Zļ¢ėWę«X¦Äw r¾Śį÷\ƒē^ZåųĮ"RjhB03™ćõ‹[čäsY–‘óLjĶ.ķNL!gэRLS'č&tć ×Ńi¶#t]}4…JÉf}«CšeJ¤ĢNę8õŅŖņ)p Cr`:Ļ©—VUBašD0æXƶt®ĢW)ų&ė[mLC²[92S$ē™tć”GĖĢNå),ņ¾ÉԘćčŗF½ŁŻ[LSˆbU¬MC£ļ¾Ų/öR£#¬Hčż¼ūBM“ƒ˜nW1ĒÖqlIʀF7ŃYݵHRICĪT› R$$iŠ&M4!”č/MńsyŅ4S1¾RǶmtCĒ2M>ü¶×ÄŚŚ_łŹW8{ö,ŻnĆ0ŠuÓ4év»A€mŪH)év»Äq¼gōŠétöę’ļ“ś’Ž×ÆeYö? Ā€ųłHĄV1'_ˆĻ&Ięō‚Ō8ĀP¹.ƵŠDĘ'?:Ė܍VD'HŠ„Ą2ut]#ē錍ø¼qy›BĪĄu ņ½Ż{Ė”<ūŅ*Ē•0u4ƒƒū |ļµuē.oÓéÄܼ‚m)w棳%ŽsØČŚf]WžŻŽ|_ӔّźRh(ᄚėR¹f=Az‘ĆizŪj8Ķ‚Ō#C’¦żUĆ;m{UatA:A@©TTŀa8ŽK„2Ģ#<ņ¶×ĄŸ’łŸÓn·§P((BÓl’¦)–e‘¦)Rʽ‚Ÿ¦ŹŽXišD‘Ź”h·Ūloo’\§’õ¹½÷?EѶZ­tpē0  šów(ęō9!XEˆ_‰ćLŽI¢(C×5._Æ2³/ĒGŽĒ™76ĮĘv]¼yu—O|hŠz#d|Äåō+kģuŃ I1gQșT]ęź˜Ģc™ŗŌ˜žČńÜKˌ”=|WĒŌ…œÅāZKµ“NWiĀ0A ÕoõH@Ņ+Øå¢ĶŅZs/žXJ}c>3ūņ½ų݌0VŪQ¤Bs,SR­,®¶°LÉŹF›f[µõóžA³qāh™œo’s ŽĢ–84•cjÜ#Š3ī/ą»+›-ā$ėy%ØÆŸeŖC”ŗćŹy±æØ 幊Æuj„ŠÆė™:Š£aę#½±č×| © ū§sÕaHz„#&I¤®“ĻćŸųÄŪžžüqNž<ÉŻwß­V{m’jµ °'ę‹ć˲öž=˲H’dOł_Æ×ŁŻŻż¹Ō’?jīß{;~gmmmqp×0  šŽ‘€„R^C@Œą#I¬’aMö£nS¤Ōø0·Ć]KļŌ©ST*Ž?žC_Ó¶m<Ļ#ŽcĒ”Ńhģ‰ž¢("Š"ĒAÓ4ŖÕźŽX Z­žś’Īļļ§%oy]ž³åååĮŽ’0Ąļ H ¾|VÓÄ!2NÄIĻ# W¤ā;2WĪĻm„ ;µ°·;ÆÄyŪÕ]j|č”qV7Ū”‹/¾±Ī¾bŽÄwt&F<^9æaØÖ}ßxjÜēŪĻ/rl¶ˆ.U[;ē™\]ØQș†$ÉĄµ%ĶvŒļźŻÓŠˆ’]č½öųŅJƒZ3Bh’4Ļ1Š„ś{µM 2ō“Žśćn­ĖŹZÓŌévcn,50 ‰ėH ī?^AdG–(ę,ŽĢ™šČQoEœ.`čŻ(„&“;1ĶvtŪ8UÖĮŁ^¹{ź’$ÉČś#-Ņ”½Ķ¼’G“ÕPsł8Ž‘ŗA„Rį÷~ļ÷öZ÷ApźŌ)}ōQ …Āüš¦i222B©Tś‘_Ÿ`ō7śZ­ĘŹŹŹžąo"+?aŃæ’§®ė’¶V« nŅ`€Ž-Ԛi\ĢéOep0I•c@Én7ChJ¹ŽR<[rp:ĻÖnH§')Ėė-|׹äŻ#lļ*ēøsW¶v1 ‰ļźLOäxņō"ŜI.g!5cé -ž}i•“ł=‘\!g²øŚ¤T01¤ N†®Qk*€.Ż8ÅŌ5‚(en”Īār$N@hX–ģ)ęUpM'ˆ‰ā“ēcŸtS‚PŁūš¦ŽmiD —lL» ÓūrH©”ė’n7%ISvj!‹«M¦Ę|._ßį„s›Ź`­Eµā90!I”¹Q_ŠÆ…wfłÖā’ć €Üö>.˲½bŪét˜žž&—Ėqśōiā8ęį‡ž‰Æ…¾_€ć84›M‚  Żnļy$IB«Õ¢Óé°½½½§žļ ļ,šżÅ[\ńļ½½’eŁ?XZZj īĪ`€ŽutKyż Ė2&ŅTͰ…č{ØŻõ LHҌōī KMč&llwv9r H½!u„•#e—œg uÉžÉ<õŌ“ć®­#5A1oa’—ŽÜąąTž p,‰eI–ųž…mj{†:Acč) NT!,ęMV7Z½Öæ:]giB©•¹¤·= 5„qŠ„F)ƶ|×čéå’ ŗ±XS;õ¦äĀÜ.×oÕČē,®.TŁŚ v9u)Gf‹ÄqJµrh¦Ąž Ÿ­ŻŗŠIļēØķ…0 łŻSÅæ_ŻłÉ[čo=agY†ć8\»vÅÅE{ģ1’ˆż’˲Ē÷}Z­­V‹(ŠhµZ“Z-¶¶¶h4T}–RžŠ÷Ņ’sƒ@Jł¶'ż·)ži–e’ÓŹŹŹSƒ»r€`€’p$ UŹĖ'āÓiJ)ĖŲ[ 4zFA¦©‘e°±Óįļ’ź¶vU˜N;HČ2XXŖqh#3EZķ.µf—ÕĶCEß1šŅógn23™Ćµu²,£T°H’Œ7®ģp`*O–ečŗÄ04å¼Wč%Ųõ"xŪA„eé*½0ÉXYkR­‡$éķSvœØ¢oō6\Ū ė')Õ!ķ%"jŌ]V6ZJ § .Īķ¢ėŜ…eIŽ(Rkt9q¬B1o26ģr×”!:˜Ł©<9Ļ`k7ĄŌ5jĶīĪ~·‹~_ ¤‹ŠżŪ'’Ÿav~ūäĶŽźžėŗ<ųąƒüžļ’>ććć?×õP©Tcww—Z­†‚N§C³Łd{{›(ŠŠ4ķǶś…DQ“Gī,öo'”R>Ēń?0ż`@ą?8 H«„¼|!~5I3øm,oĒoķl×~ū׎rk„©rŗ1Q’qõF•{•vÉ2ŲÜéģ‰ė 9 Ū”ģŸČńõļ.phݐئF1oŃiG\_j01ź#5å`›×o5(¬ŽŗŸŚŗ)9ĻäĘbV3$AC×{{÷=””ņõW¤%Mā8½mÜ#” ŠRā$ƵÕ( ē›lļĢNę92[`m«ĆńC%ՙ° :ŪŅ©7ŗ\™Æ²ŸĻÅkjph s;4ZŹŠ'ŽÕ8„Ÿ¾ØKH…fä@Č;ō~āēų­ ņł<år™‡~˜?üĆ?$ŸĻæ#×C.—ė‘1÷½ļ}|į _ MS¾ūŻļž«ż"ßł›ŗ¦iV„”Ÿ_\\\܉ Ąü퐀µRN¾†æ–$™%ī żg·&`y­M–¦|žW2æXg·Ž„Ós²»~«Ī{ļÅwtŅLpc±€ļ™j abŌēkß¹Į±E4MĆŌå!‡•õ6ėŪm&G=ālSGÓė›ņ=ķ@”dt» A³¼Ś ĶnĻ”„&0tAœ(7¾4ɔ@•*  ²4#N IĮ±%®­“f`MØqĆpŁ”$,,×1 uK^ŗ¾Ė­Õ&š¼|~“v3>ģńņ¹ †‡Ž*±S ©÷¢“AåØżż 4aä{'ńS·żßŠ~¼Æļū|śÓŸę _ų®ė¾c×B«Õbww—O|ā8p€ūī»Æ|å+“Ūķ·-čišīĶ’ū/wŽīüœžkMÓR×u’`nnīÆwą0Ą»$`””—s >$™!4Eś-ģn¤,ƒÆŻl0Zqųģ/Ļņҹ ZAL»”ė’[+u>üŠQ¬ęģÆ_Üʵu,K2T“1trÉęĻÜäđ”½‚8Zq˜[Ø„ •’C’ļ¶vņ¾A³séś.­v—v'M™ćöõńI Q¬āx³T™鬜Ÿ8Vį;¶„C–āX:IšŃ ā="P­‡“ƒ˜Z£KŽ7¹|½Šj•0ē›-ŅźÄœ¼{˜bĮ¢\“84SäÖJ“õķqœ"P+€R 5–VÆųK@üDŠ’]× ĆĒqųŲĒ>ʧ>õ)fgg¦U¼Ó4ū”÷;ŽĆ©S§~`ąĪ¶~ŸŒ)s)mĻ·ą­BĮž’ƶķS­Vėæ«×ėƒÖ’0ų š· ×Ö.éRģ !žNg}ƙ^ė¼×ŅÖ5Žø“ĶhÅå3ŸįĢDqJ»Ń b–7Ś<ö”)ĀnŠė¼z~ƒBŽĀu |ĻĄµu\[ē¹—W92[Ü ž™ŹsöŅ6„‚…ŌĄ0%P)ń-C#笯׺Ń;髙~Ņd½Ī…ėH‚0!°LE’D 0JU q’õ¢{•amė…œ;Xdr,ĒN5ąčlĻQDAJmJę,®6YXjŠhF¤i¶ś£:&Ā("4‰xŠ’¤=44Ä”C‡øēž{8{ö,ēϟē¾ūīC×õwõŚøēž{ųźWæJ£Ńų‘…’ķ^ś w`·Ūķ~~iiiep× 0Ą€ ššķ”R^Š…ÄI&īŒ&ƒ8NŃu³—¶¹÷®2}x’ē_Y%ĖP{ń­ˆÅµ}xĶVD©`qśÕU&F\L]ໆ J2^;æĮ”żELCĘżūr¼šź*–©SĢ[d€kėģÖCj͈ÅåQzŪ~×04ā8Ću Ņ4Cj*·>ŠUŚž&AWéLS’&q,HŁóź×5gOk­<¬½7Šd³Ł@Ó&ÖWŻ…ĘpĪ9’[’’żß·bfśŌÆtšėPmÄ,€·@(×Ö¾ļAń/OŠRJĢĢĢą…^ĄK/½„„„%ōū}|ģc{›šī½Ęęę&޶ x»æe PłõœseYÖ·““dZ’†%ō†B¶üēę|DJĖ¢@qś•RŸø9#xłĶ|ģCÓxų“xńµ-¤©Ä(Ī!„BąsŸœĆŚÖ³Ó>žzn'ŽÕįŗ­†NÓA8Źpi©ł¹:›œ>Ńďž½© gAI‰\@’,‡©"we¹{ŸK0ŠŹ7_ŹŅ:W«„“ņ€\‡U·ćŒV{ė„D£ kŪc,ƅ8>ąĶ«½Ā\ˆb¢ķįŌqŻ7Łü¦™€ćŲČŠ€m{śće å=*ž”Rt»]ģģģĄ²,xž‡Į`€W^y?ü0\׿gł¹čv»‚Œ1¬ÆÆæk°mŪÕ`?  ”ž,Žć’f8 sµ`pōH€h׳Įr_¹JRø궗¹ ‹]<śé“8Ŗ‰—veį(Gw Ė$¾ü»'±¹=B«įąÉŸ/ćō\®ĶąŗĒ&\_b«›ąōlP¬ėÜ3ßÄ?żls3>~żŗ¾Ļ$NŖ‹µ” V9ĢØ’E–7}œ1Z­–VĒRiQ£,āz³\[üZŒ Ė$u„tš6Ö¶ōFĄ±ÉÅvĄN/ ‰Ä`˜]…ĄwÉ2i¤ļÉéæ,žœóŹ»?Ė2ų¾8ޱŗŗ )%®\¹‚łły“Ūķ÷ügĀó<8Ž˲Šėõ°ŗŗzŪL€·~® Y „ō_///›°C Ž, EÖnšų4N)µ·ƒĪAšé7Ž~óś6’½yLv<\¼ŚEšéŁśN/†RŠįA#LOxųł k89WGąqø6ĆÜL€×/ļb LOxPŠk|'ŽÕšŪ7všįū&°±!N¤&eāJQA’źż{m½«OåœŃ=/~B@‰Bžėٵ¶óPW{(„Ąøī PBą¹ ”1.…ēZPJįāboUځķŻ”“ļc7tÅ“źP”vĄ‡E) +½’ó<Ɗ©R ćńžē!ŽcX–…Ńh„K—.įܹsčt:ļłĻDš}ķvqc}}½zL·"ŽbĄ¤”mß÷’) ĆĢ\e†ŻNĄøUē?š%ÓBīqN'zē=N^æŅÅ~ł8#xs±4XŻĮ÷8>ńą 6¶Gš< /¾ŗ…ŁéõĄ†mQĢĶŌšō kp,½-Ą…mQœœ­ckgŒQ” WŚ8—Z‡@©īH(Xœ@é]‹Uūž”–§~½(@™^”° ”öŁwm}Ū,ąŒ!Ķ$6wcpFpłśs3¤Ņbæ0ŹF)¦:jõ>ōČ"'ā8D–¾Ć]ÓņķžT>ąę5¼8Ž‘ē9²,ƒeYX^^Ęo¼cĒŽįĉļłĻ„ļūąœ£Õj!I\»v­:ķļ/öļ@ !äJéż¾ļ?†ab®2C Ž(ś”“ėüĒ„ÆK„šJ¬XŒ N$8#FWųó?ø£8ĒՕ!āD Ė$®­†8y¼†{Īčö9£ W{86å#š-86Å©¹~öü*]Łü¾¼° B€$•ϾjƽOuŲ‚ź$CŻā/ćzĖBdŪL0(zDĄĖX_„W)£•Ɓ² H²9E£fk‡æb}p§£Y·Ńlxč“ßĮCæóLLL`FŲŽŚD–ėtĄw3ϹŹ5:!D%ø»Ź‚¼““„ °¹¹‰„„%X–…{ī¹€Žó-ƒī”R“ŪmH)„XYYy1¹Ķj"!„ÜO)żPŃ ˆĶUf`€ĮQķ„b»UgĻ‚Æ ©@+ģQę$œģö\[ ńgß¼ė[#lģŒu‹ųābøŠĮłÓM„£ Y&°ŗ1B»å¢X°-ŠÓĒėxāée“Ś-»Ż1¶vF ”éˆß¢}æwĀ,m}u!§PJ»šå¹‚ē°Ź   HR¢y€A”ė®BA,8-» :€@×į3¤¹žŗ„C>ĒDŪDZłĻćĮG¾×óŃjµąŗzż†ĆišŠ”jžz½^%ōķҽRJ„aŪ¶+³ž0 ńĖ_žƒĮŪŪŪxąŽŅs7ØÕj‚œsäyŽõõõ*Uš»÷PJō}’{†``p“;+Ķ{ „|Ce—Ž“8Ulj„Å 6¶ĒǾż{±¼b³ ŽĶšĘ•neœf«›#tū1¦:Zńļ; §ēźøŗcč÷ūF!g)„÷}’Ć0™«ĢĄƒ#ˆī@ UēÆP‚ ŸĖ…¢“ ŁŃoÓT·éÆ\`fĀÅ7æxĻæ²…$ĒQœaqeˆĻ~|N»żY o\é!šµC`ąqlķĘxua–Å AŠ„? F”głūŚžå‚sŠ4“ Dū$™£:' “.G²h}ZQ®f² £8Gš d¹ĀĘöa”bz҇ķų8’‘ļ`öä=ąÜ‚‚‚ŹNżm[˜ššć [ŪŪĒ ”¾ė)^)Ļ÷į8ņ\Ą¶mX–…4M«św*¬yžßt’%a`ŒA8Žńć’.\Ąģģ,Ņ4Åõė×!„„ēy‡¶¶mAĄ¶ķJ»°²²‚<ĻBę)„Ÿ*H@d®4C Ž ś”Pķ:Ž“ņH.aÅPQRģÕėāū›×wpöD _łŻSųŁó:š- y.±tcˆ/|śĀQŽ™Žƒ_žfo”ÓņŠØYB"Ķ‹RJ!—#ŗøū.C.²¼4˜AeŒ¢`[z$ģ )Œ{ ‰RŠØķ{=‡UvĒJ;Ż ƒa†Į0AąYhŌ,œ{š;8{’#°-KT8¤ö‡mY˜™™‚ĀĘĘfµ»’Nėr011ĻóĄc –eެj­—f@·+®åה·/ B·ŪÅK/½„ååeģģģ@Qå ų¾h€mŪš<F£ŗĶĶ̓’€S”Ņß}ä‘GžńźÕ«”¹Ņ 008‚č…B¶źü'”ą,@>œ ½X’€żnÆ\ÜŇī›Äļ|x Ļæ²‰4Ó©~Y&qc#ĀW?s ›;cĢNxéĶĢĻՑ ‰ŻŽĆ+ńžÅµBEś_© Eh‘ ŚčOA‚Ą¶X$„‚Pś„]QJ*•’8ÉįX RźC’lwcPŖCV7#Ō} ķ¦ƒcg~g?ųYų¾ ”s@émY}ßs1wā¢(Āśś:²,«ŠīžBN©NѶmAIQuāx Ī-X–!„ļ8ŲĆkŪöŪȆ£ŃĖĖĖ ”¢Óé€1VÜ•R‡Ö 8ŽĪ9,ĖŖĘ›››ÕHāIĄ5‰£ IDATÜööög‚ ų^†Cs„``p4;¢Ug?$Č9½ž··ē €’Ą Ælā÷>uŻ?‰_žf į(Co¢?LńłOžĄĘĪõĄĘ3/¬SZĢéūQŽqœƒR‹³*p'N<—UŌ¤™„k3(U䀥b@&ō‰æŒų%T‹ĖS;£BźµĘŃ8C4H3‰<“Ų؊Ą(A»å¢5łA|ąć„z½ ε °p*“¤ųK)c'O!;;»ưRĪ—§cĻóPÆ×‹Sæ]܎"ĻsäyŽ ē9źµĆ0„eY7ņ¼µųļ?łßŖ;P‘$IPÆ×!„Øö÷-Ė:t°ėŗØÕjp]·";;;ÕfĀ’€ć„/Ōjµļ ‡Ć¾¹Ņ 008’$@¦ķ‚ŸS s„÷~é˜nJæy}~ś$NÆį·olƒ3-Ų„ŅLą Ÿ> ĻåhF±ĄĘvŒVĆĮxœš= Ŗø»Ųł¢,¼…;`1ó/¤ŅşQķČ'%“y”ÅfA’Ź›öõÓ\!M5įŲŚ!ŽsĢĪ'qß#†FkŠPXœé“8”PJ–A7…«ą^‡‚ĄuLNMĆq$IŒn·[9čł¾ ą8޾F „„ gą–)E±M `Yv5ļ/ó’}^üÕ8¢ßļĆu]Äq Ēqąy²,ƒėŗ‡rē&=@š¦ÕŠąHĄ !äŃ ¾†a×\i†Aō†bŌnš‚Ē”B§ÜĖ/Ż“Tć4“xķņ.¾õås˜źxxyaI*!„Äśö£±ĄēŪxõŅ.V6"ōĆĆ(CĶ·ĄEĶeŗ-ņs,­š·,†q" ć…0Péµ?=*Ųó PPE4/ck§?ņ£uJĆ0E–+tū †aŠ™)œū8ūą·1}üŒVŪ3]ü9£B‚1®[č…Č€3Li‘KĄu1OŅ[[ŪXYY©Nۚč–9ēi–W³~©TUčY±āX׿$@•š‡·“żo5/Ēq# C “Ūm4›MŒF#xž‡$IąyŽ]ucš}yž# Ć*@ȶķw%„iBȗjµŚ†Ćį®¹Ņ 008š$ ßnšŸų†TŖ¦OšzĘĪ9A’H0Fs\»1Ä~ł,„Pør}€4“ŚĖ_)Ü؈pe©‡VÓ!Ąē:Čr ×a°,†ķn )<—éŻ¾· $ŖBIiž#«L€R7P: !uf'JėzżI”OX^ 1Łvį{ęīūcœ¹÷cš=昕£ņśWÅ;Jé|F)¤Ņ xŚŖXAäėxé„—ńŹ+Æ ŽcdY†‰‰‰ĀoÆhSBĄ9ƒēłU'3Ŗ­‹9»É\ØŌÜŖųEō¶’oåż\½z333UG Ōø®{h`Ū6Z­,ĖB­VĆx‹ŻŻ]Äq ßóP«×õÅ_Øü-Ė*Öu۟}źgŒkńŸRU.@Õ%²¼õŌ;PŠž’$eYč÷ūh6›ąœ#˲*}в“ń0°,«ŅŌėuH)qżśõƒŽ&!_©×ė?‡[ęJ30ĄĄą¢]g×@Č%<&„²HaTšņTn;ct ¾óĶū°¼"e˜h¹hΜlbžDY.Ńn8øøŲĆśÖ®Ć‘ē²² Ī…ē ¹ŠŻ…4/wüuQRļõē¹Ö!0JaŪ £±(ęóŚƒ ĖD.±;HąŚ k[#Œcz`£“pįc†ÖÄ,øÅBĮ(C.„Ž<(üz3Aū p¶·” ¤Ąh4ĘĀĀ›ųńŸĀŹŹ śż>ĒA»JėS7‰ļ”U‘/·Ņ4Õ« y€ Ļst:?~ż~æ*üwŗĻæŸ0$IRż%„Ąu]AP •Rš<ļP?žē”ÕjĮ÷}xž‡0 †įA·Ś ‚ąĒan˜+ĶĄƒ£×@³Fߤ”t Į—„P“lĒ—é|I*Į9Åņjˆ8ų“Ē/`~®Ž?ūÖ}xńÕM GzW~kw ‹k”`Ķ·pa¾ ©l‹"É$Ā(«lˆi!žRPPRÆ –‚ĄņsåįXŪü’"Xˆ¢7ŠÅh4αۋQó9š 3ē’só„m[ř^!¶ÅõęAń½•Ō$ƒ`/¾D‹ł®_»†§Ÿ~W®^EæßG­VÓ'}Ɗ"»2łÉóü¦Ā\ŗūé™’Ž©9ŽcLNNā›ßüĪĢĻ#Ķ2„aXėƒ×u‘ē9’$ĮĪĪǁļū°mI’T3ū,ĖĮ”;ķvY–įŲ±cˆć›››}¼-BČcAü, Ć5sµ``pÄŠ%: ö"”„ąwó|Ļ(ˆźĆ2ŅLĀāWW˜h:§/汃×.ķ¢7H±ÓqéZķĒp,pöDŒS,ÆFØ×l!A(m1PFĮy±ĪWĢūé¾y悞wł5ś“^$Z ½0Eœä¹ÄņzĻåØ×,Ō;Ā}?Ūõįŗ¤Ŗ2ķAˆž« !“šł—bC)$VnÜĄ³Ļ>‹_’ś7 U1Õ–ÄŚµŠ²ģ›\ūXaąS¶ą³,+:”²J„’µÆ} SSS˜˜˜Ą}÷ރ¹¹9,,,¼-:ųŻ@¹P¢Ūķb8V ƒ%IpqšPJįyjµŚķ6„čv»•0šs“RśX?‡«ęj30ĄĄąčuT«Īž!„Ģųh.a¬° .Ż3-Š{żrÆ_źā„7v`Y£±Ši¹ĀG?4 ×ęŗ„ŸKō†)v{ ,›3ŠĄÓ3óhœƒ’ŅĘW·āµŪ_¹¦Æżż -\™Ē¢:żoīŒ‘gµĄB­>‰³ł6­iXVTų”Ļ”<åB  •ųŖČČsaāō_üuqŚM$)|׆TŗĶnq7Øj‘!deTvō…Č ķ‚Äć?ŽsēĪĮ²¬bÅp óóó˜››Ć„K—0o*ņ·s|+ŹnĄ`0@žē˜˜˜(^æ “““HÓ®ėźēb’z”R ŽćąĘo#!ļBź”ŅÆł¾’\†×ĶÕf`€Į‘ėŁ®³§%÷ø?/öīK=@¹ĒO‹ö¼ i&”¤Ķŗ…\Øb]/G.tēąĀé&Z BHXC„„)l‹Įq8¤RpmZüōm ÷öŖ¤@( ;H …Ń8C˜Ā÷,L“|Ģ^ųŽ¼O‹ė(‡m1䅽qQ½ Šµæ’T”@%$Išź«ÆįÉ'ŸÄµk×E””’ ĢŖ %¹Å&€īŲŽS¹źĀÆ»I’>’łĻćCülˆmYšƒZĶ&lŪĮģ±ĢĪĆŋ—nk¾S ßÉ/€‚įpXi„`ŒU ƒw£ p]ĶfµZ­¬­­!MÓ“€ ž‡×ĢÕf`€ĮQė„"ė4Łš)€œĪ S€qķØ ·¤Ō^’”õĄB»éb¦ø±aqe×įˆĘ9ęf(\¹>@«į 7HЬ۰8«Ņ’€8•ÅZ©\ī8Ó©‚R(m@” pF±µƒ…fĶAsź£8yßēQo4 ŸŽ,ĻA(+Tłe„Ō!Cz__ū H©Ē1._¹ŒgžłyՒO’Žć¼MØgŪÖ^2!·Ŗm€23Ą¶m¤iZ%ū=üšGšŁĻ~žļ3† VC½Ą²lķtčø8vl­V/½ōņmOÖ· –ė…Bōz=0Ęąy^5š(S Ū °,«”÷µ¶¶vĒć‹āń”Ņǃ xq8.š«ĶĄƒ£F†"n7ų÷|Q3BźÜ€r=0š h ē<†Ž A–Kō‡NÆįćĶĄ±(%XŻŌÉ|RžĖĮ(ėšb!Ė%”,ŚöÅź_ŁeÅv@o˜‚`mkŒŃ8ĆTĒ…_ŸĆ‰ūæVg¶ķ€1^<&Zµā9c ūOē„9i¢ćwōć§šź«Æb8V†=e1VJUVĄzŻOŽäæĻ9„“:q—)‚óóóųÖ·¾…z½®7,¾§Åzܲ @ „€Å-œ:}­V o;Yßn,šVH)1 Š€"V¹ –ĘC”ŅC“{`ßdƒ¼½½] ļųE'ą×ĆįšŖ¹Ś 008z$ ģ4ų“Sm½Ŗ§I@£nįĀ| ƒaZøē„#Q½ļŲ ½ž’¾„ü8ÅēŪE1a°-†n?Į8ɋų`ąŲ ²˜Ķ«Ā³?ē †a†ž0ĮDÓ·lĢŻūM̜|–­w×9C‘PĪč r)!‹–x.,Π́ÄĪĪ.^xžyüņ¹ē°±±)e„ö/wß˵¾Ņł®‚å‰_ėX•$ 8ēų7’ę;˜šģ÷GQÆp\O„\[Ė¢@Bpźä)Ō ,,,T+w)že' +6 ¢(B­V«f÷®ėVŽw TŽ?|ßĒī®ĪJˆćų RśµZ­öźp8¼d®6C Ž Ųm7ų/Į7„T~©Ö×Ɂi&‘eŚ/I%@€©¶‹4ØśĆ{ȅÄ8˜™šŃØY„Ö·Fš]äŲ žĆ1N“QcY® ,¤„ČP¢ŪOą9 õšFē#8żĄŌjZĻ˜6žQØNū”20ZģüE»4JāæżķKxę™g°½½]¬ōćńų&Ą9ßĖ(fźBŌėõ"¤G ó<ē qœą›ßų:>šĮU¤Į÷}°¢+Q:RBĄøU8$ąō)4›M\»v£Q„żŽƒ(°H’ćńiš¢Łl"‚ŹĶp’iž°$ ŻnW™yžc44@Č%„|5‚…įpø`®6C Ž Xm7ų« x\H吢$ʼnĄ8ŽēGt2eŚįoåˆĘ9ņ\ā”&qęD„“.-õ±µ;FąYŗ%ķp}ź/<ā8Æģ{…TF8#††a ×apÜ.<ü§ӕūN 7%åØBĢW\“E;<Ķ2,/ߥOžz ‹‹Kˆ¢išV³’²š—mż²X–»’e0%zÄ„Ē Ņ$ʃ=„/>ś(Xq{Ėv“’["G)?dÅķ(„BĒ&sĪqņÄIŌj>^~łÕj‹ą0HÓ“²ń-…‚„m0c쮄8ēØÕj•.`<cuuõ¦ÄÄ;!”ŅÆApéŲ±cÆļīšųC ŽŚ v…²ą+B*NHaā#T5g'Š#‚q,Ŗ­€4“pl Fõ ßŅ”^$@½fćž3md™€ērĉĄöīøjO( eH3‰­Ż1Zuõ©OāųŁĮ‚Ŗ%_äģ&F¤šŠ—)„š”‚Ż<÷ÜÆš‹g(А$IE-z+µ®ėŽdē[¶ćĖĻ%iZ¬¶Ūü韾 Z­6£`Lė(! D²8„” Œ”t]d…_-7ē§ND­VĆÅK—Ō^ėI‚(ŠĄ˜ö#h6›Čó¼Ņ,äy~čķĪyµfŲl6ĮĆõė×ŗ"hSJ暦éŅp8|Õ\m†­.Śuö*!$š{B(ʽ©Żču=ĘŅL§źMw\pN1ēˆā[;18Ó¶Āę[š]ŽĖל:-P(4ė¶6ŚįR*8Åv/!ĄN/Fšę˜l{p½NąØ5¦`YξbPB« J÷Ģ{4   Ā0Ā믿ާŸž śż!„•š®l÷—k}e'”,ųB8¶…$Iµ×攅3Ÿī†üń’1Οæ‹s8¶JǶõVB‘PŽÆ‰7n ×ėWs}ĪyuŪr­Ļ²,¤iz“Ŗ^JU%ś•*ū4MńÉO~_ųĀĄŠĒD…e[PJB9Up±™@ŠL‚Ŗ³ ō×QJĮø…S'OĀu]¼łę›jÆæZ£ жmWĻ•ß÷«nĘa`Y:ĒA£Ńē›››õ °(„_ ‚`½Óéü¶ßļ›‹ĪĄƒ#Dd«Īž&„Ģ+„>L)!åxz]b”Tq¾¢0ö€ŗoaw CrŅT NĘIŽSĒk˜hy °-!•µ×é}›»1ĀQŽz`Ćõ:8vį«h¶'‹}tmD…’śä^Z ļWŠkC!‰^Ə_üāēxń׿Ę`0¬Nɜó›V’ŹØŽ2½oŒoI Ęć1lŪ‚R õzßłĪwŠØ×tqązZuŸ&©>įöʜRŖŸT|TĪā A¾ļōlY gĪžg‹‹‹ 䣏ņydY†8ŽQÆ×uņbšĀqœ*=°Tų„t:X–ß÷‘eŁ”:”Ņ/ !¶Ć0|Ń\q†% Ńi²'”ČG„Pö~yļ?mjæ€$WRÆćM¶Ä©@šJ¬o°ø2„Å)†Q† ó-€Æ_ŚĮō¤‡ž0A³f#Ļ%ĀQŽ­ķ18#Øłź3’ ĒN?„Ą÷!-Ч¶ ĢsQķŗŗč³"åJ!N¼öŚėųéOV™Ų”Šž<Ļ+åyb–RŽä¤WŽŹĻٶ]‘‡Ē{ >ųaŖ}“ĄO"KsX¶Ī(8ē€Ś'PR’R¬ °ĀņXgčĀŹ-§ēOƒsŽ……‹IŁÆYø“@é˜ē9z½‚ @«ÕB·Ū…ėŗ•ßĮa·Jįŗ.źu-ś\^^>Ø&€B­ÕjŻ ^ ĆP™«ĪĄƒ£Ó HŪMöDš©Ļ*`®<ńßtāT{ lµ€W–ĮYQŌOĪÖš‰‡fą¹ @˜B*`»c¢ķ"N€ė’T š,8n3gæˆĪä å`”j”-zY„K(ēåzÕN) Ėr¬ÜXĮĻž \¼x±Öķßū/­|˶¾ā¦N@©°, „EJannßžöŸĀs½Ā,‰Ćā BHäB@IYūK¬­­!Ļóź4_FśJ)«Ążū’„. l“ėĻĖŖ#šČ#ąōéÓą–U0ʑ¤)lĖŅĘD…ųOŪ(k·CRhŃĻC§źZǁ,nS®:Žƒ³gĪ KS,]»v ŽżŲßń`Œ”Ńh ŽćŖ ąŗn%n< („čt:U‡!Ļs,..tĄ!Ÿ·,k ą¹4M„¹ź 008"čÅ Y£’€O‚łźō/oUtK¾Y·A‹Xąa”įĘz„õķ&Ś.¤R| ½AŠQœcéFˆp””Qwį§qśžGįu]TI±^H“ ”,Ă„č ‚ź{J‰,ĻńśėoąÉ'„ŹŖ—s~SxN9(UņeGĄ¶ķjž_v”Ņ%FŚ"·Vg Yž§ū²CĀGŃń/D“ Å~"ŃQČēŠįÄZ¼XĘ(ė#ķ9pįž H“ׯ/Hhw+"°³³ƒ,ĖP«ÕAey\”ƒBHuNY–a<c8Ä'€B>gŪ¶r]÷™Ńhd:†ōC™5kģ*€? .½Å8Š#Čs½0¦H3$xąB÷ži#IŅL éÓ’µC HźÓÅń“÷Ą²-”«tZ_Ą“˜®PÓ:»ŖŻœē««kųÉO~‚+W® ŽćźDM)EžēUøć8•Č®<õ—B9Q$J)«ŽA©!‡ø|ł2vv¶Ńj·ŃØPro-‘&œÓ*‚Do pFŖq !Åė¤ō[Z•ž č1£°-Ž ÷܃Ńh„ėׯŗPJ)677«× Œ.;"eēćĄæ C§Ó“Z-ÄqŒ7n4@ˆBž„Ō ‚ągašN€!G­:[R]„„<Ązū/ńāmAr”  M€‚ļr £;cō‡:ęwmk„ÕĶ”js”µ®…‰‰ ų~×ŃźzĻó¢ŠŁ)ęö²8Mk=Ą(Šš›ßüæśÕư³³S€RĶ_#Bā8®fße»ŗtž+5Bä•Õīž.”ėėėxķµ×@Ćń¹ćp=”é¶¾eŪRźõ»2˜ Y.Ą8Ó¤¦ÜZ åj *ė`Īōū“ųøė983?8‰o2ß)Wē9Ņ4EæßÆī£^ÆW÷‘eǹ+a`§ÓmŪp]ćńø :€&€B> Ąõ<ļ§Q``€Įé`¦c½.¤źų"! 7Ÿ4ńö®j¾n‰—.[»cŒĘ9ŗżėŪcD£į(Ć8u1J(’4ĒŌōtüĆ(ƒŗCĄ8ƒ,Śō€ŅD#ϱ¾±§žz ĖĖĖ UŪæ,žåĢ;MS­Ņ‡.øׅvæ@Ÿųiu»ż&A%Ņ4ÅĀĀlŪĘńŁYø®Ę,0Ŗ} ՇŖ©F$“(ųščÆQÅŲ”Ņ@IĻópīü9$IZĶŲćPn2(„0įū>¤”°,mÕģ8Ī]9–€z½ß÷””Āśśze¤tšIBHĶqœ§F£‘!†ģ—žšbąÓūI@Y“ö×JĪāD›ćøČPĄ(Īr86E’JŒSżvgw®ć Żé Qo€qF),Ū†’zž®‹«®°£ńĻ’źWxéå—1 ōc‘¢0*Ex¬*v„0Ė2äEq*[ž„`°*Īū¶nuŖ¾xń"\ĻÅ©S§Į9Ó«ŠD;–€ŅÆ “0¦Tē!šr½hA¹ P½†„€(Āäł>ęēO#MS,//zē9¢(ŖžgI6c7i$īÖ1Šu]LMM!Žc¬®®fš JiĒ÷żGQ$Ģ•g`€ĮĄp$•ēЧ%Ē8'•źÖQvÓ:bė ¹PÅ.A’JäBQżoĖbČ„B9Ņ,G·×ƒė:čt&ąŗNurU©(”R),--ā'?ł)®_æŽŃh¤wį÷­óķ_÷+‹wYōßĀó֕»[ž÷“!®\¹×õpņäIŲ–B)8ćQ•{"%(ō ŒiŖGŖ(Ę Šģm0Ź c!ŻZ±m÷ßw/zż>ķč$Äż+’­V QĮu]ø® ĻónI|īķvm# ƒƒ  !äw(„“Žćüh4åęŹ30ĄĄą KŁn°§¤Ä p_łq×Ń¢= ÜyWUwĄ÷xQpöↄTąœ Ķó@)×!I°³³‹f³‰‰N®ēƒ@ĮāVyV”ƒĮĻ=÷+¼ųā‹FHÓ“õ•'łŅę·,üe‘/OĮ·(>7¹ ¾ū @IaYęŃ#Īi9Ü/lƒ 8ćūt{c ›3”Ģsʲ £ŃŖb_ 'K@©™8, pĶfQįźÕ«}œ„Rś0„ō4ēüćń83Wž!GƒŒ›5ö}Bš%ÓŠåź&1`”×gY®“K#œāW<|Pféł9(Õ-ū~ænwĒfŽazjY–U{[[ŪxꙧńśėÆc8V…Ų¶mdYĪyµ p˜“ņķN’e±Ü’5Y–įņåĖh48>7 Zeh ‚€ R }ó]Ņ IDAT”3©“‹!ÕźAŠ¢£ ÓµV¢|Mµ¢öDš}÷Ž{vvv°±¹yhM€źu⠞ēUÉ®ėVnU†Į!ŠjµŖ·Žć`eeå ¾„RśaĪł9×uŸˆ¢ČC Ž‘6kģ)1JZ•®­8æBéųą\ØwśõĀŹ@ŠÓ®R{Åuw·‹0 159É©)@)DQ„gžyæüåsŲŚŚ*Œz²}¤ƒV3īRxX”'ž·ŠoEā8ʵė×1==ƒ‰N–Å æŹXU¬@Pt@Ą© E^ž”1­SÅsŠā=-Ō;į<ŗŻÖ××=(CŗŻ.(„p]–ei²Ud ”[‡E»Ż†mŪčt:HÓkkkHÓō ŻB)ż „ō‚ėŗ’EQj®<C ŽF'`»ęŃē|ƒųJUĶė¢hķż»pōŻ+°ą ĢÕ€`ß­ö°±±a8ĄüéyJńüó/ąłē_Ąźź*Ņ4­}Źö~y".GwSü÷ßžv€ćń 8>7§ńŽĪP@µÅ°ßÄHAkH”[ŠqĀ(Ę!ūHRį9HØö>`ŒĆõ\œ>=^ƇīĪ’ōšĻÕ¶mloo#Ė2AĘā8F³Ł„µZķ®4­V FĶfRJģģģ I’‘3Jé”ŅŲ¶ż½Ńh”˜+ĻĄƒ#€™ kEJõ€Æx‘ĄŠ€ņtææĘ+PŠw!e'`{g+++xįł_aié¢(ŗIŻ’VU’Ż(åĖ_źŹÓņžÕĄ·€ņż$IpéŅ%ĢĪĒäŌ”&nYZķÆƒ A-Ģ€¤&@‘ ;'„ā&½@¹>(„¬ōz gĪœÅÕulnnŠš”¤©ü»¾¾Žf³ Īye!<Q«Õījąū~•ƽöŚķėÜĖūć8OŒF£Ų\y†¼ĻŲL“¬KRŖ_/kqYšöUż}’d Ō”üOÕe‘Z__ĒÕ«W1†•Øļ F3wCöšģÅæżkĖÆFXZZĀÄÄ&''Į8«ŚśZčØöŁōVēū*-P &õŗ"£dĻżč1­ˆ@½VĆ=÷܃ͭ-¬­­ŻÕė‘e¤”Ē`ŒĮóC Žg "©šuö!h2J>.¤"·*Ŗ(j½ŗCš~”,¢„s„Œ±wl’æqcįāEœ={ĶVŒ[e†1”TU„¬Vß[Ź}ٚšŲ¶…, T{!()«ÜĻópĻ… X][ĆĘĘĘ” RiÜķv‘$ <Ļ«NīćńøJW¼›ĮF£˲Šn·®\¹RŁ/ß)(„gc/„‘¹ś 008$ °§p†&DŻŌöß{Gʜ#Gö¢·%)%FÕ¢æŲ?˜žžF»Ż©DłVČ=ń„¹Uņ!Ą))^1Rˆ+ „ČĮtD¢ÖX€€3† VĆłóē±ŗz››[o#w‚2<(IPJ1+—ĄRĮCw5h6›‚  "ŚÜܬ:čŠĢSJ?ķyŽ?FQš«ĻĄƒ÷ŸĻ”ORJ&犺õ–œVv“:·*žū?Ī;×uŃėõޱīw$ģõzŲŲŲÄüüi4›ĶB°(“e°fE TaA“Z”Ji½)팵m°TåB”¦Z’  „B³ŃÄü™yÜø±‚^ÆwčAŪ¶1 Ŗhä²h !*Į»µ ®×ėhµZØÕjPJįņåĖ2RJORJ?SŒ†ęź30ĄĄą}F8–i»Įžš{„ąxYBIe{[œØć¶ž y Ą»’z½ŽóēĻćĉ8uźTļŅ„K«J©ö»Żģģģ`ii §OD£Že¬č†¼Å’@IPB÷<¤!ŖŠ#h‹eĪ-Ö‰īhæBšĶĪž=ƒėׯ£Ūķj; ¼ĶxÆn·‹ÅÅ%\8ķN§ČŠÄ‡Q¢_ƒāū–&A”j»`Ęh•8˜ē¹vŌ«…‹ ćś5”B Ńhąōü<–––Äc$éįüsjµ’$ĮĘĘFE Ē©F AÜU‚`ł=jµZ%\[[CEŅBŽSJĻó¼ļGQŌ3WŸ!ļ; =ß„?c”< ^“ʃ/ öŗļø“āßl6ń‘|SSSa»ŻžŸī¹ēžūńĖĆį°_«Õž$„|…1Ö¹“‚U*ßēęęŠj6ōīæŅ żRØE…ŠOém@§*–‚D…b+”°ŌfC ²|ü č“Ū8ž<..\D·Ū=”0RŠ4MĮ9GæßG’$ąœWŗ!Ņ4E½^æ«’æz½Ž‰‰‰j¼°¶¶v`a !d†RśĻ󞈢Øk®>C Žg„c¹Ń¬±|u=į.&ŲDĘ8Ž. ’‚$ąÄ~ūƒfffššĆ«f³łāx<ž×’š’šwó7S§‡ĆįN?š8!¤~'ßwcc½^§NŸB½^‡eY•šŸŖµ”@„ķ‚+ŸYʤA%E‘PfÆ#:Ī?‡ÅÅ%looėļuƀŅs1†ńxŒńx\łŲ¶]y1PJļZč8Ž?^u®]»v˜qĄ4„ō˾ļ? Ć]sõ``š>cÉkĶūĻ8Iīƒ.iEC@B‚²¹.ĄķężeĮ«×ė8{öģ ŁlžĻgΜłÆžźÆžj±ßļæķ¾†ĆįF­Vū„ōk„Ś|’õõu¬ÆoąģŁsš<_Ļż÷'E‡„s%L £:ß@‹”Mƒ)n³—5P<PJŃlµpśōi¬Æ­a}cćPÆW)&L’q#ĻsAPå ”ÆŁŻ®2ĘŠjµŠét*ŪąClLRJßó¼FQ“m®>C Ž0Øō’„”\$Ÿčōw*…‚Ulüó‘€;ił§Ł|~~žļ§§§’äŁgŸżĻū·{Ū!z»Ż^ÉóüW”ŅoB¼;yėėė 8qāšĶ&haąC ρ*øĢUĘŽZŸ*Ņ•×±ĆŒź“æ ›a-3¤”b¢ÓĮÉS'qķŚ5ģīīśµsqc4”×ėU±æå8  Üm' V«”ŻÖśŹÕÕÕƐ€„ō«žēż(Š¢Msõ``š>cI9Ń䯉’“üßJįļAšOxšØģ%EŻIBČä? øUńk'€R*-Ėśe§ÓłóæüĖæü_¾ūŻļnmmm½ė}÷ū}Ōjµė^!„C Žgt‡ƒHŽś”\Dņź ’Æ"łÜ ʟ¬Õźß#„< ó^’€w[ń+Šé"cģæ%„|÷ÕW_½ōw÷wŖab8^®ÕjW!_%„Xwr»7n`ŠļćģŁsؾnłKUXėbŸē¹Ž7.‚ŖĒ¾’9Ä`/øH’ c”ź$FLt:8}ś®]»ŽƒwʈeVDĒclooczzŗŚ (żžKWĮ»éŲ¶]-//#IHiQJæV€usõ``pT;ĆaÆV«ż”ņõ;ÕōŌ‹·]BČ’ ąæ¼~żśĻ»Żn~7ß³Ńh¼””Z%„|™rGńėĖĖČŅóóg`Ł6cÕ J!ĻӛŗØė±@)”JCŹ8¤T DUŪ%i „ ÕžĄģģ,ÖVo`gww/lčÆg©KH’¤ŗßN§»xģBˆJx·€‰‰ xž‡f³Y "d$„4c{ž÷ó0 WĢUf`€ĮŃ%õzż×¾N9ō’ł’m„Ōšēœóæ_^^ŽŽ£ĒÆŚķöKBˆ>!äQ¢žßKKKČņsssp§:eK„`Y DG-}Ęõē•”…°n÷—ž„ģ0 ©(©ą:&§¦195‰ÅÅE$Irą€„r ą8ņfĘ¢(Āp8¬Šy»rEŠqœ»z=-ĖB§ÓĮĢĢ „øqćĘćńAI€Ē{Ģ÷ż—Ā0¼b®4C Ž.H}ß’‰āūJ©{ A{åȂāc+Rʧ¤”’[–e’żh4ś¶··’Óp8\‰¢H¾? CéŗīŠäŗoGŹŽ„”—._g§Nž+ģ€µÉŽ¾9+ZźRźõ?»Š H)Į™Ī ū<cR!B“"M„PĢŸÅÄD×®]CF•Ś’NŗeF@é˜eŗŻ.cpŽć Äq ˲īŗĄ9G§Ó©‚ˆ666Ó šŠķ€—Ć0¼d®2C Ž(Ā0D†«¾ļ’G„Ō_Bž½RźWJżµ”ņ’Bü„Ōæ'„üŒ±’ø¼¼ü|EI’dGįńGQ$|ß’!„ō^BČżøĆqƄ˗į¹.Nž< Īxqr/Ä}D›ģWųkĒ@ZUd Čāß::X[“ø=%ŚCšųńY4›-\»¶„(Šp˜ńHžēU‘ļõz‡Ø×ėU‡ “ö<ļ®^OJ)źõ:fggaY‘¦éA·\Jéć¾ļæ†į‚¹Ź 008ˆ¢H†a˜ƒń`0ƒAo8n‡aø67ƒAvTÅ]afžēżRś !äĀ€<ĻńęĀZ­ŽĻ‡mŪZ H‹lčv>+¶(” ”Üä Ą¹>Ķ+ ŠزBDBI ĘŽŸÅōŌ–Æ`F‡2 *­Ó4E·Ū…ēyš}Žć`<£^ÆW^wĒqŠétŠh40°øøx˜ģ‡RśX— !ÆŌgĄĄƒ;%0±ļū’D)ż!äōŌ……~€ŁćĒį‰yz_V†?%!` „Ep„2@Żl.¤°·EP¶śē˜™žB£ŁĘ›o¾Yķł¦ „¬ūa¢ÕjĮq„a•8šn;˜œœ„ļūŲŻŻEÆw°4`BˆM)ż*ē|‰ņŖ!†üsuƾļRśBČܝÜ&Ė2,,,`rrSÓÓ`Œ‚±¢ØƒT@Ŗ½¬mD@‰*”ß/D‚ €œSh!-“;>«Sł.^¼XóĆē8Ž«AJ),ĖB«Õ‚eYBĄó¼J,x7$`vvNq欕+q: °(„æĻ9_®×ė/ŌgĄĄƒ;%Qß'„|‘2}§§ź7ß|ĶF³³³ŗ…¾·_W2ķ@ĖŠ =õ~Yüõ×hÓ J> R8‘Āœįĉ“Ø×ė’?{o$ŁUŽ}žŸēÜ%÷¬¬„»ŗöźM$™Mč5f±A`{ ėī„ā=ŚApĒ'Šj‰@`˜œœÄČš0NŸ>Ż÷ø¢lBܜ¶··ADB P(ģ·ŚćććČēóĀÕ«Wāh1óĻø®»iYÖó­Vˈ# ƒį[¹\īqfž {¹f{{gΜĮÜÜ,FFFaŪv’ž×^:¢ f0ķ˜EŃé[źi‚h×1…ŠÆU‘„lK`rjŁt ēĪ_@«Õź+—Ā0Dɘ`³Ł„”¹\.łÜ F‰“““°mł|ßūŽ÷Ņ(˜ł=Bˆmßģt:F`0 ƒ§V«­e2™§™łē‰Ø§ķ9Ķf/æ|*:”č,@tŚÓ’R)Ö¶GóżQŸ@d3¬dl0ė±BJ°`bLĻLĆv\œ>}:ŁśwŚķ6‚ @½^Ošƒ H>f2™[žˆ3CCCÅŅҶ··’ x—eYm˲ž1™# ƒį•Ź\Ķårß$¢Ÿ%¢žrįžēįĢ™3˜™™ĘššlˆŽįŗ1]ž£f@Y #*A@…Škƒ¹ Rœ`ĖĀŌŌr¹.œC«}p3E˲°½½}o$'’8C0Ÿ"B±XÄčč(:Ī;„T捁3æKJ)æīū¾4OŖƒĮšJd.f³Ł™łC½.@j4øpaÓÓS( Ćqm½ X°ž ¶% ¤6Läd䏄˜"2’RF–Ā2*Äz„p&“ĘŌō\×ÅŁ³ēŠéō&\ׯx}߇eYš}I°ĻēóhµZp–eŻņˆ "± nµZøtéśń#"fęūĒafžZ»Ż6"ĄƒĮ`<®ėžcęsDt’öt³½½+W®`nnŁl–:ķŻFézĮ"jŌ‹ōv@‘¤óćm}‚)Ń”Č>8Œ\žfgēą¦,,\L¶,ŽØ'`æS·eYI0^ZZB&“IFS©Śķ6 …Ā-ĄČČH²b¹Z­¢\.÷»E™ł–e9ķvūÉ0 0Ą`0‹ēyp]÷ef^ŽF{/^ÄĢĢ FGG6R‘B¼8ÅŽqėj@T2ˆÖ&C‹ĘĀ@› K µcąŃły€ēĪė»10®ėB)…V«…jµ ×uQ,aŪv²C NßŅįnN§aYnøōč"ąķét:ķŗīW=Ļ3"ĄƒĮ`xEDĄw˜¹NDļ&¢›žæH)…­­-\½rS“S(•J:õČ (^źūÅYלH‚Y$‹€ōēėÅB‚µ{AX¦§¦A$qöÜł¤žßaźŽfX–…jµ !Śķvņ3ĒÓ·Ztcą”C‡@D‰OĄ2ocęL*•zˆ# ƒį…Bį›J)Ÿˆ~’āõ}7”\.cńņe=:B”‰D§śÅA ķļ Š'ż±A­ō€T*Ś\D ¤ŅīnŹÅģÜ<:—.]ŗi)`?≂8ż_Æ×‘Ļē­V ©T ¶m#›ĶjēĆ[¤T*!“É ŸĻcyy9™Fč/@oeę’āńV«˜§ÕƒĮ`(µZMår¹oQŠˆŽN=ģęUJass««k8vģņ¹,ĖGsž±a%8Z›E®LŃĀ ‰@]G2ĮŠV »®‹łł£ "œ9sę@" ŠŖR" C4jU(r¹\²å0.ÜŖO@œ F*•ĀĀĀB²› ĄĢ÷X–5īŗī—<Ļ ĶÓj€Į`0 ”z½®Ņéō“Ģ<ĀĢ÷ ‡5°ŗŗŠµµ5ÜvūķH„Ü(µÆĒžˆ8qRŠv– a§Td¢ ƒŗ 0LNįz׀„…£Ē攔… I9 Ÿ¾€øó_J‰Ž ÕjĮ÷} …B2²HDq NÜ×ÖÖP.—ūÖ,Ģ|·āˆeY5›Mß<­F Ć@i42“É|…ˆ¦™ł ½^·¶¶†«WÆbffł|D:°[–HŒ€ˆ” AB©ėūJŖčkz @0ąįĪ b½C€Ō‹‰,LĻĢ" C\øp!Y Ü+a" Ć$ßn·Q­V‘Ķfņł|ā0222ūzäČ:t¹\WÆ^ÅöövæŁ bę7Z–5)„x¬ÕjuĢÓj€Į`0 :¤Óé/Ń f~m/™„VVVPÆ7pt~¹\a4Ņ'£@G¬Óė/ Š…3K 5ZB öŠĖD‘}0Ņ)ĒG£ŃĄĀĀBb@ŌoI u¦”Ńhģ:™‹Ø„č½ƒź ( (•J8wī\ߎ‘x½eYó–e=b2F Ć+‘ šÓéō£Ģüz":Ńėu—/_Fµŗ“'N"•NH›)© ,R†Ś€£“=éõĮAØ£=G„€XTÄÓń^„• !lĢĶĶb{»†­­-“Z­ƒżĻ7r0L„RX^^NVżĘ=ŽćĄu݁ˆ€įįa”J%A€µµ5ŌėõƒdīBÜęŗī#žē™L€ƒĮ0pŠĪd23ó[ˆh®Šn·1??‡\.YkG@Įŗ'@J™’ؤéO źf@™X ėŒ€ö tö2 ™L'OœĄv­†åååČY°æl@†°mõzBlmm%5ū|>f³ !r¹zč¼)ÅbÓÓÓp]kkkØT*ÆB¼Ö¶ķ‡šĶfŪ<­F Ć@©×ė­H¼‹ˆ&śž×Äüü˜,ˊŗż˜-DN@Q]ßźrłCb¤…‚%wmŒGP†Čd2˜››Åęę.]ŗMō_ "ø®›4vÆ$ö}ét©Tj fAÅbccc( 8wī\ß«„€™oBÜéŗīƒžē`€Į`0 \4¢rĄ{‰čPÆõāŋš<ĒŸ@&Ö§ē.“ f0 ,;Źp4 ­„,f„ad)̤ Ł‚”!lŪ!“ĶąŲ±cŲŚ*ckk«ļµ¼ŻŽ÷}H)±±±„FFFÉdÓ b±8ū:44„t:įįa\¼xF£ļ͇Ģ|’™ßģŗī=Ļk™§ÕƒĮ`(F£šĶfæÄĢ?CD=µĘ+„péŅ",ĖĀää$lǁeE§xØÄ9vā vV–ą¤ńq!””ö„Ц Ņ©ęĪc{»–˜„Ų6X)…N§ƒF£!R©T2AP,RĮŲŲr¹ÖÖÖ°¹¹yLĄ1fž Ēq¾čy^Ó<­F Ć 3ål6ū}ˆˆz:K)qśōi!0==1„ą(ĶÆ )©¢N”Ō½@ņłd½0ŃĪī€xæ@dń ds9ĢĢĢ \.ceee'›Šē˜ %£‚Õj¶m#”J%Z­J„Ņ@īk”PĄįƇaY666°µµ•Ø>DĄ¼āmQ&Ą3O«ƒĮ0PjµŚZ6›}š™Žˆ²½^węĢfĢĻĶ!åŗ°,+:É+aA* &=﯄”JĆP×üõDÅ/ń "Af€H ›Ķ`nv++«X__O„ÓŃOU IDATH?ÄĮ?ά®®j#"ĖBp¾ļ#—Ė ¤' ŸĻc||J)T*”Ė僔f™ł®ė>äy^Ż<­F Ć 3W³Łģs‘čÉ*OJ‰³gĻ"ŸĻcvvĀŚqō(^j“ Ø8 3z‚@’]AOħz”ć2‚!TČåó8qā8VW×°²²²ļšąė»ĘBF¼8 £££Ø×ėp]™L&ƒ‡ĀŠŠ2fžBÜ5ÖĢÓj€Į`0 Ēq™ł»‘či}ž”.\€e -„G} ŃŚąx€RŚ/€HoT‘!‚ćDŽŃ8!ŗ,†³™,Ž?޵Õe¬®®õL»O޹\ķv;éX__‡ļūČf³H„Rh·ŪČf³p]w`Ó###ĀŚŚZ’Įč"šBü¤F ĆĄi6›pē¼ā }ˆģ^®ėt:8ž<††Š˜ŸŸ3AIųE4꧔^D¬ż˜”’Ic é(fBŚ GI0[Q©€ ĆČL&£ĒŽaéźe¬¬®õż{v:(„`Ūv²ŗ8 Cd³YT*är¹Ä4(›ĶäŽęóyLLL`dd/½ō‚ č{Ŗˆ&„ļI§Ó4Šyb0 †Š€įįįSa^%¢÷QOypß÷ńā‹/”TĘįƇa;ˆP ‚Øų™ k‹ ”`&ČH4$īRBA‚ˆ!eØG” ”X,ąŲ±(—ĖX]]ķ»¶ī8:lŪF«ÕJlƒ …B2ÉŠn·į8r¹Ü@īm:ĘÄIJŁ,¾’żļ£ÕjõżsŃafžéT*õH£Ń(›'ÖƒĮ`Õj–e½`YV…ˆŽKD=ēĮæżķo抔Ć82>Ķöė4æŠźų:„Nъ`•l“Q3%N‚:# C©kų”„TŚ3 łŽLĮÕ«W±¹¹Ł×d@ÜotŪŪŪŲŲŲ€¶mėŻ‘£`:ö<øE\×Åųų8&''±±±ÕÕÕH õŽ@DcBˆXl™'ÖƒĮ`­VK„ÓéoQ‡ˆŽÕ‹RBJ‰_|G&&pųš88ēcÖ§z'ū’ żI)”¤L6źÉõ HXĀB†Ś}0Z&T* affKKKŲŚŚźūDR©¤”‰9P”P€Šœ …ĒˆČf³‰WĄĀ¶¶¶śn $¢Q!ÄŅéō—Ę†yb0 †Ńh4T>ŸF)åŃŪ©Ē觔… 09q££cBŸśuąŅ‹€ō‰Ÿ£µ€@„±g@¼7€ō$T2Z¬ß…€Ø¼ „R ÓÓÓX\¼„z½žœźć…@½wü{ž‡Z­†ķķm4›ĶäōļŗnŅÓ0ˆBŻ"ąōéÓY% "fęūS©ŌćFcÕ<±F ĆĄØÕjŅuݧ„%f¾=®®×ė8sę,¦¦¦06:‚9Ś gžU\ˆŒƒāŚ».č]RIŲ–õ ‚0j&$Dz“ S“ŒggĻž…ēyĆ°Æ€*„LFĒA­V3Ću]Ų¶Ų !Ļēro3™ fff033ƒååeT*•D¼ō!JBˆūÓéōFcÅ<±F ĆĄš(‡019………Ōėõ¾Ģ‚bŠ-B:ÖV—ąy-d³Ł]†ńæo•x: X,¢^ÆćźÕ«)˜łC™LękõzżŖyb0 †Ńh4ühƒąDt¢×L@¹\ĘņŅeLĻčL€R ÖQpƒ>°°@¤°Ó7€dć 3G#‚aŌ[½NÅ/Q( •077‹……‹(—6)74ś¾ h6›čtZČd²`fd³Y8ŽƒT*5{ėŗ.ęēēaŪ6ŖÕ*–——"ņĢü³™Lę™z½¾hžX# ƒa" “N§aę·Ńl/"@õM,..āųńcČfsŃ(ßΚąxüŠĶaäŁĻQv@MO°PRæV*½_@§ū ”T°,±Ń9rWÆ\A­®-ōū Ø®ė" ĆÄ“§V«Cl6›L8Žƒt:={kYŽ?×u±¹¹‰„„„¾ßƒˆ²ĢüĮL&óĶz½~É<±F Ć E@+›Ķ>DD÷ŃŌĶ^Žr¹ŒóēĻćöŪoĒp©ØK;G|½2(š  č“ŸÄETó=T’  Ž–‰h!0::‚į‘aœ?­V«ļŚz\> "0…šżPū @!Cäó9“ŪD fʱcĒP(°µµ…„„„ƒd²ĢüAß÷³J©’PJµĶSk€Į`0 „z½ŽČd22ó»‰čpÆ×Õj5\¹róG!—Ė‚XDėƒu µCJYė¾€øe˜J‰0”]ĀAŌ«~eä<(tf@ŒŽŽbtdŠl6“ĘĄ^FmŪŽY $upö}žWG&“E:­—ł¾˲*Ž=ŠB”€«WÆ&fA½¢”Āööv¦Łlž$€;‰č!„TĖ<µF Ć DĄv&“ł23柈Fz¹FJ‰­­-¬®®ā䉓Čę²IŠcÖSL©;(2TzŃP“©OǺщœI_E%Ė8tčFFFqęĢ“Ūķd%p/?kœŲÉ.„š¼&666@DČd2I@ģ0ˆCCC8tč®^½ŠķķķžF„”ØV«h4ń§NŃŻĢü°RŖižZ# ƒaP" œĶf#¢Q±W°ŗŗŠµµ5=z4ź¦Næ¤ÓžD"ŹÄ{”ž””J’[†a“K@7īlTńiŸććć?|§OŸF³Łģ;­č’@¼8ˆˆP©TP*•ŠétĶfŃn·aY2™Ģ@īm&“Įģģ,²Ł,±¹¹yß[J‰J„‚fsWœ'Gü3ш# ƒa"`=›Ķ>ED?OD=åĮ•RXZZĀęę&Ž;†\.§ƒxd ¬¢¹’8;§łćĄĻD aq²dČœd ˜“W€”2¹vüČ —pyń"ŚæļĮ8įV«…ååe03ņł|ņõAf„øķ¶Ū0::еµµė6ĘĮæÕj%?ė0ąķĢü„”gžZ# ƒaP"`9›Ķ>ĆĢźUĄŹŹ Źå2Ž?†L&£ #ļnT2^$¤OżZ(čECZhm!LŚ`(š €Ś¹öšįĆĮĀĀExžwąŻq? —'ٶ Ū¶į8Ā0„eY› "ĢĶĶĮqT«U”Ėå]«„ć“§Ó¹ęŗ=Ģø™RJÕĶSk€Į`0 J,f³Ł˜łg‰Ø§#pœ h6›˜›Ń«w#{_¬ ƒ¢Mŗ€“Å@a‚”Ē’˜BˆhaĪÄ`Š'źĆ‡ —ĖaaaRʾ¦˜9ŒOčN­V ¶m'.J)ø®;°L3ćöŪoG±XÄźź*VVV ”B†ØÕj‰ H6)^_LE"ą‹F`0 £V«]Čf³g˜ł~"rz/^„” ĒŽƒė:–…0”;§žČņ7ž»”a“8H÷XŃ  eä0Ø}“ĒC†2ńeˆ‰‰ 8Žƒµµ5T*•$°÷ņ³īśŸ¼hµZØV«ØT*8tč$¹P(Ą¶ķŻß£Gbddkkkørå jµŚ®¦Ę¤’”Kģ#&¼›™QJUĶSk€Į`0 „l6{J)u…™?@DVÆ"`aaļc~ž(l[/āČ$ˆRž,”·Ę„ü=FĶ„ŗt@ 2iæŪˆ1;;X\\D«Õ:Pc`œ=PJ”Ńh`mm ̌b±&†Čd2pg`÷wffår>śč5%Œėż}DĄx$¾Ø”Ś6O­ƒĮpĖŌėuH)_p]·LDļ!¢žž_(„Ä„ÅEČ0Ąüü¾ūĀ ĀÄĘEWšÓvĮP*rŌ~‚ A(!xgɐŠ^#„J6 ĘSR”Ō%„©©)!płņeų¾ r€R*Y&T.—Q­VQÆ×‘Ėå’FĆ^}xą<śč£IĄÓü{…@÷)ošWJ!›Ķīü»EŻkYVZJł„ļūF`0 Éų®ė>*„ø“ˆnė'˜¾üņĖÅÄä$lĖėł?}œ³öźgf„QŗŸ™£Ļ”Xhė !쨼„ŀė:˜œœ‚%ēĻ_@}—āŁüŲ ^Ī#„Ąųųxņ{e2™ś|ųĆĘWæśÕk~ü÷^NżJ„⚒ ī(š6ĒqŠ–e}ÅdŒ0 †A‰€N:~˜™ßJDs½^g&&Ž`ģŠ”(ĄSō•¬Ø@~mlŪ6dB*õ(¢lEĮS@":܇xĄ™3g055…ńńĆpķ 8Œż’)ŠōQ TRé T‘g@t܇^$„„?‡xr€Ÿéé)~€ĖW®H(„ą8N²©ÆŃh Z­&³ų¾ļ'µżēŸ÷ß’.“ŸżNöū•ŗ’J„š§ś§ų„_ś%“Z-\¹rN§ßR1óŻĢˆW[–…N§Ļó°±±N§ƒb±xüńĒńя~4éˆ;üc±_ ßļO:Ęg?ūYÜ{ļ½ĒŌŌ¶¶¶°±±f³yš!ĜeY¶Z-ß<¹F Ć D@9“É<m,ö“ ø°°€ééŒŽŽ¢€J ©$˜EŌüŸčµłhĒ=£½VXOÄ£…J)AŽm0 ĢĢĢĄóõ !µc„Ø\~@ÉŲjˆ` ‘xĒÅüŃ£‚ĖĖĖIż¾Ÿ“züŚ|š°Y®ayyyWpļšŻļ{£ŗæć8xź©§nų}:„ééiĄ™3gŠéōƉ™_#„ø3•J=äy^Ū<¹F Ć-S«Õ.g³Łļ2ó‡ˆ(Õėuøŗ“„ÉÉI C+9m ”•XhQ K A$]ō‚)±Ó՛»ķ€BH°`d2)LMM”R©byy99Õ÷A»‚|µÖÄööö5ā`æ¬Ā~§õųsCCCxā‰'zśž###˜žžĘöö6677įy^ßĢ|’™ßą8΃žēµĢ“k€Į`0 BœĻf³§#`÷zŻśś:–——qāÄqd2ŗįNF“BXQF@@Q# Eb ²Vzy3%~ńźaJ0S”`!pāųqlooćźÕ«×ļ›Pxž‡jµŗĖħ—u¾ūžŸ|ņɞ—ŗp×]waee§OŸŽUŹčCB¼ÉuŻ=Ļkš'׃Į`øe†‡‡OA°ČĢ÷Qφł›››X]]ʼn'‘ĶfĄD°l=Ž'„®óŪ–„ż‰8 śˆÖk{į­‚Ś€£3C* %CX– !³³sh4IO@/t’½©žėś÷słK„Rxųį‡Q(ś¾ĒŁl333p§N‚ļūǘł-®ė~ш# ƒį–©V«ž^›ĢüÓDŌóįåålmmįĉ“ČåóQ`C—į ¤ŒóśŃxžnś e%„Rg X0?ŌÆU29½ ĖAÄzQŃÜŹå2Ö×7†įu•Rh6›ØT*»¾~£“’~½ńĒĻ~ö³˜››;š}Įw܁••,,, ‚ƒˆ€9f~[” h˜§×ƒĮ`øe „ų˲<"zWÆ"–––P©TpģŲ1ärYqd,“Ł’X(„ ‚˜2”ŒmõT€Ž-Šš»OģŽćbrjµŚ6*•ź¾®{ŻĮæ;č_Æ¶æ·łoOŠÅßüĶßą­o}ė-ßēt:»ļ¾ÕjW®\9ˆc ˜y–™ļM„R_lÄK F ĆAiµZŹuŻg™Ł&¢wō#._¾ŒķjĒG*•Ņ@Äz ’Ɉ3#BX–ö „JŅżŗP7"źC B4@zŖ@Ŗ…BSSÓX__G¹\NĢ|ntņæY“ß~žčžæüĖæ<°ūœÉdpņäI¤R)œ:uź "`š™’‹ć8{ž·mž^# ƒį–šźy^ŁƒĮ`0ÜŖS©Ōæ3óqf~]Æ"@J‰óēĻ# C=v –m#q÷£čÄOŗwżkÆŅžI7Ą]ū””Éśį0” ho@Če³˜ž™ĘóĻ?Ė—/ßš“ßkš/‹˜ŸŸ‡mŪpD˲4p#ņł<ŽųĘ7¢Z­āģŁ³Ś{ĄĢ‡…ļu]÷Kžēm`0 †[¢Ńh™Lę"z=3Ÿģõ:„Ο?t:™™¤RnŌä\•q(-(ü‘ˆHĘmJi1Y Ē„©ˆ€S§NćńĒæ’lģ„ö=Ķf‘Éd°¾¾ž~Ēq`Ū6¤”Čår}wļß×uń–·¼µZ .\8P&€ˆĘ„ļK„R5 # ƒĮpKŌėu?•J=ĢĢoaęł~DĄ©S§`Yęęęõ>€ØÉІ@ĔLØ®²€°(ŹČ0‘n„‚0Ō6ĀŃJb„$¾ł­ēń—ł—h4ūž뽯ÉårČårÉļPÆ×±¶¶†””!Ų¶ f†ėŗČf³½Ļ–e%"`mmķšß„G0*„x*•ś÷F£±n€Į`0n5ŠJ„R !ŽIDS½^'„LDĄÉ“'`ŪNāć{Ä+…§Ąh]°¢ L D£€Éė‰ •ĀÓ_’žśÆ?…vtņ×Ķ{]Į]é}7ń5¹\žšÓ}¼Hhee%Y#,„3#ŸĻō> !pļ½÷buuß’ž÷ĮADĄ°āžT*õ•F£±f€Į`0nUxétśf~7÷“ 8wīŠÅ"¦§§wūéɽA0LNś!ˆuÆAE¶¹”Ō{¢w…RĄÓO?æū»æG­VŪ÷ū^?Ų_+ņłĀ¾©})%|ßG½^G½^‡ėŗpł|a\Ą›Žō&xž‡‹/¢Łlö]n ¢!!Äż™Lę‰z½¾b€Į`0nUŌ²Łģ#Dō"éõŗ0 qįĀŻ0= bÖB€ ~“ ˆˆ!'[9:į‘ ÄNøŻīą›Ļ=‡OśÓÉrŸż6ūÅBąf“X,^ü÷ŗ *„P«Õąŗ.R©Tāē_*•`Ūö@ļ³mŪxē;߉L&ƒ^x!ékčS™łCétś©F£±d€Į`0n‰z½^I§Ó !ī'¢ž‡ć[­NŸ>įįaŒĆ²€>V§d­pģµm0'.JĻ=ū |ņÆ?…†ēé`×ų÷żŻ¾’ū’l6»Æ7Ą^˜åržē% .i¼™€»īŗ µZ ‹‹‹ķ (D"ąéF£qŃĮ`0Üj&`#N™–ˆr½^ēū>¾ūŻļb||ÓÓ3PJF#;5~Ū±’@§ĖetŚ’ŁgŸĮ§>õߊhxIąW]Į}§ ū#%ļ×Kšæq9 R© “N#—ĖĮqt_C»ŻøY¼żķoaqqqßRG" ĒĢ?›N§Ÿk4—Œ0 Ć­f–³Łģ7˜łē‰(ÓėuaāĢ™3ĒųųŲ¶•4ūÅŪżōÖ@…x•p<)šōÓO㯒śSØÕjśdæėäķö¾8ąw‹ƒX\ …¾‚L&“A«ÕĀĘĘ*• R©ĒA±XD±X„ƒCwß}7r¹^zé„äwļSd…L„RßüqF ĆN\Īf³ßfęŸ#¢TÆ×µZ-œ?³³³Ń©}©`Ł–^™ż”ÄõÆ}ķkų«æś+4k–÷`—Ųļß;åĒqP*•sŸ~‘R&é’J„‚F£ĖŅ”ƒ @6›…뺿ׯ}ķk‘Édšļ|N§ēUČŻ"€™.NĻó¼KB# ƒĮp`jµŚ…l6{Š™?HDN?"ą…^ĄÜÜJ„ᤑ.6łY%=æ IDAT‚^'¬€'æśU|āŸHV kS!ź ķ׿żÖüŽŽŽāžūļG†h6›}×Ō柏£&Ę0 Ńjµąū>²Ł,ǁ”BˆūĄw܁T*…Ó§O£^Æ÷}=„‰čm6›ošRŖõćō,`0 ?`†‡‡OAp…™ßODÖ Š®@Śl6qźŌ˘E©T‚`ÖY„¢M€!¾žõ§ń©O} N'9ĶSä7 įqO€ćøųȇ?õīwchhĖĖĖØVwļωśn„ėŗÉė„‚FĶf–e#ŸĻƶ-ø®ūŠd^’ś×#ŸĻćģŁ³ØÕj}‹˜0 ­z½~œˆī!¢‡•RžƒĮ`8ÕjµZķÅ\.·ND?MD=’æøŃš°øøˆ×¼ę5ČērJ™!ž~śi|ā¹5.%fBūœŃÆł|æ÷{æ‡×æž °m „R ÅBW—–AāæßK0 Ć0Ł:†a’ž_^^R ©T étŪŪŪ( ƈxŻė^‡įįa<’üóh6›}e/jµ:8JDoeꇔR‡ēŠƒĮ`ųį \׿fn0óOčym^„RĮŋqģرĆ÷ńǟĄ§?żi“Ū­$čļų=µ~tžŃ.€C‡įw~ēwp÷ß S÷Ń|’”CcÅ„K—Šét†+‰Ēׅaˆz½54 é©ŪF*•ų;ķ¶Ūpųša¬®®be„7ƟN§³7ė1KDļ ¢•RõõŠƒĮ`ų!įyž²mū9!˜ł>ōøA¶¶¶påŹĢĻĻćŪßž6žĒ’ųŸQ›’ŗ|ŖßwF’št€ĀČČ>ņ‘ąŽ;ī€e‹Č_@‚IB*ĀŲŲ(ŠCE\¼xĘĮĮ±PJ”ÓéąÜ¹sČårFzE¦n»ķ6är9|ļ{ßC½^æaCJ‰ĶĶĶżŒ‘¦ü—(PūQ~žŒ0 †"ĶfSEyf~k?"`}}Ļ=÷ž~śé=Mn×¾E\Ū§]’ŽyŻųų|ģcæ×Ü~;lĖF-ŅūāĀČšrł677Ńjµtāš“&FŁA³Õļū°, Åba¢P(¼""ąÄ‰˜žžĘéÓ§±¹¹¹jf'õ½I“~Š™TJm`0 †Ńh4”eY_Bfę»{J)xž‡õõõ(Pķž …®Ńģ—ū_Ģ‘#Gš‡ųb~nN÷„‚9ŚFØ` )õ“”GŽĄ¶,,, ÓéHÄ=N"ĀRŌ_ ”‚eY " ™~æ=ŠÉÉIœ;wn_ąy<Ļ»Į˜¤ÖLŽĆĢ*„*F ƒį ™€0•J=ĘĢǘłŽ‰„FbrÓ˜vwę_›ęļ>ż&''šń““S &X–ž*a)õ¢0ÜY,¤”žćGŽ ›Ķ`yył–Ź–eĮ÷}(„°½½ Ļó022’ˆ€x™Š ™ŸŸĒĢĢ ^|ńET*•äžu:ä÷‰Ó’{­’»8 ད(`0 †įy^ąŗī£Ģ|'3ŸÜO(„PÆ×±½½Że¬®»ÜgwŠŚżvxą0== Ėze°”z«`”1 ()įw|„”„ė:‘%ń‘#`f¬¬,C†¾ ČÄöĄ­V õzNB0ĀP"Ncxxų¹ß333˜››ĆĖ/æŒr¹Œ PÆ×“¬ĆŽż×cDō3Dō%„Ō¦ƒĮ`8Øčø®ū°āĶD4ßµć“wgśµiźŻžzė|gggń_’ė˜œ˜1G«†w&TĢ„RPR¶ma!Bķ>-C6—ÅņņźĢvDŪ %Ré :jµņł<Ņé4„ČårÆH9`vv·Żv¾żķocii)ɀģeær@×ēF¼Ÿ™æ¢”Z7Ą`0 ­L&ó03惈fŗƒwŗšö©ēėEA]AjŸvēwā’ųČG011‘øōzW€RaØM{ $ōt"ygĶ0‘.&01ˆ£##IO@ģŠw&@éåGĢ Ļó’ G·wĄ+• ˜˜˜Ąłóēńā‹/&÷*i€ģa?5žH”Œ0 †W!õzŻĖd20ó{ˆhÜó<”Ėåė’żVūńnApםwą·~ė·155•ŌŁ•R|RJķŲĒ„PĘĮ`ŅuĮ ©“‡æeYčų>,KĄv><ŽT*…ĶĶĶyļ'B@JX–^t“±±ĻóP,“UĀ„Rią÷zmm ’ųĒw„ųÆ7>y“Ģ@I1•Ļē’æV«„^ķϘƒĮšźµt:żh«ÕśÅr¹\ˆƒūõŗÓ»Żžā€ŁĶķ·ßŽ?ųƒ?Hj÷ńzįų“Ėń{Į²lP ~‚hw:IÆŲŽ )%‚ „c 92T*…‹/&}ūÉėāŗ.ˆADļ \.ò,d2X–!ŠÅā@ļó/üĀ/ ŻnļŖõ÷3ŁŠżū Ÿp]×bę§Śķ¶|5?_F Ć«˜F£QmµZ#ށ=]|ū ]åżI€7Ž}7>ö±alģ€Ł}‚ŠD@˜ųõK©’ŪŽƒ0 u÷?q²X( ųA¦Øģ ‰Ccc2D¹Rēõg›[g³Yt:Ų¶ „–——Q«ÕN§aYVā0~ķ×~ ĖĖĖ×4ų]ļćD@$NXń˲²DōÄ«Y`0 Æ~ž"¢1oźŻŽ×€6æłżß’}ŒŒ C J€CJß÷!„Y#Jßė ƒJé†@žW`B‚˜¢µÄ€”!˜D a LMN¢VÆ£R)'óžżąū>lŪFp]¾ļĆ÷}Ōj5X–…t: ĒqĻēoé¦>šĄxé„—®Ū(¹·`WĄ] Åk“™™ßbYÖ°mŪ’Žl6_•"ĄƒĮ`xõ#|…ˆ¦¼žf™€X”œ˜GGG1;;ƒnļĮŚēß¶,ķÉό0 ¢™’xUÆ^7¬ e4H¬³”¢¾€0–ecjjŽjµz Ÿ€ø‡ ī7ØÕjØ×ė°, ©T ŽćĄ¶ķdBæ|ņ“ŸÄc=–Üæųj!C×ĶģnøÜ¹ļ®ė¢P(t枙łĶĢ|ŲuŻĒ<Ļ ^m•ƒĮš£Aąß‰č5^³ßiu÷ß Žć T*ˆpžüy”JƘœœLźżAØÓüP ś$OŃüæR;X°Nż‡aØOżŃh Aæ‡%xĒj8šBpŻŽ9 Ļkbee%± ŽėRŲ qĮ÷żd‘O>Ÿ³.; õu#’ń’ŸłĢg® š{’t~oąļīoˆ] ÷ZG"ąn"šåN§óŖF Əћ»‘H„RNœ;NŸ>±ŃQŒ lJźś¶%b@… ØŽ/'ā@pü÷fÄ čzKųKt|®›Āää$Ś­&VVW‘J„Šétō‹Ū¶ "B§ÓēyXYYA:†mŪČd2Čf³=½ĻW¾ņ|ņ“ŸÜ×(©»qr?!°ß½VJ!—Ė]wƒ!išFĒq¦…_jµZÆ`€Į`0ü艀‰čķf÷™L& ž».ģtšŅ÷æéé:tL Ė֝üq7ÜŌ'eØ£Ó®”*:ÅN“Č˜ERhµZ°"a!£}‚“Sčt:X^ZBĒ÷ōKĒ?cœ•(—Ėš}…B!Y”N§oųßżīwń‡ų‡ūžš÷sRÜļk{3¶m#›Ķް7€4ÆBµmū‘f³éæ$# ƒįG&€G‰č§éžB>ŸG©Tŗ®kžļū8wīaxdJ©Ä ˆ™J@%5}ĖˆKL5ŖÄ3@Eµ 0…@Ēļ@XŒ ”¶mcfzŪµÖ×ד<(öŠ¢ƒ!„Ąźź*Źå2†‡‡aŪ6R©2™Ģ¾×æōŅKų­ßś­ėžü÷ŽćŸ°#x89ł332™LO…Q&ą!ÄIŪ¶z5ˆ# ƒįG“€Gˆč}Š~ō(‹‰iĪh·Ūxłå—177įČX' u·>Ec€r×~PPśėQ&@wųĖØö­{ōI]oŒ¦e €Ų®–Q©n#ķŚŽ§ŗ…Ā0„eźõzŅ[§į …Ā®kŸ}öYüęožę® ~=kßėeŗƒ,,ĖźĖž8ʼ–™_#„xøÕju~˜ƒĮš£K•™æ ą½ĆĆĆ„|>Ͻ˜ī(„Šjµpłņe9r‡G#€*2ė¹ö0”É@ˆUō9 K0딿¶ – L@”ćŗ” “|p\“ŲŽŽF„ZOÖ’ !”B Õja}}=ńpgWMžsŸū>śŃŽš“æ_Ē’Ž?Ż¢A)…“'Oī²eīG0ók,Ė:ā8΃?ĢA# ƒįG„Ō–ā’r„oAģßŪ‹zØVqłņeLNN¢˜t±“®ėėŒ>(Źų¾ÆEBō…ŲA0 |ż:š}awŁŗF.C‰P*ĮpS)Œ†ēyØV6JÕ÷ž€8ĒÓRJlnn¢^Æcll BŌėuüÓ?żžģĻžl×5q¹ćF5’½ß§ūs¹\’÷ßųßĄŚŚĪž={"ŗCquxxųŪŻĖŒ0 C?" åŗīBˆĆ̼Ė,čfA“V«įņåĖ?Œ‘‘XBDY×õµYLNÜq°Ó{¢Ć=“3`¼ĀWŹ@o$B«ÕŽy­Ršż¹\„ŅÖ×7P©V¼@(čq& R© ŃhĄqüėæž+žįžaW='‹!oŲäw£lĄē>÷9ĢĶĶ!•Jį}ļ{Ο?………¾wŃ[ƒ ųkµŚE`0 ?xžڶżļBˆyf¾³‰T*,--įųńćH¹ī®€)Cķ ø3E&@abH%£B•˜ ”Ēć×ĒSaĀu\=z µz ›››»z ś?°, A$>ßśÖ·šģ³Ļīšįߊ»k÷ńØä^ ½BąŸųŽ?¾ėūæ’żļĒņņ2._¾Œv»ŻÆČØmoo?a€Į`0L³Ł \×}”™ļ`ęŪū¹¶R©ąŅ„K8qņ$²Łl]Ó„ŌžjĒ·Óń£ 턤³Ō×1E"‚Ą¬• ±@Źu16v«««h4Źø®›^‹¶ŹUlmmķėą’N{EĮŽ@æw‰įW~åWš”}hߟįŻļ~7–––pęĢ™d:¢3ķŗī’ō<ļ>`€Į`0üxe|×u‰lhöqE¹\Ęśśęēēį8˜aź>BIi11 ųQC@ÉŽ€x]0 +²¶t a[ Żh8=5…J„‚z½ŽwūĒAĆkĀó¼ėšöÄB ›żĘżö ƒūī»ūŲĒnųs¼ė]ļB³ŁÄK/½Ō—!¢€æ«×ė?š2€ƒĮšć'Z®ė>"„xG“? gÖ×7°““„×½īu°mBŻŁ/”Šv(=ź'Ɩm!t ‚ •≁ŲX׎£2‹ČPĮu]ŒAµŖOļżN(„°µµµkēĄĶŗž»Ėūł’ĒŽ;†O|ā=żļxĒ;`Y¾ńoō#bH)õ÷µZmŻƒĮ`0 Bx©Tź!Ä»#/śžŁŲŲĄĘĘNœ8˲õĢ}bż$Ÿ³lNGwÖG»‚P&öĀI}Ž÷”Æ–»Œ„ ½°Č¶166†J„ŒF£Ńs&@)…jµŠV«uĆ×ģż÷Ž”’ŽYĮ?’ó?÷ußßüę7£V«įå—_NśnBGJłÕjµŠƒĮ`F£–ÉdeęŸ!¢Ń~®]YYA½¶¹ły!t&€†ŃŲC†!„Šī€a؛ż”TɈ R!ĀPO„a©“qėXčt|żž]M…™LØ×ėØT*zŃ 2qš÷<ļŚcõ ŗū»küū5@&“ĮæżŪæč¾ßwß}(‹xį…Šl6o&`Ŗaže½^o`0 †QÆ×+™Lę1fž•ś¹vyeŪŪŪ8zt®ć‚’Ę@mdŁ6Ā @(etrŽFYg “APŚ*8 ¶ķŽõČ(s “4¼ćø(‹(—·°½]C†»l€»ƒ„RIjž×3@Ś/忟ŲūńńĒæ„ū~×]wabbO=õTāZxĢÄ*€æŖÕj?š%AF ƏæŲČd2O !>HD…^ÆSJįźÕ«čt:˜™Ięł½ģG*bG¤T‘{`īČ(* Äó÷Z@`g¤0vÄ@ ŸĻćšįCX[[G³Ł¼¦ „D„RIN×tƒS’Ž ßü÷nž‹’žÜsĻ ä¾Ÿ(ČPéŅtc :Ķ—ˆØkń‚mYŃ8 ~ ¢ĻĒ£‡©tétW®\Įŋ“×ވ^śöf~ż×æżŪæżŠŻ÷»īŗ Ÿ’üē±½½ø(F‚äŒeY’Öjµ~ąKŒ0 †’|"ąt6›]`ę÷÷#¤”øté"2™,Ž9‚xĄĪī€XJj į0 vN»R÷(ö“Z-ŲŽ“ŒĘĖzt)”Óé€|ē;ßĮśśś Źf’Æ' ˆwŽy'>śŃb||ü»ēRJ|’ūßĒ… Šjµ$„x­eY…b±x®P(ø…BA‹E², ÅbQÕėõWģg²Ģ ƒĮšŸ)åg‚ Č[–õ߈ČīõŗNĒǃ>!īyó›aŁ6'N÷ėĄĻ-R Ģ"š‡—@äü¾ž ‚]#:5ß“÷ó<_ųāqęĢ™kNųŻ)’żÜžā~Üš'»~¶ø)qll ‡Ā•+W066†‰‰‰Wä~Ÿ?…BCCCØV«Ż?3óGüu”RMĶ\.·  233S°`C)µADkJ©MažĒŅŅRĖd ƒĮŠORŹ’p]·NDļ¦ųčŽaāāŋ(‹INøa‚…H p(É(Ų–Š£€P`bm-¬Œ’…a > „Rb}}ŸłĢgpźŌĖŲ»Ūhæš’~§ūäćži„lŪ†mŪš<ķv„R ł|Łlvą÷ū™gžĮĖ/æŒÅÅEloo'n‡Zų°ˆČ%¢, Ńa"š%¢“DōF"z½—ˆ~žˆž7"śßĪēó’’ķŪ“]W}ēækķū>}N÷é«Ō“¬›)ĖĶŲ1L˜(ņ4!O÷­®ś}×ļņżł¾[$‚ Ž„dYŪ¶Į9ĻcEdY†ÅÅEŒ£Ż«Ū„Õ »婟sŽ4ĖTK„²¬“Eģ+ᚦCTć‡O?ż4ęēē‡ž`ßož’–ĢĄŽ²€ah6›`Œ!Ė2lllĄ0 8Žƒ“'O9¾UŗŻ.žžy,..bqq±†aģ[ž8Ę9’7®µŪķīõ޾J€AÄ»˜0 „®ėĻėŗŽąœ‡\# qcaaķviö›söYš1 ¤Ž9„( V™åYi&d[Ā(ĘŹŹ ¾ńo`qqq׳ż½Vö& ‚«ÕR§oH)‘$ Ö××”ė:ĒĮ‰'޶kü£żóóóĆĖĖĖč÷ū`ŒA×õZĢģęWpČžŪyž?ķūž ‚ āHÄq,lŪžGĘŲ4ēüᣊ€k×®abb“““u]yž3vÓ/ \!œ‚s­ žÕ؟ćŲȋBJ\æž&¾žõo” RBīŌ÷šķßĻįĻ4MŒAÓ“”ūK)EĮ9G³Ł|ŪśŽxć lll@8ޱ““4tśW o'Ąs„”÷8ŽóĶ Ž4I@€ ‚@†…ć8?ąœŸ©Rˇ&MS,..bnn££­ZØę>! p®AJĄ04dY^62@Ó4ÄI! \øš"¾óķæŖ7ÖA®ścæSņ^’ƒ?3Mķv{(ųļY–amm aāōéÓh·Ūoéŗnmm”ŪķBJ Ū¶ńÄOąžčš½ļ}žēÕe“Į÷}ŌrclŽsžĻóÖIAG&‚²¬ļsĪļ土;j&ąśõė˜…mŪą)n@–¦AČse€äyŁX?żéóxśéļĀÆŅć;½ūUĆą^ć~aYÖ¾Į_=ŸQacc£Ī4›ĶŪ¾¦NŽć`vv=öΜ9S÷üŻßż]•a»z]±ąūžIA·› ČĒy–1ö>ĪłŁ£<6Š",,ÜĄģģ,Z­&ŠBŌ‹p4MGœÄRĄ²,H)`š&|ßĆ÷æ’,ž}öŁ::ö©½Ŗ‘7Æ’ƒ§mŪß7ųŠĪ9¢(ĀÕ«WĮ9Ē{ßū^8Žsäk™$ ,ĖēwŻu׊m?’łĻńÜsĻ ½’£ö6ģ ēyŽS$‚ ˆ·’ HlŪž[Īł‡9ēvĆńzK !nÜø¹¹9Ų¶ Ó4ėDBiņssYļūųö·æŸżģgušS3śƒ'ż½:ņ3ą8Śķö‘ŗśÕDC’ĵxųį‡œš×uY–ķZFxśé§ńŅK/ dIpŪ€ź¾[ccc_;Ź4 ‚ b7ڶż·š¦}œ1vü €¹3Šét077]ćRT’ŠR Hķķ-|ó©§péŅ„”ē;^eč~;EĀn5×uü‡‚Ŗ,†®\¹‚F£óēĻśńEQ€s^  [łņ—æŒ(Š`„“2SR¾G”ŗ&¾”ņzžwčF@AÄ^" ļ8Ī÷9ē1Ę&ņŲ^Ƈ••ĢĶ€eš0 Yžcaaß|ź)\¹reĻ…=;cąĶō’ī`ĒiÓÓÓh4G¦†aÜ“.Fłqc~~Žćąžūļ?0š+“ŸżųÖ·¾UŚ3†F£˲jc"5•°3#pĄĘĆĄŸxž—ö³’ ‚ ö½j:ąÓŒ±ń£<6 C¬ÆÆć®“'aY6’$Įkƽ†?żÓ?ÅÖÖ֞'oµAšVQP €ĮŅĄĪ ¶mćŃGÅɓ'Ēń”– 2ø²wšg¾ļćå—_ʇ>ō!LNī®…|ßG–eŠużĄ¬Ć¹sē°½½4MĒq-°, –eAÓ48Ž3ŌųX[,ļńÖ„”_ńņø`³ŁÄųų8„čt:H’dHX–…üą0M>ś(^żõz?ĀŽkƤ”O{žw…Ań«oŗ®ūr%Ģ½ī§źęjõķĪą÷ż~ orą>ĒŽƧ?żi¼ē=³Č²¼vÖńģõIDATS#…RJŒ¶š(*ƒ5ā÷VȲ ĖĖĖhµZ(Š¢r@½-ė`]×įū>Š¢€¦iuAQ0 üĒŒcĒŽÕ÷’ŲĒ>†æų‹æ@E»‰“ē<Ļ{‘Ań+s~EÓ“łŖ1ŠŲ-@nmm! Ć[Nł*p4ó¾[ĄĪĢĮÜÜž|ņIŒC×4)‘ē9Š"G’$0 yžAH`ll qckkėP«„÷ĖØ“üčč(Μ9ƒŃŃQœ?~h¦’ˆ×³Ž“ ėz-TŽ÷¾÷į _ųĀŠ} ĆĄ… šę›oŽ"d¤”/xž÷‡ō«LAĻó¤išO1ĘFt]’ļŒ1Kśƒ @Æ×»%8 Öż…CµųĮN÷ŻJ»e zč!<ņČ#p]¢Č  Š¢Ü1 Ė4Ē ÄĄkĪĪĪ"Š"lnn"Ļó#gTö@ł…aß÷qņäIX–uŪ×3IÄqŒńńqĢĢĢ Ė2lnnāžąvͬĢĢĢĄ²¬zäpą?Rö~• ‚ ˆ£²¹¹)|uffę”®ė’%MSōz½ŚśwÆŖPF9ƒ~0šļõ=<ņČ#ųą?]c(„ć:ņžńćĢ™30MEQ IčŗH@JQŽśIY®#ƒ”¬^MĢ9g§OŸ®gļUŗ}æ÷®Nž*c i¢(‚mŪo)ų+!Ē1ā8†®ėŲŽŽĘ—¾ō„=ļæ±±)%]1¦ ‚ąPõ NææAÄm+)ßšyK{Š’ƒ_*°ŖÆ›·‰”Ą<;;‹ßłüēq’ż÷•+„«Ó»®…@–„ČŅ €„ØNėšĘ”ėY1$i¹‡ąģٳh6›‡r ÜłŽlŪĘōō4zč!¼’żļPzxž·§ĮŃnt:¬­­”ßļ# Ct»]|ń‹_Üóž7n܀®ė°, »Ž7 ƒ2AÄæBˆ朒Ž”ņoLķ•Ų™Źßyņß¹žW}źŌ)|āŸ@»Ż® å`Œ# CEĪŅjĪ?K³ŗäi¼ £,7OņsssąLbm}³*EQģzņWļKÓ4t»]ÜsĻ=8wīVWWqéŅ%Üøq—.]§>õ)<öŲczxžß÷±¾¾Ž4M‘ē9|šĮ}ÉŹŹ Ņ4…ć8˜œœ„eYÕgŖ­ś1eH€ ‚x;DĄ’cŒż.€æŠ>(°›(PĪ~ĄM1pļ½÷ā#łF™āĻ hš^5Ą äyŁK 6 2Rąš‘g…ć@QHpʐKVwŚsĪ1>1…ž×G’$C)ž,ˆšžyžCÓ4œ? xę™gpéŅ%,//C A€Gysss»^«0 ‘$ 677!„@æßG«ÕŚwŁŠāābżŽŅ4EQ8vģęēē…“Ė9wų‡ł?£1@‚ āķāMÆ1ʞ`īwĒŻ\’³ŗ®ć£ż(~ė·~ ¦i¶m¤iZś„i‚cē¦ibbb¢®½«“ōęę&FGGa[ņ*ķ­Nųźļ4M)Uių›īx«³iš! #ųżņ­Öļŗ®‹S§NįĄĢō4ē0Liš# ,,,bii šv3\ŖģĆ Ł)l”ø ĆWÆĪćūīĮ{fctl ®ćbvö8&'§÷¼xŖ§ MÓŗgA}~ß÷«>ˆNžē €_ś¾’$‚ ˆ_·x¾Zü"€1†ŃŃQŒ®•HÓžēÕ³ļŹ‰Oz@Vé~­ŹJpĪė/QĆiš"Iōū}Ų¶fsgNŸĮż÷߇v{ ¦Y¾‡$ͰµÕĮė×Į5Ó4‘¦iyPÆĮ«}üwе¢øÕjįž»ēpß}ą=³Ēįø ¤iŠzß¾'õzJĄDQ„(ŠPEż9ŹM‹[X[[¼nW|ß’ėĆüēŠ Ań«$—Ržgʘ ą÷pĘ\×Åččč tz½._¾Œ»ļ¾Fŗ®×M{y>hŠ#ĄÆ·čeY !ʱĀ0 Ńļ÷Ė7“ē` °, gΜÅ{ß{7F[-0Ī‘e9’4ļł˜æz¶mcbb##M†łły„aøė8£²5Y–µ€3gĻ”®_æÆ~ķćė_’·h6›·|Ž~æIPgŌv@Ēq$ ¤”p]nɚ˜9ģ e‚ ˆ_5…¦i?’R†cccæŃn·F£1”Vß5öę:6 Ó¼ŁP-ł)EA]ćåčŸ¢ōˆ¢Ż^o(ķo&ī»ļ^ÜsĻ94#ą\ƒ”B ¬ÆoąŹå׊iĀqœŗĆjjĶ‘&śż>Ņ4Śhøc!Oł7Pzpŗ®ćżų ?ū³ÆāÕW_ƛo¾‰'žxbčs...ÖéüŻŹaÖ¶Į¾ļ×’k×® .6Śņ<ļkø¹5™AńėCJ™ųńŲŲŲĻ Ćų,cĢ9ŹćÓ4Ešfpœ—üTģM’Ņ@‰0Œ$ ŗŻ+Ē’4MC«ÕĀż÷߇s÷œƒiY„‘ż ĵk×±pć:FĒŚ°myžĆ4 čŗ^õ 4`š&¢(Ŗw €[\üXµé/źceuĻ~’\™/×ų.//# C|čCBĒøxńb½@-R ‚”x)ÆĮM“æ0 ŃėõpćʍAĆD×õÆDQT ‚ Ž1ōūżė®ė¾ĢūŒZ#|Xā8FÆ×C«Õ*qœĄ²,dYMÓ ė²,ƽõ£(BZ„ĢMĖĀųų8ī½÷^œ:u–eÕ;IR,//£Ūķ¢5Ś„”8g°mg`œƒs ­ÖLÓB·ŪŹÜĢŌ±ælCd@§X]]E?øY>ČóƽöVVV°±±¢(źrˆJ„¤i:“øH}6ß÷QÅP# ”2MÓōOā8>Š˜Ań/Š®ėohšv•sžcģ–å5*ÅæŹlGŹ“$AQ°, ½ž‡ķķmDQXņ(a055sēĪį®»NĄ²,HQśų¾ė×®a³ÓĮÄÄ ĆD^õøn9ĆoY ]Æz ŹÓy³ŁDš$õ4@id”å!Ą8«÷ØRĒĪĻ”ē9–––`Ū6Lӄaµ'j‚Tā"Š¢ŚX}ÆF;Ö××ÕkH)å’ưO€ ‚xGĒ1śżž+®ė®pĪgŒ Å¢ƒÖóŖ.ųŅ"Ų‚iŲŚŚ®»ē†8ŽĄ¹Ī9¦¦¦qļ½ē055UY ! ¬®®įņåĖ`Œ”ŁlVõ~Ó“`™lŪ.W ƒU3a%`†[wēkš×± Qz°Ź`Æ>ŲÕrŸ±±1Ų¶]‹UPµ}5 ++d5ńE¶¶¶°“T›’±¢(žW›$‚ ˆw$¶m_Šåœ’{ĘŲ”×ÓK)ėÓÆa˜µ³ŸZTvꗁxddgĻžÅää$tŻ€¦•[×ÖÖpõź›p§ĢH MÓŖ@lA×up^Ž–¶Ą84^ī¼Ča™LĖD’¤Čórqs¤¢jD’&‚0ĀźŚ:ÖÖÖEĀ0D.Ź=՝ÆicõØįaWļDˆ²×ąāŋ˜ŸŸÆ Ž\×­}T€šPÆ ĄāœōŌ@AÜ4›ĶQĘŲļ«ŻŖ`PØ½ėŗąœĆqlåĻ-ӀVuŚ;©õ,ĖŹ…;kkŲÜģŌKzĀ0,ū†ÓļuÉAÓ4E1”}8 RJōū}H)166VŖ÷Æ^@żšN¾ļó<Ļæ†įżžŸJAÄAՐ0~¶kšĶó¼źH”ę:q’Ą0-čGžgČ2 q’`aaKKĖHÓ“nō˲t(«P !Nņja¬u]Æ‚GEQ`~~§OŸ†iš˜ššŖĖŹü(Ė2ŒŒŒ MS4 0Ęē|śĄŒ żŹAwBˆåtĄNa04 VōŖŸ©Å?źDHAˆnw Ææ~kk눢iš"Š"E ė>‚¢(ŹĢ‚äåźą*(–Ō)}pœļŸ Y–į§?ż)®^½Zo·×’NÓ†aĄ4MÄq\.ą1Mäy†45Å)VWWįy½Ś÷æ ąqœŌi}å9 ÖśAP å@ؼž•µļQQū ÖÖÖ†!lŪ†ć8HÓ“.G(‹ąr2Ą›%@A¼+Rfū €AņŹš'Š"ø®[všW§łÕµ5xžW}µjXzüUӝjŠĖó®ė"Ļs¤i ]×ėūėŗ>4Ļ! F_y嘦‰ßüĶ߬>22R7 :ŽƒÉÉI†<ĻT ‚ ī” @ąŠ^¼yžĆ¶mdi¹Ą'Š"ō}ŪŪŪčõzȲ a–§ü*•Æ‚±jšc(3¦iÖAČUŖ_ķ'Peå J‡iš–«ŒWVēy]~š}æÜaĄŚķ6,Ė:T €AqGŠļ÷ įaļÆi’$¦—΁ż~«kė‚ ī PM{Ø}ųu]Æōņāfƒ_–e`Œ!Ļs†Q>wUóWM{ŹÓß4Mčŗ®„ĖŠī‚Į ?ųo)%–——qńāE,//#ĖJC¢f³Y—3`tt¦Šń$‚ ˆ;Ć0Ž$Ź„?åéÜó¼zĖ^’$ĆņiT@• ­čU÷“Rֆ=ź1;½üՖBe[<(ƒ’ (Pه7n`eeq×Ė‚ €ć8Š4 333`ŒONN$‚ ˆ;žĶĶM)„ģöžŖv<ĻCu=0MÆR÷Y–Į4“ŅõÆŗ]Ó“”…=źg¶m×£€źŌÆĢz”qc¬ŽYPö h{–E@’$xõÕW±ŗŗZŽ/Ę1LÓ¬½Z­c ʘC€ ‚x·åĪB„a8tŅW§łA·=µ„'/ŹŌæjØ@¹ń)wAUPW'ūĮ½jtP­ū-ūuVb?¤”ŲŚŚĀ/~ń lmmÕż®ėĀ4M“Z-Õx(IAļzG}€ŖĶgYVmU³W§zÕŃÆĢ|Źt?źģĄ`|˲ź]uē×÷S™•mP'xÕS°[ąWā@nmm!JĶ£öŒŽŽbzzśšaž~Ÿ›¬€ ‚ ˆ;†f³ŁaŒ}†1ꮎP( Jƒ÷ŌŸJū«lmŪ€`ģ¦; ”ŗĘååb”A{`%.ŌdĄĪ½6 *Ņ4E’$h6›uS”ZG¼½½żķ_žņ—K‚ ā]ĮŅŅŅ? !ž”ņ„£]×/\æ~=:蜐 ‚ īxÖÖÖB”&Aė^¼mff†éŗnpcŽ3ĘīŖĀ™¢(NV?‡ī”Ėó¼.ؽ”€Šu½ž^M (ā8®Ó’J4ģ•‘xć7š|@ĪĪĪ~÷0ļ‹Ańn@T}u\¼żäɓ,ISÓ4—16¶S 8 `¶-6¶3 Pć„jš@•ŌØ :ķ«ģpÓ}P9–ĶƒĆ“ ż~ŪŪŪ%„üÖa>7£’z‚ ‚ø}Nž<‰$I ]×]cRŹĘŲ §œaŒ0` @‹1fa>UūW'~]×Ėœƒq^ U&Pyž ĘŲ_fYöoÜøq(/Ań+fvvVBøœó1“įīJ ¼‡16`€ƒ żąX *čŗžēyīX”R¾RÅw|{aaįŠ{†IAÄÆ™©©)1ępĪ›•@xcģ$Ź&Å3Œ±YĘXÄ{ Ą\Š[XXČé AÄH£Ń`'Nœx[ķ’ėĢh§>IEND®B`‚qjackctl-0.4.2/src/images/PaxHeaders.14935/quit1.png0000644000000000000000000000013212700760152016660 xustar0030 mtime=1459871850.615906288 30 atime=1459871850.615906288 30 ctime=1459871850.615906288 qjackctl-0.4.2/src/images/quit1.png0000644000175000001440000000033012700760152017420 0ustar00rncbcusers00000000000000‰PNG  IHDRó’asRGB®Īé’IDAT8ĖĶRA€ +|É?É3Šgč›äMó 3U77—u-[š«@<0Xź}ŗ€š&+^¤ŠG-Ų©øT‚E¦ČŸĢČAG[ęÜv ēĻ,29ŌÖkÓĢw'ÖĖŃ˜;sęŽa¼Ē”Eęµ¶Dn²7³µÅbŪ ÜŁŽrßs»÷Ų>'`®65ĮIEND®B`‚qjackctl-0.4.2/src/images/PaxHeaders.14935/play1.png0000644000000000000000000000013212700760152016643 xustar0030 mtime=1459871850.611904288 30 atime=1459871850.611904288 30 ctime=1459871850.611904288 qjackctl-0.4.2/src/images/play1.png0000644000175000001440000000040012700760152017401 0ustar00rncbcusers00000000000000‰PNG  IHDRó’asRGB®ĪébKGD’’’ ½§“ pHYs  šœtIMEŚ#¼-Ÿ€IDAT8Ė­’Ń € D†Ąmt ]C¦Ń:~BJć%ż É»pmį7-)Y0÷Ā"BīF瓾x‰”æQłfwĄČwķF^“c4 \$×gc“iå1ĢśuÖŻ6ƒ žĄ5¶…Ø»ƒŲæDXk†#Ū3]‹Lą ó6^LÓBåIEND®B`‚qjackctl-0.4.2/src/images/PaxHeaders.14935/mporti_64x64.png0000644000000000000000000000013212700760152020002 xustar0030 mtime=1459871850.611904288 30 atime=1459871850.611904288 30 ctime=1459871850.611904288 qjackctl-0.4.2/src/images/mporti_64x64.png0000644000175000001440000000335412700760152020553 0ustar00rncbcusers00000000000000‰PNG  IHDR@@·ģśPLTE       # # #!' "#!*"#$"$%#3%%'%'(&()'/*++$+,*,+.+.",-+-/,01/7752'315130231689496342:8796A<A8)9:8@=@:4CBI> ;=;==6P>J<X;=?ICUB@B?a>CD2ACAJEMD$NB.VEDFCOE5OG,GHFRI(VJjEXH$TH4IKHOIClGOM0cNKMJNNFMOMSR:VQ@[[RTQnWUVTVXUbaY[XgY>[]Zk\B]_\mc#^`]dd:_a^`b_ac`}a&bdaib\scCkgDoh9ti)khJueEfheuo&mhgpikhlnk{r>npmnNvnhoqn…vwvEqsprtq‹zsuruwtwyvxzw‚xly{x’€zy{}z}|†]‹}f~€}ˆ~r€‚ƒ€‚„ƒ…‚‰„ƒ…‡„ˆ‰†Č‡‹ŠŒŽŃ‰™G“’Š•”zՍ“•’”–“°¤–˜•˜š—„œjš›˜¶©›™Ŗ™Žœž›¦„^§”{ž «ž²±±žŽ¢¤”¤¦£®Ø‚Æ«q„§¤¦Ø„²°i³®tø¦œ«­ŖÆ±®ĄÆ¤²“±µ·“øŗ·Éµ¤¹»øŗ¼¹ÓĪłæ»½ŗ½æ¼ČĐįÓĄĀ¾ĮĆæĀÄĮė×ÅČÄĒÉĘĻͱŹĢÉĪŠĢĻŃĪŠŅĻÓÕŅÕ×ŌŲ×ĪףÕķé|ŽąŻćåįåēäēéęėźįėīźńóšõųÓ÷öķō÷óśłÜłūųūżśžżōü’ūĄœ˜tRNS@ęŲf IDATxŚķ—olEĄov •ŗR.“”šbiįųcÕN,2­ĮK¬&&č ˆG©aSmŒ’iɘh)րS¾LŖ±D†@(i”^ŹÜѓž&…šl{ÄkĪŌŲ»6qvļ¾vę¾ćū¾æüŽ›7oŽ:’šę«Y}Æj‘ – æ >˜t@NČĘ”ųĢch8Z¤zå "öŃŁ#s„ ĪćKwœī½uI>ēŽ¦¦ÓWoŻ(–&¼ŃŚb~.QU¹¦x¤„µ©élļIüvcūĆRg¹¬„µłŻwĶĘŌ%Kx)ŒśæĄŻĖ”å/ :Œ›×>7X„ !'GÓi„üÄĒ Œ‚““CidU·( wf1Ų‰:ņ(F4°0óØ•„ŖØ‚ķL˜=ŲÓĮü”øsÅTÅrāŒ$&yĻšyœ"Ŗšq Ÿ…b}Ōś‰_™!ķ`xĆ”‰ÄXŌ’(Į>‹2Ż@,ć„Hw(õŠ9 ø &l(61Į:Ic©°ƒR®[„1‹`9”«‚ķˆ8ĮĪĀrš­ >S,‚åŽĶ8TĢžąµ‡ūu˜=a „ģ:0¬»óŌŁ—ŃŽūu#ä{J —* Čԁ²ÄhŌO¢ w0Ļ"€ć6<ŪÓĢ|Ÿ®",df—;qŪ*!‚-”qj„"į0ėé$X”@Ōė Ź¢įĮp÷‡ļÄ„b«)K¦œp3Ī㸁O 8='bfBwˆU2!N0h4:Lj¦Qāu9Ą§täįFˆ‘ß’ųåāŃś Ō‘¹Õ5p#$žk„&““œšÕ³ŖĄhPĮJX §›HÉä_a±Šp)YkŹ%šę¦ćÓSįÄC"ĆÅUƒ*6’v€S§ń”ÅŃB‚ Ö ŗĆ¾§š¦tӄķpž‡ŖJhśo iĀųōß?¼¼öł&œ²FóŌm¾}§aA(vӛ{·Īß}ÉB‘érėOvݾówpBåĶ+Ļ­Žüń"‘7“ßøåGĖ(ū ē½øož¦o>#ōl•ķź²ó  'v^XüŹ«bĖ ę‚=œ°aUķŽ/qķžBE_”x뷟ņ ŃŚC͹ėhĪžo}·{4™¼Kė]Ąį!¬ŲÖ/•JŽ|ķ”[ؕ†×?˜J„bŠ!K.žūuņOšÅß͜g^[ ’Ēæ,žéē³öŠ{-ŗIEND®B`‚qjackctl-0.4.2/src/images/PaxHeaders.14935/copy1.png0000644000000000000000000000013212700760152016650 xustar0030 mtime=1459871850.610903788 30 atime=1459871850.610903788 30 ctime=1459871850.610903788 qjackctl-0.4.2/src/images/copy1.png0000644000175000001440000000050512700760152017414 0ustar00rncbcusers00000000000000‰PNG  IHDRó’asRGB®ĪébKGD’’’ ½§“ pHYs  šœtIMEŚ9ńaJjÅIDAT8Ė­“Ė Ā0Dߢœh *pČéƒHl¤ŠGĪĪ-ŠĶ,‡ā8_#Y–¼ŽŃ̬ ?BTÕ抪z›,Ŗj)źŗ6Ą€ŪZļa­hfŗF2"pĪįœC¤!Ļˆ4@‚B0ą“Ė„KÕÄR–*čpY°tE… œ“mŪFš~—8 DīżĶźC²ŖąŻą½Ē{¢ f&3=Æiˆć‡0³čEĘéź^±…2%X’»8ĘĻQP_²õž†ćT”htbIEND®B`‚qjackctl-0.4.2/src/images/PaxHeaders.14935/about1.png0000644000000000000000000000013212700760152017010 xustar0030 mtime=1459871850.609903288 30 atime=1459871850.609903288 30 ctime=1459871850.609903288 qjackctl-0.4.2/src/images/about1.png0000644000175000001440000000140412700760152017553 0ustar00rncbcusers00000000000000‰PNG  IHDRó’aĖIDATxŚ“KHTQĘæsēĪxÆ3ĪE±°ŃZ9•Ųs¢)ĮhŠĀB’ŹŠe»¤M”P›Āj‘‹6AŲéM› AYł QqtĘG¾õ^¹ĪÜĒićČXżW‡ļū’łŸsžQg[©YŠfEP}¢”·±”Ģ.ē# ž'óE“]ӵѰÅTBU@DZT „éžŗĪn/ Øź¢śŽw÷§zčёoĻ0x))óćABt2gĶN³ezIéłO“vNv=,ļ¼Z²óĮć]§|Ō¼²x„­ĄU|¦Ž¢śp$XÖlK/øČ+Ÿ„Nwcf1\r/Tŗ­jŒšWKrcśŽš‰Ü²>åÓv.HŒsßćö¼ņu¬«ØCŒ2Õ+^m{ qšM5€ö ēłoUH‘FŌI£š¼PTcja5=Ž< ęķÚeU©@ n²Ż9¶÷j÷Īī²Äw㉯-ė=?©Ī`s3NyN&Š4ā ĒLĶ5%œæŁwg¬C»żĒāœ5ĮĖr°|Š›™‰M%`X“ošūåżĪŪ,_4Eżėŗ &“DUT73„Ńū £oweā?‹a±%27Yėf>\bĈ“gyV$&ēÆ^>”[\žöŅ$ė1š T•Ž2žōÕrö\’²”śE¬Żüź¦\q°9kŚ’ˆ&ē=Ą£m“ B’0?Ż’Ø€o‘ģt7vl>#ќŅ÷­®²×ö€ €õäĖ>kQżxćÖŹajuzd›– Ē’Qb2„ķłįX{<ӐÄ*OĘdŽĖ&ņD•±USlī©ī.ŲrYMP­i¹ĻÄX2J®S Ļ›ÓwńzŽM 2€|K…Ą³¶ˆŲS’ŲČ?m`XÓ~]‚}·¦„tjTčU¼zŠxćoX.;„˜ ųIEND®B`‚qjackctl-0.4.2/src/images/PaxHeaders.14935/aportpno_64x64.png0000644000000000000000000000013212700760152020332 xustar0030 mtime=1459871850.610903788 30 atime=1459871850.610903788 30 ctime=1459871850.610903788 qjackctl-0.4.2/src/images/aportpno_64x64.png0000644000175000001440000000343512700760152021103 0ustar00rncbcusers00000000000000‰PNG  IHDR@@·ģ÷PLTE       #)/!#!2&( $1!+B$"&/!# %4-D'(,4)8&(&)+(.*)4A+-*1:?D,.,>^ ;=;IZ Ms#IJ;?A=?@=I?/S]AB@Zt?CEQfYy_bDFC\Vf X„bp[_elGHFJHLTH4fJLJd”dxg’'YuMOLh OQO bwen“hŽjmRTQ5`faS9v|n‡qs8_lTVSu‚t²}‰~„ yuw/j†[]Z‚“k\Bd]W-q’`b_k`Oo`FƒĄ‹–bda‘`egscC‹œ$}|»„–ueE?xw4~€hig!ˆˆŽŸjlinlplnkšŖnpmoqn-Œ’™Ć•Ž€oNqsp(‹·X~€C‡œ ¦“wyvxzw£¬#™½¬Į7˜˜z|y®¶‚ztA•–ƽ|~{}|(£§‹}f{€ƒ~€}?š”n‰†€‚¹Ą‚„ ­š³ō„†ƒx‹ŠŗČ…‹Š„‘“‹…Įū˜Š…Š’Ćɏ‘Ž’”!¹īĻŌ“•’ĶŁ8æĪ§–‹š›˜^»»ą÷²žŽ£„¢§©¦©«Ø}ÄĒ8āēµ·“œÄĘɵ¤¹»··¼æ²æĄ¦ĘÉ©ĘĆ·ĆľĮ½nčźĆÅĀĮĘÉĘČÅČŹĒĖĪŹ°ŁŚÄŃŃŻĖĄŠŅĻµŽąŠÕŲÓÕŅÕ×ŌŚÜŁŽąŻāąäæńšŗõóćåįÄööéėčķļėńóļšöųō÷óļüżüžūł’’čTb¹tRNS@ęŲfŌIDATxŚÕ—mlE€Æėīv·œƒ·ėa€^ļZDBYćGĄ–€Q7!”Ęč­¦-4•Š`-œR5ēG,[ćIƒ()1¬50‘Šx¤RSłhżą‚ÜuĖ ø),† {?Ü»žśwgś‹ł’ģó¾ļ¼³óŽĻw/€‰ŠĢ‚Ī“ ńüĻ覽+Nś šÖu+‹*d¼0ٶ“Dg\³ĢW„c"ó«#©Ś˜Ā)ĒfeÖdĶė õØ@æ Y޾P”x„düjŁ)(ˆoB–'ÉæsdTZ#3ä%D’Ó©[¶Ź³2KT’s¶“†æŁJęĻZVZ¦Å]ź 2æn;)ČŠe²ü·³,·ž25ˊž¬ė/„ ~ϧtȐæKށ’Bł&°(śĪ‰}p×ņ“yó*‚U€¾€*üy£x͚5ūg­Mk¹vųš¶m ‚9bõĢ$D„8/Ÿ[ńėiĪģŁs÷O>\Twz×į-[ęY –)Ś‹ °_=6įūłŌ¾¾¾ ķ—ī>¼k’¦y³&µ×+˜ p±9 1į|huuõŒ’Ó@lŁævĮ¤īö=I!>.–Ė'•@qõóBhaaanū¤}ū·l[;oAK…£#Ÿ'Ó哪`G^°ˆ‚FēM»¶,ŸŌŽŅ^S$ØĆĒĆÉĪ1ĮēĒymooo×ēyŪ² Փk²E}łų€ȟ˜šż¼²‡‡‡›·{»oZŗŗ£„‚#Æ;+HȄ€§€ ܀*l2źbõ¬½‚ęs±åÕĻ”)ųž\Ū ¬ĄĮDMÅLK\HHd£<÷ØŽm/Ī/ĪĻŹŹŹÉHŹHŠ‹‹ ńó‹=voÆ 8M¾%@0xūžÕ«Wž<¹uėŽ­s÷Ī ‡¤Ś•[·®ZµbżŽ7Æ^æ-š9abļ„ŽJ”Äoõņé [WMo+͌vbʒ;žüśžżóĆc›ēOØ-ąĒnjj=uźŌ¶oݼbÅüŖŅLTł†÷ÆąŁ³·o]æ|żÜå½K{UQČ%D'DGGG€PDD„æ“‘3½óŒ_Q„æšIEND®B`‚qjackctl-0.4.2/src/images/PaxHeaders.14935/aportlti.png0000644000000000000000000000013212700760152017453 xustar0030 mtime=1459871850.609903288 30 atime=1459871850.609903288 30 ctime=1459871850.609903288 qjackctl-0.4.2/src/images/aportlti.png0000644000175000001440000000031212700760152020213 0ustar00rncbcusers00000000000000‰PNG  IHDRķŻāRPLTEpH@€€€€€@ßߥĄĄ’’’³)ņtRNS@ęŲfcIDATxŚ-ŽA€ E-ÜSkĘ;Ų’8īÓŃī„Pbß’øV[µ¾\Ńya°‚Š2ÆŚ)©PpHx3;µ>…„ŚŁ{J6reøFŒ#seŸ9ŠĪ8“żGķbóŁIEND®B`‚qjackctl-0.4.2/src/images/PaxHeaders.14935/stop1.png0000644000000000000000000000013212700760152016663 xustar0030 mtime=1459871850.615906288 30 atime=1459871850.615906288 30 ctime=1459871850.615906288 qjackctl-0.4.2/src/images/stop1.png0000644000175000001440000000032212700760152017424 0ustar00rncbcusers00000000000000‰PNG  IHDRó’asRGB®ĪébKGD’’’ ½§“ pHYs  šœtIMEŚ"Ž®MdRIDAT8Ėc`Tą?Ćb0ƒ=L#²ę³DZt–!Įį „®5`Ō¤$é0“į1šŅ0’2Ų“`łAŖd@"2ś'ėŸIEND®B`‚qjackctl-0.4.2/src/images/PaxHeaders.14935/aportlni_64x64.png0000644000000000000000000000013212700760152020320 xustar0030 mtime=1459871850.609903288 30 atime=1459871850.609903288 30 ctime=1459871850.609903288 qjackctl-0.4.2/src/images/aportlni_64x64.png0000644000175000001440000000332412700760152021066 0ustar00rncbcusers00000000000000‰PNG  IHDR@@·ģ÷PLTE         !+"!/ "$"(&3"1%&'%*'/&4%()')+(.*)1,>*8)+-+A--/,F-<1231=4675796A?9:8F<;=;>@-R<J?;?A=?@=I?/`=AB@LIDD=HF*DFCGHF[IjEJHLTH4mHKMJ_P_T sMOQOdQRTQaS9]ZfWTVS``r[€WvZtY%kd[]Znbg`2k\B‰Yl_3d]WŒ\xavd`b_k`Oo`Fjj €fbda€f`egscCueEur”cŽhhigzv‡mkmj‡j/•mnlp”gyƒtmolw ¤joqn€oN~wy;qsp†{q0Š~~}3vxuƒ”}xzwS²uz|y‚zt–ƒ‹†&}|”‹‹}f{€ƒŽ €‚‡>»}žŠœ‰•‡?‡‚Œ3 Œ„†ƒ‰ˆn…ƃŒr‹Š œ™•<“‹…™˜/˜Š…¶‹/‡©™‘Ž’””›;˜“‘”–“Å™­¢°¤¼™ „¢2§–‹Ž”š›˜æ¬¼®²žŽ£„¢æ¶§©¦Ä»©«Øļ­ĶĆ»»_ö²ń¹ĪĄ:¶øµÉµ¤ŚĶŗ¼¹śĄŌϾÆĒÅ|¾Į½ÄŜĆĀŗĀÄĮĒĘŖČĆĀÄĘĆĘČÅĒÉĘÉĖČĖĪŹößÓĻĮŻĖĄåą<ŠŅĻēāHÓÕŅ׌¶Õ×ŌŽßµŚÜŁéémŽąŻāąäćåįéėčńšæńõ¼ķļė÷õÄńóļšöųō÷ó’ūėžżōż’ū™‹_tRNS@ęŲf‹IDATxŚŻ—YLAĒéīΦŌm±`l ‡6*%šØklt Ž5Ž(õŒĮˆ1€Wźµ¢©«x!¢Å”x@P£Ø \  įJqS‚¶”ĪVš™™¾ē}łĶ’ūę›?æ’c‘qI_¾¹v…/Āl—%_ĘųFœi,$XH—↲öеO¾ßĄ%l¤)öüówßóq $›²J!ÜĮ&¬:œ’Ņķ@b¤” Ż~x›×!_5ķĀ£« 5ˆšMń:<·~ūŁv{łœ ØĀßė°1Ė婾öŗŖČ–€H č0s„ åÖtžl«zf[ģ O³¬äń(„R A©hšµÖ{:½×Q 4e ­g…Ę?č»“ÖŸc†,°¹aŠACZ–—Ż8äĪ7ēŅ ĶhYks×.ČÄSŅ BÉAĀÉ!dĘĶŹ†4ƒ0ŒYlÄp ū­+©THBĻņĶdų¾ÆÉ›’VóōtUĻ ŃM°B=$“ēķ8øįl’ !VS­Urųš „­źQņčžĻńǁ"Ćņb§óó‘M/ÆQ÷¼”½„ō0 įĻłĘ_¹÷¾|zœwq Õó3Õ½ öo©h®†„ĀĖÅį $Ąs”5‰eRėGHø²25‡ōŲQ'–K­Õ·N–e¢åštqXߑ1 œXV.~kozUd›ę°·aĒ © `C5•Ž=>aŲC‡„•Ē2Ēŏˆ5ņ¾»³åĢAŪžI(·ˆ˜\²õmfl|$ęŹr_|å',Ā! øĄ}ˊ!A Qr9ėųį4ā>¾ ųķ‚° x0XÉÕQĖ«§4=8µ ųčūWi- ®:tBtjĮ®—/w6‹ tųÕ!!@tjā”ÕQ‚CĄu ‹ ź":0ć9hz…Ģø“ä¬,2žŁ;¼ō8ÉY8Ÿž«Aūż ė7¦`Ė&N-æ!IEND®B`‚qjackctl-0.4.2/src/images/PaxHeaders.14935/aclienti_32x32.png0000644000000000000000000000013212700760152020246 xustar0030 mtime=1459871850.609903288 30 atime=1459871850.609903288 30 ctime=1459871850.609903288 qjackctl-0.4.2/src/images/aclienti_32x32.png0000644000175000001440000000310612700760152021012 0ustar00rncbcusers00000000000000‰PNG  IHDR D¤ŠĘ÷PLTE03'" ( - 27;?9 BEINP34.75)TM6:,X[<:.^<=;>=6?@.g#ACA e&m"j er&m#JL9v".a"w*6d })t/w+ ~"(r!KZK4m%‡*VUMTUSWXE‚/ZYR[\I1({6¬Ya“nƒƒ}†ƒu{Ÿ^Ŗ'–7‰–)w؉ŠuJµAl™{{ž;CG³fƒ„J¶UE¶oPŗŲˆ½ÖE±į,·į Ųœ­ŽR±į8°ßIĘĀ“ĮÅ“Ś°Éș¦Ś²ŹÉ­ČɳĮå5ĢĶ£ĶÉ»½äXĖŹĮ½ä_ĀčFĒź/¼äuĄåiÓŅ¢ŅŅ©ĢčKŠĻĒÓĻĮŃŌ±ŹėXŗāĀ×Ų®ÕŌĖ׌¶Ķź}ŚŲ¼ĻģqÖīTŻŪ«Ģė„ŽŚ·ĪźŚŁŠŪńPāņ9ŪÜÅŽßµŲļuŚÜŁåóJŌīĶģ»āāøāņjįäĄĻėŌÖš©åćĒŽņŠčäĀįäąāęÕėéĶźöęō®źėŌę÷ ÜņäįóÕźģéčõĮųüsļšŁķ÷¹īś«īņįēõčķöŻõńāšūŌ÷śÕ÷÷ķłūų:^(ātRNS@ęŲfżIDATxŚc` 8£#07w€Č›’łóē7üųńćė×O š^¼xšŌ¬(’ćÖ­[§N:rźčĪ;7€ĄĀeS—}| d†ńŸ?ułŻMŻåىA®VZJņ@ #'!Įēyö˜XĮ³üoß¾=<±ežō¶Ā‚(g°7ŌQRā?{I¬ąV÷ū?oßżDR`i¦£)/Ć bĀļ[Żoæ}ūõįī¢é…YĪ@yCM%y¾ÓgE š>üśįóē5o.ēĒĪøZŌ”ć:} bĀ•ņ'Ž=zōźĖ'%Y‡ē.5ÓQW’ć>vLā†ģM›><ŗ|ńņžs]±3Vu¬œŖ$##ÄĒq āČo·ē/zułā™{Žß¼{nG{}k®žŪ”C@F?Ž­YšņܹćĒ÷īżxūŚ“öƊ”˜t_ aĪc‡Ą&ü>åÓŁłņĄž=ė—ÆśxūpGE}xxœÆÓ!ˆ~qĶ+<³vżśåKVĶé_ZŸŃZ“f ÄĆĮT ²āŪ)«¼„żĖ—Æ»?åp–WźÄšZ= !nVĘC;DĄ ŽhłūĻ[5ķüŚÕēķķ{Āćå„ų¹Ųؘ™`üc·¼³sÕö¹»œ×–éؚŚä*Šņqq°³2:ķ€˜šu·–³½ŪńķU (°ŃU–ćććbceb“;“lĀW ĪYżĄ82Ō1Ֆ‘āćbgef“³;1įÓs9p;›ꨫ*ˆ‰ņó°³11:ٱÜ›`ōõłĘ@0š ņövwwwq±¶Ö·Ö×wŲvp38Ušæ~żéÓ÷ šąĮƒ§O/=8}ćʍ“'OÜlIµOĖfĻ^øpöģ¾Ł½}½-Õ-„„„Ń(‰_öŁ­S;7LmHŽōpPįŒ;Œ’üžśõõõ­Ėš«£X0¤“’’vļŽ½qćĘe gĶźķ š@•O~ż.½t čøC‡mžT*‚¢@ĄĮĮĮ„ĮĄÄDEZ—^ģ^q·ægĖIEND®B`‚qjackctl-0.4.2/src/images/PaxHeaders.14935/start1.png0000644000000000000000000000013212700760152017033 xustar0030 mtime=1459871850.615906288 30 atime=1459871850.615906288 30 ctime=1459871850.615906288 qjackctl-0.4.2/src/images/start1.png0000644000175000001440000000037612700760152017605 0ustar00rncbcusers00000000000000‰PNG  IHDRó’asRGB®ĪébKGD’’’ ½§“ pHYs  šœtIMEŚ P f ~IDAT8Ė­’Į € EŸ„ōī6®”s0Že&<F iJćOz Éūį·…ßt’,ŲšĄswŹ}…üē«ß(Œ|³ŪaäE{…‘WŒ\×Čc®×Ɯiå€Y”ŽŲ€£7øXæ…Ø»”/Q֚YHĄZ¦k‘ ¼€'PĻJSŁIEND®B`‚qjackctl-0.4.2/src/images/PaxHeaders.14935/connections1.png0000644000000000000000000000013212700760152020220 xustar0030 mtime=1459871850.610903788 30 atime=1459871850.610903788 30 ctime=1459871850.610903788 qjackctl-0.4.2/src/images/connections1.png0000644000175000001440000000110412700760152020760 0ustar00rncbcusers00000000000000‰PNG  IHDRó’a IDATxŚÅ“_HSqĒ?÷¦»8‰E͹&iB„ł§‡ Ŗ—Tö" ‹&½”Fō’1(Šš„ ņ-Ø XOB(TŲZOf’Ņ& Ms2ēv[›ŪŻŻļ׃J…=/Īæļ98°Ń¦Č{ĻD٧*Čü<³#?čs#‹ å*_i-$ŲJ9óĮAęJÄ)Ōp€xK(Sa0IpȾćQ|ŒkŃ4, xų“P@S9Ż. įj…`#²ÓɃÕfóŽ_ǐdF¼F#bQģknŗTÉåžzäŪD{yŸƒ‹­¾H«J°żL×vž · ß4bčgY|^‡¬(AvÆ Qļ`؈ÓlJ„d^>IŁBz¹ąµUäJņ¦’}ŻSx_5£qƒ–bģœ`˜°IPĘŅ’r¦„€Nr*‹]Y‰iĄOš<ēÓtśBąŽ‚Ø³¢¾ˆņåeŒ›E3ĄäšūåN.œ ŠåBj Ÿ=vŚ^ļEö#½®ÆĖĄōįILsDŖX,).>ł†µ'¼^ ˆ^qr÷Ģ6nk„×.^ŁTRCųŪĘł¤Œāw,Åę¼€š<ž%18 Œ®*ŻØ¢’؍ÓBBVĀÓ9bu*€Zö„ÉU FN’Ź zÅ«6•£Frō‚€Œą½€Ž Fžč+Švr^ˆIEND®B`‚qjackctl-0.4.2/src/images/PaxHeaders.14935/rewind1.png0000644000000000000000000000013212700760152017166 xustar0030 mtime=1459871850.615906288 30 atime=1459871850.615906288 30 ctime=1459871850.615906288 qjackctl-0.4.2/src/images/rewind1.png0000644000175000001440000000040712700760152017733 0ustar00rncbcusers00000000000000‰PNG  IHDRó’asRGB®ĪébKGD’’’ ½§“ pHYs  šœtIMEŚ%:żģ?r‡IDAT8Ė­“Į € E_Œ1Lcčn£w;S= &jPJü Ā’Æ@ZųMQšmŽØŠ[¦wHT½{{CEyõ­Įw@E° ˆ:×u—sXĀO@ƒ®‘?n‚TxB ĘP©–¼Ņ dĻO65’Äēdy`Ų½Cõš@`ą”AœO#L‡IEND®B`‚qjackctl-0.4.2/src/images/PaxHeaders.14935/acliento_64x64.png0000644000000000000000000000013212700760152020266 xustar0030 mtime=1459871850.609903288 30 atime=1459871850.609903288 30 ctime=1459871850.609903288 qjackctl-0.4.2/src/images/acliento_64x64.png0000644000175000001440000000604412700760152021036 0ustar00rncbcusers00000000000000‰PNG  IHDR@@·ģ÷PLTEåŠæ # *16;?HM((!RK#W]J+b!h U)76*l$r(x']5n1~,@B5„+P=.BB>^9&EF4Š/{7.JG;u@]N4›0–3@™5fI;nO TRESTAUVRŸ@  ?—C¤DlUI„X—P^_L„OcdP¦MfeL—Zq^V“_heXegf^efd¢W‰o«W+wježjsrXqr^Æb«^6tqivtg«oˆ¦fC’¶lš{—{µgB¶n!‡>}p·n3‚‚e€€z®qR„…¹y ·pIƒ„oŒ‹5øpOš‡3 ›%±Œx½{XĮ…–”M‘‘u‡·gŊ“”m’ƒÄŠ0Į…b¾™”–““¤™˜ĒX³¤Æ£,Ē‹pĒ”ŗž5¦ £¤|¤¢‡Å”{ĻØ«©_¦Ø†Ó„(§¦œĶœnׯµ³Xزϟ„°®‹Ō«JČ„•ÆÆ¦³²™Ž¼ÓØ’Ü»Üŗ%ŌĀŗ¹Š¶¶­įĀŹĆ;Ą¾vó«Ķ²¤ą¾5ĆĀ“ąĆAڶ›½æŗĢÉlęĻ įĘLŻø¦ßĀtÅÅ­įČUÄŵČɦɏ Śæ²Ķ̜ÕĆøēÓ2åĢ`ēĪnŃŠ ŅÓ©å×`ļć ŚĖÅŅÓ°ÜŪoŠŃĘčÖkėŁSšß5ę˽ļā+ėÖ}ēŠÆŪŁ©ÖڶšāGģŁŠŪŁ¾ÜÜ²ŽŚøķÖ¬ńä^čÕŹńćrąį¼ńēnļāļąŸāąÄńā›šč€ćäĪ÷ņUųōHóę®ńąŁģé¹ųóxéźÓģźĪīģĀééįśöočģŪģīŹüśgņéāšģŻśū…łöŖōņÕüūųöÅōōŻöņćžüœżū§õņšņöåõōėūś¾ūųŃ’ž¹śłšłūųüüģ’żążžēā²tRNS@ęŲfŪIDATxŚķWkTSWä!`„I° ¤Qƒ$j-¢V±J•ąGA•RE@°jG)/AyˆŽ&R @¬- BŚ”Ē˜¢„ghijĻɳ?tü9kÖ|÷^’µXßw¾½Ļ¹{ļL›ö悙nž3¼0ąÓ××wŪLŗccB7éłˆƒ#ƒƒŖo*Lgi*6žP ˆą‘HR @,īéĆÕ…ŃŽŽžööęv~¶Ę⩸²I, ‹"‰H$‹‘%J^WW3¾r›ÕQøa¾Lv‡Į`Ą}­ «  K‰ļ p'Ąß„„„˜¤˜˜ą˜ģrigŪ«6Ąź²É`ūµ¼}½½×V¬Xppp°““43#Ģ0L&¦ĘĘs˹Üvöb]`ļkw*+Æeff&'GEķŻ»ƒF£}±ĢɉdG"“I$';’­5Ń|1 a®F`bRdM(ö …æ54Tž gŽļ=Hóń”R)ōĒTHv6Ö6ÖVĘl¾®€l’±öNŸL&ėėžöĻŹ²²œœä3‡ÜA‹Ż·Œź‚č …L/¶Ą·²²2¶ŽĆūŽdBįąŌ ąg€ƒĆą 69 ø€g²°²śˆhRĪēk`¾ą`ŒH‡§~.ˁ3‡īÜ!ø .Hų6ÖÖVD “ ~³6„ Å$vŠ'ö½ æĄ¢ƒčhO*…@¦d€H$Ī(ē³¹Öī‚ …2”TśB ’GNFʍoĮ@ąž]T*%Ś$Šņ°¾ €HÜ?†° …Sćæc‚ŒŒŽ±onŠŻE]š6Ōé \ €óŗ^“ cķ °…o‡Ÿ Ē3:ī>ŽO£E”F]yй2€ą ZĘl—­Į ^#,˜ž<é{<ÖZ}{`O mgėƒōōī#$¼(ęęęć Ž¶Q•e ??<éx4šz ¦ŗųuģ&Ļ#ūü‡.ŃĻ6•’H(Ö(Ds33Êž6x +2ĖæŒwtżé_OJĻĻĻ?yņdXX˜_Ųö¶ĻŸ’§łś|6Sė@Ŗ`8ģ=~üų¹×·«„Õ‹ ‹ órūŸ–¼źOĆBü6śmÜń×Esf™›čC˜jŽP…Aą0`ą~) øčyéUCŻÆšŚņ•„ģܹń+ CY3111Ög¶ŌjO"Ųø’ĮŽ6Ä @/éĪ}Ÿó’±×Eąė1k56ČåŅ,‡@x÷kZ1»0ųō¦Ņ„ū<¶Ż=‰לŽXoN@eų††z-µ:9Pˆ ,i“@ķā(^¼jōR=½;Ķ…¼mŪÅ«į!~a)#±Ą¬ĘʆzZ/©Xže¹l v4/Ɛž×4ŚD§_źö';­Yłåõ°Ó‡ąPžĢ7ą0[˜Ś&D $ąééé3š›GĻKŖŗBæŅæœģ“r„ķõ“ē×£W@•CC}Šq —в,ØTOŖ'œ|:P=J›Ņė;”mūŅnēł°”-,Šś8`@ŸSŃØuą%—‹²LØ A½Wõ„K=Ś^uś“ɶ ŲŲ~u> Ō40ŠV‘&‰R‰¼ĄĢ Unē“^¾’ˆ³³ĒETÄÖ¬±±²>ō©¼‚Ą,X čėé¹3u’øA.e©<†Jčõ­ĖQ#!+¬­Qž>A°¼J€Y¤³ ā,ŁÅõ“Ž+żŃØ‘pXš‰õGPń˜š¢õ‘‡Ćl¼ÅtŌHÄJŠ€<ŗūļ/w†.¢lCŸŠŪ®*ś ąŽčģ‚X’eF¦(›čņå€3.ĀPĆę-@EŒ`NŠī Ąįø3o±Š4F$b† ōг8V˜7ĻŹ!‚’o  ĄŻŻõ„Ī.@$]±ƒHA=˜Bv!#ø}ņ1QÉĒžÕ ąø»CuÄ7ˆ¶vJ(ĶCģ=UśTt}ģßŻŻŻ^<Ģb]Ö8čĮ“ŲĶS'NœB×»‘ ś¬{;ÜČb^ž­°éBƒ\ĻąČŪAõų|šåąąK%^hšLƒ[·X¬DͬY“\BW×sÕ0ˆĄGÓ —Ėć"Ō*Į¬e²€ OŃå Ķ i5µ]xä²y¼ZÆ –VšCæs:W§‰±–ģJ&«Iɔ &¦Cų©Ó‹­ tf5ÖVs˜LSBĶ-mj­V3 ’õüÓŸŸæ|ćēŃG÷{ž0C‚œŠņ+įīC޼ū=>ū“3ž466C$‚s¾ø!„a1H|m_ķ!ĒÆņ+_¼@¾e!­VEqq›‰ˆØ¦¦†d2Ł`ŲŽĄß˜[’¼{`ź“ƒBøIĪȔž3Zņ19éEUUiuuUÓŽŽ>ąįFµ§Ģ¬SmåóäņpµZĶ›Æ5Ńõė-\©Tr"ā§N"å¶@č50i”1”ŸŸOF£‘L&uw’Aך®ž…Ø®®&†Ų,3 —FćaHJJrõõõŅ冮R©8ńÓ§O€#¶[Z,ßą ƒ.Ö]䍆ˆˆŸ9s†TE a³Łę=n7?ŽkµZ""~öģY‰Dg"†ČČČXöPmm ×étDDüĄą\¤ Ń9ŪshdŲCµ55ŒQee%ÆÆÆ'ąæwÅ’¦ØØˆNœ8AYYY<55•ˆˆ×ÕՑH$ŗ)„Y§‹#ŪMÜb±P(āV«•¢££›""P(ۊ‹‹éĪŪ¼¬¬Œ ŽŽ~įĀP„T*-,(( ±XĢwģČįyyyDDėū÷ļ'”P˜Ē"4ŽCv»½)+3ž@€Ęźźź”Õj #čpĖåvļRµ¶¶”§§………æE €………Ējµz¼»»‰$čt:„f³¹åO®ą@v¦{§ĒIEND®B`‚qjackctl-0.4.2/src/images/PaxHeaders.14935/mporto.png0000644000000000000000000000013212700760152017135 xustar0030 mtime=1459871850.611904288 30 atime=1459871850.611904288 30 ctime=1459871850.611904288 qjackctl-0.4.2/src/images/mporto.png0000644000175000001440000000032512700760152017701 0ustar00rncbcusers00000000000000‰PNG  IHDR(-S6PLTE222:::???LLLfffhhh}}}ŽŽŽ˜˜˜„„„©©©ŌŌŌ’’’Q :±tRNS@ęŲfMIDATxŚ}ĻI€@@0®ø ł’g]#ƒUęÖ)8Dä'Šäµg ԹψöĀ„ž`£—Ć‚mbņ²z[_ ?fc±.ž_¢·²sNĻkY–\JŅIEND®B`‚qjackctl-0.4.2/src/images/PaxHeaders.14935/device1.png0000644000000000000000000000013212700760152017135 xustar0030 mtime=1459871850.610903788 30 atime=1459871850.610903788 30 ctime=1459871850.610903788 qjackctl-0.4.2/src/images/device1.png0000644000175000001440000000076612700760152017712 0ustar00rncbcusers00000000000000‰PNG  IHDR szzō½IDATXĆķ–;NĆ@†æD”¤āQŃBC·>'Ł•@āœ#H»gą9„§£¢” @nŅ%ŅRxlŒćŲ‰!‘‘¢YĻīś’ēį™ĄAņß„W6¤iźDcLoļŒ”RšÖZƵöĄp“OgĄ}÷Ą#p¢ÕÅÆ>Ą8ŃZOD­5"҉gι f1XYęĄWń`“é&®€ p ¼ÕXw¹+¹‹ ōŪÜ“ń×¢"›Īµ”S(§°Ń™BĘż¶ąˆ19Š2æŖ”o…H~¶®„M •ąµĒ¹­eiw`­]œ,Öʘ•»;°„-<֒ļ™ån¼®ŗ»U LxQ’$«SÕ{ŲYREe.“`‹Sb×č$’“°Vė|f¬F(UKRŻDĄżö¶¼^’fĄĶ ˜R`‡„Ć(“āfĀ )§¬•ü»µP„C}>ß”„—%Ęmk ĖĒt1®ėu8’Ļ“ŅœÉŚ˜·ģõ³ž¹fß·!šLEä¦×ćµx‘ćyX£æd‘żø uż\†I6ܐ®1šĻümŃ9¦Į£AlHWÖü łņĻńžŲ"!ĒdIEND®B`‚qjackctl-0.4.2/src/images/PaxHeaders.14935/mclienti_32x32.png0000644000000000000000000000013212700760152020262 xustar0030 mtime=1459871850.611904288 30 atime=1459871850.611904288 30 ctime=1459871850.611904288 qjackctl-0.4.2/src/images/mclienti_32x32.png0000644000175000001440000000313212700760152021025 0ustar00rncbcusers00000000000000‰PNG  IHDR D¤ŠĘ÷PLTE+2' " ( -0 ""7:<"-#AEI21'M JQE&/62450V97+6:,1=3Z\ 3>9>;/<=;>=6`?@.^(d 1H69E;g#ACA!W0i/O9n"?KAi,*Z9s'CKG `8JL9>QEu)y%o7HPL8[ADSMBUIt/IUJ++VUMTUS‡*K\J„5NZPWXEˆ2J]QRZVJaNZYR[\I&z;‘2’,PeMY_VLhO_`MUd^WdY™2JnS4}Q1€M\i^KuVghUWqR£AYq]K|YG€\B†Tgpl4OqpWN„Y£IivkD_NŒ`JfmzowxdK]pyu>Ÿ[}~jbu‚v5¬Yzƒa“n†ƒu„ƒ{‚„yŠƒŠ†‰ŠuŽ‚mš|y•†E¶o…’†‚“Œ€•ˆ“q‰’Ž“’x}ˆm؁™–v‹›•’™œ‘›–˜œŒŠ£›œ‡ œ| ™_¾~‡Ø’™¢—„™“Øš¤£ˆvŗ‘–§ ±›«Ø‡ž«ŸoĒŽ¦Ø„«ŖŽwʎ¬­…Ŗ­¤®©Æ¬ž­®™¤²¦±Æ”ر¬­±”‰Åœ³“ž©·Ŗ¶“™–Ä„¬ŗ®‡Ń ø¹¤Š ²»¶ Ē©ø»«øĄØ¾æ©“¶øĘŗ¶ĒĄ»ÅĄĘĀ“ĮÅ“Ś°Éș¬Óµ„ٱ½ĖæÉɰ±Ó¼ĄŹÅ»ĶĘĖĢ¢ĶÉ»ĖŹĮ­Ü¼ĻЦĮŅĖÓŅ¢ŠĻĒÓĻĮÓŌŖĒÕČŅÕ±ŹŌϼŻÉŗįĀÕŌĖŚÖ“ŁŚ°ŗåĢŚŲ¼ŻŪ«ŃŪÖŚŻ¹ŚŁŠßŪ¹ŪÜÅßąµŚÜŁÜßĻŲāŻįäĄĻźŌåćĒåę»įäąźęĆåéŲėéĶźėŌŪņćźģéšģŻļšŁīņįēõčöņć÷öģśłšłūų:–¦tRNS@ęŲfIDATxŚc` „»¢š÷‡Čū’łóē÷ļ_æ~żüłóū÷o š >~|õެ(’õłóē·AąŹŁ³g‚Ą¶=ėöÜsd†ėŸ?gMžŻŻT•ØZ**r"‰ī+ƒ¼«ūńćĒėó‡·.]æyžŒž’ ØØ`7g+‘ū÷Į žĻūńēóē{ĒŽžź¬Æ+ö±oĪ r²Ō×»1į÷棟üøyļęŽoäģßćle„e(rżŗ Ų„Ē^~}ļęsgŽ0Š<×č™im¢Æ+'xżŲ„_»Ļß;žłŽ—­žēśś6É®µHÖג—āæ1į÷ć¦ĆēŻńüįiĒļ_9kf„šŗœļ; GŗüŗŃ“uė֓3W¤×ß8u`’޵Žl‘šĘr"‚Ü.€­ųy#uéŅE''(Ø»¶oļŽÕóųŠlåDų¹ÆŸ[ńėvīōéÓw6޾qīŌ¾ż×Īėk«”Õįēgæ~bĀķŲ–––¹Å×N?4`Å„Īšbq ¬ĪHƒŻp9°¢¢¢¤µļųžż[ÖĪ›ÖŁXéhŹĻĻĖĮrl…Ė÷ŪŁ@Šäøqļž[ė+Ół4ųyøY™ &øž<§”åÜn±zcŽsD]Ÿ??7;+#Dļ÷ĖśĮQ@ąŃęįÉÉic*aĆ#“€Iź†ļ‡ō£ĄĄ;„<Ā@ÓĘSŸŸ‡…‘óÄ ?_mˆ Š ņ6Q3ÖååfĄööŒ0Č ßæīĪĖĶĶ+ŹĖĖŹJIM‰Ž ósw÷ =qé8Uśųśõć·o?~|ó꿓WOž=zt÷ٳĻī^:āIµ+·m[¹jÕŖm›¶mZ³aӚ5 ,˜Ó e(‰_ūŻćŪ—­œŅPšnΌ%wøžłõėĆǧ'¶Mé*Ė䐮­­=wīÜĮ‡ölŪ°j՜ŅĀTłj ß¼¹’ęɓ»wļ\½tįȲ’įį@^^ęŖĀĢ ōŁfŽgjźIEND®B`‚qjackctl-0.4.2/src/images/PaxHeaders.14935/mporto_32x32.png0000644000000000000000000000013212700760152017776 xustar0030 mtime=1459871850.611904288 30 atime=1459871850.611904288 30 ctime=1459871850.611904288 qjackctl-0.4.2/src/images/mporto_32x32.png0000644000175000001440000000150712700760152020545 0ustar00rncbcusers00000000000000‰PNG  IHDR D¤ŠĘŚPLTEiii  '$ )  $" $" """###$$$)&%%%('/)1+,,,6/ ...70;3 222320333>5565777878888;;;>>=DA%DB)@@@AAAIH ODDDDEEEFFFQH#GGGNG8HHHIIIMI@JJJKKKNKGLLLXN%POJPOOWR6QQQSSSTTTUUUVVVbY,dX?\\\ha=```mc4dddseLpiBtfMhhhyiJmmmnnnoooqqqrrr{xDuuuvmyyy{{{‹p‰‡tˆ†~½„‡‡‡Ą†‰‰‰ŠŠŠ‘‰ĆˆŽŽ˜‹€ŽŽŽŽŽ’‘’’’’”””•••———˜˜˜±„±¦ššš“Øœœœ£”„¬œŠŸŸŸ«£p   ¢¢ ¢¢¢¤£™£££Č°¤¤¤É±„„„¦¦¦©©©«««®®®±±±“““¼¼¼½½½ĘĘĘĻĻÄĪĪĪŠŠŠŅŅŅŲŲŲéęyŽŽŽćććęęęčččéééüüīžžłM‘ tRNS@ęŲfIDATxŚc`0Ą*ĮĶ„O^N×ĆŌI—¬b©Ŗ‚oā mģņJŽSģ¦ĶÉÄ*Ļ‘ŪX6uvæT@}m6y6ƚŖ©³'±ˆč`‘g·HĪļ”jMĄ"ĻiŚŌÖ]¤”ĻąĆfæ{DeWO\ƒŸ`s?6÷»eĢ,Ī ²ˆ ·RęĀbækvßōöb;5Y ua,śņ³¦¤9‹ńŹĖ«Hb±@ $_é#Ģ8—‘“‹¼pX^’q.` įŗ‰xå\ŚŪŹńÉŪD¦ę™‰ć–·Œl™-ŒS^?¢eR§1Ny<3.Y ršĖŪd„wą•©ö7Ē#Ļ "ƒ'‰Ū”ŲzJć“/tµĆŸ‰¬i›I2 [› ([IEND®B`‚qjackctl-0.4.2/src/images/PaxHeaders.14935/xactivating1.png0000644000000000000000000000013212700760152020217 xustar0030 mtime=1459871850.615906288 30 atime=1459871850.615906288 30 ctime=1459871850.615906288 qjackctl-0.4.2/src/images/xactivating1.png0000644000175000001440000000046412700760152020767 0ustar00rncbcusers00000000000000‰PNG  IHDRÄ“l;ūIDATxŚķ“±jĆ@ †Õp“–L…½fÖ;¼ömŽĪŻ“ų!<&«Aļpkŗv)2š»ā.N011‰K:łŸtÜĻwāō `Ń¢E’Ɨ«sADĢ\zļ×fvRÕ&Ęų_³^@ÄRDŚ”R7TJ©‘Ė9ÜBDŚ3ģ°ßvבЇØDT;=ģ·#xJ©#¢ś^抈€™KēÜčņūsw©sĄĢwNJ™Į{æ¾e§|#°÷ĢģtĖšŗy»ŌS¾ŲĢ@U›œó$4ē ŖŚ<2øē„BDž“cD9o^B8VUõB8ö+ž“Ņ}ō (Ø*Ägmņ/·‡ß¹ Ō÷IEND®B`‚qjackctl-0.4.2/src/images/PaxHeaders.14935/acliento.png0000644000000000000000000000013212700760152017413 xustar0030 mtime=1459871850.609903288 30 atime=1459871850.609903288 30 ctime=1459871850.609903288 qjackctl-0.4.2/src/images/acliento.png0000644000175000001440000000025212700760152020156 0ustar00rncbcusers00000000000000‰PNG  IHDRķŻāRPLTEpH€’3€€€ĄĄĄ’’’ę† ętRNS@ęŲfCIDATxŚc`€c0c0q C Œ°°0 ®& @ 5(#))- ĘPSS«QSK«ɤ!é‚Ū•pWĪJz¦DIIEND®B`‚qjackctl-0.4.2/src/images/PaxHeaders.14935/aportlno_64x64.png0000644000000000000000000000013212700760152020326 xustar0030 mtime=1459871850.609903288 30 atime=1459871850.609903288 30 ctime=1459871850.609903288 qjackctl-0.4.2/src/images/aportlno_64x64.png0000644000175000001440000000343712700760152021101 0ustar00rncbcusers00000000000000‰PNG  IHDR@@·ģ÷PLTE         !+"!/ "$"(&3"1%&'%*'/&4%()')+(.*)1,>*8)+-+A--/,F-<1231=4675796A?9:8F<;=;>@-R<J?;?A=?@=I?/`=AB@LIDD=HF*DFCGHF[IjEJHLTH4mHKMJ_P_T sMOQOdQRTQaS9]ZfWTVS``r[€WvZtY%kd[]Znbg`2k\B‰Yl_3d]WŒ\xavd`b_k`Oo`Fjj €fbda€f`egscCueEur”cŽhhigzv‡mkmj‡j/•mnlp”gyƒtmolw ¤joqn€oN~wy;qsp†{q0Š~~}3vxuƒ”}xzwS²uz|y‚zt–ƒ‹†&}|”‹‹}f{€ƒŽ €‚‡>»}žŠœ‰•‡?‡‚Œ3 Œ„†ƒ‰ˆn…ƃŒr‹Š œ™•<“‹…™˜/˜Š…¶‹/‡©™‘Ž’””›;˜“‘”–“Å™­¢°¤¼™ „¢2§–‹Ž”š›˜æ¬¼®²žŽ£„¢æ¶§©¦Ä»©«Øļ­ĶĆ»»_ö²ń¹ĪĄ:¶øµÉµ¤ŚĶŗ¼¹śĄŌϾÆĒÅ|¾Į½ÄŜĆĀŗĀÄĮĒĘŖČĆĀÄĘĆĘČÅĒÉĘÉĖČĖĪŹößÓĻĮŻĖĄåą<ŠŅĻēāHÓÕŅ׌¶Õ×ŌŽßµŚÜŁéémŽąŻāąäćåįéėčńšæńõ¼ķļė÷õÄńóļšöųō÷ó’ūėžżōż’ūkōöVtRNS@ęŲfÖIDATxŚå—{lEĒÆ3ėĢ.$u\ÆŠ"­ź!ŠEŻąEE8]_ÄųJ«”€ÖĒ©5XŻ‚NPхj]Äśl4p$V«¦”ś¶kU¬<ī&{5D,ū9>-©ŻŽŁæ’Ē-īpwVĶ“u× \¶fē]żūśĢJźdž¬S_šĢĮWlZÕ÷$ćižŠW7Ģ(¾üL’ʶ®Ē2?ķ¤=Vt6A%{?_~ņä ßüø­]}-Œ“÷öXŗ^],’Yćß~Ę’–Éķr˜„Gē̼tŽ «\U «™!ø™ćäź4—:p9Ö(½ƒ(K ±żƒšõYžÅāŌ\@ø@ĘÓĶĶ)§'sF¤Ńƒ™ß©āg +Éć#׎ŽŽ]¶ėV/gœƒĄDā³€ńŹ·ÜqųžŚg½QÜFaŻ··Ć²Ś—ø4QH׋ E$¤²wĒk…˜Z__8@h¤õµ™SbīåsźźE×Ųžų˜ūµ‹rĻᤖ_½ā |ĒœP++xéĆ­“¶H(BB<ŠÄ¹Ūƒ»JĘū€¬¤O;Ķ„f5‡tĶ„j¢¹ń¶`įÆįyšg‰rų=Å‰g˜[óÜ©—&ōņ,ĢŹü£¶KlM¤f=+ S³`U—jŚ÷É{DŒ½b¾±ŠöŒ-”}ÉēfĄ¼&œFž Ī|ćæ#ĮĢģMĶ·~ĀŁY}ŻÉ'Š’ōņʲY-ōzVy’ƒ¤fTBÕ ö’ÕžŪ ō[+ĪIEND®B`‚qjackctl-0.4.2/src/images/PaxHeaders.14935/connect1.png0000644000000000000000000000013212700760152017327 xustar0030 mtime=1459871850.610903788 30 atime=1459871850.610903788 30 ctime=1459871850.610903788 qjackctl-0.4.2/src/images/connect1.png0000644000175000001440000000066412700760152020101 0ustar00rncbcusers00000000000000‰PNG  IHDRó’a{IDATxŚÅ“K(Da†Ÿˆ…¢°ĖĘÖJlQl­$EYĶB²sY) IbEJ²p)™$& ć~æŽ1Īh8ć̌sĪoL#³ā_}õæßÓ÷¾_ü÷1+_d«Z3wj&š.XŻž`ør>>¦f] &ƒc¬ųŖx~#Sõ@Vl€Åpž@;ćp<Įī"V@@&sb”6Ÿ.³XR;9œĻĄ+o °˜€aŒŽ÷pją-üSšvFLŽZ`+Zg<'¤p<]Ļ#H/„ŌĻg3>^n-wXī®Q^ݹ4µÆƒMłś‘vń8lCėŻme/TĢŃ$HEGü¼m+`EÆc-čäp6‡üd.c¼“€]”N• ¤ nµ”½Xļ×QļjŲuåńtYĘÓł A·)øß×Pü‰˜&h°1(ńŗœ@ß§®PŸ½‘ģ'iW¤ę_“’s ¢ĆvCæÜBt-’ģßV`ŃYØIEND®B`‚qjackctl-0.4.2/src/images/PaxHeaders.14935/aportpni_64x64.png0000644000000000000000000000013212700760152020324 xustar0030 mtime=1459871850.610903788 30 atime=1459871850.610903788 30 ctime=1459871850.610903788 qjackctl-0.4.2/src/images/aportpni_64x64.png0000644000175000001440000000333512700760152021074 0ustar00rncbcusers00000000000000‰PNG  IHDR@@·ģ÷PLTE         #)/!#!2&( $1!+B$"&/!# %4-D'(,4)8&(&)+(.*)4A+-*1:?D,.,>^ ;=;IZ Ms#IJ;?A=?@=I?/S]AB@Zt?CEQfYy_bDFC\Vf X„bp[_elGHFJHLTH4fJLJd”dxg’'YuMOLh OQO bwen“hŽjmRTQ5`faS9v|n‡qs8_lTVSu‚t²}‰~„ yuw/j†[]Z‚“k\Bd]W-q’`b_k`Oo`FƒĄ‹–bda‘`egscC‹œ$}|»„–ueE?xw4~€hig!ˆˆŽŸjlinlplnkšŖnpmoqn-Œ’™Ć•Ž€oNqsp(‹·X~€C‡œ ¦“wyvxzw£¬#™½¬Į7˜˜z|y®¶‚ztA•–ƽ|~{}|(£§‹}f{€ƒ~€}?š”n‰†€‚¹Ą‚„ ­š³ō„†ƒx‹ŠŗČ…‹Š„‘“‹…Įū˜Š…Š’Ćɏ‘Ž’”!¹īĻŌ“•’ĶŁ8æĪ§–‹š›˜^»»ą÷²žŽ£„¢§©¦©«Ø}ÄĒ8āēµ·“œÄĘɵ¤¹»··¼æ²æĄ¦ĘÉ©ĘĆ·ĆľĮ½nčźĆÅĀĮĘÉĘČÅČŹĒĖĪŹ°ŁŚÄŃŃŻĖĄŠŅĻµŽąŠÕŲÓÕŅÕ×ŌŚÜŁŽąŻāąäæńšŗõóćåįÄööéėčķļėńóļšöųō÷óļüżüžūł’’g’f§tRNS@ęŲf”IDATxŚŻ—{LGĒqgo؁3ź®W£å5-č¹ÕFķ ü§Ū,AÅh‹ÕųZ­Z•¤ŲöZm…Š­ā 5’ęJÕQPc<1§‘¦¼¬Šרس—­ńźÉņGēī žŪ™ė_’ē“Ļ~æßL\Ü’ci€Xö#—ys,^õšF,§Smˆ‰€4§B\°2ø¼qjĆõ’_»=¬Ø8åÜć­7»/2;(¹„[ƄVŲŗæ““ß0¤1`ōwūæŽ8\šžWÕ “•G—FZŻžg]‡ēNLKģ‡ĻXÖķŗß®ŌV,£%ša‡łNl4ÜėyÖE‹V ’Ŗ–%P;‚Żfćßqū­^6ȍą9Ń”č~V‡7‹†“U÷ć~ZŠņvŠy‡‚09€Å—æ(JvIÅLčŻ {[ŠR’R³¶5ĻۈƒŸĮKųp_cŸƒŹäĄ%-$„MéÄį•—9lÉį(…‡xd‹äŠŪó×Ļ›>ł”āßQ‡Esčlś£ėJõģ7žżłĄ„öå@:¾×ŪscēŹ=‡Ö “„tŁ“G–ūŸŸæpēŚ±“4ŠēĄ#H\×ūīF<…ĆĀčWp¼Cvwųüw‰ĆžUcm-āyčŠ4Üa<ńÕ<|Ŗö³ĮtżP;3%q|vęiļĄžv]Ŗž6‡ĪayĖŚĢ,Ūų͚·h¦HšøoAs˜ ¤iķŽ6£|ņ’×5ŖY5ØpI !88(ģ =7*Ē&PN»¤IU5Ķs҇%"Q½e»u;ķÄĶ,®ŖŁxõTŃf‘W}” AM@Š«Vœ9³ų‰‡Œ?ŠlŠó ó3p‹¢jč2Ge ˜źœvĄpĘnjB|bR֎éŲōHvµÓbpąøŌŒW!ż^ITĀ•“„¾ Č/,A6‡čŻ~,EśÕ!”ŽÄCP,6·éĆ9ÜwIlw9į§?ėIŗŒ,éŌĀŠĒĮQ Łn“G:D¤'ƒĘ6é„.ŠPõY·Xs_ūń,Mʘ±šČE:  ’`Č,`¼ŁcÓE-2½#Į­ .®†°U‚ō$tł Ē ©°¾‘`šÖä•õą÷+ ‘gį/õ¶^z”ēéZLĻÕ8 Ķ’æZ’ÓĪ•Ćrį€IEND®B`‚qjackctl-0.4.2/src/images/PaxHeaders.14935/xstarted1.png0000644000000000000000000000013212700760152017534 xustar0030 mtime=1459871850.615906288 30 atime=1459871850.615906288 30 ctime=1459871850.615906288 qjackctl-0.4.2/src/images/xstarted1.png0000644000175000001440000000047612700760152020307 0ustar00rncbcusers00000000000000‰PNG  IHDRÄ“l;IDATxŚķ“!oĆ0…ß*#“RĆŠįĆ£'叓æĮ*;čņü†H¦Ć¦4ŖTŁ“G©kÕØĶŌ”:?;@AT5.Y:.Z:.DD=Z=,LNHG=IH=LK=ML=ON=QP=SQ=\[UT=VU=ZX=^[=gfa_=ggb_=iieb=fc=ngmnhf=nojg=pqli=ffftmnk=us pm=uvvvso=roItq=trI’00ws=yu=ÉMA{w=yvI}x:}x={wI}|4z=…ƒ |=‚~=€}I}Iˆ‡…€=†=ƒƒHŒŒ‹ Š„=‹…:‰„Iˆ=Žˆ=Š:čZLéZK”$Œ‹E‘‹=’Œ=‹IŽG”Ž=˜––=›“&˜’:˜’=˜™—’Iš”=Ÿžœ•=˜UŸ—:ž˜=Ÿ˜=£œ=œ›Y¦”,§Ÿ:¤”AŖ¤-Ŗ¦1„ŸiŖ¤I­¦:³«Iµ­:®©j·²1¼³,ŗ²:æ“-ŗ²I²®}Į·-Į·.µ°|Āŗ)·³|Į¹Iľ+Ⱦ:ĄŗkĀŗhĒæI¼jÉĄIĪÄ:ĒĄh¾ˆĪÄIŃĘ:ÓŹ3ŃĒIŅÉ?ČĆ‰ÕŹAŌĖIĶljŻŅ:ŠĖˆėą:ōčAõźB“µŪńtRNS@ęŲfÕIDATxŚc`ĄéÉq‘”~ŽīNö–`“iSz&u·64•ši§0¶L<”«“)Õ,ŻŃ"'.ćS ė‹ŠķŽŸ«–™ šoWčÕfa‰ÉŠ W x7pĪ`™9“½&ÉW,ąVÉ?‘uęL¶2Ogi°€c‘A©2{p—•XĄ¦ĄC#Æŗ¢1>ÅH,`^ÜlēŖ¢ĻČ# 0ĪfĪÆÆ­ 25µ čÅśX»Ųšp[Xp ‚4Ue„„$ÅD„xĮ ZH€MÄ6ēröIEND®B`‚qjackctl-0.4.2/src/images/PaxHeaders.14935/mclienti.png0000644000000000000000000000013212700760152017421 xustar0030 mtime=1459871850.611904288 30 atime=1459871850.611904288 30 ctime=1459871850.611904288 qjackctl-0.4.2/src/images/mclienti.png0000644000175000001440000000037512700760152020172 0ustar00rncbcusers00000000000000‰PNG  IHDR(-S?PLTE€@@@LLLQQQYYY]]]```kkklllwwwxxx€€€’žžžĄĄĄĀĀĀČČČĢĢĢ䞳“tRNS@ęŲflIDATxŚ] € Q¼‹t’’V{ˆA‡`²”Ÿō!å]C#Nč0!7÷eĘej@ Ā…d­"3ƒ9æ‚ō(“pø(ģl., Ģ’ÄTk8d é"^žJ„ą}ĄśüĖkŌ}Ōķ – ŗŻ5TĢIEND®B`‚qjackctl-0.4.2/src/images/PaxHeaders.14935/mclienti_64x64.png0000644000000000000000000000013212700760152020274 xustar0030 mtime=1459871850.611904288 30 atime=1459871850.611904288 30 ctime=1459871850.611904288 qjackctl-0.4.2/src/images/mclienti_64x64.png0000644000175000001440000000626412700760152021050 0ustar00rncbcusers00000000000000‰PNG  IHDR@@·ģśPLTE  " & !*-0 '37$$91;!,#@0%C,+#EHM*5,&8,RP74)/:1WM,6:,[^T( \!8B>e!8D:b@B5,N5h$BB=Z26KERM~*2b@5`DIUJGWFTRE‚,STAx8†)OWSTVS/@hNS`UV`[^_L“-SgY™26ebUcdPNmYfeL<]g`gf^efd”@\rd™HcpefojppisrXqr^dxk,šRuselvqkxlE_!¦Lq~s|zl`ˆqu~y~b||u/­Y>„`^“tw†}ƒ„o}†‚„„}†‡i†…wxŒa›uMŖnA³f‚„Ž‹}Œx„މ‘‘u‡“”mZ²tc­zNŗt‘•…ˆ˜’‹™Ž—‘”–“™˜žšz—›‹z¬Œ ™•ž™””•”ž‘¢ †cĮ£¤|u»›Ø¢œ©§Ø†ŗ“mŌ§¦œ°®‹®®”£±„“» {Ź’µ§„±«ˆÄ›ÆÆ¦„Ī«¹­ŗ¹Š··ž®ø³¶¶­˜ĖŖŅ„±Ą³¼»²µĮ»ĆĀ“¦ĶÆ¶Äø¾Ā±¾Ą½ÄĄ²›×®ÅÅ­ŗÉ¼Ęɦɏ ĢȦ»ĢÅĶ̜¤ÜŗæĶĮ“ÓæÉĶ¼ŃŠ ĮÓĢÅŌĒŅÓ©ĻĻĒŠÓÆ±ąĄÉÓĪĆŁĖŲŌ²¹ćĒÓÖĘÖŁµŪŁ©×ŲĀĻŁŌŪÜ²ŪŚ½ŽŚ·ŽßµĆčŠćß¼ßā¾āąÄŁāŻĻźŌåįŅćäĪĻīŽźéøéźÓėģĆččāģźĪŚšāįģęčģŪššĖšķŻ ęōēóņÕōšįųöÅóņéńóšōõŽņöåķ÷ņöõģśłšłūųüüģ’żąž’ē BT5tRNS@ęŲf hIDATxŚķWkTSéP5("„š§Ø€@Gž#Fˆ `Ė؂#6>Q;Lń…ˆ5XQ"”  A ’IBxHL ĮȦ1Q BĄŹZ=_„§Kǟ]]Żß½¹Y+ėģ»÷9ē»÷d޼’¬ōßõĖW®QQQ1ž+ÕĀ1§”˜œÅ[ĄčŪń7*¼zóźÕĢ·Y¼ø³HEĄœ‰V^ …\ éØ|TŠ –Š%°”č냣££ÆÆÆ7W%Å))б1…H%pI%‰X„–H„b!z ć1„+:f]ųO”›ń˜Lfy9³¼¤¤¤Ž÷șĮߊś+ĀłcēóŖ;::ښgv!éŠcށa‘ū"##""BBB¶mŪü‡ĒNNk×ZYā,--q+œ©©)ÖkˆŁPŁÖ×ѶE`ŒHhhAhhØø{÷VöõėgNž“ś­Ņ€—»»ƒ³³ŻlSO›ŗ‚)flĆš0 vAĆ=žÄīņŁžźU©Öŗ±4 šņruupp°³1¬5rꞖĮŁ$ÖUŃČ“1”š'ĶŚčJĪąÄie:AĮ€³ƒŻƒšŽr `īix:8<8ˆF˜IB~ ŸĻē˜yÖ3čeq²VyÜßÕa“ĶšÕ‚^®ŗ‚±ņˆ†īīī§ØˆC›Bi)£ČdDjN²Öž@Hąz›uŠŁz•]īÆgL(å!wėšaÕŻo¹Čģļ Ėɞ™|ž&»,N¶8€ž‘yÅł“ŲŲXYį–Õt >¬BČ­ūļĮį‘Q¼PČa÷׳ŁU 曞—A”µČ_Bl`w™čU÷r›T &Ē䓐ģŅū°JKūi)żI±ž#ŸYEgA 5#ĄČ>0A7ŅsżšÕœ ¦¦‹Ū4—ƒQył¶ėEE°…вGŅŅų„°@?›__Š©“4k™lZ–`䆳Y ;ŪĢtIuÆ fNĮؼdóŁüü¢üüüģr3ÅĻŪÓÆŸ]UEg ‚<ІL&3'[Ūǚ fXS(@ĮŁJd÷iBaN|I‡Ēd3،bZ^A1Ņ< loNĄ‚3¬««„RĮ3ééé7ŅÓÆ÷Ēf9ဲe` 3ć %9-5!ŽÖš`°g†Ś5Ö9ųędś™ōsgĪķߗĢįóŁ<ˆe45#ƒ’œD&“ˆÖ¶XHkØÆ]ŻŽØR>9./ō8rN‰#ü„(tū™S 2)©É ńD¢®Ÿ‹ĪÄ k Æ§]Ż5§`—bH^ātäĻļAĶ“­ē±«źA/¦Ń22)”ä d).Ji°X}}ĢĀź.5ć Ąi/Š>|ųšU.ÉLTŌBŌ‚ė‰@E¦KJÖīŽx?ÄļßK³ÆzÆ L¹@Fŗžž†&¦Xæd~õ“ƹ$ŽŹå…@ Äīż(6&¢»CPiy™i””2)žøĻ\—°čc0:š¬'\5 Ri ngčžP łžūo3.h&C8”0™D"ĘBˆ‹ņ›t40Į¢ bt“5Yķ¬¹$ŽĖ%…@ŠžżpzG,¦€’āč`™Ģā x.p \aj Ąč-Ń֖U·×ŽS)•€üŽ™ų`|Hq&‰Ź åY k2éŃEĆ6j)ź ==ķ… `ĪĀ®QłP!¬‚Oƒ¤kŸ\P`”””$0šö&c” Q“Ī× s Ę%āBń›©To ć#؃ÓF~FÓęQ‹±¦(zzKt.Ō”± 7Ŗ,ŒK> _ķ”å!Ó²E.¢ķ 3e ėa0ŚH€ %Q„ąTś3‚P¼«SPJAFB\)D°]53…xƒeJšąŒÕX{o£š…Ÿ°?#Ąūø~õÅOO{‹8+K“‡ õPĮdę…z¤ŅŃ|hšŽPev„μ‡ŻŻ7­_Oq+Ke .Ć@ęƒ™’ėF֜1ĢB¾“ó‚tĀ+½Ā”P+x‚ ņ1(Ȁ£üucķmµˆEŅW’H½8‹Ō”Tōķ?p>)5•÷ī5äšöŖG±T: £)šŻĢ Øü@€ĻĪįŁ³gč|ö¬½½±¶öŚņŁ9O4  ˆÄbćž£aę8„ŽŽ6„NA—ŪÄeqp©­…šŚŪĒUƒ¦ć˜Åbрč90ō=īƒ)° P © \Ķe± |¬ŚZÖ½Ū7/WvƏ„&:s(fA„S‰‰'Š:šxšÄ£€čß!lßī ‡ļÆ>:x»łĆĄÉ„Y³0'õü±1Qæ ßāūµćŖU«ø}ŽčŽ4,KDj~ŗ“{õź_N=żŻöåó>›`jL.…ę‰?ØT2? ŸO PĄSęlńĄcAee.0œ:~0:zå/Ēŗ!8¢Jŗ˜””t"ńŲ‰11(q[|7n\¤üłSńž¼!74łżåx÷öžxQSs'÷ŅĘOÜ_ōF¬Äsńóē}=°zOŗž(ŃŽĪ­½wūŚéčkpC):{z:{;ŪŚz”¹.jAŌ€Ø÷īŻ¼vśųAßO˜ųż¬\ĄÕ›YYY¹Y7³®ĮĪKčšué4DGē»ņn >‚éi -ō9=½ĄĶmŽ’ń߆¶)5Ur-IŁIEND®B`‚qjackctl-0.4.2/src/images/PaxHeaders.14935/mporto_64x64.png0000644000000000000000000000013212700760152020010 xustar0030 mtime=1459871850.611904288 30 atime=1459871850.611904288 30 ctime=1459871850.611904288 qjackctl-0.4.2/src/images/mporto_64x64.png0000644000175000001440000000337112700760152020560 0ustar00rncbcusers00000000000000‰PNG  IHDR@@·ģśPLTE       # # #!' "#!*"#$"$%#3%%'%'(&()'/*++$+,*,+.+.",-+-/,01/7752'315130231689496342:8796A<A8)9:8@=@:4CBI> ;=;==6P>J<X;=?ICUB@B?a>CD2ACAJEMD$NB.VEDFCOE5OG,GHFRI(VJjEXH$TH4IKHOIClGOM0cNKMJNNFMOMSR:VQ@[[RTQnWUVTVXUbaY[XgY>[]Zk\B]_\mc#^`]dd:_a^`b_ac`}a&bdaib\scCkgDoh9ti)khJueEfheuo&mhgpikhlnk{r>npmnNvnhoqn…vwvEqsprtq‹zsuruwtwyvxzw‚xly{x’€zy{}z}|†]‹}f~€}ˆ~r€‚ƒ€‚„ƒ…‚‰„ƒ…‡„ˆ‰†Č‡‹ŠŒŽŃ‰™G“’Š•”zՍ“•’”–“°¤–˜•˜š—„œjš›˜¶©›™Ŗ™Žœž›¦„^§”{ž «ž²±±žŽ¢¤”¤¦£®Ø‚Æ«q„§¤¦Ø„²°i³®tø¦œ«­ŖÆ±®ĄÆ¤²“±µ·“øŗ·Éµ¤¹»øŗ¼¹ÓĪłæ»½ŗ½æ¼ČĐįÓĄĀ¾ĮĆæĀÄĮė×ÅČÄĒÉĘĻͱŹĢÉĪŠĢĻŃĪŠŅĻÓÕŅÕ×ŌŲ×ĪףÕķé|ŽąŻćåįåēäēéęėźįėīźńóšõųÓ÷öķō÷óśłÜłūųūżśžżōü’ūĄœ˜tRNS@ęŲf­IDATxŚķ—mˆEĒwvļ8‰Āž^ŹŻyHźŃؘJN»ŚčPµRƒŠo«¢Ō„­Ś6\+ –ž=Dń„VF϶V¤ł S“yP©/=„n) ö¢MIL7½k7bcöi`%–^®ąģÅŅÆ“é'ŃēK>żę÷žLŲ]Ełž}£uuiš&Ļwōō¼³Bė’>”ūņłÆōhļń«äųŽ·īśał lŁĄ†dųy;æ¹yŻ Ż6Æžō·šŽ&œÖ“«w<ńȼ;ׯ|NĻ4÷“׿ƙ=w|xšÄ™Æ’ī¾ß,Ļ4›v“óéSžÆ³ĆėBK™×hĪž»­ ~°īĻęÜ쌣^óć3¹źG^+Ģ£­{ÆžŁŒõ›Ÿb_}ūņ—· ū JźŽī?Ū¬b†Õ+ óµ'W/ŚZšö6žą=ī?ļC*ŒP÷½Ėƽžłł¢~2 •é}æĻžÆīCØē¹_O~¶ź2Q>ŽĒĄ‡éŹ.¾?Ļŗ’ó_¬ĶÆ…6‘1ŪvØW¶p?B½œß’˜*ŗ"•łœŚ„©«8,٧¢Ąæ īŸXu&§\NöŻPg‹ĪßÄ(ø(ńü&ģŻKnåż=Ō/ø€ݵo‚UĢį-R“°÷?x“Ū ! r%ę7Ŗ€˰ąŗqŲ\Ś/t€¶€¾?žs«5Ø»@±°iDĶažāQ”d`Ā­6š`ی` §Œ$6°1j@‹¼Ä P®śZ™2bEĆ©ÅÉd|6’b„_äūĻń“ćŒ‡WU4“,‘Ā‹—ˆńŗ•ĻĻyžßŌ;ՈĘÄöW:0 üœwmFM£SՂ†oĄą6ŅŚ?Ÿg£¦ZkÆ źü©9?ŗ@‹?ŃĀGŲižæh³Ql\ÄşgŖķAĖoÅ»Ś÷+ŠÅül©hÅ2ły¶åרĶ^0”‹ˆó·Ų”2,¹žÅą|ÖfŒDc’~²Óuf~ ~ˆóž_(‘U†Sšój?M‚©Ėšƒ@XĪó¹ß>®ØŒŽe½ZŽnńét[ƈ°#Ü_ę~U“y™Cä’’ā•õ|ĒK—äŠ;*ł© ū·ĻėÅbŽräż‡Š‡÷ŽÜ#ķOļ8~ų摑ķwĖõĻļĄ^Īoݾõ:Uņ]¼ļ•9~”ŖČMč{Å÷#I^ŸŖąČ³OG¤żœŹ„„?CŌcœŲ­Kó|œ€žKųJė v)<’†Tå?<ĖĶ“‘wSa“IEND®B`‚qjackctl-0.4.2/src/images/PaxHeaders.14935/xactive1.png0000644000000000000000000000013212700760152017341 xustar0030 mtime=1459871850.615906288 30 atime=1459871850.615906288 30 ctime=1459871850.615906288 qjackctl-0.4.2/src/images/xactive1.png0000644000175000001440000000050612700760152020106 0ustar00rncbcusers00000000000000‰PNG  IHDRÄ“l; IDATxŚķ“1kĆ0…_ƒ&-™ šŠ×Ī7w=šš£vn§[<öxLWƒÖ®Õ𮄓H!ŃHE]lHcb—tŹŪ„ß Ż{ĄE]ō’ŗŚ;DōČĢ„1fBŲ:ēļż€I“Ö„ˆ“1Ƽ«c‘Vk]Nį"ŅęœózµĢoϔ׫åÆ"Ņ(N¢QŻæ“ļĆcŒ™ˆźc™3"3—J©Įåēė¾Ž_J)0óŃß1cfcę‡ »š1ßlŒAa{ČpswėŪŒśąœsMJišR‚s®9eqēK…ˆœ'ĒZkˆHß¼ŚZ»©ŖźŪZ»é"Vü©Ņ]ōŠ-Ī9xļ'5ł·ŽS ¼ŗIEND®B`‚qjackctl-0.4.2/src/images/PaxHeaders.14935/edit1.png0000644000000000000000000000013212700760152016623 xustar0030 mtime=1459871850.611904288 30 atime=1459871850.610903788 30 ctime=1459871850.611904288 qjackctl-0.4.2/src/images/edit1.png0000644000175000001440000000033512700760152017370 0ustar00rncbcusers00000000000000‰PNG  IHDRó’asRGB®Īé—IDAT8Ėå’Į Ć —Č„P›ŪĄ‘ģ&ØĄEļ”1yK‚•gV⁓sp·'ż(7ą”ē’V@)%I’÷¾a8ڶÿļžv{fFn%ŒĀĄĢ03ÖUT³ų÷×ē|.÷@’SJvę¾Hz–P”Ųģs\äžś_ž ŗ/¹@žš:óØįxešąx+ĀŁ< ¼Ć\yĀ*¦įIEND®B`‚qjackctl-0.4.2/src/images/PaxHeaders.14935/apply1.png0000644000000000000000000000013212700760152017023 xustar0030 mtime=1459871850.610903788 30 atime=1459871850.610903788 30 ctime=1459871850.610903788 qjackctl-0.4.2/src/images/apply1.png0000644000175000001440000000040712700760152017570 0ustar00rncbcusers00000000000000‰PNG  IHDRó’asRGB®ĪébKGD’’’ ½§“ pHYs  d_‘tIMEŚ|€$:‡IDAT8ĖĶ“Ė € Gķ‚6š® X‡eØe`6ąź° ¼ƒ ā'1n²— “G²šŪ²»o­°@ć¾KB0FnfĘņščÜyzÅ&‡Õµ\Ū§}Į§Ē¢ ­–»hq#g±B*9•żĄ[~ˆp[ߍšx¼‚—j>;ŗˆ›u+XīG6IEND®B`‚qjackctl-0.4.2/src/images/PaxHeaders.14935/aportlto_64x64.png0000644000000000000000000000013212700760152020334 xustar0030 mtime=1459871850.610903788 30 atime=1459871850.610903788 30 ctime=1459871850.610903788 qjackctl-0.4.2/src/images/aportlto_64x64.png0000644000175000001440000000372012700760152021102 0ustar00rncbcusers00000000000000‰PNG  IHDR@@·ģ÷PLTE      !""" !&%"$!*,&(%+*., ",-/0,-+34./-13#4455.24241.89*;;574>=:<==59;=;9:8CA6?0<=;FC;?A7BC>@>EEGIBA:5GFEB6AC@:J:GH6MOCGIEGD;MMJIB=ONBMNIKHTUUVEPPTRATHLNKSR$RQ9[ZPROJUV\\FXX^^B\ZZ] E_]WYVec]_;geN`_bd []ZLgYQeXec.Lfcki_a^ff‚BaļDųĪ‚‰’` ĻV|ź /ĢU2·`žŲjž!vov ņ‰äośtżU0aPĢĘxźÜ?p\\Ū?É›\9qi’\®^ņ_š7O†ōł-€ŗ#?]‹Ē'”ŠŅåܖųI™1AŽ7ź1ót"łĖµĄ@‡āĀ•zĖõ™1p±|+xr!‘˜ū¢NYóźźGø+ĶĆk-ĆrƐńłdü¶µ’ķņņµf’¬o v•ˆr'I$’øŅŃT³å…€ Ęš!~e.uX|ę¬RQ^”Į( ø8Q&"r`O,9ŁßTõ`ʬA””Ź1®ž3gkĶÓYžą.Fm2Afæ `ˆm{±(Ū%©ØMR,ū.«@źĖąīĢŖ§ųŻg@ŲÄ9g¬JݲÅų`¶9–Į9ē¼dƒ)Ę$ąš,Lóüčśõ.3$)“³D4$ĢmDC&YqŁž9e‚Čc¤ƒ°If¾%ś< šõ$Iˆoįe¾Cłž ™»)FĢ-©Œ•ŹzŠY„Ä dtP"*Ģ#Ą'õ¦®'›æ’’łóŒÅśŚĖ©=IEND®B`‚qjackctl-0.4.2/src/images/PaxHeaders.14935/qtlogo.png0000644000000000000000000000013212700760152017122 xustar0030 mtime=1459871850.615906288 30 atime=1459871850.615906288 30 ctime=1459871850.615906288 qjackctl-0.4.2/src/images/qtlogo.png0000644000175000001440000000260612700760152017672 0ustar00rncbcusers00000000000000‰PNG  IHDR szzōMIDATXĆŗklUdz3³³»ķnŪnK”ˆ}l­-EāB) jՀńA¢FcŒ!ŠM”(D̈ŃÄDc4ā5~ŃŌB¤E£BPZP „•ŠVZźn·ūīīĢõCa·Å ķŚÄóķÜ{ī½’{朒żÄ8¶`õķ‹Žœj{Ŗfnęüi3“ŃŖīž©iͶ=WēĢ ÕĶԊķŁ&  ‡Kó+[<õ1„CśP4bšW²č@åŒj#]Źhē—“mź+;ŽxŚdbšg¹ ³ŁtaŹjː=>:<»Ś;†` /Ž=čMlβäż’9~¹ćŹ'ßZwЬIĪ[īrbĻRŅŚPŽńpP’­$ærŸĒ]? ‘HŲ8:·¤®©rzuģųµ£Ķ ä*Ŗ„šŗłäo$f1©šÅ4Ē':ęģjļĄ7÷zŸfYœ-@Ąč“ę’-CĘb51Ֆ“§ę–^e]õUĻėž7æm¼a<’‹MųCŸś=²®™įį¶ėPd_“Ÿ#ī§µļ{~ė’1ź8“< _¤ų×}'œ®öõ·³¼vŖ¢"I¹Ö—¬ ŹU;&6ŅQā9äŚ ‘¤KqY‘°Nó®0{^žŠE³ėF²įmåŻlśō5B±KJļć…Å;°›s0tĮį¬ō<ĻŚ›q;Æżo¢+åEåɱNoĻ~É;;7Ž…pec×r0 Žē͘Pf/ ą÷_C¬æ’™¤ļ ŸeĻɏPT‰kēŪyäÕÕ!Pe #p¼œƒo·ą°epsłƒÜSµ§mZś}›˜eX`±š †“sEĪiČ&…¢Üéɱ*W-KĖH@"lfŗ«0éū£ ėQ² gŗéńö0ĖUĀ zŒ Ū^JĘ~t3ļ’¼‘žą™ōŚPBF‘Sa†ŠSčMBbä)M Š*E’1ų[9>p(½HÄ TYCS“T‹Åƒc¹_&6œdVœÖĀI‘éҼ.ā""—ÜP6)S@V$bz(„AlŖ},”¢©ęT—Dś¦ĄHŗ‘zīeI¹ØFL˜F±]ˆO-ĶfŠ}®'õŖY]X” ‚žłYNrķ¹ōu×cS Ąl1qĪߟņe fŁ2Ā QƒLk&6-#Ł¢“µĖpWŪxū‹-1R|ŁÖ|Īŗ]“·…Y{ßčF‚¦SŸ YL ų’J®_Rv?wT3t!~½;5¶/«\¹wB’ ónڽū§¦ķ |W¹”€Ž‹ß=\·ź8@"!ōpP?ķŠņ¾^v݊¾tĮž Oß SEGg¹IEND®B`‚qjackctl-0.4.2/src/images/PaxHeaders.14935/qjackctl.blend0000644000000000000000000000013212700760152017711 xustar0030 mtime=1459871850.613905288 30 atime=1459871850.611904288 30 ctime=1459871850.613905288 qjackctl-0.4.2/src/images/qjackctl.blend0000644000175000001440000062517612700760152020476 0ustar00rncbcusers00000000000000‹ģ]`TUÖŠ2»æ®®e°Ę².’ŗkYuÅFš‘&R $D$T„>tz( !@č„–B„HEuUģ¬%ē?ē¾ūͼy™ ™„’ąUļųO†ģńŗĒ}ōÉćüūquž›ļo»ķ®t/m€ŁHžšøVp>Œ3®Hp2l“`Eo ¦®½zP×ī=z©ėkÆ÷P×n±}ōóźZ…¦‹0ņĆū”Ōļ‰’ŹŪ–śōéS4sęLZ“h­\¹’Ö®]K7n¤õė×SJŹDźÕ«õźŻŸśöM¢žż‡Ņ€#ųÉøāö0‚’Ļ Č%‚’öŪļ ~µćkyƒ‡&SūČ®ż /JMM„%K–(ŁĻĶĶUŲoŲ°Ž9Āŗ` 4œ“Fšu <†ļĒń7b ė€ŃÜd®~_q¾’š)érŪmw0ØČ1r¤’ķQ£Ē2ŽĆ(¾×`š–AkÖ¬qa/ų‹ųč£hÕŖ\92…† OƆ%ÓąĮɬĘ1žc驺Į;ĀtņmąØhh×.ķŚµ‹>üšCśńĒé›o¾„ s?‰ŗĘ¾Įx -[œŒż&ZĒųÆ[—O;v¢Ł[ø„p’ Ż}÷½”œ]ąūoāyE¹ Ķ»÷Ž{Ɍ½ą’ē?’™źÖ­K{ö씓'O*ģIß’#ć›Ėć½”Ü'@ļżTįž›[Ąŗ ŸVÆĪcŗiźŌÅŌ³ēŒż„ʦ3Š’Ž\ĀćåWŚē1B}ļ_zé%܁żu×]G×_==óĢ3J{¹žōÓϬ>„ģģlėĪż½©¬#Žćo’&Ź^¹–-_Ē߀|+ģ2搒Kˆµ5kĮ~ųšį,£Siīܹź{/}?‘{`’—æü…jÕŖE7ß|3mŪ¶]5ĮžóĻĻŠ|Jg=Ļ£!C§R^Ž^ZµŠĒ +hΜ„4'#‡œ+ó/qų„—Ūē 6LńĞ/}½ģģl5–—qŸČ½{Į’–[n”‚‚ĶōŸ’|˲’9½÷Ž'ōĪ;§hļ¾Ü ©{””œ²fĢXD'¦Óųń³hōčilšüņ‰q—ģŸx28q芔 ū9sę(›®`/ćųĶ›7«ļż‰'ØE‹JīżĶ7ßĀŗą&Z¾|-;všŽ}÷S:tų8x’öķ?EóęÆg[’h:l·…DžčC:ō   {¤ļ‡#‚op¾’ąŹEŗŽvŪķĮC† )šū,, ’€ü_lĻ•¤Ųuyž¾hāÄ‰ŹžoÅ~'Ūņ?ųąņŠż™čćæā÷ŸS£FM”Ü ör^żŒuCŹ]÷6ņiā¤%lļ›Ž¾žÆbEš œł÷Å„óō\°’Ÿ’¹Ŗčžūļ§““4¹/((`ŪŻ[ܗ;Ę6½oŠÉżżńćŸÓŃ÷?ćyŽO©aĆĘ.ģ’ė®»^z©3Mbģ{K_ĻZ‹€ü[9rĆĄžź«ÆV¶½’ūßÜw_®ęźJĀž—_~„bŲK_’Š'ÜĻ?Iõź…)Łģ’üēėŁ^ügzõ՞ēĀ5ąœłWĪóU¾÷&)¹7Ūuüqe˹’ż÷ē3ōŪoæįsO.ģ?łŠ\rƱßĻc<łŽO™2Oį쯾śŖV­ŗyŒē«6ł÷řóųüÖŪ‚‚ū3öćʍ§Y³f‘Ƚ٦˾œtōčŃsb’¾č|3ö»øÆ·õˆśŽjpā<]_aģ‡Ē¾¬Ļæ\ĮžŠ”CŹOӌż/æü¦Ę÷V›®ŒēÓŅ—ń<cæ…å~ķšĻŲŸEįežŽ[kĮpäߏ?ĀÆ°Ÿ¶ų†ĢįcmŽ`æuėV:xš }öŁgr’믿±­ļGś˜ūł|šY1›®“É“ē1ö»¹’ČŲgģĆćŹŚ×³Ö& ’VŽ”1üJ»HöŻQl_Öblٲ…ēdŠéÓ§Uߞ]tÕaÅžčŃÓōĪ‘OŠŁtÅ®“˜˜LćĘ-8ŸŲ£¦|ƒ3 ’ąŠ×'ė†&cæ-™ĆĒ\ü7{ńŃžōÓOū_Ų¦OźöŅϹ±{žAžæß·ĻÓ¦{ķµ×³½ųό}ó%÷Ø]@žĮ‰2^oæ=(xčŠįjŲc_|wöķŪĒc¹OčēŸVó9āŸoĘž˜ ūOöčėmŽü=ńD=¶Ų’į’SĄE¬RĘb–DĮ/qäæ$NYŽ öC†Sóø2—‡µŲ˜Ćß»w/ĻÕ~\ūoTćūcĒXīßūTéüƒYīÅžÆśzļ(?ŻĢyé¾ū” ˆ}@ž-˜–6(Ų2¬(%%…fĻžĶė/øęņÄćķ·ß¦S§NŃ’ū_¹’Ö'ö'‹a?f̼ ”ó­UŒą8ņo厗°Ā~šŠ¢ääd5Ÿ#Ų˚GÖäåėuY²öŚū"öå1tžūā§«°’Ų+ös37°¶`WĄŸū ń½·Ö8‚ą Čæ•;¦°`Ÿ”4¤hüųń®¹<Ģēöā·%kņ|b’¾ųh‹>ūčŹ÷Ž,÷«wńš 4jŌ\jߞåžā`¾%ŻŽ~ūĮ‰IƒyœšĖƒMsyāæ!~Ś?żō“Kē’ö›Iī=°?åĀ~ó–wx>p'eĢ]Ļkø3.&öØnßą Č?øbŗŽ&Ų');v¬šĖ›¾y>GÖag?mY‹+ć;9=±’TÉża‘ūŒ=ūlÉ÷Ž…}c?2ƒŚµė^p‘äµ Č?8QĀ5"āUžĆ£ęņ¬ó9N§“ķ7Š?Ē^lŗGß·`Æu¾`ŸĆr?'c9FĪaģc/6öØqßą Č?ø¢Æ‚żčŃcŌz\¬ÉÄ\žĢįc_Ż~ųĮ"÷?ńø’Köéģ?ęł>-÷Vģē0öŽ9ģ§ł·ŅųźYJv^‚ł/įŒżØQ£½ĪēȾųk~’żJ×Cē÷ū# {^':߂}zz.ÆŃ¾¤Ų£ę|ƒó²•’†am›4{%±Y‹šÄæ’ćį®s‰‡`?rä(×|ެѐy\™Ļ‘y\ń×üžūļ]Ų žnģ?a[¾Č=°’Čų޳M7gõ[<§ĖŲHæ”rŗ’.ä?²c÷¼1c³hāälšššK©éłŌ»’¤üŚ(Œ0_ĆĆ_å9ü‘j>GÖd öX‹-óø‚½¬Ē”>ś{¾±×}=Į>‡±O[KĆG¤UģQå¾ĮyŁČ’­7_Ü0äžDĘ2Аd;*“&Œ_D)“VŠäi«iśģM4{ŽVź—4=߬{ŁSKÖdŹ|lś²&SęņŽ{ļ=µ.K|ōæ'ö§Œ5Ųx 6t>c抱Ÿ¶†÷ā«PŲ_–ņėĶ×ėVŌÆW 2”K#†Ī¤q£ęфq yÅe4iŹ*š6s=͚»…ę.ŽI­ŪF'µļ?Œēše]žu>Gęņd_MY“ģßŲ:æP°_ÅŲĻfģ‡Ķ®HrYʒ͵®Ž®S”Ō³ļw9˜dÜ6fģxJ0Ę˜CćEŒÉ¢”ä%ź{0…æ32 É1j*ƕĪm#EaoĻMY“gÅžŌĒ’į¹ū¹m°Ü:ÅėÆŻr/ŲÆdģgĶ^]Q±æ¬ä_°ėüpQŸ®QbB}ö‘œ śoÓ§§ņ¾ĒCiōYF)m`%_̲¾œ†9&ńŽ˜ĆŁ—:YĶåĮ¦łń×}®żU+?-…©ŠņßŖÉßņśuż·aŪÓvŻڶ—‘l`æXcŸĖŲē/yžVræoef+:!؟Œ§Ÿ¾ķĒrĻø’äʞ¾čKG·w¢Ž1OŠ4Ö_~łņ×|’}Ł?żCöĖ~›×ڧń¼P:įoĄ„IŁ4qŚš6k#Ķž»•ę-ŽE‹W¢•¹ĒhmŽI“²“2"øMą¬0ņ/¶½>1’V¶=ŲuŻŲ‡Ń<–{…}Z ŹĒŲ/~žœk^¦ƒŪ:Š–’/NĘyĮž ģéÓŽōßń“wC$ŪŸ”)Ü0~?CętNń:ģxlx„ūx ų·ÕyĪ8…æ¢f¬£ģ;–>-Xņ6-]žė> ÜüS•UTHłūŽŲö†ö6ŁuµÜ‹]wޤƓhz3ŹÖŲē1ö;VæL¶v ć^£/>Š£Ü/ŅgʙäŽū3ļÄŅ'oæNļoļLÉCŲV<ę5ڜæQÆÓą6Ą¶žŻ»Ń’„›hŠéŖ LŅ:`VĘfš›õ&e-ŪGĖrŽŠŖõĒ镹ø$–£ŹxDp”q^rłģ{²Ķv(ŪöĢv]ŲōĶŲÆe¹WŲē¼D¶¼Jģ>gĢ<ÓWéü…³Zš÷žq’Ś‚żūc;:ÓĮ¼Ž“smφѱĮT°i£ZŸw}y°/ųóģ§ )óhū”–¹2ķ¢E+Šņ5ļҚUFP”ä_l{=:ż[ŁöÄ®+6}ŲuŦưg›žŠŁĻŅŚĢ–“iQŚĪŲļß ģ{Š{:;uA ®|ÅCēŸaģ?e¹ö»ÖFŅ›«ĆiĒŖp¶+4P~C ę$³ĶOś²'Ē'Ü>Vó< n¢¼NkāŌÕ4sNĶįļ€Œg¤lī–q’ĶK­3 ūr½dņÆl{¦žÆ?ę²ėNgŪžu>G°_£±ß¶ź%ŚWIĒöEÓg'ūÆ ¹ģé{éēæAīy>ÜM?O¾°węųo˧im()”„ŒzM­Ńģ÷ī=É߂ł÷V?  ÷±ļčn™4yz.ĶY }Ž—ū„•’ !’ʶǾ[IlŪėū„²é‹]×lÓ_ØēsÖšų~ÓĀ6“må‹ö{ūć=čūÆś°Ī@ö|=ćÖłĒvt¢w ;ҧ{Eī»(¹öŪW†ÓVĘˊö“lV“F}ŗ…ŠŚÕ¹JöĪcü»*ļ±-č ņė›Ķ>āĒ?˜żÄftē]ź÷T/µ,—%‘{œ—Dž»3öćźøģŗ2¾Wv]Ė\ž`摱ߚż"ķ-ˆ¤÷ßīB§wWŲ’fÅž?F?’ēč›#ŻémīėÆÉ|žœŲo^ŽžķĘķy,ŁŽ¦lBćŠØĮhńĀ,ūū•oWVVÆ’ĻaŸ”yzīē’­ß+ ŽfšK.’bŪŪž¶ėŠļ–Ųōe>GęqÕ\žĘ~ˊ¶ōv~ŻÓ…>ż ;}÷eśķæ¹ģO÷fo`’鎜€å~ó²W(sRs¶¾LŽäŲ,iĻżŹvÜÖŚń8³õļBżŗ×§±Ć»ŠˆĮż•/’øń<6d?Ÿ #¢„‡cŸ3nēó>‚ĆyQåßlŪ»īT«]WĻåawĖrĘ>Oc,–¾ūOoʞæõź{Æu¾ūw»³Ī7°?˜ß‘Dē ī‹S[©žžYēū|żĘ>wž+”3÷%g¶eŸ²ę”]—śr;čߐõ£ńC[ŠkÆ>QĄü«¬ų_2łwŁöÄ_—m{f›žÄ” <ęņd3cægS8½·»3}ņ~,}ĖŲ’*Ų’—mśß›±ļCæˆÜ{Į^śł‚æą.m`į“ēŌ÷¾dģ_久X“fŸĀēhņˆęģSL ]‚éÅTfģ¹ŁŖ#‚’ā¼(ņߊ}·”mÆļ“4Īd×5ĻēĢż4åš\ŽžĒ•9üŻū]ū/{ĘÜö؟¶Č=°—qŽ6Ż×[“Ł–ķH­ł{ ß{Cē»ä>ć% ø±Ÿ„±Õ’Š£>½šģżĢ·Ź*÷\tu\tł‡moŪö”]—}µÅ®›ĘžŗĘ|Ļįó\^ŚųgŌ|ŽĢįļŽŲžŽŻŁ‰>>Ś¾ł¼żzVc’ƒEīżĄ^śł"÷‚żĀi­yŽø- ökē±Ī×Ų/f¹ĻœŌšöƛńüc÷.ģŃ"ų畱ļōbß-eŪÓžŗn›>ęņš»ęšēOiŖ|w޼ՉN½ēūoxŒ§¾÷¬óūoYē+¹wņOļ½É=°/ŌræiQ;–õŲ %ėƒ6Jī]Ų}Ž&1öŽ~bdģ›_rģ/šü‹}'” ūlö4|6' Õ¾Ś"÷lÓ÷œĒeßžĆ_1§%-ēóŌ»ŻčĢg½čž»W:_äžÆ”ž¢[j] †]F× .’X—)¶=ųėNiųjc.Oa/syz_łī°ßÖIż¬IMÕ\¾Wģßc°_.ŲOž24ö)Cš²_łÓŌ·k(ń^—#öhʐ}¹žwłoÓģžü= ŸMńÕ6ŪōĶsy˜ĆßńŪŸ½Æ>M Ÿd¹g’mėĀ o–{żńŅČ=ŪōĢż|—ÜĻy‰ū…‚}Š!÷ɌżŠŽū›.kģ/Øü›m{Ź_×<Ÿ#sų<——=Ūšßy\ēķ·u˜±’„ż5䞝ųīüØæ÷‚żg}čדÜ×cģ?c¹÷ūvŹ®'ŲÆÉäļ½ūŌŃ-hĀą¦¼®¤õ‰ ”[/oģ/Øü·Ņ~{šŁ„æ.ÖēČŚ,cטĆw²’†ųī(MĮž3ö¬ū#ģ³uØ #}w¾°ŸÕ–Ē~ĻÓ–ūŌQϲoiīŸ6Rßüß öDžÅw«_W^“˶=³]ׅ=Ūō1‡ŸĒsų;r ģÅgO|uÅOŪ%÷ßŲrߓö¬Pß{å~“ōõ¼¢ä~„Č=cŸ5­ ÷?[²Į³lƒlBƒ²mļw#÷Dž}°V¢Ųöd=¶Ł®›.~śz>GÖå©y\ķæq`ė«tā į«[öß½×ĆCē;sŚ+ß ĢåĄ®§Ę÷®ļ};²bæL°ŸŚ†Ņ5ö曚š¢†ōŅs—…=ø–ęz^åßeŪćõŲb×Ā¶½™cŲ¶§×h`M¦kŸż7ö³ß–ņŁc_ݳ,÷ŹW÷Gžę[äž»£Œż~ĻļżÄaO«y³M×öėLr/Ų/ģ'“䳯ę¼n¼1ū4ø\lł„ĮÜ'‚ą,s’’ęšģ·ĶėlŁoĻĆ®«±—5Ėfėqe_łohæ-å«ūųió\°’ }½žäĀžMĻń½ą¾tfk–åē\¾›ĶrĻv=öé/ń<²}šĘ~ĢĄĘ¼GDj{yĢćXq-Mų¼É’KĻÕĪ—õŲcū0Ą¦/k³ ģ›óz\·’†ųm}Ą~[Ÿ³Æ®‡¾Č½Ęž·Sģ¹ļgöŪŁ®ērd.oQŖ¬÷Əu¾Ę~5÷óWjģēOiC‚żTGs¶E<Ć>'Œżå1S¬}ʼną8Ė$’ĮŻ’(r/>›Ź®‹5²>GÖdņ|Ž¬ĒŻ˜Õ†ē[Ū*ßńŁūüĆōć7¦õģæW:æ+¹÷½ņŁŅ>;YS[ń|¬ł~YÉżź¹/Svś‹¬#Śr9ŚŠģńĻŃĘž2›Ćó…kižŸłoX÷öDųj‹æ®Ųu ›¾Ę^ęqy¾;ļ‹Ļūkžųöהµ9Ąžsöēa¹ģ?ß_:ģĶ:#Ėż˜bW~Žķ:/0öGÆÉÄZlńßßńŁM—Ÿv ؟€ĪĻ5üó•ߎÉwc‹Öł†M—}õ{ńׂĪ_"rĻ>;2w?IĶį=;Åõč¶ĖŪ–ļ7~La:ż–’ŽķBņÓŲWSĘx곜U¼WÖįoVž†ß–ųk~ŚÅå¾čcÖłZīKÄ~ūhūĄ>G¾÷ŚgGłmČܽžæķ×­Žå>SģĖõżņ©Ääį/rŸ«±ŚoKęsÜóøĘž²÷Ź»ā·%žšģ£ļņÓÖė°Eē»°?Š•N¼mōõ¼É½7ģ]~š/{ųmعū”Myżčļb§,؃&‚op–Zžå÷ŠFŒœÄßŲFjGl;²&s%ĻćŹ:|™Ćß¹ŽšŪĶļ¾d_]ųč»°ēžßǽč‘ūņ`­TöįįłŪ™2ūū˜Ēžž\Ė$’7Żtsš(Ž/}āä¹Źgv=ńߐy\…=ūoˆß–ų쉯®ĖG’‚aļöŪ0ęoyē÷3‡ēęÖøüg©äæC‡Nł))”6w­²ķˆÜ˚¼õ<ʓ=ÄC|wN öģ«ėĀ^ÆÉ£ĻµÜÓr’–Ļė±¶Zt~ÆĖ±śčŠĻü6’õü­ųķäŽ u±°ßņ_Æ^£Ä1£Ry¤ ʘæfNxEķæ"}½‚„Ļ“ņßģÅ_ó öÕ5ÆĶ‘uŲ‚ż'¬óÅŃ¢óKľ½G_Ołź™}tį³#󷣍łŪĮ=eēĮ®i`|W nÆ"ų)Īå’ÖŪn v ĻėŸФÉ+hīŽcR?cƽ…­•’†ųīœ|·+?m³¾^ƒoÅž°Ųõ¬}=%÷¾±_Åß{ųģ`ī^ęoeļÅßßžWPKłŠ/łļ—7k®uY¼ēŽČż¢óĖ‚½ņŃ}Å寕eĀ^ęoÕŽ³æ»¹ūóŃJ-’ĆGN+š<%“F$MāõļkyŸūŽg|~ęĀĶŌ·gDŲvÅē öŁż‰÷^śåóŽ,÷¼ŲPģŻ¾zⳃ¹{™æŲ£Įå²ė|ąY–4 ūrõ*’Q]āóF™BsęfÓ°ćyĢBJ›Ķ{ą­ŚL«swѬōÕE[×ō ¼NŸ‰a?×XÖ{Š/§ ¹7cĻū0”ś{ß|ųki捩ģ·!ó·jŽåµ§,ų•‡ęœņׯµƒĒ²Ž5zĶ_°†FJ¦yóóhńāu”ŠklžÖķūhķ†CŌæOTĮqļ’‡å’Ė#Żøo£|teīŗ©~žįĀ(Oģy¦ģ¹²UÆÅĆ\Öeˆ®ųź™ż6dī^ęoeŽćęqʃ¾AĮœÅä?¶Ē€¼”) h܄)4oŃJ’NÉQ^žš1+—öģż€ņ RĻ>޼üõóéŌī.ōåaī’ó>KóŽ;bĻ=ŗMüvK½^ƒ ’löā·!s÷jžÖX‹˜Ē1Ą+ēßåæ~ż°“&ϤäÉóų7fÓō“u“bY’®Z*åążpó鵘ž™‹ 6¼Kk7 ¹½čäīh…½ųmŁEū7ušōŪń"÷XmÅ~“yMžƒ×ßęqʉxqņ~„ÓCž£RŠŅē®ā=PgŃℹ4dÄTŚĄū9†Lā}’§ģŽ}ˆŅę¬+ھó£¢÷O|I ß§ĢyKhēĘ~$c»ż;Šžu‘¬ó#hēš×>kV_ {—æ–Žs×ߎąõ·}e/`Ė/Ž`ٟų”’F<Ž;~2ļ y?üɔ“»ƒ“Fó¾—ŪhĮüe4l茢5ėßę=Ń÷QƼZ™SHļ¼÷9m(8JĖW¬„mkū*ģeoEYƒżęj¹F(]Įsø.ģkrÄWOüµĢs÷ĆūęqŹń9)#8N—üOžœZ4qņlŹZ²™æŌĮūīēßǚĪūą.£œµoŃø±3h|ņ"Ž#ļ(­Ū°‡Ņē®įßæ{“öģ;ÅząånÜIy«SŌ~+oźżõdßgN„Śc ŪõÅwĆ£Æ§°×~²özh3µ³wL`ļœ(–-‚WłoŅ¤ŁĄY³ęŃä)i4w>ļ{:—÷=]L¹ėł7”(äß“Īå½ļ¦ņ÷ß>Ģmb'͜•Åķį8½Å{%®Ļ›R°bi:ė‚nܗ‡+?]ōõe-µö^śł&¹Ÿ8ŒēīYī_iõ`ĮeŗöŗlˆŖN§’’ŒŒĢ¢Œ9‹hѲķ”:3“ķ¼h@ā0Z½į ’>Z& 9“¦¦.åńą žmõTZøüMžMµ½“dłvš“™KŪŽŃŪūNŅŗ¼÷ŠŚµļ””Os—Ó–œ¼ēJøŚkGÖb‰ÆVļ¹ >šĖg½`¬Éa’ģ/hü×AwÜöēP.[`‡™pŽbņ’Lć&3ēfќ“„“x9ļs8{­^ˆ;…u’|Z»~’FN2ļ…žĆ:5ŪVŅPŽs&Ļ mŲøÖ®ć½Pm§–­Ć“¶n?D[å¬{‡ś'MĶO8¢`éŅBڼn6mX5–e$š¾­hVržMę^Ō%²yA•* ļęp/ÉFš3œü»7SЦóNŚ Z±r„edÓ¼9“fż^ž}¤1¼ßł>Z•³##™fflä÷«Y¬ę½±ēPņ¤yTøõŸļŠ‚Å;Šę.Ų@£ĒgnŁO[ŽŅźu‡‹²×ā}“·ņXr͚[H™ 4}֟܄—#€;3į".ł’ӟž”č5©h؈dJ—JK±lg®”å9»yģ?“ūoÓÜy+hہ³×씜Õł÷1Rų·6³XĒræ&LĢ¢Ōōüū9Sņ ¶¦3—‚ƒ› ā:°æˆĄ›²Šąūˆūī{ ŸÆ4lĻļ¦/ ys—Ń ž=Ū¼Ā=Ō?q\Įü¬•䛑߳`ĀÄ4ž&äß¼]OŽ‘“ilJĖńnę9‚5ü{)K)mŽV–żłł›·„Mł‡ł»Į{¤3ž‹–ļ¢%+Žęv±“śō›Ppׯå|Ų3.Įį’’:užĢŸ6=ƒĘŒMį}'ӄ1©¼ēń:ž Ä]“õĶćE³Ņ2fėi·øø^S¦Ķ§•ėå·ī7Óō陔4˜mKwÓē n3‡Ł^THSłwЧĶZĻŗ>2ų÷2”Ü/ßI o§ųž£ ø¾Ü/č–,#8Ń“i‹ć|å1\’ĘŁ4J;Öēn„Œō\Śwšn?⽌²s¶QĪŗ½E½zõ+H™˜ĪūŽo”eÜ’O±F²_Ųą”ÓiŹĢu,ćoъÕ{x~p/å¬įßKāßN[Čq&M)Ø]ūž€Ģ[@øDA—ü·lõŅń”‰2Ļ7Ž}»Riö¬ł4cź<ŚūöQ¾_AžüŠē²ņ32W°žßŹæwņNŃbÖS§Īåoų ž”Ż“.’(·L?÷ğI£ĒĪć>Į2Ja_±é3×PógŪ āzdžķ#Ū~ŃŗĶĖJžĒ'ó÷|ÜDĶó½3S3iĘō%äÜĮæu¶ŅIĒO|ÅśżCźŪoXĮ²åy¾ēė‚ż“péVš8iė ž'š±–feä³](Ÿf„小ųbz=fėxd8*\ņ’BŪvĒē/ȦI“¦ņoߍ§3ēŠ¬Y hbr’öé»ō¦óõ0!×ŪŅŽ·>*Z“œ÷$k­Yū&m*ąßÅŲņ-ĖŽĘsYŽ—©ßÉÄó„wŻõ׀®ÆhØ{–'‚ƒ’üēé|eæ>žēMÅ߁d;~*Ļń®a?Ÿf§ē°m÷$c¼“,ʧo£ĀmĒYē§å+wšż‡l#8Bó²¶«ßͽóĪ’ ČÜÆĻ.ą{öõ:$ļÕ·_®ÓŲ,×;īØ-}z¹—#p­Ü|ˆąā;~ų±ōʍ[“ks¼]ū׏·lżźńG -øöĻ7$y‹xVœ‡•…'O7}¶^Hu›­{Ė Ÿ’šh³żĢcMPPŠ6۟Ŗ\Į÷rŲ·öīu æ·üA]«]k«šd«nyzFyßį_>Rē±(¹UĒż]b»FŻß5²Ļż ]»ßßóŸ=㢺õ‹Šłg×";¼Ž!!ęžųø÷Gwģ?žŻ÷jLT·ŽH!p p ĄŹŹšń‡…‰£ń J_¼Ļ÷¢WĪu¼Šģ…čnĶ"»+^Iļ½åćmč/_×j:A{ķ~†ž‹l#śĪzœžńs7yÖč[õ>ˆ#TÕ§5®?aǬ£”~i\vź°]_§„vQń¬WäÕ “uhMį»®ļ1|Ośc¬‘ŸÖė ļU.ī?hKŖ±¶š`PÅv…ķ«jņ1»$ū©ĮýńUŽÉj’oŸD‰‡«}ŻŠļøÖ¾Æ«Āéō?Œ«ćŸ–ė¼7TżźdW#u÷_ūUm½šĖĪ^Ģ÷ęöÓŖ¹ĶvFŽ|J•ēżŽžh„9čõhÕņ”AĻGGõjŌ3&Ęk”s>4—‘ü:QńļģoĘÕ®Æ5É;7ŚÆć ć :\ńżFŲf»Ņ}[Āš)ˆß#’oł^Ź×EēĻ·^Š!čźh:¤ē&~”{#6čtÓ4Ņ]b O:ĝSÓ!=7q‡ütg5ŅĶvkuiÕ C<Š!ŅC8±†›®6?“ėōæć{įēé"GÄGy»čxx.ł =āƒ>WÓ#]š×Z~Š#>čk֟¤ŚŅ½µ G|П®gŠ#]”Ū=āƒ>LētQš×ZÄ=ä颎¾čōHé¢ÜŽčÓ92äķ,ß ~V¹³ņé \Lā:k··°T©’¤Z ·‘+Š-¬c„·pu¼l„ÆWwLļw‚[t’åhRī°v^č b©ģ U× 3žać„ĻæIŗ>µT ”ur:ø&ŪlrŹ÷³Zµź¶«l“ Ŗq“:}&éńüņxØp%®Ŗj'oņ­Ā<.ĄøŲĆ5¾gUकõmI]¶ŗ Ÿ‚pu~x£~1GLĒ鹟õßX¼×qLBžČ‘ŖŲjŲ®³ŁŖ_É)f0B DĢ®Gų“cėQÅ֐S¹‚æóŅźl¶4Ūæ¬Q*TøąāŒ0p^ŖŠ‚‹ķ„-Ø@p蠐›n3Āf\ŽŃ|į‚÷HG_½ār„ĒąĀkoéWQ©\i»Ó•æ©ŗ/Ź pĄzx©Ā(yYl’—[Čx–&}ƒ.q_Ż^3tņRÕņ^q1pįęģ–—lżŖWćQ|_E‡Ay—‘“źüϐ—;“Ŗo€ p.(šBø"_KĀE¾Īę²a#óóK}oŁ¤Ę-‚‹ƒ;ĀŪ¹`FiĒØo°¹œR±gć®LŹ·Łä4Ž’Łß4Oī|½ÆīCŁ»órg?§hõŽßøQŻ»ž±N½ĻhżāĘłwD’ż©Su5©ŗÜ±?¶Ó z”YĮńäÅÜÖ8¦ Æćt%­{5}Żš”õYZæ÷PˆŠÆœõqŻūnn–Ÿ°š¹|.C~Ļ—ƒĻ¬ŪVwö#ė¤ u“sŗnŁļTš{a§ņø ŖL’ī‹cB¹ ”Ļä×ķ–Š&8d]#ĪæeNüÓĶó^;ŗż©&o~Ģåu<“­{ĻĶ+÷ =:ūŠĶŸž’VpģßqõnżéPįcĒŖÕ«U=Ė8*¾¹o¤j/ę²”ö™“£Wź>\gż‰¼/wNŹ«öŸĻó¤m ­‡ö}÷øZ=Ķ}tÄ1®F×óYńČg: $śõ;8Š!ŸÅ㚟Hœ‡zØXŻ„Nęx6[Pčī]Mėā[&tņ½²T_'<ć‚WĻ·ē3d”ưūTį^”½ę$NžŖzRžŻ»v=e³õką;ækyĢP£Š2ĄłŽt^ßTՙ1/ŸJ^«®ĀsĄøć@dŠń!ʑ×ŃćyŒ_®ņݹæ.bŃØQ#‰ĒDFK0·±¬NO(½Ž«½“Ńuvö2Ž3'®ļń¾Ó^éCęk ō8Pį$!„½d`z„ļh-õ ć?\„ķĢŚŖ’‘-ˆ7©Ó”H ·f~Y£IJŅŅŃī°5VÅ ą\PBą„Ā'¾Öød±¼šqāK ó}õz±Ü†0žVļ¼üéĘq|.Ā7–Ėj|UøT±Å²Ą•žØĆmŲ°ĢyŅø-Ā’ƒ”3žń*JHp įĀ@ŽŽāūŅš”Ds.ū²¶'»ģĖ›õ|«¶;sT£UĖŠn<}šŪĶvß<čń²”oåĻŚÕM}޼m\ĆNÄ«°ćcćö¤aWĖHōņŻąž„žvĮ?ū2ņ‡õˆ.;=Ļ;Į%ˆ!čģ»ņ#=7•§ń@WGÓ!=ŠYķˈŗ.šé¹éŒ;”ń@7MÓ!=ŠYķˈ:§¦Cz 3Ū—ƒų!āī¬¦Cz «ÆaB9tµ÷üDzn:·=[ņC<еÕtHĻMwD5?ä‡x sh:¤ŗÄžtˆŗ\M‡ō@g³Q·Čń@wZÓ!=ŠÕæŅ“ń@WSĖ Ņ݊Ŗžtˆŗ0M‡ōÜtžüD<ŠõŃtHt6ŪP~"č² Ļś ŗU=étGt|¤ŗśW6Ӊkžń@‡xHįÄn:™æ€~ż½Ö7ˆ9“ėv‹ē‚£Š#>č³4=ҽUN@ų ?¢é‘.ņµŹ čōö =‰t‘Æ/zÄ}Mt”æœ>źų ļ¢é‘nMē‹ńA?MÓ#]”ū¬üōNMt‘om-_Vüōg5=ŅEł­ņ ž#>čkdšé"__ōˆś¶šé‚’åG|Š;4=Ņ߬śåG|Šējz¤ žł¢G|ПÖōHåöEų ÆyŅąŅżiõG|Їiz¤‹|}Ń#>čūhz¤ŪE·»š½ž!>č³4=Ņ’}Ń#>čhz¤‹rū¢G|ŠŪOił×逊ćÖöų Æ£é‘.ņļć£žˆś.šé"__ōˆśišéÖÖø[õ8ųų wjz¤ žū¢G|ПÕōHwšĘ’ˆś#>čkė~*Ņm«Ėļ‹ńAßVÓ#]”Ū=āƒżd¤‹ö ¬ų#>čńéÖōńżž§sdōĒaw°?åé÷üń“k~‚ÆČO®ęq“/»ĆYmwĄÕ­ēĮ^÷Ļī:ŒoüŃ_T»ĆU»÷ pAū^*ģÕīŹ^Ä”ŽģņĻU,»ƒa•2JXńžŠœ‡p± oēĖīż}żįŌśzÅ©õ¾Чuōsp¬aē{‡ŪQõźOV9¢äf»„sŒa×ĄÕŽUŪ-»ł§?@‡vźōJ_Xß(씳-a”Žūõ 5¢²ŁT IJcZö_ĮUŁ,ĶvKŃOV¹IŽÓ3?æņ8į—õ”ÄĀ„WFŲ«ā„„=%qapA — 'Mf^ÖۊwU8\Åv|‹„ļå4žŌ•ޤÆ×Wč„ńéč«Ģ{„ fs¢{>žÉ*yUīåÓÓKøČ+oéKJf2kŲü®"Ü .×r‰!o;¹PšQH6ŪVźĆķ÷åY ś§Ķ–īłH… ”’ užō¤u<ˆń ō¤9ézڦ6š^sX’ Ī›õ”½PŪyõÕŃ]÷§āüӇ ƒÜ…y£OšÜĄ(ŸÖ‡Nϰ¹š^īQ„-ėC\½źĆśWŽd“³t‡Gś#÷Ģüšļ%ŗ‘Š»æ\ŗT½$t‘I{JbŁĄÅž†ĘWćlēšś¶F[ŻE»¦>%įńü0OłžÜ«ło]g!aó{še?ų#?Ńö^!™nūGµń¶›¼|Ģ„r/øČy;×Å»?æuƱŅW“0pĄÅŁßĄxå¾¶¾Ķ¶g3źši'w،KoĮ.xtōՊ ēÓm}lćm,½Ė~ycc=ŖpJ²öN× WÜøą=¼ŒÜÅėÅ"LņāĻå9|ŠųSZĮućź=QtØpÖ‡Õź=jOń`R pÉ8pÅ7×Ć¢“Ϥ/j]’"m•łĻ-՞Ą=®ž¬ öXŻÆ£ļ Žłšźbr…ōDo¦³@¢æƒ_ņ‰ŽÆē²Z’bŸĄ52Æł¹¾÷šĖS½žÅCūŽ}>ŽųZ’‚qʁŽ9Ę8ćC‡öƁLķׂń”¹lĖ«ćĄ! nÕŖ+Ŗž¤[‚Ē8p¼1. ÓWū`ŻįegN\ßć; :|§C¼Ń“Œūža {ÉĄōHź#G-łSp/ÓņųWÆćĄUo²ÉYŗüšļ%ŗ‘Š{XśT½$vą\Ć \€—Q”E66»‹%įv[$ģäó]>„ßś>ŸrˆN‘vÅ#FŠõ^õŰ+ŽŖ»¢ģƒš®ķ˜:=cś IśŅ’vl=$%•²~a„­±*Nøą¦å xUœ{/‰ČŠœ¾p1ll•o¼€ j¼ų[Qh³ fłH/ą3ÄxߏĆņ<(TĀ"¹ÖķĻ%Œ÷±× y\N5ĻŲ¢žÓB/G“q‘æÕųEZyi‘Õ’p±¦d —&‹GäE>[ų>ķęĢ5;K,7ĶJy8RwŁ©=+Ą5āń=įKw ~ fŠšvqÄ;ßW+ļ„éœ ś)č·`]ś3čÆĄvlō_Ģå”ö;Œ3;ĘUW­Ø:­Ŗ‘«¹ßbęµnĪui|×c¼õ;Ģ©÷ŠĆvMywŽņBņ÷5äĄ|hÅė·æf[ĮįWŚ~‹ĘøWą„ą°=Źz×Üo ćšĶ[wÅ’īŠŠo‘°čį^•…Ńo±ó{c>“*÷[œ¶U¶Æńu⦋¤Ÿ¦Ū±é±ŗ•”Ģż#lUqą\PB·Üņn†,/öĶĘ;„ \ÄGó4Ÿf¾›æBƒļ£.ā‡rK£?¾sדü5Ø×ŲH\xX½:§(Ü,Ķ!żYŃ/¾p±¦d —&‹Gp‘łyčĮēųž’Ÿóøźœ1*v„ ż“9kóĮ ÷U Ć÷ß7|ļßAųż`žėDŽX×ßš7]ü½›VĆ|ķ“UöiĶß;ĒÄ+Œõćś6ĪųN9“ēČß×ņ :ČÆwśN–ļŻ<ѳ!ī\ŒēĻčųæLŹdZ™ÆÕ×āćtŽ{¤q•šź,9]y ?į—œÖĆwČ8RPŚŃæ5„‹.Ąø wą…pE½šqń6’$­Ś|XĆęw—ņŽž`™ēŠįķ\(iQÓÕ!Öņ-Ģ~¾Ų³ŌPĻyް*ĶŌžYĒ&ßÜf`Fž}Žß” ÷”FųKZŻÉ­oɗtóė<øńߏD’ė§“jŸÆ—īYšWt¬ oŚ.ūņq¦”i 8žÄÓ:Åōu˜FĀ58Ż)œč»E}2µīŽ‚f“(Dč’õę깈FŽüļž[>—!æ sOšä{‡ēdŽĢežhśÖc ±ĒœŹć4ņ’n É=Nž‘ å2„Žšōģŗó>[P7"?mo”ņƉ……›[ņžzlƒĖ;ķ_E}nܼ抪õžv*üśpZĮ»¾Ž5ĖØš½Øż”Gk§sGEąĄžėn ±–£“Ϥ}󗰱ę?ężĆžR^µ»sŪ6l’fµļ·Ģsœ ­¢¾žīo›ō±Ż‡ų‰HŚ+Ī,®ūĮGźs„Ē{wLcæ„tH|„Æ oŽg½—8—Ć<‡°SķóesĻs}ćŠ=ĻįŚ§GļĖóŖ÷_ń»(>öƒoÕ²~l×ī±ńŃ ŃŻ:Ū:—i«oķ#WÆS®}ŚXoŽV_§½eģÓbŸkĢæ8ē_˜}z’·š§uy8čõžBæA<ŠÕüDļ7PŒŽsŸÄ]˜¦CzČŌŗO¦Czn:ćåD<Šei:¤:ė>=ˆŗ#šéĪŗOāĪž©ŽG@Ӄīį+cÕ-ʉx «£éčkxŅ!čŗh:¤ŗ‡Æō܏ń@7MÓ!=бG5[”ń@ēŌtHt_éI‡x ;«é讪ęI‡x ƒœ =7q‡r"čé!ü°¶i ]m~łĆ:~‡–GÄG;­iĮōˆś\‹\ƒŽŚŽ@ų ?­é‘.ņEūD¹@ų Æł™–KņõEų ÓōHrc×ųYóG|Š÷ŃōH÷ˆę›/zÄ}–¦Gŗ(wł#>čhz¤‹śū¢G|ŠŪ?×ņ«ÓAł}Ń#>čėhz¤‹ņūŖ?⃾‹¦Gŗ(õG|Їé}א.Ź=Ķ=⃾¦¦GŗČ×=āƒžōN½’ŅŃł:}äų ĻÕōHłś¢G|Š;4=ŅÅ÷ī¬üōm5=Ņ]m‹^€ü!>čkkz¤ łńEų ?«ūHķĻ=āƒŽ©é‘.ų†zXåńA~Ņ’}åų GśHüG;Ā{į_:Šß]Ė©ū?ˆ‡ö=ZSėČāÉÕ÷>(īĮ@Xgc’U×u²aϲOõÓ®„é`?ńJŲŠϽ—ö”Ä=ą\i˜ĘK…ĻtmČć¾¼ÓūÆJ0ļ śļ¾öAĮ{W:źĘ˜ĒŃć%מ«Uy’Uw+ō¤š*ķž«Žh+Ņ3Į%„ y;ßū @_@82qō ōōØ] —Į«G“]\ĀŻų¼ęš&UbÕæŠĒ:&ū½.V_Ó“<Õ?ż:“S‡Wś7<ķāIŹ.΄ü°”Ö÷ŃX7ŠZEъ]\Ņą+Ū=ŒÓ˜oäßńį}Pššī%ržū0óK„o!1Rqūƕ.UK"1ż€ мXE˜×ż’ė”ʅ©ū†0Oåąõū^ą€y` _ĒńZ«ø‚Ć¹Öż7©¢~¬ÕKŚÖGĄE0”vl=¬)YĆÖų—:,øœąB@īöņ½w½ėYŅk<ƒ•&”Øė'õNē{č3č·°yŚ>¤ūIŠku“^CæzG»™/©^½I•„^Öi:&ś ×°™ŗ4Ū?ż:ȑŻ+½eŸ§ré·†^KŅ×ó¤ßųē³¼®o‚~C[¬,ś 8“ąe„åįŽē‰ēÕ/ŹļøUŽÕå ?«+u²MtŲ¬ß$nJ5ł[ģ{Č`6½»÷yjReb59‹Å-öĄÜŽeSėaMŶƿŌa‘ók™·Ą>OĘ:`+.ЇŠЇvm'wéI­1īõ5~½šŪŚCÜē“c9óæJ•æ±%ŅhČ~Yŗ§ÆĪ4#ģœļŸ>äĪ1Ē ½uŻzĮ3 Œ–®æw–ŸZB”$“ŅßÓWÆśšo¼f]Īsf~©ō-$F*īž^éRµ$rƒŅžd¼€KŲ\ÆĘŁ(RÅ]·.øČ™Ā•vl=ŖØUӕoŻ:p.öy.ĄĖا{ŗ„+Ņŗuą"²•lÖćoe]·€ ō š2*ÉėŌ bTĮ¶ån‘ū¹|bŻś Ż^3ŒH®õ=–ńŽė×øØžƒē>9¶ĮUęŚŗ{i’ ĀUt¾œ‚‹wy‘D*ß:ą\P_ą…pE½Š¼”„ĖßŖMń@×®(õ²÷±ųséšv. T ]Ō'Ņ~=Žū~īāń€՟ėļWĪnńB²ĖŸė@ꂱ„5Ē»ü¹ž–˜¶±Cµf.®ź‡nĪ’×ą%.®Zµ¶Ō]ńß=u“¾ŚŹž\«bÆŽtß±•OŁļHb®«:Ąž\؟«ūs²?×Ń{®Æ·u)Ī`®„.k3¹dį”&kĒ„}&vG«?—yŻś½s÷¬XŗW.ėŚwCAųéĻ„ūõæ7.V·¬ųw+éŗuŒū0„æʇ˜oÄü!ģcšŪ—|w²¹ńˆ]ģŚk¾2ĘĖśÆ°l£’éŗ.ŅżŃåĘ՜ž·{Œ7Ā4¾Óö%^čCd=‹zܗ“Ż3l¼ōłWź#G-ł!“<ÄÕė8šaŽėWĪŅą×[_dƒÖHÅ=,}Ŗ„Ėū|Ē.Ąø8—j¼5^ē;ß •ŽNŻŽ­éė*ß88‡–7ąeŌó”ś6[ż-Ø3ŃC¼ÆÜ [%<—OoČńœž€]e]ć „ń^æĘŋ½2ĒÖ²Ŗœˆāūšt…ŃÆõ…‹‘ŠŒ7Œ£t©śĪļB恼ą‚|—Ķ&ėšl¬{ŒėżWoy#ļ„¶ÆŅņž{½­A,óEx#ć<š½‡å€YĀī÷˜Æü¹‘Ķös£’<—ūŌß¹>DƁƯ “®hY5öАRą"T‰œ¾/\$%‰ƒĆĘóŠr\&°ģćūt” ęE=+®uŻY±šąWÖä­ėńd}įµ7FZś¤IĮ ’ū×Ćo©gĶ'lB ßA…·wl\óŲŽQ­ć¢¢¬%‡KĆkIApJē+ś+čæČ;9ŠÆ±śMĮž}ÖāĒ&4’#9>Ğqå•āQk”ĘlǶ?p„±~×Uśū–ė„’a$ēńro×t{gŽś‚j,÷rĄn]ß6Žśś‹śŌ’õ˜–ū/øzķæ\Å6l9Kwx¤o!1Rq÷_JŸŖ%”‹.Ąø8Öø/Uœ¤•üÜéśNŚlM\a™wĀ~;“}4fńŻ‘ĆĒ{õü#·E÷¼Žū¶)UvņiŠ•ōW0‘ór³Ėą¦å x)žT`\€YÉøT¾~%p.Ø'š2ĀI,rČuH¾-©JˆĶ6%}Ø,ß©ŲŸ«ø=ĖQšöoÄōļoIņr•Å^j ū—Ó…-z¬ķ’ń÷OŸs–„PĘ5׆x-`GÓSYŸķNĻWÆēLؐ¤NŸ®ÖĀ ½Ü›Ó1%ø p Ąp Ąp Ąp Ąp ĄßÄʰžĪ@T7Ąp Ąp Ąp Ąp ĄrpĄ?{¢¬“1nÆGóS×¾ųzüoų„Ä“o×ūźżņĶ4rßŖeƒØN‘=c¬/ü{+Q½oķŁĘžĮN}=²Å;ūž…-.ݾųU”gØgNUlW»Jyāź^üNƒųłĖ÷BUG—‡o½ C<ŠŁ5ŅsÆQŽĄ C<ŠyÓØ'Ņ]b O:Ä]–¦Czn:ćł!čśh:¤:›m¦G9tašé.±†'¦¦Cz ;­×|”œˆŗÓN½Ÿ“¦wÓyę‡x ĖÕtHĻM·W­ėB~ˆ:‡¦Cz K¬įI‡x k«éčųsŌ-ņC<ŠÕÖtHt§Æš¤C<ŠANčjW}Ay:#?ĝ+žĪ×®:“w¬¢Ö'ɾų?ģėu:hß],zł#>č³4=ŅżK»=⃾¦Gŗhר‡µüˆś0MtOküQ+=⃾¦¦Gŗ G9¬ōˆśÓŪ“ėt '¾Źų ĻÕōHōG|šńAļŠōHō؇µüˆś¶šé:4’|įų Æ­é‘.äÖ’ōg·üCŗ G9¬åG|Š;5=Ņ]–ž!>č§iz¤‹ü}įų ļ¢é‘nmzķńA_GÓ#]Š£Öś#>čķšéžÕrģ«žˆzōC.č}ÕńAņ!]Š£x/õOēś;X–åŁļA¹”?”­ņ$éŹ¾ų³ų«.=‰5’jÜdōōx_ėŖ6{­Ćć®Id}­÷Åw~×ŲX'ŗŽX?čÜąe}'§éĢ{w Š’?\®Rī$ī8Ł5ÖUy„OŹn årÆ=c o}ż•śČQKž$-dZŁēP_‹­µń¾ÖRg9Kw˜łe„Td-‡[Su.Ż”ųiæķ1õ»ŚøZÓń7켯«ĀÅy&ĪcŻņ¹Ņ.Ąø€xaąe¬—>ń„KRDó¾ųƒT)øÆŻ4.Žßė÷…o¼ļŒk_üĮÕbk ö‘ž;e÷ŻZŻŽŻOŒ;÷ź.™$NÕÜū·k\¬t—*,ø„pę;ģ‹łóU.Ķb_Æ]rčŲdČ-šĖ÷&ǹžX·ķ3õĀCO|mČ!®ēI„mĢšŅ> ¹s£n•Ć’K~ńßBp±ø/£dįõł¶ŗKÉį¤+Uų8?<£_Ō‚rGTw”ü>˜_‡ ęq—{öŪMUóiIČGšk~Ž……Ė›œKJ6›¬6Ž36¤ŪG†š1pĄÅ¹ŁĄxEčĪøŌŲā.Ž„sT،Kg³āqG¶ ßäšńŽĄ…܌K—*gÆ Ź’’–”¾‘Ź•¶;u„Oµä˼‘8`’ ›ß±š×čOŲ9X•ūÕyÓÖ+9ÅÕ&\YW§‡˜Ž®ĄEŽ!sō3š~Śüf³/³łÕƔ4ƒŌ!ł‡1Hēæ”ü[EöŠ ŖÕ­cT\P£č?wÖŃŁųøÜß5Ŗct俯ćb_‹ź36MGĻjpxt‡Ųnń÷Gvļ×";¼Ž!!ę~)8ąĄļ‘Š ÷½*Jź÷ȁ@øtrOā»ĶĪ;ŲU±U—Ī>¤‘Ī÷°ƒĀ.j_hŲEa/…=ż“¶/ēź«užą3īųĄ~ń6X«WŸZeÆŚ÷×®~ļÆvMĆ.źÜgģ›Wē{Ć.¶]?œĘåƵĻ$Ć:ķ?Wv@ō—A‡ž²Ż+½õ÷°vÖ7Ņ-=ūLÕ¢¤aL+vQ}-6Ž‘ßū›Źæõ'ē¹šk óJųe=$•jŒśœÖTƖh»čĶŚ.ŖÆÖtü włĘ°‡†}W6»(p.Čx©pćRK[\ᤪšp®šT]é՚/5tćą‚÷ČC_½Œū§VYSUNnļæ}ŠMģėzˆj!µŁ€‹¼š–¾¤RŻDe¤ź~ąX¬q™ÓCŁńķ3šq&ė߁Ūk“7…qgĻź«Ę §—׬fż ūtsćzZćįüĮ\ä÷°’÷œ°Ó>Ń(ŹįÜźTņ…p½6­[?Ū¼Ux‹ÖįÜåOˆźć§ƒJyéė—%S^_ßg=(mén×ó{\wÖŃ+Ā'š| ›dš ü³:«ę!@ß²aó [ ›āŌ€ ĻK{-7}™rõ,]ͧX×cC:^s…Ż7ąų>9&k?'Ż®œ‡}ń©#'»ÅGó8Ņź¹ļÜ|*}ƒ2åźY®ø"£=ÉŽžrT×Zäu#čń|_Ą'ēƒOąŸÜõŒģ–Ż­³5–ļpyéC9׆ś­GnÕķéq~zŸŠ—1±Œų¾€OöiŸĄ?+©»ž]cø1…æÓ3Ī©„pyé[EvķÕ1Ø™ŹĶ1~ånģf“~2󩫗rƒOą ų6]ė'Ż®¬¤īzĘw‰ģčWSRI•—¾U™rõ¬E”–»Nś1Ś“·ßćŸĄšÉ‘Ŗõ“nWž9˜å®{T\§Ųø®‘Ż:ųcXsó©lō-Ź”«g-®Ńķ OĮ'·^ĒĆæ@¾wą ų䜔õ“nWn ćĪTĻŲų„p¶vˆŠ÷CE•—¾ēŌĀß\=kń“nOx >uĒÓķ |Ÿģ³“~Ņķ*ģC_ß»ųV¦KwėęSŁč›E%DvŒLˆ,]nŽcݬłōGn'rą{×ĆzüŸĄš)l¶ÖOŗ]ŁOśāSlĻ„ī=<-EĄĶ§²Ń?[¦\= Æł”źzlōŸ¼}Ą'š|r¤iż¤Ū•+)}ć®ē«‘Æū£˜Ī}½2åźY‹}ȝ·Ž ų¾€OĪt­Ÿt» »e¾žx'žĶų„¾~Nøł\6śFeŹÕ“O·i>=ŏoąrēM8Ą'š|²ghż¤Ū•g†ž7 īĀcüTR’oyč­å)K8×Ō2Óæjč{š |ŸĀęjż¤Ū••õģÕ+:Ŗ·õõ9Ćå„oQĘ|Ķ«É|ƒ Ćüļ;XĀŸĄšÉ‘©õ“nWVRŌÓßv„tŹKßŌĻö‹|Ķ×6,w§Åę‡|ßŃ– ų¾€OĪyZ?éve%E=„7ėsRłŠÜ••^śćeÉ×\1æ|Ź6?ä{oŸ%š |Ÿģ “~ŅķŹ’”«žzĘ'Äv•~f÷x”ų\Vśś*_éir>!:ŹŪ7ŹZfk8Ł[¦¼C?ćs|š |ŸĀ²“~ŅķŹL#÷õūvˆ‰Š—Ö/­Ā-U^śó”Ÿ>ųäĶģ>/ą“c”ÖOŗ]•Ģ'’µ”'Ÿü§?śévͧē,•?ė>/ą“s‘ÖOŗ]Yé<ėŁ»Éæ–_^złµ(’r“ÖĄf›ÆūOÖĮOtńØ.=¾€Oö%Z?évåHZčŃĻ4źŁRY_•>f ŒńüR^zeņ#?/U·e³ż”¢_¢ŸŁÓKd“'š| [ŖõŚÕ­ĖKäSÆŲ˜ž]£ĀćKĖ.+Ÿü„^åT.v}„ł$żq9Ą§^FŠć/ų¾€OŽeZ?éveæ½d>ÅDwīĀę•Č„.„“+Ÿü„o*łµ(u~•ցšO[t|ņÖĶŸĄšÉ¹\ė'“« ’łäÆõ׏'éĖcļĻ~Ń|’š |‚O}ĮtŸĄšÉž­õ“nWŽ;KęS§čofeSNž·V>łKĻ~‰~åē™»ZØł$ór€O} Ē_š |ŸĀVjż„vuwÉ|ņ×zk哿ōēĆī»ÓŌžĢ|źēĮ!#>/ą“c•ÖOŗ]…ŻėOŖY&»ÆĮ§²ÓŸ»ļ*|z£>/ą“3Gė'Ż®ģyŁ%~ļüµÖYŪ“æōēĆN7£ŸŲįžž%š |Ÿģk“~ŅķŹJ*ķPZƒv.ļŠ3®—·ń£•įņŅ#ņ\Åž$ž*w[yŽ– ä|ŸĀÖjż¤Ū••õäń~÷(æ¹ä¶ó••žķŻżĮÅZ~ ’Ążqį“Õ®bģČąI>/ą“#Wė'Ż®<©ÜõTķ(\üUzĘq7³{d)gńĄē²Ņ·6r jUź­5°ŁŽi>į ģmńĄtŸĄšÉ¹Nė'Ż®L$źõģŪ5*!®ÆæMŖ¼ōOė|­åņ'|šõ““§c¢-a ‚Oą ųdß õ“nWVRŌSzą‘Ż¢żīĖ”—^zāA”œq¤x7XKWŗšĶ§VżÉK¦{܂Oą ų¶Qė'Ż®WŌÓĆĪę‡2//żł°ÓÅ’j“'Ō r÷ ˜®ąų>96iż¤Ū•‰DŻ¢ž†~=Ŗoé†u®dŹKÆōxPæóu€oÖk»Ź³ę‡|ßĪ– ų¾€OĪ<­Ÿt»²’¢ž‘¢{‰g£Š?ߟņ҇Ŗ|Yū™Æ¹£u{zĻüļ_¶„%>/ąSX¤į' ž9ļóÕGŠ5ET{ŒyÉÄĖ#w¼lō^’ōūŃ3ŗ’4ŃBŁÜ– ų¾€OŽW >öŸęxōĒ›…¶nŲņ™Š¦ŖÆišKš’…×Gå„?śi†īLŃ%„~²Ź”¼ŸĄšÉŁĮąųgĘ[{j¦Ū§ł5óh“§²ÓŸy„dĶ'Ģs‚OV{¹™Oą ųdŅr‡vÕų\|Šļש“½LĢטłä}+ærÓ Ęr¹Kó ūąuKܘ®hOą ųÖIĖnWަēā“a¹5%]āmńöä½a÷-1‹s¾üT÷ŸīÖ1ў¤?e=Ą'š|rt6ųž…5?Ÿ:FóG{I'Xs).Ī'’čų•[ńüåÉŪ>ųŌŚKtš |Ÿœ]“~B»ŹöfWń›Ø„ž)e?Ŗ8Ÿāż¢oåWl/ēG×h>ķ²¼nc K|_Ą'ūkZ?éve%mUæa󆢾ć;DłÕqŅ •›¾lŁzT£›žē“ŚQxÄ2ąų>…½®õ“nWVRW={v‹N°¾,Eø¼ōm8ŪR6]Ÿ„¹EóÉm7¢6ōB>/ą“#Fė'Ż®¬¤®zņ…„-œ„ĘÆb——žG,œm‹Ÿ_ŁzT£šęÓś)ōx#XF|_Ą'gW­Ÿt»²’ŗźŁ!6&6.œŻĒ#;—R…«¤ŹK__² jęo¶ÕøGó Į§§ńĄtŸĄšÉ«õ“nW&uėŖgdĻŽŃŽÓ­–pyéCĖ–­G)žäƒOa±Œų¾€Oaݵ~ŅķŹJźŖg÷.}ć£;ųŻųĖK’t\dÆčo3m֒śļ×ö‚»9Ź |¢==ć…|_Ą'G­Ÿt»²’ŗźŻ9ŗcų«±ū†÷Ž‹éhč#\^ś–’mP=Ī6č?²õ( ģ*Ā'9Ą§ĘFŠć/ų¾€OĪ8­Ÿt»ņ ‫žfC5R įņҟqš)ī?‰æŹGŗœąSS/åŸĄšÉž õ“nWVR£ŸŲJz1Ŗ-n=J/å„oåo†Ö pø½–»|/r‡£nLWš |ŸĀzjż¤Ū•‰DŻ ²©ėtĆ»FÅ{sC³’¹Āå„w%TŽ_žć!^ŅŸĄšÉŃKė'Ż®¬¤Øg7YRć·WćįsY雗1_s=:łčg†š#é{š |Ÿœ½µ~ŅķŹJ >ł?sg¤T^śó1÷…–»YŗrŠOõ¬•å0ų¾€Oö¾Z?éve%E={±WrTŸšĪq±=»ūÓŖŹK’¼Ź7čió5×毞¬öK½9‡9Ŗ‹Oą ųÖOė'Ż®<ˆ8€zöģ…É`kŒ’Ćå„oółæ²²¼ō˜7jPöEu’i²®ōS„µ²ŸĄšÉ>Pė'Ż®¬¤žõŌė6üč”—ž|ō3S5ŸŠ’Ÿ"­•5ń |ŸĀµ~ŅķŹJŠzvķŻ):*Īß¶_^śfeĢ×\_ż§`s$}/åUśIó|r$iż¤Ū••ōŁzÖo­{šń q‘ŃŻü²•›žUŁ3ˆ·£)Cęŗ2¾ųT×ZYƒOą ųä¤õ“ęŸ•ķ³¹"»FÅyk°VB./½dżzģ‹O’ö’ ų¾€Oö!Z?éve%E=ygBEN%U^ś¦eĢ×\;u’i ł!ß?j K|_Ą§°”Z?éve%E=żmGH§¼ōõżlæČ×|ĶŃżė/ą“c˜ÖOŗ]YI=ėnL¾•Ž\ąź§|.½šæó#Ck8|ęS/Ė;Ģ+˜ƒOą ųä®õ“nWf¹·š)>²STxd\Tdi…°¼ō­8Ć P?2“V€ĆŅ|’W7š‰~µ.ļĮ'š|²;“~ŅķJāšW=M¾*į~ayéĻG’éGŻB½Ą§'ńĄtŸĄš)l¤ÖOŗ]™HŌ­ag3“„ō:Ęz[Uk„r‡ĖKß Ŗ;;hĘvā ø£JmlvgÆī°^jœå9֙™ƒOą ųä„õ“nWf¹÷蒈q%/ą“}¬ÖOŗ]YIŻõģ“ī/·ŹKß@r *·–k=”+żtƵ²ŸĄš)lœÖOŗ]YIŻõtq(<&¶Ćė„żŽ•—ŽÅ” ¦~äźY‹©>ųōĻh*>/ą“c¼ÖOŗ]YIŻõŒ‹ŠQ¾ī„向Ryé[–)WĻZ Š|¾3hO’ōŒ¦Bąų>9'hż¤Ū••Ō]OæM¾*©ņŅ—Ėą«+3WóénŸī³V–Ćąų>ŁS“~ŅķŹJź®§ß]q•Tyé :«¶–²äšMšOV;Żż^ČĄ'š| ›Øõ“nWVRS={ņ g—™”—¾A™rõ¬ö]³¶§<£©ų¾€OŽIZ?éve%u×Ó„ŸĀ¹WځKyé]ś)Ø”¹zÖā7ݬCīōŒ¦Bąų>9'kż¤Ū••Ō]O½¢¾ō[ؤŹKÆ×å—kƒMšO‹tåĄ§Y+Ėaš |ŸģSµ~ŅķŹJź®§1“`XČ­±|‡ĖK>ĘwĒ5Ÿ°«%ųō—bƒOą ų6Mė'Ż®¬¤ĘųģY5V‘ńæū4”—ž|ģóp½é{wW|zŲZYƒOą ų䘮õ“nWVRk=ć"ū†÷ŠŽ~5:¦Tī[å„oŁ7čy?ņ³–_Ā»u{Āśšé/‘Į'š|r¦jż¤Ū•}A†Ē: žmŁ“žFPĆ`œÄøå„÷R•’gļ\ąäØŹ“_s!隀 x‰€P¹(™ÉL AK@ā5H4$‘|jZÖŻķå[ń†xaX (^a’h (¬ ¬¢F×Kōs5Š’ļ}ė<ĻÓÕgŖgzfr™HW~ź×yO:oÕæ.ŻU3䏼ļSū‰żĀ~*|~āzuK½~Ź\€Ź©æŽGÕ~^ü–šÓ!8Žż“oN£ŁOģöSń3šÖ«ŹQy÷m¤?łóµjČ^ ŪŻšć·ÄżRö‡YŅßÓÅ÷Kķ7@?±_ŲOåĻĀO\ƦŲOC»ŁÉŚõӐć·ÄżR|®vüuŚžōū…żT¹~ĀzU˜1`?Ķ=ſtv’Ϝ%gŸ½č’c 9³Ŗł(ź§!Ēw…N>©ŃÖĢ=ĄÖŁß½,§,·;ö ū©šošÖ«ņĢūiØ»»x}rü–Ųß]€~Š÷w/ ŸŲ/ģ§ā5š׫cģ§”ŻģdķˆÖ§!ĒŪ Cø;+gĮķ£ćŠOń•ż)9Ź>±_ŲOåkį'¬WÅĪūih7öļ§!Ēo‰ūæŁī¼kxüōŅś‰żĀ~Ŗ\?a½ŠC«ĻŞõĘcg®XŗÄ~~xžÉsĻoš~ó‘Ęė¹Ś“mžv.ģ ˆŪ8ߋćL’>xLį÷dŽó-×'ö ū©p=ü„õŠå9ĪŽ/®'ˆĻiüa#ÆöÓ C{pĄĘ×YŸü÷äńĄ~b氟ŠŸƒŸ°^Åqa}8”ėMį'-š{ńŠ~5Ņų|†“OXølČkQuI>`ĒOžšųw¬ŖEōŽżÄ~a?•WĮOXÆ€7Ńrj•ŠĖÕć‘Ęk}Ŗ7ƒ>’®­OŽO½QŁ="vd?±_ŲO•ą'¬Wqh½åL7=Ū{Ååci¼śÉÖ©Åóż~ÅxƒsŃüäżt½| ĒŸ°ęöū…żTų<ü„õŖ&Č`ąåüĻ%Œ4>ī§Įē/A’üĻWYõӞż‹j}b氟Š_€Ÿ°^Å”įų§ś|ßTPs–,õ§15ņ ÕHćS?ō"߃õéŽ(nƈ¹>±_ŲOå›ą'¬Wqhžr.»lYcqiüÉ Ļ)ny•?‹õÉŸš&fļŁOģöS勚Ö«84^N’c¬G¬g¤ńoāü8ßģx'ōÓūģĆ=ģE?MŹĀ{öū…żTü ü„õ*ü2ŌĶ.öېć·Äv·ū»"?ķ/¬1ū‰żĀ~*~Āz‡ęöSć›]~? !~KlwoĆń—ėÓīü 3f?±_ŲO•Æa»Ćz• IßFż4ŌĶ.ī§!Ēo‰ķnÖ'nw\ĘēńMfĢ~b氟 ·`»Ćz• IßźŗķÆd†šFæ%®gNŒ®gr÷į›Ģ˜żÄ~a?’ŪÖ«LHśVĖ9ÄļXψć‡{“9`ććüī™Ļüķ "vd?±_ŲO寇~b’Å”ZĪ!_‰ 54~K\Ļ|3śikŅö¢Ÿ^/¬1ū‰żĀ~ŖÜ ?a½ŠCµœó_øšü%‹ż©OvĪbćoģ;Œ4~fu¶vęŅšlkcF~zQM©ģ'ö ū©š ų ėUŖå\øxŽĀóķ–œ”t’U6Ņųć0Ūaw’µa7ō“’¾7»>½8^Xcöū…żTüOų ėUŖå<× ;’üxņ <Ņųc‡7ۚv}×éVāSnw“kJ`?±_ŲOåŪį'¬Wqؖó¼į]iü‰Ć›mĶbšļś‡Łõé%5„°ŸŲ/ģ§ŹšÖ«8TĻżX6¼SŒ8~x³­YŒĆ°Ż]aŸz?qx=ßdĘģ'ö ū©°~Āz• Ißz\śó‚ō¾„!ߎnļ#Šß÷#œ€~ŠÆó¾6^Xcöū…żT샟°^Å”§Ķœ}Śé§¦OØć­Šžs {X{\2ŸGŸ_ėŠ>ƒó–G¢°1;²ŸŲ/ģ§ņšÖ«8ōäā›f×=ĖW‰¹óęÅSē‘Ę>‡ĮK\ćńų~–rBŁOģöSå.ų ėUšY†uę2Ņų-qŽā~ņė¾ßˆ.üՍŚŁOģöSaü„õŖ6*I2Ė9äg4x]#Ń°0/@?qŁx\Pą™1ū‰żĀ~*Ž ?a½Ź„¤o3ĖiĻŽ?·A+Ukiüqƙiuöé» øī»ōłĪ;²ŸŲ/ģ§ņ=šÖ«84^ĪĘ’¢[Øi¤ńi?ģĻŗ%ō—ėÓ.ü 3f?±_ŲO•{į'¬W™ōmæåü²aņɘõ䓞eCuI®·ķΟĒz>¢ŸŚŖEōŽżÄ~a?±ūĢqv9ż L‹ēqJcć‘ĘĻĘ<ć–}żŌ‹ ģ'Ž³å½Ÿ*öAaÕÅŽ·  “÷¾}ngĖśūģ÷›§Ÿ0ēüōR§ßz/›—m„ó\ŠH\£eø|\._冰¼\nÖ-Ÿo&ök®į-›×¹­–ĖĆå[ucX>.wył_Óū““~Zņl²lђį/œÆOyėūr$ćņm+Ņõ‘łćņpłŹŸĖĒåę¼N?nŽ-Ł"»Ś=g˜A€5%~»Źf'Ž«S¶Ü;.—‡Ė·ą ałøÜœć‰3g} «×mX›]ZŻÖ\.¶—ĖĒåįņo ĖĒåfy.߅į±Ć_8«ĖĒ1ē±%Ē\>.—oŹĆņq¹9O.ߌiē²9ŚÅ±es°HĆc_®må.—Æš„°|\n6:włŅ„d‰ĘĒĢĒG6^’łćņpł6błøÜ¬1Ś?„ż_ś+9‹ķ«khģĖ•wŒ×Ppƒ…ø|\.ùÜdž_™bģ{’ķŅķ/ļ·Uœ×–ūņłß«]uā%éžāOöŽ·‰Ās,đśœęžĒ59±1C8?ÖĻł-ĄüŲŽźüŅ{.˜Cm‘x~¬Ÿó«`~lGu~§ åė-Ķ4žėēüXķØĪ#‹%gē翃­<Ī_°pĻß“§ŽOóYƶ­uÜQo~[śóVņ»„ņē–§Ė»Łāӛ™Ł¦OĻśzWņ~ŗo§“ܟ­Œ÷SłĄ™{{fOą‡ŗĀųɈkKĒ“_„æ³Żš„ÅVŗŽ“RG’¾’¤5ik³<“ļœ”Ęī¾āšņŁėæŌNŚ>•sāę5ł’ł²ł8¼’3/ĢóR|0䅳 m_Śt¶Æćr“$Ę„1)’Č>|&ÕŁ)<1štĖKŅy©õmK261ļ¶±÷nõyż ¬ćߗ“—PĖN '=™fp ·ćdę…y`^ ß ya¾B-ɍwU›ė|óZēl^ĪåJY-˜¾c^źLĻĶĖ‚–'ӾުŹÅźµŒIöEdćµęĪj«ȼ0ĢK唐ę+4äæĢ=>g„qĢįÓz’?HŸ;“įa««gFĀq®Ē.óźÄ_ƒ¾­ŗĒN¶ "o{ µ“ĖcÕ:ų|·V ę…y`^8?ę+š”ę­7ČcIby)”ņJėóĖķåĒ}'YßųĄ<š~ēģōPŠ’‡ż‹ļ¹c5žÜvł˜é؏%óĘĢ‹Oćü³å¼¦8;m4¼÷¼,°†šxč;ö>«!7q?Ćüķ„ĘnM<ŽŖæŒ~v²y³ĻæhÉ`=ßĘügͽpžäöTóyv[ė1  ķ̧ž\9åąóęĻ[8÷ą„ē/ńēį/;ųÄ -_>›Śsšœ…öČ²ƒż¶ūųÜ%ÆZlG½3ø9nö@³žõ=pĮāå —/š?ļ ³ÜSĻśīhv@³¶iųńgX²7…¤Šāgöķ¼čaŸłńEÆO»aezœ²ÉŽūńM\\>_p’ātz¹Ƴ1.ŽŲB4ü?o“OĘßøÓ8bņÖTž÷Čż{ĪĀŻ„õq\ž/œ|'ŒUŽlÜėWiܦ=ƘĒˌćńr1/¾ō±žP ÆĒÜq<·ZęņLņĻ¼Ābķz ĒżĪcvµė1wŚ;}ÕÖSjź yM;Y’ń‚sv(|öŽŠŸĻmśżbćl™į¼_šĒóÓü7…q£u0/ĢóĀxęĖ.•ō%É{»Ćēųæwī]S>ņ1ĖgĒģ'žĒ8ūyLų;~Žbē©ļ¾¢čćׯ·Ÿ”Oī2š”µŻ®Ē,'ńoÓĆäü’½~ļm_ćĮk²Ó( qĶÅĻ„¼ØĄz³łXšōŠó²ĮŚĄķķ!{Ÿ=©×¼ńõ&ŒņĻM1éņŃoōżV¾1xŽŪŸM„ĻV`|+>ēāžŅÖ æīš°m~ż“­ķ-¤s*Ų÷-ö»Żį·oć÷@?¼Vy4ßo«ąµBä·āøåĒ?…ķ~+=PĖl|ńDZ"¤~KްXó›Ęńõf÷Ū'ZöN_u*Ģ|ĢžŖw½ŁkkżĒuŃ9;”? æķæaœ-3œ÷…æ†ķgć߆¾•¬±ĢóĀ60_?n}yüZNK’µĘ‡¦ģ÷ųo©|ųr%‡‚é·Œ¦£F!/WŁśč×i’dW»Žü‰–Æ$’dÆĮęÅ×ć¼ėg^Sę0!­9[kåSČĖīČ ĘŁ2Ćy_~&äcA²,Ż’4Z‡oē‡X°½­·@t߀UXĒķĆ‚{]ģĒQĪwžs²ĢFuö‹–.ŚbMkūAZŸ÷ć e}{Y'z?~É~\ėÆĀŅĒł|¼Ü“WUyO+äÓ}šļÖ }ćŅüł3+|ė&ļńóÓ©VŹ{¼—/æżb=Ļ9Ŗ[ėCŹo¦’$šž`8¾ōgieē’"³“/ē÷ātz–½t–Ć7…ÕņmŃōp¹:ŻÖ²ńc"vŪe§"ńĪļń®?'āēF<>ā ļńī?/ā="öŒf—oψ÷Šxbē"Ž;ā}"~AÄ/ŒųEæ8āÉæ$ā}#Ž/āż#~iÄ/‹ųåO‰ų€ˆŒųæ2āWE|PÄG|H 7·ęöQ»żŽ®ķCėē#į{ń†ˆńSZŅż‰āwųæ,ā×EÜń"žńY/Šøńe4āĻF¼*āÆF|{Ä÷DüPÄߋų§’&āM·¶¦ż­ż-ņē6N×71ö·bģoÅŲߊ±æc+ĘžVŒż­ū[1ö·bģoÅŲߊ±æc+†OÄŲߊ±æc+ĘžVŒż­ū[1ö·bģoÅŲߊ±æc+ĘžVŒż­ū[1ö·bģoÅš‰ū[1ö·bģoÅŲߊ±æc+ĘžVŒż­ū[1ö·bģoÅŲߊ±æc+ĘžVŒż­ųŠhżuÄS#>,āĆ#~MÄGD<-ā×FüŗˆŒų؈ŽxzÄwFÜńŒˆ»#ī‰xf Ėē8žć|ĮŁĻł 8_Štœ_ˆWžˆļ ēāußń}ßńµ\>žŒšżĻäKģßäK1|)†/Åš„¾ƗbųR _ŠįK1|)†/Åš„¾ƗbųR _ŠįK1|)†/Åš„¾ƗbųR _ŠįK1|)†/Åš„¾ƗbųR _ŠįK1|)†/Åš„¾ƗbųR _ŠįK1|)†/Åš„¾ƗbųR _ŠįK1|)†/Åš„¾ƗbųR _ŠįK1|)†/Åš„¾ƗbųR _ŠįK1|)†/Åš„¾'ĮŸ8^–_Äš‹~Ć/bųE æˆį1ü"†_Äš‹~Ć/bųE æˆį1ü"†_Äš‹~Ć/bųE æˆį1ü"†_Äš‹~Ć/bųE æˆį1ü"†_Äš‹~Ć/bųE æˆį1ü"†_Äš‹~Ć/bųE æˆį1ü"†_Äš‹~Ć/bųE æˆį1ü"†_Äš‹~Ć/bųE æˆį1ü"†_Äš‹~Ć/bųE æąü[~Ć/bųE æˆį1ü"†_Äš‹~Ć/bųE æˆį1ü"†_Äš‹~Ć/bųE æˆį1ü"†_Äš‹~Ć/bųE æˆį1ü"†_Äš‹~Ć/bųE æˆį1ü"†_Äš‹~Ć/bųE æˆį1ü"†_Äš‹~Ć/bųE æˆį1ü"†_Äš‹~Ć/bųE æˆį1ü"†_Äš‹~Ć/bųE æˆį1ü‚ėyņ‹~Ć/bųE æˆį1ü"†_Äš‹~Ć/bųE æˆį1ü"†_Äš‹~Ć/bųE æˆį1ü"†_Äš‹~Ć/bųE æˆį1ü"†_Äš‹~Ć/bųE æˆį1ü"†_Äš‹~Ć/bųE æˆį1ü"†_Äš‹~Ć/bųE æˆį1ü"†_Äš‹~Ć/bųE æˆį1ü"†_Äš‹~Ć/bųE æˆį|? æˆį1ü"†_Äš‹~Ć/bųE æˆį1ü"†_Äš‹~Ć/bųE æˆį1ü"†_Äš‹~Ć/bųE æˆį1ü"†_Äš‹~Ć/bųE æˆį1ü"†_Äš‹~Ć/bųE æˆį1ü"†_Äš‹~Ć/bųE æˆį1ü"†_Äš‹~Ć/bųE æˆį1ü"†_Äš‹~Ć/bųE æˆį1ü"†_Äš‹~Į÷ņ‹~Ć/bųE æˆį1ü"†_Äš‹~Ć/bųE æˆį1ü"†_Äš‹~Ć/bųE æˆį1ü"†_Äš‹~Ć/bųE æˆį1ü"†_Äš‹~Ć/bųE æˆį1ü"†_Äš‹~Ć/bųE æˆį1ü"†_Äš‹~Ć/bųE æˆį1ü"†_Äš‹~Ć/bųE æˆį1ü"†_Äš‹~Ć/bųE æˆįü~A~Ć/bųE æˆį1ü"†_Äš‹~Ć/bųE æˆį1ü"†_Äš‹~Ć/bųE æˆį1ü"†_Äš‹~Ć/bųE æˆį1ü"†_Äš‹~Ć/bųE æˆį1ü"†_Äš‹~Ć/bųE æˆį1ü"†_Äš‹~Ć/bųE æˆį1ü"†_Äš‹~Ć/bųE æˆį1ü"†_Äš‹~Ć/bųE æˆį1ü‚ßCÉ/bųE æˆį1ü"†_Äš‹~Ć/bųE æˆį1ü"†_Äš‹~Ć/bųE æˆį1ü"†_Äš‹~Ć/bųE æˆį1ü"†_Äš‹~Ć/bųE æˆį1ü"†_Äš‹~Ć/bųE æˆį1ü"†_Äš‹~Ć/bųE æˆį1ü"†_Äš‹~Ć/bųE æˆį1ü"†_Äš‹~Ć/bųE æˆį1ü"†_šūJłE æˆį1ü"†_Äš‹~Ć/bųE æˆį1ü"†_Äš‹~Ć/bųE æˆį1ü"†_Äš‹~Ć/bųE æˆį1ü"†_Äš‹~Ć/bųE æˆį1ü"†_Äš‹~Ć/bųE æˆį1ü"†_Äš‹~Ć/bųE æˆį1ü"†_Äš‹~Ć/bųE æˆį1ü"†_Äš‹~Ć/bųE æˆį1ü"†_Äš ~Æ-æˆį1ü"†_Äš‹~Ć/bųE æˆį1ü"†_Äš‹~Ć/bųE æˆį1ü"†_Äš‹~Ć/bųE æˆį1ü"†_Äš‹~Ć/bųE æˆį1ü"†_Äš‹~Ć/bųE æˆį1ü"†_Äš‹~Ć/bųE æˆį1ü"†_Äš‹~Ć/bųE æˆį1ü"†_Äš‹~Ć/bųE æˆį1ü"†_Äš‹~Įżņ‹~Ć/bųE æˆį1ü"†_Äš‹~Ć/bųE æˆį1ü"†_Äš‹~Ć/bųE æˆį1ü"†_Äš‹~Ć/bųE æˆį1ü"†_Äš‹~Ć/bųE æˆį1ü"†_Äš‹~Ć/bųE æˆį1ü"†_Äš‹~Ć/bųE æˆį1ü"†_Äš‹~Ć/bųE æˆį1ü"†_Äš‹~Ć/bųE æˆįÜO&æˆį1ü"†_Äš‹~Ć/bųE æˆį1ü"†_Äš‹~Ć/bųE æˆį1ü"†_Äš‹~Ć/bųE æˆį1ü"†_Äš‹~Ć/bųE æˆį1ü"†_Äš‹~Ć/bųE æˆį1ü"†_Äš‹~Ć/bųE æˆį1ü"†_Äš‹~Ć/bųE æˆį1ü"†_Äš‹~Ć/bųE æˆį1ü"†_Äš‹~Įż©ņ‹~Ć/bųE æˆį1ü"†_Äš‹~Ć/bųE æˆį1ü"†_Äš‹~Ć/bųE æˆį1ü"†_Äš‹~Ć/bųE æˆį1ü"†_Äš‹~Ć/bųE æˆį1ü"†_Äš‹~Ć/bųE æˆį1ü"†_Äš‹~Ć/bųE æˆį1ü"†_Äš‹~Ć/bųE æˆį1ü"†_Äš‹~Ć/bųE æˆįÜļ.æˆį1ü"†_Äš‹~Ć/bųE æˆį1ü"†_Äš‹~Ć/bųE æˆį1ü"†_Äš‹~Ć/bųE æˆį1ü"†_Äš‹~Ć/bųE æˆį1ü"†_Äš‹~Ć/bųE æˆį1ü"†_Äš‹~Ć/bųE æˆį1ü"†_Äš‹~Ć/bųE æˆį1ü"†_Äš‹~Ć/bųE æˆį1ü"†_Äš‹~Įó3ä1ü"†_Äš‹~Ć/bųE æˆį1ü"†_Äš‹~Ć/bųE æˆį1ü"†_Äš‹~Ć/bųE æˆį1ü"†_Äš‹~Ć/bųE æˆį1ü"†_Äš‹~Ć/bųE æˆį1ü"†_Äš‹~Ć/bųE æˆį1ü"†_Äš‹~Ć/bųE æˆį1ü"†_Äš‹~Ć/bųE æˆį1ü"†_Äš‹~Ć/xü"†_Äš‹~Ć/bųE æˆį1ü"†_Äš‹~Ć/bųE æˆį1ü"†_Äš‹~Ć/bųE æˆį1ü"†_Äš‹~Ć/bųE æˆį1ü"†_Äš‹~Ć/bųE æˆį1ü"†_Äš‹~Ć/bųE æˆį1ü"†_Äš‹~Ć/bųE æˆį1ü"†_Äš‹~Ć/bųE æˆį1ü"†_Äš‹~Ć/bųĻ÷’_Äš‹~Ć/bųE æˆį1ü"†_Äš‹~Ć/bųE æˆį1ü"†_Äš‹~Ć/bųE æˆį1ü"†_Äš‹~Ć/bųE æˆį1ü"†_Äš‹~Ć/bųE æˆį1ü"†_Äš‹~Ć/bųE æˆį1ü"†_Äš‹~Ć/bųE æˆį1ü"†_Äš‹~Ć/bųE æˆį1ü"†_Äš‹~Ć/bųE æ¬ Ļė“_Äš‹~Ć/bųE æˆį1ü"†_Äš‹~Ć/bųE æˆį1ü"†_Äš‹~Ć/bųE æˆį1ü"†_Äš‹~Ć/bųE æˆį1ü"†_Äš‹~Ć/bųE æˆį1ü"†_Äš‹~Ć/bųE æˆį1ü"†_Äš‹~Ć/bųE æˆį1ü"†_Äš‹~Ć/bųE æˆį1ü"†_Äš‹~Ć/bųE æ|5ņ‹~Ć/bųE æˆį1ü"†_Äš‹~Ć/bųE æˆį1ü"†_Äš‹~Ć/bųE æˆį1ü"†_Äš‹~Ć/bųE æˆį1ü"†_Äš‹~Ć/bųE æˆį1ü"†_Äš‹~Ć/bųE æˆį1ü"†_Äš‹~Ć/bųE æˆį1ü"†_Äš‹~Ć/bųE æˆį1ü"†_Äš‹~Ć/bųE æˆį—Ū#æˆį1ü"†_Äš‹~Ć/bųE æˆį1ü"†_Äš‹~Ć/bųE æˆį1ü"†_Äš‹~Ć/bųE æˆį1ü"†_Äš‹~Ć/bųE æˆį1ü"†_Äš‹~Ć/bųE æˆį1ü"†_Äš‹~Ć/bųE æˆį1ü"†_Äš‹~Ć/bųE æˆį1ü"†_Äš‹~Ć/bųE æˆį1ü"†_Äš‹~¹'ņ‹~Ć/bųE æˆį1ü"†_Äš‹~Ć/bųE æˆį1ü"†_Äš‹~Ć/bųE æˆį1ü"†_Äš‹~Ć/bųE æˆį1ü"†_Äš‹~Ć/bųE æˆį1ü"†_Äš‹~Ć/bųE æˆį1ü"†_Äš‹~Ć/bųE æˆį1ü"†_Äš‹~Ć/bųE æˆį1ü"†_Äš‹~Ć/bųE æˆįü½_ūŅæ‡ †_Äš‹~Ć/bųE æˆį1ü"†_Äš‹~Ć/bųE æˆį1ü"†_Äš‹~Ć/bųE æˆį1ü"†_Äš‹~Ć/bųE æˆį1ü"†_Äš‹~Ć/bųE æˆį1ü"†_Äš‹~Ć/bųE æˆį1ü"†_Äš‹~Ć/bųE æˆį1ü"†_Äš‹~Ć/bųE æˆį1ü"†_Äš‹~Ć/bųå{Ńń‹~Ć/bųE æˆį1ü"†_Äš‹~Ć/bųE æˆį1ü"†_Äš‹~Ć/bųE æˆį1ü"†_Äš‹~Ć/bųE æˆį1ü"†_Äš‹~Ć/bųE æˆį1ü"†_Äš‹~Ć/bųE æˆį1ü"†_Äš‹~Ć/bųE æˆį1ü"†_Äš‹~Ć/bųE æˆį1ü"†_Äš‹~Ć/bųE æˆį—ŸF~Ć/bųE æˆį1ü"†_Äš‹~Ć/bųE æˆį1ü"†_Äš‹~Ć/bųE æˆį1ü"†_Äš‹~Ć/bųE æˆį1ü"†_Äš‹~Ć/bųE æˆį1ü"†_Äš‹~Ć/bųE æˆį1ü"†_Äš‹~Ć/bųE æˆį1ü"†_Äš‹~Ć/bųE æˆį1ü"†_Äš‹~Ć/bųE æˆį1üņ›Č/bųE æˆį1ü"†_Äš‹~Ć/bųE æˆį1ü"†_Äš‹~Ć/bųE æˆį1ü"†_Äš‹~Ć/bųE æˆį1ü"†_Äš‹~Ć/bųE æˆį1ü"†_Äš‹~Ć/bųE æˆį1ü"†_Äš‹~Ć/bųE æˆį1ü"†_Äš‹~Ć/bųE æˆį1ü"†_Äš‹~Ć/bųE æˆį1ü"†_6E~Ć/bųE æˆį1ü"†_Äš‹~Ć/bųE æˆį1ü"†_Äš‹~Ć/bųE æˆį1ü"†_Äš‹~Ć/bųE æˆį1ü"†_Äš‹~Ć/bųE æˆį1ü"†_Äš‹~Ć/bųE æˆį1ü"†_Äš‹~Ć/bųE æˆį1ü"†_Äš‹~Ć/bųE æˆį1ü"†_Äš‹~Ć/bųE æˆį1ü¢æŪ®ļŠį1ü"†_Äš‹~Ć/bųE æˆį1ü"†_Äš‹~Ć/bųE æˆį1ü"†_Äš‹~Ć/bųE æˆį1ü"†_Äš‹~Ć/bųE æˆį1ü"†_Äš‹~Ć/bųE æˆį1ü"†_Äš‹~Ć/bųE æˆį1ü"†_Äš‹~Ć/bųE æˆį1ü"†_Äš‹~Ć/bųE æˆį1ü"†_Äš‹~Įß»õµ/żžH æˆį1ü"†_Äš‹~Ć/bųE æˆį1ü"†_Äš‹~Ć/bųE æˆį1ü"†_Äš‹~Ć/bųEŒüąļ+?bäGŒüˆ‘1ņ#F~Äȏł#?bäGŒüˆ‘1ņ#F~Äȏł#?bäGŒüˆ‘1ņ#F~Äȏł#?bų_ ’‹į1ü/†’ÅČ7ž¾“ņ-F¾ÅČ·ł#ßbä[Œ|‹‘o1ņ-F¾ÅČ·ł#ßbä[Œ|‹‘o1ņ-F¾ÅČ·ł#ßbä[Œ|‹‘o1ņ-F¾ÅČ·ł#ßbä[ģ®ž=ń'“#Ęž^å÷¦ļńžæ4bģļUö÷bģļÅŲߋ±æc/Ęž^Œż½ū{1ö÷bģļÅŲߋ±æc/Ęž^Œż½ū{1ö÷bģļÅŲߋ±æc/Ęž^Œż½ū{qG”ŸĪˆ±æWłŃōīˆ{"žń1q1āć">>ā×G|BÄ'Fü†ˆOŠųäˆO‰ųԈgE|ZħGüƈψxvÄoŠųĶæ%ā·Fü¶ˆßńœˆĻŒūƒ§ŗ/æ2I“?c Ęž@Œżū1öbģÄŲˆ±?c Ęž@Œżū1öbģÄŲˆ±?c Ęž@Œżū1öbģÄŲˆ±?c Ęž@Œżū1öbģÄŲˆ±?c Ęž@Œżū1öbģÄŲˆ±?c Ęž@Œżū1öbģÄŲˆ±?c Ęž@Œżū1öbģÄŲˆ±?c Ęž@Œżū1öbģÄŲˆ±?c Ęž@Œżū1öbģÄŲˆ±?c Ęž@Œżū1öbģÄŲˆ±?c Ęž@Œżū1öbģÄŲˆ±?c Ęž@Œżū1öbģÄŲˆ±?Xyōʚżū1öbģÄŲˆ±?c Ęž@Œżķ»ė¢Śż•ķ£}b“OŒö‰Ń>1Ś'FūÄhŸķ[µOŒö‰Ń>1Ś'FūÄhŸķ£}b“OŒöݵOŒö‰Ń>1Ś'FūÄhŸķ£}b“OŒöݵOŒö‰Ń>1Ś'FūÄhŸķ£}b“OŒöݵOŒö‰Ń>1Ś'FūÄhŸķ£}b“OŒö=µOŒö‰Ń>1Ś'FūÄhŸķ£}b“OŚW>žŒšķ·Ź”}Uķ«rh_•CūŖŚW劾*‡öU9“ÆŹįx³ŹhļŪ/®ńaYŒöŠŃ^1Ś+F{ÅhÆķ£½b“WŒöŠĆńqµ}įųøŹįųøŹįųøŹįųøŹįųøŹįųøŹįųøŹįųøŹįų˜l—"ģü£%)|ōŽ“?ÅWF¼1œhśī=éś2.·ė˜¾sÄ*’žÓņā1!ž\~SČ'™ķńŽLƗÄó/Gõ%µõ&Fü—ØżgDóūר¾ßDåwĶÖgĖ[Ó_ĘńņÅż‡öötÖÕk Y¾qeŚ›ģ½/_ńó+7„q¹²8¾ź¾0ŽtoOĮē¢įå­I2ŪčSmI2fĢ”Öž¶“Ē’Ķ›“dĮž|Š ½cÓś æŪ)—’;Œ+? ćU-ĖĀü0¾õłæJćVL cowÉŖeܟm~i»æāÕÓ÷īžĄu…ń·OėżļĖćĆ$’oĆ·,¶Ņ„qRźHŅW’“&mmķIҾs2„uļōåƒģÆwåõš|‹FśÕZłÜ½”?Ÿ–n/ŒsŖŅGÅÖŠ’SŚĆøŃ`ꄈ<0/…Ōę¹Ńś¶W9ωæĪ·ųzĮķI°w˜źė‡āõ!/äķ=f^˜ę…Ūóµ½ŪŁčüĪĖNIŲˆڲy)`{it>[»óĀ<0/œ/ó†·O¾#IžŃÜó±ÕIēæŪxša $r`Īś›—-O¦}"ž śC-c’}QEćµ<Ļ­5•ya˜—ņ/B^˜Æ0’’‚·Š3ņyąV~(ż±y’źÅ6Ę(Ü/ęŹņūÅll»|ĢÉm+ķU[2˜ŸĘłgĖyMqvŚhxļyY` į}ß±÷®!ŽČūy\ĄüŁn  w%ŗæ58ڜ>’bĮę‡z¾mŃ>’Ys/œ?¹kŁäćĪ›{īüdį¢ł ÖŚh±ƒĻ›?oį܃—žæäóĻ^¾ģą/X“|aųljĻĮsž½dń²ƒē.]ŗģąw½cīŁļ<{ł¢ƒ“sΟælĮĮĪ”Y®ŁĶų{īšįŠCZŗųÜÄ_Ļ®ažE“Y²hŽ|æōY80’éMŹĻĀåߎ‹ģlCÉŽŒK --vyˆOpąqgń—įųŸĒ…’˜åŅqēæŲq¦¼®1?ā0µŽ’Į‘ß$/pęk×58īw>°«=§ą£m{§Æz5Ö~īõūsņžSą5ł‘“ל8¼’3/ĢóRł5Ο‘ÆŠöw'ÉÅk«Ėaܹsz>šAūšjLążÕŸó|€ĢéÕzŅw9ēĻW'“ś+*9.³ƒÖ¼ėM-i-ÕūįÆNjļ» Źķ2‰ya˜—ņopž\³ŻŒ·¼ü\y™3o|÷{ļz_ŹŁ¼¤ō¶4Ģóņ.ažu—šėMW'--“ū®éüœņvŠ>­^ךšÆmū•`^˜ę„ųdČ ó•¶°ōÆŻIßåéöA޼rĮŗg6?q×$[ʱ¤“…幋żLŒ¦c2G9y9°åĄ¶Iöb‘śćwŲ6åó¼äm/^“’Ūæ0®_ßöžĀ¼0Ģ ŪÅ|‘Góx”å¦^^Ž=/"ščŪd ļĻ©ņ¼”mM"ßcļ­}å›>įėoĶŠż»sōŁĖ'v}⯟<ꪮҚ$ńWŠ-'®öwžw@Ē廽rMłO7Lw~ż7::ŽüŠī„?ݐN’Ā~cŽžjå‰éß+œ•ÖłĆM»Oæå±»;>ņŖ5}V_Ēw-ž8‹9׏yü‡­.æÉbœ½Ž÷Y]’ųCĪ8²ó¬Ė¦÷ßżįN’å)'tÜ÷‰k®{ƍ«­ģźq_{Ē ækéųōnœnm˜Ž·ĻuGß÷éŸM’ź»ĻZcmXó›ĪŸÜńĻĻ|Ŗćż/æ­ÓŚŠyźńć;žćeūv<óݟ•”Öß²ėķÓ×,æcߎż~Žnķķ9üO.¼ó×Oœ×õŸ_øåĪ?=rußOœßõ?³ܹrŸ/użtJogė7ŻŃvČ>æœævõŒŽW­iIk&Lµ–ŪˇĆlœ~ētXąĪÆŚ˜ŸŁŪ’óĶaZ©ć¹’ņ—.;Xŗ%IzæfuŲ«óš]ŅĻŅ27ļņÓĖ;Æ’Ģ‡ūŖłč{Åщ|„zž}’_qŪG:愚³G÷³ēՔ»véŪśąnŗć„ķß\}]ń»]Æ’ŁĘ£:w½āصĒL=ņŚŚwĶ©c:žméŪ:Yż­¾–čXȏ¼Ÿj?¼Ć^ŚFĀVźøjó+:^ņõWt¬ųŚÆŅu7Ół<=>ĻĖ›ˆēēĶŽž›ēĒśæ°cM>7oĀ„5m|nžwwqƚܼŹ_p¼õóšü¼Źļq\üē0ęü9ž‚ēåŻŗÓĻŅēÄy»KÖaŒćńBł9ń}’€uē£}Kj™3©3^õd’O/ͰX;å8]ēĆz_}nŽ;‹ō׹C¶æŽ•SÜkń']rū‹k-Ž€ēęM|mŲŽ0Ī©jH­Ās¦ŹĻśó¦·ĆŽŠżÅźohėq½ć8Æeפz|×Zøy9ył[x®ań;cŅļyŠG^¤ē‚f[±ąŽåét޳Óüż”ēāy†}CĻĖė/Ī’)«Ė»ÆüŻŠÆŪ‡Ź’¹¶¦]o8©g꜓O›3÷ģå /œ?gń’yóēœ;ńüóžłÄń6ĆAf1čäĻŪõ-_—øµŌÖÜ+ŽOģöSåä ł+ægš~:{É¢%¾ž42äõÓP⻇0ÆzķyżäÓ÷°ūÉדx`?±_ŲO…ĒB?±’Š+ļ'ūņpéüó—/œæ,žKĪ맔ğ<„yõŸ{ų䉿…õ龨cččlū‰ż¢~:ō~jO^–NĪŪM±ŸŲ/ģ'ÖWązui~?½ė‚¹‹.æ˜Å³Ÿ†ņüóĻYržysŸ=|G?݉V·ć8–žŹ.Œ÷SÅ>ą~ōö>Ś\ÓāųĪū'ŽóéĒĶ9ż„9‹.[>ēū•Äœ%,_zĮņt—­¶”÷ÖĢĶyój(xBōYģķõåóć,Wń8«€ćg RŻvŸģĒæžŖwœ~aZ½īļ ĪömĒYŪ}AŠę…y`^Ų>ęĖ2·6IﶇzwŁQW÷ž>ŻõŃÕgö|§oĀŗėžŌŚ³Äś¤dÆŻ-Ē拍}ąõeēźt?ń×_ŽńׯO¹õč}^gxVmjŪLJvõqIėÄ<±„Ŗõæēd•EŌĖ‹×ō•5g0)ÆĀńļæ¼+ݾ 3Āqp¶ĢpŽWpÜ[^7ōćßĖmÅįyē÷mę¾: žījĀp9 b ™ēõzsžkßåžtéM¶~d‡RĒļžēSŻ›J×Ü5ńįyĄ/ēåw/9oé’e —/9’ vD~Śłó‡Æńlś½÷ķg}Źv|ĻŽg·w°];=?|2óŖŻÉGæsÖŁvrĀBĆsū-’5œÆrū->“w]!zß=a–üŽ{ąœŠķy’kčyü³ģ)śž|ų˜m㼓w]!ŌR½®ŠX­ƒĻwk•`^˜ę„ņpXO™Æ­5’-UÆēÄ_õ¼öwµĻćßRóŽõ0/ĢóRž6ü‘·Żl†Œ°Nß^ü5p^jCF8Ė­μ0Ģ gŹ|į-’õw$g^fū‰ĘŸĒ? käŗēßč˜«——YŃ÷©17:ŸmUĪó’>Ē|ū_ŸŠgĢ_zÅ~B§žĒŸmļ¼ 4ŸĒŸéŒęŪf4{ ŁĶhö@³š=Šģf4{ ŁĶhö@³š=Šģf4{`X=ąßÉeÆ;«’fP³š=Šģf4{ ŁĶhö@³š=Šģf4{ ŁĶhö@³š=š¬é”]Oä³&Ų=yw dī“śnų=2[x40£Óqóyü5ݱ5æOf˜—ŹcųŻ8ņŚŠ|’ÖĢE¶nę…y`^Źß ya¾BLóyüپۚļ™ęy)>ņĀ|…64ŸĒæ5s‘­›ya˜–a¾Rn>ŸŻ²ÕĒž提÷U|ĒŽūBĻā}ŸEģg˜?»5+ ė·ŠóųQĻ·­VŸóyü”›’7{ Ł£³ų<öiéćųGg·j«šĻćO’RKz3ģVķčfåy=ąĻįē%{3Šóų ? Ē’<ī¬ü(0ćÓqß»Æ×>’pF-‡‰u’ßĻ ™ä%ų~Žū=’Пǿ‹?µ°”ē^`uūߢŖ÷<žPKõ9ÕZwQ¶śž0ĢKłĒ8F¾BCžkWš€uÕF=·»%łāZēģsß߂K[ŸEA>’…Ļ}ēōj=é;ÖGōwÆNŽjĻ}kž„²špĻĖóŚ­»·;ļłā^Söļ ī(Ļćg˜—ā’ąü¹f»™ÜžĻŗdēMī¾½ū—żņņŖ:yažĢļ琗šēR^|³Å_5)ČęÅļ‡ļĄ}÷Ł‚”–ģóų©5[ƶ}Ļķ…y`^ ? ya¾B«öėN&1³½ćy”×Z›Ńt>/é0·2§c2G9ŪĖĶöW&®mč/M¬·G÷X½ēxMŁēńę¬Gߘya˜¶”ł"Öńę°xŽŹ­ŃÓ`7°!nć.”¢ēńƒļ±vxkŗū_k†ÓN_ØĻ~żÓo{’āŪ«ĻEł<~łļ3Ļ ’ńģuŹŹsÆ©4Żß'Ém?øcé>/YsŹŹ_ōłsĒ<ŽcŽó•żģōIņ[«Ėźėx/øZGųŽę’=ƙdĻR·ųNo’į':żŪžkXĪłæ’¶Ē’pī-ֆ[āö’tżźÕkŸXżėüøÓėøhŻ£Ó—Ūėé®5 üśĘė®:fĶõWÓńÉ+§Z{^öłõדsՕ'Lļ½lĀ]/}ōź¾w¬łpßēę>}Ē×¾³ėŒ ōv®ūŃõŸśä¤ĪēŻ½ųöI_8bĶPūcŅ›¦tÜ’ƒIkŽēwgyŽøĖGÖ“ßSYżŽŽ)]VGūįŁ6¾sē]l}Øśl՚õkśīY‡ż;žĒ?ēu¼üŠKóöxbķźĖzž½ėóZ¦æļćoæņ=ŅÖ»Ž īwō­Ÿ>Øóƒ/»»ßóųŸ~:IžųąK§?½|üźåk÷[3ń™£°N–:nH–v¼e—•É’Mެma•Ü›½¶Aņ:cü<~^äq;żj![õyüÕnwŽ~ł!‰?X氃=ÖĀßõ.ÜsQś<Ąßby ÷.¬ cūøf˜uź±sĻ›?ł„%ē.<;9čC­™ŚxæÅĆŖµ‹Óv”’_xĪį­Æx"pį +Óé•/…q?’Ļ’FS#ƒÆæ“­ ē’;{ļķ[öŲŪ܁q,Ēø"āX_5ųŪ3‡ļē'ۘå7q¬ĻĖś°rlmĖ1nć]”ßX_ˆņøšŽķd9ĘŻŠ8ÖĒø$ya»?“q,Ēø2āXćVŽ­c9ĘĶFėc\’\—®œĖ1īŹ_…ü³>ĘMSĒrŒ« ŽõUćĀ;Īå· q¬q+ĒÖĪå7ė+ėc\q§Ś8–cÜlı¾j\m²ćø°>ĘĶl©Ė1ŽåXyfKu~SģCnæ·÷ž h'Ės}‹×WļWgyĘOüuķvĶõ§^<Ė3¾ˆxÖĖõˆķ`»8–gü ij^Ƴq<Ė3~āY/×Ēzń,ĻųĒĻz¹^²žxž,ĻųĀ’†žc½Ünćõ”ĖĻņŒŸ†xÖĖł×‹gyĘ/@<ėe»WEžäüYžńW"žõ2®ŽüYžńij^ę/ŽŽ8–gü&ij^ö_½x–gü”ß„žg½ģæzń,Ļųوg½ÜާDŪŪĻņŒ/#žõrłėų<ćoE<ėe»ŁŽxżcyĘoD<ėežc°ż,Ļų‰Ų³^Ī·^<Ė3¾ˆxÖĖķ®\§’Xžń<Ž`½ģ·zń,Ļxöėe»óā{­0Wų÷…*8~a=l?żG1Æ,ēcߗæČŽüH`ģŲŅŲ½S#'ÉęĶÕ bĻ=2ż;&—7†ėIÅ_…q¶¾¼÷ž·’‰žq¼ž‘ßy}OØƒĻż}2ā¼9T?ć±É¤ō#µæ/”pģēĖįœ9ü}!æ¾īĖģÆĘ†lÅ”–źõõĘkkŚ6̼0Ģ ēĪ|„üäy3­ļś8-ŁšæČKҹÄÖ”Ž Ó.+䟳Ąė…‹£éa*’yĮłN›Ó¼“Z-Õµeė§µ‡õ8.žģŸ„¶ø–mĒž—N›··ūķ=ūu V ‹ėńz{m*}A”o ē=ō ÷›ń~ˆū5Īą; āöv­5°½ż ;B -­~ėfē#’æ÷ƒqį×ųžą‡ęĘq=­äĘߣŚ”>_Ėl|ńŃŃ©?J7Y¬’}2ŒSwÄž8£eļÄ_ƒģÆĖlŽ_ńj©®­Õ×²ķ˜ž`˜¶€łJ¹tõåŒuœö·Ķ×t’uóŗµĪĒX_œžųŒż3菙Ńō0U’ūµŁčū¹3Z.k9Ę^*S÷ óā8’laÆi ĪN ļ=/éß'Ćöö€5Ŗfź4Ņō¹Cõž~ćęWŁ_rĶY2śž£‹_Äõ Wń|BĒ„øŽ@Of«~9. łö½Ūn~%!ō|ևÓ„ć)ŽĖO~?42ŽŪ]ń·yń§Ež»»'“—ĒWŁÖ÷ĻåI}øaÅš9Īõį”1{'žjlØ©? µT§Æ5Ŗh!}Č<0/Ģ+óšóVĖĖŅ»ŖMs¾;õ”oƏc}äcÅśĢéaŖž>“’ū²»Ū®yŒÕxY‹æTfĄ7^æē0o?ji·+Óah¼VlćóĀ<0/ló•r߇l’øņró¦ū{~ńó’—ęåūī³h/ėOķ'^cģóņzpČ Ļ7Āß²b–—¾ŽĶžū{8–—vŗ¬Å_i5žēė„o/õņ×ó€•o‡‰ž—¢Ķ—ōåk Ō׿›¼¹ę˜~§Ļé÷®óĖūø.Ėóvž'ó:ēsœå֏w’ŻłŪYŽwDėŠÖŠā¬ß žN)ʕ§‚—‹›ņüĢŚ«c®ÆŒćśZžcN|gK­ĻūžSĖÕjsß½§D©ßÓXó;ǹ~?ĀžfŽæ²żµ:'±”–Ŗß«ušłn­Ģ óĄ¼0ÆĢW:’ŅW»“νÖUŪ2^ü!ū°ŽZē”Ō³ęCé©ßż·„Uæ÷&okż½BÜ@’{^üµėq\–7§­”­1ŽŽö̼0Ģ [Ā|„\ŗ„;Œæ—Ž/ż”’–$Łsł8l7éŌŗ’q{ÉėēŻļ(ž­tüAt»ŽqDėŪ[żU·JMąöR//q-1«¢QņĘó²Ź–›>|ŌŚ•£~­×ļ“ž¼튱×ŪnÆFźGHsŌģō×¢Śńõ·×>āńų;WÄ×ėyĮļ!X«_Ó8Ö¼Ė懖–Öö¼ć‡Jkų;Šžöū…–’¾"ēC2Ž>¬<süPz¼‡óĮĪR-³Ņ:ćßčlHŅX;~ą8÷ų”µ}ļÄ_ƒŁžŹ;~µT«ušłn­Ģ óĄ¼”’†ü"Ļaž~¼pĢŗj[Ęwo^˜Ē~ņ ;šĒ <qĪNO U’ ĒĘ8~°_“ō&ÆlūP²7ź«ķ’ĪóāÆ#Ģķ~-ÉĻmźų÷ݐ愸9䅳 Ė9Į޾y—łēT9›—‹P ^^8õ`ēÅĪ{“ɇ’s¢‚yȼųńS²åZ¬&’ķҾśŠyōÜ^˜ę…äv–ą0ĖĖy™ķÅ~ĻŽ¹Ź×Zžžżr[g}ø&Œt.IętLę(äÅśµz¼}sņįÖkķÅ"õĒī|Õ;®ćńvūrō¼0Ģ {€ł"Ö±o/儵½öØ=ęѲ\…÷Gægßc “EL&žé•GĒm½’WōūlÉīm’‰r%ćÅkX˜¢QųL˜¾©÷Y½Ļk£m–¾EC©cķĻŌQźxųü;ŗ2¤o7ß?§’g›’¼6.—ߦž„šŸlżXū‘·uĘsiō³ĒŚõėc‡KėĄ±{m½6ͤü÷ģo~DĒ“olXżæ|tuŪÆ…ĆRƗÆL@ōÖ½ŁŪbß ąųž^›n8čąe¦Nš»mŌOīzpż Ó¹Kņ8ß_~ŅówŁŁ×Ö“%)“#Iæ/HĻ^øÜŖßu†÷كė×[æ_ŅS~’“±øœRæŌ–œŅŠß‰X_}Õ''MOóf3ąyĻ9OžņūAžžŠæßāł!ĖūøĒ:…ēmm3[ņĪĖß æ›Šø=œ’Ē ķ<°Œ8ī§ó㟲ć'ų» ’¾>ĆźžļĖćĆ$’Æōokēg¶źļ®fŚo&üÕŲĄžŹ; µTĻƵ±yoéR<~b˜·ł üqė˧īā“ÄGQ ו§ZŸ{æųyÆG2<$sŗźIßg]eßix^l›“ó™-ooõWmÉzäõ×;®k‰¹^ŪėsĻĖ!¶<ÜŽÖ[C ¬ćž.†)óĒ7~åš%ŪOŽöŻfĀśö²‰>ż¹x®Ū¼Čēćå6Ųgä=­— CKĀūnžgų9yˆŸŸNµzśĘi?ēåĖoæ8żŻŖ×αü]†Ć…§ŖūŃ“=o­­?»ŸM§?īsz¾Ķ2e“O÷Gį~Øß¦Ó­ż÷įž(Ü7…¦j4ėŌ—,_ødńäÓΟ{ö;.>WS“Ķ£Vį÷ϧ†å)b¼éˆĄå/ć÷·l„ū£0’ßYƒ¼}Ł¾xģėĶdūåW<$“—ĖS«½Ļ‰å·q¬qńżQ,ĒøUˆc}ÕøšŽķd9Ę=†8ÖĒ8æ?Źß3ŽåW8ˇxĘłżQŁ8–cÜ4ı>ƽĖ~Kc9Ę-@ė«ĘķU3?–cܕˆc}ŒK’“kęĒrŒ« Žõ1nåŲŚ8–cÜ&ı>ĘŁÆ5R5³?YŽqS^ś“õ1nåŲŚ8–cÜlı>ĘĶk«c9ʕĒśŖqµłc9ĘŻŠ8ÖĒø$ł²żś s?Ź1n#˜õ1nåŲŚ8–c=Ął2®gLmXŽq,ĒśČ=cŖóóū·čŽ’°¾ayn‡ńvåyōx–güŖČ[ŒēvĒzĻņŒ ń¬—ó·Ƴ<ć ‡a»D=œo½x–gü4ij^śkE“sž,Ļųˆg½Œ·#Ƴ<ćÆD<ėå|ćķ‰ń,Ļų āY/ē[/žåæ ń¬—żo—œ?Ė3~ŹįŲŽQū=Ž>ĻņŒŸxÖĖłÖ‹gyʗĻz?Ū_¼ž±<ćoE<ėå|ėų<ć7"žõ²’b_płYžń_śõ²’źÅ³<拈g½lw½x–gü ij^®?å:żĒņŒ_…xÖĖžÆĻņŒ ń¬—żßĻšĖ3¾€ć$Ö{%öGõāYžńÓĻzŁīzń,Ļųˆg½ģæuśå%āY/Ū_/žå_A<ėeū'F^ēśĒņŒß„xÖĖå®ĻņŒēöÅzŁī¼ų^+ĢćY^Ē)~„öø–Ū÷#Ex˜Ūēēćģż`Õūē 5÷Ļ•ń{oŽ |æ?nh×qĒ땼ųężsŁōlÕ÷¾>—ģ„…y`^8Sę+å¾'pÓ®‹łŽ?·”3I&t5ļŸK{d‹żēy±ŽMø½méūēč ś£šÕąz%>ž¢Oy\•]PŽ?w’}8~|ÉĪtĀzĶļ‰+ø.€qy\~ĪŠüĮ8®§Å¼ųŅǰžņžŃw’­÷ߤl'āż{’-ņĄ¼pј/»µ­/IŽŪ>/Θż½sļšņ‘ˆY>;ęzÅėĄĪ»[š2æī[œ‘¼ū ūł}qFųfrś[|+Ņj'÷ķ»£÷5Ł yļõūµ|_ć!®)ęøüöf÷ĒkDŪŪCö>l•·lüĄ“GķTæäėĖēĖŻkcśŒ~«Ąoō/ćć<wYŗķÓ)F_²ļöŲ£g̜œū%ŠūĄgĘ.OšßĒķØ2!/ž‡Ųnų=W%ņšžūƗLJą>W€ćš}ŠOßsł}ģ=v/œæŲ_ļČ)j©~ĻÕx­9•mƒt|„<0/åŻC^˜ÆŠNģ“Õļ¹ćŅĻל4ž®Īߟ‰ļ„®v°~#ÆĻßPĶwv°9Ŗśū­ŽäĮ„Õ śŸ×’?öņõ8B-ž{Ē0ō&3sJÅQŪ™ęy)īņR»Żx^&×ęyŹę…ægdā¼pz“Ō¹yY‘žę1*Y}~ļ“×Or¦ū/'³æw œSp”|ļ0ĢKaϐę+4×óņ—ڼtī¶Ī§eóņÖÄzyéĮōØ ró2³µ±5ū:ūٌ{Ģó’æ½ųöŃn’ĀŠX­Q ·!2/ĢóRŁ+䅳 Mņßm/NóŲņŌ·0Ƶ ĻĖ‹§ŻJ™Ōū—‚}¾ÆoM·}[[oņ¹Üņ5Į¶U…ūĪźåÅæKšš;ڱbŪy`^˜ę…Ē ĢWhę%ī±;ķՕĻCY˜’¶—?o޼r%#ņĶǽVŽ_ēÅv^i~l4Źę…y`^Ųlę+pÉņāƒKI_RźģLJū®I:v :“›k|ČŪćęߏ׾ÓĢV…øžļµ‰×Zżõņ×ó@uoiž—+mēńök„ońƒ ž{‹žC©#/Ö÷ø[¦Ŗ7ŸŻü„͆üv‡i£į’Į”ķłźµ†ņü‹ēcåÆį÷8/›‚ėü³1ęuj~Įeo3ōóōćlģ÷ķ““ģÓž¬ŁėM•—ā8ćĀ öcÖWoĢķŸqÜž+/ʉļ?;ózB½¼žTo.įó½m9|˜ä’uz¬ß†qæßśłŲ>v²żuVN²B-Õó±Ęj|¾[«óĀ<0/åÉČ/ņ¼µęæ„źõ¼ųėl¬Ēq½-É7ģ£šž3äy)īņĀ|ÅĖ9Ś8›ĻM<kūżgy{Žøōögn/ĢóBr»Łž-øī|Õß^<~>¶cå…y`^Ų Ģy“޹©——}ŚŻcÕ!꼔ķū®PŽī?ßcĶ kŌæö;–’ÆuwwĘ­^•”Ö$é+L¹ąŃkoļü¼7’ģ‘Ķ/¾Óź³ŲĮĖęĶĒā»BģšŚū_ÜåuüŪsßŃÆżG~ł„Óć%Śē™?Æżņ3ĒŽÅĻĻZłēī’Ų|ģ rs¼}{ą%c>×/~–·†õ+,Óé»üōuńŅįсśŲļ?ĖøŽē­ēՈō|Ā6Hßßk“ĀöY-“÷ĪĖäßÖæt|’™—Čž.¾ÄÖ’ÄŪļ/?$‰ļ?Ė^#ČoÉč¹’Œē}<,ŽĪy~Čß½ń÷K<äłavł|ŸĆóĄ=ö˜×–{8ǟ—_Žó„W‡q¶¾¼÷<~b÷ÓÅrāK÷w‡:xŽ÷¦!ņxs’W’žCŚy Ē™}@õ{¹yö75żÕŲĄžŹ; µTĻƵ±yoéRĢ óĄ¼^ņĀ|„óõē˜%§iŸdæRgæg8¬N#łü‹:ÓŻ§™ē˜„׳·o0ĀļźT}\ļų)œoųĀF,Uŗya˜—Ź+C^˜Æ“ii^²ß—z^góRē{7=/¦ĪōܼųsH†r}oą¼ŲD;X^˜ę„|PČ óUĶĖ«ÖVWĻKąl^¾P-PóŽŪKé¹y¹ÉņrSM-ĆĄyń j;ÖöĀ<0/ÅCB^˜ÆŠÕ<žly™’ÉSmŸ] Ģ~ķßĖŻV[ Žæ2ßĖ„Ļķł†}«³*·|’}~õņŅ›^ϲ=Ā÷Æc“|B1ĢKĒ ĢWāßĒ•ŽŅółߏżK`ęåk­I²Ī^Ł~’Ŗ±Ģ‹svz:ßĖ…c»āŒćÓ“Ö öÓ¶v«±ö¬:LĢūæ×>ōœŌĖKØÉ.¬`h¼fFlŪ1óĀ<0/lóE®ŽK›ķüe„½0®N©÷ī ä)ĻKŁcn>Ųaēä Ö›ŅW½’¼śķŠŽć1’^®‚ćģ ¶Ø“<’ū­ķł½ÜĄķß˵žŻ|/Ēó/žp4ĻÓųūHž—ńū8Žß’]£żśģWl›9Ö|³Ē„±ŸĄż^®<5<NćƱŸ;4ē¹ŽŁŹńžŪqÜž‹G„zjBśmĶ߁‡æ÷3ŌæĆäżu?<“mūū;päy)¼6䅳 ĖX=ĪÆņŻåļ³Ē— ĀÄď+|ąž’Ē—œ¦ź’{—ż;*éłŲB«y(æmyė±jśų|¬wHµĘµm}ęöĀ<0/•×…¼Ōn7~<¹Ķ~'™ęe(æ“ōŽ8/Õó±åw’ĢóR>*䅳 kˆo/ŁßI:ļHŪKõ|lGŁ^˜ę„8=䅳R^Féļ$CūŪ^|ĒÓČQkŪ~czŒy`^*8n`¾B ž¤ļGü|ėŻūq‹üܙÓķ|Į¦Ų«žļ$må.}•jtšśėy,Ō„Y…C«¹Ńl¹rĢ óĄ¼pĢWą’yĖOéK’Iņ‰éIé0ßg:tŗŽmČŪēŸuŽY˜ųkäC|>¶ejy»źÕąyńó1go°‚lé£ļ|¬ŚóyĖĪĒZžnĪĒxžÅó1.3ĻÓxŸ Ąó0ޟĖņ3m[qϜbųż ķķG¶äŻ·Vł~x>#ĒÅĆń÷#†v>Ę8n’…Üų;±żó¾µĻŌ2_gü:¬Ą“Ņé³Xæc~œ½oķH{6£æŲ_·¾Ź»ß#ŌR]«ušłn­ō2óĄ¼p~ĢW`ļĆźßµLū÷įh}~$ś½Ī}6ÉOĻĒģŗņ‘-3[“[S̼ųzü±œņ^S6:ęģ“ŃšŽóāגŪŪÖ(t߀Ķó#čyźßµŌóń<ĮߌĀ{?īĒsšÜĮøOf:ėģó.]īO<÷ C94.ŠēåcŹ“š|”+_‡ē4a|ėt0ƛŻVūĪ.ū\ĒšfX ĪŲחÉ6ó’½÷öĶF{ģmīĄ8–c\q¬Æ\ū|A–cÜ­ˆc}Œ‹Ÿ/ČrŒŪˆ8ÖW ļŲN–cÜÄ×āyNż–óń6dĖ1®ˆ8ÖW_mĖ1nāXćzĘ<ŽężĶł±ćV!ŽõUćBžĒrŒ{ q¬qvlœ®~Œc9ưޱ>ĘõŒ)„?µbĖ1nāX枌Z;?–cÜı>ĘõŒ™XÓ/,Ē8n'¬q+ĒN¬ÉĖ1ŽåXłÆ­ÕüM±+hŸŸ“ Ģņ\OćõĪūĒćYžńSެݮÆGŒgyĘĻF<ėå|'"ĻlćYžńeij^Ī·^<Ė3žVij^Ęõ[/±ü,Ļųˆg½ÜŽWŌi?Ė3~āQŲ^¹Ųnū­§˜?Ė3¾ˆxÖĖåÆĻņŒ_xÖĖå~¬NūYžń«Ļz¹ÜõāYžń!žõ²Żż¶,?Ė3¾ptč?ÖĖłÖ‹gyĘOC<ėeū§EŪ×?–güij^ö_½x–gü•ˆg½ŃļńvĢł³<ć+ˆg½\’źÅ³<ć7!žõ²ŻõāYžńSøG=\’®¬Ó,Ļųوg½ģæzń,Ļų2āY/ó^/žåĻćÖĖõėQģ–g<§³Ž)Ų~¹qŗēÆ× ‚ćž§–’£öø‡żG–Q× Öēc?Ożķüğ?÷–ō'±ēĻUK=†ēĻq\™†ļ_7“óTĘń|؜’wšü9Ɔļ«ż8ŚŽłśäG ĢóĀv2_)oąóēÖĶüæ=”Ü„3²ĻŸė &ž™»…Q²Ü ®…ė~2iæēh³±ŻgYŪeµtÕ¬K\Ć“k‹yMŁ!ęģ“ŃšŽóŅi įö¶„Ÿ?G_ŠÅÆćwąš ½{œūöÆ8ļeńė\įȓօ„ė\Āu®éCóćøžrć·ąu®ŅÕŻéu.Žūż|W[O‡~ė[Į½æāa‡½Ī…<0/\.ę+šõ֗Õė\‹—_ßż†³_ēÓ²×¹žę°×½č^äōPJ’‡ė\ꘟó™Žly¦Õ_*S÷Mv=Ī«?®%ęŗo§ īæĪÅķ­y+<%N§č?ś°pkš!=ņų2>¾óuǟ[ō>ėūļŪöŻŅrlŪ[ržWW.āų ćJGąŹ1Có!ćøŻ•»rāćē#ō‚ż6{„–§&łĒ%µėžēśšX»'Ę_ƒŁžŗŹś,B-Õūb«5®e۱ާę„Ųü"Ļ”Eö;’Qś÷y=/žzž½|=އ–ä>Ė֎÷|ęy)Ģ y©ŻnŖ×—{4ż}^ęåSÖū»[nāaGżū¼ĢóB2_a9ķļń–>˜/ˆ“½S¾Ö>øŁ^»ŪėbōĖ5”Ī?œ³Ó1™£ōųag#?ŲļćnN.i½6YÓĻ āŲļ/ĻKžöārŪńžĄ<0/\^ę‹üѓֿćū’¹ū„ć>·¶ü×cļj{ͤžĻžńĻk|ųśīO<Ó|>‚÷åhĘ~ėq;żĢ×£ųoėśŗĮśŽśŻēÉ÷ĒĻGČ^ód™0.uLžĒ×Nbį~‹~üœ~Ū˦ē¶Aņųž^›¶O–Č{™üē#ÄĻcŲńž>oųmą_ŗó—Ü?=ĻGąyĻ+8äł!ÆĖĒ×÷y½,»Œ~<ąĆJKīī»óāŚėb•q^€qńųĄ…Ā8ŌP’žo0Žūéüų«žžkĻ-?Ócķ<ćÜóĄ”?·Ü—tRĪāīØĻ-g˜.ó•rڇžīԐŸ3ļ±¾õįkŻSmźĮz4æŽH^=ąō¼ėź=cĪi™jÆ0—Įž÷õŲĻå}=ŽÆ)ūYĢŁi£į½o/žūƒų¾ļö¾fŠH~6qףś{°>ÉćŪmœżœe}ZŁ€Ūō­§yl½ĮĻIņ†ēę}hŸ±ķOŸ>}r¢ĻŠ—^¼|Į’ÅõuÆ}ģZ»½ß}øV…Ā æėˆæūątĆ(8¾öo°Łrƒ}ƒrCmĮ\āz<Õr’wķ"®%ęÜJ·ć‡ž’ģÜŽžuƒ}īž쨯ßß`’ēčo°ƒŸ-ƒūī?ø?įŖĻż Ļų›ž¦ˆß)±¼Ÿ6łń»£q枌š÷ŻQ”ķµéߤ×xVŲ”ß8“żIqōV哜ųĪ‹ņ»¢Žˆ³­ļ’ޗLJIž_ßt‹µż ǹū“æ¶īų«±ż•÷ŻQØ„śŻQćµ66ļ-]Šūęya^™Æt¾žģ®Ī ėŖmšļ’gļįļäĪ“Z0}Ē{ųėL÷ėŁgŖ„Ļ"źjżPR{µ4Ŗ4Āz×\Ć]<ķö,¢FŽŽ£J·2/Ģó¦0_)oø#l}{ölśų^=…ęõ\’čk»_õчl?ųĄķ%//9÷XŚoOžŚŚÕźÆĮėö^½¼ÄµÄÜŲ¶])ĻĖ*[zšQ›u#kŌøšų"”Ł5 ?ZózŪ3õūß;ü…}ų{{]bÆwŪ‹ģ圛C³BģšŪŗĒ ÷TżÖJłjSx÷XįŽ«8xÖ©§æqņĢy ӛ¬ā‰ rŽź9±æOV¤Ēa|kkąā7šĮ’¬ż­1g9Ņ{¬8’ßY…޾"ŚĆść±o’“ķC–cÜ Ä±¾j\ķ=V,ĒøUˆc}Œ‹ļ±b9Ę=†8ÖW ļŲN–c\żĖś—$/l÷}$ćXŽq+˜ŸØVŽ­c9Ę­Bėćüj«c9ʱė#?dē‹>x;żš×ž¦½Š֛“żĒ~ū‰ń,Ļųiˆg½Œg?²^Ƴ<ć žõr¹ė͟å%āY/ćė͟å_A<ėe’ՋgyĘoB<ėe^&Fyēņ³<ć§`»e½Œ«7–gülij^¶ŸķˆūŸå_F<ėe’±ž8žåOļ°^Ī7Ž^øü,ĻxÖĻz9’¼ų^+Læń<®yŽżĘõp}ķŠóó±’żEv Ą{*öʑÉęĶÕµ) L=Ėqqv8’*¼9ē<,[9Žūr—L”ŒćqinüßĮ=ģ¹åž ęya ™Æ”Ÿ;sß\źf4{ ŁĶhö@³š=Šģf4{ ŁĶhö@³š=Šģf §†v=±×æzĢ|X}¾ī;ą},Ćūxæļ?Øw_ŌĆöŪmæÉ’żvKĖ—Ņ;³÷!”ß~—Īqå,üN}aĪ} ü]5ćųūŻņ¼œų~Ļ2gO؎÷%D•GųEÜW1É?ļóXæćÜū¾d÷ ųkš!Ū_iżQHØ„zBcµF•lCd^˜ę„xņ‹<‡&M¶ū¾°¶Ś<ć¾³Ö9gŸGqś’jä}dNÆÖ“¾Kļ^{BoņŪü•ĢAĻĖR[ưiy÷!„Zü÷īač毻§œtIz?Ē9MŁ"y^N¶š8Ÿ?Ųū<#œ¶dÉ¢e#˜#óĻ|3’…!’\/Ā,^Ņ$“uŹ~I÷[Žü»”³łæķa¾ćüszŌģÜüÆHz“QĮ3=™4§ĻŸUĶg¦÷ā™é‡ ņĢōŪozMgyĪæ­łČ/ī±v—:¾ō±=;śó†Õ‡Üž™~慟ėų×Ļž¾wGxfzå>uū7?}IĒe§Õ>3}ŽY§vZ:ßūĘ+¦éŽ};N^¹—=3}ņĶkĒß¾śŅ×>ż±÷ų3ąū¾¶ģÄywNøé¾Ī[>ŗ©ļ?]Ż÷ĖćĻčśćA«ūfæćWÆ*ōvz4‡ķß}§’&½·)Ū’F?óõ(~fŗÆ¬ė“s~ł:¾ēx«=3ē÷ڌņŽg8޽Ģßė3ÓżłRI2ŗŸ™®ēįyEæņĘæĻ|q<ėŌ7.œ7Ɉa”·~läóJŚĆsg¦ģƳ a\¾ÓkĶÖy~ēĻēęLl«}ž —Ÿc?Ž›lĄrŒ+"Žõ±|xšHxŽŽĒ±ćV Žõ1.~~Ė1nāX_5.¼c;YŽq!Žõ1.~~Ė1®€ü°>ĘÅĻ/b9ĘMCė«ĘZż=ŪÉrŒ[€8ÖĒø$Y”¾eĖ1īJı>ʝ=/‰åWAėcœŻ [ÓN–cÜ&ı>ʝÖVĒrŒc9ÖG^9¶ŗ|ž|&n|>Īll,?±Īzążćń,Ļų2āY/ćć¼2žå+·OŒ¹žÅłe<Ė3~#āX/ē[/žå?qLŲ>Y/ć Čū…ógyĘĻz¹½N«ĻņŒ_xÖĖöĒė ēĻņŒ_…xÖĖłĘėćYžń!žõ2.^ĻņŒ/Œ żĒzŁīzń,Ļųiˆg½ōŪ¦:żĒņŒ_€xÖ»ėo½x–gü•ˆg½Ó™?Ė3¾‚xÖĖü³ńśĆņŒß„xÖĖõżdz<ć§`æĘzŁõśŸåĻż"ėåśĒõ ž?Ė3žÓY/ēŸßk…¹’åuéāµūaĪbä!ö ēēc??ģłZ+š|-Ž‹ē…ėV…%9ו³•㽯÷%;Š`Ļēsć›Ļ׏éĮ­óóĀ<0/œóųɞ0~ĮŒtžÆÕeē»]Ķēk±Ē¶ĢŲóŅiUq{ŪŅĻ×¢/čĀjĻćøžž=ūŲ—ÖżįĆ;ķ5~|Ɏ”ĀEö{­Āz<‡ćŹR\÷>hž`×Ór^|écXOł=×[rŚÜŗ’qy&„%<Ö¾×J8ρóI­‰_¼óæYīOŃküIzµõ×6#ŌRż^«ńZkėŁVD0Ģ ēĻ|Ł#Šū’ä½ö½†ÅKļŲ­ļĒ¼G>ÆżŸżÄļ5œw·"§¤Å<ÅÉ»Æ(ś8œćOī2šĮŻŌ^°œœø”’½~æ~īėq<Ä5Å—ߎģyŁ`ąv÷½[åĄ-?šäQ;u%–Ļ—»×ŽÓgō[~£÷č5_ńxkSt¼ģ ģėÅy6ö= „±ŸĀE»¬ßŹĒž‘~_Éqq9üvńŠüĘ8nG… sāKzæyż“w^4ģØ~c˜—ŹE!/ĢWXĢĶg7®­.²=?°Ō—röł~ģŸHæ‘9=”Ņ’껤óŅ6ßŽĒŗķļHĢWąKl{I‡®<öķĀ÷÷¾=ųŲūÉ~īĢ鉝ƒŲ¤Žp<Ģߣ2ca‘žgĒ׍ŹZķõ×Ū^āšb®Īvt¼ó¼tZ?r’ō°5ĖpŠ”0h‰Ń]€ĖžhXņ.Ų¢7x|Įć2¾įq3x]fŽ3āėKŽøYęųqę’}Ukėim{“†V×oü(üÄ2ĘÅ’ƒćRĪńBĪs;e·ÓĀ{ņāßū’Ł»Ą(ŠÆæ)ĄBļ=ōPC—’ģ^Jč½£IH!4RAį¤žAéŅAQQ©w”G±€é¶Xž"ģ7owŽŻīrsI®Dżd`3[޼÷ężęMŪ9RoBĄńÓݵņ”õņ”*üÉLŅĀw‚4¶ūą`ņ ł hÆŗÄfś p±§ņĻUĻ©p®ÄqəJūgE›P°i×Āu9Ī‘źĒ’ŃB”œCĄžĘYåŅśœ^ŅHēĪ-¦ŒsÉMŅß8Ēżé‡–’uüėŃr¬§Qø4}®zN…sø ˆ‹‰śāU8Ś8/|.’ÖļÄÄ-„x‘ßEßĻqÓĆ9n]69 ŹsčĄ}¹ļ`ķW€æ€ßL¦õ ö7ąż)µÜŒNpČżžį“’ĒqźžĒMńĪÆÆ€Æ:ĀEĻI­äēŸóü:Ų> Ŗ‘Ė<5yžt’4ÓāNņļ<ŖÉķ·Ā3°K‰‘¾?1 ŲåŃß{j÷½ķAu„=öS°ß‚±?ƒżģÆąū#^7O2„Ō)0O‚żžoźkÆßĀwSęI0Ž˜Nū-sģõ;P[Œõ0¦CēgŚIŸŻNŪO‰š„½¶±µ{ÖÄW¹]"9-é·`l·ßŅŌ·GŽAm/{ż…‹­ß’?®yĖõā‚8 .9³hæ…ā,ˇżü9é M²Ÿ?½VĻ“<ŠZš÷óg<—ēIüHyTĻ“<ō:Ī=dš³é””a(Ē’ßŚGÄq1QC¼Čū ‚ĒM‚ĆĻ O½qö9ŗäd÷9Dź7jK=zŽž‚żM™‚=OB¼«©ļŸ^p<ŹKż……‹Ā…GCžø"uįĒč/ˆā‚š ^ŹužęIz;B’äc]æ®į><ēņž'įxī˜wļ|`Üņ ¶y+71ĢK ‹ĻQŪ§’Ś(&.%ŽĖŒĒE'¦8£„ŗO¹yÓ’Ł„įe üµpå½ĶSŹļuā}żhsq廬ćsM|¦Ž>2KŁvcŚ“ŁćņŠœE,ŅöWų¢ōwȟO•õk<ŗtš^óÄ'½CČ·ŁÄ«VV•ć²ŽÜČXuĪ4=¾pŃŁ$}—­0÷ęCņ>„pžSGK®įPžŹ¼tüŒŽW¼‚¹J<Š’ H,+AįÉ?,DUäŃźHłr!©ĢÕ±źj$×^„¶ «É  ī¬X”‚æŁŹw Ūō…“ŹŗéyįŹ™^Öłyl¬ŹŌ\f2 {‡Ēxl’ jį8ūæÜż4Ęć,’g-@śp"¶6Ķa|ä]¹.Jzō½„µķ}Ū;’üęŚ9kßĮ—ŠĆŗs=/ŚōĀG„÷ī:ˆ‹Ųµo—®¾źær?ņ߶ї:#Nž9™šq²Ēxlæ¼9o¹Xƒ—7 į\ʁ߯Œ§rhŒŒal uvü¦·Č̈Q,č8Óč?\ž·@~/Z“–¬žßĄūß{cŹ\å¹*Ļų0_±mœŖ&g·CE8˜Ć€ß %ķžšuéä7b政2¹ Bćć7Įu(y/Ŗ¼*Ė6`{vā“ä>ĒȇgäŠpēÉy0‰½ČAƒÄhW1Ž|ń 1>ųGżö,@Žõ4DuÜ7•LB¹ŗÄÅGg%eŗĄ’āųŻĘ&c`÷0ŪUĮĻ\MåłlrókÅɹ=ūŖ^…bR—ā„וł¼@A;Ƈ%õB:ŌĖ“RKzEgfDfÄef&¦ŒĶpI)’8wÕk•VN ŹõB:Ō‹_Æ„/BŒ˜’•™™˜ēŠRŒśó õ |ó§¦ÕĻäõD½sÖ*zc~ MfBz\tlFd\zzj:¹öd@{¢ØW Õ õŅŅć&FĘ„ŒMtĮ„;äaOxŚSM¶Į~9źzZõŽ­ŲóC’(zĒĘMLŒq¾*ŠČCo_"Š b5=čŻ½’ł™‘œRQēˆ5ŠĪ˜ —m=&5=6ĪÓ%@ŃōB=PÆĶ«©^T_«^“€’$n Ą_cŌõā©^Ø/¤‘퓐ź ĘĆ ˆ±štoŻ®½cŌuNxE±%ęź'Yēt—Ŗ'.!ÕõŌOjzŁŽ”mz¢Ž9“Ęü!ōŖ²鬜¹qvūa€%µ?ĮX^MÆ-'ŹÜ:źś¢žTĢ—ÕīŃ1™YŃIrū™‘8¹ 5ƤŚ]M/ėȁz£žØ7ŲęČćÓ32#Ó³œz™'sĖ’Ō Ū{Ō+‡ö°_ķĢ31®5²*µrW(~’ *1>*IOP/¤C½"h:¤Wģ•D:éŃ)iŃéq)®v"‘µu@½PŌkór%Ø/¤ĖˆNNs›ĮŌJóŻ( õB=P/žź…ś‚^.6‘:M“—,{”ØWĀ2ZORż ]rō¤Č1©Y)1®U•Z…č•Qwķ…z ^9K½P_YÆÄé„ƒŃZO ؗi‰¢ź zÅDged&ĘdŹ9>).&3qbAk7QT—,QŌ+w±¢ź«×+Ōæ…”źzEP½P_Š+61>>+#Ī#XU¶ƒS,_ØźµłeÅ^Ø/č56)5#ćØÅAU@½PŌ+į%E/Ōō’«ŌäȌÄT·;€Q„œ¢^ØźøHŃ õ½&¦&e%{F¦½PŌ Ū-Ō×j/„ ŠLvs}:u°Ś‹¶ŸØŅ ¾čåę:ֈiŒza’õāi¹Ē~†­?“•>Ń5¾V1Ō õ@½p^õ½’²&‘n‘E&¦dʍMĪōÜšõB=P/Ōõ½2&ŽŒ›”–šī†Ž)„śUg%FyЇ€z!ꕬ„‡ņuŖ;u“ €æ: ^ØźAõB}!]ź˜q¤UŒŒOLRö¦Sóqõœ„źzm¦öE}!]FZRbfdt&)^3Ē$¹ÆŁ~dNķ…z ^˜ŌōJ">‘ćRIĶ•łLšuYöģHīćw„)ĶNś]!¤é0­‘›Źńæ*ß#B¾ =Ņcś\Ü“ʐ†¾B¼žõā’Ō¦GzL_…~Lj|!=öŃ®“€oĢŗČćY”ō˜æƒD¾}Ŗ4÷ĒÕ¦GzL?‰ŹG¾¾9 –óŸ«Õé1½ž{LHu(!ė[›é1=B@¾^žjÓÓļA!’›‰ań»L ”Zż]‚\ßū£§nüoįŪ7e?’‚|' GŅBąõŅŠ›^Ō~*I’䥁Į›#_å’÷Tx]ø±nņ #­­ßBźˆ0ķuŽīZ’¼ą×6ņ~ʘŸ¼2±Øeq¬ŻW辔߁-•wDŁäżĪĶŠˆ«“É7°§Æ2gq8YJź­±šķĖs›.P¾QõŻGĻaĶ_=r|rųx7%ĀyÅķĻĖēŠ\rĆNheēž›o»pš b°äčĄĪķ!pļėŅ“£‡Ź/)5Öņŗ‡œßP[ž"^p\ž`Ż€£rŒ„1ņŁMĪAlēųžźŃXĮŪ®¤1Š·|ŪYąøM>Žń<ŹśoĶrÆöuŽ—*äŚm'įQßC>JŹ Ök¬ņĀĻӖ—œm}õØ µV“ßEtA>ž*/Ė‹Źšˆ³>¶‘`yA»å§¼$äŲžķ"ēąēüvmż’3_[^¤ŲXØ.¬u„‘Rõ5G¾ ó Xļ O•£ˆĒåH……¾üąµĖŚ-?å öƒ<…cĀcm ©śMyµh·üąø“HĄu#[Č9ųµ> ”'zG?CŽ»ć°$Ł>^•¦ŁĘ2T®ÜGRė€ķŒ­”>$ٱ-ŗ†!”“2īĒX®_ ^’„öņӛŒ)Å9?aįCdĄ¼cÉ9¼ŪÓžŹėølyˆß•½I΁\’}YR\¼óJ~‘½É7°ē:ĀõD½Qę'=ql‚+ŠGDŽī‰AļmÄĄø^o 9·gjõ¬f\×wpxjrZjF"|MŠ756.3=®€söä`®Lļ_y¾ćC)©é cpe ?Œ»®Ź ē_ŲĻæ©”7~—+±‰Ę ›#żd~y T[<éJ¶üżb‘ж{ī8?#ś`¾&’sPßŖä eš“8_n3Z=’€<j¤ÄaDŪKäŌ‹{`­š¾y½ŗˆ‡© Ż4T‰µ©¹ZFĘb9乇8Œ|ķCŽĀ ÷Ł7s>•2oŖdæBīŸ!‡ęsóńTŽē(,Ś# q׌ÅtqŖfæ–ɰĄŲłąjz”ģĶu!{q¦ßOĖž ^=(5f|\fxj’SÓō`Ļ7ĆMÖž”zvੳ)ģ?»Ć÷-69öź£ˆųšÄĒDĖ-āfśüZ’ś;ꊤ“„hū¢óu×Õō6!Ÿœkz|ŗ%„F;Ór- _Uumųę|ācÓ£`gˆMŽčĒC°įƒx >ŹsR_RÜų/µųŒD'cWÓŪÄzŸ%į9…„M¹£ķ–µ{‡¶ÓŲnó‡4댟ŪkĒŹń‚|W¬ōß œńiH¼ē"¹šā°ćīÅa1ŅalzØŌÓ|ż'5ż«üļ—qć ,ģv 䦹øģPE>äHŻŽ äłüŸ|²9,>¾w8³£łG?ähŪ-Ó)­ŗŚ¹šqƒvL*ķķĘvŒŲŅ83<·üŠ&Gķ‡˜;e3Š4„ˆācŗÆąc-·_ińqµr5½-÷µciŚ“ÉēĒā<½ć~†M‚a;f“£ĘĒN;Fń@|ų?i}BżČtF‹«ķ«émÖš>O†>69ŽńA<Ó=ź?7žœŸ¾©éÉŃ.|īąjzćģą#ūOĀ/ś~ąPņM†Su™uD!ąļ…lrŌų`ī0Võ).ˆ—śõ'Óy-NC†"ēbWÓ£TOį”PH8ŁäØqĀzsiĆ qAœLP¢ųń“8 J‹‹ƒ9Ggƒ«éQ®§p2N69łĆ qAœųŪԟØ_™.jqrvōöu5=ņń¦õžūę'Ī› '˜Ÿ°ÉQㄹSõė(ˆéwźGԟųĖZ|ŗ(ß^ŪšĢÕō(ĪSųä>69ŽńA<ž7ź?7Ó->¤žŠÉJŠvś•“«é=On!įc“ćÄń1Ż žCżˆæ¦Ć'!:6õi“RĮćA.¦G‰žņ>”ĘEV9ŽńA<žWź?ŌLßhń ķ‡r.v5=Jõ>V»yvÜj“ćÄń1żBż‡ś’ŸŹ)4ScWÓ£@OįQHųŲä8Ęń@|ųŸ©’P?2}’>°T ĶTą˜ąćRzč)| ›Ēų ˆéGź?Ōų\->=RbÓÉČķTŠŲÕō(ĻSų˜ ›Ēų V|v•ē÷7ӏą7©Ÿź50,Ÿ1ĮĒ„ō61ʼūęMĪ› ›{ųŲęLćIĮqć¶ƒOņŖĆÉ ććBz›XĻą“SHųŲä8Ęń@|L/S|(n¦_“ųōIĢpŗnŪŗšŽÓųä>69ŽńA<~ ­ßØńæjń障č>®¦G|<Õžš‰…4ž±Ź±‡j~‡āų˜–R’A?ŗ”Ƈ,eLOMIvvū®.¦÷4>V»yxüc•ćÄńį—S’A?śM‹? čād/ĪÕōžĘ'Āj7Ļāc“ćÄń1­ žƒ~ō»}|œķ'#>Φ÷4> …„MŽc|ć_Eżżč¶}|œ}O€ų8›ŽÓų˜ ›Ēų ˆéź?čGhńé.ļ”ātõƹšŽÓųl.$|lrćƒx >üź?čGwķāćtõDńq:½§ńÉ)$|lrćƒx >¦W©’ ݳ‹ÓÕÅĒéōžĘ'·š±ÉqŒāųšµ”ļ77žO->ƒa{;ŗ“3µœ«é=?®Ę?V9ŽńA<Smčą'j) >N¤÷4>V»y¶m“ćÄńįėP’”~dzč'j) >N¤÷4>…„MŽc|ÄĒT—śõ#žūF³~eP֘Œ¬ōųč˜8gj7ņŪą.¦÷4> …„MŽc|Ä× n&/&>NÕN*|œJļi|L…„MŽc|Äóøń>L|œŖTų8•õóŌüčęBĀĒ&‡¼¾ˆ®'²®/ŚN×ŃuGü&ķŗYćØ@°®sUÖ#MŒ{ŗ`æ<"£ÄcČŹ¢É©m¬·f}‘©­§•X›ŚvņČļ#Ļ:śŻW™ÖEĆ£ė‹`]”nm]'Ėm /EA>õś¢|®“„ö@?äiķbņÕś”«ėƒ\MÆäö2ņÄ:Y’šœ|śa„‹ėdmrģł”ķ=,āų˜h¹ÅrĢÕāćźś WÓ#>dāƒ^œūŽ“/ ’%,7ŸųŲō(Ų®/²ÉQćƒßŻŪšA<”†ø™Šińqu}«éQ?Ļą“ʏ/¤q®UŲćėļjäœ5²ƒūڽ•÷„r;HŪ=k;ˆūaąz[?Ż~‡ķ­³ķN¾<.ŲīOaCĪ ?ĶIĘlėl}4ķ ß\©ē16µ ķ"µÜČ:G?åwŠõ÷µ×Ē:[ŠŚŽe¤łŌķ`@(±½Æż÷Ū*Ņ„ģėŻlrģłÆŖKĖ% SI->Äń\؟œ¾ ¹z”ŽżūL(ųDäŸG5ŹßÄĒ&‡OĀėÉ“~ÕK±īӆżS]½ćM€\ą‡ūcz~˜ła¹E9V~“ßlåGēōü0=ņĆü¢Ü· łZ÷Ū łF~įC8® ¹ą‡=#·#wčјF(×ČW‡雕>&£t&ģrė\9r:jWļGōŸ,Ļ3aŒ÷óưūūm¶ž“š2Ęń”· ¢¼×$±F–p ǶœčĻł«“©Ī‘/Ņ+iHOöb’·%ऻ©ķ ųńóżd|๑\#Žśß™ ä ’^ø!Īi ”Œ‘%–-«^”Ī‘^īü};ԃƒ^ĆÉC,×mÉ9ź¬Nć+_x‘ž”ķ9”?ø†#! ēdB.'±³¦?ØÜUŚ»rĻېsHO¼æÉ°ŒEE¼¶QŲüŸŁŹ“§j}“ł:ņ;“¾Įśė”€õiīĶž\įC„%¦»²³‰Ķ~ ‹odæ¾ŁLėŒQÆüʛ]¬o@K¹cBėæ3CŌõĶ3£*6Ut³’ŖoŌö„¬óKöÉåżqtä׳Å.?t›i¹ĮÓ ,Ø>w¤×ßQß`¹fÕ7J~¼øé$C˜'(¾äŸ½ĄsJżÆvˆhOš¢Ļ”¾ž%¶· ¾:¹‚eĆĀźf[]¢¤VĘĀ×÷mcšČ„-O¦ēŗ…ģ¬5Kp¤ĻėoŒI6f Žņuąó¤jeŁēŅżi!?Ž,":²ssCūų‹!ć*3ķüCće!ā¦br…Ų`–oŁŅc•·čÓI`Ń4?±=¤{‘˱ķۘ4WZ ¹ššp¤ńŸLš–?|by¹¹pģR‘%ėņÅĖ!•UŲ;µGm&ĶōÄļBŠät67_RŠI3cĖ!ŪK¾i~gūwL}BZ\Iæņ­ł@ÕµLšž—n†„O/jŁžt&Ķ—æżņENYKŹÆē:±ņõõ¹!AŃ--*T5³hnōŚL,cŁŹöÆŁ+y἟·åžÕ L>5“K ķŪ}eöŹöÆNB9”ļųUę±ŻŲžU„de”˲Ęęcļ±żkį…źĀ®ė÷nZĶöÆē·»{ Kšé0„p'|¶P>Ÿöj",+y@xu;_>AĀ„ė7Į}zßj#ŒSTģĄĪŸgv*V.)ż¾ÓΉgĀ…ś[żÅR0żkĄ’~Ā•Õ>āgėfłyś«Ń‚xļŠšyæ÷™4^Ē ć>|]˜.<`ŅlIœ$ųd ķēTcśE™Vӄģożöv9T‡I#\yVˆmbŽŚ„,“&öÕg„Z_æež¢÷ĻL}>o3Q˜žłęŠļ¼Ę¤™¶=C8üo9ü{S&ĶŠČ axÆ –š2ķ;+æ$œżģˆšĆv¾>šøX(½īįϵlū¬9»Th=£øXyŪĪ1ŪW SĆˈĒ2J1±šoŗN(öai1ŖŻ)&īŻ»m’'›ÆėĮ,?S&½'Ōśž;įÉ»˜4_q{„ųŲ-BŻ`o‘…Wjņ!aó»m„sŻk1iī,É2æ½¹§āȆLš ū®Šę) *1i~ķµ_Xמ]óźv0uęö š_7’ü“fuŌn”H]Ėš!LšŠŚ»„ØU,ŸO;Ģ“sьŻĀÅ5,^AÅĶ,ū|ī»O˜æ“²„ūŌÅLš“/Y„#Oń–}ÅŲżĆ½U_ō½bīX¹”…%ėĊCBfėĶēś7dҜ/{TŲß3Č|ŚŌŽI“0ócįUnžŽRtbŅ\ņżDHėź/ŒzžĶgķŲO…Æ/ęwgėsńČgBóģO…vžģ|Mlš„`®' q7ŲžÕsöiįÉż„ÄÄx¶»_?'tZSQ<Ó¼‹^ׄąƒÄ£čoŚF ŲēŸŠč!ØV 1÷Ė‘Ģņóõ¾»BŪ7Æ Æ’|I“rŃKœQź]Įp¼˜ČĀtńžbb|NĀÕcŅ\ź'rŸģŁÓåb3&MŃżÅÄ„Łįę¶Åk2ifœö»Ūaž4Ē‹Is“óŸ;vŪüQäf¾V.“„»MĖZ:ō̤Łmz <œ]Ėņ}Ÿ¦L;O=ōPXRŖžå•ś÷÷±ģ³i7'NŁTÓ23ä%3‹ęLiońNvIKtåKLš‡Q>b’ļrĶq%ŹXX|æķ+nūi“¹ĒčĘLšqÓµ5W ļȤŁÕ”˜Ų¢^ęŽe[&MŌ,^¼¢¢°„›ĻūŠ‹WW/¾ķĆÖgŽ-?ńŹ‚sĀÆ÷K3eżŠČ_lTŖØXį.»ž1.)6ū©¢ų}-¶æł²“xģ·ā;Ę[L¼Ö/® ž"{ß}6ž‰ūW«‰ßĕkLŸĄ,?}—Õo–¾'“ģ÷9“fāž@ń»y Kk”Y˜¾·6H<8+LxsBS&ͱ‹­Åč}i{š—jǤY»(Hüm[„ł›÷0i¾ū¦©X©énóŃ āÆ¶9z¹‚Įŗåó'ÅSYͳ_=ĪĢךõ Ä×gU¶ōŽLcŅ T_§Ėµžö½0öv¾¤­ÅóUK‰/œeŪgŃ¢6b̧µÄ+?¼Č“į“ķÅŖeŠoĪ;ĒīƜĪā‚ĄśbƝ«™øw3‡‰ƒėUė&Ģf–Ÿ×Ļ÷·Äz‹§]eŅ”)?H|żU‹På—ŹĢņÜó‹‘āÄÕ½æ‘m™4ó²Ÿuz}wŃ%“ęęķ‘ā¼Ł}Ķß bŅōŽ7Tܚ¶ß<²k&MŪŠ•oūZ‚’.1óUjU?ńØOmĖō“fPķ¾āę-,}?ŪĘ“sbbѶ–^ķ1ń:Ž·æxźÆę–"e˜Y~±ųųń”†„āēט4Õ‰[8β²S% ‹Ļ¢ƒÅÖQšæ†=&ZT{Ø8>,Ō\¶C&Ÿ&3‡‰!+ģżLčɤłžŚpŃļŻBJ6ŸĢī#Åļ·…gG±õé°z”8płį\mv¾žśe“øółŹbł lū¼Öł)2fj,öśq>ӆéķ¢ÅŠ{[Š—Mū˜x•z#^¬Pƅø”Üq&īĖÅTq[…ŗb‘KK™å'bį$±ų{ÅÅón1i>ød³~śXHųš=/±Ų–Xīś0al/¶ļ,6G¬ßėĆNÕ’ˆ`śÅąa³ÄϹ!ężW:1iĪVž!¦.üŲއģvÓ(ś>YĀ’]™ÆŁ §Š± ,Ƭdę}•÷sāĄČ–'Ö~Ė“ó½œēėCKźœML¼.EM/~ž„Å'v÷¤ÉFqŝś–ąiß3i¾ }^ģz›Ģy>YYę».n|Ūb6D±ē%ž>:]œÕ؇9½S/&Ÿ”Y3Ä›ŅŽ=§6 `ŅÄfŠćrB„¢MŲ|ܛ)®ĪŻ%Ą±õŽ%~įķ+ÖėČĪWēŲŁb£uÄZ]Ųö^yŽ8żÓ¶āĮ'Ųvžü¾I¼“6XŒI\ĒÄ+cń[٘5b§—˜?łq “ĻG-^G—ži÷ŽŻ#˜4;ī¾*^¾ŲGųł›Ļ“ęµā¦·Ž C?fėÓvĘ:ńå%ÅĖ—Łł:Ūm½øŗEs1čU¶}ž*¾AÜŲ$Tœūõ L9²QģŲ½‡XŗÅ &^ßäl‹÷ė*^’¦2÷Ÿ¾%¦ßj'>9ė#&ĶGkŽƒß¬*V=V’Yƒ|(ž½sYht»=“†ūi·ø`QŖm “fž¬}bš ‹¼ś$“¦ģ{ċ1cĢ]& `ŅD#²Öœ7WĢÖēĆ*;Å÷«X¾)Ė3NZõ”XbTGKėöf¦}¶žļńŪĪ},C—6bҌšń”ø©ę`Ėķ”Ƙxm‹’HÜu¹·åģ}“™åē#vŠm6$Īģ;@¼õmK&īŪ¦},Ż!Š+æ9ʤ™¶ó¤8wpń%{le:pJ,Óž'aūV³ĢßK>+žYw²šŚ£˜4eO7.¼©M<“ęłΉĖ$˜W‰l>{ēžoD_3o[ĻÖ§lł3bļžµ-‡n²ßwłõ“øż³PĖ©'™öM§Åju‡Y¶t10iŹ5’JüeŚS–Ųßź0ńzµśqŪ„”–ŲøĻ)~V¼0Ķ`ńnrŪĢņ‹EwΊ»~¬aŁ—Č,ó/];'Ī-wŃübńŽLšŌēŝµĒ˜ŸgūN£¾Wœł sR‘qL>GÖ^£&% ¢Ł|ĘϹ(zļ¼&,åŲśōL¹$ö’ضų\";_+_cŗ‡‹/—gŪē­NWÄFėFˆ%*±ķü^‘kāŽęcĶ3Ŗ1ńj}é[±ĻäŃāŸugā~gy®34B|÷“ęčƒ_Å!·‰oıĒ2ķ_¾%.¶ü.z—Ż÷+uGlŅõy”4Ćōe­ļ‰÷WĒHbŅllwO¬'%™Ƥ łą®xxO®yŪu¶>3ļŻėź[6ŌgļEß÷ń=,MS.2ķÓlČqå‘–_FaŅ4¬zWœž>Öbjść^–_Ü-{O¬żl¤%nÖ3‹ęæ’‰}źGXŽļxIsĢūO±Ÿw=Ė:c3f™ėĻ?ÅjĮߙ¬g›jż~_\P:ќq/É'ąĒæÄ/:– ^t=I³ėņqĻŽÉĀØ;l>wN?”ųUø»†­ĻĒ%ń÷±Ä«SŲłś<Š3 žÓ[ģŚ’mŸ×æę s/ĈįSŁvžy»—aÅ“$qf’KL¼&žźmčw5NÜzŠżn+ Ź×Šäē~ā[éטećČoE Ė.7ŪijēĆ«}Į2ß¾'lØŠ—Yę;¬)nčśĆ ”DűLšE~†ß{‰Įʤ2i’׳Š~Ÿj^UžĶē•ė~†Üu󓯣śt+^°#6Š2õˆLY)ÕKŚ ģk|ų¦} }KvJq–૱Lš²Ł% Ćj§XälbāõŠĮß°óĒ8Kf6īūż Īö±¬zŸé_kCKJ.ldé»(ČĀņÓ J śŁÜåÜ&Ķ“°R†Ö!)ęž?%3i®(e8mn<»öD&MēšŅ†n=§ Gdó™°“aēŌ;Āš³l}Ī…—1<¬×\løÆ€Ce 듉ż³ķׄ¬!ś¹ńāŽŚl;ē>,ką+gŠU†­cā|£œaźŠ$qÅ_c™ø’łSyƎśCě}~bŅ“ķ^Ń’B25PdįÕmS%Cµ§ī ­ZögŅōm\Ł Ö›%lٚĄ¤¶µ²!éɈąE'0i¢‚Ŗ¾ģ4ĮģˆOĀö*†°³æšé“Ö®ŖajPĖ“ąĘLY[¶U5|Pu€å§3æ0ķs¾n5ƒļŌDĖÕėILšˆ Õ Ē?Ÿ`Ł’=‹‰WūÕ ķŸI“œjĄĘ½Į꼆J^,oöz`faQ©i Cß M,M¢ZYX4¾ļŌ0üüžÆę›½‡3i~oYÓŠ¤Ę³ßavŪtķżš†¢»ÆŖł “ĻÉöµ Ef ¾ų˜wÕ2„5½/|ļ@Ÿ·ƒkžč×R¬ķ _«-µ —8°Ļ a†Ļv¤ŠŲ9šT€į·ś“ÄOg2ń:WĒ0ųZŖų09™‰ūĆÜ:†ńĆİߣå§hR]CRzKŃQ9ģśL=Ćsµ’Śmcū×¶æź~X ÕvL0;āóėģ†q7ĢŽōī׊p~EĖOėŁžu`ACCƒ7X<}iĆfe†¶gz–mēeKŖ-I·änećÅU ”łä<ĻöÆqÆŹśõ;57„æ”&:²ó‹ūšŠż6I¼āÆ{†2GøĒj!ėćØüœč$ēĖQ9l<(O’Z×·ežžUā‹–†ĶyųW֐Vyś×å³­ņōÆˆŃ­óōÆ÷/·ĪÓæjĘ“ÉÓæę|ßFö/Gxż–Ų6O’u½mžžu8­]žžt»]žžµņéöyś—Ļżö†m/Gž•<õ‰<żėŒW‡<ż+tV‡<żė-¾cžžUq~GŁ/Ž8ØĒ¦•ī$ūמõćĖd>ĆŌ«ƒ*uĪÓæĢ+;ēé_jēé_/­ 6äŚiæ`½~³tæ^ˆŒ—£ö+žC„<گϚyśWĒw„<żkc+1O’*õ(ū…#;Oź`żė¬¼®ķ1Č|įŽ£Ēķ,F֗%(ūÖ&¶ūńQʵü˜?=śD§„¦g&„$F¶o;©}Ūi)cķ9¼…ėāŌDAA-ZŲłŸ™œäŗ@µ Ēē-šŲ’y Øė ŲGRLt_^ø?µō4R/ŅXM7ųż d5>I K{Éń( 6Źc¬ŒŻĆŌiŻu¾ÓīzywqĢēßbX/^…”A,§5‰āöŹ#–ė äøŲÄč “ōŌqäWi3‚śd%e&*÷Śt ŠLŒIMÉ -oZFŠ„qŃ1ćc2“·Ć’–²šXĻĒČĖP_Ą~3XT ēP_œ¢ ń‡jX÷ {x |ī…ž}»—ō«ęGNKöˆč2Ä8xŲžiĶGĻ’B¶Ē¹Ūæ÷ą®~Å9ļ"^ŽTä:vźŠ-ølēĪ‚”łĄąŅ=ŊÅŠ18"¤q’ąja!Į‚!¤‡Ā…†z÷ąŗt ‰čÖ¤K·šīŻFõ(?®+×3¢÷ąˆ¶É\Æ>=#ū—‹ģŸŃ‡ė7 _ģ€źˆŌńɑµć‡UŹĒ8Œ›8²jęˆćcłQOŽLSnlTėń£Ć^įŁ&öÉaóGs“¢kMŒ­5&r|TæŌØnćĘć¹1±ŃĘųbQqc3b³āŗf„sKb|^LšIH;yb‘9ÉÕĒ'›3.hi2—’”¶~,7ķnFfÅäŌ¤ēŸ.ńŚ8.uBŠ1µļŌiŽO?ÓyBFŚģ)eMh9wj±©Ļµ™8)kŃ nÉsU'M~zŚ“AŪ³øÉĻ>3}rę²ęĶnųÜ“g—Ģćę=?Å8ćÅ%ŒÓ§-œ#ģyŽ{unŁÕ/ŌX:Gœ3żłEóŪ¬›_aęģ/˜RÖ,¬ø`Ö“ƒ3øóÓē-˜»nµ÷Ź„Į‹ēĶZ¹"hÅÜYĪ Z“pĪ–••¾ōāĖ‹–¬„óŠÅ/-Y¶ųšJīķ å·½ę½weĄėZæ±lŽ„%ÜŖWVX¶zļ}Ēgū«/n|}ƒåCī-›ķńŻņÖęos'r{öDŽŁĪż¶‹ū4»Ó‡;?ųųƒ×ΟąvļŻõg6wźdÕęw~Ö¼ߔƫŲ}ąŠž£GŽĢ9xąŠ‘ƒGrżųČĒĒsŽzģĪeīĖ“ū/ĻžīJšg_œüįZė§æ8sžĆÓgN]ŗüĮł ē~ü1łŅ•‹×®|ūĶwWü9÷·›–ßžŲ{żĘĻw’8ōŪ­7ļÜ»}÷–t’ē‡n?īƜYx‚WęĄ¾ƒ8Ć÷gć9Īg^āu“Ī_\>¢włŠ*GüõÓMO%æ•T|N±öMŠ6Xµy|R™Š™ ü.Ukw)°Öó÷W\hjeöÓ¶¼5©NŃ ‡}–L2ōßøy]ŁŃÅ×]ķ9aŠōחžtčM²’J•ž›öæŅżļ_©)Z¤˜—&”ļi.Vi×ÄYA¾’–7ˆä}Š¹×[Ų¬žšˆr˽®ĶŽ~gīżĢ—³”Iz­ńæn=}łÖ„āõ«æ²½g ūnķ“śå/®Ƽ¶ŽļāŌIƜ©Łīśo•hgāV•źó[§ą¦Ž?7qŹ’Vßģ{ąņĻŪZ’n‹łĪī7s–Õ0F¬«’Ū2cfĄw_e>Lzkrü؅æ¬+µ¦Ÿļū[æż-pę@ļŠ- «>ųjJ§}„Ī (Ž6n÷öŲYGÄR¹{Ŗ,žj­·oĢlßfÅ¶ķŠž^~ä²å;”śöÓ'~ų¢d… #Ęgœi±ØFĪ”A„«Q²ZŲĒ”>®{äıŁmgm9DŅ”“€ūo7Ż2øFDŲÉßOT){Ļ\ī]Ÿ}_‘†Žŗ9äd‰ĻūpŪ*……ŌßńĆõ;k_Mz¹¬_Ÿ”ƒŽ’~ļęŗ×ßžiĄļ¹Æž,Vę·£Ļ×åž>fĮ·n½Ō§rŠ»īī]æoęķ–%ƞ¬ņæ#‘»īšŸ¼śé %Oßjsz_ æ;>©[Ž™=óĄqŽ÷šÕ’õ³3Ö·{!nąĻŻ#vno]­ŻœŪÜŁ5-ėõö鏶VZV)ĪwĆw73' æüR«ā«‡m1u|źä!±Æ,ų~ŪGŃG×mń{¾rTx»„—B„ŹŃgĆē¼¾ōh룇šŖ¶ūݼēżļ> żśÕ1­½żäų¤gėóßK|ö»FĶŖØSrgösĒēÖ -ĮƐŽńē{WŪ^[SS0Æ»w}ś¶€I-‡|zĄń·Ź¾Ń6¤Ćėī厖X©yÉāļtŹ Ė·’åAO·ŸēŸyļt:å ™ć®­?=`zxvV@ŃŅóü~*_·“oĶ–ßtL˜<ė“;¾ŻŚ¬u…W}ĪuĒ­[ņdT§Ģļ›žņkÕ®’łŽxæ^÷bĆ#kų®š‰o¾»FT©ł/‡Æé:ļnP÷±Ē;¶,v©~lƒčN¦k¬™»ā‡Ģ{ÅKµßø•żFSēŠUy½ö…Š;;¶ó£bĆKœøųPRڱfwŖæpµÖŁ>{Öģé8Ś{Ė łń³* {ow(óńˆk_}kQčż%~~bSŌń†}›[źåztķŪ坰ØéŠ&Ā}8¦z‹œ«ūŠÖ93:Gf3ė Ģ™į\šT‡}Ęd%§93Sfćz Ä­émsf® “‰~|öŲ-š“ļõl,ĢMVPׅöęĢ6ćœY83£ńŁ“¬zī’ęĢČĪ™ćœYĪć9³Ā*2’h9Ö93ZNYsfX®ƒ‚7«’h@+÷Ų“Ī™a}€sfŸR™9Ūž±īåż¹‡×šŚNęœl$Ż Ä÷/ØxZĈ ²Ķky8¼øU««›Å2{ōéZģ2_„+Y½ņ9Ę(5Ļ$?†˜—’I.É#¦ĒEgĘÅ<˜™нGŸž±-āČū}® L:$\ŗžy«’dĻgŪÕČŪiŁż¾™šū…%‹śGesyž¹²żfÆČżæu»5įhIŁŪ@ī`ū»ŗ«ūäRŠW°×_ĄēśĒaŲN3ĒatÜe‡ŃßTd}ĆŠ£ĻĄø”Ųøō€qäu‡^l¾®ŖĒį±[ą±Š ļ+õ>^{4&•yš¤H)H½ŖÖ+ādžĒaźtīŹÆ=ōMuīWÜģ÷g’ćų±[ąægžó\ĶoėxŌr{_Ä*āßŌŽóé<0s·÷V’Ė'ŠŽ÷‡oi¹ØAŒaoŽ€e#‰Ö3Ķ}Ż„ųįŹ0žaŖVģę \Uņ>ŸGK³ū^]ÉdGBēĘ<}:ōŻIÓä˜ÜĪ>’|‰M©rLN ]•ŠæŖ¾U6|Ż ųėcn²Ÿåē Ó-xŸ;²e_©Ie¬×šŚ·żģ>–Ą6™e!żĪL^Žeę į؋ę×-ņµ?^Üs•»=¬ü8®ƒ9˜BZšCb*Ā™\Ć>]Üŗ•+w‰Ŗ˜œŽ„k9†$Uė³Ąkł€Ū赁Sņ„‹ń¹Bl£O[WU¶»Qč ņčė"nŅ‹żĶĘr ’+4–ó2“ģ9ØĖœ5Æ d}¦6“ĆS9¾rĄ>žHt3ēHĒ,Ó× eī67³ņmš–ó„‹!?¹§Ū˜¹g„ģ²S9üˆė¶Ķ ĮkŒYņåü"xé™ńȾāÆķ`’Bm`„-0-[Y/Ż-»—,łzb=Ž+°ŻŃ+ĀCI©&LųOĖó¶UÉ9ęIĻ[}—Ķɝūaµœˆ@żoéAiēÄŸ|B°†ßbö[_ź'Ü#¹^D4Ļ3„C:…^KK~+dåŹ’QVęq„õpō›kZN®]™+łĘ¹”m?#¹‰ĻéU˜æכXŸ'u?Zł×&DGŌó`/īŚ;:9ĶŽ“üßSĖIhŖ-7ņ³ä„¬;!-Į}0Šw„”ķ¼!®ZYUµ¦Ž(ņ/“żd‘kQĶ(Võ½Ir < ²¾ŅZ’Jų(łöĘł}ņĀbeUZnbj¹lśĀź¢9ƒżgDī?9ŲrZę,Vģ†åńqTnŻ™»ĶĶ”ņ€1ņF-Q/|īH/wśSnsE/ŒYzįs–^¬ŒøČdX«’–™˜ kQ£Sbā"3ˆg%%|-*ź1Ś ļÉö"7Ńv“s ŃÓ)ōčcĘŹļ"I} Į(ŽņmgłŻ·H 9stæA«ŠżW’źė¼¶Łp×¢h·Ø«” ·æŅ¾m#4čŸSȹ} ‘‡÷<(!ŽĀüafzœ3sˆŽäš^y¾ßR¤€ĮĪ ŃŖĶe÷žęą•8Ÿ0~ǹē?TāœåŚ’9ŅOǶĄ—E*8‰Ć€ūgDaĢ×DrścžX‰Ķ“µŚĪż²2Ó²2 Ś}€’”%Źįżp¢ķT™āai$ü†üī ¦VOŹxaŒ4ĪĒĖH‡?9 HŽĀ ó9¦‘ĪõįrļŒū ąE€E;dQœõ\ō׃²Ņć£cœńR…“«éQ® AŚ‹‹ø}ZöošģA©1ćć2OGŗüĒ`Ć9*{A©gōs6…ż'V’¢õśR£ßį5ĘF½uMNĢČHLMAŠüÅĪ„²ń.Ol>_¾”Øyqč[ómصUb¾½6¶qŹļōO’’¹•HyčO{žµŽ<Ÿ·ŠæŠč_&jū©Č'F©I©é¬‡łøļjzįM† ą_¦ßõžå¬°gVx®µę…¢ÜƒŻaĶ„M¶æŲĒQbÄń@|PÄ Æ1Dś()c3šŗ ±«émņ|r®éń閔ķĢwW”mŚD†óÉrūˆV³ÉsĻāc“£‘DŹ õ3įƒ:¹}ĀśCKWė7WÓ£^Š>I„½ŻŲ>‘ŗČ8SUßxĪ:L`ū6™ˆ±' ūƒŲ^!N؟Ą±Ā°~@.LO)ó8o{üŠnė7,5=)/ŠÕrL-“ó8Č0=¦GŪ×ĘŸ+ń£ćŸŌUžpFņµ6¬3 ŅēŚ'äŠ<ƒ¦{õ##™Ūł…§ß™é}:gŒõ˜bGbŚYš’õ­2®³¼öŻ“T™ĻŃgüßHn"n¬ł ŗ”^ŸÜéėĄ „œäŠ”Q/¤C½ōō —2æ911#qLbRbę3ČĢ1ź…z ^( õµé…O\‹Z*ö¹)(Ūę½ń¹^/5½<杙”86Į™6 ¹=£>ųģóXžXó9ė»Ü÷ŠÜ1_¼ģŞšÆ@YüN:_±›Ę+“1Šém…i’‰1ą(ĻWŠ|įxЧłCłŽ]58ŪčĒSʤCA[™Ž… ˜ÆxNV’1_ń?uTbĢó1Œeą(ģł ē5†”€sų+µöy]L/ݽ§öWWē\M¹v’|rĘŲ±×ņŌĻ‘:æ1ŚķŒvĒōˆæXk÷”©IYÉĪOq®¦Gż|Hw˽óDČcĒvGŖ‚ĘÖzÖcXÆ!k=ŽWWÆåśm¾;Œl-66=5+„@iēR”vóDÓåKœ'ā4óD¦N“^ VbSˆ6¶qŹļōŸ’ÅõµśO킹7-Ńś—³³0ČĻÕōČĒżóD ēĄBš‡°ÉĮ~ŽÆ“óDˆāƒł·–ćeZ|\ēq5=źĆMØ’Ü7O¤pŽ($|lrŽ#cā`Y Õ<Öz|ЦåZ|\­ß\Mz¹ž9cģ¹ö ꉰ_Įœ'ĀqķŸ#NŲoP« „Ī 8ZēźĆÉMfŠaÜ/Œ|ÉE¦Rųkįņ¼ęRB įs•kVā~a.ę›Ė—`)š¹ßķ”:§?É›ĀaóJ/ę}.yüOėa ńs…ģžĻ¾d` S×ķj*Ūż¬÷ž'o\t_™sĆußs:čÆį™śžśœ¼‰Mn,öÜ-ŠoŌ+*ŪµØl3ĖˆĻŹ‰ŪsnČóz/ÜŻ"̼»Å|ž‡ßä8m~€—–ŠäžIOŽ6Ÿ÷•“\H÷ąšųįūäxčąšŠµ#Gcr½č@ŠŁDō„ē½H^FżDgøŽJņyAż/Ż+'|pö°øø¹%[Ńųšˆģž²ü‡RPkø’P²Čņ%iįvIZŃš”4M–OŚ­äy[I*Śč \qņ'›03*_Įėܱupāž«ed›‘ļ;…ėķą²¬ßŌA:å{<č3Žóā$ŹĒ›°aŁR¹#Ųt·qC™Šķm÷ ~f:0¾æ)xZ{)ģikĪÕ{0ŽYG˜ ž+ȹ,;›œ<Š^<Č÷ ųī—̳ Ö¾D¾SŖæƒā8kūBŪkūņ«Ņ¾`»£gOŚ—Äō˜$FȜ¦}į[ŁæQXųéó‡×&cÄGūgńåŗhŹ+čūw¶/ü&Éļ%īŃuTPåČ6ńl ö "°žił)?źr¬×Õé¬m8m³­mųmچ3ĘŠŲ†;·: 4ąŠØul«-#2ł£¦Į{…›²ē:nĆż’Ymx›āK—ūąk²æiŚ<–Yu%뾚ŠØƒžž©ļ©ĻõϐžFE§ÉŠ9 EvrĢ¢cŻ×$&,:Ö}Fz“įTŅć6\oņ|^/9õ½fœ Éų\#mƕųļnƱžŌ·I˜Ew·į9“^Nh§­Ÿõm8Ņ”^zz[[Yøm8źz”P_›^ųij1“Åš.ÖÓ Ķ^‡m6Öćj:k›MŪhk›ż'm³i[iŌ”_XAW¤ØSĖēŚqw{m™@jenÆžy1®«EĶĄžēøõŠĒmżę¦üo¾!ķ—½ż3Ū5“;xŲīŚīŃžƒÄŸw·ył„ :>ś6K üŌ÷Ōē—’ŃĀRŚÆ³8ņķd~€ć’–ųZŽŽ½jžxø³Üč6ĘWģµŗˆøyKsłZ›ą„å< vOžĆ%s©Ź¼.™Æm søOy^Uf'’QäūČіŠ49 ’x¢sw¢'•!yŁJōįz(Éäe ÕåÖg‚’j$ķ;[¾ų~Hp d§ŌĄ’ńł‰–$Œ‡ž¹"Tøõ‚<Œ|ĶĖR¶Umń…ėUä緃fewZŚĶp„ĢGِžč¢›×ķw¬õ×?C¾z{t Ė­½ōxϵōö걇“yģt{™ĒžA޹ž£ļ‰·Žol&óŲēÉŗ»š^…ńæ| xŲł„Ä×F6ZWĻÖ|cø’ķŠļQÖ£ž…OÜc»‡õ¤£vĻ’M”zcäå õĀēŽō*ģö˜lÉa}z£ĪpŽcT¬'ÕĻ­cTŚZŪÄ¢“M¤m%¤Q‡~aż“¢S\y5¬}7x„øę+ŹRēļflŚvpŽĆwĆUžYóŹŽm“MžĆĮ¬ŗĒv’ėŅ“ń±Z&śśJ Ōź{źsååū:\Įy‹}Éw8 "ĻhQīĢŠčłĮó‚Ü+-šVE¾·lÅ.Ō> æ(É5ɗQDżÉuC²OŃņ`æ"“÷Ā=v‹2żBņnų=Ņž’vU¾†6ŚÓéōŪ¦·I›zN8i8ü¹ANÆņ¶‰Ž¤‹Ŗäņ䞀ühlPåÄ*@Mc½Y('ü½lŁ’ynæ’ķ󏓞tŌöøÓ09T^ĀUmżŒcl‘õŅÓ%Jv›h$2QŌ mƒśŚōĀ'ž­ķ-m_±½E©<ŽE³æŃģ-Ż/lPZbztŅ9kĘ ü5-žČqÅėĀŽ®ö“Ū@=L#žYcŠtģ”ƒÜy)›Ō•;^’ņ-–6?X#*Ć}}`ŻcŻ÷Lz¢æąŃ–ą±xŠ“·š}pż Ś[õ¾u†1ģY:†­ųQÕPĆ6W}‹E5õ`{ū’ū[,5Ņ¦ŃŹxź{öĪ”w`Ƈ`Ö•{Ų®a=©o?7“ī ›i½Œ1ņĘ<£^ųܑ^…ŻŽĀėCŠu†sƒb=©~Ž'”ć¶‘å2ü’}ņw­-hZ~…r “ųoēaßs }BūŸŗKOt„U„ö®/]Ŗń¾M„`]ē(F Ęz é•{ä;nØuõ£žÓ8ŽÉwœŹŚ2Ž'6nĶĮ7āØ'œĆ{ėGĆ:*c 0ŠŽä«#ņbŽcEf9®¬]ėlŪÓč|¹pĪąÓ•|¢Q_ΟÜ'šUŅjcx䉲 xyéVXņŽ»Į÷!r¬œcr×n@żķ>üŪnF,·æļĢNŗ/ QŒŚBÆ"ęG“²AÖ|æ‰béFĶļ)q~ū„X7”9Ŗ›ŌŅ\=Ļ„~ųÖ±| ^H‡z™¾ÕŅöXõB=P/Ģź z%eM"›ŗ‘Mh#cČÖi.npœ‡ĮQ/ŌõĀdØÆVÆĢō蔌“h¢eĢ3HéŽō‚żpŠ/˜ūį¼÷¼¦pĒ~8P籂§öĆyfĆĶš*g;†ó{éž7ŁJA÷É0©öĖp¤KļüŽ÷Ųž½4_øooVņ‡zńéÓ58[Śß§ ½¤wvKœ0Ņ>++ł@Ž_~^W³æØH÷SbĢóqį퇣-G öļD8ׇüķßĖS{ąŗw“AkSض_ēź~6®¦Ē\śp¾iĻķß[TīI”“GcōóGŸ8¾õdķŒvēiyD<ųp­Ż]ŻĻĘÕō˜+÷,¼M›IÖņ[,»£Ńīhg“;ņAöŻ¢ \)Ć>ö”į¹oŁj6iī:C|Pš|`ŠJęé²RG‘ˆācź”ąƒø™zjń±ÖoNĪ÷øšņ£÷ķų4 ēS”ß æn‡ĀÜ#>(>”÷šķ Äńį{Q’A?ź­Åg`j&™*,误(ņᯫémœ<į?Ć)>0J÷D@|PČ@’±É³įƒx >&Ś.#n¦>Z|ś¦¦'»ņīŹÕō˜/.›ä‹Ōonėo„ĘĒ? ‹ ųØ÷ĀB™īˆčo¢ąiæ$čüˆā‚8”.ˆßO‹“«żzWÓ£~^Ü!ąōEXʼne=”ÆžoĘ{ł‰'›–$-N؟Õć„2Mżµ89ÓĒF^»šy¹{æL¹o¬ś]•¼ę Q‚Ę€S’ēqæL=ī¼~¾ĒtžūłČÓ#?Ō åXĒa”/ŽŪ±žTó3Äųž÷ß   1†ŅՉüć ~æ%£Éäo8Ņ‘UÓŪÆG0Å?:nI“3#Šp÷ «ī©ü’ć9$Ęq™Ü_KŽžäpW0F'ÉĮ’Éŗŗø¢ä×č„\½>ļeČQ@ˆÉ³^6^ƒ-€g~ƒ…bZwÅPnĄ¦ywę[Æ;čą@…ä™>»Æ łä>čēnyöųŁó K!É}ĄĪźžQXył Kķ“rmĻNž¼Edb0’OʲĒ{- 'ń»ƒ|‹J>œŪÓQņņņb¬4yݧ®téŅrzxŽ A©gĻžRēĪ„Ö­[KMš4±Ź:tčÉŹ•+K5k֔š7o.EGGKÉÉÉdé6,_¾\jÖ¬™|Ō­[W¦ÆWƞ|Ż®];),,L4h4eŹéż÷ߗ(d<*Ɇāų NčGśuƒb¢]śŃPWÓ£~äŁÆĘėY’UYP܎Õl²?C|Pp²į³Ž“Y“‘£‹Õh;Œų˜tķ1Æ[ąźŗ%WÓ£eĄ¤Ņޜéwżŗg%@›Ž <āć§²ŹtGŒų ąiĆĒ&ńA<¤°öŸtėȂ"$q*v5½MhoĄĒ}ėžvlÓ¦txŧ„]«Ł¤;{†ų ąųȓ)V¦Jż–ćCʱ“ŸŗŁĆњD󾂩z“Är€÷śąģ=õ;…'¼ |4Øł«Ó๜ō¢‡Lz>¾Æō±žUvĄ²-—e]RɈś/ŌņxœŽæ­ćń:§ćōGÖ׏Ēò’ÓԜówī\*oG½)_*ū łsŗõßOŅqŒO¦¼o¢ÉWŪ8Ł?Ė”ūGaLę€IūłwŒĒAn9xÕxü&9Ēšyքö¶³<µ¶³¦§tćqŻŗ®A™d³²±Ī’؏«ém¹1¤Ż¹¾ģł}Xmgż oOlgQČĄv–īĮHīØĘ+>^JyEÜōė¹Č¾6™Ń)1ŸČ¢™u5=eC"÷­/^FĘį»ĆLŸ’Ęå@~°$q8żżŪ8ĀDń@|x¬W(nü@ķz»ˆøÄ± ™6+ōĢÕō6yŹŗH÷āóbŲę|öS#\xćp”łA|”oetć<ŠāƒłGÜLƒ“ųøŗ>ŲÕō؟ū×/#ćš.a9ŸR*«”LwÄPæĮ|#Źž6|Ō“ėV±Öć„)ų!’TœŗČćq7®'ķPƒš\ŠSi†õŠ.ĪʈŹ>öqR$=¬sÅ~~]ŖBEz#ųŽc¬i? ĒeĄOīgŅ~„µŸyŒö31żźę>CŠĻœ!gś/yˆ\–óѾ÷)Jū•%i{]Z£½ņĆ7šīæ9Ü’½āśhĖȚLdŚöŅī+vå<Œʁ¼>P™¬ZY•ö3mų ˆÉOĮżČ4B‹«ū¹šņ£÷õ3Ÿ¦į&Šģ÷ꉀžƒr@J‚÷qÄw,’”x >¼?õō£QZ|\Ż'ČÕō6›yĀ*†o¦ųT°ZĶ&ŃgˆŹžč?6ž*’”x >&Ś.[żh“Wūń®¦Ē<ø’»ƒœ0Ųg(‡ā“W’ŅäĀ8MP9ˆęĖėüˆā‚8!ÕŸžŅāäź>A®¦Gż<ƒÓa¹Ō~eņš£qB9¬ē0oJ¬Å‰§żY=N˜Ę©ÅÉÕ}‚\Mz¹{Ÿ!¹o¬Śg(ÆļGQ‚ĘPßÉć%:>²Ž—šūsœŸU7^ś§ģĆLJ•zę2œÆf¼¤·‡© ķߊX’œ·­›Ņ?¢×9”q’gĘKj”Z¹¤ŸŖČJõ>Ģ;ČóņÜ~œ£CĢ?Ėæųh­¹Z¹šsć}˜‰­¦‡ńe•ńR^õ źQŠģķʁōZ\Õ•~ģÌåŠcū0S’FG-xœ'Y§ó÷^ś÷päĖÖšŌŌōXL™æ˜~ 'ML!æ–ætHU>Ą‹{E¾Ą}׋8ōw¾ķ/WWbä“’8ˆ|ßów¼‡¹žäąˆ_ƒ|Ŗ÷pĘf‡8c)xn7 æcžŃßMåµv0Ńś{w²~0 k—kŽ7]M¼8å{$÷Ķ‚-É÷HŌßy!źąLŒžn“ćH’mø N|EZn±üĘjqruąjz“'p’æK¢8ĮŒ'āa-łĆ qAœL•œ?Sœ§!C]ÓŽÕō(Żżķ§’”ųųßĆØż`ŽŚqB9 ƒ-IåOĉÆBż żj¬§~cʑßsp>®¦Gɞš§ųų#a&Š“'÷φ~ʁüä'Äq2U„ž„~• Å)<:™“Oh­‚Ē®¦G‰žĮiUŲfŠ“'÷ŃœPä'?8!.ˆOūSˆ?N‹Ó°Ä—ÖŅ»šŽ“8ųdtXÅÉÓūi£œüℸ NhÄĻ4^‹ÓĄøų$Rń9½3½«éQ?OųӉO|Ćr)NžÜ§ü åä§„×ūāūnżw+<Ī»ą:E:/†ėy½©į }~˜ł™č¼ŹĮõöųæƒĒļUōü0=ņĖ”ü"/¾G§zāw8ŸŖē‡é‘®;C9Öq'ņĆy:o«ē‡é‘5‡rxœæĀļJ±Ż§ėĢŌü $1ī—ćhėQÜ(Ž*ą>Ö*zv=‹Ś’cć–D39¢čēp^{*’…äøA‰q\&÷ג£?9Ü „ŃIr°d²īƒ.®čł5:!WÆĻ»„Gr$bgņ¬—×` ą™ß`!„˜Ö]1”°i^ĮłÖė:8P`!y¦Oćīk#C~¹ś¹[ž=~öüĀRH²A°³:€ä+ļ¤Ī–š i9‡{ł8@–Ś' FęėEb<ģŻĆg¬Óä­G‘‰Įh•Ių’…™’·ù|Škł>9ĒŲ›ž[éÉ5šĀtj¾ņ¹MƵ(œŠ¾ é}}8©ØÆ—äWĢK*āCöŌ%÷Š!ēä^o9.éG–½•š–Ź–ō–üy/©9*”ö‘Æ! ¤ś’Žås_rÆį×?8o(orą‹zYJ¾ x5©[\ŖS­ØTÆf1)°Nq©I½āRO”²Ō©e©]³RRPĆR«ĘžRH›²R‹%¤†µy鉄„fõż¤Ę$mŪ¦„¤šäē!­ĖJķIąÓŪPEźÜŖŒĢ«]³Ņ'Q¾Š¶üÉŃ}kIi‘¤IńM¤¬˜ĘŅĪW»J»×v•ŽYjŽ_&Ż5Pڶ,TŠRWŠ\Gz>„…4 K5©OhIh[Nź%V–åuķTQ>~#{ה†öØ! ī^]ŽAß!•¤šUŠ=ż¬ņWĪčxR’fIß&}³—tśĆdļb#92$éBŒtļT¤ōƑįŅĮ7zHēK’;%}½wtdKOé’y°4’éÖŅŪK ŅźY„Q}jI¦Ģ–’1¹¹4nd}9Ļ}‰Ž ä_lWNJQ_źŚ©’Õž?挲HŅӒt-^’®Ę¹S¤ļ—¤_ĒKŅOć$éF’$Ż$ĒåXIś#•<Ļ”.ī,}õŃéõ!Ņ.b«sŌ>p¾å%Aš:¾™“ī…ĪŅrćҬ AŅ䄦ŅKSŚŹöŖS½(”Ļ…hcr˵’4‰š+Iß'H_ļDĪg“ƒč:H“mĒŻ4éĀŽĮ’t~Œ$}7Vśéć’ōC‚¬ĖO9#䓣ÆEČ:Ł9@zćÅé½åaŅ+3;H¢I’(“D¶å—-U¤æt;E¶™ōk’ō#įzH‰ż„g„g£e\rŽPģņWŗ$]Š•®d‘>ŽŚKĘH’&Jļ. •®%|ÆÆt`Sɼ”»,{įä¶r™²QÆF1 ‡ŗ-,3Ø[õPŽ>y§“g]7Åę$_pžūÉ'%édžß’2rb[é0Įžźž”²®æ}:Z.Ÿ_¼ßOZkź$-™Ś^Žß|I”meŗ_XU٧”^ ²”ģ©ė?ŽŌ#kĮ’j‘² >e'€ų ”õE·“ŚHS(†¦ĢVŅėóƒå²ųt\cY—Œ1¤Üµ’f§·$6./ źVMjZĻOŖTÖGŖXĘG">.×K4ļkI¬ż‰n7 Ī)NhżI}Qœčé īś¦A-^.ßP/Ō—ė^jĄĖ¾]µ‚ÆT„¼Æ,蔎‚“P?OšoČū ½`Õõ»rŻIč! P^ Nū@żśA}õOø‡õŌ”˜źf8tõ®Q%O@nÜP·C ·|P^X߃N b”i„%i4õ¾­Ī·žÜõ ėr(:t>z¾ö®!ź ¼Ąęp€ģrä'€o\&¦•c5_ż¹žVw å]ķoä2Ļvz—œø6’4yٜ0CņÄBŽ‚źi šg¦䁁`°„=]nŠgFČį©¶„ņf œĆ÷ ¬ūXÓ}«­ūX›č>Ötk‡ūX;¹ß )Ć\?EŻĄŸ“ūŚĀ,p„żåƒķš=ŖķPgWYū«}f”÷•!T$:čiÕ<Łē÷±ž’ßĒ:g•ż}¬7Ū¾ĒŅ•',[öĖł–:Ö½ĘĒo¢eč‘ӒU/Ŗ2Æ<·=stó®FB€~¤ß7Óŗ{ėź·›Ńś/ukė>ÖH‡zń:zwļcš³¢ʘØs  ½š9ź„<µżśæc_f“ź…öE;j÷?ŽI%?ę›2Ö¦¶ŪĻŠ^Øź…‚P_­^…·/3śėf_ęOéśĮĻ”8‚1ą‚e1rgģ±}™i¾š;@žęu’ēļˬģéKVļiŖAæ#حĘēcX# Ēæt_fj|/Ģ×ŅŚåæŗ/s^ßĆØż» eźļ(R! Ńī&Z±|žW÷eöä÷-`w“3ڱC<žkū2óå”ļÜ=ł½ †QŲūŃöPł>O^oBŪlw¬ų`;«ß—łv ÜÅD~£#.½ojl\XFl|÷¤ŌŒ’cļL­œÖ’æ‹rT𔢰÷94G"±Ļi Č4SHĆM3%Ń!rŅ”ŁLŃpÉ fēä !M¦Ź. dŽėĘužßĻZė9½g+äŌżßßļww½ūłīē}Ö³žõ ė]ļ~߳ߔWXŪ?B}‹ųŸž³īs¼Žud÷Ÿ§ü.sĀĻ«i3Æöæ5«(ż#6•‰·ś’ó÷łō×ń®f8īaUōļMfh?³ćWįüüau˜sÆ÷‡µJż]ęāž}}qŪ›]%õU÷ļ¾ßĆÄŸŻŚŌ uø£ź°¾‹Cń;uø½ßSźy®ÅĒāań±¼M qĖIł=ęāž}}qŪo÷Ļīū=Ģx+ž>æ}ˆĻž¼ļœųX?Œ§„¶ Śvō;]‹ņ¼,n©æĒ\Üūś‹ŪŽ[ǘ»śŁ}æA|ź·éā³Ēļ7/¬S×vZōļVsĀ<Ÿ'“Oż]ę?} ‹ŪŽģŚż·ŖcFäļVo}mvģ*ežr÷=†óšŌūMŸĻ¦…u…ÅÉÖß%ƒ ś²„ķūĘßŗ&i_—½¼ĀhŠoæŠĖU‚Ø<õž?ōÕDvgiė60<¦“=õB’m\ļ)Ųɶ^üéŚ:jŪ]Æ,)Z”mg}īŒ-űƒńf’‰~Sķ™'µķŹ+.į?3ęŌ¾ķ3¾@ē}åKŠŚī.JŽąÓß{ķĪq§ŚŽ ńß0`‚ö„¶ŁŻŸ³wŅ\|ģŪŻżķH߯źBĻĻ·g’Ż 6āēč«¢śüź÷śMŻ/;ŪįįēhMf„źę³=»ŻčŽdŠaCµµ—īä>æYö|x{F¼ńM*;Ż¢r;nkŸīŁŽ7żń|śŅ„KŁģ™õŲaņ;Šėģ±ż©6GģĶō_˜{ȗ*UŖ --­`æżö+Ų’ż *W®\P¾|yĒū#6Xߌ]lą[WDś_Į>śF?}W¬X± ‘HŌŖU« N:‡zسaŸ}öq2;óõĶ~ü‡Ż*TpŲŚģ°leÜtPAƆ N?żō‚cŽ9¦ AƒÕ«WwūŠk9ażŁŲģ3}ak•*U ŖV­źĘogžg:э½ńx¼ yóę]»v-čŽ½{Į 'œP‘‘įb±ļ¾ūīŠÖ7}¦ 0.³1ŲP8ˆ?ŻśĒfśÆ]»vĮńĒ_pöŁg»ķ”SN)Ø_æ¾Ė‡2eŹ8}“‰ö™Šm<ōm²‘ńg Ū«£õo6rČ!nüķŚµ+čŅ„KĮqĒēņZ’–SÖÆ”É}ųčŻAßČE…nžC[Ė•+ēbFŽ5nÜŲÅæI“&|°ó žŽ)µ’Ła¼@ɽčü§;| ,’‰ysąŗ\ ÷ØCĘž{5ŅW4ē O—L‘—śļØķ+ó5X¶lYē źŸŠ7ńaģ;Ė)µ>vFæ*Ņq䃜ŸG’čĘōC¶ń¹˜}cSv¤ĖT7˜ŲŻą³I®Č&E;o”Ÿ/¹"qO5@Ÿ č·¾Ri1śŽļ æ±šØõ©żģč³GĒ·3L¾GėmG}¦ņØÉĀćb1śĪ–āßóyjßŃĻŌE~“ķÜŁ8£ü|Éķź˜£ż¦ā,ü!&¾Œöc˜ŗb_¶¶,m{ź…/Ł[VŲĄlšwéUx`øļÆš>ĄÜp`ø?š7ļ"¾ķZ®ß”\%‘y|É É(ö÷Gżś*ĻG_tß’ŻūVs¬÷īīzĒÆ¼ž÷ߘs׎ļlßæ„»ž&'_8‡DŽ,÷ŠŅ?z`jž’Ńļčų~/[VX„ާerŸÖī|m u[÷«¢õŹŗš~;“3»r¾,*]]qQ’^Cw§u;×ež2;Ģ.‡Ł[ō¾¶ßżvf‡Łe#1{‹Śõļ»ßĪźāßx杞c篓Ē?¼™ļæ·_ļ<¤×.ž–ŪŽ“Ļ8łœ²_~«uŚźpæŻ:O—†ļłsīōŸiū[öķH÷®šöŲżva\vßCŚ›Ūǃ}’ł÷Ūłēģ'[£÷Ū„Ķń×õÓ(z}W|^Tööżvę»˜ó×¢~łæzæŻļ=’Źź¼h.üž'Ž+=4!˜ŸĶļ–’«÷ŪķÉēZįwó³łŻ"fńųævæ]Nø`O>‰“Nė’śx¹ß.g ;o‡ć«gSļ·ė¼ƒß{=éŅž½wńļšÄĆÆ¾ZRģMĻ*žp{Ē÷ŪåĢõóŖŃ“‡Ā燋ηi=ŗøėõiŻ~ŗś·ÆŪ°Ä’Žźæū>ośŻšB,öčó¾œż½×żµ’sķßń«pž žH­Ck•zæ]Wżųץ!¶w×iqŪ[»’~!üłįāū ļćłuuXßÅ”ųß’ŚŽĻŽźŠzŲžū”–§§œ”|M½ļ®ø÷5·½ dĢ?‡z÷ŻIĪ×j³4ÄiOßwgż0žeDa…xX|lü·ŌūīZõŌ§§ ż ZÜöŪ»ĢrĻ ß}ĻÅŁąž¾)ÄgOŽwĒńĢśa<æŽÆŸŲŽZo„yü^ żZn»7¶'éæCūļsĀŻ÷g|‡¦ĶłÄ¾O ¼’ņ½ožė‡ŻćrĢ6īq>Åż>€ÖU“N=N{ōÓ«?ķ1u­Äį÷=b%õog/ö3o»æ+ ėŚĀuΠėß_=_ü?ō9&ūh¼ŃļWRĒž6ĻÆo¦ī’qūßĶ§ī Ÿ’g?ĒÄʝz|¶Į¦Žo]Ü琷½Łµū‡gĀ\Ū:m’÷]ūüĪŃŠģŲUjė\ė‡ö;?īść4Ļ1±<ÜcĻ1 õ]Xļįūā4;æżĪėæ*ąĖ“XŃē¼ę<źūÉp>ūTQJ›]{ń|P¾Såo¶Ąuµķ™WѼ Æā?ēÕüaõž6ßūĆFvJŃßµ.īłNqŪ›]»’ļČš§žŽ,Ō{ŚoT”Łšg(õĪzÜśAqå9Æ­K’łe£w‹<ēÕāańÉYņ5äqĪ©EćSÜæ+n{Ęć_Y×īĪkūŸ}÷p|¬ĘB|˜Līøżö_=ēÕāańI[äćcqK;½h|ŠūœÖā¶g<žåć³ūĪgżs^ū„ų”ŁĆń±~‹Ķ‹~ķ[ōļĒ,ŸœĒCżXu,Ÿā>§µøķCpDöDżTm“āS¶ŠkŪ{ÜČę7ėV?Ūõo’¾ĪāańI Ēe‹[Z§¢ń)īßQ·½aĻĘ&i_=m;~ē*@ó‡ÕWγŽÖ*§kŃś:sؐ^zėcūw•·żöžv÷znh½)̃{ņļŃŻõ‹Šć±õ„Ö{æ^‡xX|ŅņB¾†>»o=~Ė —\ņtė“*žū«=ł»PÄĒśa<ŪS|?ĶkdŪĀś ń°ųä„yÅź(ēģ¢ńiß«oļ>Åx~`qŪ{ūy_¢q•ˆķŽųÜÜŗnˆĻļ]ŸŽŸ¹Ż¦ßGųŻ}ßś”EŃųŒŌõüķń±xX|¬‡Ā::·h|Š»ž.n{³o÷ßēpĖ Æ/kŪŗ}šŪžü}/īs°~ĻöųŲč )ėńpN“µČ9ļ?5NmcJĘvćļ×č8T«MŸ§ß;o2’ģ*„Žˆ“õCūĒÉkFžßQ±õĻNGžWŌź/-Ä·¤Wē®Ć”Ļīć4}©ē…ėĶp’™Ų}š©ś¬½ékĪW¬ŸĀļūmk×ĒĀł`Ŗ>kośr‚>ė'ĶĘkśĀ8ķ<2UŸµ7}Į1ėĒīó.ŌīS³ł*Ŗ/Kķļ]~ėwh‹K«Xn×~‡&"’[yaö’‡Ņ&²+K[°įqŁS/ōOŠö•¶‚lėş®­£¶ŻõŹ’¢ŚvÖēĪųŲR;oöŸč7՞yŅQQŪ®¼āž3cNķŪ>ć tžŃW¾­ķī¢ä >ż½×īwŖķŲ’ &h_j›Żż9{'żĒÅĒ¾ŻŻßŽōķØ.ņ’M}c~Ž¾Ø?5vž—S2l<ˆĻįyS…ćę>ŅŻč+Z“Y)ū eŃĒ>+ÜfĻ&ā™GéH<³)]ϘJÆYZĻ_ŚWĻLŚĒ=éŠKT._Ņ=_m=c­²ž§Ä3"żō¶W¶€ŪĒó›xĻVć¹]<’ķąj„Ü3—x–Śi­«»ēeźŁU<ļŒēLń«+øē”Yo?÷l6žĻĘĘ>žĒÖžøœ ĻoJ—^õ7Ż:Ē3•xĘRēk\7ØqĮ =ןž ɂ&& ŻŃĘm3olYpćeM īÖsĻ&:Ŗ`üåG<4%³€gQ]Ų)^š—ss}5®SÖ='ŖIrōģ8lāłq< ­c› ŗémjļ—ożkŒłž™pĻ£/ž+öŒžĒ3æxŽŚēÆœSšāż'»ēĆ­ĻÓ3ĄģąžŪõŠäĢ‚łz֘{Ūu-ÜóāxÖØ¾õ_Ī×3įč›gY/žu%FķŽ«¶ĀśæūścWšŒ±õ,¶o/-Ų¬ēŽżżo] >Ņóʞ»÷Ăūō\5žõęŁtßŁÖŁŹ³×xöŲ“w·Õ3ŅĪ,xķįS VĶ?½`Å£§9æĮŻæaĮ“ŃĶ x&ĻējV?÷<¼#ėoŽƝ·¢`s_×ļF=n„tĪæ­µ{¾×ƒz¦Ų&=‹ŽX`Ć=Sg«ĶŅséęčYpą»Ē¶pŪó³Ūš,6ž›Ēsķžę9q÷h’%]ӝ’nXĮæéįå ż’ä=ķņæ[y~ĮėóN-X¢gŽAŃÅsĪ~~§‡ž‡v^Į÷«ŗ¼¹ØcįŲy6¾ ē®ńÜ3lyxJ–£<‹gł-žŁĪń?Ļ‚ėtĀAīYƒī9‚µĖĪ3ĒgNē¹sųńāūļō ¶WåĻ­«ō,6=wŽX°’==«ynžĘVrćՇNq<ā=ä0ĻźĖV x.į -Ŗøē¤QŹķ•mń?„ÕĮݳēōü7śĘOÜÕ¶ą=ć\ųĒäk,<ßnžžOHžń:ĘN¼±įž±Ē*?ڹŲQ'ÄyuB]'xĻSßŃcaÅį½ź}ÅsŁž§ö–Ŗ/bĻsõØ=ā}ūµGĢŅóąš+~~VyIą5²‘ŲSGS®:Ŗąņ‹wć&÷xžšśe#÷£óŸ>ʦwm_SmO.ų~uw÷ >ž9H-ž²¶§{žąŁpÆja¢žÆG_ŌßŌ«*ø%»¹{łŸ¾yVõĪ3ījTŻŪś†N§Ć”WG}žŠ¹’qS’ä9°>æ‹āp–Ė=āJ¾ńģ?śĆžĖųÖć=ä:Ļb<»ĆĮ®?ęgénĢż;{ĶÓ÷ĢHęMžyAĒC ®Õ³'}ańe &ÄvņØfī9|½ō¬Źžšó8ŗv°e‹·³W\;°ĻµćøÅœÅüĶÜߤn9÷<>üy—ę».zĘ$ö”¹™ĀcU8f™žĶN»XE^q}*“AŲ=÷ĪØåĒ ž‡—rLŪŃxGßqmäEm¬×fm‹KWH:w兟\>ˆ§’lµ’=ŸKd§ÆŽŚ“ÆmWm Ķ®Žy§FhG–6ü/wdĖWa_¶h–¶=õĀ—lŒ-+l`6ų»ō*üšš»3ö;4¦$-ü>}6zj«S{ė5¤oĻžš4ifÜ]£ZS¾–¦üŽ;źqŲq;ڶßOnßŪ›ū ŻŽĆ½ęāE_Ū÷ÕgmwLw÷óč.ŽÅō“¾ÆŹ±Ź±2ļĢlɶŻŅ½cmbY{ [ąń—ßöŽ•‹é` ’†#ÕÖķ­w/¢^’ū‡¦ż=;ž?~÷ž’O¶'5ž³rš=Ī“ģ*å{Ül5²:JżżÓĒļ—ģĪWŸÆżļÉÜ’MŃߕŁ+tbv™œŁ•–"_ōwUž}æ÷bv˜]6³·Ø]’žß{ɖļ̳Ėbföb׿ūw{Õäcu±Óß”YŅö‡ź£ĶŚXģ“Īžbā<²E÷ü™ ŲŃćÄvĶķ©ß”Y|Źß_ų°×^­ÓŽ ?ō§KķŗCä~©ß²/ÕŽ]ż¼Ē~‡&ŒĖīJ ć3ūŅ;”H³›¤ŽtśeĆ]6ĢVÖī÷ØÉĒ}óß’Õž6:Žrܝ<÷ķož>Šœ‹Žļņ+E˜ń?ūwhr‚?ģśkŚ’¢~əō£õzęeC.éłēo3‰·½……ū»ø× żÖ·ÜļL1}œ9š¢æōęē“ūć”8Ž Ķæ~ļ> «s“’£”ć]Męgó»å£Å#mJQæwŲ’²K’Ģä +n{ß^:„ŲŻ~?ņČ…~ߓ÷÷ąwó³łŻĘeńșZŌļŗ/jP%ü„½ü©»wŠŪŽģ‹Å;æļĘūvŚyä…mrž ÷…pŅiż0ž_ż}ōīžÓpœ±ćŽæš8[7åøóņÜ7ī?½Ž»ćß”I{9Üæ÷j8ž¼V”Ś8’8åyaĢYhćo¾źjŪ}ƒUEćEæ»į¹oĮV‡9K‹wŅn)Z‡Åż{»ā¶7wģžæ×ĆŸŻŚÜ_x_[Qo[æÅ„wØĆķżų:Œ~Ā÷ v|²xX|ŅBŽZēÜZ4>Åż{»ā¶ßī|ŚŻĻ}[āó{÷7n·cאÅĒś”5™P”ˆšķń±xX|LĢā–v{Ńų÷žÄā¶7ūv’żž¹o›B|öäļĻpߜõĆxv\©EļoĢ ó|jœĢiwSq’„øķͮݒw,’Žē¾Łś<õ~;ŸĻŚŗĀādėo;žu>!›”@/½Ę?Ļ­ĪNćnš=ķ|Ÿ’M;ÓĶÆößżžLsµžf`FsöĪ74¹ļd%Ó¶#Yķ)|ų€6ö}ō«Q¬=¼4mĢ…{JÓr{MčY•ĒyĪöw}—ķ^“ßSuŗ(ü}kó[ź÷d&Ē÷d»óµ)ÄÉØé6?2Ļg‹iūĖ®ž—ŠŻčqĘ ė5bŲeCŠqśgfģ”žŖ<Ļ)„ø–kėīm!IēŹžóĪžzB›¾CōóąŗŹĆõ„?óŅeŁķƜļŠęł1·|~éŽ~1­Ŗ’{>eś#mšė‘ū-śā8B¾ÕäCŹ+mzńĒC’Øż-;l_qĒD?6žÕO|ÆX,&\y-©ĻYJĢs„oXńu¾ČBm±ÉsŹeÕKfMm|¶—Nā•ĻńŲä2„#|;ūß/Ė–ŒĶæuÜ0»ƒÖŻźēc£¦ņ²ć™ķ’-»žŻ×£8ßµć¶bsŚmϹyŪī[Ąžøųvtr/Éõxæ¼AhƒO(ķŅģ8š’äČõ=ż²ćŌžīēæś‹ēWZ”[¼(jęˆ•‡.¾ī’‡ŽünN~YŻ-ōž]ž÷čm]’ē;V¼nūæxēUøzU²ķG£ÄūŗVßYž×«RõĢ·\$^•£'?ģyOo•łāųVāxāʧ<ļĒie¬T]¼¶,õ¼–ŹLæzU^Ły·ž[qēu=vlę»·uÆe϶xŽļęd¶übé²ó2.Ā Ų|–䐍ČuŪß󎓾}e#ś¾®åyō‹ō»’ў‡}ĻhþOō¼‹%óOÉ2ŽĘšŖĘ²$gvCóóKŅw’‹GA=‹żvtq›_Ūā†}§ŗųnŠ[|ŪɶÖ.Ž=Šņ ™l[ķņeE%Ė—»e1^’Se_Ė«‡WĻ[HŒńĘūk“÷éó—å—ČĘbĻėūr~ŽŻ£{į½zTŁü÷ŗu,ĀėÜØiž`mѶ/Ję ÉFyć„k”tFyļ«Ļ§Õw”7pņČüūŸž»(Źū»äŹk“,™ķĢs6ß.}½^ĪOFåŽVæ/U63Źė'ŪNoŌ“ļcŁ–ß­cŽ}²ķŗŃ½‹š&ɶ7žæ¬ļ¶ń]8yd^KŁöfŠÜŁ6.EßJٶ$„ß.²­«¶čŲž&™’ņr¤ėŠ”ń¾„>[©ļčx±mkĆwFyŒįr%Ŗo¬ōMM‰ż®M‰ö]”_ʱ"%®–mSRņå$ٶ^±‹ö;üż ‰±Ł÷öSOßtš†¼+«Ž×!¹ŌŠ,]h„Wāū~y·Ģ™"^ŚĘqWy^ć³FfžwbüX¬æOž,+żō“Ē_æ”sfΆĪā]sĪ裞wś” “¦OkĒlĻėæµ_Žms¦ˆ—¶qųµ^_oé:\:c±OžģßĻóFɎš²'Ėŗ¼Ō Ļ›,żW©ŸXlōģkĪ){\öM•mHg,6īŖ“^īŲ³Fęw<±Žä¦N«ŁĪĖØóŠćKé\ć—ѬdŪµUĒē’«·Ė·M®ŪŠėƒ÷“jpióÄ“¶ ¼>jšuå ö•ŖęõĮ{U<ģ›t€×G]Noąņ6¹Č‘/š&:¹Ü›‘c¼V«ų~±’UVNć?ś%ęÄq`»{ \^0›‰/¼ōg.ZŚüĢ\x賚 ¼Ā/č#ÆČsņ 栏Zk¤¼Ä>üŒ>xMÅ[Ś<÷füŒ>«}åĮ™Ä }c3ųä$qCŸĶų<@¼v.ÓČōŁ”ŠW'Ģ%ėś@ŸĶ%–×mH]¢Æb˜_¤ÆuI>ƖßßĄå„Ŗ‘ćÄceą-m>é«›s*O©-ś…w‡«ĮfPƒōkóŠé£¦é7Oś˜›ŠgµosÓ@Ł·m²ļ·Z˜Æ°/”9‡ńŚ|„šĪūųnßļIŖ·V3õ¶jŗļwĀ?K¹9l€ź¼„Žƒō»uqEǣΖ-Œ×ę5£ś/¾?Āék›…>śµ¹Žy ūļ–0’1Æa_ƒöŻņz]°!ļ¹2ć3O_¶ņ‡Į±ŲÖ[ę_x×ŗŖ”xߊ÷ĮĒżņŻ9%s㺃6Õ‹ÅÕöżĄ;<żė?‰‡¾µmGfn”ckśÄK®xĘė[x×½Ūė[ń>“¾ŹowĪ<ąķĪł×MļŚóXģ½vŻņŒW/½E·—ļ× /Ž_”Yxåč[ņė„Ēbs®‹Å¶Øm»:ŽF7g_ļõµ—-Mīœ"}mz÷ÆÆ]ąÕ“}„Äþ+eŪ²ēšō+ž™x‰·Žjń6®ūö™w{y¹<łätłįšō/[é匷q]ĆĮ‡jżŒ¾„ĘPVc9<żåū[tóršŹˆ·q]ϦwÅĪ’\łīiŁsxśO#¾ŽØ#šĘļń6®«5ā M^ß'mGę÷jQGśŻ~C[ÆĻx’»£¼xč»b“ŽwO×Xxxś9WrÜC¼źÕė-Üø.{$<ģ[Rf|~ć 6$O/ss³Ę^Ÿń6®{ćęt¦‚¾†²eĪĒż$÷ӈŠŗøŽ>x³Åþ Õ¼¾¦ņń„N®Ō ȑ/šś;¹wo@}łņ߉®ßÓ/śš<üGæÄ—Ųśrś¢zéD×Ē^³§ļ]¤q(ŗ^y5Šłeā%ų}äÕńČ+ü‚>ٜ_ęļżņź„—ŗ?“/šŹŠ'¹š3ö‘kū»øµčFÜŠœ$nč{Vž©<Ø'’‘č3ž#Šw©ģXēņꆶäśśŽĘuåŪ’Wč[©ųŽU¾ÕS|©ōųRčk+?-vu٬1u‰¾6·qŻGØKāū üĪųOÆX'soćŗ ÕØś-„œ¬«­žņ”Ś¢_x‡k#O©Aś½Sm+ī裦é÷ŽĄCµOæ§ŹÅXż6k\ęf߯ń°ļ ńč÷|õ3¹žźmŠķ¾_ćQoµīšżNŸ¼ļ¢‘ŹßĆUēd4żÖŖ·Ÿć¹:WFÓ/ń~WśOæ”-ś/¼÷ÄĆĻč£ßC³e_=ĶkŲĒx <ę5ģ«ųņćł#«}’×qīøĢ)kŪÆZ6(ė·éÉB^n‹¬7gōÅNYŃ&/{BŸ¼rµ&gvȈmzP>±¤yŽčĄK,k°ł=— }Wæ:hĮfÆļĘW‡ē›TKś®ŗćM]ˆAßxńrÄĖmńĶŒė“ŹG_ɒÓ2ē$.œ²¶š2Ćėƒwę¹-ę¶čģž’Ēx»Ķ—ߦŚ'É)k›Mx²‘×g¼Ü=nY\ßė++[NšŠGryĆWiĆ>xķÅþSšöU+:¹Ö9Ča¼ Nīƒ Ča¾:Ēõ»lż¢Ļxų~‰/±=’‰‹¦¬%ŗ^¼ÉWß·(·ŃõśČ”ÉĪ/czįō¼Ā/č“Ķł8?·ĪĮĻŲožóóś ųūČ?¶)k;w%nč»-šĘ·x§#qCßéņßĶ.šM°<€7Q<üG o¢lĖvyõfņ }šF‹—ŪāŗLņ }—+–s]}\u‡ÕĒšĄ#¾ŌśĪ’ļ:¹ŗ|²u‰>ćå¶X\Ÿŗ$¾§ÉļŖĖü)kWUkćĒk¼Ü§šĮßo®rņQmäéCŖ7üb<ņōp}MæIÆO~YU-oøļ÷ųĄĖmqź鲅~{zū¤ļÉFĶŌśzŽxŁ×ćßļ5ėDz»Jsr׊7I<źķ›¾ßgV–]DžRēd4ć­uAĒ£ĪÉhś%®uśŽlcś&~F~n¦ųœ„81ƙ}Ęc^Ć>ę°+$Ēü—XÖāż½}c”+Ģu¹-lf¼n®S™×Ė:ōüEß"ō‘}6‡å*_šsĪÖ}’±€üM,‹Åžu£—ū2ĢCč[/_”9ē éL,ū%ƃ®%Ą£>.–=‰e5ś·xĆó˜_&+/ĖŚ<ü\§Xl”ä˜7ŗĖĘIJ†4P>ÓÖęÄ²E÷”lååšg§G*.L,Ūė2•‘“£öŪ*N‰eŸNy¹—£Ī;(Ęč{Sõ‹>jŗ²ćÓāŃ/łxžk[£?m/cż¶ī݋˭—#ē§(&ų [£r66£’1ē3ß36䨭›œ>‚#¾ŌVbYÉVų 9«#ĘK<;[¶ébłrbÉ8:j ōXöęhKŽĻӆO9ĪŠ6KrūÉČq,£ķ…!ŸĖ^nšéßÖņ™ø-ŗĒ·Ż°`ļE{É×ÄOӖ<½FyŠĶČŃļ!'É5ōuŌqŠņÆCĘē+Ԛ†æ&äߔµ7QƒČįSņÆCĘ)—ĢŃi?ÉYž1‡QÓĒInN޾īŲØć`ģG­(‘ū"äś˜#Šgł×!cĪ3§h½ĻņÆCʃƒ?_éy–2J;’õßÕ{}vžk;’%‡j¶óśģü×xčć\ó_’=æ×ó_ć”\ćü×÷ļõĮc3śģ\’•Zįõ„ņŠgēæŗĆL×¼>;’5śģ\—ųRäs*}vž«3A]Kšśģü×xÄĆĪżõ;’5żŚł/99z¶ļ×ĪGævžKŪqWł~SyōkēŗŲ²xœļ7•Gæv®KmMęūMåŃoāÅ2ī\—¼%{Éē™’([Č#Ėé×Īń)śČ?;’5żŚł/söįg;’5޾5¦%/o›żŲ /¦äß6@÷ĆåĒb/nĪI®-9~žAśz¢ĪQęÜP"ö¼xkōؾÆodµtboµ}tż%É„U'©ķ¤r+ǜœ®$õ=·äŹ7Z1±D¬”äŹ ś8¹lnŽäīÆĪ/ƒ£O×ņųnXrļ·žņNÆÆm÷Ć2'’r™ä^ĖšŖ—ćšČX}G;±žA]6ĢõśFyF¦6ÉMh8xµ—Óµ¾ —\å‹3žóś¦žrYfėī‡InņQG½ēåų^^߯ęM¬ßtą·«¼¾×ēęd–ōqŽmʶæĢŠX—ɇäKSĶ2Ų÷ų€·r’%¹vĪ/׫Į²…CäCr"÷³bĮwšėŻ„>ā±Z±šś~‡>ņŖ”bKŒ'Ö’vö‘)¶Äų¶gmÄ>äz)Wź»ńf<Ēx‘;M¹2Į÷Ø÷/r•{W;’m˜‹’»N¹7Ģłošjü‡Ü1ŹåN._ŽI<»K¹ÜŅÅcĄ«Ä¹l®?ŗų®˜H|‘[©Śųb ń¹„ų"ĒõźŪ]¾ü0Ž|ANcĶźņeÅbņ…Z„N?(5iŃÄśs“ŗ*£¦©ēeoŽ“Hy ŠörŌn]šX’‡qä3rŌīæ\>ÆXL>£ļ Ł×ŹÕNJ‰ŌrÆČ¾†®>F.”>;LćäźķĖ;©7äĘi¼g»zš*õ†Ü0łļVWæęRæi’ė#’ŻØķ¶ƒWSæČµ“®¤›2žc>@_éŗĻĶG½Ē|€Ü]Ćąśńe~Aī́ē­vóĖY™_ė„|Į‡ä óż&}¾Øßß1_]žĆ½É%‹6]¶,7æōŠXģŻ—c±¹'ߖ¼łŪÜy?®æ9’[ū.}As xß’Ü=Ł(‘+^~ŁoŌǵż*’ÜäQÕoTŪ­e¾Z‹żUrÕ®K¾V0Fre«u¹‚±ļ$÷«z­äFUå }ū=HęŒ[/•ܰėÆ{¹·‡ŌĢ<ż°~’kzčśĪ }™åOĪL–?YrSėõĖĖ•;“]fŁCŪInAS×x}÷ŻzifŁē‘\å#r?šrgÖ/ó­!5%7ÆŃн¾ec2÷_ø.ļŪA÷ż½Ī°O¶ež<ö¼ŅC×yŻg^ŸĘšłŻĻŻ%W”e«­^NcĶԘ%WéčrßĒb÷ɾmėoĪü`RbĮ·ƒŽ9Ž\ }Æ/ĖĶÜkzƒ„‡Ö:ŽLÉ5–¾ÆäCōå—õrĶ„o³|ˆ¾­e¼>ģ«(b_Y}憾ņ²o›|ˆ}£Ŗz}Œ~;ØŅĆ^ŽńāCĘŪōP/‡’ŲšßŌz^’±įæu|æå¤ Ä£ņ^N¾Ėģ$Äc^#/‡mŲH|ļ;ŚĖż(Ū*ČFā»žH/÷±ĘŚDc&_*hĪah¬GkĢäK%µÅ/+/ya!>$ך rGUĪ_ˆÉISūͤļł°ōŠÆ–’ĻČ-•}-]}t_J} WFöeȇ„‡&–QČMÓxuõöÕėŌrm5ŽM®ŽĪXE½a_#łļ4Wæżß¢~‘ūévł5\żžŗ†śEīĒŇä?āęƒÜ˜ū›tļęƒ2 ÷ń‚uyųšŪAßob~An™j·²›_®ūŒłū®SķāCņ…ł ¹lÕ.>$_˜Æź·°ų(Ķõ#u¼Ü¶yńŠ«†•ˆÕ¬4dq²óūy}¦]ŸY)7óóäĘōA‹7¼ų÷¼JWŒĖ|fžÖ5'vÅ’\Ϲ=ó–®øIrżæozT,vøō•Ń1†µÓ¶Ķ½7ĪÕO RŪnĒõÉ{įėIj[}K•‹}æ uģķ®9Ūę·ūl}ŖDģ`é{bš Ģ ÷Ēó+åVoøž#ßļŗĮĆ3ĻļZ+’Łłk:wT4±/~å)™‡_yŠäĪ©=GߗŅļµ:FÓqfŪęŗgƙ£ėēź÷聝2“;©mökŸöå e½!9]7¾Ę÷ŠG&.Üē։ҧ'ņ¼smck²>¹lŖŚĘb?čūś]ž@ϼ×WÜ$¹žß/ÕėŖć ÷0Ž®×ł~’Ö²OŽŅÆ'©mõ-[īōćķ£±ź>‡Ģm›·>õv?ŽÆ5ÖĒ4ęJ¹ė?Ŗ®u~¾Dc}Sc~v~Ē—×tömÆT|āŠÓ¶ĶW [¬{²šU_ŧ¾āT)·Ę™Ÿū¶Äg•āōģü»oU^ß©ņÉHłfŪę5sźž]"vˆŚ6“ļ’+åĪY{NķXl°śm/?5’枝æö‰:ķ}Ū)ŠćoŪę¹WöÖ=cōū’āTÜ+å6=Ŗæj›ŸWl›)ĘĻĢÆrqõ-¾ķq:–Ÿ¦õжĶõn-w¢oūņąAłoŻWæ›V'ńm?<<’Ō®µŌoŻÕ\‡ĶÕµŒĶ¾vį¶Ķ\͚†~÷ŗubę³Ž»°RīqĶ©iś]øljf¬\īĀgē—Ń·R¾-÷wżS÷öl۟ÉåŲ§/zv>Łģm¦¹w„“=©|üŠÅØzC‹ŃZåc7£5‰żź|&æ¹jń’ōūŖĘ{£ĖåƒŌą‹ļuŹ Ęk¹A­rƵJNāē„ņ1Żå䣵ĻVNāēęŹGjųÕ/9IæņUžÉ®ƌ§跟ā{¦«…O^§čWµæĶÕĀÓ÷Z-tÓX¹gjŪęr'Rƒ“ż@ceĢ•r‡X vÕX™wž™’č1Ō żźžøü”n¾Ŗw+óm*ŸróÕ¦Õh¾¢_Õnž`7_Õ}łŠ¼*ÆŲrN²msV›c‰­ģVæĻW±9–ŲVqsl¹:̱“}M9…Æ·m¾½:ó ¾Ŗ©|Äוr§–Y”y_UW>āėgēoڟ9›‡«öļtsāš9̉Ų\Mµ¬›;ē¬eīÄęŖżÓŻ<¹ö ęIś}Ś÷+›oÆĪtż>z żāēÆtNrļāŒ_m;óż¼!n¼™Ÿ¢ńāēŹĒƒ”—ĻźŹx÷«yķāaó;ęu­=&æÅ‚Ņ[&(nCÆŹ^<®O—¼65Ēę÷žäžŃUax?œ¶*ļÖūG‰×`eŽĘRNmĖ?ŗ,ļŃ*ĆÕv嚋¤Ž-S«ä}~wńj¼¼n®oŪź«jł{]t‘ŚN|ŗźmžwJVłżµõždĘ_güÕŪ2°Ęńł7ik±ą–'nQ`ßZ鬓Ī ÖĶ­”|ʖ-J—töł¤źmŸö¼ėeŪÉ§ÆŹėżINn]7 ķtŁvll±ą¢{Wźx„}4Öōśpgi+Š—„±¶ģŪEm’rż==ļƒgsņ/ģ0QļOöĆ|…¾jO^Ÿņ•.j±ąV7‡”Ƴō]>æc}Ū4£ÆµōļÓ%‰¾ «{Ž4Ł÷ÓV‰—“ū¦® ožģŪļŃej{ѽMźxŽgÆ|˜Éx?Õ\‡¾i¼Y_UĖģ­ń:ĮózÉw'÷h%ތæö8Ėm¬|׿Ęńj{Ėż4_aß|łnõłŻÅ«ńrķ.¾ķyņŻĘ /RŪ‰OŽŪóšĖwŁ÷ÆĮŹZ÷ÓöłīŽ*ĆÕv嚻5`óOŹ—ÓkÆō–ĮZKa_ełīøšcÕöžÓtķŽ~ėŽZ“öŁńb±ŸGł¶ŸO=rQå'ÆW[]—UŽ£ļ>ł®£Ó·mÓ÷„|w¼ÓwauÓWīōUɱ²ÆĻ'o6Ę>ŚfČwбō5©cöŻ+ß)gÄūōĘ;D¶œ,ß)gŌvŠ 6Ž3ä»NŚś|Ņć,ü‡¾”ņŻ0ēæ~ķńPLZ,|±åsKéŪŖīżÉ“‘–Ļcd_mÅøģ³śøKö%]}ÜŻś°ńĪuõV»‹Õć=ÓÕŪē½­Žšßy®~{œeõ;D¾ķź·_{ź—š!ß}ģęƒO±łßż@ +6T–ļrŻüņfcęl9\¾›ćę—&u˜_Č«—å'źµ÷'Vgn¢GåOźŗÅ‚mū3‡Į»§ļ£ P½’kT+mŸćŃ…ļ«®ÉIŖzļŗg/NÓ"ś·æuaį9„æÖ¦{üųóMNßļŖm³pīb<älķÆey¹ń{„¦;VǂѾōCżńG°—ś`­żś°s ķĪ·µóĻ÷›Ź£­­åżu5/ļP%ŹćxÄ=½ž;}߇£Œ‡}CĀ÷\žŗŸ—³s’(oxĮ wŽĆŲJfū±-| [öŁzĆ_;ńöq_[gūėƒ^_*9[Sūk^ēP¬³‡œ­ż5>Æ/•‡œ­wżu?ÆļŸ÷Ņē’& 9[Ūśė~^Žk"¬w‡œ­cżu?ßļÉamk<ūŻū½——JØrTŸ{Q¤{šõGWgšš_ÕĄīw NŅ,~‰/Ųć„™ģ•ć÷/üēt—7|ŽÅŅc{ėŻēQŗĖ)>ĆWs÷¼0ŸĮizē3x_½ó¬Æ<ÜgpYa>ƒĖéĻążōĪgpy½ó\Aļ|WŌ;ŸĮ•ōĪgpe½ó¼æŽł Ö×4ī3øŖ0ŸĮčĻąjzē3øŗŽł >Pļ|¤w>ƒkčĻąšzē3ų`½ó|ˆŽł >Tļ|óā38®÷P˜=&Z+ąŚ¢:„Š+=VWļ‡\O“~Ą D¬ÆŪc:-Ń+Ż=¦iĄGˆp3Ń£Ö©lģ耏mš±¢-&_Ž}čB?ż4 Żč…nō‚э^0ŗŃ Ödčʦśćļ„t×§bŽƒoš {įŃŒŸš?į#0~ĀG`ü„Ąų ³ōŽ (KZė½MĄmEOųDŃv·U鏝¬÷Ÿ"zjĄ§‰žpGŃ3ī$zfĄE»ÜU“[Ąg‰žš9¢ē|žčł£]Ų@?ōF7zĮčF/Żč£½ą ōž¦ś·Ņ;¾Óg÷€ń ~ö`ü„Ąų ń>ć'|ĘOųĢ8|.Åc䕳 Äbnż¢ĻĒ4īāk±Ą>ć.'Ķ’ŲCN ‡1;±ÅēCÜå†Å’łŽ»Z±x‘S6.l÷łw¹dqĒß>ēć.’-¾ųŽēÜՂŚ8ųZˆ»ŗ°øg‰×Ę;9n~&>¾Fā®^,7ˆUŗ6äzo01¢NąS»–?Ō‘åłįžŚ˜ynŠūEķ0t“Ć ·’ź€iwUĄģ0ūÆ ˜ż#f’³DĄģ0ū/˜żĢžĖf’°€į ސ€į Ž €į Ž€€į]0¼žĆūKĄšś ÆoĄšś ÆwĄš. Ž…Ćė0ćó~NøżŽ’ ·ßĒÅćl'ŸӟĒŽq8=v‹h}&śč¾Ø8¾­÷æ~UŃiŽŸī|™ć°nŒmąO=9Čc[nY#Ś?š±’ęĄß_¼)§»qO üƒÄ7šńĆ䡇žōą+śĆĪuzן漕ī|ĢxąWo’Ćé.·~Mńß|ārGąÓū ‡ŲŻųļ‰|ā{OąWo‚Ćé./fž!āÆ|ņä¾ĄgÜķ‚riVą ŖŪ‚ōJw98'š÷ļ&‡Ó]žŽųqń? |ņvnąćļƒrū”Ą’PtPą“’~¦xł§»z4š÷\ąSGó’FŃ‚jmaą§‹÷w‡Ó]½>ųy¢yjöÉĄ/+óć„®Ÿv8#FNµ ņŌž³’±čąĄg~@/ń=^¼ēNe‹Žq8#včµ“ĖĢGČ_Æ÷±ӗ·!ƍ•±!ƒ³Āų]`b‡.01G˜œ±<'×|¼2\ĪŅrÜēI†ĖYĖsźÉēg†«AĖó[Å÷u‘#g-Ļoö5˜įrÖņüNńiC_ä¬åłŻĀ“Ž-ϧ Óž ½Ó|ÆŽi&giž©wŚ€gé}Px¶Ži&g-Ļ’*Lųä,mĄč6`rÖņüAaŚĄ'g-Ϧ |rÖņ|ž0mą“³Äü˜Ž}Žføœµü_ >ŗ!g-’ £ >9kł’„0ŗą“³–’O £ >9kł’Œ0ŗą“³–’ä&ŗą“³–’Ōŗą“³–’ä,ŗą“³–’ä¬Ļó —³–’ä,ŗ/UĀr2=¦[bĻ;~ŗĖ÷6śL­}!šž4ąė…_ ˜>»łD_ü}„± =ŗu-öJĄŌDė ÆĖL±×’Ń!“čėßRŲ1=6AxEąć棂ü$ŃU_Bųš€§æ0¾j„ĻŲ3Mō­ĄÆ-¼1`]2+<Ęé§dB¼Ņc· Æ 2ųž|}Fnń+<īģ%Lląß-ü~ĄŁ¢YA~ŗčśĄæLų³€ļž(ą ¢ś™½Ņc3E’ų-„}¤Ēf [,ČÆ#ƒü_Em,u…7‡¶Dšāég;ōJ=(śy9[Ųēmzģaaä!Ļ ņóDæ |n‡ŻšcĀß¼IT·ąč•[ ś]ą-ģs;=¶HųūĄ§nšł'D’ųõ„Ͷ§„’ųōÆ[NõJ=#śSąŸ%ģė1=¦[9c’ |jėÜ Ÿ/ZųäŻ/æ*j|ņ÷ēĄIŌōPŪ’o¢Ö/:~ |t˜čų!šŃaćBĒÖĄG‡łß>:Ģočų:šŃa~FĒ—‹ :,.č°8¢c©6ü†«GtX¢Ć|Žb‰<:,—%Gį#kł†,5 YĖOd?†->²–ĻČ~Ø >²Œģ#kõņ”š{¬Õ²ėŁwFvMĄČ® Ł·Fö€‘}3`dm~@vuą#ūFĄČ® ŁU#»<`dWŒģ²€‘}=`d—Œ¬Ķ«Č.|dŸ˜’»ų’»`t»`t»ąÅz'wĮč wĮ±śÆ \R”ł ¼·(ĒpiQęqpš(ė4`Ö“‰€YOfĢqŖVĄĢķuf><<`ꖶ36 ˜y„qĄŗķŖp^:BŲęŲfĀG™ę¢ĢkŒ÷Qęhš±¢->Nōų€“¢™sL0Ÿ‡VĻ±Ń|NŚ~[Qó9q8!šOµć q°˜¶¶ć,1±˜r¾Bģ$>»“„iŸXY9?£ |āf1ķ LųÄŠā{Š0mąO‹õ©Ā“Ol-ī§ Ó>q¶8]˜6š‰¹åCGaŚĄ'ž–gÓ>¹`yŅI˜6šÉ ڀτ ˜±üé,Lųä mĄ]Di&whī*JpCQŚ€»‰ŅÜX”6`ŽSÄÜTt߀ĻEü#EŃf‚.šQ¢čŸ+Š.šŃ¢čs¬Fø…(ŗĄē‹¢ Ln¢ ĢŚ ]`ņ]ą DķøOĪ¢ >9‹.09‹.š>¢¶$gŃæ¬(ŗĄä,ŗĄäl€ŃÓ3`röĀ€ŃsQĄųģā€ŃÓ+`rł’€Éߎ“³}&OūLnö ˜|üKĄä`’€É»K&×L~ ˜œ0y48`rgHĄäĖŠ€É‘a“—LĢ/˜8˜ŲŽ˜x^010q»2`b5*`āsUĄÄ伀‰Ćč€ĖD0¾L~iQ“Ē÷Ē~IQÓI¬Ž |ōYæč8&šŃa¶”£yą£ĆģGG³ĄG‡G>:Ģčhųč0_”£Qą£Ćü‰ŽĖt¤>:,čØųč°x”£ną#k1E¶vą#kqGö°ĄGÖrŁōĄGÖņŁxą#k9†ģ!¬å!²5YĖUd |d-Ÿ‘­ųČZĪ#{@ą#kul•ĄGÖjŁŹ¬Õ²Y«AdĖ>²V§Č– |d­Ž‘Ż;š‘µłĮÉ>1,pšØĶč(ųč°y%?&jóL5į[™Š4±–³±ß&|Jg\¶$Ü5Č!ʹņ …˜s:ę5ųč½[ĄMD9ǃßXx^Ą_ŠŚœ¹X8;ČCÆ ß^0tLĄÄśŗ€”×L¬Ē ½!`|œ0t\ĄäŽCĒL®ę ½)`jįꀔ¦¦& 0µ99`蔀©ń©C§ĢłŻ-Co ˜óĮŪ†Ž0ēw ½3`Ī7ļ zwĄœŸŽ0tzĄŠ?#`č½,ž}Cgü‰ų³†Īxƒųs†ž5ąMāß0ō€?nĄŠŽ"žCC˜œy$`輀ɽG†>090sÅÓCŸ ˜9źŁ€”ĻĢܘ04?`ņŚēÜå»Ļ’øĖ_Ÿēq—×>Ļć.O}>Ē]žś|Ž;>o殆|ŽĘ]­ų¼»Zńyw9īó6īrÜēmÜåøĻŪøĖqŸ·q—ć>oć.Ē}ŽĘ]Žū¼»÷yw9īó6īrÜēmÜåøĻŪøĖqŸ·q—ć>oć.Ē}ŽĘ]Žū¼»÷yw9īó6īrÜēmÜåøĻŪøĖqŸ·q—ć>oć.Ē}ŽĘ]Žū¼»÷yw9īó6īrÜēmÜåøĻŪøĖqŸ·q—ć>oć.Ē}ŽĘ]Žū¼»÷yws’ĻŪø›“|ŽĘ]īū¼»Ü÷yw¹ļó6īrßēmÜå¾ĻŪøĖ}Ÿ·q—ū>oć.÷}ŽĘ]īū¼»Ü÷yw¹ļó6īrßēmÜå¾ĻŪøĖ}Ÿ·q—ū~NŽ»ÜgŽŽÅā.÷żÜw¹Ļ\ ~Ž»ÜgĪ…’7ŃNwtqĄŠē†"Ēõ‚%¢/>ŌŚ²Ÿ}ȼ$ś²Ć鎚<ūهĢRŃW‚ ŌäŁĻ>d^}ĶįtGMžżģCf™čėAjņģg2ĖEW8œīØÉ³Ÿ}Ȭ]d &Ļ~ö!³Zō ‡Ó5yö³™7Eß 2P“g?ūy[ō‡Ó5yö³™5¢kƒ ŌäŁĻ>d։¾ėpŗ£&Ļ~ö!óžčūAjņģg2ˆ®w8ŻQ“g?ūłPō£ 5yö³™E’īpŗ£&Ļ~ö!ó‰č§Ajņģg2D7:¬ļŠEMžżģCf“čf‡õ=³ØÉ³Ÿ}Č|&ś¹ĆśŽZŌäŁĻ>d¶ˆ~į°¾ß5yö³™/Eær8ŻQ“g?ūłZō› 5yö³™oEæs8ŻQ“g?ūŁ*ś}š<ūهĢ¢’p8ŻQ“g?ūłQōŸAjņģg2ŪDr8ŻQ“g?ūłYō_Ajņģg2æˆ8œīØÉ³Ÿ}Č0Ÿ˜ <ękŪ (™‹õnüĀĢ)šÆŌ;sųj½3G€/Ņ;sųB½SóąŽz§¶Į}õN ƒ’¢wj|©Ž©Iš@½S{ąĮz§ĘĄCõN-/Ó;5®wjdJ‹ī0ŌäŁĻ>dxĘŻ¾CMžżģC¦ŒhŁ€”&Ļ~ö!SNt怔&Ļ~ö!S^“BĄP“g?ū©(Z)`ØÉ³Ÿ}ČTŻ?`ØÉ³Ÿ}ČT­0ŌäŁĻ>d­0ŌäŁĻ>dŖ‹0ŌäŁĻ>d­0ŌäŁĻ>djŠ0ŌäŁĻ>d=4`ØÉ³Ÿ}ČÄECMžżģC&]4#`ØÉ³Ÿ}Č&Z+`ØÉ³Ÿ}ČŌ­0ŌäŁĻ>dźŠ0ŌäŁĻ>dź‰Öjņģg2 D 5yö³™F¢†š<ūهLѦCMžżģCęŃ#†š<ūهL3Ń£†š<ūهLsŃ£†š<ūهĢ1¢-†š<ūه̱¢-†š<ūهĢq¢Ē 5yö³™¤hfĄP“g?ūa>1x%ģ qwŒšüø[W2§(»Üz“¹Ģ:‘9Ģz¹Ģŗš³¾£¶Į¬ćØa0ė5jĢŗŒš³ž¢öĄ¬³Ø10ė)j Ģŗ‰š³>¢6Ą¬ƒ ˜õŽÆ…ø[×ųœ»õ‹Ļķø[§ųŽ»õˆĻÕø[wųœŒ»uˆĻ½ø[Gų‹»õ…Ļ„ø[ųœ‰»õ‚Ļø;Īūˆ»ćæuÜ·}Lćīxīc!Ū;:ūÓ½ŪįŒtząC‘#ާG0ü{Ź>d:ˆž0ō‡uļ™č]Eł“"že2'ˆ¶ z«ĆŽŽųPäoĮšo |(ūaŒSÖżu¢·>ŌĘžųP/c™äųŽN 2P#xrąCm\Ų~³ćėž@щ§;jc7!š”f?vŽw|ŻÓ%z“Ć鎚żšrjöcoŽćėžIŃNwŌģ‡7.š”f?v^ļųŗRō‡Ó5ūį |ØŁ×:~†£×ØŁųP³;Oqü GO 2P³|jąCĶ~ģķųŽ^d f?8;š”f?öŽrü GÆ2P³|UąCĶ~ś¼Āń3½2Č@ĶšČĄ‡š ōy¹ćg8:"Č@ĶššĄ‡š ō9Ōńµv½ĢįtGĶxĆj6Šē ĒĻptHš ąĮ5čėRĒ×ŗZt Ć鎚 š>Ōl Ļ~ŽŸįh’ 5Ą |ØŁ@_½_k~Ѿ§;j6ĄėųP³>/v|wˆ^āpŗ£f¼^5č«§ćg8zQš ą j6ŠWwĒĻp“Gš ą j6Šē¹ŽŸįčłAj6€Ļ |ØŁ@Ÿg9~†£ēØŁ>;š”f}vqü G»ØŁīųP³>;9~†£ƒ ŌlŸųP³>Otü GŪØŁnųP³>³?ĆŃÖAj6€[>Ōl8Eø£ćgøćó Ē‹ÓE™_ĄŲu²Ćī8f¶$žŁC’mƒĢ ¢fCįhæ•Q)ūėŻlų(ŅöļĀ×8™ŒŲ§Ā7ŒžJ§»ćCŀ7Š«6ĪI±„Tą—5’lßģ’\ųz'“ūBxBĄŒeļŠöNį½žJųmč÷ž§Ē“ü)œ{æŃ~óįwĀć‘ü÷ĀŒ?u8ŻW ųāß­ ł*z·|ų§x“œL†ūūN˱ŸÄŸųUE-o’%ž“ĄO½ŠéŌw¢žšÆžžE|«Æ æ¶›įžN“OßK| 7Ćż]¦Ķ„Ä÷×j3ÜߒŚÜ²ųžš¬žĪEśm¾ŚWü{ƒ=eE‡żeşųŠüżÄ÷×.3ÜߤŽ ü āūk‘īo@Æ üJāūkŽīļV³ńżµÅ ÷w¢cæŖųžb†ūŪÖ±_M|­0Ćż-iną(ž‚`gŃ _CüEkrą,ž°č“Ą?Tü§†x÷>ō¾€”3†"GŽĶ0tNĄŠæ EłūE:7`čƒC‘Cž!ч†>0t^ĄPäTō±€”ó†.Šņ E }<`čC‘CžIѧ†>0ō™€”Č!’¬čsCó†ę EłÅ¢Ļ ż[ĄŠ†"‡üц¾0ō倔Č!æTō•€”Æ }-`(rČ/}=`čņ€”+†"‡üJŃUCW }#`(rČæ)śVĄŠ·†¾09ä׈® ŗ.`č»C‘C晚ł’?dš„Åæ™šł’˜«ł ?Ųx“ł„ńŚø°ŻĘžšzmŲ½7`ź‰}š»‘q˜ØAj ź‰:3ö÷†¾0Ō|B=RoČS[Ō$y³‡ž­-õH½!CmQ“`źŽŗSCŌ˜ś¢~ĄŌ 5¦ŽØ05A-©źLīS3`ʔ ĒõŽ_Ą—ī ŲŪėł£š 2™z72æE}•ŽˆdwFĄ5Eń üzśē0Ųā¤w|ʵ€Ā¢ž©ų_š2ų¦NąWś­nąć§ĆęŲ‡iĖq3źĻz°Åēų‹OĮų²>P˜µJŌĻ Ÿµ ¾F7 |Ö)Q’7 ü|É4˜õK^hĖńåł€©—&A†zjpyQź¾Øµ#?Q«AźéČĄ/'J½!O­5 |ŽÅVƒe„©=dع£€ĀŌ`ó€÷µŚd]AM"C- ¦6 xQ«Yź²Eą³£n‘§f |ÖkVĖŌbĖĄg-F­"ÆCh‘š=¶ųŌßń#J­Āgmf5KĶ%a‹­Ž?t2ŗĘ'ś‘ĆénĶüqąC’ųD? |见’Œōl|čĘĄ+ž¦Ą‡nüE? |čēßEtKąCæüē¤ēĖĄ‡~ų7Š’uąCæ üSDæ |čwŸ#ŗ5š”ß~¾ōüųŠžY¢?>ōŸ®č¶Ą‡žųŻE|čææ§č/-ü‹”“YB”5(qé-~ÉĄ‡²…ßOü½Źž„ā—|(kPųƒÄO |(kPųCÅ/ųPÖ š/æ\ąCYƒĀæBüņe ”ųŹžhń+>”5(ükÅÆųP֠𯒀Ą‡²…?^üźe ’fń |(kPų“ÄÆųPÖ š§ŠHąCYƒĀ'Æ}'bä¹Ļķ„ĖGŸ{ —§>'.|Ī$\~ł\JøÜńy˜p¹ćó0įrÖēĀå¬Ļ’„«_w W+©oŽDŲåó0įģõy˜pćšłŸpćółŸpćöu—pžšu—p~ņcL8’ł±'\¾{Ÿ$\x_%œæ½.Ž· ļ󄋛EĀ՜Ʃ„«9_k g»„‹æiĀ兏uĀå‹Ļ„Ė#Ÿ —_>g.ļ|.%\>śKø<õ¹—płės2įņŚējĀå»Ļį„«ŸŪ W>ē®n|-$\=łIø:óµ“põēk*įźŅךV Š‘ÆĮ„«c_› Wß¾f®ī}-'ü|ąņ-įę _ū 7ų9!įę?W$Ü|ć琄›’üܒpó¢Ÿs.gż\”p9ė稄›kż\šps­Ÿcnn÷sxĀĶń~nOÄ ·kśĄ±Fūkėüw ääŽ_]ŗžŚsŠŽwż!nڇå.§?Ö;—wö:­ŻĄń{^Ō«a×^C†õā¶€]z„eļēśŁ„F’.ōłĮ—+Æ¶Ś“õ[+lł_š_ü×’õĄ=šæŃéS3Ƽ6›Æ@boן9R˜%,xJģrĒGĘp-įŹĒ½ļNM×H&Myš-¾r|dfmk:M’?ō.Ōæ-ąh[Óiś·~VŁī"óĻ€ŃomяNӟV³K”~ĆѶčG§éĻž9YØLĄč·¶č›žĖGgź7ŒžĪ-’įō ’LaÓ’öśŹN™5l}! &æå䑅ö|0öX_Ų6{ʧ×+“Ēša’ÆųļH¾‚0ņąįĮ~d c›õ…=Ų`ötowo”=†±ĒśĀ°Łóf#2†£}™ fłĆŲc}aŲģ¹&ūÕB{Ęķ {č×ō7qAĘp“/ģ±ųŅ—å2†±ĒśBĢb-×ʐ±ˆö…~ś5{z›Ńß'‚­/³Įä­‘7L_–Kȓc&O¬±yˁh_؃ &ß6Ä™vl}!6ł+¼<ó†õem‘G§É/9Œü’¶¶Č£yb÷ž†1…łüAĄŃ¶Č£Óō÷5‹Ģőśµ¶¦ÓōPīśBżÕ޶E?:M’ūaĪAęĆČücmяNÓoż’†£mяNÓm˜3‘1m‹~ō˜~ó26‡GŪ¢=ȓĢÕĈœ±9¼łÜ™Éō÷¹¼}*ofrćŲūœ=gōš™L{Ģóoė±Yɝ=’ń§f%O˜āń–cęźčŽĪk ńŻĀ‡A&Šķ8‚¼aä'†ćņQlyŽL?rł(¶Š-?‘bk‹|Ÿrł(¶¶ČGqՐ“ČG±µE>Š×„œD>Š­-ņQl}„Śom‘āį!?‘bӓjæł ł(¶¶Č&v{…üD>Š­-ņQi[ŪØNš¤ˆżQlmŃŖKŲÅÖ6ŖüUÄ’QlmŃÅ„ĀśżQlm£:Į£"łÅÖżQ|Y8¾£?Š;Eź+Šm}‚|[_QĄ›#õÅÖöDń~įx„ž(¶ćņQlėä£ŲśŠŚ>'³bė żQüFXŸ ÅÖņQl¾E>Š­ÆØ ąģČ|ÅÖś #oóś£ŲśBŽ0ņ–KČG±õµl±FŽšŪ%f'×՘éęēņ[f%Ÿn?ÓĶĻóęĻJžŪĢó;äĻJ°·ĒŸĪŻ–^łNwÜlsĒ„d…’Ūńyß>āųČdī3ϧ¶73Y®³?“»vfņ³#üńāŖy3“óĻõüī“f&GŒńøļ#3“Ļ4š}ŻūņĢäĖŻ¼=+n™™¬7Źó¹lfņ½®HĪNfdy|N|vrco/ocįxĒׄ1–¹{V²ŪK¾Æ£o™•Ü<ÕŪÓjÕ¬ä¶ė=’¶f%]äńš#f&;ÖšųÓóg&«—ōņ6ō3ƲaŒ7›lŒ—«ēģä‘ył}ƙüģÓYĪĻ?><;łōOć«;n«ŠŸ•GmĒk¶®.ōēŖJo8"Ö”× åĖŲŽĻ>=æP~sļüBłŖGv+”æ©Īv¼feF”<˜uBņ™ŁÉōMޟ5sg'GüčżłķąŁÉŃĻ{žĻwiŒ÷{|k•™É”ļś±<Żffņ×f¹ü1_៨o®8+™“ļżSļąYÉÖ¼ś=+Yö6ĻŽuVrŻ+Qffr@Æų±3“eŖyż5™<éLĻ’ ą¾d׎æ;dvņꁎ¶‰§ĪNĪ›čķ·ÜĄžįŹ™ō3ų³ZÄ?“"ž¹£õu…žŁtźuĪ?±•³“Ēõ}5½G~äķ)ēģäØ#=IJŁÉūx|į^Źyåż¾®zŖ6ŃĖ›ÆąßńįŹ#“ś—_kŻ×bVņŃFŽž;™™œ~¼׉_ĪLŽ,ļń‰™ÉU'čYsŚĢäƒļ{yóüØļ°'Ļ˃Ożžųݹ…ųõ»īq™o÷žG>€EäēGäūT›’zÉ鵹9äqvņ0­ēą÷6;™óÆł >><&ųpXbvrķ->ÖĒ„ĶN.’‹Ļ‡r-f'ū¶óüŗē(Žż=Ī:qf2k¼ļŽf&/xĄ×ʎśØON‰Ģ]6§aēąĖg%'Ō÷z.¾bVņo’ō>Ö¦Õ,ņ6ōGĒ»lNCž•æĻL~8ŅŪ[>3łĀ_=ŽĪ]6§!ocAtŒŃ¹Čę(äĶWČćĆ5Į‡Ä¢|õQĪ’ÄwԐķų†­:>2W¾’”«Óh-[£ßjżļ©¦&„š¢ķJĶEšŃosŲę.d˜ÓŠ­«ų6· ':ēŠö›ō—]¢óõ‡^*Ä'<ė02/ķõ\a~v‹Ģ‡ūEęC³Ķl¦_0Ē&śEæ³Ą;š?£s‹Ķ9č±ZFO“Ęяoį£Ó|~?2߂Ķę“·9y;¶¢“c®ÉSk&o5ˆ|ιĒĆGžŸĘ»ó>0Ē“·1"o¾BšžN—l×_·ŗÆqäm®@ž9Ä䉅é·!’Pd>y32Ÿ`›É›ĶČ[®¢Ÿ6ż¶Ž8U2ęäoĢĻĀüLŪÕ{¾ 9ƒ¼å2äś£µos|›{±“9łÄ0'ÓvZµķ5µW¤¾žŚ²Ż’õ"žg.E³!ųl¶™Ķōėl„ok ōDד„/ųč4Ą;dˆ)z¢s‘ĶQšķXŒHōͱęŹņ~ž“cņ¶6C>ŗf£Æc#łb˜s°Ē|… >Dxgłiµ‰Œ­'Į¶nAg[_Č`ƒé·ŗC>ŠķX*kĪu޼&ķ<~BĪć:™ę‘>M< ĻၭGg[Ž‘ó8®Ņu‘žūÜ3*«’X³1כ/¾›ótm©O:oŹĻœ2*«T¼žłmčØģ•õr’tm Oŗ”OćóNŪGóV½<šshĪÓg}b_bO½yTvŪuyüt.Š?Ķ łÆ?s½Z–Ē|iĮØģÄé9ēżxĪ}b§1ŁĀļsŸÓ7“{5ēé\lĢŲ—ŲĒx,ā1ŠēÜĖ“Um•ē<’ļź.Ł,ēé\lü˜[Ģ9Ö6Ö<]¹ļĶŽÉŗŻ—Ē|‹k·„ēę<]ūéu±V±†ń3Ść7Ī:”ęcņĄ©£³~Ķ‹¼ųŁĶųqlĒ1Ē^“i]ußKźÉīü*Ļy)ŸS_›™óxĒF3q®Å9˜ÖUćwąņx¬ćˆc5Žįtč¾_ó9ģV®å›ż3:; ZĪćy$ė8āŲ‹c2Īżø&|]}t6«i?žGā±Žc ޽8&ć5m<¦±/±ńXÄcĒ^“±¶±ęq,Å1זøęĵ1®™±¶±ęq,Å1kkĒF3qm‰kN\ćšYdY6Ŗx¾>ż²l%Ÿ9—ŒĄ~S~Ÿ|VYöły9ŸŚhLvsßü»÷¦µł^¢ežżüs°×Éķēß<&kyXĪ—Ż66{•u“Ö“›}¼8Ÿ#—v›msEn?gŲŲģ«r>tńØģµó}ē,•M9<Ÿī'Ž#ŲšĖ1YŻj¹„gĒdcßĻĒXŗ× ¼ŃdóŃYfłg·įŪŽĪŖœŸßæx¦x/C’xćļ‹X“OĖćĻęüsčĪy>)7żcνCßSM¬gŹM’˜óĮ×Ī²&y>Ē_3:;źœ<Ÿ”›ž1gļ}Z¼÷‘ī‰? żć1šĮw4ĪóÆyĄØ¬ÓÆy}R_ō}lńóčģ£ņ|ź|1:ū±ožOŹM’˜óͳ˲ÉēŸU—żX–}:„ø†ŪŅfČaįIc²N-Ęo5&ėņ@?µ„Ģa`’²¬Ł€<žŽO—egwĻć§¶ō9ŌāūØźęń_⻺¶ÆćŪŅ?ęS–]æ]½ŪʲJ5ņų©-żcm86[¹4æ”~ĻŲ8Ÿ/©-żk‡®Ż§,4%Ūõ/.Ėź=’’Ō–žępC1‡VGĶĪ+ĶēŚøŗc³=ŗęńS[śrč“GYvYė<~ŽeŁmóų©-żĶįĪb®›ÕĒõ ±Ł]Óņų©-żĶ”W1‡U–eżßĖż7¼ŗ,÷UīŸŚŅ?ęPr’Ųģ÷ó|ļ<6ė]7Ļ'µ„Ģተ¶¤5ĒńœŚŅ’—C\+Ņ¢jKsų£˜ƒ÷[ļ-¦{Žś§µH’øFÅ{—鞦žm6*›’]~Ü«//ĖzMĻ¹ß§{~gžøß½§{śDļEžīUéyŗwiĢČÓ½Hż÷nśĶĄnūö+m^üż€<Ž»O¼]ćJoœÓ·šŁ]>»[Ū¹@{āń7»ÓßXćĒ{ż‰WYøyé[ģSˆ3«WŻŅÉ÷,š»Īڶō÷Ī= |³‡ė•n٧WßßEÓų‘[[ķńw _·ś Ū兊­“ÆĖ_ڤŅZ{āÖ'õ=ÖDn £Oāķ,°C×B»ŻĖ&e÷^óķęOȎ¼6ļūóėĻž©œs÷M}5‘{LSüħ¶)·uyź—öÄcn1gyümCāõ i9l‹{ żj}JIĖGŸœ×¶ÅĢ–?ī›×’éW·,;!ÆæńSn1ē¦Ä÷¾­łĒßE|KżĒĻŗ¼ż/ ß!hOÜų)·˜³<žv"ńõ j9łƒS ķī<ōō–ķwĢėéc_P6õų‚żų{“9$ē1·˜³<žÖ"qĒö‘Å<×å’6/Ģ?ås–Ēßf$Ēvóo\Ų ō¤×ņcńšØķJæm˜£ų›˜³<ž–#qĒ|?ėņ4fā¼0’”[ĢYž~ū”Oā;m?9{ō¹¼¶Ć›LĶ6}?ēq.Ä9ss–Ēß &Ēöŗ<õ+Ī‹˜[ĢŁµ"ž¶0ń8¶wcž…é„%wĢעƻœXrĄļ{ꅳ§ÜbĪņ4ÆõI<Žķułū½ß\;žOæ«qŜåžR»>‰?ł÷–Ÿ ?³0ĪkžōqĖU[ęėLœ qŽÄÜbĪrļł¦ł›øcžŻbžėņ›1·˜³<ž62ń8¶ć˜oĻų_¼ŽŌBĶfü2fŹŚś§ÜbĪņō[;ū˜xŪėņƒ’,ōW{āęŸr‹9Ėū»„OāõöœœķŲąØBœ«K¦f=Ŗē<Ī…8Gbn1g¹æ HõOܱr[—§łē…¹„ó 9'ī\šĆųĪ‘Ä×+›’­ŗ]Į~ןS²Ś=x“9ƒ³ēĪĶyµ÷d³‹>±ļ±&ņųŪĪÄć܉sźÓ6cJöĖž*Œē½Æ™T²Yi„µĒ7õ=ÖD šøs*ĶČžsĆ? ó+ņŲ÷X¹æYMõIüĻkeĻmøSĮŽiŪFŁ^5v,𹿷É:ł»wµÉ^(śXŸŌ÷Xyü­iāMµ-Y]v^!ę҉”¬hƏs9ĪqĒOź{¬‰<ż6UŸÄaüģT¬CäėĪå4Ē­Oź{¬‰<Ķ)}ßļõĶK™ń}įŲÕ;«néųKWųĆĻo\ŗĆ“Ź…¾ <~£ŅżU*pė“śk"æ}M<Īżø&ō8cŪŅ#F¾]h«Ķųz„?zkķųI}51’t­kžé8Īżuyż?r֞xģ{¬‰ł§k]ū˜ųł× Ėv¹O!Īą:#²”ģ]ąßTy8ėøoIļŁb|¶įԜ»oź{¬‰<]ėź“ųå‹Ėv{äBœ &e»ę<®Eqr­H}Y—’Ū:³pł¼ģūŠūj»Ē.5žO|}ųO*ŲõIüčūdĶ79±0ÆÆycϬ¾¢oϬFē-_żīģ•]ScuæĶ¾]›_]Č 17ž²ĖģĘO<®q é>śÆ’Æ~]hk͹•²˜Tąo²ļś—ēcļ”&5žO|ńßčæņO<®ėņ‡‹ēA퉛Ūæē}±>‘§ZÅ^]³J6üĪ+ żŖżq„ģ©śxæŸē–4)¹¬ĄŪ¼ōZÉcūøõ™:„S[ŸČS­b }öī’lÄE’½ī½½dę™} <®-qͱ>÷,ß­ąc}"OµŠ5t _¬ĆŗüßÖū~ą_łuŽõ‰<Õ*Ö0žkā9hx»žŁĀ®ŪņÜŖgÆl~Y½·ļCŠł[ŸČS­b ÜśVÖuT¾o—ūßĪ>ī–ĒŒē¾xN“ļ“‹õ·>‘§ZÅʵb]¾Ėer֞ø}ævīń/8/¬Oä©V±†Õ·Øœ]ųdćBœyß­—ŸžŸē¦xĪrß ‹ćßų‰ĒZÅĘsY<ĒĶŲłœlžsy[Æé‘µœšē`ßO)Ī_ėyŖU¬”kĪĪÅ:¬Ė’m]2’—n¼¶>‘§ZÅĘsM<=8¹réɜ“¬ó±·V*Ż­ćFnnim1’ČS_bć¹&žƒā¹/žĶķ‚„®Ķ?ņŌ—ŲĒø¶¬Ė/\•^֞ø¹U:nX”/ęyźKģć‘ēܕµ+kVš?yņŻY‹v/šxnŠē,s;æĻSkó<õ%ö1žĖā9.ž›ā9ĖÜ|hüŚü#O}‰}tĶ9æX‡ułæ­KŽķ«ŠõwĢ'ī\H}‰}Œē¦xĪśčżĮY¶qI᜵¬Ł=Łg )ps;÷ēĒÖęyźKģc<7ÅsVŽhŸģŲł›øū¦qbüÄc_bćÜ_—Ox)’žV{āƟõk~}büČS_bķõJÉÄ_›rsŚK%ŌĪy<×Äsū¦yjüČS_b³‹y®Ė’m^»ļuÅėOćGžś¢Oāqmkžµ½Wd»÷Čėźsßg—š¹Åss?]»ĘkŚx®Ō'7ćÜY—?rö¤BL퉻oZ‡ć5m¬U¬į -dĒ®Ģk¾i³ė³v5rןø†?]»ĘkŚX«XĆZ­vĶ–½°Ł\ŸĒµčƒG(©ūÖ]ŸĶ+n]śP«Ÿ2kĻqńÜ·Õ> J§»°ąsŠŻS³źÆ©āµV|Wģž·ۊ9ÄkūĒjß]²W· łÄ¶bń³aķ® Kø+’ī(īcĘļ"Ŗķ»yÉ1Uv-ä÷1ćwSś<±WžŻlÜ7ƌß%v=¾]ĖļõX?ķcĘļ~ĖØē5ßäžqß3~Wß¹Yż:5Éó‰ūʘńŽJ…*[—ÖŚ:ļoÜ7ƜµOIĖZ?ēß¹ŻV±ś~ćnĪė÷1wyqćŅ3oČæĻŁ©ZŅ‹åĒ+īc“fFĖŖwåŸßnŚ®åŌĆź÷1·¶réįū)ŒĮ÷T-]Płīūʘ÷ßTZŅśœü»ˆ§vŲ¼d‹½ņ1÷1/éæ"›29’¬:óĄŸ²:»o^ˆ÷1§6Sņ÷ćł÷*Ž]ņņķU c>īcüšŪ٬}f®w^˜żpJ»ūʘ½Īż«ä»gņėÕ¦wüPņp…üŽVÜ7ƼléهŻó듇NĶśV¬½Ÿs6ε8ćzøė~?egż½U!’ŲVĢ!žæf0v*śĒ¶bńzéÓVƒ3ǁłÄ¶bq­žvPÕŅ+꿍mÅā¹õÜļzd»7ĖדŲVĢ!^ĖõŽģģģ…įGźۊ9ÄĻµØż¾wēĒ7¶sˆŸUW7œW\c[1‡x½×äŲVĢ!®½qMŽmÅāŚ×äųęż7ĢĪ;;_«oŅ6ėUäńs_ü\ŠuhYÖü»ę…q2kłÄ¬ßy- <^ēĒėĄĖ’¬˜ÕŚ$æ><š½Y%‡O¼¼ąÆėāuÅŲ ³Õ»ä߯ĘÜbĪń<ŲsÖ=ŁÜ»ņļ.bn1ēxśż¼†Ł¤Oņļšbn1ēxĶ3zē%[ß¹sĢ-ęĻя=uCÖbHīs‹9öN›ģņĪyMź÷h›]µ:Ļ'ęs®Żõ–’¾Ķ?£-]smÉcóžĘÜbĪńsz£õ{f“vĪės‹9Ÿ9żģģŽ—ņļ ~tn¶^Ē’Ģ-ę¦ļaÖåéxi<}?¬=ńx¬ćˆkr£īŹ–VĶĻö1µ¹5Iß’D®Ojk]žrӞų±wU*ķ|Q~ļ)~¾ˆc)ޱcéKYqüDī¼hu}~.‹Ü¾§ćµ.oZoŚc#Ž™xŽ»£žw-'}šŸs ©ŻČĆ>²˜gäö=µµ.OyjO|ß}N,©łd~æ8~žŠc)ޱ8wÖå‡ē‹öČŪė¦=ń87#c#Ž™xĶŠ±Ņ€l§ łż8ēTŪb»ėņ’;óĪ}Sn‘7ļūģžcņū§ńócKqŒy¬Óx^—?Vü>J{äikOܚ¤ńyœ›‘DZĒL¼¦½mXl‹7ņė^ēTjk]ž’ļ»ī·²/ŽĶæļßıĒŲŗs'Ī£¦§ęæļÕ'ńx¬ćˆ×üUoTņĔü“c;ķ».’·y“UĒJŁĢc7*—ųżC<Öq ¬;¶ÓŲÓ~ańųFE’»æ²įsĻ-ĢĒ&{ż•]śpžyź²}ČV˜_cÆč“2«ųą9ŸŽģ›īwœ@ĢčŸī ?ń{Ū×-ö}žżFח·*}žó¦…8ī^æōĆö,š×[nSŚiJž½“ń÷,žīČų鎍<Ż£9ŸŠæyŽqe¶÷Õłw2-K~ČF-jTˆY}ŪæÖ~÷uųĢæ²?öČĻūk"O÷˜ōI<ö=Ö䕿—d ÆĖėÖą±/²½vĖ?×ǾǚČÓż2}}5yńō†„×ßآЗѵ”žuÄžs‹9ĖÓż>}¹Åœ/œųN6®žŁü‹‹²}īļ¾6~Ź-ę|,ńÓ½×ā's‹97l³Sé‹g—b.ž¼CézW䟔bn1gyŗßŖOā1·˜ó}Õ^Éŗt>­’ƒ'ßČŽü+’#ęs–§ūÅś$s‹9Ļ}¾qi婇ā?S½QéēÕŪ¬­OŹ-ę,O÷»Ķ?ń˜[Ģłķff—“ķRˆ¹åns³‹nļ\ą1·˜sģKģcĢ-ęüü“Ę„—o—Ęļ[­Qéā©ÅļUBn1gyś½ł's‹9/nš\¶ōĮŽ…œ[W˜½ÕæĆŚüÓ؈9Ė[bž‰ĒÜb·“Ų©ōŪSóųcß”“^Ė<~Ģ-ęģś~ļįśxĢ-ę|Ļ£Og}»ēõyżųي?ņśÄÜbĪņ“¦é“xĢ-ę¼A»†„ķ™ß5(½ōäüųĘÜbĪņō{}¹Åœļ#’9sóńłĻ3²ƒvĖĒgĢ-ę,Okµ>‰ĒÜbĪ k×/żīø|~½\²MéiŸåó+ęs–§ß;é“xĢ-ęÜaܳŁk§ēėƙ‹geļܐÆ1·˜³<żRŸÄcn1ēŹ“·*=ćĘ|}›}FŻŅƒņõ-ęs–§ß›é“xĢ-ęÜą¢™Ł÷½óõyėŚs³ŽēėsĢ-ę,Oæ—Ó'ń˜[Ģł’Ó6-½éĪüü²ļÓuJ?Ü;?æ˜[:÷™s:':Ņo##‰Ēs_<'¶Ø_µthŸüŽŠSS«”ĪŁ7??ƾǚČÓļõI<ö=ÖdļOęe‡5ĖĻļMƾ‘=?"?æĒ¾ĒšČÓļ-õI<ö=ÖdÓs6,½¼ų[śÆĪ«Y:ūŃüś$ö=ÖDž~/ŖOā±ļ±&£®Ł°tĮ/łµDÉé5K»Ž’_cľǚČÓļ]õI<ö=ÖdÅ}ļd£>ĶÆ…F·_”ń^~ūk"Oæ×Õ'ńŲ÷X“9¾æ ĪÆåx­Jé—Ėó±ūk"OsJŸÄcßcM8uÓŅĪoęcfLJ딶«“÷%ö=ÖDž~/­Oā±ļ±& öY’Rü ꇓ¾Č>Ž$ūkbžéw2ń8ö=Ö$^ėĘkąŲ÷XóOkf¼Ž}5‰×ŗń8ö=ÖDž®uć5pģ{¬I¼Ö×ĄÜ‚/’W^ņ ”W ¼å(Æ@yŹ+P^ņ ü’¤ßnijĿ™PxŽZŸÕ£²Ź+rްtt6}ėq{½yc-¾o„Ž)²~Ėņē‰ż5w|Ö}aē˜{ĒfŸTĶķ§}<6xgžL­Č£O|&[|’KÕI#³!×/ä¹Ł¤²ģīĶr~ļčłzž>©ķŖŽŹ>­š?)ņčŸįŸékŅń˲ģÅēóśĢyzTÖ¹jŽ—X‡Č£O|ę[¬Õjrz±&Ó«ŒĻv6¾Š—U-Ęf›õĢėėyō‰Ļˆ‹µŚ<Ō¤ś¬QŁź†āæRgE>š×'Ö!ņčŸ)kkRoÉČģÕņś4ŽwTöū{yž±‘GŸųL¹X«ēØÉ®Åšģ\\¶¦$’ Ļļ_0=ėyō‰ĻŁ‹µZŸšü^¬IÆE¼3ha^Ÿ§xŽžŹqy}b">ńw±VÖäµbMꮑUž•ßCy^Ļ;ņüc">ń¹|±V©ÉŸÅš¬Žnlöł£y}ŗón‚ĶćĒ:D}ā3ćó­IY±&×|7&[R%Ÿ_µźŽÉŽz>ÆO¬CäŃ'>£/Öj5©T¬I÷&#²’äs꾓˲>{ęłĒ:D}ā3żāóÆ%ēϊ9?¹blöž¹yžćyÄÄåyž1ĻČ£O|`ģ‹9ļWĢyā-óÅ[ęłÆ©Y–x1_Óbž‘GŸųĢĄŲ—˜s„Ęe®7¢0ņLæ}›ēkZĢ3ņčŸsūbĪs~yėįŁ [ę5æõ‘ŁžG1>/ń%ržQĢł÷O‡eĻšŽs¾bŹČlÕ¬ü¹‚1ĻČ£O|īb|¾¢9w+ę¼iė Ł” ł˜™;{lö7ļ±­˜gäŃ'>§1>ńϐóżĖż1vb•ĒFfUy?Ēŗ}‰9GŸųLÅųüʘóŖ)²—&ä97[36ėŽ/o+ęyō‰Ļ`ŒĻ{| äüAįY£Oņų§æ82ūÄö%ę}ās#c_bĪOqmņŌ³yĢõĘewUĢėóŒ<śÄēLƾ|DĪ;s~ū‚įŁ7äĒ÷…ŸFf5yŒõyF}ās)ćó'cĪu~™­÷vžóųć²n7ē<ęyō‰Ļ±ŒĻ«|'ä<¢śˆģ®ņłuÄžeYćā3'cž‘GŸų\ßųüŽZ!ē^œ-āł¹ÖäĚć²ĖyžÆ<ęyō‰Ļ̌})#ēĮŜū½:"Ū£Qžėūʲ¾'äc)ęyō‰ĻŲ“/£‹Ļ(öœųYńœųMøÖ×“ń<yō‰ĻэēŹEŌäƒbM¶įZ÷Źāµn¼Žuˆ<śÄēŽĘZY“=‹5©Āµī}ÅkŻxėyō‰×“±V‘§g–śwyéŁĪßXĻ ćyĘoq½½å˜ŃٶŪęē‹ųN„¼ ½ė°?Ge{×Ī}öį]:Ļüœ™ųžˆų>ˆKO•½Z|ÖņmFe yG”9Ä÷|ÅwālümYVķŠÜēÓ9eYĆÕłœŠļŠļ‡zķqž[–ū {¤,;÷ˆœĒ÷°Ä÷­Ü0­,kņK¾¬÷^YVwTĪć;€āūV®Ē3“;å>÷ń>„7¶Čy|/O|’ĪäėFe?‘ó{Ž•Ķ~!ēń½ńżĶw=^\ƏęŲĘäžń=#ń}"ƒŽĪzNĪ}†ļČūĖŽĢł{’ė½lńżk']Ą;Öä>_=1&»Œėxėß{ßo5ké˜ģī+sŸŸ6ął½ósß¹ßT£žŲlżyĶj86kŠ7ēń½Wń>l16;óÜ§Ęc²ūx›łÄ÷(Å÷%ĶāŻX[óŽ'}økL6鑜Ē÷žÄ÷›ÄŽjßėkŃ^įXÄ÷jÅ÷g £ęˊ5ļBmß-Ö6¾WĪc‘ŽgĶ//Ö<Ö6Ö0¾/)Ö<Ö6Ö0‹XóXŪXĆųž¬vĪ>؜ĻßńĢżŸŠs?¾ē.¾CŹctońy,¶*‹XóxģnkH\+žŪšŽ×¶8¦MŚÉ†šß>¼— ½ē+ėøę\֖ø†ÄµØ)1‡cśūh[é}X®QnĶsˆkQ\sāūū–„5*®Eq͉ļks:§øFŵ(®9qķŠk”kщŵ(®9qķrz³øF¹żT\‹āš×®øĪĒw¤w8ļāśÆ^žļ’½ Ä÷PÄ÷SÄ÷AÄ÷DÄwpÄwRÄwUÄwCÄwFÄ÷×Ä÷ÅÄ÷ČÄ÷¼Ä÷æÄ÷³Ä÷¶Ä÷ŖÄ÷­Ä÷”Ä÷¤Ä÷˜Ä÷›Ä÷Ä÷’Ä÷†Ä÷‰Ä÷}Ä÷€Ä÷nÄ÷qÄ÷‰Ä÷ŒœvŪĻ™Ļw“ŗėžµĻc—§g°ė“žžz™3vžŗEĮæōŒ7žaĪÆ-£Oāīė³…Süō|xć§gĀė“žŃķ¾»tVš7~äĶnj/ŲõIü,öMĻØ7fäéõĘOĻ}•}ż™ł?ņŸVģ¶6žĻEn|Ÿo™ņOļ–µ­ōY}ä^—’ĪPŸČūVŸTˆ£ĻeEnn>›4ÅOļ·5¾Ļ Önüō aūž}ÉÕkó|ĶՃ vć'~ ūś|Ń?ņ½ŠļA>Ÿō¬QćWõ‰¼U1g}*rsėR|ļ°9Gžj•j˜źsķÜ|œX’óOµŠ5“>>ß5城Gl[©V©†Ę7·¶ĻvZ[ŸČS­b ­Ļ§MńÓū‘Ÿj•j˜āÆ,Ž ó<Õ*ÖŠ¾ū|Ż?½»9Ö*Õ0ÕēžS<Ææń#Oµ²>©†il§ųiĢ?Õ*Õ0åŸĘ¶ńӘ—§ZÅŚ÷ōkcFžj•j˜ā· õ<ÕŹų‰ŪwŸMņOļŚ¶­T«TĆTŸ—*œšBŖOä©VÖ'q÷MóԘ‘§µBŸōÜi÷MsӚ¤9+Ok…>‰Ū÷4yŖUŖaŖO‡ĘŒ<ÕŹś$nn>ß;Õ'½ݶR­ōIĻ÷6·{&^[ŸČS­ōIÜÜŅ:cĢČS_RSžim1’ČS_Ģ?qsóŁļ)’ōīxŪJ}I}LĒ·EµĒÖęyźK죹żOē—Ō—ŌĒ”<§Džśbž‰››ĻŽOłW <õ%õ1åæčާÖęyź‹ł'nnéHł_xźKźcŠHØä©/柸¹łī†ßwj$žś’ś˜āōgžžtó<õÅü7ßļb. <õ%õ1şĘä©/ĘOÜÜ|wFŠæYą©/©)žģķž(ų›ä©/ĘOÜÜŗ…õ­Ką©/©)žz’k}‹<õÅų‰›[ŹÓńyźKźcŠ’aØä©/ĘOÜܦ‡óWä©/©)~«®’užŠ<õÅų‰»o'ėŽ’Ō—ŌĒ?uĒź‹ń7~ŗŽ5~ä©/©)~ŗv5~ä©/ĘOܹ“ÖćGžęÆńÓū5œ;im1~äiĪ?ńtm–Ęgŗf³­ōī$ć§w¹oŗ63~ŗf“§ėv}o}`‡+œV”Bõž^²ńÕ*DC­jņ/‹Q¹B…*VØpU%ŽyVDƈżtQ]{ōĮõŠ×Ć> ½ø%śŲĻA’Ü }Oģß”oÖDūĮ耢×Å>]?żŻļ<ō_Ą­Ń›c’]?żŻļPōĄŠ·Ā>]?żŻÆ7śj°ś>ŲD×O÷; żcpcōzŲ_E×O÷»żwpōŲW”ė§æūµC’¬…¾-ö×Ń­ƒõ°.Š_+”WĘ>Ż8Ę3ī%č‚Ū¢ļ}5ŗqŒgÜ£Ń?k£×ǾŻ8Ę3ncō¹`eōŖŲ' Ēxƽ ż/p;t"÷ŗqŒgÜcŃæė ożtćĻøMŠ_« WĒ>Ż8Ę3n?tljćÅqóŗqŒg܎čKĮMŠbŻ8Ę3īn证UŃ7Ąž8ŗ~ś»_'ōÆĮMŃwÄžŗ~ś»ßčÆƒÕŠkbŸŒ®Ÿžīwś7ąfč±/F×O÷kŽž&X}#ģO¢ė§æū‚žø9ś.Ų?E×O÷Ūż-p}ōZŲ§”ė§æūŠž=øzS쟣맿ūķžøzģϔ맿ūuG_ÖEß ūRtżōwæōwĮč›b]?żŻļ,tē”óŃy¹ ]?żŻÆŗóŠłč¼œ…¾żš|ė`ääVō÷°®ļ{cæ¹yż'ģēżōw滐‹Ūб½uŃO÷»éƒ<ˆ¾Šķ½Š~ś»ß äbävōŁŽ¦č§æū݁\‚ E’•ķżō/ģǶKõC_ĢöĆĮæĮžąŲG Ż‘kŠgaæ4ŽńŒ{+rņśoŲū€Ę1žqoA.G”‚żHp6x-ŲūĶČČučs°ļĒxƽ é‡ C’ū„ qŒg܁ȕȝčK°·c<授\… @ūĪ qŒgÜ–ö ĆŃ×`æ4ŽńŒ{=r*rśēŲc¼B\¶®ś<ģMAćĻø×!ÖŃzZ×+AćļTģeH7änō/±Ēx§c‰œ†Ü€ž*öŻAƒĒĆćrb­§uŻ4ŽńŗaŽœ‰ F’ ū‰ qŒgÜaČYȍčó±ļYōÓßżBz ÷ /c{—¢Ÿžī79ˆžŪ÷.śéļ~"ē ÷¢Ėö®E?żŻļä\ä&ōloQōÓßżīGz"÷”/gūiE?żŻorr3śŪl? č§a?¶õŅż¶ŸQōÓßżīEœĒĪgēuVōÓßżīAœĒĪgēupėĄĖ¬µ°+µ‘—ŠĘŽ||ĵ Š ÆóæĆ°ļ ß·Å®l‡¼‹~4öĮĻĄŁ`kšy°XV…qnW•u|ūįą³ą”ąĆl’܆ķ_‚£Ńdz½8 ż7pk¶/'¢wG±ż$šYō?Ą-Ł®Ÿžī7Œķ§€ÓŃ׀[°]?żŻļ~¶Ÿ ¾€ž7øŪõÓßż³½;8ŻblĀvżōwæ;Ų~8}=¶×f»~ś»ßĶl?œƒ^ūĘl×O÷»žķē/£Wž!ŪõÓßżś³½78½:öl×O÷»‚큯¢o€}}¶ė§æū]ĀöKĄłč5±Wc»~ś»ßlæ |}#ģUŲ®Ÿžī×“ķżĄčµ°Wb»~ś»ßYlæ|½öŠl×O÷;ķׂ Ń7ÅžOŃO÷;™ķ׃ļ”oĪöæĄŃßĘŽ|lNĘžų'hć÷8¶ß.BƋżwŠ8Ę3īQlæü}+ģ«ĮUčSĮąalæ\Œ^ķæ€Ę1žq[³}0ų ś¶Ųc<ć–²ż>p.ų5ų#vćĻøūc|\®Ąnćwoģļƒ«Įļ±ĒxĘŻt9ŸœWß±Ż8Ę3ncŠyä|r^}ĆvćĻø @ėh=­ė×lŸ ÷bØīŒģ‰Ü€>ūN éUxüżš=š~…m Ÿ‡Ž}{¤!r.śxģ5ĄéąÕąnŲK‘]‘+џƮœŽ 6Ǿbęc^‚#ĄSĮśŲ÷FŒqś'Ų'‚ēƒ;b?i„˜y.½a±OŃgśūŲہձ ß@ß|¼\»Ū6@nEūĪą+ą-`ā¶ĮkŃgaĻĄĄk@×R·½‰~'ś¾š&ˆ9܎>ūīąćąąNŲw@ģ‡ż±_ƒ£Į³Ąķ±£Ņ }ö£Ą©ą„ą.ŲKaō)ŲO_o­>ÖŁz[÷& § ĆĄÅčGƒ‚@aŪ;Įčū”7EZ w”/Ą¾8 ¼lŒŻŪūcæNg‚ׁͰ+»#żŃg`/Ÿ/­M#ÄķżŚÜ żšIōĪądšbpsģnŪ9}öcĮ±ąŁ`½ā¶…č÷¢ļnßķ‡ż±_mĄĮį`†Ż¾YĆ”ča?œ^Św}ĢÓ|ĶūdŠyā|qŽŲ7Ēšō±—€Ž3Ē›cÓ±oęc^ū‚Īē‹óĘÜ=ŠĒa?tž8_Ü×±aęc^[ƒĪēƒóĀŲęhģWGŠsrw° ½"8< ō<ķ6Ē”ćŃqi'ŽĒĶĮ`5ō»Į·Š[ƒĪē‹sĆmŽǃµsī:FļŽūCĄŗč½ĮĒŠ7{[bw§ˆ ÷ æ}ŠvlĻŲnsq½qŻŁ|¼äæĀ6ǹćŻqo ‡ŽGĒå& ż“æöū0šSštŠnC-ŒwĒż~Ų]ē\ļ\÷Üę8r<9®Ŗ€cĄ3ĮmŠŪ …|ĢėPūaĢŻm›"}!Oaß t;ž»n³ÖĆŗ> ö·*n³Ū³Ż#A£ĒÓcē¶ ‘Ń_ĀŽœ ^nTܶx!śŲ;‡µw›ćŌńźøµvĪQē«óv°z?šYō-ĮgĄĖĮM°»Ķyx1ŗó²6h;¶gl·9œOĪ+Ļ®¢».ĒxĘķZ'ėemÜę

8/\ū¶G\]«®#®'Ī=×ŪøŻóĪv ×³WĻ£ŸŚūcīnsw=w]o¾ ŽÖ,nsw=w]ß4ŽńÜ×mžs<9®:€®£®§®«žó8x<<. ĄY ē Ļ nó8{¼=ī냮c®g®knóęeīm‘^ˆcŁ>8ĪGŽBŗ"G"½‘]‘RÄuļäxÄuD.D\­y˜Ļˆ5²ÖĆŗ4B\÷.B:!ęvŅŁ1GŪ±=ŪµļöÓžŚokąš}1ұ'"— ž ģ»u“žÖÕŚūcæ¬m}äR¤bīö±/bßģƒ5ņx[;kćq:ńŲX#ēćeHÄœ„\Žx¾²6öį<ľYckŌ ±6ÖŽ1rāŲ±ļ"żˆ50ėinÖĪ>z<ķ›5ō_‰xģ­”cģ*ıemŃ1¶ĒĄ=^ęę±ń;^=öÖĪ1v5āŲ²†Ź%ˆŪ¬½m\„Ūc`ś"ÖĶc`ęc^ė`=¬‹ĒPŸ‹·ylķ§żµß­Šr)Xæ(ć³½1C§!ŽcŪOūkæ=¶‡Ė–ˆĒŲ~ŲūeÖł d{Ķ=†½­ū:Fz Ž c·kNå|-Ż}Sdś‰Ų'‚G‚ ĄōÆ"ä-ō›°wŪ€óĄ*Ų•ŖČ+čĒc¼üÜ»²-ā÷ưļŽ®‚Tż>įA xųø1v„ā÷C° Ž žÖî؆ķŁn[Š<Ķ×¼ŌB{¶{$öĄ_Į°+¶a{¶{,x4č÷ŪaWüg=¬Ė3ąuą*pkģŠ9˜yö7Į؆ķŁī©ą•ąJp+ģŠ1ŒgÜ3ĮĖĮĄšŲcĻøē‚—‚ĖĮ-±+Ę0žq{ƒ}ĄoĮŲcĻøƒ€ĖĄŗŲcĻø—ƒ½ĄÆĄ °+Ę0žqÆĻæ·Ą®ĆxĘö?×Ē®Ćxƽ <\nŽ]1†ńŒ{;xų X»b ć÷n°+øÜ »b ćwŲü¬†]1†ńŒūč8w¼;īcĻøe ćŲńģøVŒa<掿¾‹’ āp>8/¦ƒƒ~_V»R™‰~ öąOądvjvBNE_.æe{Gp"śrš šs° lNfū±ąhō/ĮĻĄSiÆ?r²鏌Bŗ!eČBäT|Ļar“{€gƒ °‚Ÿ^ƒÜˆ|Ž @Ę"§!#‘ÅÖųza ¤ś}ŲAĪ@®EnA¾D"īČää,ü밟smsp4¶÷‘;Œšoä+äVd"r&2¹ƒÆßi‰œIœ°­BNCĢw² ¹y 9 †¼‡ŒCĪeæ£Ųļlбó6¶ŪŚžķ~‹ B&!=‡ū‘īųo‰Æ÷`6CĘc»ł±Ū³ŻåČ]Čdäld(ņ.r:ūoŹ~®)uĮ‡±}€Ü·Ū³ŻĮČTäÄŚ«?‚ŽÆß ·CŪC°ż„ŲŽķŁīJÄz=…œ‹X£EČ£HO÷e?ǁća!¶[į¶c{¶c<ćNCz"öŻćģńöø{käqlw#?"¶c{¶» ±Ķg‘ócyœ=Ž÷#ˆ³ųśGČ-pŪ±=}E¬Łt¤bŪök r¾~§ī8p<ŲžżµŪ³Żßł Čłˆ>"O"ē±ßį“ļ8p<¼‡Ü ·Ū³Ż?ČL¤7ā1V<ŽwļÖFžFæYŲŽķŁī¤ ™\€XS³ĒŪćīZR|żcä&øķĢDF #Öjr!b!Ļ!mńõž„ćĄń`lĒ‹ķŲžķzt.¼Œ\„X»ÅČóH/¶µ„}ǁća2n;¶g»ė”Ū×yHÄ>šƒĒŪćž:²12żä{ÄvlĻv+³Ķ¾¾Š\Œ˜»Ēł Äć-8 żSäFøķŲžķVEŸĪG.AlćväE¤ Ūę#Žƒ)čöm9b;¶g»ÕŁöųr)⾟ /!ē³Ķ5Öqš$ŗćāxwŠõj ²ś$pҹ ¹y9„mŽū.EŽD·ŪĮĶÓ|Ķ»&śdšmä2äVÄ:^7Æ!"sэżbžękޱm*ø¹¹qœ8^7‡}šōϐėįęi¾ę] ż)б}bīŽĶ÷‘®lóž] Ä1il…yšÆy»FOż›ūšr(Ū^E‡ŽĒAČ·ˆyšÆy»Ę= ZŪ+kŗyéͶÖäļ8t<:.ĄĶÓ|ĶŪ5b:č¶«‘ķ±Œų„ıcŒmąęi¾ęķ³æó«÷u y¬·Æ Ukx=¶oó4_óvŒ^öGNEō±­Yˆµņ\o.\7Oó5o‘9_ƒœŽ @“ļˆżÄ{©ÕĘˆ~ś›§łš·mx\®EĪ@ĢÅ»`?™‡8^ÄęŲ^†|Ž|Œ\ ł9ĪļƼ>ńŲ’ƒ~*ų*čw 7Ć·«”·Õ~ āoH@vC<ʞóŸGNFžB?,ĢuöwīlĆžŽć¹Ha\c«ˆģ‰\ƒķkä9ųIȟš3ĄŁ`ū›ŪÖģ’ŗćŁcā5SCPYŠķšäDäwō³@ūaģזģļqŪnŽ •–ČuŲ=žO#' «ŃĻ퇾ök öļžĮ[!/#‡"ŽwĒżWȓč‘_ąž;ģ‡ż±_›±’—čMį"­Čßqīx_‚ō‡OAŽC~Fwķ±öĒ~mĀž3Š]OJ݆쇓FžĮ¶%ųr ņ#ŗĒÖ~ŲūU›ż£o!룿„‚ø^9÷­įćčG#+ąŽūaģ×Ęģ’ŗćŁq]JžŽÕ}ŻÕą£Č‘Č÷čöĆžŲÆ Łßyw¼ āo<6®7ŽgēćMČΈĒųbŠ~ŲūUƒżļ ®Ksūžŗk‡µ}żä;ų„ ż°?ök}ö÷97Ģ-#ūč|ų¹ >9 q®_ŚūcæŖ±’óčŸ"%č«‘}‘ČÓŲ¶Ē!Ī9ėqhęc^UŲ’ztĒ®ėŹ‹ČĮˆµtķł÷˜x,®ĶĆ|Ģ«ūkw¼+%äļŚą«Ÿž£cĖćaęc^ŁßuÓµÅ1ł+"÷ŗīøžŽDœŪŸ”;ŸlĻ|ĢėŚ»Ż6«!³kézćŗc ‡ĆKkthęc^±ækбš>HKtēóĮc×|±¶“ėĮĻ@ó1Æ?ńwq½9łŁi†<‰}3šAÄmމAó0󶝿ÆAw½©ˆĢBŒķzv-öϐūįĪ)ĒŲM y˜y­fėéx·f Ū÷NˆĒł š>Ä1ᘾ4ó1Æ_š÷¼×ŽY…œŒø¹.m ރŲ'ēŲm y˜yżĢž×”»^UBf"­×£žŲ— wĆ÷BœÓw€ęa>ęõ#ū{vŸ‹‘żŃCēÅåąČˆk„Ü<ĢǼVąļ:ćœ3§ŸŪr œ‚}Š6wG\£īĶCł÷ģļ8u¼:†öC÷Ųī6엁öyWÄ5Ń6ĶĆ|Ģå;ü½īh?ł qq=q]©:f!/”Ūgó0󶆿—£·‡_‚“@w‹8.ū‚× YčÖÜ<ĢǼ¾ĘßyŽnMDĢķxä ģµAĻ“ž/=ozĢ_wKK±;N/Ž›}ŃĖŽשKĮ±Ų_FwĢŁūcæ¾Ąīu›}6ĘJä$Ä9ģ¼®^‹x¾œī˜ŸŚūõöSĮŠąą,92©€ųĒé`%Š9ū"R)C*#'c?Cxų²>2©Žœ„Ż8Ę3ī\dCd,Rń»ćĻøÆ #損Ų®Ÿžī÷bMĒ#öĶļ:ōÓßż^Gs½ß]ź§æū½‰l†<Œ8·Ža»~ś»ß[Čˆk³kŸß7č§æū½ƒl‰LDź"~×O÷{ŁyŁ ńóŖ~ś»ßūČ6ČcH=ÄĻsśéļ~ Ū!#Ū"mŲ®Ÿžī÷Ņ™„ŌG¼ž×O÷ūŁyŁńzS?żŻļS¤2iˆx½¤Ÿžī÷²2Łń|®Ÿžī÷²32q¾z¾ŃO÷[Š4AžDĻ®‡śéļ~_#»"O!Mē»~ś»ß7ČīČÓČnˆó”:čxZłŁ™†4Cöf»qŒgÜg=ål7ŽńŒ»ŁyiŽģĮvćĻø?"ū"Ļ!ū »³Ż8Ę3īĻČ~Čt¤²+Ūc<澂€<ģ4a»qŒgÜÕH ņŅŁ™ķĘ1žqGJ‘H†ģÄvćĻø""Ī×SĮF qŒgÜæƒēėéą qŒgܐCēė`°+øx5X܃Ō@žFNA¶Å~ø=X…TCÖ '#Ū`æl®ŽD*! ]zŲū;‚¶c{¶ūr²5ś`cŠvlĻvE:#[”_īŚŽķŁī*äDdKōĖĄ¦ ķŲžķž„tBź¢÷wmĒölw%r²ś„`3ŠvlĻv@ŽG6GæÜ“Ū³ŻåHk¤2zw°9h;¶g»ß"‘ĶŠ/÷mĒölwŅŁ½čłĒvlĻvæBŽC6Aæōülć÷KäX¤ś… ×OĘ1žq?GŽAj£_z}kćw Ņ©…ŽlĒxĘż9Łż|ŠĻ‡Ę1žq#G!”÷[ƒĘ1žq?DŽD6D?<4ŽńŒ»i‡ŌDļ śż’qŒgÜ÷#čē‚~’fćw”6dōs@æŸ4ŽńŒū6r²>śŁ ßßĒxĘ]€“EŖ£÷ż~Ū8Ę3īH¤śY ßĒxʝŠTE?ģĒxĘ}9Yż4Š{Ę1žqē!­ 该N qŒgܗ‘ˆóq¤3vĒ™ćĶq7©†8«"]°ŪŽķŁīlÄyč|\9»ķŲžķĪD† ž†n½¬·u?}(ö_Æ·ĪEƅŻóå¦ąé ×wĀ{¢oŁéŽ~?öÕˆß nݬŸż?ō;«»ą€g¢{<Ž‹^čư’†x½v>śFŲ=Ÿ×Ͻ޼>ģ¾üdk¤śƒŲG^C.D·~õAן Ąæ±[ æū:Żćęń³žó±†[ėa]ĻŽė>č#°’üƒ\‚žaw=u]½ōzĻ5ŚėÅKŃkĀ;‚ÖŃzZ×{ą#Į¾č ą!ÖŃzZ×?‘¹ČåčßķA×ĒĖĄ5Ų=ÖÖŃzZWĒ—¶+Ą9Ųļ…[Gėi]ÆĪŪ~čeŲńrzKģž/NÆ½Ž”{½y5zeų  ĒĮćįq¹> ģ¾ücÄćąńšøūEäZtĒ_CšJšŠŚ9–­³õ¶īŽÉuąLģCą#@ėmŻ]\— Ęī1“F7 ļŻó”5服Żc1 ¼½üDŠćąńšøÜDo’ń8x»ĒŌ9~'ś>šAĒ‘ćÉcļœw9žK'ƒŽ#Ē“ćź!ųš.ōį_ ‡Ē„ÜqāxqÜģ^Ž ®Ā~|&čxqÜø¾™“ćĶq7 n­·u’ń¼9żaģęņ xzsxŠqäxr\y®˜ :žW]A™ćit8üš^ō&š„ˆĒĮćįq©wœ8^7MĮĖĄūĄŸ°÷„[Gėi]æBŽG† OÄī±ų¼}Oų® ćÄńāøń\ų(ųś®šÆėh=­k5øĒŁćķqß ģ >®ÄŽ n¬‡uY†x]2Żū ޵Į‡Š›Įw=Īo»ēņĒĮač»ĆæA¬ƒõ°.ėĆ=N/[3šRp8ųöŽšąGHkų·H'¤ āēZē’Ÿƒ;ƒ»!{°ŸĒÉćåq»īēlk¶ņb›®­7!5ąÖŁz[÷=ĮK@×?÷_ZgėmŒåȉH;Äļ\+¾›"{įēqšxx\.‚Ouņ=āqšxx\6„[gėmŻ›ƒŻA× ×>pėl½­ūˆ}õū½k­óÜłī±Ųō8x<<.ßµķ¬@<ĖĘpėl½­ū> ū“B¾Ån-œ'®×!KŲŽĪÄīüŃ> żZš3špdŃO× ĒüČēčĄŃ ėŠė‡öqč7€_€×ƒcŠ~ś»N:fnA¾DŽ­ĻEū#č7Ɨ‚7Š~śĻÄĻ|Ķū+šVp"čye\»łš÷׹mą£E?żĶÓ|Ķ{x;ųųö{įŚĶ×¼æļ/śéo;¶g»ß‚ƒĄI ×ƒįŚmĻvæļŸ(śéo;¶g»ĖĮ»ĄÉ ×Mrķ¶g»ßƒwƒSŠ~śŪŽķŁī mNb×¦Ųžķ®ļŸ,śéo;¶g[+AūüųvŪÖn{¶ū#xųtŃOŪ±=Ūż “ęÓĄEŲķ»v۳ݟAϹĻżō·Ū³ŻU ĒüYšCģsķ¶g»æ€žóž+śéo;¶g»æ‚޹éąbģŽ%ķ¶g»«AĻ9Ļżō·Ū³Żß@Ēü ą'Ų³ŚmĻv]ógżō·Ū³Ż?ĄąLp vĒŽvŪ³Ż?Į‘ଢŸž¶c{¶»,gƒŸcwĪi·=Ūż ¾ź§æķŲžķž Žē€_bwģk·=Ūż¾TōÓ’sülĻx*åßµ½ŒžźUŲ“Ūžķzæ`8},ØæķŲžķś·hćĮyč˰÷ƒk·=Ūõ~Åštżō·Ū3^eō‡ĮWŃ]Ÿ.‡k·=Ūõ~É#ąkčśéo;¶g¼ŖčĮłč®ļ}įŚmĻv½_ó(ų:ŗ~śŪŽķĻæu{ |ŻuóøvŪ³]ļ=¾‰®_įo湏>Żæ…›.@wŻļ×īzåŗåżŖ'Ą·ŠõÓß<Ķ×|ü[¹ÉąŪčž·.„k7_óö~Łštżō7Oó5’–n*øŻónoøvó5oļ×= ¾‹®Ÿžęi¾ęćߌ=¾‡īuC/øvó5oļ> ¾®Ÿžęi¾ęćßģM”{ŻÓ®Ż|ĶŪū•Ļ€ ė§æyšÆłų·xĻ‚¢{Żw\»łš·÷KŸ?B×Oó4_óńoõ¦ƒ‹Ń½īķ×n¾ęķżŚēĮŃõÓß<Ķ×|ü[½ĄOнī?®Ż|ĶŪūÅ3ĄOŃõÓß<Ķ×|ü[>Ļ—; /bļj7_óö~µsŚó©~ś›§łšėēłr'Äóźi vó5oļ—ߎC×Oó4_óńo=6A<Ævµ›Æy{æžfŠó©~śæ6g‚Ūƒ³ĄĄŁ`}š%°؟ŗöĮ9`Cp.ŲŌO]ūĪąĖąNą+`P?uķMĮyą.ąkąn ~źŚż»īWĮ]Į×Į=@żŌµūwŁóĮfą›`sP?uķžŻõą^ą[ą¾ ~źŚ[€ Ą}ĄwĄżAżŌµūwÓoƒūļ‚% ~źŚ3p!Ų|lź§®ż@š=°ü<ŌO]{kpxųx(؟ŗö6ą‡ą!ąĒąa ~źŚƒmĮOĮv ~źŚ??õS׎\~ ź§®ż8šsšp)ŲŌO]ūńą—`šk°؟ŗöĮÆĄĄoĄ“@żŌµw—ĮļĄS@żŌµwæOæOõS×~øģ®»ƒś©k?ü<ü< ŌO]{p%x&ų3x؟ŗösĮŸĄ³Į_Ąó@żŌµ÷W=ĮÕ`oP?u퀿‚ēƒæƒś©kļž^ž ^ź§®żRššbš/š2P?uķ—ƒkĄ¾ą?`?P?uķW‚ƒW€3Į«@żŌµ_ :Ļļ•X F‚Ą2°"8 \VĒ€ś©k VGƒÕĄń ~źŚ'€UĮqąśą# ~źŚ'‚ÕĮ‡Įąc ~źŚ77ŸõS×>¬ N7§‚ś©kܜ֟õS×> ¬>n> ź§®ż9°ų øų<؟ŗöĄMĮéąąLP?uķ³ĄĶĮą–ą‹ ~źŚē€uĮŁąÖąĖ ~źŚē‚[/Ū€Æ€ś©k¬Ī·ēƒś©kÜ| l¾ ź§®}X|Ü|ŌO]ū;ąöą[`#š]P?uķļ Į…ąNą"P?uķ€;‚ļƒ;ƒś©k_ 6?›€Ÿ€ś©k’ÜüÜü ŌO]ūē`Sp ø;ų%؟ŗö„ąnąąą× ~źŚ—ĶĄÆĄ½ĄoAżŌµī ~ī ~ź§®ż°9øÜ\ ź§®żGppøų3؟ŗöU` š'ššWP?uķ«ĮżĮ_ĄšwP?uķ€-ĮߥRp ؟ŗöæĄ üt^’ ź§®żŠyī|o6؜§°=8}š°~Õµ7‡;‚Gƒ ĮĆĮĘąąĪąPpšp§"Ŗko >śÜĆĄ&`kŠēÜ6ļ÷w+¢ŗö½Ą! Ļ9Ü|ō¹ƒĮ}Ą{Į}AóMżQ׎¼ōļŠģ‡ż1ļżĮ;ĮĄ»Į– ł¦žØk/ļż»#ūaĢŪē6ܶ‚ꛜ£®ż šš`Š~Ųón ŽŽ šoźŗö6ą­`[Š~Ųó> Ž šoźŗövąM ×d?ģy^ ޶Ķ7õG]ū1ą ą± ż°?ęķs3®;€ĄŽ ł¦žØk?¼ōļžģ‡ż1o’®„x"xŲ4ßŌuķ'G‚]@ūaĢŪē~\ ž^vĶ7õG]{7°?čßUŁūcާżĄÓĮ«Ąī ł¦žØk?¼<“öĒvĻ/{€W€gƒ¶—ņQ×~x9čße™‡łŲnOšš<°/Ų “½”ŗöóĮKĮŽ y˜ķ^^^^ ^Ś^ŹG]{°čßu™‡łŲī%`ošRšB°/h{)u헁€—ƒęa>¶ėscĪūēƒW‚¶—ņQ×~Ų ¼4󱯞ą9ą5`OšZŠöR>źŚÆĻ€ęa>¶{=xxx6x#h{)uķĮąM y˜ķŽ voĻom/壮ż6š švŠ<ĢĒvļO§ƒw‚¶—ņQ×~xx7hęc»ƒĮSĄ{Ąną½ ķ„|Ōµßv‡€ęa>¶{?xųx2ų h{)uķCĮ.ąC y˜ķ;ĆĮĪąŠöR>źŚG‚'‚e y˜ķŽ;‚£ĮĄ1 ķ„|Ōµǁęa>¶;<œvm/壮żš8p"hęc»‚‡‚mĮĒAŪKłØkŸ¶ŸĶĆ|lw2Ų œNm/壮żIš@š)Š<ĢĒuėi°=X<œŗ^„õL]{CšhšŠuĢõ̼ŸwŸĶ7õG]{š0p:h?ģy?¶w_Ķ7õG]ūžąĮą Š~¤žĢDÆĆ„‚² 2 ŻžŁĻ‘`Å*sp=pX VĒ€UĄ±`UpX  V'€>—ąapš°8¬> ś\ĒĄĄĒAŸ[3¬ >ś\ˆÉ`p čs9&µĄ'AŸ‹ńø9ų4čs_¦‚›‚Ļ€>wāYp+š9ŠēžLė‚Ļƒ>—įp[pčs¦ƒõĄY`p6ø=ų"ø8¬¾6_wē‚;sĄ†ą+ąĪą«ą.ąk ĻĶ™6_wßwßwēƒMĮ·@Ÿkņ6ø'ųøøl¾ ī ¾ī¾ś\˜…`sšŠē’|ī~śÜŒE` Š~µķ‡łš·Ļ±Ÿö×ŗd u°æö»“NÖĖ~·ķ§ż±_‚ÖĮzŲļƒ@ūiģ×Į u°ö»5h?ķż:“ÖĆ~ ŚOūcæŚ€ÖĮz| :NŽĖĆĮOĄ¶ u9“ö×~·­“õr\ū\DZćÕq{č8w¼[7Ÿk“l~ ZGėéø?tœ;ž×ǁĪēƒūuĶÓ|Ģ«#hć9/|n‹óĄńīø?tž8_œ@ēA-Šq"čmś9t'ŠĻ›;ƒ~®lśłqWŠĻ‰»ƒ~Üōsß^ Ÿļöż·/čēµż@?—śł«ōsV)čē©  ß›“‚*"' łĮą‰Hė¢ķš$äPÄmm.H[DŸĆ“‘Ć}@NAŚ!īs$Ņ9 qߣ‘öE1Ę1EŪ± ±Ž+Ś:€Ę숸ķxÄŲęŖO'Ä6ĢUßΈm™«¾ęh›ę¦Æ9éc.Ƽy‘óÄŌc ća)8ż6ģ_#ŚGa’ü üSōÓ’z|^Ć’;쟣ĪGæū7ˆöG° ~.-śé>ļą’3ö/Ń¢ū»€sūģ?a_ ®Ÿ,śé?æ§Ą_±®'7cߎżµ?¾üü|¢č§’óų=ž€}ø Ž€}öמ8ś ššpBŃO’ēš ~…ż[p 8¼ūÖģÆ}ś×ąwągąČ¢ŸžĻą÷żŻŽ±øŻ|ķżŚ’żµо-ų=h?ģ~ś?ß_ģæ Ū@7_ūcæ¶`ķ£×W€öĆžč§ææ?ų“ż·fūJtóµ?ök3öמśVą ż°?śéļļ'~g’-ŁžŗłŚūµ ūk’{]šgŠ~Ųżō÷8{¼=ī«ŠĶ×žŲÆŚģÆŻćķq’“öG?żżÄjü·@’Ż|ķżŚ˜żµæ}sp5h?ģ~śū;_šß ż7tóµ?ökCöמ.öMµƒöĆžč§æćĢńęøūt;ž×KķŽ7ĒŻŸ ćŲń¬Ÿžąó3ž›o ŗłŚūµ>ķk{š/Š~ŲżōŸ€ßų×F’Ż|ķżŖĘžŚßĀ^ ü“öG?żĒį·’Ń+TĶŪ3óŖĀžŚßÄo#°"ŪĶĆ|ĢK’1Ą÷ųoˆ¾ŗķ™yUbķÆć_¬Ävó0żō…ßwų×@ƌn{ęc^Ł_ūkųoVa»y˜~śÄļü×GƊn{ę3ū?ˆöWšÆVc»y˜~śĒēkü«”WG·=ó…ż/Dū\ü«‚>OÕ<ĢG?żĀg)žUŠ7@·=ó1Æ?ķ/į_ōy­ęa>śé’ >_ą_ ½&ŗķ™yżŽh’õ@Ÿk棟ž÷ćóžŃ7B·=ó1ÆÕˆöYųW}ެy˜~śßǦOń’‡ńX ŻöĢǼ~A“ĻĄ’oŠēٚ‡łč§’=ų|Œ’_lƃn{ęc^?#ڟĒ čórĶĆ|ōÓ’nLį’'Ū7E·=ó1/#„ż9ü’}Æy˜~śß‰Ļų’޾9ŗķ™y­@“?ƒ’o Ļū5óŃOĻSžÆĻ›>ÆŲ<ĢG?żoĄĒóēzčž/=Ÿ^ż D»ēĻ;>ŁóØēSżōæĻ7žw¶E÷|ķłüģŸ!Ś=ßxŽńyĖžĒ=Ÿė§æļ…Øųģł7ų^ļļ²¹šœ$ąü×ńų#Oķż?nżæŽP}ežŠ-q­õæøÕęü^õ=õō3žŸ’mSõfŽwńæł”oūŸ+ąųØßŒu«x¼ĘÕ5 ü_yŹ+P^ņ ”W ¼å(Æ@yŹ+P^ņ ”W ¼å(Æ@yŹ+P^ņ ”W ¼å(Æ@yŹ+P^ņ ”W ¼å(Æ@yŹ+P^ņ ”W ¼å(Æ@yŹ+P^ņ ”W ¼’߯€7P·!7Püū‹éRś»ž<…+ˆ‰W¼fąžmHņŁ4šŗ× ¼~ą oxÓĄłÓ†µń›Ž"𖁷 ¼uąž oŹÓæĒM¼}ąž}n²ū·ø‰ū7ŗ‰w ¼{ą=ļxļĄūŽ7š~÷_Ė+UųĄĄo |PąƒųŠĄG>:šńO |RąSŸųōĄg>'šyĻ|Aą _ųāĄ—žeąĖ_ųŹĄWž[ąkgŲÆ=֕Æx͵¼Rį}•Łß?œŪ4Ųė^/šś7 ¼qąMoxóĄ[Ž2šV·¼mąķox‡Ą;Ž%šnw¼Gą=ļxŸĄūŽ/šžkyÅĀóóŚV,<ē7ń[ƒĻ Ą>$š”|tąćŸų¤Ą§>-šéĻ |NąóŸų‚Ą¾(šÅ/ üĖĄ—¾<𕁯 ü·Ą×^æ5Lu®øƒ˜ģ5Æų¦× ¼^ąõox桛Ž,šę·¼eą­oxŪĄŪŽ>šw ¼KąŻļxĄ{Ž;š>÷ ¼_ążųĄĄo |PąƒųŠĄG>:šńO |RąSŸųōĄg>'šyĻ|Aą _ųāĄ—žeąĖ_ųŹĄWž[ąk÷ļŸÓ8÷o±÷ļĀ÷oŌ÷ļå÷o÷÷9‰ūL„ÄėŽ0šĘ7 ¼YąĶoxĖĄ[Ž:𶁷 ¼}ąļx—Ą»Ž=š÷\Ė+žŻ›÷½Rį¹¼‰÷ >żŠ¼b…Šśū€µœõ-ÆTįÖą?(ŲÆå+ YĖ+UüGūčµ¼bįŁ:)·‰ĮŅZŸJ…ēė¤ć8-Ų§’™Į>g-ÆXxvlŠ??ų/XėS©š|×Q°/žK‚żĖµ¼bᙫ)žņąær­O„ĀsQSü߂}Mšw ¦8•×ņŠŖÆå•*Ō,rW­`ßt-ÆX”īZ^©B½ą_?Ų®å Ļ8E-\G5 öfky„ĀsIõ±ŻĮŽr-ÆXx¦¦>^µö¶ky„Ās-õ1Nū`ļ°–W,<3Sćt önky„Ās,õ1N`ļ¹–W,8š!Įh°öŃĮ>>š‰O žSƒ}Z°Oö™Ļ |^šŸģ ‚}a°/ |qąK‚’—Į¾,Ų—ūŹĄWž[š_ģ>\•|ž-rQõĄ}Ž˜>ŚkŸ–ģ> ,Åń¹_É^?š†7žMƒ½Y°7ö· ¼Ušoģmoxūąß!Ų;Ž%šnĮæ{°÷¼gགྷŸ`ļģżļų€Ą~kąƒųĄ‡>"šŃ|bą“Ÿų“Ą§>3š9Ļ |~ą _ų¢Ą¾$š/_ųņĄW¾*šß_øĻ JćÖē÷$ī³t÷¹6‰ūŒ™Ä}ŽKā>{%qŸƒ’xżĄŽ8š¦7 ¼yą-ox«Ą[Ž6šv·¼Cąļx·Ą»Ž#šž÷¼Oą}ļWä®'żƒ}@° ö[ƒ}P°ö! >#‚}tąćƒĻÄ`ŸųŌą3-Ų§>3ųĢ öyĻ> ‚}aą‹‚Ļā`_ų—ĮgY°/|ešYģæ¾&ųTؖUEåĄ«¹«~Ķ`Æų¦Į§n°× ¼~šiģƒ½i°7 öęĮŽ"Ų[{«`oģmƒ½]°·öĮŽ)Ų»{·`ļģ=‚½g°÷ö>ĮŽ7š~Į§°öĮ~k° öĮĮ>$Ų‡ūˆ`ģćƒ}b°O ö©Į>-Ų§ūĢ`Ÿģó‚}~°/ö…Į¾(Ųū’`’2Ų—ūņ`_ģ«‚ż·`_ģŖ‡ń_䎳źĮ^3Ų’{o®cöż.B†eHˆPZ¤Ģd%ÕZĻC!’&*$SfKJ”¹Bf*dXJ’™¬ē1+3™ē ™2”¤Rö’wß×Y×÷īż½Ē»oæĒ±÷>¾Ž£ē’?’÷uŸ×}]ēy Ļ}ß֓ĒÓóyzAO/āéÅ<½„§ßķée=½¢§'{zUOOńōjž^ĆÓk{ścžž¤§7šō†žŽÄӛ{z+Ooēé<½‹§w÷ōŽŻćż<ž¶Ē{|øĒGx|“ĒĒ{|²Ē§x|ŗĒÓ<>Ēćó<¾ŠćK=¾Āć+=¾Öć_{|³Ē·{|—Ē÷yüĒyüøĒOyüœĒ/zü²ĒÆzüšĒ²ż»WÉäń¬OōxēóxAńx1—šųŻ/ėńŠOöxU§x¼šĒkx¼¶Ēóų“oąń†oāńęoåńvļäń.ļīńŽŻćż<ž¶Ē{|øĒGx|“ĒĒ{|²Ē§x|ŗĒÓ<>Ēćó<¾ŠćK=¾Āć+=¾Öć_{|³Ē·{|—Ē÷yüĒyüøĒOyüœĒ/zü²ĒÆzüšĒ²{łļń¬OōxēóxAńx1—šųŻ/ėńŠOöxU§x¼šĒkx¼¶Ēóų“oąń†oāńęoåńvļäń.ļīńŽŻćż<ž¶Ē{|øĒGx|“ĒĒ{|²Ē§x|ŗĒÓ<>Ēćó<¾ŠćK=¾Āć+=¾Öć_{|³Ē·{|—Ē÷yüĒyüøĒOyüœĒ/zü²ĒÆzüšĒr$$ćöö<Å<^M<ü«ūŠŽó”¶§?ęéOzzOočéM<½¹§·ņōvžŽÉÓ»xzwOļķéÆ{z?OŪÓ{śpOįé£=}¼§Oöō)ž>ŻÓÓ<}ާĻóō…ž¾ŌÓWxśJO_ėé_{śfOßīé»<}Ÿ§ņōcž~ÜÓOyś9Oæčé—=żŖ§_óō„Äó'“ćäOVOOōō<žžĻÓ zzO/ęé%<żnO/ėé==ŁÓ«zzЧ׫©æA«ūDYóÖž^ėżĮ‘]0“³&:¼ųšoõwjķæz5n’Ź‹Z—ÆX±’i’wQ§’łļėĖŁž‡æ[pÜŁ—ų»ø’ńæńŁ{æéėY§ä ĪĖŚÜį±Ü”],Ä’xž“³6’Nm֕’µæWkÆ?×’?š×I?+Ä ł0žĆY?’ž°ßŠųö’›8×fķQ’’žæĮĆ^ ņż%tŅå|śõæRī?+C]zģä[Œ’š_։’ē|ūĻüżĻŽįövĢ×’WŪD=֞’«ńĆę{Cößj=s­–;üżœžćKV õ~•6Ź[mĖęįŃĶśßŹ‚ėķHFeĻāéįŽ„ć¼ĻŁOhó£¶ōAž ž‡’t«ó’Ń’ŚżĪĒ†ęœžä?».;žŸ]׋Æj”čž÷ßżüŻlUāÆ\sÖŃéĮ8Źśvöp}ļģĮ”ĶyYh›ßķļ±’w_Æ­?’Żõüo’’k=@~šĆAÆ`°j˜©]£Ś_É#’[ę)§†Œż2ZdÕŽŌ–%ņK{¼šåž”v|RżHń¾‰ŅžLī;,Ō>Ÿ8!2ä赘~9„īf½ÜˆæżÖDräÜ+mjÓ³CmŠ÷'"'®¤I{ī„^é”vĻĖ×#W×¶“¶ŗ×.żĄ:ēösc“yƒŸō34?÷­ØGė™š=ś}¹Z•5c¾Éģaå^jšS*å¶ų×_†uķ"ų+[.ŌØ÷Ģ•4iϽ4ä”PćśņäÜ+mjÓ Ļ†Śµć½£×¤-Ŗ›Ü6Ō«½%ū&FõėÉŗ‡Z9õK›ł„=^8±oØe½ŗ¾r«<„q…”–oÕŽōVA¹łĒ­Ü–IõcIæL›Ģߌ‰bƒƒzė.“zč·&–5ø¾fSķś^’žDģhŠŽŁ£¬wæ|=vz-ķ ¶övsc¼RŠ/¹ś[ætJĶļ?4ƒ~Ś&c?ėæŽ*7/čē\ż­Ÿo•æ¤uÄ#2ŲāŃ^õžÄmö(‹[’®ÆHßfS’‰ÆŚ1.ȃŗ -ŽU{Kł’y“åː•{Ó[y5’8yõö®ŠŃŸŻ˜ÜZłWM¢ńŗĀĻ–ėq„ņųIńųėśMŖ¤­*M‘9ł•żć7$é7$ßÖo… ,Õ‰&_Ė_8žCyżžÉ`å÷üŪ¢ óžŖ|°ómńõĶōŪŸé·¶^(Łļtj­Ŗ·Ē×¼~%sāqż–Øź-£Xr-ÕĖ4@æ;¢s/,ś>õz“ĀńĶņåĶ„ĆÉ6ØdōÜ/‡R³,’±|ėB3‡©]K–ĀūS7œŹϜōō­Żé÷P[Fw“ŠĢ8š?¾åõĮ9² ė8ęPüįÄÉY†ė7JŻmń`ÓHµŚyć»›ŻT<6_k豒Ń23Fv„䎒\¾V„‰ś‘ūW—Žs¶AäĘäœńĤ›*”éŌ¶htā3"÷ŲľŽ6O‘ÓaiaīĘj&>_·–~@„ʲۢł+NōqCüD³÷LŅ2eZ2ŗ±ņ‡‘ńGā*“­użcżęœźČ9tb¤vńæcł“®Ö~g²~›¤sŃ膽;#GN{½u¾æĪ…uDĆ1«X©i•Oõ›aé·E×_ŻŁ<éhģ·f##g×ėw‘†•ŒŽū{C¤O‘ƒ±›*\{nļś-æ5e£U>[¹§š¾ŲķI•Ÿ??GæŚ]ńš[dQŚ‚ŲŸÆw½„­~°…xōĒj¬nāīNė4<°ź¶čī# #æˆek^­ö•oõ>ļ–ŒĪĶ{6²©ąœŲf¶.¶Zæ„§:ę=ųcä© ³c„’šµ?×o;Z4Ś£}¶č˜Ś½b7ö}æPń+aå4ēÜ Ɨ˜Ü+›ü5[{[ō‹™£ó–wŻŅ¼ą·}Ƒż~Éh’÷2Fke~)V¾ĀÓ/_ß­ß¼Y[6Śæ{BtĻŃö±JIm»õŅ? XõzŃčųõ7E3]ū3=wß-·fÓ÷ōS;ŗkė®±õDb“¾u£fėo‹Žv,gōłęWŅļh~Wż³zł?uDÉč̑٣}|)ż¾ yzl:£½÷䂼}ļ-ĢCŻ4'¾ō˹O$¶}-ļÕ1-O4aåŁ%šæŃķÕq­fĪhĀ”ó Øp„'ZSÕńš9¢ś•›÷%=ŪvŒS;~üóĻTŚĮļHY;i.”‹ üŪŽHó+©“#æö‰ÖŽ’_J„÷ę’·gŗžO„פõQ<ŗ+ƒj÷ŠĆŚpQńø¢9ŒxüVVc]ń˜«xL_Ž5B<¾/Ŗß±sńx óKā‘”“~ÉÅcćŃöā1¤Œ~SWyUFy57mA„¼š+¬ƒ¼:®¹“¼zš!—WŒų"B^eW½›”W_(ÆÖœ!Ǝie™©¼śRyUwĆģyU¬š~KHćcĘǾÓĒ#Œnė`|hĶ‹0>6>£ßčÓųX§ń±~ŅŃć#ænL\ŅųÆńѳČĮ㣔ÖćŅn|”/¼/ĀųČ[_ćCć|œĘyr,K”q~\}O_Ķ ×Ść|yż¦Ęy>óī#nˆ2Ī[׊ļ Ēłø# QĘy†ęś óDóZÅ’Ž0Īū¼ØßIÖ|uÆę«©GóG™Æ~ÓźPĒ·įe¾ś£›~ėXóUCĶW©µóF™ÆŖ§ßBŌ|•¤łj{Jīč%ĶWm:éwUGiĶW™’sF™Æžź¢ß3Ō¼;RónŖ·G™w/+{©ćVĶ»/jmdŽ}UóūĶ»‡4ļžÕ¤p”y÷gż`afĶ»4ļf*X0ʼ۸»Ę‚ęŻĖ·īO]w*”y÷ŻŽśŻ!­oOž¶`t‹¤(kŌ"aoåxfA ­É¬)ķ4B2±.ō{ĮŽĪš·šéw‘4Bʰ~T{}ĮÕü…£¬…zÉėLBĖ÷Œ²Ī“Ņ”ÓūN(hGö?¬wio“ćŪć֎Ÿ}Ÿ~-hǹŸ¬g~9”ž1hǤ“ÖŽŒ…÷§Æ Ś1÷ķ`żxpG«ŲGAÕŚŻ_{š‰3’W¬*Nu ņźĢņŠõcsåc£‚¼š°Œ¼bżČ=tb,5Č«¬KČ«Bė÷īŒm ĘǤ³ŒźŠųˆŻŒmSnżˆÅ‚ńńņ*ĘĒÆįųˆuĘG¦4ʇ[?b%ƒń±ez0>4ĪKOų-6-ēļŸbœSĒ[Ś«ģĘyéē¬;w\ŒżŒó•Kē¬sņž-Ęy扌s֏¹ž‹ć|źŲbē¬šÆā/óUדĢWŌ”ł*v$˜Æ6f¾bż˜· s|x0_šĒ|å֏xR0_ĶĮ|Åś1 {B|A0_MĪ|µNóīčõ7ÅgónåĢ»ŌŃU{³¢Į¼;½?óī‹Z? ĖO꯿s˜w«knŸ>2{üĢGĢ»‡2ļ>¦:r5É’"˜w?ȼ{RėĒĀńłāUŽ®¼(oßMĒōu¼¬=įÖae=‘8”Z­·NĖOŲXqQ‰ężµkŅo©©Ž«5Uļ“å=P!ū“–Ŗ#zcŽxB÷²‹īKśōm4Ś1Jķh¬ƒ•O°R{ѵĮ:8½?ė ķ(Øv|¬ƒūē°ŅŽ)jĒĮ:xq(ė ķČ®v<¬ƒŸ d$UĮzŽõ¤­ē·+å‚õ|ó`[ĻӏCĮz~jž­ē}ŽĖļ¬ēsGŲzŽGńČxŒõ|ĀpÖsö%•W›‚}Éū§l_ŅYyu]{ąŗ‰e>°}É*åU`_²r‰ķK&*ƾ ö%'ھd²ņŖM°/™:öh<s5>.ū«Igmu—ĘG’öŌµ·MµżÕÜ«›cGƒżÕĖ«Ų_1>śż½!ö^°æŹ”fū«Ū>[«쯶LgÅ8]ć<ģ'\°}āpóµGgœŪ>ńj…©±7‚}ā™-¶Oœ«q>%Ų'NXfūċC&ĘūĬKŲ'2_]ŻŽ*öY°ßķ}Łö»ć4_•ÕžŸłŹö»·j¾Ŗģw/²żī‰ cūƒżīņ­¶ß=w¦A,1Ųļ^ŲĢ~·ŽęŻ<šwėūöģŲ¾}²¾C“ öķß·}{Ķ»_`ß~ī'Ū·7Ѽ›=Ų·O:ɾż¤ęöž·īOßģŪæ8Į¾żė…¹¢{ %V¾ćā;ńFšėwÖ}ęßžŠl:9ęŻėŠŸÖXKxKæĆw2G“ߝ'īéŁtH¼f[ƒ…ś æ;uϫߢ{ŗ~7,~čżNī{śM:{)ž|䮂Cć?ēŽTš}ÆŲ¼ WtżŁ'"+›ˆ7ė37ĖGŚėÜj„GöUæü@ł£G$$“V‡v?ymÅĄxƶKr]\śK“7’3’x¶ 9×ÓoDŹ_ć?wGj§¾Æņ`÷2åōCˆ™Näˆv\½#2ęhßųȶ«‹¼µ<ō·ē•"Ń'Jtˆ—É3ŗV±śĪ:'W4÷ł¢3N7ļ3#oŖf‰·Jd‰f¶p“ü'ķāć¼Ł;UżšCŽčĻu F’Ų*žCŪž„v¬ ż%ŽžH4ĒķÄėēŁŅØęLķįŅrEĒĻJ‰ž6;5žiŸÖ·,=„µ»x–čMKkFēØϚņŪ…ęé÷fåˆ>żCõhæVÅ«·{-¹÷¦ŠßS%:DwæR$Ž'ψöļ,Óļ"~’+Ś÷—¢Ó äoč“TųŹOZ“å/¹»h›ž…ć=S¾}”‰®„ƑŃs“ЦÆ-ŸÜ®^jĀŽŠŸś.śēĄ½±ÉyjōčµMæg8%Wtļ²žŃͽ¶ÄŽōŁZtÉ/śm̤,Ń åߊž^nOlgJīvē5Œ8”#zµkßh«7wĘ~l—žš™BŠmō|üłŲü<½^ųGµćĆ\ŃŁ×ūG3 *öSŸ¶·ó»Ę‡üķ-1$šŠ²q,Wź³ój{ö`ŽčÅa£Wg<+Ō~ę#+ō½'QłĀ}Õ ¹öĻ_–ēäźå„o'ēŠężN“Ē’ ~īsįv“śņwŪīaŹ·ķó‹§vė‚vņ@Žh§ŠŖ£Ų±ł„Ū_©†æ*ŗ¾3ŹA®/½ ~‡R×÷©®ļڰ§"\ß}Y^‘æ=ŗ¾?Z4Žp}ēµVŲõż<ćŁ×WCė*žr…ż”’†TŌļIŖ’„ż”’ź$j æ‰a’Ečæ¼ZߎS’żö_„ž+ ½žˆ/9H|ūŌҽfÅ÷ ÅwFüQā›=ÆīĻ*¾÷*¾m{ŽßéŗĖŃ^ń=„ųĘÖŒń-ś#’ųŸüūŖ‘~ÓZł7Ał÷ūģŌ(łWū–„„cņ—7Ģæ(ł÷ćŚæøüėßź”(ł789ō§Ü‹>­kd| kÆßüŌųČ£ń1ūtÓ(ćcö±oj|dÓųØōI»(ć£TSķ½æĻżEćć¢Œ ŗfŚūūĄ½‘ÜźCĘļć=ō¬æ;4~óéeü> gÕų­Æńūhź[QĘļ·ķLßÖæŽö2~ßŌ³NüUlļSŒ™_ŽÓž÷Ķ/K4æ¬i> ŹüŅé­eņW^óˁJC¢Ģ/^Ö^VóĖfĶ/}W Œ6Ņü’ēŃŠ_rī% ÉĮ`®{SæKŖ9±õé ‹_|'ʜX^ūą!ņ—°tĮĀīß ‹2ׄuUŸŹßŹ3sön:$ʜųQ]7¬|>Fžœū޹>濣gŸˆ­®ļéß_Ņõ1’5,Ż8¦łO×·ó4×Ēüwe÷3±×u} ŪÖ¹Äõ1Ÿę“7ĘĪ–§Ł6śłļ»æ6Å4’ŃæŠĢm’ÜÓü§ž¾‹žcžėµzGltŠ‘č?üÕÜR7ˆo§eėłÆąłāS‚ų>’ńežĖūlįx© ¾YW_ęæku ĘÆń}cńÅ_>Ķ}™ƒü«<“ücžūxVJüR“N‘Ģ…–ÖŒ§Ø©üĖ6ücžküCõxŸ ’n"’š×Psóę`|tĖų`žšĖ ńIĮų8rœńĮü—Ņæ]ü…`|”›Ęų`ž;Ÿ£U|a0>¬NŠųĄßMZ;N('ēY1”ńĖüwdYĻųā^[4~ļłžńĖü7¹ü[ńļĖķŃų½4ŽńĖüw½kßx½7wjü>¼‚ń‹?å^|A0æ Ąüņ…ę—Ļ®÷Ģ/Ž1æt—æ}%†Ä×ó˧#™_jžūyŲĄx,˜_/e~a­UīÅÜ:pѲ<·¾Å¶7œ’ā5kŃĻ}n:†öœüiž‹'zgQńŌwßG;ĪńjG,*Ż>ū4ü%ėśīSĪĻ3dóó<]_š®Æv0?O8ĘüÜCžvéśjóó§#™Ÿ¹¾óŗ¾ČLęēĘK™Ÿń—]ż—¤¤’X?īP’ķT’ż¬÷|ĻśńüU’+ĻśqiėĒ(õß/źæ”Įśńš ÖüÕP|Oė[—±¬oß®Šļ’`};rœõ­¶ā{—āŪ;XߏMc}{Iń= ųn Ö7ÅWėžž¼ķ‘xį`ż­<“õ÷åß`åߍŸ²žN:Åś{\ž”±`żĶ6õwžņļ!åßČ`żø‰õ«um/ūƒNĖŲdųńčć*O µŗ7¬ē—ńģ>W&ÓŌP›«{Ņz~›Q'wdžg”VS÷³ė^Få:ńz// µĮį=ųŲŗŚY·ż&Ō*ėŽ’ozžŪ±ö7-5ņŖ©īUŖ}C»~ 5ņÆļƒ*­×nķßr/+’(·>ļæž2*’š—tgØQļYŻ¤Ž UBė»I÷"¹¾‘µBqō¾īŅŽĒ„Ś÷ü—ö^kjÜó_śeKėPė’1xžK’Ż©?8DŸęuĻŸxtži+·Y÷Fōü<šżŃŁ»ĢßtÅMĻĻUļ„UVļżŗ¤žÓõUŸo××G÷ Žķø:ĆŚq—ī}Ń½Č޵ļūŠŚKž%żņ×8ėņÆåM,,Z»:«yp}äßÜ Ÿ’gż\Hžīн4üY<کޫŗ÷µ®öÕ·;t}…ƒųVŸońØvŒ ņąŅ*˃įjļŻA¾ĢŽeł2Č=’„_Č«JczV»^grs=’Ū3!a·öWhO؟›ėĻäž7e’m{Øż¤xÜ!ózö»9Uū+Ź}©ø½­z·ōÜRøžžP«­ųfŃõļ9#ićŃP¦œ\½WŸņ¬œK¹7ÕĻ”ė•õ_Ł•ųŪ”'ŌØ÷¼āF½›µWę\®/æāĖõU)jóŌŽ”“ćó’”ĘxS’EiļķĒ9—uA÷¾¢Ŗ_²Uµ,ĖŪ&·Ń³śÆLÅP»AłĒ{ ö¼š«•[§xÜś;gž¦*nƃz+·z«(¾9ƒė{ž°]_oåĮA;nŁgķ(”|¹¤ü+Ż«Ż.ko'åU _RvZætPž=ÕhłĀź½ŽŁaż×^å> ś9e§õsł+¤üßţµźż5ˆŪ-ū,n·éś ń}ž°Åw€Ś”žST>nyšŽŚ{W˜/ē,_z+’ōģIyuįWņź±Gß©vē”ļ’[Õū%Ö¾]BĀoŚ¢-œ8'uĀ”ó±ķžĪŻI؍ØS*Rłėc±#mø=ūŠP{vmH»Ē6Ęj·ĶT®ĘšPū¤ĶäH‡ģsb“ŚģŖŗN{üu;µ$r¢Ģ Ų/­}(ļ¾Pū«įęȝ÷=k×ŗt¹ŚSS®Ģ…}‘,‡ÓÓ[7ØWüg§U8yqäCÉēZ-}œž³rU§§RīpĪż„Ž÷@Oė;¬Õ{¹Ģ õžæ+Ōø¾W³Ļ‰p}j/E¹jGÆĒ6FhNJ”P¦ö>ōõ±ķ½ņpØĶRæ¤M9”_ŽØj«sŽMīRļ—ż—Ms žOœ“>#(—ń¢•kU§T,5š·ž˜ł+æ¶G¬kPļµVļ{m&Ē^ ®Æģ»¾&§–ÄĪķXœnķ8Ńps¬TŠŽ=‹­½y.ģ‹e śeĪ|ė—œĒm~kį¹Vµæ“žĖ”rżŗ>õŸā[vƒÅ÷Æ5=b݃<ø¶Óņ RŲ^åĖśc–/ē&ĢI’0Č«Œ-Æ,’ø¶ żĀž³ü ßæ 5Ė?ŽGź;,Ō,’Ā÷ÆBĶņ/|’*Ō,’Ā÷ÆBĶņ/|’*Ō,’Ā÷Ɯęņ·›¬’(Gž…ļ_żėü ßæ 5ź%’Ā÷ÆBĶņ/|’*Ō,’Ā÷ÆBĶņ÷Ķōģ,Č+Ėæšż«P³üćŚøB?’x’*Ō,’tgHļ_…šå_Bļ_…šåŸžīéż«P³üKHąż«P³ü ßæ 5Ė?=ńÓūW”fłF7Ō,’(WńtØYž…ļ_…šåõöJ5Ė?®o‡¾WŠ^Ė?ڱy|ØYžéiŗŽæ 5Ė?śårŻóm:°ŚĘæ¾ęæTĶU—ōżĶņÆŁę|…&¼j#Żüß¼°āŚkSī97’ÕŻ2Æf³©”fłwj˃Ļœj–on½ŠjūźP#’Jh¼ż¾õóĪķ÷„šå_ķmÆu’óŒÓ”“FÕLnµ­­VøĖ‘”Ėœ’_åžĘ• 5źżUłG½•­\³å×wē”öŒ›’hĒŌ¦”6ÜĶ“÷Ė”fłGæ“}%ŌŚvĢō_ī”fó_³ĶēNZ¹ŻüßüŲ6óWĪĶu·<¹Üźµü;µe]š]łw.hĒM“¬ä_é ½õGZ{-’jo8Ģś…ü+ōX慭¶MbżgłG9ėgņÆFś#-䟶/öę֛&YÜ,’ø>‹ļ57’Ń˃Šnž£½–/–ō yÕ«ÄŠjÆ^ż>łē6…ā+·&$Ö¢µœµ?µi÷ńż[‹8<Ōfö~&2uYĪxҶ½«µų剑J…®ĒŽŪv¾f³)”¶“źŗHßKūbŁ·O~ī×/B­Ė©#ļtū4ööön­ó*’Øćٽ ѧwtˆŽžäĖßķµ³ė³F/wø^vGå‹””ū±{Žč½­;'?¼ćī^ōå*t¼J¹ŗŹ?ó×uG‡žn/jŌ;®Ū§ź=Æü£×7ņҾחćÉP‹©5 ]ŠŽ©ĶBmŠŚ›¶,g”öĘ;†ŚSź—¶Ż Dé—×ŗ…Śœ9’’hS(J’×”ŽÜ³ö§·Ź>iå^ļżLlFąÆŌ6ó÷Łå‰±HPoŽåVļōŖėbC‚ėk•f×÷ü©cƃv¼;ŃŚQwoB¼aŠŽy#¬½G×g’ҁ~Ł2Ōśe÷ńiwĶZųšŽ}ƒ­’ŖÜĆéē-C­ŸkČ_Ÿ óFX<źŖŽ‰AÜŽhqŖėÄ·UšÅwøŚ‘äAŽå–)a{•/„¶Y¾¼=szó ÆŸ$ÆrœXm{¶¬÷Ž:˜ŪÜJ÷ʵC@+¹{qJ—5×ŅÓZČ³V÷sŠžxŖrj¾BēÓju­Ųxķ Ń~+Õ?õ©Ś{Ņ?{ńŻ ĘCķ«Og¤v}pqś_-³¦tų&ŌmYśM¹÷ӟn™µV7åēVķ¾/5_“fśŚ×ūžūP«ó͉ԲE¾YѶÅā§ī׿gŹ„×9“:š¹»’kµØXŸžC£Üž"ߤPnC®żµ‹ÖLÅßmECz/—{?•zßUNr.×7ńĮÅ©\ßŲ*”vEķx­öžTڱøZØ=¦öV+t>•ö¶Ó^soUæL^s-•~I©jņ\Kžy0!B’}§*劻xń \į V®ö“•Ó«ž25=KõOļŌŪm»ÕłtFśčąś®®±ė»wĖźōŸ‚v\]fķXŅm_ś3A{ēĻ·ö®żśDśĒAæ<:ל„r3韦T®Õbūėæt•{9čēGēZ?Ļ‘æ{ƒx̟oń(©zq»ŗĢāv·®ļĶ ¾W×X|›Ø ƒ<č¶Żņąfµ·h/™ŽZ¾ĢŪ¹xEĻ Æ _ Æ æ:¹Z²ßū÷”[Ó õŃnJ÷ŃRŪ|°yŚ-éyūŒ¾qĪįP;Yį¹”Õs„’żŚę\Ū†Z±Ź“SŒLH’łļ’!Ō>ٲ>eČēVÄ^ūõÖ%ś®‹æNkO§4ŽžŁŠ_ėu{žŸBmÉŃ ©Kæģ“ā­×āIŁ~ µwfK}øĮ„Æ:æ–^¢£ž“pnęS7Ž’7¹ŻkķŠ(÷ž³—¤Ü=ļAĆß”łRš÷[bØQļÅퟄPļż”ĘõŻ6÷@ ×WG߉9÷vµćĻ‘ ©“cC‘Pū^ķM<”+•öV,jŌ/ii·¤Ņ/ ’BmLJ7Ž[kź­©ō_.ŻĘߢęæ Ėuŗjå&—ynEęĄ_åKęļļŠ“Wü¦z½–vĘź¼iżŠĮõå8a×Wwõé'ƒv 9fķ˜u$Cśŗ ½Õ[{ūɖ^7藇Zæ\™˜Ž!Ė”Źķ^ĄśÆ·Ź}ōóĆ­Ÿ§Źß± Õ[<īW½ƒø 9fq{Y×7!ˆoŽß#jĒbåķ°­ēƲ<ėé{ʅZfŻ{Š{õQ“­śNČ¹ėŻ½ĪŻŲ"ŌģžĢåÆ4ٲ!Ō²ۘ¬÷6ć·źYĻ­ńœk÷(®,/ør㳔ƽŻ{ˆ5Z±Øõ×ŗļC9»oŃū«Ÿæ˜®ł ­·īÓ<©ū “Včųł9§¹{—æŖ÷IåŖ”ÖK÷xš_)yžŠ#ˆērć¢īo4ZQwbUŻ“1}uõoµ—t/ć”@;3Ś4®/›īq}vnGŻyzõĀł+’>°:ģž}`×ŅAž¦×|v“]³Ż3"Ö6ī—ÜŖū%\ŸõŻG"–ÖWv…öZ?ó,{Kļ,ŸVÖāQO÷–ō>«byµ€ÅŅīµŠ§–)*×6ˆļÕßsīŽž,7ģž q³¼*rwCž­G”ųŽÆ=Ķģa÷W}zj„iāeFŻėŪx†@»mĀūÉsĘŠGGéžŖīżSīĆeĻD6Ļæ8ņ‘ĀSõGĢŃNŸ9ŁęzlņČŃ%Ūj«ŗÆ‹Œ®¼?–2rV…›w‡Zö §"Żf};6¢S•‡Ž†Ś{'Dģ3āĘ’Öæ5Ā߈‹Y£?/øŽzÄÜŌ+śĆähM>ĪĶҳNå#†é{ģæå®/øJ¹ģ9žõ÷cĮŽüeŌæIā\źķ=ėÓõƊ…×7”ņž×÷SéPūQķ8Ūęz„vdKµ±jļÖć9£“·Łƒ”6@}uļ“QśŖ\µPK^µ²ņÜ1…¢ōÕA=¢ŽŽ§÷§WŹķ»då-{&¶1š·ģxSēļXńI±A½ö[½KŗÆ‹ ®ÆŃv»¾ėåOÅ^ Ś1śkĒŠæā[ƒöž¾ÖŚ;čbÖųš _ž^mżņōĒ9āϮʸØĮˆ«¬’ŽV¹‡ŅĻOƶ~ Y ß×Z<Ī©ŽĮAÜFcqūX×7#ˆo£ķßÕjĒå :ķ·<Ø„öīņeŁqĖ—#§ö§'¹¶ļ¹öe“Fµ±.’VÕÜS „ž ż|t\[õĪČ’Ń”ö‘ā”ž‹O®Ł“lłBķ“ā¦ž‹µŖŁ?š<;ŌV+¾趒j{ā…%”–CyšŠŚq“FĮ&Ū6„ŚūŹæCŹæY5²·žFĻĘØ—ü»Øü{«F‹sõóŃČæĆw©Ü­Ę]š›ž-—aį…TŹ=}óæžN)ų»OĻų8—z_UÜØ·RÕPćś&*¾\ß'µCqtNy@;6ėßÄqī8—“wg‹P{Ēå}uHĻ:(7ųŠwAžŃWu:†Z{—«j–>må*æŃÉ5§}kžŽ*næŖ÷•VļbÅWż§ėė1Ļ®ļoåAē §>±vŪ‚ö^™hķ%’Ö+’ŽŖńńėņļ·¶×v«±_ónx}ä_uå嬟ɿ•³j\™hń8«zq;õ‰Åķ#]ßō ¾=ęY|W©æyšĘJ˃šjļö _¦}kłrČåżB®5:Ž³Ś õiåä°.„s¾ŗVļÆIkŻbgņ§š’zvŃkGś¾Š6SńųFžÖvy¦P}Æ@;§ø}§z t][üų¶P[§ų¾ÆėėÖ5ٶūB-—ņ@żŪÜ5õžC߅Śåß.å_žWZWŁp6ŌF)’Ž*’j¼²¾ź‘_C­©ņļ©:5“¼2ü~Ö-ź„ÜMŹ?Ź%e’×ßEÅ÷ē 5ź}]q£Ž·…×÷‘āĖõMŠ=iüU;.*hG‘Š”ĘxS’Eiļu}O”kÅ}š×č«A†ŚŻ—Z'ĻÓüG_ÕwlŹ5Vž1Oė²ēg+÷¦ā±%š÷ŁIówHq;Ō›rČź] ųŽ ®ļģ·v}*ŗķX³ÅŚ1Xł²'hļ¤o¬½ļ(Æö(’j¼ņĄė—'•ėW,lšJ÷õÖżU®’ņrÖĻoÉßõ “¾±xœR½‚ø­Łbq›¤ė›Ä÷ģ·ߘڔžS¤²<ˆØ½Ū‚|łģ¤åĖåß=A®ķł™\ĖõZ‡rhkģĘź·Ī µØ;wPlĢĪ=“B­‰śTsg“alŹ©ēµvs®åŚń^O]jŪT‡Öž8åfhG¹~®ļńWZßŃ,'{Ä6ķ¤žAė’öĘäĻ”÷µcz–„õ Ķb“5ö{ģdĆP#wÕ÷±ÆāƒŚīVŽSĪāvG|Č܏†ŚHåé÷Źē3ńŒ/Ż£żå,–=āiSG+£Ń^PŽ’v­rņŸńŻ‰ńŻ­ų~u|iå)žr+ļń·Uū?“Šå.ÅüLüļQ¦q}‚sµ-ćĪ}Jyšóüµ ’Œ—iuŲų ģZČ_eåžģšmĢŠĻÖ6ņ%Aó×g}`ćˆXZ_YŃ^ėgöRŒ­A±Žå,ŸhlU āÖü‹›å}jń„rU‚<ęļč—ptk’j‡ž;”ø‘}°ž…ž>½=cō†‡žJ^Õ¤²fœŠ_”»²éß ?“\§dŅkhÄwdy½W™½AņʚOiFü÷śśėū ×·²Ąæ×÷\룩\ßē¹’½¾ń=Ϧr}ßč2žø¾³MN¦r}E5æp}ō_}—¤’r”ū·’:Üś|„ž;Įŗźśļɋm"ōß­eB£ŌĖ/“ˆŠqݽĮń½ gł•ß…žj+¾õs|!¾eTž¦*¾ó¦ĶŠßVŃŠń-–az„ų6¹/ōGžŠūäßńgBß*’6tŚ!’~×kł—½Éīł÷ŪS”æ\Źæó+¶GČæg żńNĒh½“ĄųŲŃ&ō÷«ĘĒ7YĪG«k„žZh|4żžććJ‹Šć£|·_#ŒŸ„žNŗļŗŒßģŻCĻhüOĶeü^},ō÷µĘoõ–9¢Œß¶ZˆĒ‡æ_ČeüvnśćŻ(ŽĮ`~šz诹ę—-õ}ZóĖķO;š_ņ]½9ŹüŅØgčo«ę—‘kņD™_ņŖmÄ£k«ŽĮūĢu]”Œ—^~;y[Rī(sāwõC Åś$W"ø¾%§ķśÖŗ{7ėr<ŗÉśļž Ä†ż÷ė!ėæ™—žŠ) Ō·X’½Öŗ^ģŁ ’&ķ²ž›¢w5Ž ā;k”Å÷‡1#b«Ćųn±ų>Łz|¬aßū—Z|*8&vwß/WY|ļÕū ¹‚üŪ8Õņ/–yi,ä_­•–ƒÆ¬Še ņÆčLĖæ?V§ĒNł÷嗖½tˆ/^)Gįl|Üóā¾X`||¹ČĘĒš›Ēfćć—q6>v%ĘGŽ6>Šė>Ķ/ŗ”5ĒĀĮ6~÷æ|1V?æēŚų]ŪéÆXÕ`üy×Ęļōļ\ƒń{y’_ޱ©Ģ/ļō·ł%_ōzģö`~i2Ūę—6ogŃæ`~94Čę—>oˆĻē—±6æš~ĪĘņ_.<‘½w?ę0ņoņķćõޟ¶pU“-چł—ć®lń„}sÖ)yä4ĘĒ€ņYāÕśĶ^ø²ę£ŃČ?Žķ™ĢĻļō·ł9®Æs0?7™mósK]ßü`~>4ČęēŽŗ¾L/óóX›Ÿó«’ ź>żgėĒõ_Æ`żČ8×֏eźæfĮśqä][?^Q’}¬—'ŁśŃJń½¬o…?°õķÅ·a°¾}¹ČÖ·WßÅĮśöĖ8[ßV+¾%ƒõ-Ē [ߊ*’n ÖߍSmżMSž}¬æµVŚśŪEł—Ų„õ·čL[Pž] Öß/æüŌ­æż5>FūƒY m°AćcCø?Ųbūƒ{4>šūƒū—Śž „ĘGŁ`šå*Ū¼­ń«æc£żĖ£›l’r¹|0~µłõķ_ŚhüFƒżĖĮ-¶IŃųmģ_&ķ²żKO÷ó‹ķÆĘēߔ¾8Ų_%ž·żU‚ę—ÜĮžŖŅIŪ_ŻØłåŻ`µä4ū«—ļ^mĘņ“Éι9¾WĻŽŹč»ĘÆ­Ö”ÕĮ3᜹ōo4ūéļµV-įŌńäŽĖn‰ß©ļ‡ķ“_£œ='NČU¤š|ķõšwrąŽŌ*{ņÄg=><ćĆs3׌›Zb[¾ųõ µ åžkĻ“äü(¹¤4Ī-ŽÆ^äLē¬ńā’^jŁ'®Žāõ#ūŹ&ĘGWHŖ“żƒš\{ī<#gÕŗ ];F”Y7ź×X‹zO„lŃ“k>óŠ„Čߏ_‹żQ¾i­+‡ēŚóév9s7Mł4¬wŠĮōČ×{·Ē—J½m“—ā\ŚĖóxŚ{­ģæķ=šŲ2B{'•ų·½YŖµ‹ŠŽś„Ćsķ¹=żœŖ=’õsÓ#ōsڽį¹eŌĻ-ʦEčēŖ‘š\{¾O|×j?ĹÄ÷ąŽķā›_÷ÉČ ā[qŌžńm÷dx®½@^„iĄ¹ļ+ÆöŽś5B^UÖŽĀņ*ļ×"äUöęį¹ö¾ł| [xnQåó„ĪY£äó#MĀsOŖ9Z61J>Wģžkļ0Žמ†zwkEöä‰2Žf¶ Ͻ\sojŁmZm4ŽĪ«śłĆ‚oļ0V«*œ»źÆ”ÉÓēÜeLļÖ÷ż`üN˜üÖ²[¢ŒßńŚq®½§ėųq«÷½;ŅS‚z»Ÿ±zēÕܛ^:ØwéI«×Žg8³å&kļÕ7ėÅĪķ½qµwwRżŲ” ½G¶Z{ķ½‡9æ^hżüz™1±A?±ĘśyßCb‰A?O[fżlļG“ĖyiŖÅ·ŪĮōŲ® ¾I -¾}ņ¬‰• ā»k–Å׎£(Ÿ³Ö–W“¢GcŃ Æ¶Ļ²¼*ŠģDģŁ Æ¾›`yeļ[\Oün°åsÆÜWc‚|¾ō‘åó]‡’Ž‹’ĻßŚå³½—ń]ā‚ž6ŽŗvC¼c0Ž&M°qtń‘ćiĮ8Ź8ŌĘļoœœ7sįžÄYż—ÄwG4K¼vćÉ ›>ŗkńķp^ūƒ|Ÿ,üøl¶ĮhÄ׎ó ŽGܼŃEõ.ęIlŽ8«z/óFĘ”6oŲū “×ę«jļé`¾ŗō‘ĶW·Ŗ½yŖ1_]|ßę+{o„~¶yr˜śł±`žÜ>ĖęÉĢźēƒyņ» 6OŚū%Ä×ęēƊļ`~NZhósKÅWćWóó®Y6?Ū{(䕭 /(ƶėĀkl]XŖ¼ŹžėĀ“e¶.Ųū*ä³­GĖĆ|Öztć[Ę†ł¬õčČV[ģ½ʑ­ƒŁ4ŽŖė`÷3¶–Ō8ŗ3X—žd“æiGw}†šoŸŽ@’’ūÆž½ā’ĘKųß®’ =üŻČōļӯߗNŃ9ü½X„‰ūÆxš÷eC»ø~MR’48Rk8Z½ŌĆ1ŹŌņ8¾±Ńkz¼š86śĆ§lōĒōYĒqŠź„ŽQ¦®Ē©żQS6zmS6śSś|ÜqŠź„ŽQęIS6ś§lōz§lōgõYßqŠź„ŽQęS6zS6śÓ§lōēõŁŠqŠź„ŽQ¦±Ē©½‘Ē©ż9S6zs}¾­^źi®’ћé³9Tœz°įM=N=ŲčMXŸļ8ösœz8F™A§lō§lō·=N=ŲčļźsØć ÕK=£ĢpS6ś0S6śS6ś(}¾ļ8hõRĒ(3Ņćԃ>ĀćԃžžĒ©}œ>G;Z½ŌĆ1ʌõ8õ`£ń8õ`£ąqźĮFŸ¬Ļ ŽƒV/õpŒ2“—8Z½ŌĆ1Ź,ó8õ`£/õ8õ`£/ö8õ`£Ēõ¹ĀqŠź„ŽQ&ęqźĮFO÷8õ`£åqźĮF/¦O« ßIśŸOüw%ē¼;/)Ģą8PĢńŪ…ę³ŒxF§WŽąų½ĀLŽ? ĢģxT˜ÅńĀÆ#ĢźųćĀlŽ×fw¼”0‡ć/o)Ģéx[a.Ē; s;ŽU˜ĒńžĀ›ļ#Ģėx?įĶŽæ#ĢēųPa~Ēßp|“šĒ™K :ĪX/ä8cńVĒ+…'—‹8N®uœ\øĶń ĀuŽƒ+W;RŽ˜®÷8śdé Ēąk=޾ Y:Č1ų&}~ć8h×@=£ĢFćżkć}›>·8šüqŒ2[=Ž?lōĶĒ6ś·śÜį8hžńĒ1Źģō8ž°Ń·{Ųč{õ¹ŪqŠüćc”Łćqüa£ļņ8ž°Ńźsæć łĒĒ(sĄćųĆFßēqüa£ÕēaĒAó?ŽQęˆĒń‡~ČćųĆF’AŸß9šüqŒ2ß{ŲčĒōiŲč?źó„ć łĒĒ(sŅćųĄF?īńcāŲčgõyŚqŠüćc”9ćqüa£Ÿņ8ž°Ń/čó'ĒAó?ŽQę¼Ēń‡~ĪćųĆF’EŸ—Ķ?ž8F™Ÿ=Ž?lō‹Ē6śośüÕqŠüćc”¹āqüa£_ö8ž°Ń’ŌēļŽƒę£ĢĒ6śUćżŗ>’r4’ųćežö8ž°ŃÆyŲč7dŠz¤’į łĒĒŠ3 ć…ĢxąĻé7 3;š|pŒs³xŲč™<ŽltżS™„lŽƒę£Lvć=«Ēń‡ž[Ø?UpŠüćc”Éåqüa£'zŲčś' 79šüqŒ2ś³S’püa£ēń8ž°Ńoęw4’ųćeōφžįųĆFĻēqüa£r4’ųćenõ8ž°Ń zŲč· ‹:šüqŒ2·yŲčE<Ž?lōāĀ;Ķ?ž8F™$ć½˜Ēń‡~—šNĒAó?ŽQ¦¤Ēń‡^ĀćųĆF/#,å8hžńĒ1ŹčŸlżĆń‡~·Ēń‡^AXĪqŠüćc”)ļqüa£—õ8ž°Ń+ õ§żšüqŒ2÷xŲč=Ž?lōū„÷:šüqŒ2U<Ž?lōdćżAįżŽƒę£ĢĒ6ŗž¹Ņ?ŲčQaŖć łĒĒ(ń8ž°ŃS<Ž?lō•ś4ŸųXģü°“sW9ξļĪ€KøCøŅńƄ”ŸbĮ>®“ÓŁUpœ}S²ćģwīw|æ0ā8ū‹‡’NXŪqÖóz޳?ķ8ėēs޳ī5qœõŖ…ć¬3mg}ččx† vŸ­X0÷p:óčkŽ3’½é8óÖŪŽ3ß qœyā=Ē‹Šą8ćr¼ćŒ§gLsœüå8y7ĒqņåKljóbĒ«‹WÓ’Äå!!6üa!6¼†^Sˆ Æ%Ć?"Ć×bĆė±į ±įu…ŲšĒ„ŲšzBlųćBlųBlų“BlųSBlųÓBlx}!6¼žŒž¬žœŽPˆ o$Ć7bßbƛ±į/±įM…ŲšfBl8ż §æ×BÅWéÓbĮx²2ÄįkW†8lvœ8š€s‰Ć.ljĆ>ljĆ!ljĆ1ljƒķu‰ƒķQ‰ƒķ-‰ƒķ ‰ƒķ刃ķĮˆƒķ‚8ČęzˆC&ljCVljC¢ćÄ!ćÄ!ŸćÄ” ćÄ”ˆćÄ”˜ćÄ”„ćÄįnljCYljCEljC²ćÄ”Ŗć-„Ķ^<”„›»/ ±į­„ŲšÖBlx!6¼­ŽNˆ o/ĆwbĆ; ±į„Ųš—„ŲšĪBlųĖBlx!6¼«žŠŽMˆ ļ.Ć÷bĆ{ ±į½„ŲšŽBlų«BlųkBlx!6üu!6¼Æž†ž¦NcĆßös¼æ}€ž¶žŽ>Pˆ $ĆbƇ±įC…ŲšaBlųp!6ü]!6ü=!6ü}!6|„>Rˆ %Ć ƏbĆDZįc…ŲšqBlųx!6|‚>Qˆ Ÿ$ĆObĆ?bĆ?bĆ?bĆéol8}°1cČ' Ż×}EqĖśģWf¢šVWf‘øå}üµ+3IXŲ•Y(nłFL6ø2“…E\™ā–ŸÄp½+ó”°Ø+3_Üņ™˜Æse>ŽęŹ|)nłOެue>ŽīŹĢ·ńBN­qe¾ژ"ļV;}®ŠĘ¹¹ŅéŸ mlĪ·1ū™øåOÅmŒĻ·±Ÿ&nsĀTłœ¢’éóiBlų'Blųt!6|†>Sˆ Ÿ%Ƨ ±į³…ŲšO…ŲšĻ„Ųš9BlųēBlų\!6ü !6|žž„>_ˆ _ Ć/bĆ ±į‹…Ųš%BlųR!6|™¾\ˆ ’Jˆ _!Ƨ ±į1!6<.ĆÓßŲšYŠEŪ€k.ēõ­x§ĒKxīw²9÷a8Ęõ\O<œ‹ōģO<œÓō¬P<ūzī&N~sīPńpŠs:qĘśpńpNг?qĘś{āįü”š¾8c}„x8W補8ć}”x8o蹘x8æ%%Œē=Gē:=kē=›ē==ēē–¤ę‡pŌó)ńp®Ö³3ńpĪѳ6ńpnŌs+ńpOJ`œ†s‘žs‰‡s¦ö<ŗŽ•īšW ±¹ž5BlųZ!6|¾^ˆ ß Ä†-Ć#ĆobĆ7 ±į›…Ųš-BlųV!6|›¾]ˆ ß!ĆļbĆæbĆw ±į»…Ųš=Blų^!6|Ÿ¾_ˆ ? ĆbĆ ±į‡…Ųš#BlųQ!6œžĘ†'<ęų÷Blō„ŲšćBlų !6ü¤ž£~Jˆ ?-ßbĆĻ ±įē„ŲšŸ„ŲšóBlų!6ü¢~Iˆ ’Yˆ ’Eˆ æ,Ć’*Ć_bĆbĆÆ ±įæ ±į±į ±į×„Ųšæ„Ųšæ…ŲšėBl8ż '׬½“ÕņŲš|[|éĖCāh±#n6vØßr€~²\%ž6¦ø.Ė śĻr˜8ŪXćz-gčWĖmāocvX.Ńߖó䅍MśŽņŸ±qJl,/6f‰‰ rĒĘ/ń±1BŁX&V6^Č)×ÄĶĘłecœŚ8Ź ¹(|øØūŗā­øÜ ŽMŒ2 ±į™…Ųš,BlųBlxV!6<›ž]ˆ Ļ!Ć' ±į9…Ųš\Blxn!6<~“žWˆ æYˆ Ļ'ĆēbĆ ±į·±į…ŲšBBlų­Blxa!6¼ˆ^Tˆ æMˆ æ]ˆ §æ±įä˜éh6.Č7k ķ°±LīY’Ó÷6’ąÓĘmµńNLl^¢Ż6ö‰ĶQōĶÄŹę+śĆęāfs}có1“yŒ~²¹‚xڜFŸŁ¼Alm¼Ó6ʉ³Ķuō„Ķ'ÄÜę½ ā6?ÓĒ6ϐ 6’³6oÓ÷6’#6O’Ė6Ÿß!^L’‹$!6¼ø^Bˆ æSˆ /)Ćß%Ćß-ƗbĆK ±įe„Ųš²Blx9!6¼¼^Aˆ Æ(ĆWbĆļbĆ+ ±įÉBlų½Blx!6ü>!6¼Ŗ~枀ž ž"Ƨ ±į!6<*ĆÓßŲprŅ®‡k!ŃÉOėCś¼DēÉK8}I^¹^ņN撗p®¼„ÓĒä%œv—pś›¼„Ó&ņNߓ—pŚG^‰y gÜYžÜ!žĮéō9JbEŽĀÉ)rNߐ£pbHŽĀÉ5rNŸŁü@lmN m /™;(OĢ™/ąä&sœų3/ĄÉSęxua5Ēb£?,Ć×bĆk ±įµ„ŲšG„ŲšŚBlx!6üQ!6¼®ž˜^Oˆ \ˆ Bˆ Rˆ Jˆ Zˆ Æ/Ć7bßbßbßbĆ ±į„ŲšĘBlųóBlx!6ü!6¼©ŽLˆ §æ±į-„Ķo)ÄFQˆ o%Ć·bĆŪ±įm…ŲšvBlx{!6¼ƒŽQˆ ļ$Ćæ$ĆwbĆ_bĆ»±į]…ŲšW„ŲšnBlxw!6¼‡ŽSˆ ļ%Ć÷bĆ_bĆ_bĆū±įÆ ±į}…Ųš7„Ųš7…ŲpśNŽ[?ÓĒ–ēÄĶĪå<‹¹fķ„­–oÄÄƾ-¾ōå!±²ńĀ5TÓ’\}cłI mŃO–«ÄÓĘ}fyKlm|Ń–ĆÄŁĘ}iłLĢmÜŃÆ–ŪÄßĘ }lyN.Ųx¤æ-ēÉ ›ō½å?9bć“…xużO‰‰ rĒĘļķgś¹23„­es_ī#a§ĒÅÆ;>Rümǧ [¹ņ1įßN’Dų¢ÓӅ9}š°„ÓWÆ9}а…Ó› §zńąžŹŸ®Ģré8¾LüwĒ—Š_u|‰ųoŽmr÷ÜKæāōLŅ8Nū2ø2‹TęW§g–öŽć“5£+³Pe.;żØšcŁōU?įŖ@׿‰Sف®Ģ[Āܹ?‹Ļʇ÷¦~qe>Z~$n}ž”øÅe²8åˆć$!åą…”ƒOR>^H9ų !åąć„”ƒR>FČ1ųh!Ēą9%ä|¤cšBŽĮßr žžcšw…ƒr >LČ1ųP!ĒąC„ƒr Nær N|8'ž“ž–ŠśŸ~µ8ŅÆwś•r”'÷¦¼xł‰MLÉal8yŽ gŒ`Ćg ±į³„Ųš4!6|¶ž©ž™>Gˆ ’\ˆ Ÿ+Ć!ĆĻbĆæbĆē ±į „Ųš…Blų"!6|±¾Dˆ _*Ć/bƗ ±į_ ±į+„Ųšt!6<&ĆDžŲpś¾RøŹńÕBlō5BlųZ!6|¾^ˆ ß Ä†-Ć#ĆobĆ7 ±į›…Ųš-BlųV!6|›¾]ˆ ß!ĆļbĆæbĆw ±į»…Ųš=Blų^!6|Ÿ¾_ˆ ? ĆbĆ ±į‡…Ųš#BlųQ!6œžĘ† ėśŽņŸxšOüYLÉAėśĄņXŁx”N‹;}cłI mq-–ō™å-±µńÅ5ZžŠ—–ĻÄÜĘżj¹Müm ŅĒ–ē䂍GśŪrž¼°±Iß[ž“#6N‰ƒņÅĘ,1±qAīŲų%>6FČ#ĖÄŹĘ 9e朘ųwśŸ¹č{!6ü!6üø~Bˆ ?)Ć’(ßbĆO ±įg„Ųš³Blų9!6ü'!6ü¼~Aˆ æ(Ć_bĆbĆbĆ/ ±įæ ±įW„Ųšß„Ųš«BlųļBlųBlųŸBlų5!6ü/!6üo!6üŗžĪĖüÖ·Ä­ k¾µ…ž¶uœóŲCp.ķcÆ'¬żę’FĒiwVljO6ĒéƒģŽ«ŽÓ‰Ž·œŽÓ7¹'†¹§Ÿņ8NĖė8±½Łqś/ŸćÄ9æćōeljł-ŽÓÆ'žö|–<µē°ō·=o%/ģ¹*łkĻO‰ƒ='%_ģy(hū+Žś08ĻqüYyź1?Ōož¹.«—ėµė!v“É®Ÿ¶Z»čk/}cż@ŸY’Š—Öoō±õ'}ożLL¬’‰•Å…Z¼ˆ­Å‘˜[|É‹;9bł@īXž_–?äåłhłFžZŅÆ–Ÿō«å-9ołĢÜÖĖķcĒ‹[Ÿ “¶I6kÄRaoWføÕ5\ŚfW†9ļUWfœøõē»Ņ¶ø2Ģƹ2S…6׍•n}žžt[_¾’ŽĒ•Ÿ&“łpŒt‹ĖūŅ·Éę:Y£^wå?Śø-Żb7BśvWž5ŖÆ+?]hóźŅ-¾|ßŁįŹ³^½įŹĻŚÜ;JŗåĄ(é;]yÖ®7]ł™B›ŸGJ·<ł@ś·®ü,q›·GH³ü-}—+“&nółūŅ,ÆĘHßķŹĢ·yž=i–oc„ļqe>·ł’]i–‡ć¤ļue>·uaø4ĖĻńŅ÷¹2sÄm½&Ķņv‚ōż®Ģēā¶Ž •fłå8hžńĒ1Ź<ķqüa£?éqüa£?'|ĘqŠüćc”yÖćųĆFoąqüa£?/lä8hžńĒ1Ź4ö8ž°ŃzŲčĶ„/8šüqŒ2M=Ž?lō&Ē6ś‹ĀŽƒę£LKć½¹Ēń‡ŽVŲŚqŠüćc”ićqüa£·ņ8ž°Ń; Ū;šüqŒ2<Ž?lōvĒ6śĖĀ—Ķ?ž8F™ĪĒ6z'ć½›°«ć łĒĒ(óŠĒń‡ŽÅćųĆFļ%ģį8hžńĒ1Źōō8ž°Ń»{Ųč}„Æ:šüqŒ2ÆyŲč½=Ž?lō7…}Ķ?ž8F™7<Ž?lō×=Ž?lōĀ·Ķ?ž8F™žĒ6z?ć}šĒAó?ŽQf Ēń‡ž¶Ēń‡>L8ÄqŠüćc”źqüa£ö8ž°Ńß¾ė8hžńĒ1ʼēqüa£÷8ž°Ń?Žt4’ųćeFyŲč#<Ž?lōqĀ1Žƒę£ĢXć}“Ēń‡>I8ĮqŠüćc”™čqüa£÷8ž°Ń?~č8hžńĒ1Ź|äqüa£Oö8ž°Ń‹ Ķ'>’œĪyŧģŽß)“÷¦Vj_Źłų™"ne(Ļ3t¾7•peŽŠ[]„¤­veų®t·+SNøĘé|'*ėōJB{‡Šļ>~ÆŠŽ›ā;N²ÓļŚ{S|—©źōT”½7Å÷—§WŚ{S|g©ęōšB{oŠļ)5œ^GhļMńݤ¶Óė ķ½)¾<ęō§„›eÓ'|yŅéĻķ6¾w4pz#”½·Ęw†NAhļ§ńż¢‰Ó[ķ4¾S4wzkįŁŌĖwŠVNo/“wĻxĪÓĪé/ ķŻ³Ņ;9½«ŠŽ=ć¹R§÷Ś»g<“źīōW…öīϳz;½ÆpÆl®‡ē_Æ;ż-į>§óŒ¬ŸÓ™‡ö;ēhĢ/œĖ\rĄé°w’¾’Ī8GgLråy–ĒXEg\v:Ļžo茭#NēY!c}†pŗćąĒĮiŽƒ”£ü'GŸźtc”IĪr4’ųąefzœó°Ń?~ź8h~8c”™ķqĪĆFŸ+üÜqŠüpĒ(3Ē朇ž„pžć łį<ŽQę s6śBįĒAóĆy£Ģ|s6śįbĒAóĆy£Ģ"s6śrį2ĒAóĆy£ĢRs6zŗp…ć łį<ŽQę+s6śJaÜqŠüpĒ(ó8ēa£Æ®v4?œĒ1ʬņ8ēa£Æ®s4?œĒ1ʬõ8ēa£#üŚqŠüpĒ(³Į朇¾YøÉqŠüpĒ(³Ń朇¾MøÕqŠüpĒ(³Å朇¾SøĆqŠüpĒ(³Żćœ‡¾[øĖqŠüpĒ(ó­Ē9}ŸpÆć łį<ŽQfĒ9ż š€ć łį<ŽQfæĒ9żˆš°ć łį<ŽQęĒ9ż;į1ĒAóĆy£ĢQs6śqįŽƒę‡ó8F™ļ=ĪyŲč? O:šĪćeNxœó°ŃĻO;šĪćeNyœó°Ńžs4?œĒ1ʜõ8ēa£_^p4?œĒ1ʜ÷8ēa£’"üŁqŠüpĒ(sÉ朇~Eų«ć łį<ŽQę²Ē9żwį’ĮŽłĄ{9Ž’’“°3Ś“-[› !Ė„$„X2”(ŠTKį „‰ÅBh4 !„kdĖÖhžŒM¬MŪĢŚ–Ͷ6æēó|®ėóywN'-Ū÷·ū<ŗz½^×}ŻÆ÷żyß×}_ļsŸs>Ÿw³ū¹Ķ1 ÜżŌö/’‘ø˜}ÜĻmŽł{ąī§¶’=š_‰‹ŁĒżÜę˜ī~jū'ƒy_ĒŽ’śŻ~sāSĄ=ėž…ņ| t÷mĻcæG³)xks <ūßN_×4f3š¶4ępÆŌæ9ųŌ'Ų-õ·§„žéąŽ© šīŌøOźß¼7õ?ī›śæޟś»§žvąĢŌ? Ü/õo>’ś÷Oż[ƒ„ž'ĮR’6ą©ßūwŌßœ“ś½7˜ś·ŸNżŽwJżŪ?HżŽSæšś·ŸMżŽ/{¦žąüŌļ½šąŌæų|ź÷>×+õ |!õ{;$õļ¾œśöNżĮWSæ÷žCS’Nąk©ßūŹa©g0ß¼gžśæ ę{‹÷ƒ>©æ˜ļ^ėG¤ž]Ą|Oš:žZź’ ˜ÆwÆŃ#S’®`¾–½žś¦žĪ`¾N½¶ŽJż»łōŗ9:õļęė«ņ¾ł×»hŽĮļqÖį hée°’ÆC;°’š•læM5m68ĶxŸe`‹• >hßaCŪģÓ’øŪ6pÄȁ£V2t…›j–ć¬pcŃł¾Ø{ßüłYS:_ŻŲ£Ėļ»[1 Č@‘"Ež‹2P·ü7įxŠń+OV‘Ÿ"?1Å|ˆŁhȋü4ĢÉźō45Ÿ««Ų·Č@‘"EŠ (2Pd Č@‘"EŠ (2Pd Č@‘"EŠ (2Pd Č@‘"EV=ÅĻsW=WÅČ"EŠ (2Pd Č@‘"EŠ (2Pd Č@‘"’ ˆĻ ^>ćEŠ<s ˜Å(ę@1Š9Ṕbü’:Źg¶įłżń˜“ĘĘÄžb|ĢFC^ä§aNbO‘Ÿ˜†¼ČOƜЦę'īyc>õĒ}#_Óćc¬Č×tÜĀ?f»!/ņÓ0'±§ČOĢFCžļŹOS}I¹§©>ÅųĘ2¹śłŒ¹-xĆ|9)rŔbs ˜Å(ę@1Š9Ṕbs ˜Å(ꥒõ9P>ƒ ĻcģoŒĒ×ŽŲ˜Ų_ŒŁhȋü4ĢIģ)ņ³±ź¼±¼5Öߘs1¾±Ģ”ū’ŪņÓŲŃž·gq<©’ĪyõŸ:_MŪXV›źSŒo,“Åü\yf>üüĹZš†ł/rR䤘Å(ę@1Š9Ṕbs ˜Å(ę@1Š9Ṕbs ˜Å(ę@1Š9Ṕbs ˜Å(ę@1Š9Ṕbs ˜Åhl”3Sü_d Č@‘"EŠ (2Pd Č@‘"EŠ (2𿐁ųŒčįõƱČ@‘"EŠ (2Pd Č@‘UĻĄŹ¾_č¶gļ=Kg–J5 78mƒsK„®ŲvŁ TŚ”Y©t;NCoæģ‹Ž¾)ųOtOš$šŚń“Æ¢’>Å˜ŁąžčMĮ=Š€]Ń»Į;ƒ;Gƒ÷Šßnć·Ų <N’}4ćϸϲķY°z{pwŚÖ“½ŠĻ€#Ų¾ ķōh=c<ćn®öO„Ķ8Ę3īŚOŠ{£;‚ūҌc<ćžĮv_‡ÆĒ×õøqŒgܝĮ‚‡€¤¶ō}šqŒgÜWh?Eļćx°'Ķ8Ę3n-Ū?Fėę””~DÓG?}ß ½ŒŽķk?‚¦~ś^ĢöOŠEAæHÓG?}Cū9ŗ;z/šXš>śé{Ū7¤†¾½¦~ś.”½ŽŽŻōÜ裟¾×°}cŚįč+Šæ”食¾„ż ½?ś@p$Mż^'±żó“>č«Ń¢é£Ÿ¾’¢éyŗx6Mżō½•ķ›ŅŽ@OD’ƒ¦~ś®žŻ<¼ˆ¦~śŽĮ˜-h_C߀^®~ś¶’ˆ>ģ ^IÓG?}ļaĢV“#Ń· Ķ¹>śéū)šōA`Po}ōÓw&c¶„y½yŻ}~ ؟¾Ÿ’†özóŗ»™ÖŸ¦Ÿ¾3fŲü ųéŌG{¬æ£B;½ųŃŌöG?vķōF 6żō]*§õ@ÆźaÓO_ēŚ“Æ”7õ°é§ļ?iGŃD·õ°é§ļXŚ­“#џõ°é§ļŗą±ąAąĒ@=lśé{m*­/śs 6żōŻ<ü*ųqP›~ś^O»“vŗ5؇M?}7‡€=Į @=lśékŒ6“=Ń~m’ZW“÷š]Į{Į£ĮσưĻøĪ±Æƒƒ-Ac،gÜi““nčę §½®ķ…Žžeڃ“cŠ_a3žq·=ǽĄO€Ę°Ļø÷Óv¢ķ^4†ĶxĘķBóuųz|mʰĻø;‚g‡€Ÿa3žq£}…¶zŠ6ćw?Z-­7śS 6żō}š¶m_ōŗ 6żōķE»v(ŗ؇MæZp>­­;ś# 6żō=’v)ķ0ō† 6żō}™ę1õ°é§ļš×™×›×ž6żō}ƒęuęõęµ§‡M?}O¦=Cs=Ū4'[Šŗ æžÄ8ϳ目P×ŗ@¶„oG3³ń%ų8ųš"“9šĖ ` šMZ ķj“ēhDēx÷»>sv!Ś90 s¼ū-¤yüŗnĪ…óĮĪą®`'š&Š9x؏~śžŸŽAūšŽõŃOߗi¾Ą«Š^ĆA}ōÓ·#Ų¼ō:ŌG?}O‡Ļ/@;gõŃOßēhĖ ćŃ^ĆĆ@}ōÓw[°xč=`4č8Ē»ßįļ‚W¢½‡ Mćļ~[‚ķĮI ÷ ³@Ē9ŽżęĄ—‚W ½‡œĘ9Žż6ہß½ž :Īńī÷(| x9ŗ|Hēx÷Ūl ^z>tœćŻļų[ą8“÷š“Ņ8Ē»ß'Ą6ąu kĄ(ŠqŽwæ»į‹ĮĖŠĪéÓ8Ē»ßz`kp"č5q:č8Ē»ßTų"šR“ץą4Īńī×ōžūMŠkč4ŠqŽwæ›į ĮKŠŻįƒŅ8Ē»ß2Z+ڵhÆįSÓ8Ē»ßõō½ ŽE{8!s¼ū½CkI»Ż vĻŸ`æ=ĄĪhē»óž\Pżō½īučõčuy<؏~ś¾MkAózōŗ<ō:ޔֆ¶Yj›ƒ[ŃŚ$T»Ķ{ƒÜ}ŚŃŚ&T۟ūÜ÷‹”©ė½ÄXķizyϱĻūˆmhŽŻžfß¶ ÕŁĆ;¤mŖķĻ1w„ćK Õn3žq½ĻÉ;Ņōpó8r¼Np÷Ł9”ŚćÉń¼÷ė½KBµūęxįÓ® ՏńŒ»;ĶדĶcéBÓ;ĒŪnL×Qķńäx{Į=ę® ÕĘĪńö†ėÕ-”Ść1žq÷„y,ūŠ<öżhGŽ·?ܱŻŖ=ŽÆÜ×t@BµĒ“ć÷XLØöxŒgܞ4_ĖWiĘģEó8r¼CąĘ:8”ŚćÉń…›“Ž ÕOŽw8¼ ķ°„jĒxĘ=‚ę9čC󘏤y9^_ø9śZBµĒ“ć ÷µ•Pķńäxżąęü˜„ź.4ć÷Xšē¬?ĶÜ y9Ž@ø9=.”ŚćÉńN€›‹ćŖ=žo0Üs6(”Ść1žqO¢™ėiž›“iGŽ7n.†$T{<9ŽpøēpXBµĒ“ć€›ėÆ'T{<Ę3īHšēźšēö4šĒ‘ć7—§&T{<9ŽpĻłØ„j'Ē; ī¹:3”Ść1žqϦ9ēFÓ<'ēŅ<ŽÆīœ8'”ŚćÉń·{®ĪKØöxr¼1pēŲ ÕńŒ{Ķ9y!Ķs:–ęqäx—ĄūŃ.NØöxr¼ĖąžėKŖ=žļrøsr\BµĒc<ć^IsN_As.^Eó8r¼oĄsćŖūŃr¼ pēģÕ ÕOŽw-ü8Ś5 ՏńŒ;‘ę\ü&͹{=ĶćČń¾w®\—Pķńäx7ĄÓ“Ŗ=žļ&øsńʄjĒxƽ™ę\žLsĪŻJó8r¼)pēŚ- ÕOŽwÜkāŪ ÕOŽ7~2ķö„jg2ĶøwмæCsĪN£y9Žš‘“ļ&T{<9ŽŻpēņ] ÕOŽw|mzBµĒc<ćŽGN»—vķ~šĒ‘ć=?ƒ6#”ŚćÉńf½LØöxr¼‡į§ÓJØöxŒgÜY“SiŠĪ¢=Fó8r¼ĒįēŠMØöxr¼'ągÓf'T{<9Ž÷ą£iO&T{<Ę3ī÷igŅęŠjiOÓ<Žo.üŚS ÕĻlšq@;ŸöLBµż9Ž<ųy“&T{<Ę3īhēŅž„]H›O«„åx?„ż8”ŚćÉńž‡_L{.”ŚćÉń~ 戶 ”Ść1žq_¤”½@»”ö2ĶćČń~æœöRBµĒ“ć½ G{%”ŚćÉń~æŒöó„jĒxĘ]H»„öķJŚ4#Ēū%ü“×Ŗ=žļWš«h‹Ŗ=žļMųxŚÆŖ=ć÷7“+h‹ihæ£y9Ž[šoŅ~›PķńäxoĆÆ„ż>”ŚćÉń–ĄÆ”ż!”Ść1žq’D»šöGŚu“„4#Ē{>‰öē„j'Ēū+ü[“æ$T{<9Žßą×ÓŽMØöxŒgÜŠ&ŅžN»‘öOšĒ‘ćż ~3mYBµĒ“敚•ļeļŃ7™¦öxr¼µŠ7ŁPķńĻøk£o›ƒ·‚ė‚GŽ÷ōmčuŖoFēxE]“P=ć­ž‚^/”Ść1žq?Žś½ŠTpŠćČńü^é»č'T{<9Ž'Ńw ?‘Pķńäx~/÷ō§Ŗ=ć÷Óąķą†ą ß;z9ŽĘčéčĻ$T{<9ŽēŠw£?›PķńäxŸG߅ö{ZQķńĻø›€ÓĄ/€÷‚›‚GŽ·ś~t›„j'Ēk‹žŽ<”ŚćÉń¶D߇Ž"”Ść0žqہ÷€_·=ŽoōĆč­Ŗ=žo[ōCčö ÕOŽ·=z&z»„jĒxĘŻ|ģĪw=ŽÆ#śqō—Ŗ=žogōcčŖ=žÆśQō—Ŗ=ć÷+ą#ą.`Šē“GŽē÷ų›”sS{<9ŽnčĶŃ[ŠDµĒ“ćķŽn‹nGՏńŒ»ø)ø mKZ4’*_{"Ś 6„}ŸÖ=<|<|ģ—Pm’@š{ąńąSą€„jūO€ƒĮ9ą ą3ąI q²ßōŃ'&T/ū E’}rBµńōÓw88> Ž“żNA’żõ„jćeæSŃ?BLØ6ž~śžĪOž'ū‰~=*”ŚxŁo4ś9ōY ÕĘÓOßsĄłąŁąOĮZŠ8Łļ<ō‹čsŖ—ż.@æ€>?”Śxśé{!ø¾ ^ 'ūE悾(”ŚxŁļRōĻŠ—$TO?}ǁ/—?ƍ“ż®D憾<”ŚxŁļ*ō/ŠćŖ§Ÿ¾WƒÆ‚ß_ƍ“ż®E’=!”ŚxŁo"ś ō7Ŗ§Ÿ¾×ƒ ĮėĄ_“Ą×ĮģwśMō·Ŗ—żnB’}cBµńō[Ž .'ƒæo“ż¦ ‡¾%”ŚxŁļ6ōoŃßNØ6ž~śNƒ·ƒæļ“ż¾‹žś; ÕĘĖ~w¢ßFOKØ6ž~śŽ ¾Žž¼4Nö»żgōō„jćeæč?”ļKØ6ž~ś>.ļßg‚ĘÉ~”’Š~0”ŚxŁļō_Š'TO?}—‚³ĄæƒĘÉ~³Ń’@?–Pm¼ģ÷$śļč'Ŗ§Ÿ¾sĄwĮŸ“żžF懞~Bµń²ß3č”ē&TO?}.6£=K3Nöūŗ9m^Bµń²ß|ōZ“'TO?}ŸK“ŸŠÖ”- 'ūżžŚó ÕĘĖ~/Āׄ½Pm<żō}™¶6ķ%ŚGiÆŠŒ“ż^…ÆOūYBµń²ß/ąėŃ~žPm<żō]H«”½Fūķ šq²ß/įŠ^OØ6^öūüć“E ÕĘÓOß7i-hæ¦}‚öšq²ßo២-NØ6^ö{ žIŚļŖ§Ÿ¾oÓZŅ~Oې¶„fœģ÷GųghHØ6^öū3üÓ“?%TO?}ß”µ¢-„mLū+Ķ8Łļ]ųēhIØ6^öū;ü³“æ%TO?}—Ń6¢żƒöyŚæhĘÉ~ļĮ7”ż3”ŚxŁÆŁZåZ±”Pm<żōõē4­ĮµĄMĮu@ćdæuћ£×NØ6^ö«Ao†žHBõŠśéėϑڀ·[€ĘÉ~C½~Bµń²ßč-ŃOØ6ž~śśs®¶`Kp+ŠßÓ0Nök…ŽżÉ„jćeæO£·Fo˜Pm<żōõēpķĄĻ€Ū‚ž‡q²ßēŠŪ£7NØ6^öūą@popŲ <Ü <4oęē2šüuXÓįæ[›5¼=Ž~ū®§-¢}¶9qč’8¼˜¾©ŒÅø Š3Ń/¢kѧÓ/æ\ž€ö[¶ėi<ćŚ÷-Ś›“Ļį{żē黝ńśč§× čĄ7h§Ń/æü%ų ķ7l×Óxʵoķ·“ÖųĻĘąėčėh·1^żōś)ś~šW“S闏 Ī„-f»žĘ3®}7Š~Oū<¾ń7Oę˼}›ńśč§×ō p1m$żņ‹Į߀OÓŽd»žĘ3®}7Җо€ļüĶ“ł2oSƏ~z=¾üķśåoOŃ~Ķv=g\ūn¢ż™¶ ¾ĒįožĢ—y»•ńśč§×sč{Į·i#č—_žü>ķWl×ÓxĘµÆ–ö śKų‹æy2_ęķśõŃOƟ ļ’Hū:żņ1ąŸĄ9“El×Óxʵļ|Ś5ō7Ć·?žęÉ|™·›é×G?½ę£§ƒKiŽ+ä€ļ€ß£ż’ķzĻøö”M¤-|ūįožĢ—y›Læ>śéõcōŻą_hĆ藟ž|’öŪõ4žqķsœćū#¶ß¾KJæü<šoąlŚėlwżō}tœćū,Ūļ’N;™~y-ų-ś»ŌG?}åŽs¼cē±}ųŚśå¢ZžC¶\F;‰~¹Ø–’€ķw€’¤Hæ\T˟aūwĄѼĖEµ|.Ū§‚ļѼ÷ĖEµüi¶ß¶įœ@æ\T˟būmąfčć闋jł÷Łžmš<еGž8xŚ{p~½7“eüdś=׎s¼cē€SĄ ĮōĖ/Būvg}ōÓ·īšļŲ‚ƒĒŃ/‹6G»±æ>śéėµā8Ē;öIšššXśå³ĄKўƒĪģÆ~śz-;ĪńŽ}œ ^ŗvŽ ¼ķ9Ž•żõŃO_ļ5Žs¼ūĶŻgŲ~ūÆ@;‡¾Āžśč§Æ÷‡Ą+Ńι]Ųī8Ē»Ÿ÷ā™ąx“søŪēx÷s-x¼ 휒2Ūēx÷ū ŪÆF{ ķĢvĒ9Žż>ĶöóŠ7 ›ĆĻe{ ō~TK’ćążŒ»ōšÜ‰ķśč§ļ†Œ½=½6ü¶{Ÿń~s>ż3wč= #ŪõŃOßVŒ½żMō:š³Łī}Äū‰÷•GĮūwč=eG¶ė£Ÿ¾ŸbģMąõč×č|ōz®„ß¾‹h“Šė2v4ūū:}½¾īYཌ»ōžö%¶×Ż»ŠĘż$c÷¤Ż».×z_ųÓątōnšwų#ō ō ’)8}*üppopų żŻįśč§ļ2ö?œ~‘žĆąśč§ļŃą~ąąč—ė£Ÿ¾ĶĮóĄēĄ—č?®~śg‚?¤ø>śéµx!ø|™ž>p}ōÓwx0ų08žąśč§ļ'ĄKĄĄŸŃ\żō=4'³Ągéļ×G?}7/__”’kp}ōÓ÷LPĻĒĄŃoL}ōÓwš*šgą«ō ×G?}Ļgƒ?¦’ ø>śé»%č½ńfp6żĒĄ_捾> ¼|ü9ż}å ńŒ;ģ> Χ’«pćĻøŪ‚Ū‚SĮļŃßÕ±ąmč­ąĻqžÆžżīcć÷Jp 8ü ż=įĘ1žq;‚;€w€sčß nć÷eü}¾_×ŃpćϸׂƒĮ§Ąēč÷œĒxĘŻÜ œ~ŸžnpćĻø ń?œ‹~žž^p}ōÓ·+ø xųż{ĆõŃOß7Ł’fō“kŹ3čMĮ[Š“é÷^ōuŚРЇĄc<ćīīz=z]ī7ŽńŒū6~§‚^^—½įśč§oOšōƒ ×f čk¼üż…{}] ? žōžéżõ»ąChēö >śé»ÜūōOŃcą_õŃO_ļßÓĄGŠžŪOƒśč§ļśpׁŃcį£@}ōÓwcųą£h_ŪēA}ōÓ·…|=~.؏~śŗžÜ>ŽöŚo ꣟¾ƒ{<ž—›ĄIą­ ė·ėæėą+čńš‹@ćĻø®wƒO ½v¶c<ć~~ x;ŗ|>ēĖyą|p^4ƒ»N’=~9hć·5|:ų=t?ų—@ćĻøĄoæƒnćĻø®5ÖÆ”'Ā'€Ę1žq?æü>z|Š8Ę3nKųš»čš_ąoć×µĘ<™/óö-Š8Ę3®õėĻÓčAš. qŒgÜOĄæ މī’žĘ1žq׆{ń~ā}eOųądōš2Žuģōō¾ qŒg\×·ŪĄ»Ńąo1Ž8Ę3ī:pף¢‡ĆõŃO_×ßŪĮ{Šįf}ōÓ×5×užYōHų” >śéŪ >¼Żžwö×G?}ż^Ś:ćĒčQš¾ >śé»!ÜėŌėµ¼؏~śÖĄ½N½^GƏõŃO_ėדóĄßƒ¾¶·ĄZŠuŖčzrųšLšļął ė”ė•ėÉšmŠ{’>śé{ čłø|ģ./]ośé»/h=éZ’еPżō=“ž¼ü č½AżōķZO~ ü+x؏~śZON õŃOßż@ėÉĄwĮÓA}ōÓ÷pŠzņFšwą‰ >śé»?h=yų7ŠkWżōķzz½zŻž꣟¾€^§^Æ^·g€śč§ļ ēū pź’ĒĄ/€³AēŁ9 ēū{ą'éæüų$č< ~Šž{AćĻøĪ7ēĆ\p]śæ ĒxĘ:ž[Ń؏~ś:ߜ??B’m >śéė|s>üܐž >śéė|s>ĢkčæŌG?}OĻ‚Ÿ¦’~Pżōu¾9~~”ž© >śé;t>üü ż€śč§ÆóĶł0\žļ€śč§ļ`Šłšp#śõŃO_ē›óį9p}śļõŃOßAēĆóąĘōĻõŃO_ē›ójŲ‚žļ‚śč§ļI óź§ągéŌG?}o®/€£؏~ś½ßæ~Žž‡A}ōÓ÷LŠūżKąĒéæŌG?}O½ßæ 6£2č€v¾~½5ų“>śéėõą|­Aw’ŠÖG?}D;_?ŠŽü-Zżōõzp¾®‡Ž|­~śĪD;_×G·‡ÖG?}½œÆ-Š_’†ÖG?}B;_?†Ž| ­~śz=8?ŽŽü;Zżō}ķ|ܽų{“>śéėõą|üzSp!ŗ Ųķu0ķ|ü$ŗ3ų“qŒgÜGŠĪĒO”·ßFĒxĘõzp>¶Bo¾Ž6ŽńŒėõą|ܽø mć×ėĮłųitšhćĻø^ĪĒĻ 7ß@ĒxĘõzpŽo„Žü'Ś8Ę3®×ƒó~cōą“qŒg\ÆēżgŃmĮ_¢c<ćz=ø}½ų/“qŒgÜĒŠ®G­Ń_’ˆ6ŽńŒ{Śõčóč-ĄEhćĻøSŠžχēå=“qŒgÜĒŃ®W_@ļž mć÷^“ėÕ&č-Į_”c<ćŗzz½zŻž­~śŽ‡ö:õzõŗż5Zżōu=tNĪųµŗż}Ą{Ń^kG‚®µ×ƒ=č߆ķ€ŃŽs> zNæF’.l×G?}ūsĮIąō·g»>śé» čkž I’WŲ®~śŽD’¶l×G?}Ū‚ŽsūŅæ+ŪõŃOßĮ“ĮÆŅæŪõŃOß­@ƑóĄ.ōļĮöcĄ ŃĪ…³Aļ ³Ą£čļĢvćĻøĆ@׏[ĄžōoĻvćϸہŽcʂ{ŃæŪ»‚”½wžžļü&CM’nl7ŽńŒ;t­œL¶ĒxĘŻōp)ŲžĶŁnć÷Oųū:|=¾®ŻŁnć÷ еš6°ż;°Ż8Ę3n'Škhø7żmŁnć÷Æų»ÖMEB’—Ų®~śī:Æ÷” ¶ė£Ÿ¾ĖŲßūÉ“×āÆŃŽSĪG{½x?s­»Ż½#ūĒxĘķ ŗFŒ÷„K¶ĒxĘmź1 <”žŽl×G?}÷½GģN’Ł®~ś® zĻø <ŒžŲ®~śö½ĒM÷£æŪõŃOßõAƹéąįōļĢv}ōÓ÷`Š{ĄµąžōoÅv}ō«»w‚^‡^^—_f»>śé{čučõču¹5ŪõŃOß Aļ÷Ž»Žć]g\o¼ß߄žü‹ąÓą  ėŒėēĮóįy9ō|č}Ģū™÷ūGŠÖ'ƒĘ1žqcŽļoF? oĒxĘõX¼ß_Œö^ō;ĪæóĄłą¼p½ń~’(ڵ}hć×õĘūż­čłš@ćĻøŽC¼ß_‚¶VX‚æqŒg\×ļ÷£ĶÅé qŒg\_«÷ūo£Ÿ‡ļ ĒxĘ]÷~ڵüüc<ćzŽĶ“łŅk4hć×kÓūżķčໂĘ1žqĶ„÷ūĖŃ®•Ēß8Ę3®ė÷ļ'ŽW6åüļ Ö¢]{3Žõą;č—Ń]@ćĻøŽ#]®D»Ö¼ĒxćĻø®7®+ßEæ ßŌG?}’ w]¹ m­·6؏~ś:G­ļDæßŌG?}=—ÖƒW£­µ> ꣟¾oĀ­ļF{®¾ ꣟¾Žƒ­ÆA[Ė|ŌG?}­7­ļAūZzƒśč§ļ_ąÖƒßD»Ö ŌG?}½ö¬ļCėu؏~ś:W¬ÆC?ßŌG?} ·¼mķx4؏~śz·üzüó >śéė>^§^Æ^+ǁöé§ļßą^§^Æ^·›śč§Æk°ėAęÅq`WšX°č|q=r=8<< <<tr=r=~ģ €®C®G®ǃĄ½@ćĻø®G®;'€ē‚GƒĘ1žq]\/#ĄƒAćĻø®G®ƒĮ`7Š8Ę3®ėQšD°x hć×õÜõā$š°hć×õŹõbx<ø7hć×õŹõādp$x؏~śŗ¹^ O÷õŃO_×#׋aą©`oPżōu=r½÷õŃO_×#׋ƃ§‡‚śč§Æė‘ėÅp0ŲŌG?}]\/NOõŃO_×#׋‘ą‰ą~ >śéėzäŗs*8 <ŌG?}]\wNO÷õŃO_×#ėĮÓĮ3Ą> >śék½i=8 ꣟¾Ö›Öƒg€g‚G€śč§Æõ¦õą™ąÉ`PżōµŽ“< < ü؏~śZoZއ‚‚śč§Æõ¦÷Ó³Įž`Šyę|ė¶­ĻGƒG‚Ę1žq­G­Ļ‡Ę1žq­G½½½.÷c<ćz?÷:ōzōŗģ Ēxʵõ:ōzōŗü*hć×zT?}õ÷ś÷śō:õ:ņzr¾;ļ·Ī_ēŸóŠyä|r>8/<ƞ_ĻēÉ<›oóeŽ|]¾>ć{÷ ÆgÆkÆ;Æ?ÆÆ#ÆÆē³óŚyéüt~9Ϝ'ĪĻ·ēŻóęł3æęŁ<˜óā}ĖūŠ÷Æļž'Ļ×U<ēŽAOo÷ą¾8žžłšĮóé?~3x#ø;Ūo ’ēš ĄZśkį·€7€»±ż|śŸ„ė£Ÿ¾·²}Ų}%ż?†ė£Ÿ¾SŲž-pWō$ś_…ė£Ÿ¾ßfūõąWŠēŃ’\żō½ķׁ» Æ ’Gp}ōÓ÷v¶O;©é®~śNeūÅąѵōĻ†ė£Ÿ¾ßaū7Į/£/§’Yø>śé{ŪÆwF_O’ĻąŽs¼ū}—ķ׀;”ĒŃ?ī8Ē»ß4¶O;¢Æ£’eøćļ~w²żjpGōeō’ī8Ē»ß]l’ų%ōDś_‚;Īńīw7ŪÆw@_J’ąŽs¼ūMgūx°ś›ōæwœćŻļ¶_ n¾„žgąŽs¼ūŻĖö+ĄķŠ×Ņ’ÜqŽwæūŲ~9ø-z,żsįŽs¼ūĶ`ū8°=śś wœćŻļ~¶_nƒ¾˜ž§įŽs¼ū=ĄöKĮ­Ńč_wœćŻļA¶_n…¾ˆž§ąŽs¼ūĶdūX°śjśŸ‡;Īńī÷Ū/·D_H’÷įŽs¼ū=Ģö Į-Šß ’9øóČłä¼z„퀛£o¢’5ø>śé;‹ķ灛¢ĒŠ?®~ś>ŹvÆSÆWÆŪŸĄõŃOßĒč÷:õzõŗż…cAżō}œ~ÆÓZŠėö{šÉ“fü\Õ¹¾~Æ©śfp6zŲķµų“×ĢZčGĄWŠwƒė ½–ßF{Ķ­¾ üśp]“÷‚×ŃĘ1žqŸ@? ~ķ½dŚ8Ę3ī«čé` Ś{ŃŠĘ1žqŒ¾ü(Ś×ņŚ8Ę3ī“čĒĄõŠęāŸhćĻø?Gß®6—KŠĘ1žq磧€-Šž‹_¢c<ć~ż8ų1“ēņ_hćĻøæ@ß ~ķ\ų#Ś8Ę3īOŠß7@;—”c<ćĪA{<ž—÷ŠĘ1žq_Cß¶D;W’„6ŽńŒūś6šhēśÆŠĘ1žq揞~ķµņg“>śéū<śvšShƵ_£õŃOß§Š÷ƒ­Š^«KŃśč§ļōTpC“ל›h}ōÓ÷iōą§ŃŽ+ŽA룟¾?Eü Ś{Ķb“>śé;ż øŚ{Õ_Šśč§ļ č;ĄŃŽė~ƒÖG?}ŸAĻ?‹ö^łW“>śéū"ś»ąēŠŽk‹ÖG?}€~lö^ż.Zżō} = ü<Ś{żļŠśč§ļŃƒ_@»Vü ­~ś¾Œ¾ÜķZóZżō‡ö:ōzōŗü;ZżōżŚėŠėŃėņ÷h}ōÓ÷Ytsī {””7 vKōūūžkƒŻĄ÷čßüø'،žsĄuĄ½Į?ŃæųG°+øżž¾ęŗą>ąÆčo ĒxĘõ÷-?ī ¾N’ qŒgܳĄ°;ųgśżżKćĻøg‚÷M’ qŒgÜ3ĄõĄżĮ„ōūū”śč§ļ(p}ššMś·õŃOßÓĮ`šśżżT}ōÓ÷4šcąąbśæ꣟¾§‚’B’N >śé;Üü*ųśŪśč§ļ)`K°'ųWśżż\}ōÓwų š`š·ōo꣟¾_? öß„’Ė >śé;üxų;ś·õŃOßa`+°7ų7śżżb}ōÓw(ø!x(ųżŪ€śč§ļÉą§ĮĆĄæÓæ Ø~ś?žžžö >śé{øŲüż_õŃOßĮĮ#Ą·éßŌG?}ƒŸæ.¤æ čĶėÅą7é³¶>½ķ}Éū“÷—±hė^ūĪ/A{?ņ~fćW>l‹§1}ōÓ÷‹ ėĖp*żŽ}¾_—ė…ėĘ·Į+é÷ū=}ōÓ×śī§ąmhæļ²Ożōużrż¹üż®±§Ēėq]·¦‚WŠļ÷‹śč§Æõß ąwŠ~_hŸ>śé»čśtxż®Ń§ĒėqŸŗn~¼œ~æßŌG?}­_§”ż¾Õ>}ōÓwkŠõėNš»ō»Ę{œÆĒ=tݾ GæßÆź£Ÿ¾Ö/w£ż¾Ś>}ōÓwŠõm:8~kÓćõøOķ»¼Œ~æßÕG?}­/_ļEū}æ}śč§o{š÷ą}ąō{¬§Ē+? ō5Ķ/„ßļ—õŃO_ėϟ÷£}.aŸ>śé»-ų6ųxż³Ēéńzܧƒž“ĮKč÷ūm}ōÓלōp&Śē&ö食¾Ūļ¦ßœ{œÆĒ= tN= Ž„&~śč§ÆßŸ¾ >‚ö¹}śč§ļöąp8~ēLŻq¢=ī3@ƹIų\Äø‡@}ōÓ×ļO>Šö¹•}śč§ošącą=ō;ē=N×ć>ōžņM|.“ŌG?}żžōąćhæ·OżōŻüx#ćī„ßköbōś½–Ļėī™l怞G@}ōÓ×ļO_Æ}n`ßģ÷ŪŪ€O‚›ßæĪNض’ū Ļž·ē$TŪ?ōYĆ3 kśÓąVąAćdæyčmŠ?HØ6^öūzkō³ ÕĘÓOßł`;šĒą¶ąs q²ßóčķŃ?IØ6^öū)z;ō‚„jćé§ļ‹`{špšeŠ8ŁļgčŃ/%T/ū½Šžś•„jćé§ļ/ĄąĻĮĄ… q²ßėč/£_KØ6^öū%zgō ÕĘÓOß_ĮE Ļ.ߍ“ż£}&śė„jćeæß¢}&ś›„jćé§ļ[ Ļ<ślömŠ8ŁļhŸłž>”ŚxŁļhŸł.IØ6ž~śžō™īŸĄ=Įw@ćdææ ÷B/MØ6^ö{Żż×„jćé§ļßĮ.ąßĄ½Įe q²ß?Ńū¢’‘Pm¼ģ÷zōæŖ§Ÿ¾žA7°ī6“żÖF€^+”ŚxŁo]ōžčuŖ§Ÿ¾žRwš#ąąz q²ßśčÆ¢?šPm¼ģ÷1ōAč ÕĘÓOß ĄąĒĮƒĮO€ĘÉ~ŸD‚n™Pm¼ģ× Ż ż©„jćé§ÆĒŌÜ<ōļüŒ“ż6FŽžLBµń²ßēŠ‡”?›Pm<żōõļœzƒ­Į#ĄM@ćdæ6č#Ń_HØ6^öŪ ż5ō¦ ÕĘÓO_’Ŗø9xø%hœģ÷Eō1č-Ŗ—ż¶Bn—Pm<żōŻģ n ö·“ż¶C‡nŸPm¼ģ×},zū„jćé§ÆÕÜśw‚ĘÉ~;”O@ļ˜Pm¼ģ÷eōńčŖ§Ÿ¾žŌ°8Ü4NöėŒ> ż•„jćeæŻŃ'¢wKØ6ž~śv{€'ƒ]Aćdæ½ŠĆŠ{&T/ūķŠī–Pm<żōŻī~Ü4NöŪ} ŗ{Bµń²_ōō ÕĘÓO߃Ąįąą©`OŠ8Łļ`ōéčÆ&T/ū‚> Ż+”Śxśé{(8ģ ž'ūõAŸ…>,”ŚxŁļkč3ŃG$TO?}ū‚£Ą#Į³Į£AćdæcŠē¢JØ6^öė>Ż/”Śxśé{8<<'ū¾= ”ŚxŁoś|ō ÕĘÓOßĮZp0x!84Nö;}1ś¤„jćeæa苩CŖ§Ÿ¾_Ē€ĆĮKĄS@ćdæ‘čĖŠ#Ŗ—żNC_Š>5”Śxśé;  ž^ž 'ū…¾}FBµń²ßŁč+Š£Ŗ§Ÿ¾ē‚ćĄsĄ«Ąó@ćdæóŃW£kŖ—żĘ æ¾ ”Śxśé{8¼¼ 'ū]‚ž&śā„jćeæĖŠ×¢/MØ6ž~ś^NǁׁW‚ĘÉ~ćŃßB_‘Pm¼ģ÷ ōõ諪§Ÿ¾Ą‰ąÕą ąµ q²ß7Ń7”ÆIØ6^ö»}#zbBµńōÓ÷[ą$šz° 8 4Nö»½:×ėjćeæћ£s½®6ž~śŽn ZÆoNF?Į÷]ą³Į›ŃĘõū‚)ąėčÉąą-ą/Įoƒ Ŗķ’x3ųkšVpx;øŌ'’ z*śĶ„jżļ~æo ŽžŌ'ż]ō[ Õś9Žż–€ß’Ž ž Ō'’3ś.ōŖõs¼ū½N—‚ÓĮæ‚śäńļ¢ļA’%”Z?Ē»ßßĮ»Įæ÷Ė@}ņų¢g ’‘P­ŸćŻļ=š^š_ą æ§«OæśAt)”Z?Ē»Ÿægx?Ų|ō÷tõÉć?‚~½NBµ~Žw?Ļp&XĪ×õÉć[ EƗP­ŸćŻĻß3|üų8ŲŌ'’z6zƒ„jżļ~žžįcą'Į'Į A}ņųO£æ‡n•P­ŸćŻĻß3|ü ų}ŠßĆ×'’ś)ōĘ Õś9Žżü=Ć9`kp.ø ØOßż ś Õś9Žżü=ƧĮMĮ‚mA}ņų-ŠóŠ›'Tėēx÷ū"ųpKšGąV >yüÖč£Ū%Tėēx÷ó÷ˆŸ·nź“Ēo~½mBµ~ŽwæĄł`pø#ØOßżSō—Ŗõs¼ūł{ĄĻƒ;/‚žž¼>yü.藩_NØÖĻńī·+ųųšgąn >yüīčWŠŖõs¼ūu_÷võÉć÷B’½gBµ~Žwæ½ĮWĮnąBp_PŸ<¾;śuō> Õś9Žżö_÷ öõÉćD/BP­ŸćŻļ«ąąAąÆĮƒA}ņų^č7Ń=Ŗõs¼ūõž< Ō'?ż[ō” Õś9ŽżŽƒ}Ą·Ą#A}ņų¾čߣæ–P­ŸćŻļhšwąQąĄ~ >y|ōō1 Õś9ŽżŽß’õÉćG’= ”Z?Ē»ß šą ą;ą‰ >yüIčæ 'Tėēx÷;\ ߇śäńĆŃCMØÖĻńī7ü+ųušąHPŸ<žTō2ō) Õś9ŽżN’žž <Ō'?żzTBµ~ŽwæŃą?Į³ĄÉąŁ >yü9č[Šy=Wėēx÷;¼t=ŸÖ¢÷äYažvĻCėk]ąēB׊7ö²3Īõs”Ÿ¢~ lØūR ŃÆC;°’šF·¾’†š~-ė>‡zc†¶\Éšƒö6“Ķ>żø’1+ŪT3¹gecŠmgĄłŃ¦3µA:_{1Ōµøų*2Pd Č@‘"EŠ (2Pd Č@‘"EŠ (2Pd Č@‘"EŠ (2Pd Č@‘"EŠ (2Pd Č@‘"EŠ (2Pd Č@‘"EŠ (2Pd Č@‘"EŠ (2Pdą’Nü»į¶åļ†Óß_ļÉ”ēæęĻŠłjV3Æ ¼EąžmxÓ*šox›ĄŪŽ.šöw¼cąēϟ+ĒŠ%šnw¼Gą=ļxŸĄūŽ/š |HąĆųØĄG^ų˜ĄĒ>.šńO|bą“Ÿų”Ą§>-šéĻ|fą³ŸųœĄē>/šł/ü„Ą_ |aą‹_ų[/ |iąļ¾,p¦}e.­xMą-ox«Ą7 ¼uąmox»ĄŪŽ!šŽw ¼są]ļx÷Ą{Ž3šŽ÷ ¼oążų Ą‡><š‘ |tു |ląćų„Ą'>)šÉO |jąÓŸųŒĄg>+šŁĻ |nąóŸų‚Ą_ üÕĄ¾(šÅæų’Ą—žnąĖ/ń^#ks=ŌŻ’÷=Hr‹Ą[Ž*šox›ĄŪŽ.šöw¼cąļøļŸ’³[ąŻļxĻĄ{Ž'š¾÷ |@ąƒųšĄG>*šŃ×>&š± ||ąŸų¤Ą'>%š©O |zą3Ÿų¬Ąg>'š¹Ļ |~ą )šW_ų¢ĄžVąK_ų»/ ¼Ä{§äł³vą5·¼eą­ß(šÖ· ¼mąķox‡Ą;Ž)šĪw ¼[ąŻļxĻĄ{Ž'š¾÷ |@ąƒųšĄG>*šŃ×>&š± ||ąŸų¤Ą'>%š©O |zą3Ÿų¬Ąg>'š¹Ļ |~ą )šW_ų¢ĄžVąK_ų»/ ÜÉ_™’×Ž"𖁷 |£Ą[Ž&𶁷 ¼}ąļx§Ą;Ž%šnw¼Gą=ļxŸĄūŽ/š |HąĆųØĄG^ų˜ĄĒ>.šńO|bą“Ÿų”Ą§>-šéĻ|fą³ŸųœĄē>/šł/ü„Ą_ |aą‹_ų[/ |iąļ¾,pß\­MŖŚĄŁTjVj^÷Ł9eެīsXræŸ ’¹ŸO‘Ēt¬šęuŸė•Ēt®ō7«ūÜ©Üß­Ņß¼īóÓ²OŠß3šŽެīó“²OßJóŗĻŸŹ>B’ Ą‡Tx³ŗĻæÉ>#+żĶė>$ūŒżµ©šfuŸ•}ĘUś›×}ŽRīŸś'>)šÉO |jąÓŸųŒĄg>+šŁެī³1ņ±ł¾½łõĪ«šęuŸ‹‘ū„ž—*¼YéÕ o^÷¹yü¢ŠæøĀ›Õ}ÖCćē+d¾4p?_!÷/ ¼ÄūęžµÆ ¼Eą-oUįĶė> ū“®ō7+µIÜ+ mąķox‡Ą;Ž)šĪw ¼[ąŻļxĻĄ{Ž'š¾÷ |@ąƒųšĄG>*šŃ×>&š± ||ąŸų¤Ą'>%š©O |zą3Ÿų¬Ąg>'š¹Ļ |~ą )šW_ų¢ĄžVąK_ų»/ ¼Äūd:oė¾W ¼&š· ¼UąŽ:š6· ¼]ąķļøļŁ›­Sąļøļm›Ēū~·™÷¼gą¾mÓ'pß+6÷÷ Ü÷fĶż¾kę¾§ję¾Ļję¾§j澯ię¾÷i굁 |ląćų„Ą'>)šÉO |jąÓŸųŒĄg>+šŁĻ |nąóŸų‚Ą_ üÕĄ¾(šÅæų’Ą—žnąĖ/ÕTĻÅŚ×Ž"𖁷 |£Ą[Ž&𶁷 ¼}ąļx§Ą;Ž%šnw¼Gą=ļxŸĄūŽ/š |HąĆųØĄG^ų˜ĄĒ>.šńO|bą“Ÿų”Ą§>-šéĻ|fą³ŸųœĄē>/šł/ü„Ą_ |aą‹_ų[/ |iąļ¾,šŅGĆü¼&š· ¼UąŽ:š6· ¼]ąķļxĒĄ;Ž9š.w ¼{ą=ļxļĄūŽ7š~|PąCųČĄG>:šŚĄĒ>6šq|BąŸų䥧>5šiO|Fą3ŸųģĄē>7šyĻ|Aą/žją _ųāĄß |IąK7še—Ö ó?ššĄ[Ž2šVoo“źØN”æsą]ļx÷Ą{Ž3šŽ÷ ¼oążų Ą‡><š‘ |tു |ląćų„Ą'>)šÉO |jąÓŸųŒĄg&ī3‡YĻ|NąsŸųüĄžR௾0šE/ü­Ą—¾4šw_xiżņ\õu­xMą-ox«Ą7 ¼uąmox»ĄŪŽ!šŽwŖšf„΁w ¼[ąŻļxĻĄ{Ž'š¾÷ |@ąƒųšĄG>*šŃ×>&š± ||ąŸų¤Ą'>%š©O |zą3ŸYįĢ’ oVš]įĶKsŸ[įĶJóŸ_įĶK ©ĀyVųĀ o^Zųā ēYMąK*¼yiiąļVx³Ņ²ĄK-Āü¼¦Ā›•Z޲›—Z¾Q…7+µ¼M…ó¬2švެŌ>š޼Ա›•:޹›—ŗTx³R·Ą»WxóR oVźxļ o^źSįĶJ}ļWįĶK*¼YiPąC*¼yix…7+ |T…7/®šf„ŚĄĒTxóŅŲ oVųų o^šPįĶJŸTįĶK“+¼YiJąS+¼yiZ…7+M|F…7/ĶLÜg³ŸųœĄē>/šł/ü„Ą_ |aą‹_ų[/ |iąļ¾,šŅĒB­xMą-ox«Ą7 ¼uąmox»ĄŪŽ!šŽw ¼są]ļx÷Ą{Ž3šŽ÷ ¼oążų Ą‡><š‘ |tു |ląćų„Ą'>)šÉO |jąÓŸųŒĄg>+šŁĻ |nąóŸų‚Ą_ üÕĄ¾(šÅæų’Ą—žnąĖ/}<Ģ’ĄkoxĖĄ[¾Qą­oxŪĄŪŽ>šw ¼Sąļx·Ą»Ž#šž÷¼Oą}ļų€Ą>$šį |T࣯ |LącųųĄ'>1šIO|JąSŸųōĄg>3šYĻ|NąsŸųüĄžR௾0šE/ü­Ą—¾4šw_øX•ŸÆxMą-ox«Ą7 ¼uąmox»ĄŪŽ!šŽw ¼sąīĶgpń³·šŗÕ}.Ö.u?uØū¦¹īæšO–ū«=evąŽ=‡ō:p»vØæi•5æžWłŖłĖGėāW:V‘“ŪpTŻē‡åįs×[^ēžĘ°ęą3ėāÖL:k•āēĻ+Óļ½’_§yę—Z)ź}Õ\?ģ"?-¾‡DżßÄ=¶üz(Ćžæ’ūpĆó³¦Ī‡É\]o=Vv~jnśš^Æeu_S|=<¢ošå½æ|’/oņµ«sģrÆ’×īQmÕŽ½ īóŹūu©öV™ĻR‹Ģ÷G“֍Ǝ(3~|üożššīdz¹ĒźW>®¼}eĒuÜĒ xJyæ5żæĒUĆļ½ęūtž\É57Æ#k:Nįæzp~ōÄ"Ÿ/.ŹtżÖĪ궜½ż£»^o„÷Īu¦×vI}Ÿ }³ķ_Į8ū*ćņ<Ģėkž‡üJźżZÕ:fDaž¾p~t`T>_į®ÜŗŅ×ęuX¾ßn^wĻ/ĻĶłIC·yåstóŗšēYŻDĢV+ĄŹēŪn{ŲĄ#ŽZĮ•v5µĪ^©Y±qeĄyÖ÷|¾ŗĀs½āܲ9ēœSÕy>Ÿ9՟y^ł¹É+ūŖĢ«• ZɶśßĻ­dh±é?˜ē•ßåóµ'¼|ÆŹók­R×^„ŅFĶ5/”ź¾·~‚Ž©YX֍~×^{P“:ĻÖŹĒŅXŒŌļņ_{ĮśuĒ׬ņ ŽgÆ&nn¶VłĪ½ünĖ?šŹĻt©MŹ£Żī×ņć¢~v^Żމć?Ļ136vq{9ΚĢ_Ćó_›ß?=ӄij,æž³łĖĒå‘d¾"\ŃvūŠÆ"EŠ ¼_źž~ī±9ĆÖĪ]Ų…_Q*@;žųć÷xv޼Żā½Øŗn„V@›Uoŗ®EśŌ­7›"rƒ¦5ØlPöŽ÷»rł’ڽ8ŽF›5E-1ózü0œ•U¹ś½‘nĘX1–ÓaœņöæxĪć;?śänāv`÷U|Ö_Ž’’÷’㹊¼śŗó÷Ŗ9oÕ÷ˆ(ē·<²v÷M.<)“.{¬÷ā­Ģ¹ø½T­SżW©[®sXŽÆś×^]‡ ;¶“:?jjR=ŲżĀ¢¬Ž/ā9Ģó#÷E]æÆv¢Ģł槚ćʶ—÷*ž/2Pd ČĄŹ3PW„z°aAø²zßtZy„OT7;¾Iõ`«»žŽ=¶tļk“dū^¹ĢėńŠźĮjMļ”hUׯ¾wīćŪóŽĆāˆžļ=<¶Ø«g¶ŃgÕ!¹Ģyk¬|ńÖį•zšŹ'Om¼Lõ_„\šźĮFžZž:¢ÄóĮŽÕƒjkR=XsqQVk]½¶ņ¼-S—[QVsQž®Q×ē óWާųæČ@‘"įł`µĢlr=˜×„å_EćĻ_©óz¼¢z°źēżŌƆX欒|pnQ–SWÉ_żµ)ē“<,׃9oÕƒ«ü|0Õ•zš_©Lub8ø:ڵ×^CśŸńį=œ;¶Ø—æ~ó|ČóÄӒyŽVæÆx>Ų0G1gõyĆüŁS|(2Pdąż3°ÜóĮŹšļx>L›\Ęgƒņto\„ēƒy=^Q=ųļx>XsĆŖżmŲūŸƒ’FŌ_—²®¾¶\ę¼5V®ņóĮT’UźĮšfåæŁKub5r™•ėĮ6‡Œ1xų)„ōŠMz>8öŅ¢¬Ö2žēDĘś<ėø½<‡Šēƒå<4Ģ_ģϼažźR^üWd Č@‘÷ĶĄrõ`ƒŃ’Žzš“U×FėĮɧ”ÖŠņąüūƒ«SęõxEõ`óŹ1yõ«!Ö>X’ēÅŻ‹z°œŗJžņš±:$׃9o«]¦śÆR~2Ճ©N¬F.3ėĮaC®ĪĀ&ՃŻĒ­łzŠß‹]žkłÜO²|v¢ņļqV%ÅߓĬ¼Č@‘’3ŠŅ—öžždĒw\®†k,G¾Gnśj“dūæżļIņz¼¢z0ЊźĄņ¶Ś=ź×ƒõ^<¶Ø«i\īē~Ė×$yP®sŽ«WłēÅ©ž«Ōƒ­S=˜źÄ7#õąˆżOY‚°Iõ`Ķk¾ĢÆ­ŠĖ羨«™©ĻŠz°~F ]d ČĄ’vĀóĮu«æč—s²ņ烵ĖÕpyŸśXWq–;›\®ĪóĮ¼ׯ}&P}„®Ÿ~5Äśõą¢žw?ö„ †ļń³?ŸūųzŽ0knQ–SWÉ_¬E2ÆÉõ`Ī[cõ {¤sāßoŽųߓ¤śÆRn™źĮT'V#—Y×^Żś8iąŠR‡ėoZUݤzpī•E=X¾®^[Ė_oõēJÖe,~^óįTŗ>_ŃöUŽÅø"Ež·3š!ü=IõMŒ›\Vļ}ń,­Śß“äõø~=XżŻA=½Ÿ®ė׃õŸÖÜXüž`9w9õצœŪņØ\ę¼5V®ņóĮT’UźĮ©LubõŲŹŒzpD’ÓżūāüŁü„q•¾źęŌŲ«Ö|=ø*?ļ¬M‡\>ö|Nā¹r@UWßGŖŚ·0žcdlģ8āörü¢Œē”a~–?+Śn_ńUd Č@‘÷Ė@µ,­] śQŽļ}ž¦Zjå1šÕäzpužęõxEõ`u]ė’Æ£Ŗė׃ ~°ØƉkVäÕ!¹ģžņÖX=øŹO’źæJ=ų•T¦:±¹ĢŗöŚgš!õ{›¤›ō|°ūÕåz°å ~K­IQüæņóĪ"õƧØės'ˊś™DEw‘"E*š§¹µkōż›Qh¦Æŗz0‹M!¹å¾ŒMū{’¼W­;j)Bóz¼¢z°Z£zļō«!®ØlŸŽš3¾’`Q–SWÉ_żu(ē“<,׃9o«]¦śÆRvKõ`ŖĆĮÕŃr=ø}·‡ūCćņ”°Iõ`Ķ5kžł`ż×ø|-Pž|Ś4Øx>ø|¶žWźéå_u”Š (2ŠXĀļ®ąJVž|°“JĻżĢŁōÕä烮oé}fņ{Ķą±j?/ĪėńŠźĮźĻŒsĶŅWTĘ÷£ž[ԃł¼‚ęoE­:$׃9o«]¦śÆR”źĮT'V#—õąž#Gŗż^ƆŽŃ’”‘M. ›Tν¶Ø«sĀsƱś<ė<®:—ŠŸWsQžÉQ×ē óWާųæČ@‘"5_~¤zj=˜×ć5UÖÜTüž`õŌÖ_—²®ŽČõ`ĪŪj׃©ž«Ōƒ}R=˜źÄjä2ėŚkßż?ÄĻ«;±Ø‹z0_’.t.ÆĢkEŪĖóæųæČ@‘"+Ļ@¹ō3ŠWōµņēƒŽ—Ž’kź¦Öƒł™`½æc^µēƒy=^Sõ`÷¢¬žŁFרź\ę¼­v=˜źæJ=xlŖSX\f]{ķ7ōxžäGĘuŲäǃ„&=ģ~}QVkĻA¾_äz&÷E]æÆų|’jėē/ē-bĆüŁS|(2Pdąż3°ęŸV~{°ü>"Mųüā.Ō¹łŽ6•¶¼ŃfŻQ÷ūƒi=^SõąŲ¢ Ó+®I‘W‡äz0ēmµėĮT’UźĮ!©Lub5r™uķÕ£’G4½ ¬5©¬™TԃÕZĘ$:/2ÖēYĒķåyTü¼øœ‡†ł‹ż™7Ģ_]Ź‹’Š (2š¾Xóõ`õķfJM}>X÷»ƒåߌ/¤ńZŠ:1׃y=^SõąÜ¢ '%ÆGõ±:$׃9o«]¦śÆRž–źĮT'V#—õąąńūƒ„źoZUݤzpī E=XԃõƇÕÕNՕy¬hūŖNļb\‘"’ŪؾßĢ žœ¤“²ŸWß§lålVżq“ėĮź½/ĘXµz0ÆĒ+Ŗ«nŽ[żjˆõ’ž¤žūvŸß²īórĖū’Æ’ßŲUĶK®sŽ«WłżSżW©kS=˜źÄjä2ėŚėĄž§œTæ·IŗIõąŲ›ž;źĮRŗžž³_œē‡łĪ|EŲp{ń|0ę©a~–ĻgĆķS{W½»¹ų*2Pd ČĄ 3ą§ ÆŁ÷›łT^ŅĻ‹óaä÷šė5ķżf–ÆóóĮ¼ÆØü·¼ßLQ†Ó׬ȫCr=86å­±zp•ß0Õ•zšŅT¦:±¹Ģ؏* ŖßŻݤz°ūĶ’õ`mz…’ŁzЃp^d¬Ļ³ŽŪĖóØØĖyh˜æŲŸyĆüÕ„¼ųÆČ@‘"ž|pÕ?æørźóĮ¼ÆØ¬Ńrk”½ŽWĖų~Ļēõ`9U)_åÜåu)cuH®sŽ«Włł`Ŗ’*õą„T¦:±¹ĢØO2ršš!gŌ߲ʺIõ`Ķ­E=Xęøzm5äy[—ēOń÷$ÕęUs³ü¶Ę¶Æņü.(2š?^®ņĻ‹Ė&Ģņ‡ZęõxMՃ5?)~^\½t[£Ŗ#r=˜ó¶Śõ`Ŗ’*õą©Lub5r™uķuŠ©Nų”ż=ÉÜ)E=X­W<õė•Ü—ēNłžŒR6éłąŲۊz°ZŪyā5VŸgĒUēPQVsQžÉQ×ē óWާųæČ@‘"5_V–šXva|n•÷š±FÜkeĶŗĆ÷›ÉėńšŖĒõ`˜\õׄ¬«Cr=˜ó¶Śõ`Ŗ’*õཀྵLub5r™uķuČq#śø}ρżO:僔ƒM|’Į©E=Xԃł:ųw”sye^+Ś^ž’Å’EŠ XyÖ|=čß(§Æ&փåūŽż¼ŗīi=^SõąÜ¢ĢēllŖÉõ`ĪŪj׃©ž«Ōƒ³R=˜źÄjä2³³ō>źWC|æŸ×Īó<Ö™×ņ~ń=ŅēUūāöĘsŒŒGÜ^Ž_ԃń<4ĢĻņēcEŪķ+¾Š (2š~hé€=6ēæ5öžƒ„ŹS•FėA§5ČĆ)•r=X½×•ūĖ’ÆŚĻ‹óz¼¢z°ź×%{«ŗ~=Ųąż‹z°šĘPOTĻYĪeyX®»§¼5V®ņß§śÆRĪOõ`ŖĆĮÕQėĮaĆFś@?).›5ķ÷ļ\óõ`ż×X?÷E=Ų0C¹§ŁZĶK«RO—ö.ļńŸ­§sMč±d¾"\Ńöņń’(2Pd`åˆĻŽōLżlćć?ŽĻ™Ūmł{Qi¹gz ÷.÷TŖĮ&’}qüs‹ī«VŽMėńŠźĮź1yOõ«!ÖÆė’=ÉŲ¢,§®’?sXæU‡äz0ē­±zp•’ž$Õ•zšg©Lub5r™QķŅĄ6݇ ;éքMŖ»ß]ŌƒÕłą9ˆ×X}žuWGÅóĮj.Ź39źś¼ažŹū’(2Pdąż2P®­łVōµ²Ļ'©ŽßW“gµļcUjķՄĻ/®ūkŒåž¢÷ZY³īØūü⓯©zpnQVĻlƒ:0ÆSÕ!¹Ģy[ķz0Õ•zpQŖSX\fŌƒĆŽ÷ćź:ģPÓŖź&Ճ5÷¬łzpUžoÕ¦W÷Ÿ}¾åA8'2ÖēYĒķå9Tԃå<4Ģ_ģϼažźR^üWd Č@‘÷ĶĄ‡ńóāŹŖÕŌzŠZ0µųBV­ĢėńŠźĮŖ›ž~5ÄśĻė’¼øęłā÷Ė¹ĖłĖē*buD®sŽ«WłēÅ©ž«Ōƒo§z0ՉÕČeF=xź±#Gō?ndż-«¬›TνwĶ׃ |łÜ?/n˜”ÜSü¼8g¢Ą"EŠ ˜įżØ«?œżPėĮ¼Æ©z°{Q†K(Ö!‘W‡äz0ēmµėĮT’UźĮwS=˜źÄjä2ėŚ«÷ĄQ«ńĒÅø4éļ‹ĒĪXóõ`å;­Ź‹]>÷E=XILRԃ RRt(2š?åžÖŌOÅŹ~^üa~^ļ9“ŽwĘē…«ōó⼯Ø,’ģĢWėś¹b¬’|°Įļõ`9u•üÅZ$óź\ŽMyk¬\åßLõ_„\k­Ó68—÷yIub5r™Q:õäc?ąÆÖy4éł`÷Ö|=X’5VŸ§—ēuQ6ĢPī)źĮœ‰‹ (2`Ŗæ?X®–ĻŹŹźAF¦Zjł}꫺'åNĒxæ?˜ÖćՃÕG–åusEuįūՃs‹z0œź\’ÕĒź\ę¼­v=˜źæ\ęH5©NĢ:#õąéƒOł”Ճ53‹z°ZŸzāµVŸgĒUēQńūƒÕ\”ērŌõyĆü•÷)ž/2Pd ČĄūe Z2²ĮŸV^z/z’ƏW‡|Øõ`^×T=X³ ųżĮź©­æ.e]‘ėĮœ·Zö8¤TšĻL­YxVŻóĄ}˜Ā &n5l…õ8¤Ēą”yʐ•¾¦’U‰Sö,æž4~ž¼{„©ĖϦēv].v—Öūx­Å/Ē–÷Æ76 r{ͳēœėsŃ’ė_ƒž²ŻłĢč|ċʺS#ēłž'2xč ōõū ÖŖžŸņW›=Ećw!Į9æmč3ß-ÓYÖ}Ķ=Æ\÷÷2lč ǜ2rİ“>Šūæł¼2_ē”)Z~[·ƒöÜaĮĶJ5>9Ļ[ózŚóĄ½ßŽ TŚzčĄQ#K[1š“ŅÖśģ_ŚśųĮ#ųfnė!żłTéŒŅ™„Q'ŹżQ²3d[6xčȁ#J'ŒvźšŅiż‡Ų¾TyĘš„Sųżańų!żO( ķņĄ#wīxT锾§ PŖ 2„æ69ld’!ŽįōĮˆ8ųŲ4xē£J§žR|ܰ”ǰaų’cģ=ąģ:Īŗ’ٵ“†į%/QÖŹIœ7”HZµXk)ZYvā„›Ūv÷Fwļ½¾e‹h”›nz蔇zč˜z蔇z‡’÷÷{fĪ=W’ółk5÷ĢĢ™3gŹ3OŸ9ĶĪŖš8uĒÓ^—īuZżaūŠšŪļŗNæēȝ«¼Iy£ętūĮH®Œšćī@Żl¶Æt;ŗ›ö\}EŚÖ©k{»9ŲźvÓŽNw2֕¹2ī¶§ŽlfSĘj6ī*I›<ŖVvīfw<¦g+ĆVr£Ü÷fgÜvŗŃ£#«wSWkDč^&pŒw5# Ėnsģ'HīŅĆŌ oāO‰T«7ŻiN®¤Iæ×é64ž9Ę$“gc üJgÜćI'»śM“ķįŽ•īAڔͪŽę¦Ńp¢ė‘4īö›SŠū»żīNš1 »žĒ˜'½i\½iģénvæqwSµź!–߃GĒ{W»Ńsę…·­lއ;Ŗ]…ŪO½bKS žčrH„t-fųš$LŅ@·')~Wč}›tū}õ©ˆµÓŹlŠ6Z³Ķäˆ:别jwF‡“ć—NŌ®I·{%mŪ³I£ƒ–¢9hó¶Ét8Rf³ßąĮ-ĪF›t“į8 f;VæŁ”Ū½­ķĘC³fæ7=H›xĆs»=ģé÷+R©Ŗ”ĮiNŁ=9cL‡Lސ$OÆt†›4~Ņ¦Ķż†‚`ęłÆH^6“§ßĻ[Ø3ƒ Q€*ͬgī–F½Żį4u¦ūLädˆYB£ķfj÷{#śękwŠItj’†ćéö°1”“ŻŌįŪy8ŌĻĘ~īpćXémR£/é„§“\MpĄ4Æ¼ņÄfoš&¬ü.=iw™ĻĶ1S8Ē•÷nnNŗ”!›•ŲmōvhŲA»Ÿ8ndgÖōzݽF÷€žŠ ƒ¾³½A§»Ÿt7õ›ōJsŠŪI+ķf{Ø™ÆĄ¤|ĘxLV6Š:yŃĘ¤Ļ }5ź“!0Ōu¾Ū›¦£ęVפ¶xwŚwGé@?Ó=ętOc©[^ɼjärs4B„:£Å“él&Šw€:ŃĢQ—3˘ė÷Ąæīµ’n€"ī0T,€ 4֜Œ®ÉˆE$ø›šŽnƒ”B„'É3ßø²žĖZdHՖI#/0'˜%ĻÖŃNÉ® ‹Ē ¼Ö‚”FÓü;čnyqvÜLšŚ«Ą‚i…ri¶[įs0ņ«€D~ü{UUŒÄ “ƳÉ6KcĶ‹$Ųµ3Ó^pĒps¢µ$øŌuĢ“›,ļ†Ė&Žēįqļõ`?¢•qQ3B%#MŚŪīµ·ĆŁT L©•®$Šs «!d ŁźĀcŗē#]÷šc_)4uŪŹŚé]ÄĆe9ü‰„@w§7Uz»9īč:nBćp÷`ā×5wZŗG½„8QŠØouI•č°bue¹‚MüęRLøL·S¹ŗžlĒķķ€m”q„7øR®9 ²¼µ­<ŠN®{kÜÜ™)³ßŪt{„!nėµļŽL¶›įžn]·ł%DČ(O˜ŪÅX$ĢHߐ’ƍķdH ;Ÿī#ąLŲ ÓŒaŠ{ ¾|)xš®Wš? [N}…ĮĀU„ĀĆ)XRŠ÷L0­ČsŖ Õnō¶ KžiųŁ’˜°½ŗ2aŠ:=‹hZF“߬ ıc299 ŹOĆh§ 5l-$ƒūiLĒ]š’o2ģĮø%G£•ļ 6ū3ax OÅZĶI/æõØ:¹^@ F$0wՉZž[ OԶİå>‹č2"“a_Õ™ĪŒņH@Ėź‡µZ›ģĄ>ĆķˆOŪnöĘS/"ÖŠ`PGĆøĘ|<™öśżF Ļ>JĶŁ,=,ĢļėD±a»Ū°vĶYä„éŽz`§Z³>ųZĖsĆėŹ3ir#č©WĀ–aN?šn¬?»³Õ8“ųé7Ū³As,*MjŲžĀfN :DęV¶I4­ŃÜĪą”‰ąŻAcļHŅļŖś÷.żīt÷amĮĶ<ŗ£ˆV¬Ģ=ØĶķ<3&Õ÷]|ƒ5'Ż&bFZ³Õ‘'!Œē¦ę¦8 Q¤.œ’ˆ’®ŠA8Ų±Éó  £’€gŹŲ1 ±;€“ĮīŠ#šEÕ]ŲŖa;£Y]ę«N/2öu1Ly}gBD^$ń@‘pĢY@Š…ÉvgO|ggoĖæ-’ †ąĘ[~{ėTW$ŲcB@zGō# ž1ē^ŐŽę$iõŅŖ-ÜĀ6æŪjC·ć»¼į¹ vŠ !ęK ņI·SYEø: Ŗnøl‰{;ėj‹e€äŠl€ ™ōˆŠ§¬bóčÕŌģ@A¹…„>`.Œåf|*’č0dŚ_©ÜmäY(ō©iŠčŅö6•XŠŗrą!rb{8ī]EŠ„bl6aD_=VĻ%éĮh!ģdjĀ:ļ{…©¬šĀ`¢åҜī4“{’ź ņPńFžo•gōpņ4 –+0?]ņ&¹ĮZØÄy ö)wÄ1ƒGډ橀q Xęń.ĖY; ̓GąęF ¤øDĀž'ś B¦¦BK'sŪA-ÅsˆZ2tŹ-·Uæ@ŚD6?RņęÅKN®¼0Ģ"/öl 5;ŲaĒ0ĖL”F7ĻÓ,¤&2g2+A9Œ‰g!äĒŅŽ¤jä:Ÿy.ƒ§‹…Į(vĢ:’k Ā•ą½@Źb“YæŻq&`®…åĒ/Ėß–łżl駕`DĘśqlK1  ”ÓŒ‘!_, ‹<Ä É7ÓUńōx'Ʋ?ƒļo¤Ża?mY|£ÆƒnńTR@oōŖ”ź/wˆėN ŗé>°©–)ė^‹'Ó÷ƒÖ6ÅjIžC†ÕļjŚbåLü҈©ŒÖuc~£–ŌŻśõƒ .1čM†µ L6Ü/fx:ōC1ŪF)B~Ņe5~Iq Xšˆ­’fįQńŠ^š¾kÖšē“† žŒ~‹¾DŌä:G!°%›„µ [’Ų£ź”)¼c®”ʵOŒ6ūZŚFL5ҤŠųx«…˜ķµ'Äģ §ī@õ…@Į_¾ †…‘¼ %n¦3X­.ō_Ģ'²”–īy­Ó_ńĶ2GZwˆoŠ >„w“Ų­²½ \^…"UŻäŻĆ=”ˆ£~ŽeS•TÜåVBKµ9ī†Ųēh|‘6·MM÷|3uo˜Ģ4²‚_ Q*cEQųhą‰”X/ēP̐,F“DQ‰@ęTNxŁ¤rDŁ`›,ŚœW(ĘpŠ?ˆ±¹ Œ¦ć£1Æ:Üå•yG¢¦ H }Ā‘ÓFgš3 ×¾cmŠ]źœ;³äŒ˜]p‹ī0=#4 é_†}­=]Wŗ1īčŖSł/ļD?; « ᘊP é×z"Ė[i„ ½‰ōŠKh ЧT›özŒ†ˆlģĶ4Õ:I=˜v»beŌö&ƒöŗ¦nŪGŅöjŚ<’6ł=Їiģ²ā$‘jЁ”93)R@e€FPm\hf-Ęh0Ģü»Ģō,.»(T€÷Y\v­²šł†ė Ņ OÅu7Į'OąĒčš,t”ZĘqƳŸąāi/m£q·)Te×YU#)S”C±Vw9œįö8bPĒį ø~=o%j*œ½" ³ÆLv`¬ŚˆĖlż#É%źfŠ=ų )čg5÷_z”<Ž^ƒYāןJÓļX2((4Ų‚N/ŖÉ¶¾C¼Ł£¤žo•Jk×ߎYŪGµt@ŠSF\0”N– “Ś¬ĘžNŖ ~?›ZN›Ķ^’Ą¢ÅŹ®sāĀĄ9ŁĖבiKÖ¢Qiū¢ŗɆR.śŹ(°Zh4ø®ęėé1B«łUčY –E픂dg4ģpA¢ōµ?DĶø²£Ė qD0¾²Ć w¤@ąš/;Ļ•.ŗR“o9åX”°Ąb}ŻūFkźÄ®„ĪŠo:. T3õż+Ī\Uqõ{øę–s¹ŗ ‰˜8°ž`ŲNmōEĀł(ó;½Ż|éA± <ę:<*³²Ć“X”†‚ˆµ¤a”ŻZU¢H4jRŗĻ{Ņjļ"n!k!hŻ•ŗ”[kĆŹBŁZy%KiĆXéģ©ń9³=Ō‚ųW­ŁMŌ»«n¦^š<øś\4a©uõ(`8Bq‚v#^QbņģĆĻN+ Ų½¤¦Ā”żöšŒÕ¢­ † (“Jó‚ŗė“źĒ”]a~GJ]ŹX¹Ė±Bƒ€­ ŹŌ.šjĄ *9Fę öx”iĄ§DqiE¢ō×J‚¬ÆUbĻ„I©Z—ƒ”q.ś’1]”Lž”ˆT"·śef_ĀčdWŚd£«‚Bå}.3_“I›‡‘­7šśg]鿚×3țåpM}š:x’éöł€ā• ³C Ņźk|KčćāŌµ¤Ā™,ą†I>hEĄz°F¼#eT4Ŗƒ-“‘9Īźju`{}i“,ØeTĄIņ6žŹIæ,Ž 4  ±8lÄpŠŻ>vC¤¬%ż żZ 3Ņ@Ņeׯ;6'¼Yc‚ś§eĮ{Ü)%ßč€z|ƒˆo˜>x.F¬Š˜Č$vI4Zų3Vš®›Xś#&ż!ā%yĪO AŹg>".Ž"uĶ)#¢¦ė‘Œ„k]©h’üsĄā}ĶŪJĘųhÕ@Įae yE=°p`Z\īZ·Šõ«˜,¹ɐcŽNw¤ Ģė·7飳¶¤Ż³ö×ųYÖŅ—[s²˜©ń%SnĻ„a ¤#äļAv-ėū‚x™b6göcBŽ'¾g a©/uf©³›M4#Ā+®Sj„»­”€”°³„`weŲŚÖ€dL!^ˆĄZmį÷Ćõˆ«ś9Ŗükä4µ‚ü$7'-8DK_˜'ł\åD =:'Õ7ĘH†G*Gä3Ā.ļÜī•…Š„#:øi’Āā 0Ā^*Ȇˆ ^2ćl±—žO$tĄmki:٘$:(®ŹüID ?߁^;§č‰H„W‹+*×Ō%6lĶŁ 7yĪUJ™$%³šg[‚¦›fIÓ|*£$VĮqŸcX±%«śaĆXķ4HØ\w{GŃ=ēČlÄ vųEgĻ…éŌÅJ •÷Ā>Ægķ8[Né0·Pѳlzh¼Å9ÜĮ°Ę½XXŗÄRaM]‡Ly³Żļ^”IĀŽČ¬ś«0õK‰ £.‚–£ō9Cb¢rŸš*k!š†ć†iÆ0bÉƍ •x]A–«ęÉą’lģļ2*"X„°¹ ĢtšøÄa8=B÷§Ü ʑöTė@v^‰¬‚ļm» Iń£Œ5Ļ\x&ųæ G½ö©¬–dĢ!Tī`ŒńϦ“ͧŠ$ˆ2Ø QF>¬2,ƒ+ĢGŠÖ°sPfFŃd6|ϐ.6ŠßŒųyœąXĀņė¬‹jE;yŖ7ĄÆNÆ_‘­kxq ›wŒ×<ÜĢ®>½LEDћšÉµqZdÅŃ®~ń§‰b;n]ą’zμò‹3 »nb%Õe¹ƒœPXIAĄŠĖq*«F<«v;¢qč7e*˜P ÷:ņ’'¤‡° pfĪŖ+‹dvž±Łńr-ńOP«p‚ ŻQlāų ńĪ ’Ņ lĀÄļĮÕćB‚q_s~Ćw@뺔ˈfD=Žy©D&=Ų‰XØēć~-ŽKB;Œ M m<2t© -Ėq|ÜJŌödyЈ$ą2§ķNĀn>±u—āėŃŠĀ×Ȅķ}eĢRGQ%oDBū‚>xģŖĶŽ7øs Ä%śHI¤,ä0dz’˜j]Qö08*)|€›ŌN<ø§„=9"•Ø ¼ßĀŗģ(¤ŃÆŲĻE#07ģĪE!©>MijĢyyōŖI.8/;« āāŽPÜnLeŌDEģ‚3x œ²XĖŚ­Åy®ŹGžØāW6.ž¹Ų8q.]Łø§D6Jäbcć¹Kłn-¾1_>q*]Y»@8®œ#~įbŗrłiāė—Ņ•gČ j^ ŸcüT8RH ”3Ū DŖkķŚĆ'JX©ĀN«®¼r†‹Œ Ž(ņGV$“Orŗ0Qó޹|ŗ™x¤ j§× @_ Ļ&”ז1XŲ~kŲÄĶÆS4в`”ŠŹņ•…ć«Ų“ą ŹŪ6sŻņ7gWÆŲō†…?źdŽ…vퟬÖm8»qĖĖx'矮ż‹éÆ %I ӊģ ģ=2>LŠ;ĄžEåŒ*pc?^…аT’I«ü^3†t BVēŖSŵ?keĪ®%xb­sōUą·?kĄG”4ic֐™!jļ FøŠū”õfķS{[”˜Æv“ūL®ŽZ) Ž–½œ Ģŗ½²¹ĆĀGl‚Łeol4;»āģ:CcsKYŠŽ?øź%†#&”O) EÓÖ¬‡ÖAžŗPkčaė90 ho».[Y%]¼JÄÆb Ń\€¤ęÉvĆ\æb'AR»#G1åx-Ÿ—Ø-” ÷Åī&¬ŠØŲån?_ņõ*ĀōxkŻFYŽG 2¶™įĀÜė«Õņ{Ō ¢`ÅÄXœ QŪŖÓ{Q “ńm•Ē˜į,Tó’4Ń"GH4Ń] t/ĮņŠĶ(é …īūżÜŪ°•B Q R†msįģ`SM©8ŅĒģ(½ŁŸ’‹£ļbi™lÓq)A“Æ =š\B]ć–:¢/É~ąČ:Żär£ŠĄz&ģ›\ «V .äę’ķ­į0ćqĶßE1ø«˜;C,ĆžąĘĮOKΘcżléŽāaCD:yVŲXd­?“Ó\”<ꀫćĆżü^üoü‚a[ŗp‘Ččä §F[“.·ĄL"C*"ń„(łJ9 Ÿé6Y¾fŗĆF -ŃLqtõübē×ü‚"…GPÜ+ źŠ–“tāÉӅā¾Čż‘&#.ź{s˜}Κ8”¢whĶ7‡öł"ÕÓCŌ8Ų²”k~[UŚHŲ‚²F¼²Łžn39Č"ŖdŠÉQ.ĮodįŒWKIm°PPl¹LN”äž.vWÉJ ’[¬3ÓóŒÜ»’ĆŅ„ą>šHė8F€lOTžČ‹żŃ)9HC©ś#–źõv+ē“[‘±Łn{-r=ƒ€ ƒl{O÷ą”ˆ’I †å½’½ćÓīäBw¼a|Ļ­¼Ī÷Ί\ō»(ć!|å6ß¶ī*6Ą“;ńJŲPVU,‡'J9é9¶_‚ڲ4ĄyPm‰{×ģ O"Ļ Ēó”kŖ ēŅ5… `ī®—¤ÆĶY§”š&·ĘÉ XAÉh¬ §÷¦ńn§*”:RóF–²óŃCQ1,R§Ėv–X„TyM `­ŻĆ .•" £ĘŌ8–Y®-4²^RcØ,’„Ui³ÄĆA2ŠķĢö©ŸR¤!L„]®¼Ö†ÆX Csø^~#a\4*Z}¢…&ė}i;Q`7˜L;ĪÓŅn]µ„*„¾ü1ˆ‹±_OBšV¤±Ļśt$ÜāęŠX±Ÿ Ē~÷Äp°ŁŲÜģķ›s‘æø«¢UsUZsŠÜźŒ¶C:4cƒŪpvŲėķRI*Fļų)38vœ' 熮< ÕŅgĖó–ųćĀęb0^FyEbŹÅ\v‡óŻjń|WGi6źŲŲę!«e,at䉉„0Žw> Ųė]½Ō’£}"ŽmŒ–žóŲ¬”%i”b%Æ<'r¼zėę¦ŅǬeęÆx®•śµYu$HĀūF\BF÷Vß$ŁĘš‹ž=ķßć(Šą1VPh_S“ü+‰Ė‘Q4W®É¶ „†ŹČ»aĘłżUå-…Ś0 2y^ڟĄčW&©,ā"æ™ßdW…nå¹Ī£ģš„©ė:ā&ŗĪóQNw}¤h>¾˜…Õ+Į34! ß!Ż÷ѹ+<'ż ä†ĪH?ŁövĢ VÕtær%²;”(FVZJž×øģh M „Š÷1§żäŹ“q ‹¾e†ĀÉŲÆ±³– ŁŅ¦xŠi†®øÓó*S~ųЊ/l؉ŽdgLĒŻųȤ;¶ZĪa Ü—Ķ=J€a„"!²;O‰Ø©'~NØß9®g?¤r5hƝ7m‚SŗżĖ°#§f‚ŹŸ’ĆSđõ“0ā”śķī÷¼ēvw‚æŅ(oōšŪČĻš„Vŗ[† \šĪ„^§kĮålғÊ+{Ny$m\½&„¤ʬŪ9Ś0 ø½>Ō ^ ķżgŁŅJ6ŲH m¼­' ”vCRf3_… +k ^'„+œjĻ~ö+±źb†F’qVĄ~iā°QIJ£¹Ś%9h÷ą_ģ+«qWŅmĀ"k²„ w„õ ‚ÅX1Ū6ĶH8¦¾r°gø a¤ņ‚”Ķ„‚B';vѶ­XńXÜ»˜2ڳA€Ą¼Z :ƒµµČ!Yą+¼™µĖX«AĖņ¼žųEĒ”½4k½żn̆0hZŁ«%4Z”†ĢHDrtboI^<ųŽėN(‚šXšs†ÕcP…ƼJd_+§!¤(|¤7CU‰!ąd`œŁl·gīś5łv ĒęR49į‹IÓ^xSdgm؇+Ī“eB/s ē f©Ži½ŗļ•§AšĘ„ģŚfP©ÄLX¹ œ¢C`¢Ų_6‰zū8”å”ћķę Eq?”Ģ”aĻ„ÅĖC`ž¼Ü ņžß$>’ˆFOGŲ ]|••Ģo ÖŠ8·j©…{ĻØśUCœ]ć’ěD<Š2žpŹ6#/I6ęļf»fv¶ÉFįĪpÖ õf¬GOB“}5ö÷Ė.”Ą#NœhŪĮ-Ļv«kmį䣀¦:zųcąŠ5ĀŽĀ,§Ø”¤d‚‡W LQ-[tœ®µ%°ˆ×dg¤«)™ķš%ag8ČP²…[l°ŒßŃŁį:¹Ķ©“ĄČØŠg°˜2-]{ŒCxuƒžąe)I¬7ĢesV e4ƒó3[šSÜJLIbŹ„žÕĒ^„ćN-c…]rYÕīańóƎé!aƒ<ƘÖį%%eŠA«HōSK8‚3qŌĒU¢³ac÷5ķą!ט2!śÕģˆMĘ(‡n°BRęäv–%\ŁW"™.SO(¾PMl‚iĖ’¾µ sxḂˆĒt(īGŽM(°Sf,°²½˜v)ÉÆŲŹā¼v—°e”`Ł˜Żź –ó²?˜6šÓŽĢެJD·kv^Æå)æ((ń p‹FĪF=łöõpO®Ņ €¶±ėŒ»“ °¼6-ŗ÷CÉŖ½åį”Ó1‚^ߙf© I$8‹O1ÉÉršÆäų,³ĄüIN󀱁…†ėŽ£bQ23`1Ż(œD?©Y |›a”¤ā,@mY “žė6Č~³L0öĀ Ķnõ+¢õDƒ­©"ą«ź–•~’§ķX/Dzf:«ł¬_ܖī8¦^ƒŖw@2ųÉčŽtųęQ9 ƒaĀ6©–,Ą²@Œž `ŸĪ˜¤ŻaA˜ŃČ¢ lĒ®½~ĄXhõö»ø‰ ”r¦Vb‘ČE­6Eōlj˜=9 ‘ ·a& '¢fuĒpΌ‘±ØXa½ ߑž «£JšœaŽ21ŸšK%ā®xŽŁ;NBkŁčŒŲÓ*°'—ĻR£;Õ®fä ƒĮÖcäoz4ÄÆ/ōŠ10ī”@lˆ5’ƒl4›ßÖ ¢cu¶Ö™µŲ^{āŪņ õk#īeŠ;Dūж-ē«Q„š_Ų}ņÅTVód†ć\ĢČĀpÖyhiÖF¹Õߤ÷œXŒ‡‚Š]ķ1ģ™x¹’=œõįZŽVaƒ„•é”RĒō嬠s7ĖTaM6~ƒĄ©¼ßl!×°0Š ŌćQ0H ź•Bń‚œaŒŅ‘ ( Ą)Ņz¤Ųy#†AĒ÷9‘Gé£ĘD!GckT¦*b]½qŖŠĄEXMĢāóZńŗ©k¹g‰³8¼”#˜Ń)fa§C{āJQ/\aĻõų-N•Z"xžæ›Äā]ŸĮ)·ō\[¤K<Ō€UŻ(źj/²ČŽøa‰¦£_TĀPÖ3üˆ2ŅćĢZ³.>„mÄØk·CÅQŠnÉŻŽEÄm”ˆĻ?©n”ʈįÕÜ÷€Ułq‚Å<©ń²jÄłÉ÷“ÕŽ‘X‚¹¶ńp ķŁ$RņŽnĢqXäüÅ/eŠÕŖ±Fw§…‰Lc£b>tW<ų½…t u±3ZR±Ī•Źl޾öŃØŽƒ¹Z"Ač¹eŚīyŽØ*ǼĖi/ö©ū.!A÷DRķҁT£“Īģ(W“@Wąm9ŠIk✐ęõ¦E‚‘Wl>FĘDŹr¤>˜E„ ›b×9*ŖŠi©AJj{Ķ+ßĶ–ŠN·­Ŗ›—ĪÉ8§&ŅrW%/ģnF5¾‹ü‹^·u§\kÆW6'¦ŗ)Œ>§ł9Š»ėœēX;Ļós7Ģć*z8Å¢óY1§ 9Ī֒”Ālé¦SP7¶JŌfż%©uE»“9¾™;āEŅ3¶F y•cNōXģ”žg»‹%[›4fā¦Tȩݒģ]P»Ē\SZ9Õ␕aĀØ CDǬÖuż9)9£væŌ@¶ÖB…(U»mõ§7ļåJōžkźUÖ5u»y‹õ»”$ĀŚ;Ź“Ś{Ųē–]½Tbz-ƒyO²0ö%O׍9+Y-ąēАø*+™Æ²q²žĆģ|S­¤R8WZƒŒr§Ŗū÷ā‹7BŪ‘_‰ZŠ4ž8¦ųW•*96/f°q”VĄ†õzF–&jEéE ań1£ąFŠ A(k7$¬޹“†švÅd’oLQӑˆJó– x˜#×'ŒDŌzŗˆzQFŌ<Ųb&—·yæēy™ń¤śyžĄ–“ØņD“ō3ĘÆ) ūb9øWY 3Aļ4Hy;Cp~±6Q¹ˆ[Ź“3˜"ÖB)b÷DEb{”bÖy§æR(ūŅ$0Iu^CFyĶńūBF X®É—}B-Ó¼¼øqŌC-„ƒ<–'ŚÆwŽbB4q_)­Åy Łŗ–³_Kµ_A²ę’[ŚGęrŅ1Õdó§„’ÜF} ō™1¹!±JŖL•Øõ8ėx́©LI# #žŠŠw‡*aĘŁ¢>7(­7ß ;’3ń nĪŲ?Ŗ:ćöœ†ĖČc™C•ąØJHéAˆÕˆGŒ®„iŻž°ć IPO±ä5Čpr N®ā§EŌä©-=^„½ż®ŹćPĮžĖT9ŽR®@„J(^ægėE)˜MYĮ ‘')؄4U†7žė9ēVXjžZ,€kÓ ÷ÅErz±īTUŗ˜•Óé¶f ßrŖz>l\Āhx$č·­ [ŅŻ2‚xÆ%˜'7‚k>é;”ČØ·½cÅ»¹t¾[&B'ЁóƒSĮV:ū:»ššJĄ°ĒåŽ:‰…2ćŻāMą„\­µxµ4Ļę¾Ō2ó6FéĻå^‰½¹D÷š4)+"l„Ł–į ē |t —CꈏqńI*BeéŹb:¶KVWb{ä"įčLUF«3Möd9¹‚ ߀/±DĘ@^)Oj.A1žŃõÓ ż5Į՗–véŸŃį Ęa\‰!”’m®hĒę!”末ęĢ}™āQ'37ؖł=•£ –„sĢ‘ˆ¼/ś«WbõH6éaĻCZDbˆ’¹‰·A“ÓN»5-æÕTšzyˆ1ĖĪĻ“ÄqH';JhR”+µTŌ]Θn“tØot(j“1ĒÕŗČŠIiįF\ėܐŪ-”•Ż£„»0 ”•šĪŚja( ‚̤"V23²¤ø«­Pœs¤;8‚"ś”`CW¶ōüČéÜ5ŚĀ čŹuß T“oŝÕēŠÖ6ŲĢzöR-F:õ|«˜v· J¹mP=ŒTØMÉ]¾®¬ÜAܐ€„č'Æä»[āD™µ9+$ć@ę­ŻŠiL¦¶E”-“6¤j­ ō± › pÆÆ›v f0Š ³Œ"[fä`vÕ4Yxw43k­!¦…ŽÖ§%8d–-Aśa§‡OašF #?V®5Ōā ¾ l]qĘ4L5%-n pņÖ×ę#L•œ*›ž">h6Īe]¼jEŒ–¦>“ĀöxłQr'ö¼°\h*5貃įF*ź–¹W7|ÕĘHƒ5]F—Į܁XōŃ+ęgxL‹,U„ŠrF…HE†yб’āSNÅÆ"†@néXwżå‘ˆćYö˜ƒ_pæG‘˜ ģg‘ØŌ }Ą( Ŗ-x įEę½ų·Õć„N:•;lŸ© 0²|D+W Az™Ī>Āų„0”a{³ńYā“Z÷%¬P·ģš,4(ėCōM:5љóÕ­Ā=G¢Ć>¦ÓŖˆ(„×s$kT–‘z.ąŁ™GŌį~Ā®#€tŠk|ęĖĶuVwŚó½³Ę*L—佇­{‡' iC.„ūg)ī؁bN:·„ D¶ž„’»\ķs§GĮSRß®C1bImųd !Lü+zSŗk4®‚ ŚŁ|&tķŗ0ź‰ĆėĄųtM$”n‹€©šåčć/įw|$«į=oß±›FŽė…°–ŗ®\ÜF\ģģ QU2…č qėhµF“:äˆ)gokĢъąK„_Å_-‚–¤Ž9Õ”8čU^Hųłˆ¢ą‰D–īØkĀn*Æ+K²ŸuKΧJ±wt\%ÕÜ$ $@€éyR$֒"‚ŸU}Ą `Š“;8A.<ē+Z5O6vC°…eµÉU­Ē“^c!ę¹\"Ķ7\ĖB)žö®ź¤1Uœ¹ķ-ÆžA*²Gų½…ZN‡2VIj›e|ę ^›N§|²‡WŲw«zL'€'"C[¬ŒEŸ-R»ŠĒqxž‚ął8²”}&”äH|o Ū$²ŒZœsqĄ·EßäŹ9ééUĆ|ØŗŽ‹ äcĘÜžˆe ›Ņ¤åSåhǃ±]}‡#SöX_¬;#–Är„ĄÆ]fJ$<¼“„jh ƒw4 Š8;†źóYż$įżäŽ*¼‹HĖr”¢:Z9šģQśŽÆ1ą™Æ%M²©†īU ¹šąõST ¬xfN$Č^Ī@¼Q†æ“4t-8ž£vaz<Ź,ś [83ƒ50ȧfhi€}ėIŌ¤œV#žWÜŌüd[/29Fšˆćą/Å© ±r4F®P›ĢźYs"N$ÅI :F $I:×Jn‰ĮPEķäU1ķCČÓŒ‚)ĄB;vĒ1©€ „­Ę!VĒVY¬Cö“Gī<Ījj¢+8Ē?:Ƭąō’š’$ÜAYM:µ:W„ó ęÕKE˜?¶ŲĒb”•Č5 ”!˜±Ó9ČĪüøPhĖ[xk_ŁšIØę®}҇^>Ž1¤ ­DĻī\āTŅbwƏ=PīŽÖĮ¶śS­ŠāņՕ‚¼”¼`zŸE ŗ†üÉc±~­ˆõ¹fL¶Ń¦ł»D‰™ŌŒkoš®¶M‚?ˆp/EŠü±"Š)®RįF­”kŪ ĪÕøČHĖg ųå;('T‘#Ž7én‰Ÿ†•cøA #|*)žšAjŃg1ŗ1å)>ń®Φā†>@lį‘bŃGPÓ„̉”¾šø8f²%yyžÅazQt¤qA ŖTKS™nƒųćp#a mø5¾ĶĖ1׊(UńA©Ø³Įóq‹"āäā"T ōĢ›²t­˜é˜Žn%ͼ„ö’ĪS¹½z„Ėę#k¤Žkź€Ń`Hšf€\MēN>»Cm`įY»ƒMņy†Kœ³Æ TFŻYlHk`!{÷µÉL¾W É ÄE†½+LmFĻ=Nīäøæ•⯉¼ŁÕP€„4XdLŸż}õB}µ×®e0Fųa…|ˆŠŽ)Ę Ćā0õ+fž¹Ś„SÄŹ ØšęąÓƒæ†æe뉣kqe/“ę9Wµ °Ļ(¼ā³+…W…T„¬“Ŗ1Š'ęŪ䆷īb#ĆbĘw™e·±“©Č “t a‘TQłø=Õ`ŠāY 'r`$ķIEM&œyµFėšŲ#ŅŦ óć5—^ŹLAŽ#ĪÄä˜Ī‡J€Öå!"†-¦Äy+"øžÖŚĒ'„i°‘)j ś`ųc0lˆ `„ĆF¦€0r­p³{„{mH§dx€I-Ēć3ϼ,{ģψ¹Üæj®~]†¾‚ˆē»½Ļ2ǘŽˆ…C®™;č¢?ālŻ+»u™^ZKi:[gk`;_NgtgųšmÖi'4öĪ\¦ Їķ¾T?/ćHć/%¼L/8'}¬V&oŖā(ĒĶSW!Zń[±Ż1ć;²j‚؂%ā“®yE<˜æ¦;ų®V䕲Ņ%«‚R¾¤ć™zʳT+ 4xŸĘĀÓUN~~!M Uš×Kv•öņưĀ|ü†½aé2ž{f1zE“Īł±]F_¤Č+Ⱦ„T~Śy2g÷".Å; Ųč\±$\äŗ=ē c#‘ō÷Į7ÖėVÉŲ#"‡|}cL,«"”WL(ĆŲ~D°_œ 1®šśf Æ§R" Ė’o£€ūųäHtØøFŽL· é”9“}²OōļĮiē†Ļ·l …a(š}Äżf–tĪd2ān|ŸĖ/7ūĪ:£=¶ Jać„ūB¾”<>ŸžÉM—£5?3Ö Ņ^ļŅUj[ÅAf‹ Ņh*Ż„@iGĄf¢%«łz4_ļāƒ.˜„eéax¤-ӄ ˆa” ļūŒŸŃxW?Žuш]M%Å9Ž(ÆWāõSXaöSé‚°²ˆ Q>—»§pqUN »"ĢV¹³°‚Y®bRf©ćōŪʒ<˜Ģ¬ł@©†Ũ.?‹źkęŁĘȞ©8źh{F5j± !`ī¬Äą€iw®"Fł¶dĘ Œä°Ī”¶S§=Ū­¤Œ4Ē…ĮGÉ)ŅĮ£Vų0“¶šł™tų™ń¢%«?"`ļˆ„ŠĘÓf­ žį"ć#­e)ł¤É>ģȈ«;ąŃat“ŹŻ ³PÕ ^YB½•JćˆāTĪ“# gėĮ5ūséš9ųģ;j Ņn€Œˆ‰¦ć} lˆ­ -v™o‡ū Õd%fŲwHfEf¶¤Åvfõ»¶DxĮ¤·Å”ĮÖ¾ ĄQ<蜎ž'1nbUwA-Ś©8Ž5‹Ź)SŹŌ”“ł“bĪ'įx’éQ>č+dŖĮ‰Ōśü<!Ūģ£[ęœ!Ī…‡÷‘ßīž‘“æšޤ„(>ĘGŚ—H‘Æ÷č@%µ®`eOäc\L*ß&{zC«³‘R+¤Ę¶}¤·,ų#øŖJUgüłė¦ĢֹѬ$‘:¬˜T'ƈLų“bEĄpj:ę[†Õ-iS”,JKć¢+vl_ł¤Xķ« žčX(½ō}SQZL |t…"«u¾Ž‚¼–æ¹*6 νŁgw."³.8&PŒ'ÜŽˆź`ˆC 59 >”&,bPK-^yóļJĀ;3ķ—eę=¼žŒ‡cpāeØ®ŗ$ ą¦t<˜O"1Ž }„®i8Š®”$‹6Ū^Ƙl„ba«gĶæādmt>åHŠé8üØÓÓ^’¹fc“/€č4ÄJÕQ2Ź·‹|l8Ėgé;2čŻD®ē‡kĶŻÅB§-ŽŽį E˜ŽßZČŪFŻJiq¢½!„ÖƒF–,™ņdytq}"bšüQIŌģj+;Ešé×w™@ÅŠŲį‘7¶ *ńӃ2–°‹J{„Ż„ÆŅ6:q—«eä§É‘āI¾}3Ėmƒ µb,fäłõĻ…@Õ3”Hk7)VhÅąŽē‡=‰4Ų”Ō {'ó†&Ēóf!Ē[µ2¹<˜Æś«qyO˜ķkµża"A“² “aƒ,®*xØÜņ'īK"cQōøœ­‹Ļl­’ł6ĄŠÓ- ³7£UŹ TAó8fW,»l¹Öhˆ2½Œżožr;d±> ÅSX” €YĪ8ŁFī±¼ÕŽ8‰H½EĢp>T AJYHŖO:öĪĪ“ŅY^ŏȐ*5“äRDI*Ļ–|6RUŲMģŃōK%:¦FøRĄžxu¼:_*čÄiiPŠpŽ€"čķ#ą­ÅLp<Ö_€ž‡Ė! –>b FwēXKųOųŖtķƒėv «Lś£Ćv\„7Ą‘!røóĪ0-­„ŻCߑÆvngn`ųõćj /Šä¼‚&ųĖBŸĻ¢ā”NN<(y2żh¶ü’Å,&3s±Śęr8H¢©r¶ń„Q‘»éĻĖź;E vÆHL(Ń|høOš’ć#qŖĆ•é֕;¹ąBŽBi“ŠtŠcś„ė€ą=\ī)D›‚Ź<Ę8$±Ź9_Ɠ¢OĘiD(ņ.Ś&-¾r…#BNšŅ#×,ævQŚ4¬Ø(öc×Äܲ/ŽĆ؃£ūā@‹œ‹ĪLņEC52ž@fĢŗI%»¹ØĪ=żlś›–(­c—6 ēVļNņ—褮 ƾ-aTźÆŽS0jŪł³āH½qm垎“i\)§›cądQÕčćR:¤šå=Ŗß/”5n—Tu0xŸ³->˜VNo“PYYÅ»jqŸ ą”)Ml͆Ä_ŗiV-"p©{\ü%P–ūą Ó7Żą äź¦įā"÷$Vˆ™W—ÅĢĻĄ<źZ”ü¶˜)„wéØhF<(‰­ĘĄ;Ļ0,·Mģ•<DĆžt‚%»_Į“AųĄęhŸōY;š1ČIŽõxõšČä¦s>kŃ#b؉lĝ0¹ƒ|ų®µ>ZŖŠŚƒ…Ö‘µTÕ}łc.ÜóŖh]WQlÉš}E4lś]Čw÷!ŻzŽYö™ä-vū%z0/K«z£Uš¹zAĆ<ėRzIąČõ:¦Jź),Ó*Ąr†Ó!Ķ?픬ņ=÷" Ra–  ŸN$jsˆR€©z@/" ǾҦćķ8FŻY­gnH’:†"ŠÉ9% ˆČrT¾ęņš ”rŽĆŸxŽ”r,J3AˆE†.Ą0jŻ;XÄ>™Øģõ^śē£ 5’,(˜æųŠĒŻ0 ęHŠKØqw6b 6‰ž“ØEÆĪƒ`›N0 b詿1}é•Å”Ėż¤JP„õIB›(˜€¹ē "äŁ&ÉżÕw}0ŽŖõ±„}eʼn*[®Į1þį$½ąó ĘÅ`ŲՌ8lƱpÜ @ō/—DIĆįė%óB6žäosę”ߏļFČŠŒćdV'źŽčL ß­µ5æ®|śŅćķ#oC²chf»”ß~E0‰;lĪØ9¶pcÕQ G„&żĆģFØŠ— ƒĀ„”m•fÕč G9ƛß³|č†ęe{Q;€ķL'vu4aŒž/O±H/t Q$īG…» 3#‚ƒŚx€wƒRĘ”Į·×‰ąĮ:śP«Uń„Ž~’S ŲŠ²GC„Å¢™?ł5öńÄŁ•$ķČ+U6śIpņG£Tƒæ¤&Å7<­A/Q­• ¼²lØŌīPG3źØŲnÆü Żń)»Ć@ŽmM¤ūŃ;u.l&!:ēó =F9CĆ7<eČJŹ•j¤C%2I!AĢ ”Ė /‚‰Ōm3H‘†©™ĢxțAć{ɵhi‰Ö²}čcu:¤õˆfa‚ćĪ>Žā‰Ōr“nEĆāˆÓ»l†śfŁĶ±DPܑÖvNź–’¾if Ę]W©ŽĆĻBGśā”ē¢$Ģ­ä{(bz ŠęŅ\Ģ÷ģmB†œē›nŹ˜Ęv°ĢRq†F 6²ęW‹Źø²ŹaEIĒĖ&†>zĒib—?ŠLRĪā3wŠŲ”¶õ)мDLg0‹šĒNÓyģ»-—W"Wvz:†%7‹T ģ·:—е|@MļĒļ(Ū¦wsģŠ °įß°jŸNĪÄ\Žģ Āģµe:D†Ņ‘GęgxįA#¼¦ĶRÅ&xYĄ<2²<#”(°IƒņĄ¦»ģœŃ±\!+ēl©Ķ”¶q#'l•p½Ø5*o†@2dž¤Ÿ;kZŸœFR!…VM'ó±'¤7EÅ®! 8Ń9D`ŒĖõ-vŽōBqOŗ/(”Ŗ äŗ‘6Ą‘ĮD‹Óę¤?TÕŒ,4 Æxƒ{%š+#÷Zl 6wŪy‹i®gFQŁĆ× ˜™8ź2ēš …a.ómT„KLŠāĻR?yn£¼!Š1—a²yƒńTD%ņ˧‹•«óņP‡śd÷ņ.lŁ£=™1ÅxŹķ—tl^”JRųļV5DŻ V‚#K„¼Čry(…Ż"=Sė„’s¢1Ūć@tšT0;“¼ $vƒ ”C,`~ķ(ƒ*ŚL»1` ęØńV‚]*TGVų>NkĘŖBoAÓö“xš}ƒĆf J4ōQ2mÌ%ŌRUnȼfhg\ Õhƒ'ē¶ŪŠD…Iā4L1ˆų3§ÄÆ,¤<Ŗ; ZDZ½LāŲ_-u^ _RūʦÓę|²«,·•TUÕ=Õåč*CÄFåÄŁ}b2'āOͧ±Š­Ä‹„)€ĀAļÉ“ŠU”\cmäkņģŹY£;EXGŽ˜Š‰DÅӘĒĒ…L\Pė%ĻŖ‘§2il*Š ©¤I[X¤ŗÅ„Ųļ S}¾ ? ōčĶ€<VņהšĮF›̱¹žŹš ų1,uņ9ŽWɾšEńŻ“üݧ¶l.“źU€ēEĶŲ3cŃńPYQžc„īR±”R˜e߅³‚,Ÿ?P1`ᇒłŌ]ˆ>hķ¼`āįļczĶY£%kFGÆR{¬®”¶šĒ㊰„ĘÓs&ī–O%D|^o¤Y~”ˆ¤ Ķ»…jOJæ/ĆČ%”,+„€†3)œtsÄ”ąu4Ėl›3xʬČG"ÅOžŠŚ|U‰,~Ńrš,•D!>Įō–šŹ]Æņü:”æūfƼ Öģ.t”żZŅj#³Aßjö]Œ\_ ń(T×l×`Š4ņn c/‚ UmcķĮpL:7µZf6¾°l궐‰®. @cQ"µXg恚;ˆx¶(ĄPĀ“ņ¤Ī`żź}ˆNņ‡*©\U©8”¶QgE*-ŗóė§KWčŚģ)•VčU|Sb©PŸ“–Ną›7źI.Šg|³…Ł»éPĮłčµMŻQ;any¾Żć{ Z(Wޤ+«éŹQ*ÓNŖ"g_£éGG0Xś¼Ē_¹ł\HPt=ęąōŃų¤D#7ś6Ń }¢eąr6“źcVõRŖ` ņyD#īńē¤Xļ„„tÅŌ£M(ٌ'2)†1Ŗć1ŚČ'2ųĘ©>熆@äe±3č%tÜZĆTKŠÜ0Ų—M*Åfį%óš7—ģµ Ü+żšź+™¹× y ½/=!ā’,•Å ”\dnÆćš3® Č1Ō[śą|Ÿ<,øK žw I‚)š ‡-’–‹D09 ÉA­1G;’ĢóˆuńBmµś©’Ēj€ÆĮņƒ:Aīčb°É'ĆrafųāR” 5ĮUsŽY¬Å±Ūy2ŃI€>„Q-É.ĀŠŪā+,Ō\rƒģ•Š#ÓŁµŽK˜žvĪ,„¶F¬³\#*B— «Šā ­«~f’j­ufØ`ż|„kja$Ųȑ¦ģ·‡sˆĻ_[P’“Ę®„‚­IÜy€« ‚0)ņ ±N±-ø FNNEAvā)¹Z ?ļŠĖŗŻ©Ķź“ZyI÷ą"mŁÆŹ’č„ķ9•°ŌabņP(=ē,‡ĒyHŃpT”’`QČą‡µšąBVVśDÅpĖ:^E'1p3œ)|˜+sBfŻJ‘äDT㨤ōĆ|Gź7}³āŹljFvT«{Ž@±“ŸŖź|-½j”beƒ˜©pÅ`Ģī"’öŗSæ­"ŅŁźZ„ƒqE er+5«ŅčøP„4sLTOč{®T‡| W"N ѹ<īī“§²*§żuS ½36ŗI:ķœČd6ė娖=Ļ8Ū¶qŒ†BZ pŗkĄ£U%#ŠčŪĆi@˜ŽPœrdćŅĖ™,‘VČ6f{xŽķĻ C”žRā„/£mĘĮ'gf°oˆ‰¶¤A— Ą×ŠŠgA,ņB(‹Z ĶHF‚+é‹S­ 3B`Fņ/›AōuY/Ÿ g X4ĪzŚūńJł t>Źæ$óZÆngg5zµ£RŠ)Jx|Ź7v”czbC ½©Ą«Š+‚,W,ŠŚĒ³˜=×ZĪ—^ā1l­b{ˆóvj Ö$W~˜}x}ū½ž3ĮĀ×rš~¹¦Œ>4°Xęźue®.”Qkß9õz”³ų®Č¹¶Ģā»T¦¼+ė·ēfSmįÓŚę‹Uµ²—γ®–RYå¬ķ•ńXÉØ*WÅ¢Ą”i ³”ZfqGķŗń=#Ś„aŃ;āęåė¹čĢ”*¤ƒ@Äš<Ōćæ„p–쬄Å*… &!œkYrŌĢt ŚK‘­|Ģ>ˆåvó@'hh¬*®‡QŠējA=öé\7ŠN;{_ŠI*tÕҐēżŃFU”ē‚U oPõX¶G}l…¼#’Ö€÷ƒZX¾Ģx:[چķ)x^ŖķŲŃŹ‡»`äā_<8¹ØDQś`\TÕXžJ£s*¼2˽RIš$šnń&øjśˆ„Ę,_QĪźČ%m³Õ4—ķ©ĪS± *Wžl!&γĀ?€ƒżeėˆ& UUŽzKŒØ!ĒČ˃”ĢõóŠ{Y£Š¾mGr|«9*QeÆĪ³KTŁGēŁD?t~D7 ōbłį „ ńJ× \uTJtÕ¹G•{\{ć'Ū”‹r6­„ē1/³Å÷B»øY׊]z酓ÆYN"8żkÆ;,“r¾SŃ|1t3’zƒ<Ÿ­ē2}Ž] >jS"»rõ8‡‘Ų?kŅqŸCĢ;.[9ŖĖU}ś»½ŗ©ß£ŠR֖~6ÓŁµ (³”3~fžä5pl=®į§ąÉ|ū0Łķ(™.„øyVŒW:}į¾K™§:;®Y˜Ī›ś$2NŲ;šųøt¼{õŒUp'ŻÓ=8.!R‘t yĒļQet¦›QķkēOm ɍcēėéST©ę¬7 ®Żį5™É½‹ūÖu²ƒÓz©·łGņ22tÄj½ŚéŽ7śģ"ŠÆėÜĮ²²¦øw‘Ķ7ØūO4ÖõYßnĒq+ī«vD³ŽvNƒ»N÷ŌÅtāø»ķ'޳ŖÓÉĮī:jį³;ĒńŸóø­…2y,¹g‹įeY żčł6²ŒŖb~‡/ÕsP9©R.7+:'Nė²?x_5ģ4£V%xš‚x÷we‘æxqZŖętłj‰ųõ{×ńä9©]ŽĒ…“ųŒ{RĪqx¶t/īÄéĄ}V§­QéT·O¢€õÓgXgŃgŗāu=³¾aģŸÖ/`jH¤ˆœć\¶“®ßū.Ē•~„õSŅ—®_ņ%~×/‹qZ? ˜Ö×,NDŽŹ'æ7õ‹Nx›EōƒŁĆCvRŹß_Ÿ\?„-¶e‰¤õ³ƒZbCbåVuó<Œį†”·nI•ŠVÆA‡Ø<æÅķžĒ£9½ˆ.ä;ēlW\æčl¦ÓØō=MėҹĖؐŅ)ęŽäĻĻV©Ø6ć¬čr‘fg½žæ>]Č;ž y‰õ'KæµPFm[Č8&ÓÉBĪzOßQ]ČRĖ7D/r«ū 9Ņ^^Ÿ³ĘŃ|]½ą —b÷s˜ƒ~•£éŃ× *»ļ2s+z!w łņÅ¢¼ƒ“$Ź€ÉXČøæq,’k!ó ¶Ž…Œį&ūž:‹ƒvTtĶ딓œĻ‡U«Ž9c”«Ę&ŗ|ó 6 ĆC<;ģ#u̱Y8,4čųå3Ę/ž öb—ÖĄ®½ŗr¹SŲĄ"§$Hj”.­N0o.Wź {pČd;ÖķBé r:Bk³įƖ½ƒ[©”<›-œ eOņ™oäB^Y™ ™§ģĮŅŪ¹af5Äv„ ’B9f"wƒ^lČēr·XZ§VbsXĢ„łÜ[Č1šæ>'9?&õ~œwJ*»|Śhƾ\ĖõŽž śC_ø»¦C«zķ@=õźź7N4»ĶI5Dõ[Ēå^ݹØÓ!YXlį° °ˆśVšāœkjĶrļF«O:S›Gnpó¾Ė× ’ Īć·šęź 7˜Ęū!V³-<”•t V|‚ aįƽ"łżėę@B®)cŲԊWµ=7ģŅßš)ya›N­c!µ.°—<µN_čˆßk‰“¹Ü»ZmkŻūF.`õMĒ9¬;.9.ńśąE²R•i„@t‘­ŒPóĪĮłVŖā'ĒĪ·„ ŅŸäčeļā½§ÓIŸŸ4HMŅ…K®ē¤<Kb.”äÓė“q\D–Eļɼ!± ¤ÜŻh#G "÷*Œ¢—‹‚ē~OŠÜķ±ŻŽ VsŪ8ģ%śZ”•U Ī©Sė£īÖ¼Ų±ūč\‡yĆąźĪŁé»¢” Ž4Į^NČ931+'ć˃ʣz9Sv‰BržJ{;’±¤–S¤üøūlńL«kµēV×ā91«ģŲqīćŲyF|üÜYöt³WVŌ×ϘńŽē„ZkrÖ·;ļ^N6vDķ‰e]%ćĘõńõȍų™8¶ØR\»yKÉ{Į’ś\—ļ[ ŌäLz})ŅīīĪó ķéŌĘ:‡ŻžōžāØŌāb~Õd‡ns'7S²‹^mrįÆ$#2§ Y—Šč¢z"vĪ'5³RQaŅ4¤<Č‘Šō"ænę[‚‡jźsŪf=Ė#qٰ6iÖ+×ūż"³Ž(Œ¤ “ĆŅWŽoX„NK±ÄŅČ—tĘļ}g“Æn^DER\$µ| ”.O½ŌRĻuņZųڧpΧŽĻaŃ÷VGŸ&u ¤žZ œŽ0äb±‡«e· 4@Ė.Éą2ėßŠłGÖ šÆ3éā8÷4­q)„Ɂ’«w!üė Z1Ž.u,VMŹWē NŪé#IdYāv,Xy'ŠBÄŻ ›DŅćj²3/RFjžsķؾę7CeUKW֚yžłĮy2pžĪć4Ļ30OAd{²āNęy—ö†k¬L“;ó<š;Xjž6N›'ĖģĢsPh!ń ¶ę9†§*éfg>ńøĪ©j•:L²#kΦ]™«Eodstėģ=&:©u–“39•Ŗ™Ś`:#£Ü؞cĀ'¬(ŌX7ČJ­łķK±}i'ł±ŌŗꁤßkĻ  6Ɲ½§žfi_¹ÄŁ˜å•©uQ_V†ž\aĶĻsĻįÓr}īžpזÜ`žBGWŽ(ģŚ¢ėˆKĶżz±’z/¾āVÖ3×P^—yŠ…;Ü ‚3o8ŲV‡L]ÓĒ"$¼XŠŻzĶ>Dt±š ķ~:æY/åŽČÖ_ϼ CD=ƒ¦Ÿ“%øžĒč^—£xMAÅ”¬özŃńėĘ#ė“­© †ŠģvĒõüū‚į Xµ2ļä)¢ņžE‰{ŁpÜōŅi3‹Že•nPģP–;æ0AŅ£‹åģB›św4™‹÷‹ŚźĻęś)yR‡Źų¹hĶe«‰Źóŗœš6Kwįc4|Ķż>9ęŽÓÕŠ”·®gˆošéŪ=ł'ōAKČu¾Ó“™;zćįĄēˆē¬Ā0—"÷Ź»“$.)=ģ•äz>@¤¤Åś”ųzSßmQ„hŻ0įĆžŖ5£@ä <+T”h«ŠŸŖ…$Rxź "³Jm ©g &ŅXU9`a1Ģ@)4Sć0tĶ[SVkź%™Y{ó"”B’]hžwßå*=ē\ķIe! •J±…/DŲB¹oµRĄ³]Ė/Ļ" ¹”±6ęö;q:—“Ē’Ā ŅVĶ*~[dI;į1(9YæczPņŖĒ31.łV3eSL•'Ēʅ3V Ur·ŹP#ŖD¹k)XMĢŚ¶ŚL”"5õĖ=kBŸUŪÖŲ3äž5k¤y[ć#'æˆś@G­t ž°æč½`YR¾ß›¾ĀJˆ?ÓN¤‰Š2H‰TL{;'½g}okLu’4: ł­ķķœ]?é¦ų ାuźICy’/łk8ƒų^ÉąNŌC6«(Õ)bÓ˜E³Æä©Ł Ų­yö‰õė=Ü(@Ū•œäŌ‰ŲĘćxpߑo’=‰x,h‡ÄǦ“Ālœ! ^² ŠĢFåS™§z%IŅ{ąylć1qyė ł‚KÄ+.ݳѰö€ÖZ†čźŃóŠnoŒ9Ū9֙^B½¢k½Ø])‚!EN›żc¶°—§X4!ćTƒ‡8‡/ ­˜—µę†7”ĢSą•2N»ļģZqćžK÷]<~ß¹“÷ž8‰XķĶ>såDˆ¾•®"”:Nŗ›¢œ ©¬\ȋqŹC3§pæP[”µ eo”g©×Į ‡›F«Ę\Wj£7˜‰I1¶ŃYŪļ ģY¹ŁĢžŲÅ.p$QoąRGäbl ”Æ{u­śņĒ.wŽJ~r€±DTļc—½ŌapŌ¢…äl²„­xÅéż±ė;Ķ  ³ LŽAČ ]YµŽŃč­®c|ūm«š#łČ®łĖ®‡8ßōlł8H— $Ki)-ów(’Ż’ō—ŅmévĀ!āOäz[ŗ#½:ķ§×pė¶ō"ī?’yÜ(=3IÆMoHoMŪépz3ĻÜįēŽNźŃ§ÜN¹ ‡n?ō¢ō†›‰ņÜ-éEKÆ]ŗ=ŻrÓ£¤·Ó«—^tčBzżŅ#éī›nY~€ŗoOÆæé5é‘Cŗ»ž-=Ą3z;ļÅīįĒE{ō{(=5ŻIOu y€÷æyéņ‰/ŻĮsźĮ‹ų}"懈«?‡Ņ(=šNoäļÕłwŸ'Ig–ß Ö/^z”=JKMŪK#ś–Hæ(~žHé5Šš“Fj›¶?²¬śöÉyŪ”7óä(½…śnsł;—¶éńöŅĆōfD •z£ī/½ĘeoYz3ķŗ}éF,ńģ[Ļ;ió>×·,„ōJʧ%½ń­{=×Ūś÷ÄtĒņaZöŚv†{oHwóLZz-é÷Ę'©ē·‘÷Fź Ę[įż·QĆ6© Ō’0uNÆ[Ž‘ŗ#]x¢jMéwāLezöšM‘Öļk—\75ß¶t'­¢ K£ō6ŽšVĘéNŅÆKgn٦äėō꣏<õšS_·üŗĒ½ˆ÷¢·gx×ĆKŪé5ŒÄķ‡īąŁ;ų»æGnzŪņmiō¼Ņķ7ŻMŽ[VŽĪļaޤ7_`Lōļõ xŠ?K·Ń¤¦‡oŚ_z˔̆`Ošs ­mzūŅŪ—p\uīĆzŠ{Ƥ¶‡eÄča:Ēõē¹>Ģ(?œ^ĪļŅėØė ©Ū™ĒQś|RƦ'ŸAo4®·šŽ;iĮįtFKˆœ;–‘ŚOšŽ»=#ęä0O]šß-Ը͟R·;FßæŅ{śžSēmĢēFńĪōJj½ˆVļĖåŸĘ,·į Zu=•_õü05=‘æ[wŪć?Žń!ļÕō]#sjĆSł½%=zÓ[oJ‡½é-7żŪMo¾éQBüiœ^Äߝ<§ŗpčLZ#­ZĻPßĆŌrŽ7¦CϤuwS›Ź&÷QŹ]øI00’w;õf®Ó›Ū—ńļ \ī ®äŅxŖ„ś}*w§Ū—/@™°ŠVĪ[—4w3v‚Ø3ü¾š§µ2oNĻ,½ˆrgø˜ü3¼õv­Ņ„o!žx•-½•ūPāĶKw ŖW0¢5©š0q„4K‹øŅ*÷jĀĘ„‹'N/kõ-t]Jļ’n"$ĀRzł·ž@Ž˜§'_N#<žž-§›‰ßLü]¹_ā7{2e…m„w"¼3į é)üŽLŽĶäŻLŽĶä=ÕwžČ;Ž…Ų­„'„§qļi¼’i¼_˜Ø}™“kЈ>rO'¼æļL-‰°DüvrŽŌ{øü”ō(óž„gšÄ’åŽĶ”y/Ā”|oʽį}É&O½O©­ļOxĻ&<›ų µ|×÷¤ģ>ˆŲć©ń9Ü’`Ā„Św„·čM‰°Ä›VyÓQZ}į¹µņĻ#ž|ĀŻ„žLų՘J/$ž!„%|ļūpZmæHyJ:Fy½ū8įaž<ɽyŽ{s:éē¢]§øš 9C8ĖX1įŌ’Ņ‹)wį£š$Ķ3Ó:õÜ˽ó”½@XcV^Āū/rƒō%×óņ ž½¼ĖŒŽć ‰ 9»Ÿšłš£—2¢·ŗī”^FśAĀĖÉye?‚Š żJB“gZ\Ū„mģ)›Ģ Ė:m¶Żīgńž›Sš*ĀBŸ{;„3¦{CˆšaLž„°ę™|VšRfĘ{v lVrł}ŹЧ«„$¬žĮŒ?ŻmÖxD_?Šü'Sö£ CųXĀ« GųxĀ'>‘šI„O&|ŠĒģ¬Āg„O„ŽOĖļüt čV H˜÷3 ŸEųlĀ#Ü’Āē>šłä}ļüBĀ^ć÷?‡ńxwŸĆ8pśb ļ!4īšÓ÷ K†kå­ęūGy»Ö€`’®ō%Ąö—Ņš/:朚¼ć+ Æ„ĮäW„æšė×¾–šu„Æ'|įuÜūFĀ7ł=·¦of } }’Vņ¾ūßNų<āÆ'|ļüNĀw‘÷Ż”łĀ÷¾/=l–Ņ÷~€šƒ„¢M?Ģ łŚż£¬’“<óFĀ~œšĢŠ›X9?Iٟ"ü4įQĀĻ~–šs„Ÿ'üõ’"į—o&ü2Ļž įW æFųuĀo~“{o!üį· æCų]‚Öäļ~Ÿš„·žšG„?&ü įO FųsĀŪAųKĀ_žšš7„æ%üį턿'üį ’DųgĀæž•šo„'üį? ’EųoĀ’0~Zk’KHK7§%ĀņŅ’3üÖŪ}ł'){Ģ.xi™xJ8Oø™p ϽÓ҇€S5†GÓ;/}hzĻ=‘š.”.»•xń'-A•ÉWĀ“‰k>O!żŌ„cę=gžNx7ņ7·SöŻ ļ±¤÷€‹ÉOĀ3–žž/压pé÷&¼į} Ļ$ļżļOxįšŅ Ó³—><­@‡@}H¹">ŸĆõƒ wŽpoÕļŗ9%~}}.u<ųó ŸĒHhßÄxÜMś„5`čĆ«uĪ|Sž…„!|(įĆNxįį8Aóp‚ėį$įį4į į,įń{ēė„{iŪyĀĀK „K„ūźGóĖ”æŸšį„“ļe„)órĀ+źļēŠ įÕ9Žø9}å„S¬īW.OĶ%įkĶ­ĘļCRkIėņĆR›qģ,K]Ęf“°õxś³Å³Ū„_¢^ѱÅõ$® œĖżW®0ĘĻaäŽ ė“ž•ž½9ķ7 ŻCĀ÷TćżŃ­Į‡([‡_­»1yĀ”0#ģöū„ĀUĀG> øųhźyAsRąõcø÷±„W>ŽšńÜ’Ā'>‰šÉōūS’T§>š„Ϥüg>›šįsČū\Āē>Ÿš„/$|÷^CųbĀ—¾”še„/'|į+ Æ%|į« _CųZžū:Žūõž›»Ó7~A󚍞ĶŪ)į7Qž› ßBųVĀ·¾šzĀw¾“š]<ūŻ„ļ!|/įūČ{įū ?@ųĮ„ӌ“ęäPś!ę⇠§Ģ.RśŅ?JXƒ#ųŌŚ½‘ŗ4õył1źūqĀOŽDųIĀO~šš(įg?Kų9ĀĻ~š‹„_"¼™šĖ„_!ü*į×čćÆÓ¶ß ž›„·~‹šŪ„ß!ü.į÷hĆļž€šVŚś‡„?"’ BޟžŒųŸŽFų Ā_’÷W„æ¦O#Āßž–šw佝š÷„ ü#e’‰šĻ„!ü+įß’NųĀž‹šß¼óøž/!-ƒs—„e§›ŸĻ½C\7©ļqdjOśf‚ų‡[Č{'žygĀO$¼ įVņƒŽ½0=ił…Ö¼+Ļ<™šĀS¹’4ĀÓ)ūn„Ū—'e=æ8½ūrŠ×÷ąŽ’!¼'į„’Ė3ļEŠ:øƒō{އš¾„gŽšž„gSīŁ„śó\?š£ōńƒø>‡šĮ„; G«„£ĖgŅ]Ė·¦ē.߯_x‡sōR<ó»§ē-ÆĆ‘‹KZ‡Ēø7=Ÿg‚†æ%žŽ2‚äp,é>„š”„#|8įE„§s’×ćĖēįeō.ń_·¦¼prYxķl:„1捧©’ A4}g…ĒDė…ĖĪRĻ‹ ÷оsĖw‡­“¾—pžšnĢįŻŌqŗ^BøHŲ \"ÜGøL™ū ^JśeĖļEĶ7§IGąrŽ}éwć}H‹“ų‚jdb ^īūZO‡Ņ+ļ ż Ükp}%”IhŚ„õt ›¼'ä†å“Ež6Ļõ–_b™ėU¤_N[Ō÷ąS/Ró||Æš|Y\ś­igłRšģŠm揵_ĘSstkQī”åg¤1aB˜zlß7Ķ–5¾õ±Œ¾hŒwy’÷ö Ō}•ōGĪĪų(ņ?šš1ä•>~,ńWs’ćļ¶@Ėh’'?Å3ŸHłO"|2įS>•ši„O'|į3yV|ĶgqżlĀ#„§SĒē,_NŸK=Ÿl~>į _Hų¢å‹é5”łbĀ—0v_Jų2ź¹÷}9×Æą™Æ$¼–šUĖ÷Ć)×ĒF0VĘįōÕĖ/M_³ü²ōµĖ¦Æ[~yśśåW¤oXž4MōĖÆLß“ÜLß¼ÜJß²ÜNßŗÜIßF}ß¾ÜMÆ_ŽLßAųNĀw¾›š=“ēłōć{¹~į „ļ'üįi×~y¬5ę×āž3čļÓŽ5®?ĀõG o$ü˜Ē+ż8m¹%=!żõ¼‰ņ?É=ĮÉOq_ōö§¹>J»oęż?ĆżŸ%üįēÉLż‚Ė·€³r?„_$ļ—ø’d¤/éTßLŻēéēM¤™g…šd$7ĮąÆRī×ņ;‰q8Ä»ob½…ėo~IPu’:Ļü@~gĄńƒ®ū7Č’MĘłńš-?‘ė©·} ©Qś†·ųÆpżóŗõ®\hŚmH•Z«oZ¾q].÷X£ŠåWq=”~{ł Ϧō;üüīrß÷Ž“¼ćė[–”8”~÷ž>ż’®o]’s3ļ¬ÓÉ凌ūCīēRīr?<¾H£Ć?vž½Å„7Nxę”ō'Ė£ō§ĖćōgÜ|6#kŒķŸ/o±šoMoĪžœśž‚š—„æ"ü5įoKų;Ā“‘˜sßÅų¾ōß/O©_ż›Y?£÷’¾ėŻõXžń'ĆR”«ōūµų<޹®Cü·čź?śyɚ’aSś§å«ĢŁAśē夏ü+•żežšĖÉ(éŽrśOĀŪ’Ex8żļå'¤’Yž(ĘJ÷ƒ/ „’—ē_¶üŃ×ä“y¢ĻM“ß…üsć1~²Fõ’kģ,ą£Ų¹‡ŁŻvŪUhq(īīR–ÅŻŻŻ)īīīīzqw×ā\.īīĪEæēĢ쮽ß~O3“œœČ$™ŲdĶågīåĒŁpo|ƒ„;½aXĶ!ĢÆ…Ø@°įß]ļgtøĄ 2GĶÜß«±³Zų 6 *g«Š”Ėōź·Ŗ˜ÜĒBVJtlĢ8āņ~ŽOx ˆ_ˆy7-ƒUBó•ČA…™'ŖāęIŖ„y²*iv©póU ?„” žĖb–3Oeīxš×_UĮÜ@U„JPŖ@Us]U łźP?5”–yŗŖmžįM“įƎy¦Ŗkž…½EÕÓågS’|ibī ;>sĆš„m’cN©”yo6Ÿ¬ń<yŸI$~ć· ~šbJ»ÓĢP‹gÉl”Q—Ŗ¾ś3YUśQ_ū#7}Ń=ˆėĮ żŽ!˜CAօ"™ÅņÅs8÷"/óˆ#ønOY‰®Ė¬PFyXé}®’ŸŒ‘‰9 Fƒ¤kŒŲĆ8ņBŅ;ž°'˜WŃęĻb"ö“`2¤Gn H“p¤_Ä Zˆ.ū›šj^£¦!7f 7¤Ģ‚ Ž?³1ēĄ\˜óAڐ°}‹`1,„ åńY+ńC¾q^ɵ‡™:·īæµ;!jł¹ZÆ+FŚP7óź4źŌ:Ś.I£QÖÖ†Ģ ­ÅĻ:ĀY`#~6Žfsµ[¹Ž†ŻvĢęõQ:vb· łŻ°‡ė½°ö’ulˆŅ‚ĪppżOŒiq?¢Ē™¾’y£·½Ū¤Ž™7«ćčw ‡K£¬0ŽEž$D§ ʉ䭔3šĘ{q°øa3’YNĆ^Źż)tž3ŸF;Ę8}ē! ?¾ö3«yGŌ;ęņq?G<³‚螯—tżĘsł™ĖÜ_1ļō¶ńōmøæŅī]'/np}óęmŸL»Šg<€‡čh‡Ū#®#ˆłcīŸĄSxϱOĘģ­Æī¾ >/!+nÆh;^ėńęĆģ®ō1Œņņ×ŗōĘ+#u'’Qst].D½EĻ;xą#|BļŸš¾pæ¾Ā7Ų‹Żwā#堖Ś÷Kx!Ŗŗ„o,uTŹ–ĢGŽnŽO›r@żĄ1~:ĄL¹oŒĄų…>ŒŒåd@üj˜&0ƒōÓYČT~ą±Leµ°ī`;8ĄiI¤\ßxCĘŅoŁÆÜ–ƒ”“ƒh:H›cĢėĖóˆ`|-ėlŃ@Ź‡pfcp9„\ˆŠŽ}-l‚Š-ż`Kk¾xV1ˆŸŒĶc" bCā¹äų‡@ˆ/+Q -GT"ĖQ•Ų"kGĒTĖq•ŌrB%³øTrH)!ś¤ÆŚbŒŃÓp/cĆ“ÄGĘ6é0ӃŒŃ3`f«gĀ”yĢ˜Y +dƒģä=Ӂl.tę&’ļy0C!/äƒüP B!ŅUŠ _

Č  ‚ĀøĮ,źwƒłVßūĀ·Fc¬}xp/aPJ@I‡#Ō}Yµ€Rܗ†2PŹAyØ@TyßV¬ U *TƒźČŌ€šP jCØ õ >4€†Šć§ 4…fŠ»ŠZAkģŚ@[hķ±ė”t†.Š"pļŻ”ō„^ łŲ÷>z¾Ė\¼oĶFś$2/só27~“¾ĪMJłM½nē¦ö՟ƒIõCO?“Ž¢gWüģj nƒ`0 ”0 †Ć £@źĶhæŪ“;v5c±ŅĒļw‡>‘EMą~"L‚É0¦Ā4˜3`&Ģ‚ŁÄeĢåż0V²EōmEĒX‹`1,„äĮ2Ģå s#+0WĀ*X æłÉ®—{“ƒµٵ°Öć¶AĻGc¼w”:й hČ+iÓJŖ~įj²’o›1·ĄVŲŪ”Ļa‡ßµÓļ!WńõŠė—ńī»!Ū+ę\ä•<7ŚIźĒ^ŲéY™»ż\K?ż€˜ÜÄ<‡įń< Lj÷qīOĄI= ;©=‘~Õ)æ'ź“ßSžć#u·d„Õ‹÷]NŽeeh‡¤¼œÅæ<ŸsøŸ‡ ū†.ś=cRüŻRæóL/ńüžš»«.w×mm,÷Wį\‡Žü‹‰Ž›p nĆø‹Ū=øą!QFįļ1×Oą) Į®q}ĘõsÜ^ĄK®_Įk®ßĄ[®Ą~xį=q’q’Ņ·ūūĻ ķŽĢÆš ¾ĆPžĮJ“2ū³£‹…1?š÷gF lžģ Ćt€\ąF.D‡ †·X›ė8—ėxß_©č Į.!Ä"ųDŲ'†$ø%…dR —™TŅ@ZäŅAzČĄ}FČÄufĢ,?Ł0³CČ ¹pĻ !*„ʃ{(×yџϒ©ŹĻ}=S»ČŸ‚ČļÄ,䒜ŗńœRš\/·…±/EĮ2QL×);EH‡w\’3 ūāŽšJųæ¤|Óīžō±Ā@ŹZ,Ó+Ęķ“Åȕ‚ŅPŹB9( "T"~•1«@U=l³¼V©Ų”RūźšĻņdR5°Æ µ ›é…ŖYžPėśæRõŠg“óņž1ŚłśøūŚś\7„æ¶ł¬}a׿M )4ƒęŲµ€Ś“–Äw€ö†~ŁRśFo_×Ӑ¾i­üßŅö¾c|ž^µö/ØŚųŪU[ņ§ž¤­jŁĮ’uö­źˆN‰['ĢĪŠŗāŽž=)žŁT7čĒč’ö =ż?®Qw¶Pæ{!Mļ×Éģ'ņÜŠ×ū>Šł~„ßžJųŠ?Į`™C”wć2’?iÕ%NF<‡"?Œėį˜#`$Œ²£Ń9Ę’3iyŁō3-ŅO“P/Ēś7Rćō°æRF¾’W_½m$żiōzŲIY™ė™€^Y›—uЉ\OĀ]Ś®É\Oįz*ę4Ģé˜3`&׳0g“Æs`.̃łŲ-€…°Ć’ļj©’ņŪ(£Ė[Žż X «`5væĮ®×Ā:Xü•VžOIć&ņ'†å³ŚŒżŲ ŪČćķ0æ;`'ģ‚ŻøķĮ~/×ū`?Ō4}Pü?©ƒø‚Ćø£øƒć\ŸĄž$DĀ)8 gą,œƒóp."ū;~.Įp®ų‡Ø«˜×ą:܀›p nĆø ÷ą><€‡čyį <Åī<‡š^Įkxoį¼'’?ĄGųā÷3 ą¹!~_į›’7õ|’įÆi²ļ–I¶ŠYŲŗ`Qf°€ėK&|²o—.²¬RŽĶŗ] 226±aR~u;;Bp‚Ėš:_Qźß åĘ.šÕ„¢[oŖ +k$Čŀ˜ b£KŽķq0ćźaū4é?łińč¦Ē·śk ¬-ÄśŒ5Ć{*!śAb«]%¤ ’C «UK‰™Ź „F_&¦i‘Og•vģµJo5i¬2WaÖ2ZµLVŪTf«ļ=žSe±Ś“¬V»ęf{ˆ5Mß3%{ØDŽ”e#ī¾5h©7ٹĻAX²SŚ‘ł”qĶģŌŅā–·\ņ@(ä…| @AkYUČźŌ []Z«[+J<ÖhZ1kt- ÷āP"؛%1Ć”œBižS( S ·fyH[āT*![³ TåŗT‡PÓ¤Õ²kŲµĒNŅźRµyup«‹|=L_ŲõŃŪ@×Ķü?2p/ Sõö6D5¶«&äuSņ®: #Ū9ćÓv#ŪZAk¼*N[ӏø¶!œ¶Š$]1po #z:Agč]±‹ œnŠz`×óžļ…9‰|čmM£ś}­%U?żyÓßĘm|åŻ4pĮ`kL-ž¼54Ł?¤†XƒŌP†Ūp#aaކ10ĘĮx4LĄœ“`2LÖų™JڧĮtk,ﳌ”ł’g>Ǧ~ž×3PjńŽ`÷d¬’”‰©Ķ$ÜY0ęĄ\øĶƒł°Ņæą ³x-‚ÅÖXj ł“ŌW‹ö?u»Ō2k‡ą0£p Ž£ļœ„HĀ<²īćŪ7ušū3p•¼;‹ü9kŹyfuž°.XSiI÷ļpɚZūƒ¶ä²5vEüĆ5ø7¬i)“iÉGE™ą]…Ż-ø ‘ģ¬’¼’g&kÉŅTw¬éI{ķ®^ĒŲ‡•ģ7äś><@Ƭx:Ģ€™0 fĆ˜ ó`>,€…°ĆX Ė`9¬€•° VĆo°ÖĀ:X`#l‚Ͱ¶Ā6Ų;`'ģ‚Ż°öĀ>Ųą ‚ĆpŽĀ18'ą$DĀ)8 gą,œƒóp.Āļp ž€Ėp®Ā5ø7ą&܂ŪpīĀ=øą!<‚ĒšžĀ3x/ą%¼‚ךŽĀ;xą#|‚?į3|Æš ¾Ć`REŃP&0ƒüĄ¬`;8Ą .pC4ˆA 1 &ĂŲāB<ˆ B"H I )$ƒäRB*H i -¤ƒō2B&Č Y +d ,Ŗ×Åģ\K¹›M}öĢƗ&q€U½ż(ģ_XĖXDĖ ¹ 7äPČ ł ?€‚P C( (a„W<õYšš% «£„QL£d`LF|° ÓķJ/£OY{cŒ(mź!śõ„eŻ©„&ßv–įŗ,”ƒņP*iIĻ2]š[‰0+ƒōóŖ`VEw5Ø5 &Ō‚ŚPźB=؏lt5„FŠš@Sh†[sh-¹o­¹nm”“‡ˆö¬#śęóžģ„\gččR]!ŗAwč=”²½‘é}”ō‡0ĮąĄāŚĢ”0 †Ć £`4Œ!ģ±0Žėń0&Ā$˜ S`*Lƒé0ƒpgĀ,˜ sš;—üœ‡Ū|X a,†%ø-…eČ-ē~¬ä~¦1÷Ažė“žyÕoŲÆµÜÆC÷zšP„6`nÄ’&،ūŲŹõ6ä¶ĆŲ »`7ģ ,”ķ §Æ-s.µüŚ 6ó£Ų'z¹CpŻG ‚—ĖQĢcpNĄIˆ„S ;RO#&0ŗv6ЮΖ¢ļZвXвXJ;čVp—ś±ĻTšwviÜJėn‘ż7ļwcQ†žxÜĖą^V»X޾1mį\†+¤ķ*\ƒėpæ7ĮŲ‡E™ėŪp·»e“{Äē~`yĘ$åŃY^Æ+0‡Pū ÜW$ Ś?äÄį1ęx Ļp{Žł^RĻņ5Ų«ĄŹŌ©ŹųƬė{Mx²¦š&° łZū*Ų—ŅŒ“•ŅŽ’ĘwäłūĄ ¾Ś¤ŽžųńM?r} $>žä¹GU%^.õ§ž\\ź3ꗡjZ"¾8£ö”_ĘDAź+:æż¢ė;×?€YŠge>ć ī%ŸŽ‚†}$¦ Ó ¾^“p,6—ņ°BH˜¶čšNŒŻfW[ śS“Éųs¢į¦™Ćµč¶ *ČĘˆ‡˜ŲĒ‚L5ÉūšÄ¹&q–o`kq/ćö³ ĒV›¶Ģ?Äå^Ę ńlņõß rŸĄV—¼¦/mć»H„QNźé}«Ä„qŲ*zł6‘ųČ:HRĢd·°‘h‘ˆƒńyJō¤‚Ō¶ZZdŪźiń-µµ“„Ž0ÓŪä;×Z.`vv•<ˆK܍¹lc N¾ķ3Ń_͈®LQ:Ł˵|™3+ńĪŁ!ńŹ ¹°Ļ ylõµP›¬sĶymŅ?–qŖ|ēK?łm “P ń\ ŪjEˆKQÜdĪƒY °+ŽĪP±+…9Ž8KŸLÖÜdml7»{Ćy¶©,ČŪF¤Æés©Ņč/ƒ|Y›ĻŁ„Źéa¹Tyģ+G”TF¦ T…jPݬjŲ“Zę­SÖAj‘Ęڶ&“¬ cWźA}ä@C[SżżÓ»ĘŠšB3ÜŅ‘ŸĶ1[ؚQdżDś¾ĶõrŠ™VøÉZ¹Ö¶ŗLģŪŚZҽhIzZźĻYÖHå(Ļ«~<<Ēö¶äZ[+Ź`Kķ½©®Öl­Ń!÷Ug[›_®Ūzåx“ZōŒŃ+rIIW~ÕŖ_u…诔‡­=n2ŖnģĻ9‚žäG(_P€‚ŗßSć‹Ź  ąļ2.böFÖ5ˆsočłČƒ¾¤­2i”½”ż°ė` ‚Į {P둆!\é Ć#ˆŪH£a Œ…q0&@qŚ‘‰˜ĢI”É0æ­“6Õ&{p:3ēљxwž—xSö ’ßöˆOC‡ÄĶŲ#ŸgläŁtĀ’öp†MĘÖ]x”k˜i“]Éņ•iWĀźJXņ|}łĢźé,[zÄŽ˜›MžĢџ7žOVÖńdüÉŲ€“̳u§üŠŸ’j>q’9]_Ɗüā²d¾g²‹a‰­'am€¼‡eÆĻRģ—Łzéq•²gŲĖNuöļā…7MÕ½†Ÿ•Ų­‚<Ō™{ įkX_Ü3’/ehĻ$¢›ū”WüČs¦æ`“Æeå^d|i0t„!³Ś&« Œ]ˆÓŅ.ßĒ4DGˆZ‹Ż:XoÄXw90(ź™mšĘq#ę&Ų ’O²nLŽŹW¹[lĘy²¾vƒņ°«Ör²‡äƒ¬unĆΈ7żĀß;aģ†=¶”ś³ŪkFÆ„ķ’”3ģ'Ā$²2»)0¦Įtū:Ś‘eO%Ģ£]’øÆ§]6ÜäŁĶŠĆßš/v’ÅNNš“Iū''yˆѹÅ7ö޾œ%ńzŹ:Ķlāh¼Ł÷®ĖnõŹiūĢó“1¤ōēw¤ų•>ŠčŻyĻĻÕżo’‹ō3 ™wxÓėū.‡=£„k|g±3*n’ŽłäÅāøžšg¢gżxISˆ*…œ¼k!·–ĄRXĖa¬„UŽg m”‘ĪŻz?Sņ^Ā+nŚC™ü™ßŅ6¬ÖÓ±—÷‹/’X«FĻģ×Ā:ō®‡ °6ĮfŲ[al‡°vŁ÷yƐ4Č7AĢwéńŚOłū9v“ ųŁėwqӁ’ƒĢĮ’ƒŒœ“āKńžéK ‘r żZ~ ‹¼§ÅĶų¾q(ś}ÄE¾o¬i’Ł2žgĄ›wȋƒ<‹Vģ_:d?J¾Š»‘Ƭūń̽YÉ[‘?Ī3?N=NżY×ć.«fy æ=é?‚lFN‚‰Ģģé²F|™/Āż˜ŽHY4¾Ó5w)§ĒŃsNB$Č·b²vw ·SÄł4œ”ī§²œ¤’"ó;²m“=gŃ}ĪĆøæC$§ŃÄf+ˆK¤vÉ.m óč“>žedŒ~że®ÆŚOi×p{@_õ:ńøĮūą&ö·ą6yhōCų¶Ÿė»öHķžż“vß~R{`?£eŅĻ·$įfq<¤­ž9æŪ‰ė¬Ä5ē:&kRŁ K¾ńρ™ū!”€\¤)žsCĒ#Žķ“ øē… ž³Ģ;äćz;å\Īȏ¼‡S›,ČĄ¾ zŅÓ¾z8ÅI¾o,„ĢoRā‘‘±‚ģ›÷ķ‘FZų¶ĻńH!<É×O¼ĒŠrķįŌ'«xŠWŒū0äöYDŽU,˜oz”Ē­8śK@IJ;ŽY J㯠”u¼¤lsn×å”TĽT†*PÕńŠ|ó½#§K1o Õo(RßßŅgdM‹?5`mpMōHžÖĀæœ_Y³H;'Ļ«®ćzģŖ哾ć=}:Ś_ębdœ-ł&߈‹®fÜĖ·Ŗ šŪä;äF˜”®ćƒž^Y@žÉ·éR®.“Ę&˜r^ISņ%§^ŃCP͈OshNĮ’rÓ9;śZa† #!$²ż‰ėiȵĮ¾-“ƒöŠĮńYO»|/ĮéYR–ŚP§ŚŚ¾r]TutxT'Ē7ŹģW-:ļ™Īųé]!Āń½b/{Œųn‘øuǾfsŪņQÜų|Ėė·'ö½p—tõvh&vnüĶÆÉdöŹöAÖĆi]†K”}_ŻŽ/꾟~ļuß_æ·FŻĖœ»‡½ŒgH˜F[5¹ŗ¬Ķėf×ĶA4Zā7˜x”Č Ć#`$÷£`4Œ±0ĪįäMĄ¬Ļv¼ĆEŲģIąŗ8¦fv›¤¼‹ŪD¾÷$Lyž“ŃČßu·)øMuDGćPtĖ™ÓAčē;#ŚšéŽ`=žÓrŚū»‰ÓLGLŅå+ĖFŪ5Ė‹t0ĆŲKś¦ņ=×ldēĄ\˜‡Ÿł°ræ; Rz¶æ0ęĀ_J[½ –£o2+a¬†ß(ćğwŠī×Ā:X`#H["oxc.‡q+es“#=ż<ć,ŹĶ„±¹­˜Ū0·Ć®wbīĀ܍¹‡pöbīƒżpāvh‡”ģ—6ŽWŌaņļīņ[2Ņs”ŗ8Ę’‰’ēĢ‘S7ƒ9/CŲGæYŁKļį„<ś».¶éžę;r«“éx§N9ņ«Ół^,Æ:ćˆc:Kēšwžś”6ń×åŠŲĢ‹Ü’NÜ.Į0·ĖŲ]« {ö%LŁ·ūėČGęęMø…žŪpīĀ=dīĆx’‡{ Oą)vņMĄ3®ŸĆ ī_Ā+x oą-¼ƒ÷Žø„—ā—rdÄ%&ß^ųę[>ą’#xT<ŹWbõ ?’fĆ=žIę#>ćžÅß$ēBĖ{ßŪPŸhĒæāö ¾CIņܘ‡M —ŁLMyVńM?pććyż; Ófg<ĶāL`ņs†P_d„o€Hg9b!gdÉĮߙśbøó|­NśńÄœ{Īr&6ÅÄ=¶Ų†}('éÉūȎ~8IŃŹ9A\»!2Ń!‚ułd¦•Œ¼IF|„lœ{jōų¬°%GGrd’{ečņīłÖ7”Óś‚9Ń/Ā’Šƒ“Ä$ĪSm‰L±O¾m•4ÉŁ7±¹—xÄł%|Ł£;™ēˆē4tĘw¦4EĒ>6å%²v„CH É 9¤€”č‘:‘ =2摞ÓĒDõåR›R£7S¾“5äB‰æōdĢ•?r^f:L™»I™}AĘs™øĻ Y@ę±³bfƒģ0ˆ5€˜9!ä†< ėD²~ŌB¹Ļ ¾ļĘóq @Aā^ C( (aøĖ7`Ź.%!~®}ė[„°+ e ,”ƒņÄ]ÖÅzA®+¢«TĘķ×5²*ÜW…jPj@Mص”” O$ĻŖ.×õ >49 ø!ŗœŃ³ öM”4‡ŠäģąV˜ĖŠåū¶½5÷mšÓdOc;īŪC蝠3t®Ż ;ō€žŠ zCč żŠÕ8 Ŗ0»Į0Ä)ßĆŹŁ.5Ō®†9CŌpį”9"9» R$FĮhēZĖŌę“Ÿ”#g ÓXźR)»ļŪõ4¦qĪ4¦ńN—šćÕ$ēL5¦ sŖ3­i¦Ģ׎ą&krD=źĮtā2ƒųÉÖLL)³ņœfq=ęĄ\ā sšó0ēĆ:V 1ĮbXāLgZźō}ūĶžwgÓrü­€•Īō¦UN9—)ƒi5ażYµ‰ŌķŒ&9©I¾W_ƒŻZv£÷ņ|×q/g®ĒÜal†-°ä;÷m˜Ūa¼ęŽ÷üNīwĮnŲ{aģ‡pøI=?„)óP‡1–£p ŽĆ 8 ‘p Nėõuß­e4AĒY8ržØ¬Õœēś\Ōu2~ĘĻ%=Ye½‰ūĖĪLzūźgЊҾK»$yŸ™ö/3m[fڶL“õĘ7ĖqÉū+ų ¢õ¾źĢ‚’,ČdAĘ„®”’ŗīĘxŲ™ÕääŌQvÄénc¹éu’·ą6ń»wįÜēY>p#¾q¦|s*qa½łGN»zģĢF˜.õ„°žĀ30Ž÷ѵēĪģ“łā7‡é…3‡é%åļīÆńūŽr’Ž£ćęGųĀggNÓų ßø’żN»‹~›+‡)):Ł?MZčĮøĀ53P]”Ÿ‹ļaĮ ¾½4\Ā@ŚĖ„Œ³l\ہī rŗxĪģ±qqķvå2Eså6Ewå1¹BMĮøÅ€˜.ö‚Ć{‰{1bsāŗdF^S(~Ģ}ßūѤݖõĶ\‡@BH‰Aņ1‰Ücz8µ5©+?-S~tåGW^S2W^SrWvŌĄ®vœCø)Iēāœ æ©½zŅĻ“.»JēŹI‰Ė‰|No|ßą§;s¼ āäo°ƒRKń-hŗÄŽ«ŒųĻä’xd3eĘOWj-«KötqMÆ —Bč.„né9J{a¤Qś±²6óåŻ˜[*¬÷ ²nvČƚq½œĖłÆ9]|Ū¹q“žJ*Ŗūń­?ŹŚ¢œ[ÉäĮ¾(WĘy yšcČ#Ļxo‘y!äw…!—R¹d>Ŗ8żŒ`UżF¹,”‡-ļ9c« zĘā_¾ķ.ä*©‡]X·cs<ĘŗN8~d¾ˆ3oČū¢„įŃWĢU -„ȊRz~«pSnÅAęc pB®Œ¶KąÆ$łŽīz^łŅ[Fļ•ŠŠ_YśeŃW}²nPš.27'æwQĘT99o¢€Ä22†*ƒī"Ų[i·ŪćV–0ʹ¤wĘ.:Ü*øŹ“GroytaNÓ„*ŗ*˜āź§óVĄĪ„*¹dް¼©2Ͻ ¤¢(ļy¦UŃ÷÷¹ÄæĪ!rĪé­Ņ‰FŁØįMOOĻ_?ø¢7ć9ģ”óTķśÉĄ•p3ņ·&žŠ”§ČxLŅU†ėŚPĒU™q“œ"\Y×U—“=`¾QÖÉėq]Łŗ?Ÿ¼ŒńŖšLåŌį*ųń铹Øä|G+k7GTCņGŅŻČUŃԘ|iĀuShęMƒ¼ßš£·łŠŅU•|õµ‡ÕŠ] ŻÕŠķ{žĢŸųW'ĶÕL­\F?µ5žŚ «-“·×ąy‹ū”°oēŖI»ī“5ÖéŚc/ļ_YŸm\W-=œVŲw9+UĪl åtYC—1Ōɕ˜ēL?DüÓ¾v!Īķµ:œH\‡8ÖŃó¬+銀näWaŚņDzcn?=¢āh¬‡šS›bć.qč‰{/ńMoLYG–pś€Ō£­¼§dŪ—ū~ŠĄ@ƒa …a0œ8Œp ¦R#]uéļŚÕ(Wø ĆčóŒqÕ3uÅē”ųjęx˜€æ‰0 &Ć˜ Ó`:qœ9fōar³±ŸsaĢĒmœäŗūE\/ó-į~),yļ/'’VĄJīW!#gƒ®Ęüū5°Ö5Y­#ė]F_}nan›1·`nÅÜŪaģ„]°Ū5„oĘ%ķr„œó˜GķĮ~/~Ŗ“ĒūøŽ@ά—z}ė#ĢĀ<,×Čfć=}”ėc\Ėé'Jēqā,ļłpūZj(󖾰|a2NĖžłū4²×…¼A_$Č<Āģˆyó œc_ŒŃž¼ tčs“£ K¾ó;ēj@YUģŃü¹Ēó<ń¹ą Ō~ž;.óŽ< XŃiü^‰ģ mHßOę°™~§½¼„¾?Hƒ“µ²SÖŚ/»dægÖ'YW„+ø_…kpŻÕŲtƕ_Ż„[č½MŲwą.n£9<ž„±éö÷]M©;bĒŲūZ3ź‰]=DöȘö1öOą)÷Ļ »ēÜæ€—š ^ĆĀ”qń[®ßĮ{ų ‡'ń&LP ķ“©q’%'óģCAž3z¾`’p/iž†łūö¤óq(C†ī•ęę­ēfŽŃmĢ÷Ė,ū.õw‰7łż› N7w€#ģ&&?ÜüAdæ [Ā5¾E¤·‰żgWKSŻ/{,'0l˜vp€\ą†hø­åżėÜŅGÅ0Äą>&Č7u¼ŸbaŁ8—ėX¦V“ūFśāqūī&¦Ģ„cæŃqŅܚ2%ņF¾$Į-©»©)™» ómH_oś ™“¼ß’»é+¹[›R"kÄ«­.“ŹŻŽOZŚį§÷RŒz#ėń©‘Mi!»=Ļ“=rķ‘ć,Qģ|ū<<œī.sRö2Ī ޟ OęŚ2!ēįŌy§jiŹģnfŹ‚żĻø“2e%]-LŁ°ĻŽlČénkJ`ķ`ŹåīhŹŹ©ńģ'%L9³µ9\åvKūāC±ą–rÄwmĢqI=%y!ä‡P½Ņ†„ }…ø. ?ćĻųŻGEūb ķ[ł^J@I‡RPŹ@Y(å”T„JP’²ēš1Æ‚ĪŖPͽ‰§µQUwKūęR5ˆSMš­ė×roę—Ā|īŅž•ä÷ Œ8×F篿‘!msģźB=ØļĪ«@Cō5‚žäCcL©³Mpo Ķ ¹;9k¾w5ūhˆgKh¾µ £OŲYž­±ę퇓! mŃŃŚ»»čõŖ×­ˆc'Čū©ÄŖ#ņ2Nģ„{gwg“ŪAي "x~F’„ zŗ"įīŹ˜Mdŗšŗ¹å”’nČuCNVUx’"#gÆHŸ'‚_ ĒŽ{wÜåYó½ å„§;ĀŌ =½‰‡¬fgŻ£śõĆoS‹ž½”W²CÕ®śéńäģžY†_anRÆ6ŅÖvŸ!,»ā¶«”øIŁIł‘<Ężp<–1øŒkG9×q$ę( c`,Œƒ0~*!%c¼;DMšźó…7wŃ5 s2L©0 ¦Ć ˜ ³`6́¹0ęĆX‹`1,„° –’īäaņ°‡7²µ’x¬Ł7øš“’k`-„P×āšzšÖ¹{ń|{į·~eĮ·óųIÆ0Źv© ČŹ8f#¦œ ŗ‰07ĆžŃV·üJCoüöŽ WĘ_˜7‘²ŸŻ*æąŠŪōžß(ŁęīKi’k™Ó6Ü=ŖķĪÆvōнƒ°<ŖæW^üŅ—€]7ģE~ }Ėæź2Ü~Õ9ˆ“ŠŒģuųUÆür„ĻŽ?_˜¢{eżæÜÕ?ō—8iÜķęµóée-Į=üéš„{·{õOĀb¾Fχ‘Q÷ņžōšKFčې'2®,ØŪŽ²;éóķӟŁoŚčcyåå;fq“¹®0~ ĆHū¹‹ ’€ŸńQ÷õū Q÷Fü&FŻĖ|¼‡_Ō0ōłqˆ8ˆžĆpŽŗ'GÅŪ7ī2ꄦxóœž8eźžŽƒ¬ŸĄ< ‘zųS£üŸĀī4œŃķ{š2Dµ‡’lcÆ07sŁsČJ?y$~įwøĄeģÆP'®Ā5ø7ą&ÜĀķ6ÜAī.÷2_mü“Ō!ĪUĆī><€‡š#ß%@ę=å›{擨KOįļ÷>|k+mž-‹†“}Ö"ūģY•rŸ_z7ˤŅ&½›Iż“{AœŸ£)Æ§Ģš–ĮmwémÅ ž~;_ņßöBóLż½ØrLo@j}4WŸŽĢ’‰…†īČ] ¼#Y?PސxžŚL`ū}÷/+³Õ^č ļūźƒĶžFŪņȒ –®ińµ…ń•×%% )7ī›É…'SVfk“ō5ŗŌoŽž„ģ'r!ū›$_c×-=¶śĄ' p2Óėy5ŗ0 T Hü_Š   µ=žķ“}ÕD® ¼`‚1oMūAŁIĀuĮž@E}üß9bWĶænxįD–É^vĮµmūBˆ„š5ÜńtOE‡o6ĖʖA˜JīĮŃwŠ'+Č1ōÓźŚ.I‰°1%bT܀ˆČPv„p «(ķFķ½‡¼Ŗź ņŸ®Œp² Ķ6§ZĆÆæ®ĖØE<ńIEND®B`‚qjackctl-0.4.2/src/images/PaxHeaders.14935/mporti.png0000644000000000000000000000013212700760152017127 xustar0030 mtime=1459871850.611904288 30 atime=1459871850.611904288 30 ctime=1459871850.611904288 qjackctl-0.4.2/src/images/mporti.png0000644000175000001440000000032412700760152017672 0ustar00rncbcusers00000000000000‰PNG  IHDR(-S6PLTE222:::???LLLfffhhh}}}ŽŽŽ˜˜˜„„„©©©ŌŌŌ’’’Q :±tRNS@ęŲfLIDATxŚmĪA€ ĄbU“*’VšŌTrܙd"ņĖf0Y2’zPd»Yv–^`Į'~gZK®”ÄJÅłgUśwń±Ź$/Yå$<ŚIEND®B`‚qjackctl-0.4.2/src/images/PaxHeaders.14935/add1.png0000644000000000000000000000013212700760152016426 xustar0030 mtime=1459871850.609903288 30 atime=1459871850.609903288 30 ctime=1459871850.609903288 qjackctl-0.4.2/src/images/add1.png0000644000175000001440000000027512700760152017176 0ustar00rncbcusers00000000000000‰PNG  IHDRó’asRGB®ĪéwIDAT8Ėc`hĄˆSę Ć8ū,C:vµLx?‹„źI7€ĄD½0@ö3ÜŁ`Œ& ¼špÉ!¤‘b/°`„86'ćqˆŸź‘¤®é,Ć,†ü@@#›†FŖG# ĮTH¶čaB+ 0öU“‚ŌIEND®B`‚qjackctl-0.4.2/src/images/PaxHeaders.14935/socket1.png0000644000000000000000000000013212700760152017166 xustar0030 mtime=1459871850.615906288 30 atime=1459871850.615906288 30 ctime=1459871850.615906288 qjackctl-0.4.2/src/images/socket1.png0000644000175000001440000000363212700760152017736 0ustar00rncbcusers00000000000000‰PNG  IHDR szzōbKGD’’’ ½§“ pHYs  ’ł„tIMEÓ   Ī='IDATxœÅ—Ķo\WĄ÷¾™7öŲ3'¶k»ĘIź4‰K>7@³®hɂ.`’A³gtQbA!”°d BŅ:M𤄠v<¶Ēž™7oŽ{÷“ÅäÓIÄDq„««{tß»æ{ιēÜ’ē&\üå7ĻēœēĄūŃčīĻ{whŻ3äĄåė­Ė—.] <t.–¼ķDH ¼šBāœ|ÄaĆX‹1g Ž{`€ö Ų§śņ£“Ēœż`¶qt6DŁēB¼•X#p>ÄÉk,Ī:“5hc°Ś`ŒF Ņ “ T ĢH =čõ׮fl].<Ą:Ƙ¹#Ɯ (Š£” ū€Œ!ˆ±ĘŽ6µZ#PFɂ8,0.DI©`XĄOŗ ƒĘ9ė9÷Lē@ŹebŹ"`Ɲpé÷°žź4_x1Įś ¢x­5Ö:¬µXg°^ć¼GŪ]°KöłŁĻ‡œ>%x鄧ČśĪįö€ Ęłkžp)ąņAČ&ĒV_@ ¢Z‹Čz¬s#3‹6–¢0ඈ«wy÷ŸńŽ{]¾żzÄŹ2hż€ųO"Āūˆ²”¬æŚ š_H÷‡”źc®¢“c— Ö)d ‘Ņ„Žę4¬­y¾÷żć¬,u»hóŠæķ’$„Xe’ć«MNž\e8Ф·°Ż]ŅN‡ī `³7¤ē3“Ļ©MēL&C¦¦›(½Ąź±&§Ļ,³½ż ķv„=Ö G ‘AL$t÷=“ŌŅ}f&$•Ę‹ųćÓ;¤ļ ŗy“ČQ:ćīV—żNI?½Éd}‰F³A6“DŃ$RŽ®®÷ci@"DNāT€źöI&%h™dķ4¢Ö&ØÜ`1*Į¦ ösŚķ=N¬µųóŸžĮ•–+„Õ8āŹ$R–8WŽē„΁7ļ%ʤč^F„1O²vŠšČ:¶ѹņt‡vŚe·? 6U²r"äõ7NQśY†³Ú ų)ŒńćßēĄzšNPä=²ƒPK sG 9Śż ä.¹ŚB f°Z‰¤=Žh­(µ¢TQ”Ól Į€żż–VC†:¦…k]Ą1§Ģ xłģė_š ėuIźŃēŁx‹«7v±¬#£—)ˌŅhŒŲ±üØĖ@S‰ū4§§˜žŖÓŽiē;”yÉŻķü³Th­8’h…ÜŻ&œ0HY§V[Ęėi’É ¬N©M§ śĻ”e@JC$KęiĪ̳quŸĶ­”ƒōi¹ĒĪ“w ®Ādģ(ż.ĘĮéW ­“$“-ffZhwĄöķ !*8'Ēp£ū[hI=Žćw=óó†^X!ŽēØM–ĢĢxV–-A(˜ˆÉō&F[ęźLVź,Ķõ¹xéSÓ=“’Ø{Įh¬8 4-łńOüę·]~ųƒUŽśĪ1ĀøN}j ē<Ā <‚0äŹ”µĒ™>B¦üśwŸrńāg|ł‹!§Ö$Ę”{óD^\ ŽĻS±‹ļ¾~:‡üĀķ&"bŠiW^¬”ĀŖ€÷Z;Ƭ¼¼ü†W·ģ±ŠøĻ_RA^^ßńĶ‹6,~µœxr½˜¼¼‚‚¾Ó†W›1½j™w’~­ X>¶žĶ-“ІŠū}×ņååņ½}/#[a™ém’śéņƍŪäõŠē_śpś^8B…eĀÓ§k—?ŗ}`į¾ĪoNÅŪ^~’sžJ’‚›ŸŽoß~vŁŌyūR޾­øūż×Æ?gÖ¤#09»°vQOCŁ„UŽ—~ŻJ’ł¹3/®€Ł3ŌL7311¦}»ł¶_Ļ‚ĄFoVø  __Oߚµ@—¾|łöķŪŃYyģ7lݳĢĒĀŚÖ6w”Ēџ[.=łńół{³ Öß~j§ībå3/åłóŠm/Ż}~šŻ¤€Pih°į1²²ņķļü6%¶bʶm—v¾›…Rür–,.Öķ³¶Ķ.Ž­ØX¼eŅ›rŒŲā¶2ØYõü`EqlqE_Śõ Ģčä7«i}piKqllq±ė m,éA:tŚ–K[¦WĆ8ŗ†cMūŗ5“ļÜÖ\«hɄMsčÜmGī į×ņĮž{fś]ڲ„CQBĖ{²ęŠ›kŽW”ČĶW‰+ūL‹ćįęę šĘ•µŽ“čéÖvįĪæŒróī_ĶĒ›æŁX9ņĪ•éēŹ+žĮIEND®B`‚qjackctl-0.4.2/src/images/PaxHeaders.14935/aportlti_64x64.png0000644000000000000000000000013212700760152020326 xustar0030 mtime=1459871850.609903288 30 atime=1459871850.609903288 30 ctime=1459871850.609903288 qjackctl-0.4.2/src/images/aportlti_64x64.png0000644000175000001440000000516512700760152021101 0ustar00rncbcusers00000000000000‰PNG  IHDR@@·ģ÷PLTE‡“” &% $" *, '($#././ -*"$"3302*)))77 46100079+-+==A@(2375231BBGF?@#==EENL685DE5:< LK:;9USKLPO+FH$JK?@> PP9GG)OQce/PL2NO\Z%UUCHJ-SUgiHIG![Zkl*ZZ2XZLNKcamogjPQOITU0__>ZZvv8^`$igqrTVS;ac5dd/hg(lj;jj^\`\^[(tv[`b€€b^]2us@ooPhi`b_:rq^ceafh7zxEtt?wv……fheTpq#‰‰C|zJyyokmlmk?‚2‡‰Sz{H€O~~*ŽŽ[z|qrpL„ƒfyxSƒƒHŠˆvwt\ƒ„3••Q‰ˆLŽ e„†z|yx}[ŠŠj…ƒ:›š}|Xƒ~}R”‘r†…`O—šƒ€hސ7„¤…ƒ‡]•”B””sŽŒŠ…„ƒˆ‹yŒ†ˆ…`™—V ˆŠ‡?«Ŗi™™R¤„ŒŒŽ‹r™›`¢ŸE°ÆV©ŖoŸŸ|𛑓[­®s££‘–˜T²±d¬®–˜•M·¶›—˜a³“„¤§i±³›š|ŖŖ\¹¹fø¹ ¢Ÿa¾¾YĀĄˆ°±k½¾„““¦Ø„gÄÄŖ¬©cĖɋ»»mÉÉuĒȔ¼¾°²®qĪĶÆ“¶“¶³oÖŌ•ĘĘxŌŌŃŅøŗ·æ¹øtÜŁ½¼Ą ÉŹ½æ¼€ÜŪžĻϤĶĪyįßĆÅĮ~åć…āį„ÖÖĒÉĘÅŹĶŠęå®×ŲŹĢɄėé¬ŻŻ“ÜŽŠŅϊńļ“šļ²äćŌÖÓøāćŽõóŚÖŲ¶ēēŁŪŲ¹źź”ūłŪąćŽąŻ˜’żåąŽāäįēéęģīėńóļōöóż÷öłūų÷ż’ż’üg*†ītRNS@ęŲf,IDATxŚÕ—aTWĒA¤ km»€JĶ*ķB;ÄČ@µY”ZĆm³q-ˆ$¢”6±-±P ˜Š”%E«¢€H• ŠbTrÖø8.e7DCķšų|ŸurN)Ņm±;œ„ÓIÜ|xėņß]¦Ż'¦ŹūG0 °×Ėģ¬ŲĖī ˆĒ|ķˆżAæÓ”ÆoÆ?ä²1JL£££ć×T'Ū€żXUUQź ®ŽÅlœ$2;éżEÄņĖę»ųžŠ“³8­©¶źĖ/‹öļOŗ}fĖFÅqń7擠ēr“Y§]ü>ʈd¼Ešsrr²ŽŗÖD—ė8I9/^o''&nqu¾Ģ…6S’HĶś8+ƒ„E µ¶Ņ£K»Nԟ į s¹\–Ÿ Ą,#fP—ożEŪ¶F`-WčŃŅ>§£qjjź9xˆ)DZėčŃĆŪ]ąM0»<<ımóę­[W 4©čŃ2½ÓłmrņŁ3;ųŁķĻ?»~¹~«Ö.™ļßĻHŻĄ€įČl"tŖó[āe#NBŖ×[,›Ķ6iŸ“—<ŗ×.p€ś'€R’× ŽMė³Įę|Īé@µzżČ‹Ķb›<1fčĶ÷v8€i ‹ŹīM0#ņJ[ —­¶(ÆAŻŃ­Eūśō–'–ÖįG….’ ):R©ėcccÉ"OiÄJ8¾āĖäČOj€čīÓė[Ę\—€ÓĒjkkė> |ޱqG4…āoŸ8ńŸš„r¤Q}SŪŻżOķ9Š“\ŸńŠŖr-õ÷_>MŲyµ !œ ŸĶÉ‚Ø;P¤Żj~ČrŻ%Tüž›fĻž ģ0üžÕĢ6&ś\^šĶꋤß*A~穹ż„Sō«NÆ% m™:å]TŻPĶĖŽ‘.’U#²ćŗŃx<ķ•MuÖZA䏻±ÆGP-ņ½”ĒcgóJe ˆ?Ÿ½g>”ųź¶>¬DxS†¦ÄŅ×­FR~6;'Uȕļ”_žłPØ‹?̈Ø*Ŗ+“čŃ‘ń„œO²ł"Ł7o źļz»s“Įq­+Ø»ūoT«nPJ…|›Ē±cö–-tėx†"ąøc™:łcķhlPH…Ł;Ųé|ZbŚĮ”<÷ĪwIdTU*¶k¤„€(eR^śß8é!1){¶§ø9`œ~£hg›ķėÖ"?}ÆųJÄK缓“+o»#Žä/Eā= ŲOBgYųŖõŖq{Ź‚ØE©Ų;’5ŅP-/~4ÅŖ˜uīiPNlWqzz—¬Bu©4,˜ŗzuūSš”õ¹n‰¬(åł/]¬ņdÖ„d%a…” !uØ/*J,¦R¹ū<@0\§ E“ZD-_²0`ńҐ.?Ęõ… żē)ó™B^ōļ‚ƒ‹‹=»0Hābėz2)‹(ą \¼^ēY`7m‹Ņaɤ(ėzøßż‚ąT Ėó§P(swcŖÜ—Ē`żšŒ„„¼Nģ¶Æ× Y€a===Ų•9^3’dįźfpsÕ°fz÷%»ķœߙے—ž ˜e°ĪфNIIEND®B`‚qjackctl-0.4.2/src/images/PaxHeaders.14935/xstopped1.png0000644000000000000000000000013212700760152017544 xustar0030 mtime=1459871850.615906288 30 atime=1459871850.615906288 30 ctime=1459871850.615906288 qjackctl-0.4.2/src/images/xstopped1.png0000644000175000001440000000050312700760152020306 0ustar00rncbcusers00000000000000‰PNG  IHDRÄ“l; IDATxŚķ“1jĆ@EĢVŪøŻRw˜F'Šœ“¶é¦Ń!”+ęjö)·2ø»AiäÄ(Ö§Ņ«v‡Ļģš÷°²²ņ’¼,ī½1såœŪ†.ŖŚ{ļ÷>zĮZ[‰Čcœn‰1N"2Zk«Gś"2N "#€ā.+ˆØ†agŒ?~‰čp@J eY¾{ļ_s"3Wʘļ¢?šĪgc ˜¹ņŽgM¼af8ē¶9ā\lœs!\rĹ:0!Øjß4ĶījŻXq%„Uķ³ć@DOI@Dž“ck-Däŗy]]×ē¶m?ėŗ>Qw÷¤Ė•ž£‡łC”ŖČ×’/‡±Čž„*‡IEND®B`‚qjackctl-0.4.2/src/images/PaxHeaders.14935/aportlto.png0000644000000000000000000000013212700760152017461 xustar0030 mtime=1459871850.610903788 30 atime=1459871850.610903788 30 ctime=1459871850.610903788 qjackctl-0.4.2/src/images/aportlto.png0000644000175000001440000000043012700760152020222 0ustar00rncbcusers00000000000000‰PNG  IHDR(-STPLTE@@000542@@@0PPPPPUTRhh```jhd€€€€€Šˆ„Ÿœ–   €²²ŗŗŖØ¤æ¼¶™ĢĢĄĄĄŠŠŠ¬āā’’’’’ łČ¶tRNS@ęŲfrIDATxŚ]ŽŪ€ DµĢ MÉ Żž’?«ŃЧŻ,ńVt®¬’Ė+¶ Ä<£=˜0š°uZĄ|0žłAzĮē? ÷A‚‘H©‚«{ķćBŖ¾hū;Ø©@—ų¤TozŻšĻłH#|āno}ż(Ž™,”ųIEND®B`‚qjackctl-0.4.2/src/images/PaxHeaders.14935/reset1.png0000644000000000000000000000013212700760152017020 xustar0030 mtime=1459871850.615906288 30 atime=1459871850.615906288 30 ctime=1459871850.615906288 qjackctl-0.4.2/src/images/reset1.png0000644000175000001440000000107012700760152017562 0ustar00rncbcusers00000000000000‰PNG  IHDRó’a’IDATxŚ­“=hSa†Ÿ/ÉMbn…+•ž˜Ō VS’‚Õ„ŲAD須ąÖ”ˆC)]…Rl†‚ą&(ŻD”“’Ęj38Ų „E„6“1ÕÖōę&·ł»7Ÿƒ±1Eг¾¼‡ó¾žqD3Įœ¤UlŃkéTÓyŽwϲõW9Ę+Ćt~‡Ż@T-p+X- /“ · $šä7ōOÜOncg@Ŗ„iȐ%ąŸ‚¹d0zm™™†Uj# hƒ˜O ‡|¬ł G¶ˆŹł)?ó±02”:ŚĪ` :Ä«¹ņ’Už½zŸŠėiˆX¢y/ČĄ`0‡éŅrœ]6 ”•Ś X4({Œ{8ģäŌ'į:@h„“""U¦œ5yŽ,™sI’>_[lˆ6…Óu@±€­TE`Åżr·Ł)[J5Ö+BĄI"*Ē›™­›“’ĪĻČTX«z¬‹.Äx“ŻīśĶ<Yī¦ ˆ×:ŪŗÅ\°²Ė­ŠDöŖ\|ęÉę…_IXtˆ%„7øü2ó9f€lC‘¢~&B*рŃ„Rs©|Ą†°*×5ģ±xų…Ł·®»Ŗ²øŚŹ•w‚n‚‡`Jج‚N>žćĮz™©ŸężžÉÕī¤ßė æTCłVåcĪ"dųßócå¼/tė$TIEND®B`‚qjackctl-0.4.2/src/images/PaxHeaders.14935/backward1.png0000644000000000000000000000013212700760152017454 xustar0030 mtime=1459871850.610903788 30 atime=1459871850.610903788 30 ctime=1459871850.610903788 qjackctl-0.4.2/src/images/backward1.png0000644000175000001440000000041012700760152020213 0ustar00rncbcusers00000000000000‰PNG  IHDRó’asRGB®ĪébKGD’’’ ½§“ pHYs  šœtIMEŚ(%ÅJLʈIDAT8˵“Ė€ DZ²¬&Ō¤ÕąŻŌćü9īdd ĄÆE"Véé±kf˜ yzģšočń‹¹č&fyI1”'Ą óxi>ó¬ę%˜ŗ?BĶ HJ£w3°!rQĻųb,’jŽsHÄYeļÄėLTMõÓ$O7(Õ¼Xś%ŅoŻN’wÜIEND®B`‚qjackctl-0.4.2/src/images/PaxHeaders.14935/messagesstatus1.png0000644000000000000000000000013212700760152020751 xustar0030 mtime=1459871850.611904288 30 atime=1459871850.611904288 30 ctime=1459871850.611904288 qjackctl-0.4.2/src/images/messagesstatus1.png0000644000175000001440000000135012700760152021514 0ustar00rncbcusers00000000000000‰PNG  IHDRó’asRGB®Īé¢IDAT8ĖRKHTa=÷ægōŽitD ó•Øƒ`XIųźa%•.ŠDQŠ¢ÉUˌZ“‘ •(Õ¢øTŃĄB°‚T mRńU:£9źĢܙŃ{ēĪ¹ 5č%ŁY~ßw¾×9Ą*›&:²N=yŒ]‚@ķ *菁z#F®`wӀsŒPĘ=“ŚŖ‡“‰É’C9zū͉įHŌBK+Ÿķ•·8Ļ( _Éõ˜š 鹌vžLH1ķ8ÕdĶa“Ļ bÖ'Nńė‚®ś`č^D`”»oičv+į†3Il$䍞Āgņ/tŻÄ¢Bjčvn+† ū5¤“˜¬ł‰˃Ż'ī9{Õ/‚!œJ€a6WbćLoų„$˜“ŹóĻÕdwĖśņ[(k#O’j¤mödœN±ååŒŻńP¼*TŸS>ßņ ¹§”jąģĆŽŃ½EŅę0p3}ߊUߦŗœź‹ŖFŒÅ¾#¹ŖłH©C_g6'~é· źŽĆ? ųgõMŠ7¬ĖCˆé”‰¹WŪaU”ź$£ü®UWX2?xCÄō?[šRØ~ē¢&OT’–Ė­éH+}DĮ°vü)["¼tę_ėæģĘ"kiœ‡ČIEND®B`‚qjackctl-0.4.2/src/images/PaxHeaders.14935/expandall1.png0000644000000000000000000000013212700760152017646 xustar0030 mtime=1459871850.611904288 30 atime=1459871850.611904288 30 ctime=1459871850.611904288 qjackctl-0.4.2/src/images/expandall1.png0000644000175000001440000000107212700760152020412 0ustar00rncbcusers00000000000000‰PNG  IHDRó’asRGB®ĪéōIDAT8ĖŒMH”Q†Ÿ{ļ|Ž‹6š„ōCQPIah›ŒÜŌ27Ѷ˜D“Õu Z­"ŅĶÖ¢ĀҘ!I¢r²&›œę's>gę»ßi1&–m‚ŽķyĻĖłyė)*РЀ'°B§#ü+©u«¾4c% ąįš‰9ŚÕ‹Ÿ–Ąš¦gbhQ–¬t0čŽf:^ƒo-Zbų<; Īi(ĶžJ@ŌW䔦YYD¶p—Fļ×0v3ŒcŠĒ “ĆŅ|JĒ€y ·ŠØ°Lp‰šv†śBä_>"@”²²²€»z…Ær—Z,Œ»yu9yÄåTO’–sA4A,_HŅŖ^­>āSŁJ89DźŪ!P°X€\f™ĶµćD¤b5¤>ƾ|–ōä8m½^yŸ÷nÜ!ɳ””Žżgö’~SāńČ$:`1²O™n*KfŖxĶ“Žt¹ŠŖŠ@?ŖŲŻ6ČĘ]ūP^˜XčVå6ŗ2µÜŸ98~å( Ē(}_¢©ŗ‡ó'fHDpȒ”“ē¼Wö÷]³šž>ף“§›śz(…҆L"ÅĆ«]¼ Ó~­°¤ŲH™ó|üS»pϳ(ŒCq!Gb¼ØćĮÅ9õŌ«@ æ|nųPać?ėaĆ/—uūøIEND®B`‚qjackctl-0.4.2/src/images/PaxHeaders.14935/aclienti.png0000644000000000000000000000013212700760152017405 xustar0030 mtime=1459871850.609903288 30 atime=1459871850.609903288 30 ctime=1459871850.609903288 qjackctl-0.4.2/src/images/aclienti.png0000644000175000001440000000025212700760152020150 0ustar00rncbcusers00000000000000‰PNG  IHDRķŻāRPLTEpH€€€€’ĄĄĄ’’’«ä~™tRNS@ęŲfCIDATxŚc`€%PcPq C Œ°°0 ®& @ 3(#99-Ę033«13K«ɤ!é‚Ū•pW Ü[Õ|IEND®B`‚qjackctl-0.4.2/src/images/PaxHeaders.14935/aportlni.png0000644000000000000000000000013212700760152017445 xustar0030 mtime=1459871850.609903288 30 atime=1459871850.609903288 30 ctime=1459871850.609903288 qjackctl-0.4.2/src/images/aportlni.png0000644000175000001440000000025512700760152020213 0ustar00rncbcusers00000000000000‰PNG  IHDRķŻāRPLTEpH€€€€€ĄĄĄ’’’’’6tRNS@ęŲfFIDATxŚcHb€e(ƒ)) ŹTŹ&:ŗA„E Bj‚j!¦Ä„ĀÄŌdØjaP3•R`b0{B0G0«9I o09˜IEND®B`‚qjackctl-0.4.2/src/images/PaxHeaders.14935/aportlno_32x32.png0000644000000000000000000000013212700760152020314 xustar0030 mtime=1459871850.609903288 30 atime=1459871850.609903288 30 ctime=1459871850.609903288 qjackctl-0.4.2/src/images/aportlno_32x32.png0000644000175000001440000000151612700760152021063 0ustar00rncbcusers00000000000000‰PNG  IHDR D¤ŠĘŻPLTE­­­     "'.&!!!!"""'"###-$ $$$,% .& &&&((()))*****+,,,2, ---9-...///00(000111:8333444666:63999;;;==5BBBDDDFFFIIILLLULbHJL9;›0—4|=‹<›8VOI9ƒF ŽD]RHVUMTUSH){O–EY[GhUG[ZR›I^_L¦GtYHq^J}\GˆZCghU«U ‡_I‹dPqpW‘bKÆ\Æ` ®Z.ŽeL™h‚t&°f'wxd“h“~‘q`”y/€}^žŽƒ¶k3hµlF·q0 †±x¼t¦†·r=¹w%•|oƒƒ}†ƒu•Ž˜Š4Ÿˆ5‰Šu°Ž“…€ž‡~“qĄ~`“’x°™ ƒ]ؚ,˜•u®›ʉBø£’‡Įœšyœ—•ÅŸ˜œŒ›œ‡Ą” Ė—7Į§Ę‘s©š•Ėœ1ĻØ»Ø8¾¬$اŒ«Ø‡¦Ø„ׯ¬­…Ó©8ПxŌ§R¬®ŸÓ„qĻ¢Ł¶°±›³±–Ҥ‰Ž»'ÜæÖ²tŌ½Bŗ¹¤Ü»?įĀø»«×²‡ą¾5ŽĀ7ÖĒ8Ų³”¾æ©ßÄAڵ£åÉįĒMęĖ+Ę“ۻ”ĮÅ“ÉșęŹHäĖXęĻ?ŹÉ­ČɳčÕ(ĢĶ£ĶÉ»ēĢgĢĖĀźŃeāĘ·ÓŅ¢ŅŅ©ė×JźŁBÓĻĮźÖ]ŃŌ°ļį*ÓÖ²ÓŅÉé×}ź×‰ŁŁÆŻŪ«ŚŁ¾ŻŁ¶ńćKļŽoļŽvŚŻ¹ŚŁŠīŽ—ŚÜŁóģ@é×ĢīŁ“āŽ¼ņęfąį·ÜßĻīߟįäĄóę‡óč~åćĒņåŖįäąźęĆėéĶóēĘó掳ķéźŚõķŖźėŌłš’ōė¼õēŌöš¦óčŪ÷īµ÷īæżśsńģęļšŁõķåīņį÷šŪöņćõōėūöÓų÷īż÷öłūų†rŃotRNS@ęŲfśIDATxŚc` 8Y”Kppp‚Č;üžóēüųžżūׯŸAą%<~ōȬ(’åņåĖĮĮ;v¬yó¦Ļ;}ś Č «?źņ««Ū Ņ#Ż­­ÕĕÄÅ%EDųx\OŸ‘)ųõ0’éļ§W÷,›ŚZėg¬o`` ©¢"+ÉsįØXĮå¶/æŸ~ū¹¦@ß@SCQVVœ÷ōQ° æ/·=żōåēūkS'–ʧ…˜zhjõ‹q> 2Įņ×Åź«Wß}xš~ę³ń ~ķgÓ4€ˆ pšėrĮž=OÜ~ūv÷ŻŲ°}+4T$ÅŅų8Ϝøįbś²eÆ/8’lӹʰ ³ė—vI ńń²> VšćbÄŌ©/NœŲ¹iõęs‡ĪöÕ7UUdk šr³ķŪ¶āĒ1ß)sīŚ}hćę5Æ™ÖŌT’˜˜¬#Čuf;Ų‘?޹•ŽŻ½iŒYK>^Ł_S’¬ÅĻÉŗļ°(ŲǬććĻÆX±xÖ“5ŚēÖ¤”•ekńps²1ļŪvĆ÷cÖ;gĶŚ|£ļ€§yRWJ™4/7';«š¾ķ`7ģRsvž4«ļģüg5ĢĶ;#łų€°²ˆ¬ų~LÄŲ8mUßFÓ¹iFzf9Ņ y6f™}`GZ}Ż%nljŗ’@²¾¦†²žŗŠ6VfaĘķ¾××7k6ÖŌPQŌÓāį:€YX†q/Ų –ŸoIkčƒćX äv6ff™›PžÆ tō ōvsqsqq±···°°0ńŲŗw8U:“<ŗīܼyźę©“'÷īu€¤ŚÉ Nž<}ś¼3ęńŒī ,,//,ŒCIüņ/ŪµvrCn؇.–Üaõē××ēĻļo™×]ēƁ!‘‘±k×®õk×/_8}zwc\ØŖ|ęĖū@pįō…3GOĮŽķż…( D`Ą tĘč[€cĄ§¢ĄøIEND®B`‚qjackctl-0.4.2/src/images/PaxHeaders.14935/forward1.png0000644000000000000000000000013212700760152017342 xustar0030 mtime=1459871850.611904288 30 atime=1459871850.611904288 30 ctime=1459871850.611904288 qjackctl-0.4.2/src/images/forward1.png0000644000175000001440000000041012700760152020101 0ustar00rncbcusers00000000000000‰PNG  IHDRó’asRGB®ĪébKGD’’’ ½§“ pHYs  šœtIMEŚ!4~8×qˆIDAT8Ė­“Ń ƒ0C_o%Ó$3Į4åŸĢt| møĖUԟ–mYēž‚aU²j˜æ@vįµŅˆ-¾ 8`‰qÅóÜ ‘Ū^§ø¼ØÕ ó:Įq× „Hwāż‰œoł~ŹHÖwӀ2‹<1ū+Ģö;ųy¼<1~&Rˆ7~äŲ*1s³VņŹ[IEND®B`‚qjackctl-0.4.2/src/images/PaxHeaders.14935/aportpti_64x64.png0000644000000000000000000000013212700760152020332 xustar0030 mtime=1459871850.610903788 30 atime=1459871850.610903788 30 ctime=1459871850.610903788 qjackctl-0.4.2/src/images/aportpti_64x64.png0000644000175000001440000000476412700760152021111 0ustar00rncbcusers00000000000000‰PNG  IHDR@@·ģ÷PLTE\]Z  #! &%$%$%!'')*(+,),../,,-,&+-*12-/4434 66343323"23155.564=<;<?=;<;: 897><0?@EC>ADCCC=?cecmm%ihLkm/or lk;fhepn8qp?twkljokmrpTwv-npmuuJvx:xvEvx@|~vxR€sur{xYvwuxye|}E~Az{g€~M<…†y{x‚ƒDU„Kˆ…4‚_}|ŒŒ"†ƒc…ˆOˆ‰J‚„††mƒ†w&ŒŒGЉ]ŒŠX†ˆ†ŽaVQ•’@––-‰Œ‰Žy“^Žt”“M–—9Ž–—Xœ3••p–“…›šTš™l”–“žW¤£:££Ežœy””a¤¢U” r›œ™¦©T¬ŖAŖ§ZŸ”ž«©bج]¤§ƒ±ÆF£„¢«Ŗ|®Æa°Æh§©¦²“_·µL±°‚«­Ŗ®±Ž·øZ·¹cøøn°²Æ¹øŠæ¾[¼¾hĆĄV“¶¹µ·“½Ąp½¾•ÄÄg»½ŗĀĮ’ĒČq¾¾ĮĶŹ_ĖŹfĄĀæĢĢoĢŹ›ÅĒÄŃŠsŹĖ”ŃŅ{×ÕpÉĢÉÕŌ¤ŁŁ€ŻŪvŠŅĻÕÖ¬āą{ŚŪ±ÖŲÕ߯­ÜŲŲęä~åä…ćā²Ūąćķź„ßįŽģź‹ēåµēāąģź¹åēäōņ“čźē÷ōŽķļģžū”ü’—ņōń÷ųõłüłż’üRV}tRNS@ęŲf«IDATxŚÕ—iTWĒYQ¬Q jŖUGJÅŗUT\«,JķˆlV$š£xDŽsĄˆKM-Čöø ZQHĮ-Ó*PÄq©Žˆ‚¤Ģ” h!;ś&”ŚcMų֛œ|ū’ņæ÷½wß}vv’‹€śu -t€śØY­Či&IRµuZŸō3 EmšŅ“*RéŌżƒ¢‚T†Ī—ģ[+ŖÆu°Yļ k.$ONZ#’.½ŗ½¢ÜÖ, ‹“„,™²R$9^śsƁŖ56Vņ#£¢ö‘gpx”hĻ‘Ņš§Ōöś¶øGļ%§OžÅ:Øi”ZR¤6Yp7(”xLöv’`äüÜҚēuµÜɶ ģ%'2H .ųšČĆVŖµeŪV,@†ę¢Wg@0|‡_m}ŃN]-“°œĪÓ.0ǘ1Ÿ“ź)ŖE2Īś=pŁx°~ą ^żųńćéa_ŗµ$]ŗé€7z’ń”žu?ĆJ€ż½ś¢*ą’¹‹%l]/ Œy‡ėį¹z};u(Ō*}Ż„ ^±ļ- Ą‹WĆ·ōTė…$+r€ā“B×U(ōÖ,F¾Ż”ŃŚ`ši4ņ蟌™oō0¼ZŒbbB‹ä½Gņ2Štg}Q3ڰü?ŠŻ@ōŌóm^ļZ·Il8ŗOsŅцN2ĪW÷ƒĮ6+øN@09žL{¶¾CƬ{\÷xgÕHw·iŌt~-ŹtŒ°z`'“/MĒō­ Vp*"ŪŚŚó3Ŗé.R]wū¢QZ„™\üoFe8Ńab˜ڟ?=Ź šźf#_W”0vjŌuw~¬6J„XưłƒæļxĶ€8מ“ę'ʧiŚ`ĢÕåŚ€¼ņZN£17!žbP•Z³œaä ƟåLj4²„‚ę“m¬¼ģ|bsWa ,71Mb¹¶‡é¦3×Ļęܐ”ŪŠŻ}OQPYWYV|śüéČ.UÉ {É0č+ęMü¹ķø$…0ąÉG“*ĖΟ>}*;;L÷Ø|¹?Ŗeģ­žy=_Åu=ōOMMMK›3ūūģģ¬ĢĢŌĢ9÷” üw #ūG V™Śąėć76€,uVgUõ”0;01&ģĻQJü ®ŽŽ?b•P(ōńó^—ŗ!mCZŚŗY¤²j?ņ zLoc}ŽńĆń\ŁqU„0NčćƏµÄŗĻ4ʊ^/;^™:zzXŠŽšė„)\¢³³²²²“…q1 P)•–""„ €Ļ«C-kRø@:vč–.!\±~uU——/[Ń$–ć8atüq ģe‰=@Ž0M/Lņ„ˆ.‹Xyl$YCˆ1Ł 0šš“ŚßĄq¤øBØZ„V«×᪈øyåuŅt1(‚ vé&ėāŃtō$ ēa²/..+¾öĶ8,!B”S'É%0Yz‰ģ’ü&~—ø{8ąīiÓ&ƒ*ffyøøLd-,‹Ųyg÷e¬‡Aq ˜8.»„ŃĄŻģ ßÄÄȘ%Īż£§š=|}gK-ü+Š` › ˜L&GåSŌӂXa··hPP< x€Ål€ß§ŚOˆŽŪTYœŸ’Éļ“Ä ŗK › (vī˳ Ō¾÷ß,3L¬Üōą€–ĄåĄĀę@Ā¹×Ÿļń²ābį #üŠ–K~'\ax£AŠ)’³÷÷Ś[sµm*Ėø‚7įf ČĘՀ †SŽœ±īz†ü„aeɚżlĄĀ.‹‡Oƒć÷¬µņ~ž7§8’\«}‚ß Įī^ļ.Z¾ĀŹ#zŌ©Mµé[`a?²1žėš”>ŲŚ':ń”“6”‰0WĮ\†Ń¾Óƒg–X=eAާ¾"§OpÖ†ŠŲÅŪ7`F†õc”©ŹæX,ģGFó}'L·aJ³ƒ"S„jw9X9kŹ÷öõ¬²eÖuÉ #ÓŻA+0dˆ+ßūc‘-“ŖS®ńüH†_’ÉŠĮ|>ßSeŪø>,5¤­œē²īģźęę14?ß¶“$¦ˆLöąóx#Ü\y|×`µ­Ļ&§ŲY*2|ŸļĘss6½YdóŪĻcŻJ’ĢĘsćń&k”}xł ŚM’õĮ!õd}_Ž}vü©¤%”ģśŃ®ʁüA|_ß¾l·ķēåŌwłÅßÕīŌ c,IEND®B`‚qjackctl-0.4.2/src/images/PaxHeaders.14935/open1.png0000644000000000000000000000013212700760152016637 xustar0030 mtime=1459871850.611904288 30 atime=1459871850.611904288 30 ctime=1459871850.611904288 qjackctl-0.4.2/src/images/open1.png0000644000175000001440000000035412700760152017405 0ustar00rncbcusers00000000000000‰PNG  IHDRó’asRGB®Īé¦IDAT8˽“AĆ ‡Ø?gåLžņKū-ī””J(UH+e/+k ĄŸrķFĪŁšµ¦åœm/±Ųź±/N)”ŖxP¼̳X§™ūŅ‘ƒ÷T”SK®÷U=ų¦čĪ2¶J)£*„–Įéuž!Nõ6×Õ yŁ V C¾Å6 ¾£Å„tæ@ŗ€+1* }ēvń/-½¹SOŃ)ÓšAIEND®B`‚qjackctl-0.4.2/src/images/PaxHeaders.14935/msocketo.png0000644000000000000000000000013212700760152017441 xustar0030 mtime=1459871850.611904288 30 atime=1459871850.611904288 30 ctime=1459871850.611904288 qjackctl-0.4.2/src/images/msocketo.png0000644000175000001440000000114612700760152020207 0ustar00rncbcusers00000000000000‰PNG  IHDR(-SMPLTE  #%;*+;.0;T5.Y:.Z:.DD=HG=IH=LK=ML=ON=QP=WT1UT=VU=ZW3ZX=^[=b_:a_=b_=eb=fc=hf=jg=li=fffnk=pm=so=tq=’00ws=yu=ÉMA{w=}x:}x={wI˜m8}|4|=‚~=}Iˆ‡…€=†=ƒƒHŠ„=‹…:ˆ=Žˆ=čZLéZK‘‹=’Œ=”Ž=–=˜’:˜’=š”=œ•=˜Už˜=Ÿ˜=£œ=§Ÿ:„ŸiŖ¤I³«Iµ­:®©jŗ²:ŗ²IĮ·-Į¹IȾ:ĄŗkĀŗhĒæI¼jÉĄIĪÄ:ĒĄhŹÄLĪÄIŃĘ:ŃÉ9ŃĒIŌĢ1ŌĖI×Ļ9ŻŅ:ŪŅBŽÕ7įÖ>įŲAćŚ:äŚ:ėą:ėą?ķć?šå@šåAõźBŽ7ĘątRNS@ęŲfĒIDATxŚc`Ąn®N¶ÖÖę¦Ęś`—ŒÄčųØØ€@_Uy€c"KprZnzd«XĄ.<4I[QP;ÕG,`›¬Ķ¤-ØĶ¬) °ĖŃĮLi°€i@.P=Ļ˜+ 0ņĖņH$K , ē• -®đ¢`-O“8°-ÉĪB`5ļ Ż˜”\KKN°€²;›‡”ææ•ŠŠ:X@ŃŽLÓ@[›C], '#%!&**ĢĻĖĶ`G Że%0phć²IEND®B`‚qjackctl-0.4.2/src/images/PaxHeaders.14935/up1.png0000644000000000000000000000013212700760152016322 xustar0030 mtime=1459871850.615906288 30 atime=1459871850.615906288 30 ctime=1459871850.615906288 qjackctl-0.4.2/src/images/up1.png0000644000175000001440000000030712700760152017066 0ustar00rncbcusers00000000000000‰PNG  IHDRó’asRGB®ĪéIDAT8ĖŻ’Į € E ±kcŲ™ģLx¢"TŒń⿐–ž—6-š„–Ł%g‘“ŅĢ"°“kéĪ\ԃЈYƒŠØ¹”'ęĔ$3ŸŠ¬µS% ī€čs7”Õ B3Uó” ā1˜ŽŪ¦·ēћ åĻlakšG×’oƒIEND®B`‚qjackctl-0.4.2/src/images/PaxHeaders.14935/aportpto.png0000644000000000000000000000013212700760152017465 xustar0030 mtime=1459871850.610903788 30 atime=1459871850.610903788 30 ctime=1459871850.610903788 qjackctl-0.4.2/src/images/aportpto.png0000644000175000001440000000046412700760152020235 0ustar00rncbcusers00000000000000‰PNG  IHDR(-SiPLTE_@@000542@@@``0PPPPPUTR@``€€```5trjhd@€€€€€@  ĄĄŠˆ„…¤¢Ÿœ–   ŖØ¤@ßߥĄ@Ÿ¼¶ĄĄ€æ¼¶ĄĄĄŠŠŠŠŠßß`’’’ ,OšgtRNS@ęŲfyIDATxŚ]ŽŪƒ D”bń–¢"A[RZ’’#՝hžvĻd7āom!Ųūżaʀš™?µfą=>µšł6pĢ—Ņ ¾_Vpó]Ć}+”‘H!į•ÆyŒ¤Ņ‹¦Ųśˆ č½>(µ‹³=%ÜqŽS —’7›^·ėęĮŚÓ%IEND®B`‚qjackctl-0.4.2/src/images/PaxHeaders.14935/aportpni_32x32.png0000644000000000000000000000013212700760152020312 xustar0030 mtime=1459871850.610903788 30 atime=1459871850.610903788 30 ctime=1459871850.610903788 qjackctl-0.4.2/src/images/aportpni_32x32.png0000644000175000001440000000152112700760152021055 0ustar00rncbcusers00000000000000‰PNG  IHDR D¤ŠĘŚPLTE©œ“        '".!& %, $- &.!!!"""&"###$$$-9&&&8:((()))*****+,,,2, ---)00...///000111333444666:63Jp9995=>;;;W]S}]aBBBDDD2LYFFF^ŽfmIIIa“#WrLLLUL<g“fkgt$^wQQQ ryt¦s,fƒYYYYZZ‡[[[i\@bbb7t}ƒ—tfMhhh‰™3„‹œyiJ"† nlh=‚Œ˜¾™Į—„m„…B—šÆŻ"§¬.Ÿæ'Ø­ƒƒƒ(¬²„u½ń‹‹‹ŒŒŒH©­ŽŽŽ%½Ā’’’–––ƒ„„+ĶÓ¬œ‰    „„„’“µŖŖŖ­­­®®®ÆÆÆ½¾®±±²²²Ä“Øøø¹¹¹¹Ę¶©¢ÅÅ»»»ŸĶĪĀĀĀĆĆĆĄÅÅĘĘĘČĖĖŁŽŽ¹ōõäääåååēēēŁņóčķķģģģųžžłžž^ÓŗYtRNS@ęŲf%IDATxŚc` ęĪÅ//™×¦ŠWYi›^C¤L“ Ś-š©‹ˆ©ī²˜‹Ū-sõcęĪĶČ÷Å„‚Qo®WÓ„ŽŖ9œ*”¹ŒśgO©JPĄe‰‹ĆD<*ꦌs³įS1×2+ ¤bN5.…aÜ`3āıŖ`w/ ćŖ˜Ł’ďG…MķäŹĢœ*X™­Ź'u—DńāRįŹcR×Z_–.‹CEšµ•cߌģh5ģĮĮn—oĄįÖź$€#DŁ=rlåż§÷hįŠĮą@ļP]|*ų„żššŖ•˜«V”'‰”¢Y׿"D Ćfõi=:ųT8ėś‡kāQ”Ų,Æ?«!Ÿ&ž±S„ńefĒČ¢P¼™2TļˆpŽé2X;ئķIEND®B`‚qjackctl-0.4.2/src/images/PaxHeaders.14935/refresh1.png0000644000000000000000000000013212700760152017334 xustar0030 mtime=1459871850.615906288 30 atime=1459871850.615906288 30 ctime=1459871850.615906288 qjackctl-0.4.2/src/images/refresh1.png0000644000175000001440000000112712700760152020101 0ustar00rncbcusers00000000000000‰PNG  IHDRó’aIDATxŚ­’]HS†ŸmžĶÖü(ZBö£7Ń¢‚~č"¼NØ!A¢Ą¢čJŗ »©›¢ £›®ŠØIh٢ҢŌdĖ„’†ĪĪqĘēqcĒ3·sŗ8¹μé½ūųxŽļµ°‘ŗę*¬ū°ü™Ę"MՃ«ė‚ j‰Ähž1g%‡Ś¼ ŽjĪxięGņ o4Ń×>Ź“ź 4€XĀ;ó'x¹KŲŁŹŲ(Ņ  ƀŒz¶mÉO$Šøj±fĶŽH Qg+½a¬&_śH§`a Äi jösąBĖZ@ÜŽAą HŸ ‚÷ΐŒ^Ąļ›G‚įŪķhJ›•žė@aī„Gr"„Č~½ó÷Ķ£žs[ÄfPXփ°YĄUŻHB~b&ˆŃ@T=ńš¬ŁT Rxæ¢Č„#8”|Ē©Ü ±ŒM›@śē[‹ō2¤UW $ū±XĮU•{®k~*ļĮj+`iŽē7ꃨ1’8rłęŗS »g!.Cržõß_ų5~•Ģ øė\œŽŠ6“;»ė–wѹ0ͤŗ‰ū§€> ŪpS ׎S^wŒ²ķPUŬ°Éb  v&Dėéc’™ŽĆĄ·µ°ą9݁»ž"Žb+Ī ³…Šdʉ|=Œä łUŠ»ž,®Ŗ“d4;ŠōųÜsą-°Ģ’Ōo’JŃś•fIEND®B`‚qjackctl-0.4.2/src/images/PaxHeaders.14935/disconnectall1.png0000644000000000000000000000013212700760152020520 xustar0030 mtime=1459871850.610903788 30 atime=1459871850.610903788 30 ctime=1459871850.610903788 qjackctl-0.4.2/src/images/disconnectall1.png0000644000175000001440000000114612700760152021266 0ustar00rncbcusers00000000000000‰PNG  IHDRó’a-IDATxŚÅ“[HÓqĒ?’’¶’ŌVNVN›X ©5ÓØXoŽz)#Ć.¾!…łŅCļQ!„ŃÅ‚̔DĶL#š /+/ū»Ķ­­Ķ’~=”±™½8‡ó=_¾ē’Ū¤Ä@\ KsQńŁĶżĀ¢I¹«¤D\œł± 4ż…²>īéAź ×ę¼īšØż]|łŪ;Z½“ŌĪG@Ž28uIr"Ų7ØÉV((7aźPyŠ”Ļ%ƛ“w."Żš½z §kr˜ōLćr¾dj5 K£ń: ‘8Ėcaö,ÄøYeĘaKż‰‰½>ĀG?Q$­5Ł<#޳›tnĄ0Ćßćg‡N¢/¬a]! ļ_bŸ^4 CÜõ©ģšv÷Å1²nŁSIßµžg-S” ‡(HŲ\•bu(½“,ł£(ń_™LžŖ ułč<—ĆłLF‚<:5AŻjµŗfZ·­óXzqēeĀn#aģv//fcĖMä¤PøÓ„üD„ėž#ĒhœŁOŪĢŚ}ÕÄZ‹Ū҈€ńø•ńW„ˆ×„ěó9˜T¼|£Ė‰ÖSŠčv ڊUéā3+˜u2Ö¦\üŠUf&9‰¤ŅĢ•ķi|-IcĪž‚G-@Ņ‘Yō”åQeōkmONšæŁF ćŸ~㤯Ķwó;Y±IEND®B`‚qjackctl-0.4.2/src/images/PaxHeaders.14935/xstarting1.png0000644000000000000000000000013212700760152017721 xustar0030 mtime=1459871850.615906288 30 atime=1459871850.615906288 30 ctime=1459871850.615906288 qjackctl-0.4.2/src/images/xstarting1.png0000644000175000001440000000046212700760152020467 0ustar00rncbcusers00000000000000‰PNG  IHDRÄ“l;łIDATxŚķ“”ŽĆ0 †½)ČdŌ°ō°ßĮR_dļ>fRŲń>C%æCčŽ š4X%§é¦jÕŖ­ÓõGŽņė‹’XµjÕ’kss.˜łKDJ"ŚÅĻfֆ>ągŃ ˆXŖj—RźĒJ)õŖŚ!b¹„[ØjwÕĒŗæ•ŖvP’HnĀg0Ģt‡”S-liFĮi.ŒÖaSłu‚Ē—Šü...žŸ·Ż¹'¢fRJ73{Øź\Jyšyź†ć "‹»Ææq÷UD–ćp&·‘e=@DżS©D4ķ_ŗĒŻW"šZ3;"3!„C1„fnžŽŽ™‘RŗµČ­t)%˜Ł£Enõ 33Øź\k=k­PÕł™Į½®"ņšĒ!"?›7åœļć8~åœļ[Åś?­ōV=l…Ŗ¢”rj“æ§›ŪGLZi”IEND®B`‚qjackctl-0.4.2/src/images/PaxHeaders.14935/down1.png0000644000000000000000000000013212700760152016645 xustar0030 mtime=1459871850.610903788 30 atime=1459871850.610903788 30 ctime=1459871850.610903788 qjackctl-0.4.2/src/images/down1.png0000644000175000001440000000030612700760152017410 0ustar00rncbcusers00000000000000‰PNG  IHDRó’asRGB®Īé€IDAT8Ėķ“Į … DŸĘŽöׄeˆeHMNMxń€øų^Żę‘Ķ šr:O\—kMcŅ鞊"KņĪ0—z’v…P¤ąEēāšSwčA0²™ŻzUID`>ć¤4»M¼‚Ōęf•=ˆgnjHĖüw‚‘ƒ‘÷?šx.ͼ:ą…·cIEND®B`‚qjackctl-0.4.2/src/images/PaxHeaders.14935/disconnect1.png0000644000000000000000000000013212700760152020027 xustar0030 mtime=1459871850.610903788 30 atime=1459871850.610903788 30 ctime=1459871850.610903788 qjackctl-0.4.2/src/images/disconnect1.png0000644000175000001440000000105412700760152020573 0ustar00rncbcusers00000000000000‰PNG  IHDRó’aóIDATxŚÅ“_HSqĒ?÷īŸŻ®,u!ŁV²,‡õ ½H“zjBT/¦oå›HP”EOõP/½ųVą¤p“ÄŠžFK¤\čls›Ź6·{ēżõTl7…‚œ‡ßļ|Ī—ó;ēüą›T|qa|±97æ@+‰õ±q%̹l† £€ųōįƒļ·C©7܌-pņå2AĄ’;łRö#÷ć3ųyŠ Å9ŌYJźÉ±£ŹĘa—]ūUŌ`’g½ŪøšųJ×½(ܞ£0’D]$š5ø+™žd?]ĶūYB|ČŠīkdB‰1Š!]™!ÉÓ„ŠĶŲ$*»k™j«¤"gP˜ĢҜŅé&Łó:ĶqąQ1/›tAb NĖ«e4EĘŗÕA(³Ź±·iNĶ¼¼Öh"=|ˆÓ>µ‚رćl*ēÉ7ƀų+ü4·NÕŠŁ’ƒ ¶—QÅZĢ…NĪ,}ćZ$ƒ;°@(Ŗ‘ݧ²³ÖA½WĮś4Åč*¹.Ģ!0ėghńś¢AA|€£Ėŗē^Ęćrm%ÉŚQį¬Ž{cˆĮ݈V'pö£ŹT÷naé”Ѭ2iŽ`Z7q}ÆĀ|ƒBĢ]Ƽ }꾔[hŖ²—`d½ŽÉE¾ž9 ’ō7žx¼°Ś]‡‡IEND®B`‚qjackctl-0.4.2/src/images/PaxHeaders.14935/aportpno_32x32.png0000644000000000000000000000013212700760152020320 xustar0030 mtime=1459871850.610903788 30 atime=1459871850.610903788 30 ctime=1459871850.610903788 qjackctl-0.4.2/src/images/aportpno_32x32.png0000644000175000001440000000151412700760152021065 0ustar00rncbcusers00000000000000‰PNG  IHDR D¤ŠĘŻPLTEUL<        '".!& %, $- &.!!!"""&"###$$$-9&&&8:((()))*****+,,,2, ---)00...///000111333444666:63Jp9995=>;;;W]S}]aBBBDDD2LYFFF^ŽfmIIIa“#WrLLL g“fkgt$^wQQQ ryt¦,fƒtYYYYZZ‡[[[i\@bbb7t}ƒ—tfMhhh‰™3„‹œyiJ"† nlh=‚Œ˜¾™Į—„m„…B—šÆŻ"§¬.Ÿæ'Ø­ƒƒƒ(¬²„u½ń‹‹‹ŒŒŒH©­ŽŽŽ%½Ā’’’–––ƒ„„+ĶÓ¬œ‰©œ“   „„„’“µŖŖŖ­­­®®®Æ®®ÆÆÆ½¾®±±²²²Ä“Øøø¹¹¹¹Ę¶©¢ÅÅ»»»ŸĶĪĀĀĀĆĆĆĄÅÅĘĘĘČĖĖŁŽŽ¹ōõäääåååēēēŁņóčķķģģģųžžČ]c6tRNS@ęŲfIDATxŚc` „É„ć“×jœ^lG^7bN\”(ny…¾/§0œņ:”3L™qĖ÷Ujčµį”×ꢄW§~9uA¼ņ|1Ī łfģņ²Ńå9axäRKfuį–—ÉźmŸą®ę?«¼b|^Քz'N;Ÿ I¬ņ‰ÕmS+B­ ƒD°ĖO›]gmb“ĢC~īd[f^ßdO!,ņņ`yGV6·t{,ņbyN®š"lņóüšĖ3Ģ+čʳóą’g˜—9i">yĖy-Ę,ųä{ęĶćfrČvÅ!?Ƴ&6IE3ĶŹGR.ŒMŅgœ7oyµŽ”H}FÜ`^G™™ų<<9h^¾¹4ž<*%LIgw YU`ą3 IEND®B`‚qjackctl-0.4.2/src/images/PaxHeaders.14935/mporti_32x32.png0000644000000000000000000000013212700760152017770 xustar0030 mtime=1459871850.611904288 30 atime=1459871850.611904288 30 ctime=1459871850.611904288 qjackctl-0.4.2/src/images/mporti_32x32.png0000644000175000001440000000151712700760152020540 0ustar00rncbcusers00000000000000‰PNG  IHDR D¤ŠĘŻPLTE  '$ )  $" $" """###$$$)&%%%('/)1+,,,6/ ...70;3 222320333>5565777878888;;;>>=DA%DB)@@@AAAIH ODDDDEEEFFFQH#GGGNG8HHHIIIMI@JJJKKKNKGLLLXN%POJPOOWR6QQQSSSTTTUUUVVVbY,dX?\\\ha=```mc4dddseLpiBtfMhhhiiiyiJmmmnnnoooqqqrrr{xDuuuvmyyy{{{‹p‰‡tˆ†~½„‡‡‡Ą†‰‰‰ŠŠŠ‘‰ĆˆŽŽ˜‹€ŽŽŽŽŽ’‘’’’’”””•••———˜˜˜±„±¦ššš“Øœœœ£”„¬œŠŸŸŸ«£p   ¢¢ ¢¢¢¤£™£££Č°¤¤¤É±„„„¦¦¦©©©«««®®®±±±“““¼¼¼½½½ĘĘĘĻĻÄĪĪĪŠŠŠŅŅŅŲŲŲéęyŽŽŽćććęęęčččéééüüīžžłūctRNS@ęŲf IDATxŚc` ؐ·.$ ĀѵÄæ;Ūųü*<«³”š)‘ńOĻ ÖĒ£BƼcRK„%Ģʝ“Z"ńŲ2¢ĀEI—°ŠŌöŗ0-%Ü*¢óŚ&öe»²ćRĮ$jV>ePN3ę‰ūT‚TøqąRĮ( QįΉCDÅō‚v @*ŅŚgV†Z°įT!ģ\\ÜՔģŁS…˜]^O[~M®.¼&AqݽU68|"ÆfŃP4aj™7ö˜™Ė)/ė§7yöŌ Eģ”Į£¢.ČbTQ*‡]…¤ŗU³‹Q‚Ŗ.+vĀŹI­B,Rö 8āž‹?£U$ĄĮהgśįKŃ©Ÿ–čĄ;… ÖĪ™”‰/'Dej3Š ŒĻ[Ńč?ĪOIEND®B`‚qjackctl-0.4.2/src/images/PaxHeaders.14935/setup1.png0000644000000000000000000000013212700760152017036 xustar0030 mtime=1459871850.615906288 30 atime=1459871850.615906288 30 ctime=1459871850.615906288 qjackctl-0.4.2/src/images/setup1.png0000644000175000001440000000133612700760152017605 0ustar00rncbcusers00000000000000‰PNG  IHDRó’a„IDATxŚu“KHTqĘ÷Ž™qFŃ 15AlBĆ4EQCØL\ø‰ˆŅcW»³h!EmkQ†F)¾Č¤ŠLQŃ(ą£qœq|ܹŽūo‘ų=Ėó¾sųĪ÷IRāŽHˆ T„ÅĢ”ŌĀźAsŅ’Ķ:.,łi’"ä7‘t±&ğ-fē6šÕŒšģ@шyqŠWže®¶ĢC÷ ›ó“™t+©ń$yķ0¶ĪČ;?łÆ—XŪ·y”ŠÖöÄ9›&‰FĄ¶O‹āōŻd¦»<Ÿ›q@Ž×.qeš ¢ĄĪ­Ö“7Sʗ‰"ōūnębŽdZQ|i ÷x—šķü*bō^ B†ŗH^ ZÆqķĀ"qgļ%O2Hģõ°õą8k€Q‹ć÷YŒR'Ą4]Ģą`¢5 ‘iåå^ŽR ȲhĶBŲŹdTÜa )Ø3)ŖflՀd :?;@ADD=IG$JH$LNHG=IH=LK=ML=ON=]N#QP=SQ=\[UT=VU=ZX=^[=gfa_=ggb_=iieb=fc=ngmnhf=nojg=pqli=ffftmnk=us pm=uvvvso=roItq=trIws=yu={w=yvI}x:}x={wIAœ$}|4B$z=…ƒ |=‚~=€}I}Iˆ‡…€=†=ƒƒHŒŒ‹ Š„=‹…:‰„Iˆ=Žˆ=Š:”$Œ‹E‘‹=’Œ=‹IŽG”Ž=˜––=œ”›“&˜’:˜’=—’I•’Tš”=Ÿžœ•=Ÿ—:ž˜=Ÿ˜=£œ=œ›Y¦”,§Ÿ:’¤”AŖ¤-Ŗ¦1„ŸiŖ¤I­¦:hĢAhĶA³«Iµ­:®©j·²1¼³,ŗ²:æ“-ŗ²I²®}Į·-Į·.µ°|Āŗ)·³|Ľ*Į¹IȾ:ĄŗkĀŗhĒæI¼jÉĄIĪÄ:ĒĄh¾ˆĪÄIŃĘ:ÓŹ3ŃĒIŅÉ?ČĆ‰ÕŹAŌĖIĶljŻŅ:ŠĖˆėą:ōčAõźBŖņntRNS@ęŲfÕIDATxŚc`Ąi©I±įĮ~ŽīNöę`”éS{'÷“55W˜j¦2¶N›2±»‹)Ł,ŁŁ$'.ć] éÓķ›1!G-=N,ąß”ЧĶĀŖšnāšÉ2kGm¢Æb4JtäīH"„»–Ģī¾éM€¾ŸŽjł÷½Uó¹ķ’8sxT@)Ć7[tzd’o!TzˇĆΐŸs×Ó°÷0DIEND®B`‚qjackctl-0.4.2/src/images/PaxHeaders.14935/error1.png0000644000000000000000000000013212700760152017027 xustar0030 mtime=1459871850.611904288 30 atime=1459871850.611904288 30 ctime=1459871850.611904288 qjackctl-0.4.2/src/images/error1.png0000644000175000001440000000052512700760152017575 0ustar00rncbcusers00000000000000‰PNG  IHDRó’asRGB®ĪébKGD’’’ ½§“ pHYs  šœtIMEŚ !Ł‘/©ÕIDAT8Ėķ‘”nĀp„æIHE !Uō†;³Ö„Gąx,øef Į4CŒĢŌķ ¦Š„żŻ ¾ēōŻåĖ<ōøx'x6°_8ßµ“!ģvĪ©Ż@[P6µ|˜ż4›R–™†C)I¤4µ/P/•1|ŹóĢV+©,%I6Ÿė 6‚wÆŖ mĢi*¼»}æąZŠ­$ˆą­š}©(LĖ„i½6å¹ALėl؟Ąõ†2ĪA N@§īŃ>Ęp~…Ó,øć’ĢZ5BŹIEND®B`‚qjackctl-0.4.2/src/images/PaxHeaders.14935/aportpno.png0000644000000000000000000000013212700760152017457 xustar0030 mtime=1459871850.610903788 30 atime=1459871850.610903788 30 ctime=1459871850.610903788 qjackctl-0.4.2/src/images/aportpno.png0000644000175000001440000000026112700760152020222 0ustar00rncbcusers00000000000000‰PNG  IHDRķŻāRPLTEpH@€€€€€ĄĄĄf’’’’’­ĆvtRNS@ęŲfJIDATxŚc`€5(Ķ–e¤&CŌ@“r*DFM- "pTS‚¤&AÄĄJRD  ‰Ž5ØSRD@YjĢZ} ēk×IEND®B`‚qjackctl-0.4.2/src/images/PaxHeaders.14935/xsocket1.png0000644000000000000000000000013212700760152017356 xustar0030 mtime=1459871850.615906288 30 atime=1459871850.615906288 30 ctime=1459871850.615906288 qjackctl-0.4.2/src/images/xsocket1.png0000644000175000001440000000021312700760152020116 0ustar00rncbcusers00000000000000‰PNG  IHDRķŻāRPLTE_^%a`%lj&ŻŻXāā\ģė\ļļa’’f[Y&c‘BqtRNS@ęŲfIDATxŚc` `.€0Ų: &— Ų•Fż?MvTĆIEND®B`‚qjackctl-0.4.2/src/images/PaxHeaders.14935/aportlno.png0000644000000000000000000000013212700760152017453 xustar0030 mtime=1459871850.609903288 30 atime=1459871850.609903288 30 ctime=1459871850.609903288 qjackctl-0.4.2/src/images/aportlno.png0000644000175000001440000000026112700760152020216 0ustar00rncbcusers00000000000000‰PNG  IHDRķŻāRPLTEpH€€€€€ĄĄĄ’’’’’6tRNS@ęŲfJIDATxŚc`€5(Ķ–e¤&CŌ@“r*DFM- "pTS‚¤&AÄĄJRD  ‰Ž5ØSRD@YjĢZ} ēk×IEND®B`‚qjackctl-0.4.2/src/images/PaxHeaders.14935/aportpti.png0000644000000000000000000000013212700760152017457 xustar0030 mtime=1459871850.610903788 30 atime=1459871850.610903788 30 ctime=1459871850.610903788 qjackctl-0.4.2/src/images/aportpti.png0000644000175000001440000000031312700760152020220 0ustar00rncbcusers00000000000000‰PNG  IHDRķŻāRPLTEpH€€€€€ĄĄĄ’’’’’6tRNS@ęŲfdIDATxŚc````K`€”$Ķčf aˆ(™*0(\“C˜€“H5uM U©0 IN3L]“R””UB Rl‰ ] cŲD ŗ•Ąę…ÄŒĮ&… –Bœf>$Ń]9IEND®B`‚qjackctl-0.4.2/src/images/PaxHeaders.14935/aportpto_64x64.png0000644000000000000000000000013212700760152020340 xustar0030 mtime=1459871850.610903788 30 atime=1459871850.610903788 30 ctime=1459871850.610903788 qjackctl-0.4.2/src/images/aportpto_64x64.png0000644000175000001440000000373312700760152021112 0ustar00rncbcusers00000000000000‰PNG  IHDR@@·ģ÷PLTE         #"+,"  !11"$!+)56 34&(%.,!+,*??==-/,CBDD<=14'231";9IHEE574NM981:;)6?0:<9USWZ@?8QP7BC>@=ē=ļ9’æu­&Ž“Z8óŽ˜ÅĮŗuģĮ(g½w6nų7ŽŽqČ7ĪuÆĒ'H„='8˽1Daį† Ų Ä±½°ē3¤nA6̆køA¬ķŽū‘Īb1q¦–[˜»Aę ģƒ=eˆ³ “—ń‚$ (ŗŽ÷¼9 *8ƒ®éŅ,‚ŸņĄ^ŲļóŠū“¶ś]¬VpęqːŁ[Å 3×­kŖW8dr>Ż^“į–ö²ņõāE…ćŽüĒ{Ć1īŅyå[¤F}īb”ÅgyčEąā×”żæ)Uxõį[xųēP~]R¹Ć§Ą påwķ#ƒ[哳ņEéG<{”ƒēć)b±WŠłŁ-wĢüU?łm;?•uƊņ£ˆEDcž.._?ų łÆd źĒ"ˆüŅČŪlō‚üē—82¼(nę§×/šIż„ߤįx«ŽO;ŃüøBžMŸJ°ÖŖāĆ xJ]WēŠüØŚī#ˆxŒ_c…”-Pū›ł¶ėnĮØĪÉŲ0ŸŪ¼~ͤ½_’aeć°ÓÕu}PżQöęČ?’&€ų.¬±:śi‚”öŁ\nŪń9Ģę…ĒHåVG-¢Ąį  DRŪĀkŠRŸbz"üm«"Q“…Õ÷÷ȅ¼ōžł‡%T É·ƒ¾BŒNÆŹĢHŠņ3~(–¤ŁM›Ų`ÆŪÜĘ¢S—ł­“š±KD$+2ڢ᩶¼“5:6zn¶SĻ6N‘Ņ7HÖ%Eś!Ń3Ó)#eś€ĄU( š„K{fō²x ŌĻ{;9čĖ=(‹§ol š]Ņ/ ~åCC/#wA:@ qsÜõüYr[mn€ˆō Į €™9;*AZsĘ”,āŃ%š{4 eqÕUæN "ĀV"Š§Ėż:ˆÓ'†8č “ header file. */ #undef HAVE_FCNTL_H /* Define to 1 if you have the header file. */ #undef HAVE_INTTYPES_H /* Define to 1 if you have the `m' library (-lm). */ #undef HAVE_LIBM /* Define to 1 if you have the `X11' library (-lX11). */ #undef HAVE_LIBX11 /* Define to 1 if you have the `Xext' library (-lXext). */ #undef HAVE_LIBXEXT /* Define to 1 if you have the header file. */ #undef HAVE_MEMORY_H /* Define to 1 if you have the header file. */ #undef HAVE_POLL_H /* Define to 1 if you have the header file. */ #undef HAVE_SIGNAL_H /* Define to 1 if you have the header file. */ #undef HAVE_STDINT_H /* Define to 1 if you have the header file. */ #undef HAVE_STDLIB_H /* Define to 1 if you have the header file. */ #undef HAVE_STRINGS_H /* Define to 1 if you have the header file. */ #undef HAVE_STRING_H /* Define to 1 if you have the `system' function. */ #undef HAVE_SYSTEM /* Define to 1 if you have the header file. */ #undef HAVE_SYS_IOCTL_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_STAT_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_TYPES_H /* Define to 1 if you have that is POSIX.1 compatible. */ #undef HAVE_SYS_WAIT_H /* Define to 1 if you have the header file. */ #undef HAVE_UNISTD_H /* Define to the address where bug reports for this package should be sent. */ #undef PACKAGE_BUGREPORT /* Define to the full name of this package. */ #undef PACKAGE_NAME /* Define to the full name and version of this package. */ #undef PACKAGE_STRING /* Define to the one symbol short name of this package. */ #undef PACKAGE_TARNAME /* Define to the home page for this package. */ #undef PACKAGE_URL /* Define to the version of this package. */ #undef PACKAGE_VERSION /* Define to 1 if you have the ANSI C header files. */ #undef STDC_HEADERS qjackctl-0.4.2/src/PaxHeaders.14935/qjackctlJackConnect.h0000644000000000000000000000013212700760152017712 xustar0030 mtime=1459871850.618907789 30 atime=1459871850.618907789 30 ctime=1459871850.618907789 qjackctl-0.4.2/src/qjackctlJackConnect.h0000644000175000001440000001167212700760152020465 0ustar00rncbcusers00000000000000// qjackctlJackConnect.h // /**************************************************************************** Copyright (C) 2003-2015, rncbc aka Rui Nuno Capela. All rights reserved. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. *****************************************************************************/ #ifndef __qjackctlJackConnect_h #define __qjackctlJackConnect_h #include "qjackctlAbout.h" #include "qjackctlConnect.h" #include // Forward declarations. class qjackctlJackPort; class qjackctlJackClient; class qjackctlJackClientList; class qjackctlJackConnect; // Connection port type. #define QJACKCTL_JACK_AUDIO 0 #define QJACKCTL_JACK_MIDI 1 // Pixmap-set array indexes/types. #define QJACKCTL_JACK_CLIENTI 0 // Input client item pixmap. #define QJACKCTL_JACK_CLIENTO 1 // Output client item pixmap. #define QJACKCTL_JACK_PORTPTI 2 // Physcal Terminal Input port pixmap. #define QJACKCTL_JACK_PORTPTO 3 // Physical Terminal Output port pixmap. #define QJACKCTL_JACK_PORTPNI 4 // Physical Non-terminal Input port pixmap. #define QJACKCTL_JACK_PORTPNO 5 // Physical Non-terminal Output port pixmap. #define QJACKCTL_JACK_PORTLTI 6 // Logical Terminal Input port pixmap. #define QJACKCTL_JACK_PORTLTO 7 // Logical Terminal Output port pixmap. #define QJACKCTL_JACK_PORTLNI 8 // Logical Non-terminal Input port pixmap. #define QJACKCTL_JACK_PORTLNO 9 // Logical Non-terminal Output port pixmap. #define QJACKCTL_JACK_PIXMAPS 10 // Number of pixmaps in array. // Jack port list item. class qjackctlJackPort : public qjackctlPortItem { public: // Constructor. qjackctlJackPort(qjackctlJackClient *pClient, jack_port_t *pJackPort); // Default destructor. ~qjackctlJackPort(); // Jack handles accessors. jack_port_t *jackPort() const; // Pretty/display name method (virtual override). void updatePortName(bool bRename = false); // Tooltip text builder (virtual override). QString tooltip() const; private: // Instance variables. jack_port_t *m_pJackPort; }; // Jack client list item. class qjackctlJackClient : public qjackctlClientItem { public: // Constructor. qjackctlJackClient(qjackctlJackClientList *pClientList); // Default destructor. ~qjackctlJackClient(); // Jack port lookup. qjackctlJackPort *findJackPort(jack_port_t *pJackPort); // Pretty/display name method (virtual override). void updateClientName(bool bRename = false); }; // Jack client list. class qjackctlJackClientList : public qjackctlClientList { public: // Constructor. qjackctlJackClientList(qjackctlClientListView *pListView, bool bReadable); // Default destructor. ~qjackctlJackClientList(); // Jack port lookup. qjackctlJackPort *findJackClientPort(jack_port_t *pJackPort); // Client:port refreshner (return newest item count). int updateClientPorts(); // Jack client port aliases mode. static void setJackClientPortAlias(int iJackClientPortAlias); static int jackClientPortAlias(); // Jack client port pretty-name (metadata) mode. static void setJackClientPortMetadata(bool bJackClientPortMetadata); static bool isJackClientPortMetadata(); private: // Jack client port aliases mode. static int g_iJackClientPortAlias; // Jack client port pretty-name (metadata) mode. static bool g_bJackClientPortMetadata; }; //---------------------------------------------------------------------------- // qjackctlJackConnect -- Connections model integrated object. class qjackctlJackConnect : public qjackctlConnect { public: // Constructor. qjackctlJackConnect(qjackctlConnectView *pConnectView, int iJackType); // Default destructor. ~qjackctlJackConnect(); // Connection type accessors. int jackType() const; // Common pixmap accessor. const QPixmap& pixmap (int iPixmap) const; protected: // Virtual Connect/Disconnection primitives. bool connectPorts (qjackctlPortItem *pOPort, qjackctlPortItem *pIPort); bool disconnectPorts (qjackctlPortItem *pOPort, qjackctlPortItem *pIPort); // Update port connection references. void updateConnections(); // Update icon size implementation. void updateIconPixmaps(); private: // Local pixmap-set janitor methods. void createIconPixmaps(); void deleteIconPixmaps(); // Local variables. int m_iJackType; // Local pixmap-set array. QPixmap *m_apPixmaps[QJACKCTL_JACK_PIXMAPS]; }; #endif // __qjackctlJackConnect_h // end of qjackctlJackConnect.h qjackctl-0.4.2/src/PaxHeaders.14935/qjackctlPatchbayFile.cpp0000644000000000000000000000013212700760152020416 xustar0030 mtime=1459871850.622909789 30 atime=1459871850.622909789 30 ctime=1459871850.622909789 qjackctl-0.4.2/src/qjackctlPatchbayFile.cpp0000644000175000001440000002233112700760152021163 0ustar00rncbcusers00000000000000// qjackctlPatchbayFile.cpp // /**************************************************************************** Copyright (C) 2003-2011, rncbc aka Rui Nuno Capela. All rights reserved. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. *****************************************************************************/ #include "qjackctlAbout.h" #include "qjackctlPatchbayFile.h" #include #include #include //---------------------------------------------------------------------- // Specific patchbay socket list save (write) subroutine. static void load_socketlist ( QList& socketlist, QDomElement& eSockets ) { for (QDomNode nSocket = eSockets.firstChild(); !nSocket.isNull(); nSocket = nSocket.nextSibling()) { // Convert slot node to element... QDomElement eSocket = nSocket.toElement(); if (eSocket.isNull()) continue; if (eSocket.tagName() == "socket") { QString sSocketName = eSocket.attribute("name"); QString sClientName = eSocket.attribute("client"); QString sSocketType = eSocket.attribute("type"); QString sExclusive = eSocket.attribute("exclusive"); QString sSocketForward = eSocket.attribute("forward"); int iSocketType = qjackctlPatchbaySocket::typeFromText(sSocketType); bool bExclusive = (sExclusive == "on" || sExclusive == "yes" || sExclusive == "1"); qjackctlPatchbaySocket *pSocket = new qjackctlPatchbaySocket(sSocketName, sClientName, iSocketType); if (pSocket) { pSocket->setExclusive(bExclusive); pSocket->setForward(sSocketForward); // Now's time to handle pluglist... for (QDomNode nPlug = eSocket.firstChild(); !nPlug.isNull(); nPlug = nPlug.nextSibling()) { // Convert plug node to element... QDomElement ePlug = nPlug.toElement(); if (ePlug.isNull()) continue; if (ePlug.tagName() == "plug") pSocket->addPlug(ePlug.text()); } socketlist.append(pSocket); } } } } //---------------------------------------------------------------------- // Specific patchbay socket list save (write) subroutine. static void save_socketlist ( QList& socketlist, QDomElement& eSockets, QDomDocument& doc ) { QListIterator sockit(socketlist); while (sockit.hasNext()) { qjackctlPatchbaySocket *pSocket = sockit.next(); QDomElement eSocket = doc.createElement("socket"); eSocket.setAttribute("name", pSocket->name()); eSocket.setAttribute("client", pSocket->clientName()); eSocket.setAttribute("type", qjackctlPatchbaySocket::textFromType(pSocket->type())); eSocket.setAttribute("exclusive", (pSocket->isExclusive() ? "on" : "off")); if (!pSocket->forward().isEmpty()) eSocket.setAttribute("forward", pSocket->forward()); QDomElement ePlug; QStringListIterator iter(pSocket->pluglist()); while (iter.hasNext()) { const QString& sPlug = iter.next(); QDomElement ePlug = doc.createElement("plug"); QDomText text = doc.createTextNode(sPlug); ePlug.appendChild(text); eSocket.appendChild(ePlug); } eSockets.appendChild(eSocket); } } //---------------------------------------------------------------------- // class qjackctlPatchbayFile -- Patchbay file helper implementation. // // Specific patchbay load (read) method. bool qjackctlPatchbayFile::load ( qjackctlPatchbayRack *pPatchbay, const QString& sFilename ) { // Open file... QFile file(sFilename); if (!file.open(QIODevice::ReadOnly)) return false; // Parse it a-la-DOM :-) QDomDocument doc("patchbay"); if (!doc.setContent(&file)) { file.close(); return false; } file.close(); // Now e're better reset any old patchbay settings. pPatchbay->clear(); // Get root element. QDomElement eDoc = doc.documentElement(); // Now parse for slots, sockets and cables... for (QDomNode nRoot = eDoc.firstChild(); !nRoot.isNull(); nRoot = nRoot.nextSibling()) { // Convert node to element, if any. QDomElement eRoot = nRoot.toElement(); if (eRoot.isNull()) continue; // Check for output-socket spec lists... if (eRoot.tagName() == "output-sockets") load_socketlist(pPatchbay->osocketlist(), eRoot); else // Check for input-socket spec lists... if (eRoot.tagName() == "input-sockets") load_socketlist(pPatchbay->isocketlist(), eRoot); else // Check for slots spec list... if (eRoot.tagName() == "slots") { for (QDomNode nSlot = eRoot.firstChild(); !nSlot.isNull(); nSlot = nSlot.nextSibling()) { // Convert slot node to element... QDomElement eSlot = nSlot.toElement(); if (eSlot.isNull()) continue; if (eSlot.tagName() == "slot") { QString sSlotName = eSlot.attribute("name"); QString sSlotMode = eSlot.attribute("mode"); int iSlotMode = QJACKCTL_SLOTMODE_OPEN; if (sSlotMode == "half") iSlotMode = QJACKCTL_SLOTMODE_HALF; else if (sSlotMode == "full") iSlotMode = QJACKCTL_SLOTMODE_FULL; qjackctlPatchbaySlot *pSlot = new qjackctlPatchbaySlot(sSlotName, iSlotMode); pSlot->setOutputSocket( pPatchbay->findSocket(pPatchbay->osocketlist(), eSlot.attribute("output"))); pSlot->setInputSocket( pPatchbay->findSocket(pPatchbay->isocketlist(), eSlot.attribute("input"))); pPatchbay->addSlot(pSlot); } } } else // Check for cable spec list... if (eRoot.tagName() == "cables") { for (QDomNode nCable = eRoot.firstChild(); !nCable.isNull(); nCable = nCable.nextSibling()) { // Convert cable node to element... QDomElement eCable = nCable.toElement(); if (eCable.isNull()) continue; if (eCable.tagName() == "cable") { int iSocketType = qjackctlPatchbaySocket::typeFromText( eCable.attribute("type")); qjackctlPatchbaySocket *pOutputSocket = pPatchbay->findSocket(pPatchbay->osocketlist(), eCable.attribute("output"), iSocketType); qjackctlPatchbaySocket *pIntputSocket = pPatchbay->findSocket(pPatchbay->isocketlist(), eCable.attribute("input"), iSocketType); if (pOutputSocket && pIntputSocket) { pPatchbay->addCable( new qjackctlPatchbayCable( pOutputSocket, pIntputSocket)); } } } } } return true; } // Specific patchbay save (write) method. bool qjackctlPatchbayFile::save ( qjackctlPatchbayRack *pPatchbay, const QString& sFilename ) { QFileInfo fi(sFilename); QDomDocument doc("patchbay"); QDomElement eRoot = doc.createElement("patchbay"); eRoot.setAttribute("name", fi.baseName()); eRoot.setAttribute("version", QJACKCTL_VERSION); doc.appendChild(eRoot); // Save output-sockets spec... QDomElement eOutputSockets = doc.createElement("output-sockets"); save_socketlist(pPatchbay->osocketlist(), eOutputSockets, doc); eRoot.appendChild(eOutputSockets); // Save input-sockets spec... QDomElement eInputSockets = doc.createElement("input-sockets"); save_socketlist(pPatchbay->isocketlist(), eInputSockets, doc); eRoot.appendChild(eInputSockets); // Save slots spec... QDomElement eSlots = doc.createElement("slots"); QListIterator slotit(pPatchbay->slotlist()); while (slotit.hasNext()) { qjackctlPatchbaySlot *pSlot = slotit.next(); QDomElement eSlot = doc.createElement("slot"); eSlot.setAttribute("name", pSlot->name()); QString sSlotMode = "open"; switch (pSlot->mode()) { case QJACKCTL_SLOTMODE_HALF: sSlotMode = "half"; break; case QJACKCTL_SLOTMODE_FULL: sSlotMode = "full"; break; } eSlot.setAttribute("mode", sSlotMode); if (pSlot->outputSocket()) eSlot.setAttribute("output", pSlot->outputSocket()->name()); if (pSlot->inputSocket()) eSlot.setAttribute("input", pSlot->inputSocket()->name()); // Add this slot... eSlots.appendChild(eSlot); } eRoot.appendChild(eSlots); // Save cables spec... QDomElement eCables = doc.createElement("cables"); QListIterator cablit(pPatchbay->cablelist()); while (cablit.hasNext()) { qjackctlPatchbayCable *pCable = cablit.next(); if (pCable->outputSocket() && pCable->inputSocket()) { QDomElement eCable = doc.createElement("cable"); eCable.setAttribute("type", qjackctlPatchbaySocket::textFromType( pCable->outputSocket()->type())); eCable.setAttribute("output", pCable->outputSocket()->name()); eCable.setAttribute("input", pCable->inputSocket()->name()); eCables.appendChild(eCable); } } eRoot.appendChild(eCables); // Finally, we're ready to save to external file. QFile file(sFilename); if (!file.open(QIODevice::WriteOnly | QIODevice::Truncate)) return false; QTextStream ts(&file); ts << doc.toString() << endl; file.close(); return true; } // qjackctlPatchbayFile.cpp qjackctl-0.4.2/src/PaxHeaders.14935/qjackctlAboutForm.ui0000644000000000000000000000013212700760152017614 xustar0030 mtime=1459871850.616906788 30 atime=1459871850.616906788 30 ctime=1459871850.616906788 qjackctl-0.4.2/src/qjackctlAboutForm.ui0000644000175000001440000001072412700760152020364 0ustar00rncbcusers00000000000000 rncbc aka Rui Nuno Capela JACK Audio Connection Kit - Qt GUI Interface. Copyright (C) 2003-2015, rncbc aka Rui Nuno Capela. All rights reserved. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. qjackctlAboutForm 0 0 520 280 About QjackCtl :/images/about1.png true 4 4 4 4 4 Qt::Horizontal 8 8 &Close Qt::TabFocus About Qt :/images/qtlogo.png Qt::Vertical 8 8 1 false true true 32 32 QFrame::NoFrame :/images/qjackctl.png true Qt::AlignCenter false 2 AboutTextView AboutQtButton ClosePushButton qjackctl-0.4.2/src/PaxHeaders.14935/qjackctlPatchbayRack.cpp0000644000000000000000000000013212700760152020417 xustar0030 mtime=1459871850.623910288 30 atime=1459871850.622909789 30 ctime=1459871850.623910288 qjackctl-0.4.2/src/qjackctlPatchbayRack.cpp0000644000175000001440000013260212700760152021167 0ustar00rncbcusers00000000000000// qjackctlPatchbayRack.cpp // /**************************************************************************** Copyright (C) 2003-2015, rncbc aka Rui Nuno Capela. All rights reserved. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. *****************************************************************************/ #include "qjackctlPatchbayRack.h" // Aliases accessors. #include "qjackctlConnectAlias.h" #include //---------------------------------------------------------------------- // class qjackctlPatchbaySnapshot -- Patchbay snapshot infrastructure. // #include class qjackctlPatchbaySnapshot { public: // Constructor. qjackctlPatchbaySnapshot() {}; // Cleanup. void clear() { m_hash.clear(); } // Prepare/add snapshot connection item. void append ( const QString& sOClientName, const QString& sOPortName, const QString& sIClientName, const QString& sIPortName ) { Ports& ports = m_hash[sOClientName + ':' + sIClientName]; ports.outs.append(sOPortName); ports.ins.append(sIPortName); } // Commit snapshot into patchbay rack. void commit ( qjackctlPatchbayRack *pRack, int iSocketType ) { QHash::Iterator iter = m_hash.begin(); for ( ; iter != m_hash.end(); ++iter) { const QString& sKey = iter.key(); const QString& sOClient = sKey.section(':', 0, 0); const QString& sIClient = sKey.section(':', 1); Ports& ports = iter.value(); qjackctlPatchbaySocket *pOSocket = get_socket( pRack->osocketlist(), sOClient, ports.outs, iSocketType); qjackctlPatchbaySocket *pISocket = get_socket( pRack->isocketlist(), sIClient, ports.ins, iSocketType); pRack->addCable(new qjackctlPatchbayCable(pOSocket, pISocket)); } m_hash.clear(); } // Find first existing socket. static qjackctlPatchbaySocket *find_socket ( QList& socketlist, const QString& sClientName, int iSocketType ) { QListIterator iter(socketlist); while (iter.hasNext()) { qjackctlPatchbaySocket *pSocket = iter.next(); if (QRegExp(pSocket->clientName()).exactMatch(sClientName) && pSocket->type() == iSocketType) { return pSocket; } } return NULL; } // Add socket plug. static void add_socket ( QList& socketlist, const QString& sClientName, const QString& sPortName, int iSocketType ) { qjackctlPatchbaySocket *pSocket = find_socket(socketlist, sClientName, iSocketType); if (pSocket == NULL) { pSocket = new qjackctlPatchbaySocket(sClientName, qjackctlClientAlias::escapeRegExpDigits(sClientName), iSocketType); socketlist.append(pSocket); } pSocket->addPlug( qjackctlClientAlias::escapeRegExpDigits(sPortName)); } // Get client socket into rack (socket list). static qjackctlPatchbaySocket *get_socket ( QList& socketlist, const QString& sClientName, const QStringList& ports, int iSocketType ) { int iSocket = 0; qjackctlPatchbaySocket *pSocket = NULL; QListIterator iter(socketlist); while (iter.hasNext()) { pSocket = iter.next(); if (QRegExp(pSocket->clientName()).exactMatch(sClientName) && pSocket->type() == iSocketType) { QStringListIterator plug_iter(pSocket->pluglist()); QStringListIterator port_iter(ports); bool bMatch = true; while (bMatch && plug_iter.hasNext() && port_iter.hasNext()) { const QString& sPlug = plug_iter.next(); const QString& sPort = port_iter.next(); bMatch = (QRegExp(sPlug).exactMatch(sPort)); } if (bMatch) return pSocket; iSocket++; } } QString sSocketName = sClientName; if (iSocket > 0) sSocketName += ' ' + QString::number(iSocket + 1); pSocket = new qjackctlPatchbaySocket(sSocketName, qjackctlClientAlias::escapeRegExpDigits(sClientName), iSocketType); QStringListIterator port_iter(ports); while (port_iter.hasNext()) { pSocket->addPlug( qjackctlClientAlias::escapeRegExpDigits(port_iter.next())); } socketlist.append(pSocket); return pSocket; } private: // Snapshot instance variables. struct Ports { QStringList outs; QStringList ins; }; QHash m_hash; }; //---------------------------------------------------------------------- // class qjackctlPatchbaySocket -- Patchbay socket implementation. // // Constructor. qjackctlPatchbaySocket::qjackctlPatchbaySocket ( const QString& sSocketName, const QString& sClientName, int iSocketType ) { m_sSocketName = sSocketName; m_sClientName = sClientName; m_iSocketType = iSocketType; m_bExclusive = false; m_sSocketForward.clear(); } // Default destructor. qjackctlPatchbaySocket::~qjackctlPatchbaySocket (void) { m_pluglist.clear(); } // Socket property accessors. const QString& qjackctlPatchbaySocket::name (void) const { return m_sSocketName; } const QString& qjackctlPatchbaySocket::clientName (void) const { return m_sClientName; } int qjackctlPatchbaySocket::type (void) const { return m_iSocketType; } bool qjackctlPatchbaySocket::isExclusive (void) const { return m_bExclusive; } const QString& qjackctlPatchbaySocket::forward (void) const { return m_sSocketForward; } // Slot property methods. void qjackctlPatchbaySocket::setName ( const QString& sSocketName ) { m_sSocketName = sSocketName; } void qjackctlPatchbaySocket::setClientName ( const QString& sClientName ) { m_sClientName = sClientName; } void qjackctlPatchbaySocket::setType ( int iSocketType ) { m_iSocketType = iSocketType; } void qjackctlPatchbaySocket::setExclusive ( bool bExclusive ) { m_bExclusive = bExclusive; } void qjackctlPatchbaySocket::setForward ( const QString& sSocketForward ) { m_sSocketForward = sSocketForward; } // Plug list primitive methods. void qjackctlPatchbaySocket::addPlug ( const QString& sPlugName ) { m_pluglist.append(sPlugName); } void qjackctlPatchbaySocket::removePlug ( const QString& sPlugName ) { int iPlug = m_pluglist.indexOf(sPlugName); if (iPlug >= 0) m_pluglist.removeAt(iPlug); } // Plug list accessor. QStringList& qjackctlPatchbaySocket::pluglist (void) { return m_pluglist; } // Simple socket type methods. int qjackctlPatchbaySocket::typeFromText ( const QString& sSocketType ) { int iSocketType = QJACKCTL_SOCKETTYPE_DEFAULT; if (sSocketType == "jack-audio" || sSocketType == "audio") iSocketType = QJACKCTL_SOCKETTYPE_JACK_AUDIO; else if (sSocketType == "jack-midi") iSocketType = QJACKCTL_SOCKETTYPE_JACK_MIDI; else if (sSocketType == "alsa-midi" || sSocketType == "midi") iSocketType = QJACKCTL_SOCKETTYPE_ALSA_MIDI; return iSocketType; } QString qjackctlPatchbaySocket::textFromType ( int iSocketType ) { QString sSocketType; switch (iSocketType) { case QJACKCTL_SOCKETTYPE_JACK_AUDIO: sSocketType = "jack-audio"; break; case QJACKCTL_SOCKETTYPE_JACK_MIDI: sSocketType = "jack-midi"; break; case QJACKCTL_SOCKETTYPE_ALSA_MIDI: sSocketType = "alsa-midi"; break; default: break; } return sSocketType; } //---------------------------------------------------------------------- // class qjackctlPatchbaySlot -- Patchbay socket slot implementation. // // Constructor. qjackctlPatchbaySlot::qjackctlPatchbaySlot ( const QString& sSlotName, int iSlotMode ) { m_pOutputSocket = NULL; m_pInputSocket = NULL; m_sSlotName = sSlotName; m_iSlotMode = iSlotMode; } // Default destructor. qjackctlPatchbaySlot::~qjackctlPatchbaySlot (void) { setOutputSocket(NULL); setInputSocket(NULL); } // Slot property accessors. const QString& qjackctlPatchbaySlot::name (void) const { return m_sSlotName; } int qjackctlPatchbaySlot::mode (void) const { return m_iSlotMode; } // Slot property methods. void qjackctlPatchbaySlot::setName ( const QString& sSlotName ) { m_sSlotName = sSlotName; } void qjackctlPatchbaySlot::setMode ( int iSlotMode ) { m_iSlotMode = iSlotMode; } // Socket methods. void qjackctlPatchbaySlot::setOutputSocket ( qjackctlPatchbaySocket *pSocket ) { m_pOutputSocket = pSocket; } void qjackctlPatchbaySlot::setInputSocket ( qjackctlPatchbaySocket *pSocket ) { m_pInputSocket = pSocket; } // Socket accessors. qjackctlPatchbaySocket *qjackctlPatchbaySlot::outputSocket (void) const { return m_pOutputSocket; } qjackctlPatchbaySocket *qjackctlPatchbaySlot::inputSocket (void) const { return m_pInputSocket; } //---------------------------------------------------------------------- // class qjackctlPatchbayCable -- Patchbay cable connection implementation. // // Constructor. qjackctlPatchbayCable::qjackctlPatchbayCable ( qjackctlPatchbaySocket *pOutputSocket, qjackctlPatchbaySocket *pInputSocket ) { m_pOutputSocket = pOutputSocket; m_pInputSocket = pInputSocket; } // Default destructor. qjackctlPatchbayCable::~qjackctlPatchbayCable (void) { setOutputSocket(NULL); setInputSocket(NULL); } // Socket methods. void qjackctlPatchbayCable::setOutputSocket ( qjackctlPatchbaySocket *pSocket ) { m_pOutputSocket = pSocket; } void qjackctlPatchbayCable::setInputSocket ( qjackctlPatchbaySocket *pSocket ) { m_pInputSocket = pSocket; } // Socket accessors. qjackctlPatchbaySocket *qjackctlPatchbayCable::outputSocket (void) const { return m_pOutputSocket; } qjackctlPatchbaySocket *qjackctlPatchbayCable::inputSocket (void) const { return m_pInputSocket; } //---------------------------------------------------------------------- // class qjackctlPatchbayRack -- Patchbay rack profile implementation. // // Constructor. qjackctlPatchbayRack::qjackctlPatchbayRack (void) { m_pJackClient = NULL; m_ppszOAudioPorts = NULL; m_ppszIAudioPorts = NULL; m_ppszOMidiPorts = NULL; m_ppszIMidiPorts = NULL; // MIDI connection persistence cache variables. m_pAlsaSeq = NULL; } // Default destructor. qjackctlPatchbayRack::~qjackctlPatchbayRack (void) { clear(); } // Common socket list primitive methods. void qjackctlPatchbayRack::addSocket ( QList& socketlist, qjackctlPatchbaySocket *pSocket ) { qjackctlPatchbaySocket *pSocketPtr = findSocket(socketlist, pSocket->name()); if (pSocketPtr) removeSocket(socketlist, pSocketPtr); socketlist.append(pSocket); } void qjackctlPatchbayRack::removeSocket ( QList& socketlist, qjackctlPatchbaySocket *pSocket ) { int iSocket = socketlist.indexOf(pSocket); if (iSocket >= 0) { socketlist.removeAt(iSocket); delete pSocket; } } // Slot list primitive methods. void qjackctlPatchbayRack::addSlot ( qjackctlPatchbaySlot *pSlot ) { qjackctlPatchbaySlot *pSlotPtr = findSlot(pSlot->name()); if (pSlotPtr) removeSlot(pSlotPtr); m_slotlist.append(pSlot); } void qjackctlPatchbayRack::removeSlot ( qjackctlPatchbaySlot *pSlot ) { int iSlot = m_slotlist.indexOf(pSlot); if (iSlot >= 0) { m_slotlist.removeAt(iSlot); delete pSlot; } } // Cable list primitive methods. void qjackctlPatchbayRack::addCable ( qjackctlPatchbayCable *pCable ) { qjackctlPatchbayCable *pCablePtr = findCable(pCable); if (pCablePtr) removeCable(pCablePtr); m_cablelist.append(pCable); } void qjackctlPatchbayRack::removeCable ( qjackctlPatchbayCable *pCable ) { int iCable = m_cablelist.indexOf(pCable); if (iCable >= 0) { m_cablelist.removeAt(iCable); delete pCable; } } // Common socket finders. qjackctlPatchbaySocket *qjackctlPatchbayRack::findSocket ( QList& socketlist, const QString& sSocketName, int iSocketType ) { QListIterator iter(socketlist); while (iter.hasNext()) { qjackctlPatchbaySocket *pSocket = iter.next(); if (sSocketName == pSocket->name() && (iSocketType == QJACKCTL_SOCKETTYPE_DEFAULT || iSocketType == pSocket->type())) return pSocket; } return NULL; } // Patchbay socket slot finders. qjackctlPatchbaySlot *qjackctlPatchbayRack::findSlot ( const QString& sSlotName ) { QListIterator iter(m_slotlist); while (iter.hasNext()) { qjackctlPatchbaySlot *pSlot = iter.next(); if (sSlotName == pSlot->name()) return pSlot; } return NULL; } // Cable finders. qjackctlPatchbayCable *qjackctlPatchbayRack::findCable ( const QString& sOutputSocket, const QString& sInputSocket ) { qjackctlPatchbaySocket *pSocket; QListIterator iter(m_cablelist); while (iter.hasNext()) { qjackctlPatchbayCable *pCable = iter.next(); pSocket = pCable->outputSocket(); if (pSocket && sOutputSocket == pSocket->name()) { pSocket = pCable->inputSocket(); if (pSocket && sInputSocket == pSocket->name()) return pCable; } } return NULL; } qjackctlPatchbayCable *qjackctlPatchbayRack::findCable ( qjackctlPatchbayCable *pCablePtr ) { QString sOutputSocket; if (pCablePtr->outputSocket()) sOutputSocket = pCablePtr->outputSocket()->name(); QString sInputSocket; if (pCablePtr->inputSocket()) sInputSocket = pCablePtr->inputSocket()->name(); return findCable(sOutputSocket, sInputSocket); } // Cable finder (logical matching by client/port names). qjackctlPatchbayCable *qjackctlPatchbayRack::findCable ( const QString& sOClientName, const QString& sOPortName, const QString& sIClientName, const QString& sIPortName, int iSocketType ) { // This is a regex prefix needed for ALSA MDII // as client and port names include id-number+colon... QString sPrefix; if (iSocketType == QJACKCTL_SOCKETTYPE_ALSA_MIDI) sPrefix = "[0-9]+:"; // Scan from output-socket list... QListIterator osocket(m_osocketlist); while (osocket.hasNext()) { qjackctlPatchbaySocket *pOSocket = osocket.next(); if (pOSocket->type() != iSocketType) continue; // Output socket client name match? if (!QRegExp(sPrefix + pOSocket->clientName()) .exactMatch(sOClientName)) continue; // Output plug port names match? QStringListIterator oplug(pOSocket->pluglist()); while (oplug.hasNext()) { if (!QRegExp(sPrefix + oplug.next()) .exactMatch(sOPortName)) continue; // Scan for output-socket cable... QListIterator cable(m_cablelist); while (cable.hasNext()) { qjackctlPatchbayCable *pCable = cable.next(); if (pCable->outputSocket() != pOSocket) continue; qjackctlPatchbaySocket *pISocket = pCable->inputSocket(); // Input socket client name match? if (!QRegExp(sPrefix + pISocket->clientName()) .exactMatch(sIClientName)) continue; // Input plug port names match? QStringListIterator iplug(pISocket->pluglist()); while (iplug.hasNext()) { // Found it? if (QRegExp(sPrefix + iplug.next()) .exactMatch(sIPortName)) return pCable; } } } } // No matching cable was found. return NULL; } // Patckbay cleaners. void qjackctlPatchbayRack::clear (void) { qDeleteAll(m_cablelist); m_cablelist.clear(); qDeleteAll(m_slotlist); m_slotlist.clear(); qDeleteAll(m_isocketlist); m_isocketlist.clear(); qDeleteAll(m_osocketlist); m_osocketlist.clear(); } // Patchbay rack output sockets list accessor. QList& qjackctlPatchbayRack::osocketlist (void) { return m_osocketlist; } // Patchbay rack input sockets list accessor. QList& qjackctlPatchbayRack::isocketlist (void) { return m_isocketlist; } // Patchbay rack slots list accessor. QList& qjackctlPatchbayRack::slotlist (void) { return m_slotlist; } // Patchbay cable connections list accessor. QList& qjackctlPatchbayRack::cablelist (void) { return m_cablelist; } // Lookup for the n-th JACK client port // that matches the given regular expression... const char *qjackctlPatchbayRack::findJackPort ( const char **ppszJackPorts, const QString& sClientName, const QString& sPortName, int n ) { QRegExp rxClientName(sClientName); QRegExp rxPortName(sPortName); int i = 0; int iClientPort = 0; while (ppszJackPorts[iClientPort]) { QString sClientPort = QString::fromUtf8(ppszJackPorts[iClientPort]); int iColon = sClientPort.indexOf(':'); if (iColon >= 0) { if (rxClientName.exactMatch(sClientPort.left(iColon)) && rxPortName.exactMatch(sClientPort.right( sClientPort.length() - iColon - 1))) { if (++i > n) return ppszJackPorts[iClientPort]; } } iClientPort++; } return NULL; } // JACK port-pair connection executive IS DEPRECATED! void qjackctlPatchbayRack::connectJackPorts ( const char *pszOutputPort, const char *pszInputPort ) { unsigned int uiCableFlags = QJACKCTL_CABLE_FAILED; if (jack_connect(m_pJackClient, pszOutputPort, pszInputPort) == 0) uiCableFlags = QJACKCTL_CABLE_CONNECTED; emit cableConnected( pszOutputPort, pszInputPort, uiCableFlags); } // JACK port-pair disconnection executive. void qjackctlPatchbayRack::disconnectJackPorts ( const char *pszOutputPort, const char *pszInputPort ) { unsigned int uiCableFlags = QJACKCTL_CABLE_FAILED; if (jack_disconnect(m_pJackClient, pszOutputPort, pszInputPort) == 0) uiCableFlags = QJACKCTL_CABLE_DISCONNECTED; emit cableConnected( pszOutputPort, pszInputPort, uiCableFlags); } // JACK port-pair connection notifier. void qjackctlPatchbayRack::checkJackPorts ( const char *pszOutputPort, const char *pszInputPort ) { emit cableConnected( pszOutputPort, pszInputPort, QJACKCTL_CABLE_CHECKED); } // Check and enforce if an audio output client:port is connected to one input. void qjackctlPatchbayRack::connectJackSocketPorts ( qjackctlPatchbaySocket *pOutputSocket, const char *pszOutputPort, qjackctlPatchbaySocket *pInputSocket, const char *pszInputPort ) { bool bConnected = false; // Check for inputs from output... const char **ppszInputPorts = jack_port_get_all_connections( m_pJackClient, jack_port_by_name(m_pJackClient, pszOutputPort)); if (ppszInputPorts) { for (int i = 0 ; ppszInputPorts[i]; i++) { if (strcmp(ppszInputPorts[i], pszInputPort) == 0) bConnected = true; else if (pOutputSocket->isExclusive()) disconnectJackPorts(pszOutputPort, ppszInputPorts[i]); } ::free(ppszInputPorts); } // Check for outputs from input, if the input socket is on exclusive mode... if (pInputSocket->isExclusive()) { const char **ppszOutputPorts = jack_port_get_all_connections( m_pJackClient, jack_port_by_name(m_pJackClient, pszInputPort)); if (ppszOutputPorts) { for (int i = 0 ; ppszOutputPorts[i]; i++) { if (strcmp(ppszOutputPorts[i], pszOutputPort) == 0) bConnected = true; else disconnectJackPorts(ppszOutputPorts[i], pszInputPort); } ::free(ppszOutputPorts); } } // Finally do the connection?... if (!bConnected) { connectJackPorts(pszOutputPort, pszInputPort); } else { emit cableConnected( pszOutputPort, pszInputPort, QJACKCTL_CABLE_CHECKED); } } // Check and maint whether an JACK socket pair is fully connected. void qjackctlPatchbayRack::connectJackCable ( qjackctlPatchbaySocket *pOutputSocket, qjackctlPatchbaySocket *pInputSocket ) { if (pOutputSocket == NULL || pInputSocket == NULL) return; if (pOutputSocket->type() != pInputSocket->type()) return; const char **ppszOutputPorts = NULL; const char **ppszInputPorts = NULL; if (pOutputSocket->type() == QJACKCTL_SOCKETTYPE_JACK_AUDIO) { ppszOutputPorts = m_ppszOAudioPorts; ppszInputPorts = m_ppszIAudioPorts; } else if (pOutputSocket->type() == QJACKCTL_SOCKETTYPE_JACK_MIDI) { ppszOutputPorts = m_ppszOMidiPorts; ppszInputPorts = m_ppszIMidiPorts; } if (ppszOutputPorts == NULL || ppszInputPorts == NULL) return; // Iterate on each corresponding plug... QStringListIterator iterOutputPlug(pOutputSocket->pluglist()); QStringListIterator iterInputPlug(pInputSocket->pluglist()); while (iterOutputPlug.hasNext() && iterInputPlug.hasNext()) { const QString& sOutputPlug = iterOutputPlug.next(); const QString& sInputPlug = iterInputPlug.next(); // Check audio port connection sequentially... int iOPort = 0; const char *pszOutputPort; while ((pszOutputPort = findJackPort(ppszOutputPorts, pOutputSocket->clientName(), sOutputPlug, iOPort)) != NULL) { int iIPort = 0; const char *pszInputPort; while ((pszInputPort = findJackPort(ppszInputPorts, pInputSocket->clientName(), sInputPlug, iIPort)) != NULL) { connectJackSocketPorts( pOutputSocket, pszOutputPort, pInputSocket, pszInputPort); iIPort++; } iOPort++; } } } // Main JACK cable connect persistance scan cycle. void qjackctlPatchbayRack::connectJackScan ( jack_client_t *pJackClient ) { if (pJackClient == NULL || m_pJackClient) return; // Cache client descriptor. m_pJackClient = pJackClient; // Cache all current audio client-ports... m_ppszOAudioPorts = jack_get_ports(m_pJackClient, 0, JACK_DEFAULT_AUDIO_TYPE, JackPortIsOutput); m_ppszIAudioPorts = jack_get_ports(m_pJackClient, 0, JACK_DEFAULT_AUDIO_TYPE, JackPortIsInput); #ifdef CONFIG_JACK_MIDI // Cache all current MIDI client-ports... m_ppszOMidiPorts = jack_get_ports(m_pJackClient, 0, JACK_DEFAULT_MIDI_TYPE, JackPortIsOutput); m_ppszIMidiPorts = jack_get_ports(m_pJackClient, 0, JACK_DEFAULT_MIDI_TYPE, JackPortIsInput); #else m_ppszOMidiPorts = NULL; m_ppszIMidiPorts = NULL; #endif // Start looking for connections... QListIterator iter(m_cablelist); while (iter.hasNext()) { qjackctlPatchbayCable *pCable = iter.next(); connectJackCable( pCable->outputSocket(), pCable->inputSocket()); } // Forward sockets... connectForwardScan(QJACKCTL_SOCKETTYPE_JACK_AUDIO); #ifdef CONFIG_JACK_MIDI connectForwardScan(QJACKCTL_SOCKETTYPE_JACK_MIDI); #endif // Free client-ports caches... if (m_ppszOAudioPorts) ::free(m_ppszOAudioPorts); if (m_ppszIAudioPorts) ::free(m_ppszIAudioPorts); #ifdef CONFIG_JACK_MIDI if (m_ppszOMidiPorts) ::free(m_ppszOMidiPorts); if (m_ppszIMidiPorts) ::free(m_ppszIMidiPorts); #endif // Reset cached pointers. m_ppszOAudioPorts = NULL; m_ppszIAudioPorts = NULL; m_ppszOMidiPorts = NULL; m_ppszIMidiPorts = NULL; m_pJackClient = NULL; } // Load all midi available midi ports of a given type. void qjackctlPatchbayRack::loadAlsaPorts ( QList& midiports, bool bReadable ) { if (m_pAlsaSeq == NULL) return; qDeleteAll(midiports); midiports.clear(); #ifdef CONFIG_ALSA_SEQ unsigned int uiAlsaFlags; if (bReadable) uiAlsaFlags = SND_SEQ_PORT_CAP_READ | SND_SEQ_PORT_CAP_SUBS_READ; else uiAlsaFlags = SND_SEQ_PORT_CAP_WRITE | SND_SEQ_PORT_CAP_SUBS_WRITE; snd_seq_client_info_t *pClientInfo; snd_seq_port_info_t *pPortInfo; snd_seq_client_info_alloca(&pClientInfo); snd_seq_port_info_alloca(&pPortInfo); snd_seq_client_info_set_client(pClientInfo, -1); while (snd_seq_query_next_client(m_pAlsaSeq, pClientInfo) >= 0) { int iAlsaClient = snd_seq_client_info_get_client(pClientInfo); if (iAlsaClient > 0) { QString sClientName = snd_seq_client_info_get_name(pClientInfo); snd_seq_port_info_set_client(pPortInfo, iAlsaClient); snd_seq_port_info_set_port(pPortInfo, -1); while (snd_seq_query_next_port(m_pAlsaSeq, pPortInfo) >= 0) { unsigned int uiPortCapability = snd_seq_port_info_get_capability(pPortInfo); if (((uiPortCapability & uiAlsaFlags) == uiAlsaFlags) && ((uiPortCapability & SND_SEQ_PORT_CAP_NO_EXPORT) == 0)) { qjackctlAlsaMidiPort *pMidiPort = new qjackctlAlsaMidiPort; pMidiPort->sClientName = sClientName; pMidiPort->iAlsaClient = iAlsaClient; pMidiPort->sPortName = snd_seq_port_info_get_name(pPortInfo); pMidiPort->iAlsaPort = snd_seq_port_info_get_port(pPortInfo); midiports.append(pMidiPort); } } } } #endif // CONFIG_ALSA_SEQ } // Get current connections from given MIDI port. void qjackctlPatchbayRack::loadAlsaConnections ( QList& midiports, qjackctlAlsaMidiPort *pMidiPort, bool bReadable ) { qDeleteAll(midiports); midiports.clear(); #ifdef CONFIG_ALSA_SEQ snd_seq_query_subs_type_t snd_subs_type; if (bReadable) snd_subs_type = SND_SEQ_QUERY_SUBS_READ; else snd_subs_type = SND_SEQ_QUERY_SUBS_WRITE; snd_seq_query_subscribe_t *pAlsaSubs; snd_seq_addr_t seq_addr; snd_seq_query_subscribe_alloca(&pAlsaSubs); snd_seq_query_subscribe_set_type(pAlsaSubs, snd_subs_type); snd_seq_query_subscribe_set_index(pAlsaSubs, 0); seq_addr.client = pMidiPort->iAlsaClient; seq_addr.port = pMidiPort->iAlsaPort; snd_seq_query_subscribe_set_root(pAlsaSubs, &seq_addr); while (snd_seq_query_port_subscribers(m_pAlsaSeq, pAlsaSubs) >= 0) { seq_addr = *snd_seq_query_subscribe_get_addr(pAlsaSubs); qjackctlAlsaMidiPort *pPort = new qjackctlAlsaMidiPort; setAlsaPort(pPort, seq_addr.client, seq_addr.port); midiports.append(pPort); snd_seq_query_subscribe_set_index(pAlsaSubs, snd_seq_query_subscribe_get_index(pAlsaSubs) + 1); } #endif // CONFIG_ALSA_SEQ } // Lookup for the n-th MIDI client port that matches the given regular expression... qjackctlAlsaMidiPort *qjackctlPatchbayRack::findAlsaPort ( QList& midiports, const QString& sClientName, const QString& sPortName, int n ) { QRegExp rxClientName(sClientName); QRegExp rxPortName(sPortName); int i = 0; // For each port... QListIterator iter(midiports); while (iter.hasNext()) { qjackctlAlsaMidiPort *pMidiPort = iter.next(); if (rxClientName.exactMatch(pMidiPort->sClientName) && rxPortName.exactMatch(pMidiPort->sPortName)) { if (++i > n) return pMidiPort; } } return NULL; } // MIDI port-pair name string. QString qjackctlPatchbayRack::getAlsaPortName ( qjackctlAlsaMidiPort *pMidiPort ) { return QString::number(pMidiPort->iAlsaClient) + ':' + QString::number(pMidiPort->iAlsaPort) + ' ' + pMidiPort->sClientName; } // MIDI port-pair name string. void qjackctlPatchbayRack::setAlsaPort ( qjackctlAlsaMidiPort *pMidiPort, int iAlsaClient, int iAlsaPort ) { #ifdef CONFIG_ALSA_SEQ snd_seq_client_info_t *pClientInfo; snd_seq_port_info_t *pPortInfo; snd_seq_client_info_alloca(&pClientInfo); snd_seq_port_info_alloca(&pPortInfo); pMidiPort->iAlsaClient = iAlsaClient; pMidiPort->iAlsaPort = iAlsaPort; if (snd_seq_get_any_client_info(m_pAlsaSeq, iAlsaClient, pClientInfo) == 0) pMidiPort->sClientName = snd_seq_client_info_get_name(pClientInfo); if (snd_seq_get_any_port_info(m_pAlsaSeq, iAlsaClient, iAlsaPort, pPortInfo) == 0) pMidiPort->sPortName = snd_seq_port_info_get_name(pPortInfo); #endif // CONFIG_ALSA_SEQ } // MIDI port-pair connection executive. void qjackctlPatchbayRack::connectAlsaPorts ( qjackctlAlsaMidiPort *pOutputPort, qjackctlAlsaMidiPort *pInputPort ) { #ifdef CONFIG_ALSA_SEQ unsigned int uiCableFlags = QJACKCTL_CABLE_FAILED; snd_seq_port_subscribe_t *pAlsaSubs; snd_seq_addr_t seq_addr; snd_seq_port_subscribe_alloca(&pAlsaSubs); seq_addr.client = pOutputPort->iAlsaClient; seq_addr.port = pOutputPort->iAlsaPort; snd_seq_port_subscribe_set_sender(pAlsaSubs, &seq_addr); seq_addr.client = pInputPort->iAlsaClient; seq_addr.port = pInputPort->iAlsaPort; snd_seq_port_subscribe_set_dest(pAlsaSubs, &seq_addr); if (snd_seq_subscribe_port(m_pAlsaSeq, pAlsaSubs) == 0) uiCableFlags = QJACKCTL_CABLE_CONNECTED; emit cableConnected( getAlsaPortName(pOutputPort), getAlsaPortName(pInputPort), uiCableFlags); #endif // CONFIG_ALSA_SEQ } // MIDI port-pair disconnection executive. void qjackctlPatchbayRack::disconnectAlsaPorts ( qjackctlAlsaMidiPort *pOutputPort, qjackctlAlsaMidiPort *pInputPort ) { #ifdef CONFIG_ALSA_SEQ unsigned int uiCableFlags = QJACKCTL_CABLE_FAILED; snd_seq_port_subscribe_t *pAlsaSubs; snd_seq_addr_t seq_addr; snd_seq_port_subscribe_alloca(&pAlsaSubs); seq_addr.client = pOutputPort->iAlsaClient; seq_addr.port = pOutputPort->iAlsaPort; snd_seq_port_subscribe_set_sender(pAlsaSubs, &seq_addr); seq_addr.client = pInputPort->iAlsaClient; seq_addr.port = pInputPort->iAlsaPort; snd_seq_port_subscribe_set_dest(pAlsaSubs, &seq_addr); if (snd_seq_unsubscribe_port(m_pAlsaSeq, pAlsaSubs) == 0) uiCableFlags = QJACKCTL_CABLE_DISCONNECTED; emit cableConnected( getAlsaPortName(pOutputPort), getAlsaPortName(pInputPort), uiCableFlags); #endif // CONFIG_ALSA_SEQ } // MIDI port-pair disconnection notifier. void qjackctlPatchbayRack::checkAlsaPorts ( qjackctlAlsaMidiPort *pOutputPort, qjackctlAlsaMidiPort *pInputPort ) { emit cableConnected( getAlsaPortName(pOutputPort), getAlsaPortName(pInputPort), QJACKCTL_CABLE_CHECKED); } // Check and enforce if a midi output client:port is connected to one input. void qjackctlPatchbayRack::connectAlsaSocketPorts ( qjackctlPatchbaySocket *pOutputSocket, qjackctlAlsaMidiPort *pOutputPort, qjackctlPatchbaySocket *pInputSocket, qjackctlAlsaMidiPort *pInputPort ) { #ifdef CONFIG_ALSA_SEQ bool bConnected = false; snd_seq_query_subscribe_t *pAlsaSubs; snd_seq_addr_t seq_addr; snd_seq_query_subscribe_alloca(&pAlsaSubs); // Check for inputs from output... snd_seq_query_subscribe_set_type(pAlsaSubs, SND_SEQ_QUERY_SUBS_READ); snd_seq_query_subscribe_set_index(pAlsaSubs, 0); seq_addr.client = pOutputPort->iAlsaClient; seq_addr.port = pOutputPort->iAlsaPort; snd_seq_query_subscribe_set_root(pAlsaSubs, &seq_addr); while (snd_seq_query_port_subscribers(m_pAlsaSeq, pAlsaSubs) >= 0) { seq_addr = *snd_seq_query_subscribe_get_addr(pAlsaSubs); if (seq_addr.client == pInputPort->iAlsaClient && seq_addr.port == pInputPort->iAlsaPort) bConnected = true; else if (pOutputSocket->isExclusive()) { qjackctlAlsaMidiPort iport; setAlsaPort(&iport, seq_addr.client, seq_addr.port); disconnectAlsaPorts(pOutputPort, &iport); } snd_seq_query_subscribe_set_index(pAlsaSubs, snd_seq_query_subscribe_get_index(pAlsaSubs) + 1); } // Check for outputs from input, if the input socket is on exclusive mode... if (pInputSocket->isExclusive()) { snd_seq_query_subscribe_set_type(pAlsaSubs, SND_SEQ_QUERY_SUBS_WRITE); snd_seq_query_subscribe_set_index(pAlsaSubs, 0); seq_addr.client = pInputPort->iAlsaClient; seq_addr.port = pInputPort->iAlsaPort; snd_seq_query_subscribe_set_root(pAlsaSubs, &seq_addr); while (snd_seq_query_port_subscribers(m_pAlsaSeq, pAlsaSubs) >= 0) { seq_addr = *snd_seq_query_subscribe_get_addr(pAlsaSubs); if (seq_addr.client == pOutputPort->iAlsaClient && seq_addr.port == pOutputPort->iAlsaPort) bConnected = true; else if (pInputSocket->isExclusive()) { qjackctlAlsaMidiPort oport; setAlsaPort(&oport, seq_addr.client, seq_addr.port); disconnectAlsaPorts(&oport, pInputPort); } snd_seq_query_subscribe_set_index(pAlsaSubs, snd_seq_query_subscribe_get_index(pAlsaSubs) + 1); } } // Finally do the connection?... if (!bConnected) { connectAlsaPorts(pOutputPort, pInputPort); } else { emit cableConnected( getAlsaPortName(pOutputPort), getAlsaPortName(pInputPort), QJACKCTL_CABLE_CHECKED); } #endif // CONFIG_ALSA_SEQ } // Check and maint whether a MIDI socket pair is fully connected. void qjackctlPatchbayRack::connectAlsaCable ( qjackctlPatchbaySocket *pOutputSocket, qjackctlPatchbaySocket *pInputSocket ) { if (pOutputSocket == NULL || pInputSocket == NULL) return; if (pOutputSocket->type() != pInputSocket->type() || pOutputSocket->type() != QJACKCTL_SOCKETTYPE_ALSA_MIDI) return; // Iterate on each corresponding plug... QStringListIterator iterOutputPlug(pOutputSocket->pluglist()); QStringListIterator iterInputPlug(pInputSocket->pluglist()); while (iterOutputPlug.hasNext() && iterInputPlug.hasNext()) { const QString& sOutputPlug = iterOutputPlug.next(); const QString& sInputPlug = iterInputPlug.next(); // Check MIDI port connection sequentially... int iOPort = 0; qjackctlAlsaMidiPort *pOutputPort; while ((pOutputPort = findAlsaPort(m_omidiports, pOutputSocket->clientName(), sOutputPlug, iOPort)) != NULL) { int iIPort = 0; qjackctlAlsaMidiPort *pInputPort; while ((pInputPort = findAlsaPort(m_imidiports, pInputSocket->clientName(), sInputPlug, iIPort)) != NULL) { connectAlsaSocketPorts( pOutputSocket, pOutputPort, pInputSocket, pInputPort); iIPort++; } iOPort++; } } } // Overloaded MIDI cable connect persistance scan cycle. void qjackctlPatchbayRack::connectAlsaScan ( snd_seq_t *pAlsaSeq ) { if (pAlsaSeq == NULL || m_pAlsaSeq) return; // Cache sequencer descriptor. m_pAlsaSeq = pAlsaSeq; // Cache all current output client-ports... loadAlsaPorts(m_omidiports, true); loadAlsaPorts(m_imidiports, false); // Run the MIDI cable scan... QListIterator iter(m_cablelist); while (iter.hasNext()) { qjackctlPatchbayCable *pCable = iter.next(); connectAlsaCable( pCable->outputSocket(), pCable->inputSocket()); } // Forward MIDI sockets... connectForwardScan(QJACKCTL_SOCKETTYPE_ALSA_MIDI); // Free client-ports caches... qDeleteAll(m_omidiports); m_omidiports.clear(); qDeleteAll(m_imidiports); m_imidiports.clear(); m_pAlsaSeq = NULL; } // JACK socket/ports forwarding scan... void qjackctlPatchbayRack::connectJackForwardPorts ( const char *pszPort, const char *pszPortForward ) { // Check for outputs from forwarded input... const char **ppszOutputPorts = jack_port_get_all_connections( m_pJackClient, jack_port_by_name(m_pJackClient, pszPortForward)); if (ppszOutputPorts) { // Grab current connections of target port... const char **ppszPorts = jack_port_get_all_connections( m_pJackClient, jack_port_by_name(m_pJackClient, pszPort)); for (int i = 0 ; ppszOutputPorts[i]; i++) { // Need to lookup if already connected... bool bConnected = false; for (int j = 0; ppszPorts && ppszPorts[j]; j++) { if (strcmp(ppszOutputPorts[i], ppszPorts[j]) == 0) { bConnected = true; break; } } // Make or just report the connection... if (bConnected) { checkJackPorts(ppszOutputPorts[i], pszPort); } else { connectJackPorts(ppszOutputPorts[i], pszPort); } } // Free provided arrays... if (ppszPorts) ::free(ppszPorts); ::free(ppszOutputPorts); } } void qjackctlPatchbayRack::connectJackForward ( qjackctlPatchbaySocket *pSocket, qjackctlPatchbaySocket *pSocketForward ) { if (pSocket == NULL || pSocketForward == NULL) return; if (pSocket->type() != pSocketForward->type()) return; const char **ppszOutputPorts = NULL; const char **ppszInputPorts = NULL; if (pSocket->type() == QJACKCTL_SOCKETTYPE_JACK_AUDIO) { ppszOutputPorts = m_ppszOAudioPorts; ppszInputPorts = m_ppszIAudioPorts; } else if (pSocket->type() == QJACKCTL_SOCKETTYPE_JACK_MIDI) { ppszOutputPorts = m_ppszOMidiPorts; ppszInputPorts = m_ppszIMidiPorts; } if (ppszOutputPorts == NULL || ppszInputPorts == NULL) return; QStringListIterator iterPlug(pSocket->pluglist()); QStringListIterator iterPlugForward(pSocketForward->pluglist()); while (iterPlug.hasNext() && iterPlugForward.hasNext()) { // Check audio port connection sequentially... const QString& sPlug = iterPlug.next(); const QString& sPlugForward = iterPlugForward.next(); const char *pszPortForward = findJackPort(ppszInputPorts, pSocketForward->clientName(), sPlugForward, 0); if (pszPortForward) { const char *pszPort = findJackPort(ppszInputPorts, pSocket->clientName(), sPlug, 0); if (pszPort) connectJackForwardPorts(pszPort, pszPortForward); } } } // ALSA socket/ports forwarding scan... void qjackctlPatchbayRack::connectAlsaForwardPorts ( qjackctlAlsaMidiPort *pPort, qjackctlAlsaMidiPort *pPortForward ) { #ifdef CONFIG_ALSA_SEQ // Grab current connections of target port... QList midiports; loadAlsaConnections(midiports, pPort, false); snd_seq_query_subscribe_t *pAlsaSubs; snd_seq_addr_t seq_addr; snd_seq_query_subscribe_alloca(&pAlsaSubs); // Check for inputs from output... snd_seq_query_subscribe_set_type(pAlsaSubs, SND_SEQ_QUERY_SUBS_WRITE); snd_seq_query_subscribe_set_index(pAlsaSubs, 0); seq_addr.client = pPortForward->iAlsaClient; seq_addr.port = pPortForward->iAlsaPort; snd_seq_query_subscribe_set_root(pAlsaSubs, &seq_addr); while (snd_seq_query_port_subscribers(m_pAlsaSeq, pAlsaSubs) >= 0) { seq_addr = *snd_seq_query_subscribe_get_addr(pAlsaSubs); // Need to lookup if already connected... bool bConnected = false; QListIterator iter(midiports); while (iter.hasNext()) { qjackctlAlsaMidiPort *pMidiPort = iter.next(); if (pMidiPort->iAlsaClient == seq_addr.client && pMidiPort->iAlsaPort == seq_addr.port) { bConnected = true; break; } } // Make and/or just report the connection... qjackctlAlsaMidiPort oport; setAlsaPort(&oport, seq_addr.client, seq_addr.port); if (bConnected) { checkAlsaPorts(&oport, pPort); } else { connectAlsaPorts(&oport, pPort); } snd_seq_query_subscribe_set_index(pAlsaSubs, snd_seq_query_subscribe_get_index(pAlsaSubs) + 1); } qDeleteAll(midiports); midiports.clear(); #endif // CONFIG_ALSA_SEQ } void qjackctlPatchbayRack::connectAlsaForward ( qjackctlPatchbaySocket *pSocket, qjackctlPatchbaySocket *pSocketForward ) { if (pSocket == NULL || pSocketForward == NULL) return; if (pSocket->type() != pSocketForward->type() || pSocket->type() != QJACKCTL_SOCKETTYPE_ALSA_MIDI) return; QStringListIterator iterPlug(pSocket->pluglist()); QStringListIterator iterPlugForward(pSocketForward->pluglist()); while (iterPlug.hasNext() && iterPlugForward.hasNext()) { // Check MIDI port connection sequentially... const QString& sPlug = iterPlug.next(); const QString& sPlugForward = iterPlugForward.next(); qjackctlAlsaMidiPort *pPortForward = findAlsaPort(m_imidiports, pSocketForward->clientName(), sPlugForward, 0); if (pPortForward) { qjackctlAlsaMidiPort *pPort = findAlsaPort(m_imidiports, pSocket->clientName(), sPlug, 0); if (pPort) connectAlsaForwardPorts(pPort, pPortForward); } } } // Common socket forwrading scan... void qjackctlPatchbayRack::connectForwardScan ( int iSocketType ) { // First, make a copy of a seriously forwarded socket list... QList socketlist; QListIterator isocket(m_isocketlist); while (isocket.hasNext()) { qjackctlPatchbaySocket *pSocket = isocket.next(); if (pSocket->type() != iSocketType) continue; if (pSocket->forward().isEmpty()) continue; socketlist.append(pSocket); } // Second, scan for input forwarded sockets... QListIterator iter(socketlist); while (iter.hasNext()) { qjackctlPatchbaySocket *pSocket = iter.next(); qjackctlPatchbaySocket *pSocketForward = findSocket(m_isocketlist, pSocket->forward()); if (pSocketForward == NULL) continue; switch (iSocketType) { case QJACKCTL_SOCKETTYPE_JACK_AUDIO: case QJACKCTL_SOCKETTYPE_JACK_MIDI: connectJackForward(pSocket, pSocketForward); break; case QJACKCTL_SOCKETTYPE_ALSA_MIDI: connectAlsaForward(pSocket, pSocketForward); break; } } } //---------------------------------------------------------------------- // JACK snapshot. void qjackctlPatchbayRack::connectJackSnapshotEx ( int iSocketType ) { if (m_pJackClient == NULL) return; const char *pszJackPortType = JACK_DEFAULT_AUDIO_TYPE; #ifdef CONFIG_JACK_MIDI if (iSocketType == QJACKCTL_SOCKETTYPE_JACK_MIDI) pszJackPortType = JACK_DEFAULT_MIDI_TYPE; #endif const char **ppszInputPorts = jack_get_ports(m_pJackClient, 0, pszJackPortType, JackPortIsInput); if (ppszInputPorts) { for (int i = 0; ppszInputPorts[i]; ++i) { const char *pszInputPort = ppszInputPorts[i]; const QString sInputPort = QString::fromUtf8(pszInputPort); const QString& sIClient = sInputPort.section(':', 0, 0); const QString& sIPort = sInputPort.section(':', 1); qjackctlPatchbaySnapshot::add_socket( isocketlist(), sIClient, sIPort, iSocketType); } ::free(ppszInputPorts); } const char **ppszOutputPorts = jack_get_ports(m_pJackClient, 0, pszJackPortType, JackPortIsOutput); if (ppszOutputPorts == NULL) return; qjackctlPatchbaySnapshot snapshot; for (int i = 0; ppszOutputPorts[i]; ++i) { const char *pszOutputPort = ppszOutputPorts[i]; const QString sOutputPort = QString::fromUtf8(pszOutputPort); const QString& sOClient = sOutputPort.section(':', 0, 0); const QString& sOPort = sOutputPort.section(':', 1); qjackctlPatchbaySnapshot::add_socket( osocketlist(), sOClient, sOPort, iSocketType); // Check for inputs from output... ppszInputPorts = jack_port_get_all_connections( m_pJackClient, jack_port_by_name(m_pJackClient, pszOutputPort)); if (ppszInputPorts == NULL) continue; for (int j = 0 ; ppszInputPorts[j]; ++j) { const char *pszInputPort = ppszInputPorts[j]; const QString sInputPort = QString::fromUtf8(pszInputPort); const QString& sIClient = sInputPort.section(':', 0, 0); const QString& sIPort = sInputPort.section(':', 1); snapshot.append(sOClient, sOPort, sIClient, sIPort); } ::free(ppszInputPorts); } ::free(ppszOutputPorts); snapshot.commit(this, iSocketType); } void qjackctlPatchbayRack::connectJackSnapshot ( jack_client_t *pJackClient ) { if (pJackClient == NULL || m_pJackClient) return; // Cache JACK client descriptor. m_pJackClient = pJackClient; connectJackSnapshotEx(QJACKCTL_SOCKETTYPE_JACK_AUDIO); connectJackSnapshotEx(QJACKCTL_SOCKETTYPE_JACK_MIDI); // Done. m_pJackClient = NULL; } //---------------------------------------------------------------------- // ALSA snapshot. void qjackctlPatchbayRack::connectAlsaSnapshot ( snd_seq_t *pAlsaSeq ) { if (pAlsaSeq == NULL || m_pAlsaSeq) return; // Cache sequencer descriptor. m_pAlsaSeq = pAlsaSeq; #ifdef CONFIG_ALSA_SEQ QList imidiports; loadAlsaPorts(imidiports, false); QListIterator iport(imidiports); while (iport.hasNext()) { qjackctlAlsaMidiPort *pIPort = iport.next(); qjackctlPatchbaySnapshot::add_socket( isocketlist(), pIPort->sClientName, pIPort->sPortName, QJACKCTL_SOCKETTYPE_ALSA_MIDI); } qDeleteAll(imidiports); imidiports.clear(); qjackctlPatchbaySnapshot snapshot; QList omidiports; loadAlsaPorts(omidiports, true); QListIterator oport(omidiports); while (oport.hasNext()) { qjackctlAlsaMidiPort *pOPort = oport.next(); qjackctlPatchbaySnapshot::add_socket( osocketlist(), pOPort->sClientName, pOPort->sPortName, QJACKCTL_SOCKETTYPE_ALSA_MIDI); loadAlsaConnections(imidiports, pOPort, true); QListIterator iport(imidiports); while (iport.hasNext()) { qjackctlAlsaMidiPort *pIPort = iport.next(); snapshot.append( pOPort->sClientName, pOPort->sPortName, pIPort->sClientName, pIPort->sPortName); } qDeleteAll(imidiports); imidiports.clear(); } qDeleteAll(omidiports); omidiports.clear(); snapshot.commit(this, QJACKCTL_SOCKETTYPE_ALSA_MIDI); #endif // Done. m_pAlsaSeq = NULL; } //---------------------------------------------------------------------- // JACK reset/disconnect-all. void qjackctlPatchbayRack::disconnectAllJackPortsEx ( int iSocketType ) { if (m_pJackClient == NULL) return; const char *pszJackPortType = JACK_DEFAULT_AUDIO_TYPE; #ifdef CONFIG_JACK_MIDI if (iSocketType == QJACKCTL_SOCKETTYPE_JACK_MIDI) pszJackPortType = JACK_DEFAULT_MIDI_TYPE; #endif const char **ppszOutputPorts = jack_get_ports(m_pJackClient, 0, pszJackPortType, JackPortIsOutput); if (ppszOutputPorts) { for (int i = 0; ppszOutputPorts[i]; ++i) { const char *pszOutputPort = ppszOutputPorts[i]; const char **ppszInputPorts = jack_port_get_all_connections( m_pJackClient, jack_port_by_name(m_pJackClient, pszOutputPort)); if (ppszInputPorts == NULL) continue; for (int j = 0 ; ppszInputPorts[j]; ++j) { const char *pszInputPort = ppszInputPorts[j]; jack_disconnect(m_pJackClient, pszOutputPort, pszInputPort); } ::free(ppszInputPorts); } ::free(ppszOutputPorts); } } void qjackctlPatchbayRack::disconnectAllJackPorts ( jack_client_t *pJackClient ) { if (pJackClient == NULL || m_pJackClient) return; // Cache JACK client descriptor. m_pJackClient = pJackClient; disconnectAllJackPortsEx(QJACKCTL_SOCKETTYPE_JACK_AUDIO); disconnectAllJackPortsEx(QJACKCTL_SOCKETTYPE_JACK_MIDI); // Done. m_pJackClient = NULL; } //---------------------------------------------------------------------- // ALSA reset/disconnect-all. void qjackctlPatchbayRack::disconnectAllAlsaPorts ( snd_seq_t *pAlsaSeq ) { if (pAlsaSeq == NULL || m_pAlsaSeq) return; // Cache sequencer descriptor. m_pAlsaSeq = pAlsaSeq; #ifdef CONFIG_ALSA_SEQ QList omidiports; loadAlsaPorts(omidiports, true); QListIterator oport(omidiports); while (oport.hasNext()) { qjackctlAlsaMidiPort *pOPort = oport.next(); QList imidiports; loadAlsaConnections(imidiports, pOPort, true); QListIterator iport(imidiports); while (iport.hasNext()) { qjackctlAlsaMidiPort *pIPort = iport.next(); snd_seq_port_subscribe_t *pAlsaSubs; snd_seq_addr_t seq_addr; snd_seq_port_subscribe_alloca(&pAlsaSubs); seq_addr.client = pOPort->iAlsaClient; seq_addr.port = pOPort->iAlsaPort; snd_seq_port_subscribe_set_sender(pAlsaSubs, &seq_addr); seq_addr.client = pIPort->iAlsaClient; seq_addr.port = pIPort->iAlsaPort; snd_seq_port_subscribe_set_dest(pAlsaSubs, &seq_addr); snd_seq_unsubscribe_port(m_pAlsaSeq, pAlsaSubs); } qDeleteAll(imidiports); imidiports.clear(); } qDeleteAll(omidiports); omidiports.clear(); #endif // Done. m_pAlsaSeq = NULL; } // qjackctlPatchbayRack.cpp qjackctl-0.4.2/src/PaxHeaders.14935/qjackctlConnectionsForm.cpp0000644000000000000000000000013212700760152021171 xustar0030 mtime=1459871850.617907288 30 atime=1459871850.617907288 30 ctime=1459871850.617907288 qjackctl-0.4.2/src/qjackctlConnectionsForm.cpp0000644000175000001440000005165612700760152021752 0ustar00rncbcusers00000000000000// qjackctlConnectionsForm.cpp // /**************************************************************************** Copyright (C) 2003-2014, rncbc aka Rui Nuno Capela. All rights reserved. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. *****************************************************************************/ #include "qjackctlAbout.h" #include "qjackctlConnectionsForm.h" #include "qjackctlSetup.h" #include "qjackctlMainForm.h" #include "qjackctlPatchbay.h" #include #include #include //---------------------------------------------------------------------------- // qjackctlConnectionsForm -- UI wrapper form. // Constructor. qjackctlConnectionsForm::qjackctlConnectionsForm ( QWidget *pParent, Qt::WindowFlags wflags ) : QWidget(pParent, wflags) { // Setup UI struct... m_ui.setupUi(this); m_pAudioConnect = new qjackctlJackConnect( m_ui.AudioConnectView, QJACKCTL_JACK_AUDIO); #ifdef CONFIG_JACK_MIDI m_pMidiConnect = new qjackctlJackConnect( m_ui.MidiConnectView, QJACKCTL_JACK_MIDI); #else m_pMidiConnect = NULL; #endif #ifdef CONFIG_ALSA_SEQ m_pAlsaConnect = new qjackctlAlsaConnect(m_ui.AlsaConnectView); #else m_pAlsaConnect = NULL; #endif m_pSetup = NULL; // UI connections... QObject::connect(m_ui.AudioConnectPushButton, SIGNAL(clicked()), SLOT(audioConnectSelected())); QObject::connect(m_ui.AudioDisconnectPushButton, SIGNAL(clicked()), SLOT(audioDisconnectSelected())); QObject::connect(m_ui.AudioDisconnectAllPushButton, SIGNAL(clicked()), SLOT(audioDisconnectAll())); QObject::connect(m_ui.AudioExpandAllPushButton, SIGNAL(clicked()), SLOT(audioExpandAll())); QObject::connect(m_ui.AudioRefreshPushButton, SIGNAL(clicked()), SLOT(audioRefreshClear())); QObject::connect(m_ui.MidiConnectPushButton, SIGNAL(clicked()), SLOT(midiConnectSelected())); QObject::connect(m_ui.MidiDisconnectPushButton, SIGNAL(clicked()), SLOT(midiDisconnectSelected())); QObject::connect(m_ui.MidiDisconnectAllPushButton, SIGNAL(clicked()), SLOT(midiDisconnectAll())); QObject::connect(m_ui.MidiExpandAllPushButton, SIGNAL(clicked()), SLOT(midiExpandAll())); QObject::connect(m_ui.MidiRefreshPushButton, SIGNAL(clicked()), SLOT(midiRefreshClear())); QObject::connect(m_ui.AlsaConnectPushButton, SIGNAL(clicked()), SLOT(alsaConnectSelected())); QObject::connect(m_ui.AlsaDisconnectPushButton, SIGNAL(clicked()), SLOT(alsaDisconnectSelected())); QObject::connect(m_ui.AlsaDisconnectAllPushButton, SIGNAL(clicked()), SLOT(alsaDisconnectAll())); QObject::connect(m_ui.AlsaExpandAllPushButton, SIGNAL(clicked()), SLOT(alsaExpandAll())); QObject::connect(m_ui.AlsaRefreshPushButton, SIGNAL(clicked()), SLOT(alsaRefreshClear())); // Connect it to some UI feedback slots. QObject::connect(m_ui.AudioConnectView->OListView(), SIGNAL(currentItemChanged(QTreeWidgetItem*,QTreeWidgetItem*)), SLOT(audioStabilize())); QObject::connect(m_ui.AudioConnectView->IListView(), SIGNAL(currentItemChanged(QTreeWidgetItem*,QTreeWidgetItem*)), SLOT(audioStabilize())); QObject::connect(m_ui.MidiConnectView->OListView(), SIGNAL(currentItemChanged(QTreeWidgetItem*,QTreeWidgetItem*)), SLOT(midiStabilize())); QObject::connect(m_ui.MidiConnectView->IListView(), SIGNAL(currentItemChanged(QTreeWidgetItem*,QTreeWidgetItem*)), SLOT(midiStabilize())); QObject::connect(m_ui.AlsaConnectView->OListView(), SIGNAL(currentItemChanged(QTreeWidgetItem*,QTreeWidgetItem*)), SLOT(alsaStabilize())); QObject::connect(m_ui.AlsaConnectView->IListView(), SIGNAL(currentItemChanged(QTreeWidgetItem*,QTreeWidgetItem*)), SLOT(alsaStabilize())); // Dirty dispatcher (refresh deferral). QObject::connect(m_ui.AudioConnectView, SIGNAL(contentsChanged()), SLOT(audioRefresh())); QObject::connect(m_ui.MidiConnectView, SIGNAL(contentsChanged()), SLOT(midiRefresh())); QObject::connect(m_ui.AlsaConnectView, SIGNAL(contentsChanged()), SLOT(alsaRefresh())); // Actual connections... QObject::connect(m_pAudioConnect, SIGNAL(disconnecting(qjackctlPortItem *, qjackctlPortItem *)), SLOT(audioDisconnecting(qjackctlPortItem *, qjackctlPortItem *))); #ifdef CONFIG_JACK_MIDI QObject::connect(m_pMidiConnect, SIGNAL(disconnecting(qjackctlPortItem *, qjackctlPortItem *)), SLOT(midiDisconnecting(qjackctlPortItem *, qjackctlPortItem *))); #endif #ifdef CONFIG_ALSA_SEQ QObject::connect(m_pAlsaConnect, SIGNAL(disconnecting(qjackctlPortItem *, qjackctlPortItem *)), SLOT(alsaDisconnecting(qjackctlPortItem *, qjackctlPortItem *))); #endif #ifndef CONFIG_JACK_MIDI m_ui.ConnectionsTabWidget->setTabEnabled(1, false); #endif #ifndef CONFIG_ALSA_SEQ // m_ui.ConnectionsTabWidget->setTabEnabled(2, false); m_ui.ConnectionsTabWidget->removeTab(2); #endif // Start disabled. stabilizeAudio(false); stabilizeMidi(false); stabilizeAlsa(false); } // Destructor. qjackctlConnectionsForm::~qjackctlConnectionsForm (void) { // Destroy our connections view... if (m_pAudioConnect) delete m_pAudioConnect; #ifdef CONFIG_JACK_MIDI if (m_pMidiConnect) delete m_pMidiConnect; #endif #ifdef CONFIG_ALSA_SEQ if (m_pAlsaConnect) delete m_pAlsaConnect; #endif } // Notify our parent that we're emerging. void qjackctlConnectionsForm::showEvent ( QShowEvent *pShowEvent ) { qjackctlMainForm *pMainForm = qjackctlMainForm::getInstance(); if (pMainForm) pMainForm->stabilizeForm(); audioRefresh(); midiRefresh(); alsaRefresh(); QWidget::showEvent(pShowEvent); } // Notify our parent that we're closing. void qjackctlConnectionsForm::hideEvent ( QHideEvent *pHideEvent ) { QWidget::hideEvent(pHideEvent); qjackctlMainForm *pMainForm = qjackctlMainForm::getInstance(); if (pMainForm) pMainForm->stabilizeForm(); } // Just about to notify main-window that we're closing. void qjackctlConnectionsForm::closeEvent ( QCloseEvent * /*pCloseEvent*/ ) { QWidget::hide(); qjackctlMainForm *pMainForm = qjackctlMainForm::getInstance(); if (pMainForm) pMainForm->stabilizeForm(); } // Set reference to global options, mostly needed for the // initial sizes of the main splitter views and those // client/port aliasing feature. void qjackctlConnectionsForm::setup ( qjackctlSetup *pSetup ) { m_pSetup = pSetup; qjackctlMainForm *pMainForm = qjackctlMainForm::getInstance(); if (pMainForm) { QObject::connect(m_pAudioConnect, SIGNAL(connectChanged()), pMainForm, SLOT(jackConnectChanged())); #ifdef CONFIG_JACK_MIDI QObject::connect(m_pMidiConnect, SIGNAL(connectChanged()), pMainForm, SLOT(jackConnectChanged())); #endif #ifdef CONFIG_ALSA_SEQ QObject::connect(m_pAlsaConnect, SIGNAL(connectChanged()), pMainForm, SLOT(alsaConnectChanged())); #endif } // Load some splitter sizes... if (m_pSetup) { QList sizes; sizes.append(180); sizes.append(60); sizes.append(180); m_pSetup->loadSplitterSizes(m_ui.AudioConnectView, sizes); m_pSetup->loadSplitterSizes(m_ui.MidiConnectView, sizes); m_pSetup->loadSplitterSizes(m_ui.AlsaConnectView, sizes); #ifdef CONFIG_ALSA_SEQ if (!m_pSetup->bAlsaSeqEnabled) { // m_ui.ConnectionsTabWidget->setTabEnabled(2, false); m_ui.ConnectionsTabWidget->removeTab(2); } #endif } // Update initial client/port aliases... updateAliases(); } // Connector view accessors. qjackctlConnectView *qjackctlConnectionsForm::audioConnectView (void) const { return m_ui.AudioConnectView; } qjackctlConnectView *qjackctlConnectionsForm::midiConnectView (void) const { return m_ui.MidiConnectView; } qjackctlConnectView *qjackctlConnectionsForm::alsaConnectView (void) const { return m_ui.AlsaConnectView; } // Window close event handlers. bool qjackctlConnectionsForm::queryClose (void) { bool bQueryClose = true; if (m_pSetup && (m_ui.AudioConnectView->isDirty() || m_ui.MidiConnectView->isDirty() || m_ui.AlsaConnectView->isDirty())) { switch (QMessageBox::warning(this, tr("Warning") + " - " QJACKCTL_SUBTITLE1, tr("The preset aliases have been changed:\n\n" "\"%1\"\n\nDo you want to save the changes?") .arg(m_sPreset), QMessageBox::Save | QMessageBox::Discard | QMessageBox::Cancel)) { case QMessageBox::Save: saveAliases(); // Fall thru.... case QMessageBox::Discard: break; default: // Cancel. bQueryClose = false; } } // Save some splitter sizes... if (m_pSetup && bQueryClose) { m_pSetup->saveSplitterSizes(m_ui.AudioConnectView); m_pSetup->saveSplitterSizes(m_ui.MidiConnectView); m_pSetup->saveSplitterSizes(m_ui.AlsaConnectView); } return bQueryClose; } // Load aliases from current preset. bool qjackctlConnectionsForm::loadAliases (void) { bool bResult = false; if (m_pSetup && queryClose()) { m_sPreset = m_pSetup->sDefPreset; bResult = m_pSetup->loadAliases(m_sPreset); if (bResult) { m_ui.AudioConnectView->setDirty(false); m_ui.MidiConnectView->setDirty(false); m_ui.AlsaConnectView->setDirty(false); } } return bResult; } // Save aliases to current preset. bool qjackctlConnectionsForm::saveAliases (void) { bool bResult = false; if (m_pSetup) { bResult = m_pSetup->saveAliases(m_sPreset); if (bResult) { m_ui.AudioConnectView->setDirty(false); m_ui.MidiConnectView->setDirty(false); m_ui.AlsaConnectView->setDirty(false); } } return bResult; } // Tab page accessors. void qjackctlConnectionsForm::setTabPage ( int iTabPage ) { m_ui.ConnectionsTabWidget->setCurrentIndex(iTabPage); } int qjackctlConnectionsForm::tabPage (void) const { return m_ui.ConnectionsTabWidget->currentIndex(); } // Connections view font accessors. QFont qjackctlConnectionsForm::connectionsFont (void) const { // Elect one list view to retrieve current font. return m_ui.AudioConnectView->OListView()->font(); } void qjackctlConnectionsForm::setConnectionsFont ( const QFont & font ) { // Set fonts of all listviews... m_ui.AudioConnectView->OListView()->setFont(font); m_ui.AudioConnectView->IListView()->setFont(font); m_ui.MidiConnectView->OListView()->setFont(font); m_ui.MidiConnectView->IListView()->setFont(font); m_ui.AlsaConnectView->OListView()->setFont(font); m_ui.AlsaConnectView->IListView()->setFont(font); } // Connections view icon size accessor. void qjackctlConnectionsForm::setConnectionsIconSize ( int iIconSize ) { // Set icon sizes of all views... m_ui.AudioConnectView->setIconSize(iIconSize); m_ui.MidiConnectView->setIconSize(iIconSize); m_ui.AlsaConnectView->setIconSize(iIconSize); } // Check if there's JACK audio connections. bool qjackctlConnectionsForm::isAudioConnected (void) const { bool bIsAudioConnected = false; if (m_pAudioConnect) bIsAudioConnected = m_pAudioConnect->canDisconnectAll(); return bIsAudioConnected; } // Connect current selected JACK audio ports. void qjackctlConnectionsForm::audioConnectSelected (void) { if (m_pAudioConnect) { if (m_pAudioConnect->connectSelected()) refreshAudio(false); } } // Disconnect current selected JACK audio ports. void qjackctlConnectionsForm::audioDisconnectSelected (void) { if (m_pAudioConnect) { if (m_pAudioConnect->disconnectSelected()) refreshAudio(false); } } // Disconnect all connected JACK audio ports. void qjackctlConnectionsForm::audioDisconnectAll (void) { if (m_pAudioConnect) { if (m_pAudioConnect->disconnectAll()) refreshAudio(false); } } // Expand all JACK audio client ports. void qjackctlConnectionsForm::audioExpandAll (void) { if (m_pAudioConnect) { m_pAudioConnect->expandAll(); stabilizeAudio(true); } } // JACK audio ports disconnecting. void qjackctlConnectionsForm::audioDisconnecting ( qjackctlPortItem *pOPort, qjackctlPortItem *pIPort ) { qjackctlMainForm *pMainForm = qjackctlMainForm::getInstance(); if (pMainForm) pMainForm->queryDisconnect(pOPort, pIPort, QJACKCTL_SOCKETTYPE_JACK_AUDIO); } // Refresh JACK audio form by notifying the parent form. void qjackctlConnectionsForm::audioRefreshClear (void) { refreshAudio(true, true); } void qjackctlConnectionsForm::audioRefresh (void) { refreshAudio(false); } // A JACK audio helper stabilization slot. void qjackctlConnectionsForm::audioStabilize (void) { stabilizeAudio(true); } // Connect current selected JACK MIDI ports. void qjackctlConnectionsForm::midiConnectSelected (void) { if (m_pMidiConnect) { if (m_pMidiConnect->connectSelected()) refreshMidi(false); } } // Check if there's JACK MIDI connections. bool qjackctlConnectionsForm::isMidiConnected (void) const { bool bIsMidiConnected = false; if (m_pMidiConnect) bIsMidiConnected = m_pMidiConnect->canDisconnectAll(); return bIsMidiConnected; } // Disconnect current selected JACK MIDI ports. void qjackctlConnectionsForm::midiDisconnectSelected (void) { if (m_pMidiConnect) { if (m_pMidiConnect->disconnectSelected()) refreshMidi(false); } } // Disconnect all connected JACK MIDI ports. void qjackctlConnectionsForm::midiDisconnectAll (void) { if (m_pMidiConnect) { if (m_pMidiConnect->disconnectAll()) refreshMidi(false); } } // Expand all JACK MIDI client ports. void qjackctlConnectionsForm::midiExpandAll (void) { if (m_pMidiConnect) { m_pMidiConnect->expandAll(); stabilizeMidi(true); } } // JACK MIDI ports disconnecting. void qjackctlConnectionsForm::midiDisconnecting ( qjackctlPortItem *pOPort, qjackctlPortItem *pIPort ) { qjackctlMainForm *pMainForm = qjackctlMainForm::getInstance(); if (pMainForm) pMainForm->queryDisconnect(pOPort, pIPort, QJACKCTL_SOCKETTYPE_JACK_MIDI); } // Refresh JACK MIDI form by notifying the parent form. void qjackctlConnectionsForm::midiRefreshClear (void) { refreshMidi(true, true); } void qjackctlConnectionsForm::midiRefresh (void) { refreshMidi(false); } // A JACK MIDI helper stabilization slot. void qjackctlConnectionsForm::midiStabilize (void) { stabilizeMidi(true); } // Check if there's ALSA MIDI connections. bool qjackctlConnectionsForm::isAlsaConnected (void) const { bool bIsAlsaConnected = false; if (m_pAlsaConnect) bIsAlsaConnected = m_pAlsaConnect->canDisconnectAll(); return bIsAlsaConnected; } // Connect current selected ALSA MIDI ports. void qjackctlConnectionsForm::alsaConnectSelected (void) { if (m_pAlsaConnect) { if (m_pAlsaConnect->connectSelected()) refreshAlsa(false); } } // Disconnect current selected ALSA MIDI ports. void qjackctlConnectionsForm::alsaDisconnectSelected (void) { if (m_pAlsaConnect) { if (m_pAlsaConnect->disconnectSelected()) refreshAlsa(false); } } // Disconnect all connected ALSA MIDI ports. void qjackctlConnectionsForm::alsaDisconnectAll (void) { if (m_pAlsaConnect) { if (m_pAlsaConnect->disconnectAll()) refreshAlsa(false); } } // Expand all ALSA MIDI client ports. void qjackctlConnectionsForm::alsaExpandAll (void) { if (m_pAlsaConnect) { m_pAlsaConnect->expandAll(); stabilizeAlsa(true); } } // ALSA MIDI ports disconnecting. void qjackctlConnectionsForm::alsaDisconnecting ( qjackctlPortItem *pOPort, qjackctlPortItem *pIPort ) { qjackctlMainForm *pMainForm = qjackctlMainForm::getInstance(); if (pMainForm) pMainForm->queryDisconnect(pOPort, pIPort, QJACKCTL_SOCKETTYPE_ALSA_MIDI); } // Refresh complete form by notifying the parent form. void qjackctlConnectionsForm::alsaRefreshClear (void) { refreshAlsa(true, true); } void qjackctlConnectionsForm::alsaRefresh (void) { refreshAlsa(false); } // A helper stabilization slot. void qjackctlConnectionsForm::alsaStabilize (void) { stabilizeAlsa(true); } // Either rebuild all connections now // or notify main form for doing that later. void qjackctlConnectionsForm::refreshAudio ( bool bEnabled, bool bClear ) { if (m_pAudioConnect == NULL) return; if (bEnabled) { // m_pAudioConnect->refresh(); stabilizeAudio(bEnabled, bClear); } else { qjackctlMainForm *pMainForm = qjackctlMainForm::getInstance(); if (pMainForm) pMainForm->refreshJackConnections(); } } void qjackctlConnectionsForm::refreshMidi ( bool bEnabled, bool bClear ) { if (m_pMidiConnect == NULL) return; if (bEnabled) { // m_pMidiConnect->refresh(); stabilizeMidi(bEnabled, bClear); } else { qjackctlMainForm *pMainForm = qjackctlMainForm::getInstance(); if (pMainForm) pMainForm->refreshJackConnections(); } } void qjackctlConnectionsForm::refreshAlsa ( bool bEnabled, bool bClear ) { if (m_pAlsaConnect == NULL) return; if (bEnabled) { // m_pAlsaConnect->refresh(); stabilizeAlsa(bEnabled, bClear); } else { qjackctlMainForm *pMainForm = qjackctlMainForm::getInstance(); if (pMainForm) pMainForm->refreshAlsaConnections(); } } // Proper enablement of connections command controls. void qjackctlConnectionsForm::stabilizeAudio ( bool bEnabled, bool bClear ) { if (m_pAudioConnect) m_pAudioConnect->updateContents(!bEnabled || bClear); if (m_pAudioConnect && bEnabled) { m_ui.AudioConnectPushButton->setEnabled( m_pAudioConnect->canConnectSelected()); m_ui.AudioDisconnectPushButton->setEnabled( m_pAudioConnect->canDisconnectSelected()); m_ui.AudioDisconnectAllPushButton->setEnabled( m_pAudioConnect->canDisconnectAll()); m_ui.AudioExpandAllPushButton->setEnabled(true); m_ui.AudioRefreshPushButton->setEnabled(true); } else { m_ui.AudioConnectPushButton->setEnabled(false); m_ui.AudioDisconnectPushButton->setEnabled(false); m_ui.AudioDisconnectAllPushButton->setEnabled(false); m_ui.AudioExpandAllPushButton->setEnabled(false); m_ui.AudioRefreshPushButton->setEnabled(false); } } void qjackctlConnectionsForm::stabilizeMidi ( bool bEnabled, bool bClear ) { if (m_pMidiConnect) m_pMidiConnect->updateContents(!bEnabled || bClear); if (m_pMidiConnect && bEnabled) { m_ui.MidiConnectPushButton->setEnabled( m_pMidiConnect->canConnectSelected()); m_ui.MidiDisconnectPushButton->setEnabled( m_pMidiConnect->canDisconnectSelected()); m_ui.MidiDisconnectAllPushButton->setEnabled( m_pMidiConnect->canDisconnectAll()); m_ui.MidiExpandAllPushButton->setEnabled(true); m_ui.MidiRefreshPushButton->setEnabled(true); } else { m_ui.MidiConnectPushButton->setEnabled(false); m_ui.MidiDisconnectPushButton->setEnabled(false); m_ui.MidiDisconnectAllPushButton->setEnabled(false); m_ui.MidiExpandAllPushButton->setEnabled(false); m_ui.MidiRefreshPushButton->setEnabled(false); } } void qjackctlConnectionsForm::stabilizeAlsa ( bool bEnabled, bool bClear ) { if (m_pAlsaConnect) m_pAlsaConnect->updateContents(!bEnabled || bClear); if (m_pAlsaConnect && bEnabled) { m_ui.AlsaConnectPushButton->setEnabled( m_pAlsaConnect->canConnectSelected()); m_ui.AlsaDisconnectPushButton->setEnabled( m_pAlsaConnect->canDisconnectSelected()); m_ui.AlsaDisconnectAllPushButton->setEnabled( m_pAlsaConnect->canDisconnectAll()); m_ui.AlsaExpandAllPushButton->setEnabled(true); m_ui.AlsaRefreshPushButton->setEnabled(true); } else { m_ui.AlsaConnectPushButton->setEnabled(false); m_ui.AlsaDisconnectPushButton->setEnabled(false); m_ui.AlsaDisconnectAllPushButton->setEnabled(false); m_ui.AlsaExpandAllPushButton->setEnabled(false); m_ui.AlsaRefreshPushButton->setEnabled(false); } } // Client/port aliasing feature update. void qjackctlConnectionsForm::updateAliases (void) { // Set alias maps for all listviews... if (m_pSetup && m_pSetup->bAliasesEnabled) { const bool bRenameEnabled = m_pSetup->bAliasesEditing; m_ui.AudioConnectView->OListView()->setAliases( &(m_pSetup->aliasAudioOutputs), bRenameEnabled); m_ui.AudioConnectView->IListView()->setAliases( &(m_pSetup->aliasAudioInputs), bRenameEnabled); m_ui.MidiConnectView->OListView()->setAliases( &(m_pSetup->aliasMidiOutputs), bRenameEnabled); m_ui.MidiConnectView->IListView()->setAliases( &(m_pSetup->aliasMidiInputs), bRenameEnabled); m_ui.AlsaConnectView->OListView()->setAliases( &(m_pSetup->aliasAlsaOutputs), bRenameEnabled); m_ui.AlsaConnectView->IListView()->setAliases( &(m_pSetup->aliasAlsaInputs), bRenameEnabled); } else { m_ui.AudioConnectView->OListView()->setAliases(NULL, false); m_ui.AudioConnectView->IListView()->setAliases(NULL, false); m_ui.MidiConnectView->OListView()->setAliases(NULL, false); m_ui.MidiConnectView->IListView()->setAliases(NULL, false); m_ui.AlsaConnectView->OListView()->setAliases(NULL, false); m_ui.AlsaConnectView->IListView()->setAliases(NULL, false); } } // Keyboard event handler. void qjackctlConnectionsForm::keyPressEvent ( QKeyEvent *pKeyEvent ) { #ifdef CONFIG_DEBUG_0 qDebug("qjackctlConnectionsForm::keyPressEvent(%d)", pKeyEvent->key()); #endif int iKey = pKeyEvent->key(); switch (iKey) { case Qt::Key_Escape: close(); break; default: QWidget::keyPressEvent(pKeyEvent); break; } } // end of qjackctlConnectionsForm.cpp qjackctl-0.4.2/src/PaxHeaders.14935/qjackctlSession.h0000644000000000000000000000013212700760152017153 xustar0030 mtime=1459871850.623910288 30 atime=1459871850.623910288 30 ctime=1459871850.623910288 qjackctl-0.4.2/src/qjackctlSession.h0000644000175000001440000000622112700760152017720 0ustar00rncbcusers00000000000000// qjackctlSession.h // /**************************************************************************** Copyright (C) 2003-2015, rncbc aka Rui Nuno Capela. All rights reserved. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. *****************************************************************************/ #ifndef __qjackctlSession_h #define __qjackctlSession_h #include #include #include // Forward decls. class QSettings; //---------------------------------------------------------------------------- // qjackctlSession -- JACK session container. class qjackctlSession { public: // Constructor. qjackctlSession(); // Destructor. ~qjackctlSession(); // Container structs. struct ConnectItem { ConnectItem() : connected(false) {} QString client_name; QString port_name; bool connected; }; typedef QList ConnectList; struct PortItem { PortItem() : connected(0) {} ~PortItem() { qDeleteAll(connects); } QString port_name; int port_type; int connected; ConnectList connects; }; typedef QList PortList; struct ClientItem { ClientItem() : connected(0) {} ~ClientItem() { qDeleteAll(ports); } QString client_name; QString client_uuid; QString client_command; int connected; PortList ports; }; typedef QHash ClientList; // Client list accessor (read-only) const ClientList& clients() const; // House-keeper. void clear(); // Critical methods. bool save(const QString& sSessionDir, int iSessionType = 0); bool load(const QString& sSessionDir); // Update (re)connections utility method. bool update(); // Infra-client table. struct InfraClientItem { QString client_name; QString client_command; }; typedef QHash InfraClientList; // Infra-client list accessor (read-write) InfraClientList& infra_clients(); // Load/save all infra-clients from/to configuration file. void loadInfraClients(QSettings& settings); void saveInfraClients(QSettings& settings); // Clear infra-client table. void clearInfraClients(); // Check whether a given JACK client name exists... bool isJackClient(const QString& sClientName) const; protected: // File methods. bool loadFile(const QString& sFilename); bool saveFile(const QString& sFilename); private: // Instance variables. ClientList m_clients; // Infra-clients table. InfraClientList m_infra_clients; }; #endif // __qjackctlSession_h // end of qjackctlSession.h qjackctl-0.4.2/src/PaxHeaders.14935/qjackctlSetupForm.h0000644000000000000000000000013212700760152017454 xustar0030 mtime=1459871850.626911789 30 atime=1459871850.626911789 30 ctime=1459871850.626911789 qjackctl-0.4.2/src/qjackctlSetupForm.h0000644000175000001440000000616312700760152020226 0ustar00rncbcusers00000000000000// qjackctlSetupForm.h // /**************************************************************************** Copyright (C) 2003-2016, rncbc aka Rui Nuno Capela. All rights reserved. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. *****************************************************************************/ #ifndef __qjackctlSetupForm_h #define __qjackctlSetupForm_h #include "ui_qjackctlSetupForm.h" // Forward declarations. class qjackctlSetup; class QButtonGroup; //---------------------------------------------------------------------------- // qjackctlSetupForm -- UI wrapper form. class qjackctlSetupForm : public QDialog { Q_OBJECT public: // Constructor. qjackctlSetupForm(QWidget *pParent = 0, Qt::WindowFlags wflags = 0); // Destructor. ~qjackctlSetupForm(); void setup(qjackctlSetup *pSetup); bool queryClose(); protected slots: void changeCurrentPreset(const QString&); void saveCurrentPreset(); void deleteCurrentPreset(); void changeAudio(int); void changeDriver(int); void symbolStartupScript(); void symbolPostStartupScript(); void symbolShutdownScript(); void symbolPostShutdownScript(); void browseStartupScript(); void browsePostStartupScript(); void browseShutdownScript(); void browsePostShutdownScript(); void browseActivePatchbayPath(); void browseMessagesLogPath(); void chooseDisplayFont1(); void chooseDisplayFont2(); void toggleDisplayEffect(bool); void chooseMessagesFont(); void chooseConnectionsFont(); void settingsChanged(); void optionsChanged(); void accept(); void reject(); protected: // A combo-box text item setter helper. void setComboBoxCurrentText ( QComboBox *pComboBox, const QString& sText ) const; void changePreset(const QString& sPreset); bool savePreset(const QString& sPreset); bool deletePreset(const QString& sPreset); void resetPresets(); void computeLatency(); void changeDriverAudio( const QString& sDriver, int iAudio ); void changeDriverUpdate( const QString& sDriver, bool bUpdate ); void symbolMenu(QLineEdit * pLineEdit, QToolButton * pToolButton ); void stabilizeForm(); void showEvent(QShowEvent *); void hideEvent(QHideEvent *); void closeEvent(QCloseEvent *); private: // The Qt-designer UI struct... Ui::qjackctlSetupForm m_ui; // Instance variables. qjackctlSetup *m_pSetup; QButtonGroup *m_pTimeDisplayButtonGroup; int m_iDirtySetup; int m_iDirtySettings; int m_iDirtyOptions; QString m_sPreset; }; #endif // __qjackctlSetupForm_h // end of qjackctlSetupForm.h qjackctl-0.4.2/src/PaxHeaders.14935/src.pri.in0000644000000000000000000000013212700760152015552 xustar0030 mtime=1459871850.627912288 30 atime=1459871850.627912288 30 ctime=1459871850.627912288 qjackctl-0.4.2/src/src.pri.in0000644000175000001440000000040612700760152016316 0ustar00rncbcusers00000000000000# qjackctl.pri # PREFIX = @ac_prefix@ CONFIG += @ac_debug@ INCLUDEPATH += @ac_incpath@ LIBS += @ac_libs@ # Extra optimization flags QMAKE_CXXFLAGS += @ac_cflags@ QMAKE_LFLAGS += @ac_ldflags@ # D-BUS support QDBUS = @ac_qdbus@ !isEmpty(QDBUS) { QT += dbus } qjackctl-0.4.2/src/PaxHeaders.14935/qjackctlPatchbayRack.h0000644000000000000000000000013212700760152020064 xustar0030 mtime=1459871850.623910288 30 atime=1459871850.623910288 30 ctime=1459871850.623910288 qjackctl-0.4.2/src/qjackctlPatchbayRack.h0000644000175000001440000002367312700760152020643 0ustar00rncbcusers00000000000000// qjackctlPatchbayRack.h // /**************************************************************************** Copyright (C) 2003-2015, rncbc aka Rui Nuno Capela. All rights reserved. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. *****************************************************************************/ #ifndef __qjackctlPatchbayRack_h #define __qjackctlPatchbayRack_h #include "qjackctlAbout.h" #include #include #include #ifdef CONFIG_ALSA_SEQ #include #else typedef void snd_seq_t; #endif // Patchbay socket types. #define QJACKCTL_SOCKETTYPE_DEFAULT -1 #define QJACKCTL_SOCKETTYPE_JACK_AUDIO 0 #define QJACKCTL_SOCKETTYPE_JACK_MIDI 1 #define QJACKCTL_SOCKETTYPE_ALSA_MIDI 2 // Patchbay slot normalization modes. #define QJACKCTL_SLOTMODE_OPEN 0 #define QJACKCTL_SLOTMODE_HALF 1 #define QJACKCTL_SLOTMODE_FULL 2 // Patchbay change signal flags. #define QJACKCTL_CABLE_FAILED 0 #define QJACKCTL_CABLE_CHECKED 1 #define QJACKCTL_CABLE_CONNECTED 2 #define QJACKCTL_CABLE_DISCONNECTED 3 // Struct name says it all. struct qjackctlAlsaMidiPort { QString sClientName; QString sPortName; int iAlsaClient; int iAlsaPort; }; // Patchbay socket definition. class qjackctlPatchbaySocket { public: // Constructor. qjackctlPatchbaySocket(const QString& sSocketName, const QString& sClientName, int iSocketType); // Default destructor. ~qjackctlPatchbaySocket(); // Socket property accessors. const QString& name() const; const QString& clientName() const; int type() const; bool isExclusive() const; const QString& forward() const; // Socket property methods. void setName(const QString& sSocketName); void setClientName(const QString& sClientName); void setType(int iSocketType); void setExclusive(bool bExclusive); void setForward(const QString& sSocketForward); // Plug list primitive methods. void addPlug(const QString& sPlugName); void removePlug(const QString& sPlugName); // Plug list accessor. QStringList& pluglist(); // Simple socket type methods. static int typeFromText(const QString& sSocketType); static QString textFromType(int iSocketType); private: // Properties. QString m_sSocketName; QString m_sClientName; int m_iSocketType; bool m_bExclusive; QString m_sSocketForward; // Patchbay socket plug list. QStringList m_pluglist; }; // Patchbay socket slot definition. class qjackctlPatchbaySlot { public: // Constructor. qjackctlPatchbaySlot(const QString& sSlotName, int iSlotMode = QJACKCTL_SLOTMODE_OPEN); // Default destructor. ~qjackctlPatchbaySlot(); // Slot property accessors. const QString& name() const; int mode() const; // Slot property methods. void setName(const QString& sSlotName); void setMode(int iSlotMode); // Socket methods. void setOutputSocket(qjackctlPatchbaySocket *pSocket); void setInputSocket(qjackctlPatchbaySocket *pSocket); // Socket accessors. qjackctlPatchbaySocket *outputSocket() const; qjackctlPatchbaySocket *inputSocket() const; private: // Slot properties. QString m_sSlotName; int m_iSlotMode; // Socket references. qjackctlPatchbaySocket *m_pOutputSocket; qjackctlPatchbaySocket *m_pInputSocket; }; // Patchbay cable connection definition. class qjackctlPatchbayCable { public: // Constructor. qjackctlPatchbayCable(qjackctlPatchbaySocket *pOutputSocket, qjackctlPatchbaySocket *pInputSocket); // Default destructor. ~qjackctlPatchbayCable(); // Socket methods. void setOutputSocket(qjackctlPatchbaySocket *pSocket); void setInputSocket(qjackctlPatchbaySocket *pSocket); // Socket accessors. qjackctlPatchbaySocket *outputSocket() const; qjackctlPatchbaySocket *inputSocket() const; private: // Socket references. qjackctlPatchbaySocket *m_pOutputSocket; qjackctlPatchbaySocket *m_pInputSocket; }; // Patchbay rack profile definition. class qjackctlPatchbayRack : public QObject { Q_OBJECT public: // Constructor. qjackctlPatchbayRack(); // Default destructor. ~qjackctlPatchbayRack(); // Common socket list primitive methods. void addSocket(QList& socketlist, qjackctlPatchbaySocket *pSocket); void removeSocket(QList& socketlist, qjackctlPatchbaySocket *pSocket); // Slot list primitive methods. void addSlot(qjackctlPatchbaySlot *pSlot); void removeSlot(qjackctlPatchbaySlot *pSlot); // Cable list primitive methods. void addCable(qjackctlPatchbayCable *pCable); void removeCable(qjackctlPatchbayCable *pCable); // Common socket finder. qjackctlPatchbaySocket *findSocket( QList& socketlist, const QString& sSocketName, int iSocketType = QJACKCTL_SOCKETTYPE_DEFAULT); // Slot finders. qjackctlPatchbaySlot *findSlot(const QString& sSlotName); // Cable finder. qjackctlPatchbayCable *findCable( const QString& sOutputSocket, const QString& sInputSocket); qjackctlPatchbayCable *findCable(qjackctlPatchbayCable *pCablePtr); // Cable finder (logical matching by client/port names). qjackctlPatchbayCable *findCable ( const QString& sOClientName, const QString& sOPortName, const QString& sIClientName, const QString& sIPortName, int iSocketType); // Patchbay cleaner. void clear(); // Patchbay rack socket list accessors. QList& osocketlist(); QList& isocketlist(); // Patchbay rack slots list accessor. QList& slotlist(); // Patchbay cable connections list accessor. QList& cablelist(); // Overloaded cable connection persistence scan cycle methods. void connectJackScan(jack_client_t *pJackClient); void connectAlsaScan(snd_seq_t *pAlsaSeq); // Patchbay snapshot methods. void connectJackSnapshot(jack_client_t *pJackClient); void connectAlsaSnapshot(snd_seq_t *pAlsaSeq); // Patchbay reset/disconnect-all methods. void disconnectAllJackPorts(jack_client_t *pJackClient); void disconnectAllAlsaPorts(snd_seq_t *pAlsaSeq); signals: // Cable connection change signal. void cableConnected(const QString& sOutputPort, const QString& sInputPort, unsigned int uiCableFlags); private: // Audio connection scan related private methods. const char *findJackPort(const char **ppszJackPorts, const QString& sClientName, const QString& sPortName, int n = 0); void connectJackPorts( const char *pszOutputPort, const char *pszInputPort); void disconnectJackPorts( const char *pszOutputPort, const char *pszInputPort); void checkJackPorts( const char *pszOutputPort, const char *pszInputPort); void connectJackSocketPorts( qjackctlPatchbaySocket *pOutputSocket, const char *pszOutputPort, qjackctlPatchbaySocket *pInputSocket, const char *pszInputPort); void connectJackCable( qjackctlPatchbaySocket *pOutputSocket, qjackctlPatchbaySocket *pInputSocket); // MIDI connection scan related private methods. void loadAlsaPorts(QList& midiports, bool bReadable); qjackctlAlsaMidiPort *findAlsaPort(QList& midiports, const QString& sClientName, const QString& sPortName, int n); QString getAlsaPortName(qjackctlAlsaMidiPort *pAlsaPort); void setAlsaPort(qjackctlAlsaMidiPort *pAlsaPort, int iAlsaClient, int iAlsaPort); void connectAlsaPorts( qjackctlAlsaMidiPort *pOutputPort, qjackctlAlsaMidiPort *pInputPort); void disconnectAlsaPorts( qjackctlAlsaMidiPort *pOutputPort, qjackctlAlsaMidiPort *pInputPort); void checkAlsaPorts( qjackctlAlsaMidiPort *pOutputPort, qjackctlAlsaMidiPort *pInputPort); void connectAlsaSocketPorts( qjackctlPatchbaySocket *pOutputSocket, qjackctlAlsaMidiPort *pOutputPort, qjackctlPatchbaySocket *pInputSocket, qjackctlAlsaMidiPort *pInputPort); void connectAlsaCable( qjackctlPatchbaySocket *pOutputSocket, qjackctlPatchbaySocket *pInputSocket); void loadAlsaConnections(QList& midiports, qjackctlAlsaMidiPort *pAlsaPort, bool bReadable); // Audio socket/ports forwarding executive methods. void connectJackForwardPorts( const char *pszPort, const char *pszPortForward); void connectJackForward( qjackctlPatchbaySocket *pSocket, qjackctlPatchbaySocket *pSocketForward); // MIDI socket/ports forwarding executive methods. void connectAlsaForwardPorts( qjackctlAlsaMidiPort *pPort, qjackctlAlsaMidiPort *pPortForward); void connectAlsaForward( qjackctlPatchbaySocket *pSocket, qjackctlPatchbaySocket *pSocketForward); // Common socket forwarding scan method. void connectForwardScan(int iSocketType); // JACK snapshot executive. void connectJackSnapshotEx(int iSocketType); // JACK reset/disconnect-all executive. void disconnectAllJackPortsEx(int iSocketType); // Patchbay sockets lists. QList m_osocketlist; QList m_isocketlist; // Patchbay rack slots list. QList m_slotlist; // Patchbay cable connections list. QList m_cablelist; // Audio connection persistence cache variables. jack_client_t *m_pJackClient; const char **m_ppszOAudioPorts; const char **m_ppszIAudioPorts; const char **m_ppszOMidiPorts; const char **m_ppszIMidiPorts; // MIDI connection persistence cache variables. snd_seq_t *m_pAlsaSeq; QList m_omidiports; QList m_imidiports; }; #endif // __qjackctlPatchbayRack_h // qjackctlPatchbayRack.h qjackctl-0.4.2/src/PaxHeaders.14935/qjackctlPatchbayForm.ui0000644000000000000000000000013212700760152020275 xustar0030 mtime=1459871850.622909789 30 atime=1459871850.622909789 30 ctime=1459871850.622909789 qjackctl-0.4.2/src/qjackctlPatchbayForm.ui0000644000175000001440000004153312700760152021047 0ustar00rncbcusers00000000000000 rncbc aka Rui Nuno Capela JACK Audio Connection Kit - Qt GUI Interface. Copyright (C) 2003-2014, rncbc aka Rui Nuno Capela. All rights reserved. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. qjackctlPatchbayForm 0 0 520 320 1 1 0 0 Patchbay - JACK Audio Connection Kit :/images/patchbay1.png 4 4 Qt::Horizontal Qt::Horizontal QSizePolicy::Fixed 80 8 4 4 7 7 0 0 Qt::TabFocus Move currently selected output socket down one position Down :/images/down1.png Create a new output socket Add... :/images/add1.png Qt::Vertical QSizePolicy::Expanding 8 42 Edit currently selected input socket properties Edit... :/images/edit1.png Qt::Vertical QSizePolicy::Expanding 8 42 Move currently selected output socket up one position Up :/images/up1.png Remove currently selected output socket Remove :/images/remove1.png Duplicate (copy) currently selected output socket Copy... :/images/copy1.png Move currently selected output socket down one position Down :/images/down1.png Remove currently selected input socket Remove :/images/remove1.png Duplicate (copy) currently selected input socket Copy... :/images/copy1.png Create a new input socket Add... :/images/add1.png Edit currently selected output socket properties Edit... :/images/edit1.png Move currently selected output socket up one position Up :/images/up1.png Qt::Horizontal QSizePolicy::Fixed 80 8 4 4 Connect currently selected sockets &Connect :/images/connect1.png Disconnect currently selected sockets &Disconnect :/images/disconnect1.png Disconnect all currently connected sockets Disconnect &All :/images/disconnect1.png Qt::Horizontal QSizePolicy::Expanding 8 8 Expand all items E&xpand All :/images/expandall1.png Qt::Horizontal QSizePolicy::Expanding 8 8 Refresh current patchbay view &Refresh :/images/refresh1.png true 4 4 Create a new patchbay profile &New :/images/new1.png false Load patchbay profile &Load... :/images/open1.png false Save current patchbay profile &Save... :/images/save1.png false 7 5 0 0 75 true Current (recent) patchbay profile(s) Toggle activation of current patchbay profile Acti&vate :/images/apply1.png true false qjackctlPatchbayView QWidget

qjackctlPatchbay.h
NewPatchbayPushButton LoadPatchbayPushButton SavePatchbayPushButton PatchbayComboBox ActivatePatchbayPushButton OSocketAddPushButton OSocketEditPushButton OSocketCopyPushButton OSocketRemovePushButton OSocketMoveUpPushButton OSocketMoveDownPushButton PatchbayView ISocketAddPushButton ISocketEditPushButton ISocketCopyPushButton ISocketRemovePushButton ISocketMoveUpPushButton ISocketMoveDownPushButton ConnectPushButton DisconnectPushButton DisconnectAllPushButton ExpandAllPushButton RefreshPushButton qjackctl-0.4.2/src/PaxHeaders.14935/appdata0000644000000000000000000000013212700760152015177 xustar0030 mtime=1459871850.609903288 30 atime=1459871850.609903288 30 ctime=1459871850.609903288 qjackctl-0.4.2/src/appdata/0000755000175000001440000000000012700760152016020 5ustar00rncbcusers00000000000000qjackctl-0.4.2/src/appdata/PaxHeaders.14935/qjackctl.appdata.xml0000644000000000000000000000013212700760152021203 xustar0030 mtime=1459871850.609903288 30 atime=1459871850.609903288 30 ctime=1459871850.609903288 qjackctl-0.4.2/src/appdata/qjackctl.appdata.xml0000644000175000001440000000451612700760152021755 0ustar00rncbcusers00000000000000 qjackctl.desktop GPL-2.0+ GPL-2.0+ QjackCtl JACK Audio Connection Kit Qt GUI Interface Interface graphique Qt pour ke kit de connexion audio JACK

JACK Audio Connection Kit - Qt GUI Interface: A simple Qt application to control the JACK server. Written in C++ around the Qt framework for X11, most exclusively using Qt Designer. Provides a simple GUI dialog for setting several JACK server parameters, which are properly saved between sessions, and a way control of the status of the audio server. With time, this primordial interface has become richer by including a enhanced patchbay and connection control features.

Interface graphique Qt pour le kit de connexion audio Jack : une application Qt simple pour contrĆ“ler le server Jack. Ɖcrite en c++ autour du kit de dĆ©veloppement Qt pour X11, presque exclusivement en utilisant Qt Designer. Fourni une interface graphique simple de dialogue pour plusieurs paramĆØtres du serveur JACK qui sont sauvegardĆ©s proprement entre les sessions, et un moyen de contrĆ“le du status du serveur audio. Avec le temps, cette interface primordiale est devenue plus riche en incluant une baie de brassage amĆ©liorĆ©e et des fonctionnalitĆ©s de contrĆ“le de connexion.

http://qjackctl.sourceforge.net/qjackctlMainForm1.png The main window showing the application in action La fenĆŖtre principale montrant l'application en action Audio MIDI ALSA JACK Qt http://qjackctl.sourceforge.net rncbc@rncbc.org rncbc.org HiDpiIcon ModernToolkit
qjackctl-0.4.2/src/PaxHeaders.14935/qjackctl.desktop.in0000644000000000000000000000013212700760152017436 xustar0030 mtime=1459871850.616906788 30 atime=1459871850.616906788 30 ctime=1459871850.616906788 qjackctl-0.4.2/src/qjackctl.desktop.in0000644000175000001440000000145012700760152020202 0ustar00rncbcusers00000000000000[Desktop Entry] Name=@PACKAGE_NAME@ Version=1.0 GenericName=JACK Control GenericName[de]=JACK-Steuerung GenericName[fr]=ContrĆ“le JACK GenericName[it]=Interfaccia di controllo per JACK GenericName[ru]=Управление JACK Comment=QjackCtl is a JACK Audio Connection Kit Qt GUI Interface Comment[de]=Grafisches Werkzeug zur Steuerung des JACK-Audio-Systems Comment[fr]=QjackCtl est une interface graphique Qt pour le kit de connexion audio JACK Comment[it]=QjackCtl ĆØ un'interfaccia di controllo per JACK basata su Qt Comment[ru]=ŠŸŃ€Š¾Š³Ń€Š°Š¼Š¼Š° Š“Š»Ń ŃƒŠæŃ€Š°Š²Š»ŠµŠ½ŠøŃ Š·Š²ŃƒŠŗŠ¾Š²Ń‹Š¼ сервером JACK Exec=@ac_prefix@/bin/qjackctl Icon=qjackctl Categories=Audio;AudioVideo;Midi;X-Alsa;X-Jack;Qt; Keywords=Audio;MIDI;ALSA;JACK;LV2;Qt; Terminal=false Type=Application X-SuSE-translate=true qjackctl-0.4.2/src/PaxHeaders.14935/qjackctlSystemTray.h0000644000000000000000000000013212700760152017654 xustar0030 mtime=1459871850.627912288 30 atime=1459871850.627912288 30 ctime=1459871850.627912288 qjackctl-0.4.2/src/qjackctlSystemTray.h0000644000175000001440000000450312700760152020422 0ustar00rncbcusers00000000000000// qjackctlSystemTray.h // /**************************************************************************** Copyright (C) 2003-2016, rncbc aka Rui Nuno Capela. All rights reserved. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. *****************************************************************************/ #ifndef __qjackctlSystemTray_h #define __qjackctlSystemTray_h #include #include #include //---------------------------------------------------------------------------- // qjackctlSystemTray -- Custom system tray widget. class qjackctlSystemTray : public QSystemTrayIcon { Q_OBJECT public: // Constructor. qjackctlSystemTray(QWidget *pParent = 0); // Default destructor. ~qjackctlSystemTray(); // Background mask methods. void setBackground(const QColor& background); const QColor& background() const; // Set system tray icon overlay. void setPixmapOverlay(const QPixmap& pmOverlay); const QPixmap& pixmapOverlay() const; // System tray icon/pixmaps update method. void updatePixmap(); // Redirect to hide. void close(); signals: // Clicked signal. void clicked(); // Toggle Start/Stop server. void doubleClicked(); // Xrun reset signal. void middleClicked(); // Context menu signal. void contextMenuRequested(const QPoint& pos); protected slots: // Handle systeam tray activity. void activated(QSystemTrayIcon::ActivationReason); // Context menu slot. void contextMenuRequested(); private: // Instance pixmap and background color. QIcon m_icon; QMenu m_menu; QPixmap m_pixmap; QPixmap m_pixmapOverlay; QColor m_background; }; #endif // __qjackctlSystemTray_h // end of qjackctlSystemTray.h qjackctl-0.4.2/src/PaxHeaders.14935/qjackctlConnect.cpp0000644000000000000000000000013212700760152017454 xustar0030 mtime=1459871850.617907288 30 atime=1459871850.616906788 30 ctime=1459871850.617907288 qjackctl-0.4.2/src/qjackctlConnect.cpp0000644000175000001440000014273712700760152020236 0ustar00rncbcusers00000000000000// qjackctlConnect.cpp // /**************************************************************************** Copyright (C) 2003-2015, rncbc aka Rui Nuno Capela. All rights reserved. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. *****************************************************************************/ #include "qjackctlAbout.h" #include "qjackctlConnect.h" #include #include #include #include #include #include #include #include #include #include #include #include #if QT_VERSION >= 0x050000 #include #include #endif //---------------------------------------------------------------------- // class qjackctlPortItem -- Port list item. // // Constructor. qjackctlPortItem::qjackctlPortItem ( qjackctlClientItem *pClient ) : QTreeWidgetItem(pClient, QJACKCTL_PORTITEM) { m_pClient = pClient; // m_sPortName = sPortName; m_iPortMark = 0; m_bHilite = false; m_pClient->ports().append(this); } // Default destructor. qjackctlPortItem::~qjackctlPortItem (void) { const int iPort = m_pClient->ports().indexOf(this); if (iPort >= 0) m_pClient->ports().removeAt(iPort); QListIterator iter(m_connects); while (iter.hasNext()) (iter.next())->removeConnect(this); m_connects.clear(); } // Instance accessors. void qjackctlPortItem::setPortName ( const QString& sPortName ) { m_sPortName = sPortName; updatePortName(); } const QString& qjackctlPortItem::clientName (void) const { return m_pClient->clientName(); } const QString& qjackctlPortItem::portName (void) const { return m_sPortName; } // Port name alias accessors. void qjackctlPortItem::setPortNameAlias ( const QString& sPortNameAlias ) { // Check aliasing... qjackctlClientListView *pClientListView = (m_pClient->clientList())->listView(); qjackctlConnectAlias *pAliases = pClientListView->aliases(); if (pAliases) { const QString& sClientName = m_pClient->clientName(); pAliases->setPortAlias(sClientName, m_sPortName, sPortNameAlias); pClientListView->setDirty(true); } } QString qjackctlPortItem::portNameAlias ( bool *pbRenameEnabled ) const { QString sPortNameAlias = m_sPortName; bool bRenameEnabled = false; // Check aliasing... qjackctlClientListView *pClientListView = (m_pClient->clientList())->listView(); qjackctlConnectAlias *pAliases = pClientListView->aliases(); if (pAliases) { const QString& sClientName = m_pClient->clientName(); sPortNameAlias = pAliases->portAlias(sClientName, m_sPortName); bRenameEnabled = pClientListView->isRenameEnabled(); } if (pbRenameEnabled) *pbRenameEnabled = bRenameEnabled; return sPortNameAlias; } // Proto-pretty/alias display name method. void qjackctlPortItem::updatePortName ( bool /*bRename*/ ) { bool bRenameEnabled = false; const QString& sPortNameEx = portNameAlias(&bRenameEnabled); setPortText(sPortNameEx, bRenameEnabled); } // Tooltip text builder. QString qjackctlPortItem::tooltip (void) const { return portName(); } // Port display name accessors. void qjackctlPortItem::setPortText ( const QString& sPortText, bool bRenameEnabled ) { QTreeWidgetItem::setText(0, sPortText); const Qt::ItemFlags flags = QTreeWidgetItem::flags(); if (bRenameEnabled) QTreeWidgetItem::setFlags(flags | Qt::ItemIsEditable); else QTreeWidgetItem::setFlags(flags & ~Qt::ItemIsEditable); } QString qjackctlPortItem::portText (void) const { return QTreeWidgetItem::text(0); } // Complete client:port name helper. QString qjackctlPortItem::clientPortName (void) const { return m_pClient->clientName() + ':' + m_sPortName; } // Connect client item accessor. qjackctlClientItem *qjackctlPortItem::client (void) const { return m_pClient; } // Client:port set housekeeping marker. void qjackctlPortItem::markPort ( int iMark ) { setHilite(false); m_iPortMark = iMark; if (iMark > 0) m_connects.clear(); } void qjackctlPortItem::markClientPort ( int iMark ) { markPort(iMark); m_pClient->markClient(iMark); } int qjackctlPortItem::portMark (void) const { return m_iPortMark; } // Connected port list primitives. void qjackctlPortItem::addConnect ( qjackctlPortItem *pPort ) { m_connects.append(pPort); } void qjackctlPortItem::removeConnect ( qjackctlPortItem *pPort ) { pPort->setHilite(false); const int iPort = m_connects.indexOf(pPort); if (iPort >= 0) m_connects.removeAt(iPort); } // Connected port finder. qjackctlPortItem *qjackctlPortItem::findConnect ( const QString& sClientPortName ) { QListIterator iter(m_connects); while (iter.hasNext()) { qjackctlPortItem *pPort = iter.next(); if (sClientPortName == pPort->clientPortName()) return pPort; } return NULL; } qjackctlPortItem *qjackctlPortItem::findConnectPtr ( qjackctlPortItem *pPortPtr ) { QListIterator iter(m_connects); while (iter.hasNext()) { qjackctlPortItem *pPort = iter.next(); if (pPortPtr == pPort) return pPort; } return NULL; } // Connection cache list accessor. const QList& qjackctlPortItem::connects (void) const { return m_connects; } // Connectiopn highlight methods. bool qjackctlPortItem::isHilite (void) const { return m_bHilite; } void qjackctlPortItem::setHilite ( bool bHilite ) { // Update the port highlightning if changed... if ((m_bHilite && !bHilite) || (!m_bHilite && bHilite)) { m_bHilite = bHilite; // Propagate this to the parent... m_pClient->setHilite(bHilite); } // Set the new color. QTreeWidget *pTreeWidget = QTreeWidgetItem::treeWidget(); if (pTreeWidget == NULL) return; const QPalette& pal = pTreeWidget->palette(); QTreeWidgetItem::setTextColor(0, m_bHilite ? (pal.base().color().value() < 0x7f ? Qt::cyan : Qt::blue) : pal.text().color()); } // Proxy sort override method. // - Natural decimal sorting comparator. bool qjackctlPortItem::operator< ( const QTreeWidgetItem& other ) const { return qjackctlClientList::lessThan(*this, other); } //---------------------------------------------------------------------- // class qjackctlClientItem -- Jack client list item. // // Constructor. qjackctlClientItem::qjackctlClientItem ( qjackctlClientList *pClientList ) : QTreeWidgetItem(pClientList->listView(), QJACKCTL_CLIENTITEM) { m_pClientList = pClientList; // m_sClientName = sClientName; m_iClientMark = 0; m_iHilite = 0; m_pClientList->clients().append(this); } // Default destructor. qjackctlClientItem::~qjackctlClientItem (void) { qDeleteAll(m_ports); m_ports.clear(); const int iClient = m_pClientList->clients().indexOf(this); if (iClient >= 0) m_pClientList->clients().removeAt(iClient); } // Port finder. qjackctlPortItem *qjackctlClientItem::findPort (const QString& sPortName) { QListIterator iter(m_ports); while (iter.hasNext()) { qjackctlPortItem *pPort = iter.next(); if (sPortName == pPort->portName()) return pPort; } return NULL; } // Client list accessor. qjackctlClientList *qjackctlClientItem::clientList (void) const { return m_pClientList; } // Port list accessor. QList& qjackctlClientItem::ports (void) { return m_ports; } // Instance accessors. void qjackctlClientItem::setClientName ( const QString& sClientName ) { m_sClientName = sClientName; updateClientName(); } const QString& qjackctlClientItem::clientName (void) const { return m_sClientName; } // Client name alias accessors. void qjackctlClientItem::setClientNameAlias ( const QString& sClientNameAlias ) { qjackctlClientListView *pClientListView = m_pClientList->listView(); qjackctlConnectAlias *pAliases = pClientListView->aliases(); if (pAliases) { pAliases->setClientAlias(m_sClientName, sClientNameAlias); pClientListView->setDirty(true); } } QString qjackctlClientItem::clientNameAlias ( bool *pbRenameEnabled ) const { QString sClientNameAlias = m_sClientName; bool bRenameEnabled = false; // Check aliasing... qjackctlClientListView *pClientListView = m_pClientList->listView(); qjackctlConnectAlias *pAliases = pClientListView->aliases(); if (pAliases) { sClientNameAlias = pAliases->clientAlias(m_sClientName); bRenameEnabled = pClientListView->isRenameEnabled(); } if (pbRenameEnabled) *pbRenameEnabled = bRenameEnabled; return sClientNameAlias; } // Proto-pretty/alias display name method. void qjackctlClientItem::updateClientName ( bool /*bRename*/ ) { bool bRenameEnabled = false; const QString& sClientNameEx = clientNameAlias(&bRenameEnabled); setClientText(sClientNameEx, bRenameEnabled); } // Client display name accessors. void qjackctlClientItem::setClientText ( const QString& sClientText, bool bRenameEnabled ) { QTreeWidgetItem::setText(0, sClientText); const Qt::ItemFlags flags = QTreeWidgetItem::flags(); if (bRenameEnabled) QTreeWidgetItem::setFlags(flags | Qt::ItemIsEditable); else QTreeWidgetItem::setFlags(flags & ~Qt::ItemIsEditable); } QString qjackctlClientItem::clientText (void) const { return QTreeWidgetItem::text(0); } // Readable flag client accessor. bool qjackctlClientItem::isReadable (void) const { return m_pClientList->isReadable(); } // Client:port set housekeeping marker. void qjackctlClientItem::markClient ( int iMark ) { setHilite(false); m_iClientMark = iMark; } void qjackctlClientItem::markClientPorts ( int iMark ) { markClient(iMark); QListIterator iter(m_ports); while (iter.hasNext()) (iter.next())->markPort(iMark); } int qjackctlClientItem::cleanClientPorts ( int iMark ) { int iDirtyCount = 0; QMutableListIterator iter(m_ports); while (iter.hasNext()) { qjackctlPortItem *pPort = iter.next(); if (pPort->portMark() == iMark) { iter.remove(); delete pPort; iDirtyCount++; } } return iDirtyCount; } int qjackctlClientItem::clientMark (void) const { return m_iClientMark; } // Connectiopn highlight methods. bool qjackctlClientItem::isHilite (void) const { return (m_iHilite > 0); } void qjackctlClientItem::setHilite ( bool bHilite ) { if (bHilite) m_iHilite++; else if (m_iHilite > 0) m_iHilite--; // Set the new color. QTreeWidget *pTreeWidget = QTreeWidgetItem::treeWidget(); if (pTreeWidget == NULL) return; const QPalette& pal = pTreeWidget->palette(); QTreeWidgetItem::setTextColor(0, m_iHilite > 0 ? (pal.base().color().value() < 0x7f ? Qt::darkCyan : Qt::darkBlue) : pal.text().color()); } // Socket item openness status. void qjackctlClientItem::setOpen ( bool bOpen ) { QTreeWidgetItem::setExpanded(bOpen); } bool qjackctlClientItem::isOpen (void) const { return QTreeWidgetItem::isExpanded(); } // Proxy sort override method. // - Natural decimal sorting comparator. bool qjackctlClientItem::operator< ( const QTreeWidgetItem& other ) const { return qjackctlClientList::lessThan(*this, other); } //---------------------------------------------------------------------- // qjackctlClientList -- Client list. // // Constructor. qjackctlClientList::qjackctlClientList ( qjackctlClientListView *pListView, bool bReadable ) { m_pListView = pListView; m_bReadable = bReadable; m_pHiliteItem = 0; } // Default destructor. qjackctlClientList::~qjackctlClientList (void) { clear(); } // Do proper contents cleanup. void qjackctlClientList::clear (void) { qDeleteAll(m_clients); m_clients.clear(); if (m_pListView) m_pListView->clear(); } // Client finder. qjackctlClientItem *qjackctlClientList::findClient ( const QString& sClientName ) { QListIterator iter(m_clients); while (iter.hasNext()) { qjackctlClientItem *pClient = iter.next(); if (sClientName == pClient->clientName()) return pClient; } return NULL; } // Client:port finder. qjackctlPortItem *qjackctlClientList::findClientPort ( const QString& sClientPort ) { qjackctlPortItem *pPort = 0; int iColon = sClientPort.indexOf(':'); if (iColon >= 0) { qjackctlClientItem *pClient = findClient(sClientPort.left(iColon)); if (pClient) { pPort = pClient->findPort( sClientPort.right(sClientPort.length() - iColon - 1)); } } return pPort; } // Client list accessor. QList& qjackctlClientList::clients (void) { return m_clients; } // List view accessor. qjackctlClientListView *qjackctlClientList::listView (void) const { return m_pListView; } // Readable flag client accessor. bool qjackctlClientList::isReadable (void) const { return m_bReadable; } // Client:port set housekeeping marker. void qjackctlClientList::markClientPorts ( int iMark ) { m_pHiliteItem = 0; QListIterator iter(m_clients); while (iter.hasNext()) (iter.next())->markClientPorts(iMark); } int qjackctlClientList::cleanClientPorts ( int iMark ) { int iDirtyCount = 0; QMutableListIterator iter(m_clients); while (iter.hasNext()) { qjackctlClientItem *pClient = iter.next(); if (pClient->clientMark() == iMark) { iter.remove(); delete pClient; iDirtyCount++; } else { iDirtyCount += pClient->cleanClientPorts(iMark); } } return iDirtyCount; } // Client:port hilite update stabilization. void qjackctlClientList::hiliteClientPorts (void) { qjackctlClientItem *pClient; qjackctlPortItem *pPort; QTreeWidgetItem *pItem = m_pListView->currentItem(); // Dehilite the previous selected items. if (m_pHiliteItem && pItem != m_pHiliteItem) { if (m_pHiliteItem->type() == QJACKCTL_CLIENTITEM) { pClient = static_cast (m_pHiliteItem); QListIterator iter(pClient->ports()); while (iter.hasNext()) { pPort = iter.next(); QListIterator it(pPort->connects()); while (it.hasNext()) (it.next())->setHilite(false); } } else { pPort = static_cast (m_pHiliteItem); QListIterator it(pPort->connects()); while (it.hasNext()) (it.next())->setHilite(false); } } // Hilite the now current selected items. if (pItem) { if (pItem->type() == QJACKCTL_CLIENTITEM) { pClient = static_cast (pItem); QListIterator iter(pClient->ports()); while (iter.hasNext()) { pPort = iter.next(); QListIterator it(pPort->connects()); while (it.hasNext()) (it.next())->setHilite(true); } } else { pPort = static_cast (pItem); QListIterator it(pPort->connects()); while (it.hasNext()) (it.next())->setHilite(true); } } // Do remember this one, ever. m_pHiliteItem = pItem; } // Natural decimal sorting comparator. bool qjackctlClientList::lessThan ( const QTreeWidgetItem& i1, const QTreeWidgetItem& i2 ) { const QString& s1 = i1.text(0); const QString& s2 = i2.text(0); const int cch1 = s1.length(); const int cch2 = s2.length(); int ich1, ich2; for (ich1 = ich2 = 0; ich1 < cch1 && ich2 < cch2; ich1++, ich2++) { // Skip (white)spaces... while (s1.at(ich1).isSpace()) ich1++; while (s2.at(ich2).isSpace()) ich2++; // Normalize (to uppercase) the next characters... QChar ch1 = s1.at(ich1).toUpper(); QChar ch2 = s2.at(ich2).toUpper(); if (ch1.isDigit() && ch2.isDigit()) { // Find the whole length numbers... const int iDigits1 = ich1++; while (ich1 < cch1 && s1.at(ich1).isDigit()) ich1++; const int iDigits2 = ich2++; while (ich2 < cch2 && s2.at(ich2).isDigit()) ich2++; // Compare as natural decimal-numbers... const int n1 = s1.mid(iDigits1, ich1 - iDigits1).toInt(); const int n2 = s2.mid(iDigits2, ich2 - iDigits2).toInt(); if (n1 != n2) return (n1 < n2); // Never go out of bounds... if (ich1 >= cch1 || ich1 >= cch2) break; // Go on with this next char... ch1 = s1.at(ich1).toUpper(); ch2 = s2.at(ich2).toUpper(); } // Compare this char... if (ch1 != ch2) return (ch1 < ch2); } // Probable exact match. return false; } // Do proper contents refresh/update. void qjackctlClientList::refresh (void) { QHeaderView *pHeader = m_pListView->header(); m_pListView->sortItems( pHeader->sortIndicatorSection(), pHeader->sortIndicatorOrder()); } //---------------------------------------------------------------------------- // qjackctlClientListView -- Client list view, supporting drag-n-drop. // Constructor. qjackctlClientListView::qjackctlClientListView ( qjackctlConnectView *pConnectView, bool bReadable ) : QTreeWidget(pConnectView) { m_pConnectView = pConnectView; m_pAutoOpenTimer = 0; m_iAutoOpenTimeout = 0; m_pDragItem = NULL; m_pDragItem = NULL; m_pAliases = NULL; m_bRenameEnabled = false; QHeaderView *pHeader = QTreeWidget::header(); pHeader->setDefaultAlignment(Qt::AlignLeft); // pHeader->setDefaultSectionSize(120); #if QT_VERSION >= 0x050000 // pHeader->setSectionResizeMode(QHeaderView::Custom); pHeader->setSectionsMovable(false); pHeader->setSectionsClickable(true); #else // pHeader->setResizeMode(QHeaderView::Custom); pHeader->setMovable(false); pHeader->setClickable(true); #endif pHeader->setSortIndicatorShown(true); pHeader->setStretchLastSection(true); QTreeWidget::setRootIsDecorated(true); QTreeWidget::setUniformRowHeights(true); // QTreeWidget::setDragEnabled(true); QTreeWidget::setAcceptDrops(true); QTreeWidget::setDropIndicatorShown(true); QTreeWidget::setAutoScroll(true); QTreeWidget::setSelectionMode(QAbstractItemView::SingleSelection); QTreeWidget::setSizePolicy( QSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding)); QTreeWidget::setSortingEnabled(true); QTreeWidget::setMinimumWidth(120); QTreeWidget::setColumnCount(1); QString sText; if (bReadable) sText = tr("Readable Clients / Output Ports"); else sText = tr("Writable Clients / Input Ports"); QTreeWidget::headerItem()->setText(0, sText); QTreeWidget::sortItems(0, Qt::AscendingOrder); QTreeWidget::setToolTip(sText); // Trap for help/tool-tips events. QTreeWidget::viewport()->installEventFilter(this); QObject::connect(QTreeWidget::itemDelegate(), SIGNAL(commitData(QWidget*)), SLOT(renamedSlot())); setAutoOpenTimeout(800); } // Default destructor. qjackctlClientListView::~qjackctlClientListView (void) { setAutoOpenTimeout(0); } // Binding indirect accessor. qjackctlConnect *qjackctlClientListView::binding() const { return m_pConnectView->binding(); } // Auto-open timeout method. void qjackctlClientListView::setAutoOpenTimeout ( int iAutoOpenTimeout ) { m_iAutoOpenTimeout = iAutoOpenTimeout; if (m_pAutoOpenTimer) delete m_pAutoOpenTimer; m_pAutoOpenTimer = NULL; if (m_iAutoOpenTimeout > 0) { m_pAutoOpenTimer = new QTimer(this); QObject::connect(m_pAutoOpenTimer, SIGNAL(timeout()), SLOT(timeoutSlot())); } } // Auto-open timeout accessor. int qjackctlClientListView::autoOpenTimeout (void) const { return m_iAutoOpenTimeout; } // Aliasing support methods. void qjackctlClientListView::setAliases ( qjackctlConnectAlias *pAliases, bool bRenameEnabled ) { m_pAliases = pAliases; m_bRenameEnabled = bRenameEnabled; // For each client item, if any. const int iItemCount = QTreeWidget::topLevelItemCount(); for (int iItem = 0; iItem < iItemCount; ++iItem) { QTreeWidgetItem *pItem = QTreeWidget::topLevelItem(iItem); if (pItem->type() != QJACKCTL_CLIENTITEM) continue; qjackctlClientItem *pClientItem = static_cast (pItem); if (pClientItem == NULL) continue; pClientItem->updateClientName(); // For each port item... const int iChildCount = pClientItem->childCount(); for (int iChild = 0; iChild < iChildCount; ++iChild) { QTreeWidgetItem *pChildItem = pClientItem->child(iChild); if (pChildItem->type() != QJACKCTL_PORTITEM) continue; qjackctlPortItem *pPortItem = static_cast (pChildItem); if (pPortItem == NULL) continue; pPortItem->updatePortName(); } } } qjackctlConnectAlias *qjackctlClientListView::aliases (void) const { return m_pAliases; } bool qjackctlClientListView::isRenameEnabled (void) const { return m_bRenameEnabled; } // In-place aliasing slot. void qjackctlClientListView::startRenameSlot (void) { QTreeWidgetItem *pItem = QTreeWidget::currentItem(); if (pItem) QTreeWidget::editItem(pItem, 0); } // In-place aliasing slot. void qjackctlClientListView::renamedSlot (void) { if (m_pAliases == NULL) return; QTreeWidgetItem *pItem = QTreeWidget::currentItem(); if (pItem == NULL) return; const QString& sText = pItem->text(0); if (pItem->type() == QJACKCTL_CLIENTITEM) { qjackctlClientItem *pClientItem = static_cast (pItem); pClientItem->setClientNameAlias(sText); pClientItem->updateClientName(true); } else { qjackctlPortItem *pPortItem = static_cast (pItem); pPortItem->setPortNameAlias(sText); pPortItem->updatePortName(true); } // m_pConnectView->setDirty(true); } // Auto-open timer slot. void qjackctlClientListView::timeoutSlot (void) { if (m_pAutoOpenTimer) { m_pAutoOpenTimer->stop(); if (m_pDropItem && m_pDropItem->type() == QJACKCTL_CLIENTITEM) { qjackctlClientItem *pClientItem = static_cast (m_pDropItem); if (pClientItem && !pClientItem->isOpen()) pClientItem->setOpen(true); } } } // Trap for help/tool-tip events. bool qjackctlClientListView::eventFilter ( QObject *pObject, QEvent *pEvent ) { QWidget *pViewport = QTreeWidget::viewport(); if (static_cast (pObject) == pViewport && pEvent->type() == QEvent::ToolTip) { QHelpEvent *pHelpEvent = static_cast (pEvent); if (pHelpEvent) { QTreeWidgetItem *pItem = QTreeWidget::itemAt(pHelpEvent->pos()); if (pItem && pItem->type() == QJACKCTL_CLIENTITEM) { qjackctlClientItem *pClientItem = static_cast (pItem); if (pClientItem) { QToolTip::showText(pHelpEvent->globalPos(), pClientItem->clientName(), pViewport); return true; } } else if (pItem && pItem->type() == QJACKCTL_PORTITEM) { qjackctlPortItem *pPortItem = static_cast (pItem); if (pPortItem) { QToolTip::showText(pHelpEvent->globalPos(), pPortItem->tooltip(), pViewport); return true; } } } } // Not handled here. return QTreeWidget::eventFilter(pObject, pEvent); } // Drag-n-drop stuff. QTreeWidgetItem *qjackctlClientListView::dragDropItem ( const QPoint& pos ) { QTreeWidgetItem *pItem = QTreeWidget::itemAt(pos); if (pItem) { if (m_pDropItem != pItem) { QTreeWidget::setCurrentItem(pItem); m_pDropItem = pItem; if (m_pAutoOpenTimer) m_pAutoOpenTimer->start(m_iAutoOpenTimeout); qjackctlConnect *pConnect = m_pConnectView->binding(); if ((pItem->flags() & Qt::ItemIsDropEnabled) == 0 || pConnect == NULL || !pConnect->canConnectSelected()) pItem = NULL; } } else { m_pDropItem = NULL; if (m_pAutoOpenTimer) m_pAutoOpenTimer->stop(); } return pItem; } void qjackctlClientListView::dragEnterEvent ( QDragEnterEvent *pDragEnterEvent ) { if (pDragEnterEvent->source() != this && pDragEnterEvent->mimeData()->hasText() && dragDropItem(pDragEnterEvent->pos())) { pDragEnterEvent->accept(); } else { pDragEnterEvent->ignore(); } } void qjackctlClientListView::dragMoveEvent ( QDragMoveEvent *pDragMoveEvent ) { if (pDragMoveEvent->source() != this && pDragMoveEvent->mimeData()->hasText() && dragDropItem(pDragMoveEvent->pos())) { pDragMoveEvent->accept(); } else { pDragMoveEvent->ignore(); } } void qjackctlClientListView::dragLeaveEvent ( QDragLeaveEvent * ) { m_pDropItem = 0; if (m_pAutoOpenTimer) m_pAutoOpenTimer->stop(); } void qjackctlClientListView::dropEvent( QDropEvent *pDropEvent ) { if (pDropEvent->source() != this && pDropEvent->mimeData()->hasText() && dragDropItem(pDropEvent->pos())) { const QString sText = pDropEvent->mimeData()->text(); qjackctlConnect *pConnect = m_pConnectView->binding(); if (!sText.isEmpty() && pConnect) pConnect->connectSelected(); } dragLeaveEvent(0); } // Handle mouse events for drag-and-drop stuff. void qjackctlClientListView::mousePressEvent ( QMouseEvent *pMouseEvent ) { QTreeWidget::mousePressEvent(pMouseEvent); if (pMouseEvent->button() == Qt::LeftButton) { m_posDrag = pMouseEvent->pos(); m_pDragItem = QTreeWidget::itemAt(m_posDrag); } } void qjackctlClientListView::mouseMoveEvent ( QMouseEvent *pMouseEvent ) { QTreeWidget::mouseMoveEvent(pMouseEvent); if ((pMouseEvent->buttons() & Qt::LeftButton) && m_pDragItem && ((pMouseEvent->pos() - m_posDrag).manhattanLength() >= QApplication::startDragDistance())) { // We'll start dragging something alright... QMimeData *pMimeData = new QMimeData(); pMimeData->setText(m_pDragItem->text(0)); QDrag *pDrag = new QDrag(this); pDrag->setMimeData(pMimeData); pDrag->setPixmap(m_pDragItem->icon(0).pixmap(16)); pDrag->setHotSpot(QPoint(-4, -12)); pDrag->start(Qt::LinkAction); // We've dragged and maybe dropped it by now... m_pDragItem = NULL; } } // Context menu request event handler. void qjackctlClientListView::contextMenuEvent ( QContextMenuEvent *pContextMenuEvent ) { qjackctlConnect *pConnect = m_pConnectView->binding(); if (pConnect == 0) return; QMenu menu(this); QAction *pAction; pAction = menu.addAction(QIcon(":/images/connect1.png"), tr("&Connect"), pConnect, SLOT(connectSelected()), tr("Alt+C", "Connect")); pAction->setEnabled(pConnect->canConnectSelected()); pAction = menu.addAction(QIcon(":/images/disconnect1.png"), tr("&Disconnect"), pConnect, SLOT(disconnectSelected()), tr("Alt+D", "Disconnect")); pAction->setEnabled(pConnect->canDisconnectSelected()); pAction = menu.addAction(QIcon(":/images/disconnectall1.png"), tr("Disconnect &All"), pConnect, SLOT(disconnectAll()), tr("Alt+A", "Disconect All")); pAction->setEnabled(pConnect->canDisconnectAll()); if (m_bRenameEnabled) { menu.addSeparator(); pAction = menu.addAction(QIcon(":/images/edit1.png"), tr("Re&name"), this, SLOT(startRenameSlot()), tr("Alt+N", "Rename")); QTreeWidgetItem *pItem = QTreeWidget::currentItem(); pAction->setEnabled(pItem && (pItem->flags() & Qt::ItemIsEditable)); } menu.addSeparator(); pAction = menu.addAction(QIcon(":/images/refresh1.png"), tr("&Refresh"), pConnect, SLOT(refresh()), tr("Alt+R", "Refresh")); menu.exec(pContextMenuEvent->globalPos()); } // Dirty flag methods. void qjackctlClientListView::setDirty ( bool bDirty ) { m_pConnectView->setDirty(bDirty); } bool qjackctlClientListView::isDirty (void) const { return m_pConnectView->isDirty(); } //---------------------------------------------------------------------- // qjackctlConnectorView -- Jack port connector widget. // // Constructor. qjackctlConnectorView::qjackctlConnectorView ( qjackctlConnectView *pConnectView ) : QWidget(pConnectView) { m_pConnectView = pConnectView; QWidget::setMinimumWidth(20); // QWidget::setMaximumWidth(120); QWidget::setSizePolicy( QSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding)); } // Default destructor. qjackctlConnectorView::~qjackctlConnectorView (void) { } // Legal client/port item position helper. int qjackctlConnectorView::itemY ( QTreeWidgetItem *pItem ) const { QRect rect; QTreeWidget *pList = pItem->treeWidget(); QTreeWidgetItem *pParent = pItem->parent(); qjackctlClientItem *pClientItem = NULL; if (pParent && pParent->type() == QJACKCTL_CLIENTITEM) pClientItem = static_cast (pParent); if (pClientItem && !pClientItem->isOpen()) { rect = pList->visualItemRect(pClientItem); } else { rect = pList->visualItemRect(pItem); } return rect.top() + rect.height() / 2; } // Draw visible port connection relation lines void qjackctlConnectorView::drawConnectionLine ( QPainter *pPainter, int x1, int y1, int x2, int y2, int h1, int h2, const QPen& pen ) { // Set apropriate pen... pPainter->setPen(pen); // Account for list view headers. y1 += h1; y2 += h2; // Invisible output ports don't get a connecting dot. if (y1 > h1) pPainter->drawLine(x1, y1, x1 + 4, y1); // How do we'll draw it? if (m_pConnectView->isBezierLines()) { // Setup control points QPolygon spline(4); const int cp = int(float(x2 - x1 - 8) * 0.4f); spline.putPoints(0, 4, x1 + 4, y1, x1 + 4 + cp, y1, x2 - 4 - cp, y2, x2 - 4, y2); // The connection line, it self. QPainterPath path; path.moveTo(spline.at(0)); path.cubicTo(spline.at(1), spline.at(2), spline.at(3)); pPainter->strokePath(path, pen); } else pPainter->drawLine(x1 + 4, y1, x2 - 4, y2); // Invisible input ports don't get a connecting dot. if (y2 > h2) pPainter->drawLine(x2 - 4, y2, x2, y2); } // Draw visible port connection relation arrows. void qjackctlConnectorView::paintEvent ( QPaintEvent * ) { if (m_pConnectView == NULL) return; if (m_pConnectView->OListView() == NULL || m_pConnectView->IListView() == NULL) return; qjackctlClientListView *pOListView = m_pConnectView->OListView(); qjackctlClientListView *pIListView = m_pConnectView->IListView(); const int yc = QWidget::pos().y(); const int yo = pOListView->pos().y(); const int yi = pIListView->pos().y(); QPainter painter(this); int x1, y1, h1; int x2, y2, h2; int i, rgb[3] = { 0x33, 0x66, 0x99 }; // Draw all lines anti-aliased... painter.setRenderHint(QPainter::Antialiasing); // Inline adaptive to darker background themes... if (QWidget::palette().window().color().value() < 0x7f) for (i = 0; i < 3; ++i) rgb[i] += 0x33; // Initialize color changer. i = 0; // Almost constants. x1 = 0; x2 = QWidget::width(); h1 = (pOListView->header())->sizeHint().height(); h2 = (pIListView->header())->sizeHint().height(); // For each output client item... const int iItemCount = pOListView->topLevelItemCount(); for (int iItem = 0; iItem < iItemCount; ++iItem) { QTreeWidgetItem *pItem = pOListView->topLevelItem(iItem); if (pItem->type() != QJACKCTL_CLIENTITEM) continue; qjackctlClientItem *pOClient = static_cast (pItem); if (pOClient == NULL) continue; // Set new connector color. ++i; QPen pen(QColor(rgb[i % 3], rgb[(i / 3) % 3], rgb[(i / 9) % 3])); // For each port item const int iChildCount = pOClient->childCount(); for (int iChild = 0; iChild < iChildCount; ++iChild) { QTreeWidgetItem *pChild = pOClient->child(iChild); if (pChild->type() != QJACKCTL_PORTITEM) continue; qjackctlPortItem *pOPort = static_cast (pChild); if (pOPort) { // Set proposed line width... const int w1 = (pOPort->isHilite() ? 2 : 1); // Get starting connector arrow coordinates. y1 = itemY(pOPort) + (yo - yc); // Get port connections... QListIterator iter(pOPort->connects()); while (iter.hasNext()) { qjackctlPortItem *pIPort = iter.next(); // Obviously, should be a connection // from pOPort to pIPort items: y2 = itemY(pIPort) + (yi - yc); pen.setWidth(pIPort->isHilite() ? 2 : w1); drawConnectionLine(&painter, x1, y1, x2, y2, h1, h2, pen); } } } } } // Context menu request event handler. void qjackctlConnectorView::contextMenuEvent ( QContextMenuEvent *pContextMenuEvent ) { qjackctlConnect *pConnect = m_pConnectView->binding(); if (pConnect == 0) return; QMenu menu(this); QAction *pAction; pAction = menu.addAction(QIcon(":/images/connect1.png"), tr("&Connect"), pConnect, SLOT(connectSelected()), tr("Alt+C", "Connect")); pAction->setEnabled(pConnect->canConnectSelected()); pAction = menu.addAction(QIcon(":/images/disconnect1.png"), tr("&Disconnect"), pConnect, SLOT(disconnectSelected()), tr("Alt+D", "Disconnect")); pAction->setEnabled(pConnect->canDisconnectSelected()); pAction = menu.addAction(QIcon(":/images/disconnectall1.png"), tr("Disconnect &All"), pConnect, SLOT(disconnectAll()), tr("Alt+A", "Disconect All")); pAction->setEnabled(pConnect->canDisconnectAll()); menu.addSeparator(); pAction = menu.addAction(QIcon(":/images/refresh1.png"), tr("&Refresh"), pConnect, SLOT(refresh()), tr("Alt+R", "Refresh")); menu.exec(pContextMenuEvent->globalPos()); } // Widget event slots... void qjackctlConnectorView::contentsChanged (void) { QWidget::update(); } //---------------------------------------------------------------------------- // qjackctlConnectView -- Integrated connections view widget. // Constructor. qjackctlConnectView::qjackctlConnectView ( QWidget *pParent ) : QSplitter(Qt::Horizontal, pParent) { m_pOListView = new qjackctlClientListView(this, true); m_pConnectorView = new qjackctlConnectorView(this); m_pIListView = new qjackctlClientListView(this, false); m_pConnect = NULL; m_bBezierLines = false; m_iIconSize = 0; QSplitter::setHandleWidth(2); QObject::connect(m_pOListView, SIGNAL(itemExpanded(QTreeWidgetItem *)), m_pConnectorView, SLOT(contentsChanged())); QObject::connect(m_pOListView, SIGNAL(itemCollapsed(QTreeWidgetItem *)), m_pConnectorView, SLOT(contentsChanged())); QObject::connect(m_pOListView->verticalScrollBar(), SIGNAL(valueChanged(int)), m_pConnectorView, SLOT(contentsChanged())); QObject::connect(m_pOListView->header(), SIGNAL(sectionClicked(int)), m_pConnectorView, SLOT(contentsChanged())); QObject::connect(m_pIListView, SIGNAL(itemExpanded(QTreeWidgetItem *)), m_pConnectorView, SLOT(contentsChanged())); QObject::connect(m_pIListView, SIGNAL(itemCollapsed(QTreeWidgetItem *)), m_pConnectorView, SLOT(contentsChanged())); QObject::connect(m_pIListView->verticalScrollBar(), SIGNAL(valueChanged(int)), m_pConnectorView, SLOT(contentsChanged())); QObject::connect(m_pIListView->header(), SIGNAL(sectionClicked(int)), m_pConnectorView, SLOT(contentsChanged())); m_bDirty = false; } // Default destructor. qjackctlConnectView::~qjackctlConnectView (void) { } // Connect binding methods. void qjackctlConnectView::setBinding ( qjackctlConnect *pConnect ) { m_pConnect = pConnect; } qjackctlConnect *qjackctlConnectView::binding (void) const { return m_pConnect; } // Connect client list accessors. qjackctlClientList *qjackctlConnectView::OClientList (void) const { if (m_pConnect) return m_pConnect->OClientList(); else return NULL; } qjackctlClientList *qjackctlConnectView::IClientList (void) const { if (m_pConnect) return m_pConnect->OClientList(); else return NULL; } // Connector line style accessors. void qjackctlConnectView::setBezierLines ( bool bBezierLines ) { m_bBezierLines = bBezierLines; } bool qjackctlConnectView::isBezierLines (void) const { return m_bBezierLines; } // Common icon size methods. void qjackctlConnectView::setIconSize ( int iIconSize ) { // Update only if changed. if (iIconSize == m_iIconSize) return; // Go for it... m_iIconSize = iIconSize; // Update item sizes properly... const int px = (16 << m_iIconSize); const QSize iconSize(px, px); m_pOListView->setIconSize(iconSize); m_pIListView->setIconSize(iconSize); // Call binding descendant implementation, // and do a complete content reset... if (m_pConnect) m_pConnect->updateContents(true); } int qjackctlConnectView::iconSize (void) const { return m_iIconSize; } // Dirty flag methods. void qjackctlConnectView::setDirty ( bool bDirty ) { m_bDirty = bDirty; if (bDirty) emit contentsChanged(); } bool qjackctlConnectView::isDirty (void) const { return m_bDirty; } //---------------------------------------------------------------------- // qjackctlConnect -- Output-to-Input client/ports connection object. // // Constructor. qjackctlConnect::qjackctlConnect ( qjackctlConnectView *pConnectView ) { m_pConnectView = pConnectView; m_pOClientList = NULL; m_pIClientList = NULL; m_iMutex = 0; m_pConnectView->setBinding(this); } // Default destructor. qjackctlConnect::~qjackctlConnect (void) { // Force end of works here. m_iMutex++; m_pConnectView->setBinding(NULL); if (m_pOClientList) delete m_pOClientList; if (m_pIClientList) delete m_pIClientList; m_pOClientList = NULL; m_pIClientList = NULL; m_pConnectView->connectorView()->update(); } // These must be accessed by the descendant constructor. qjackctlConnectView *qjackctlConnect::connectView (void) const { return m_pConnectView; } void qjackctlConnect::setOClientList ( qjackctlClientList *pOClientList ) { m_pOClientList = pOClientList; } void qjackctlConnect::setIClientList ( qjackctlClientList *pIClientList ) { m_pIClientList = pIClientList; } // Connection primitive. bool qjackctlConnect::connectPortsEx ( qjackctlPortItem *pOPort, qjackctlPortItem *pIPort ) { if (pOPort->findConnectPtr(pIPort) != NULL) return false; emit connecting(pOPort, pIPort); if (!connectPorts(pOPort, pIPort)) return false; pOPort->addConnect(pIPort); pIPort->addConnect(pOPort); return true; } // Disconnection primitive. bool qjackctlConnect::disconnectPortsEx ( qjackctlPortItem *pOPort, qjackctlPortItem *pIPort ) { if (pOPort->findConnectPtr(pIPort) == NULL) return false; emit disconnecting(pOPort, pIPort); if (!disconnectPorts(pOPort, pIPort)) return false; pOPort->removeConnect(pIPort); pIPort->removeConnect(pOPort); return true; } // Test if selected ports are connectable. bool qjackctlConnect::canConnectSelected (void) { bool bResult = false; if (startMutex()) { bResult = canConnectSelectedEx(); endMutex(); } return bResult; } bool qjackctlConnect::canConnectSelectedEx (void) { // Take this opportunity to highlight any current selections. m_pOClientList->hiliteClientPorts(); m_pIClientList->hiliteClientPorts(); m_pConnectView->connectorView()->update(); // Now with our predicate work... QTreeWidgetItem *pOItem = (m_pOClientList->listView())->currentItem(); if (pOItem == NULL) return false; QTreeWidgetItem *pIItem = (m_pIClientList->listView())->currentItem(); if (pIItem == NULL) return false; if (pOItem->type() == QJACKCTL_CLIENTITEM) { qjackctlClientItem *pOClient = static_cast (pOItem); if (pIItem->type() == QJACKCTL_CLIENTITEM) { // Each-to-each connections... qjackctlClientItem *pIClient = static_cast (pIItem); QListIterator oport(pOClient->ports()); QListIterator iport(pIClient->ports()); while (oport.hasNext() && iport.hasNext()) { qjackctlPortItem *pOPort = oport.next(); qjackctlPortItem *pIPort = iport.next(); if (pOPort->findConnectPtr(pIPort) == NULL) return true; } } else { // Many(all)-to-one/many connection... QListIterator oport(pOClient->ports()); while (oport.hasNext() && pIItem && pIItem->type() == QJACKCTL_PORTITEM) { qjackctlPortItem *pOPort = oport.next(); qjackctlPortItem *pIPort = static_cast (pIItem); if (pOPort->findConnectPtr(pIPort) == NULL) return true; pIItem = (m_pIClientList->listView())->itemBelow(pIItem); } } } else { qjackctlPortItem *pOPort = static_cast (pOItem); if (pIItem->type() == QJACKCTL_CLIENTITEM) { // One-to-many(all) connection... qjackctlClientItem *pIClient = static_cast (pIItem); QListIterator iport(pIClient->ports()); while (iport.hasNext()) { qjackctlPortItem *pIPort = iport.next(); if (pOPort->findConnectPtr(pIPort) == NULL) return true; } } else { // One-to-one connection... qjackctlPortItem *pIPort = static_cast (pIItem); return (pOPort->findConnectPtr(pIPort) == NULL); } } return false; } // Connect current selected ports. bool qjackctlConnect::connectSelected (void) { bool bResult = false; if (startMutex()) { bResult = connectSelectedEx(); endMutex(); } m_pConnectView->connectorView()->update(); if (bResult) emit connectChanged(); return bResult; } bool qjackctlConnect::connectSelectedEx (void) { QTreeWidgetItem *pOItem = (m_pOClientList->listView())->currentItem(); if (pOItem == NULL) return false; QTreeWidgetItem *pIItem = (m_pIClientList->listView())->currentItem(); if (pIItem == NULL) return false; if (pOItem->type() == QJACKCTL_CLIENTITEM) { qjackctlClientItem *pOClient = static_cast (pOItem); if (pIItem->type() == QJACKCTL_CLIENTITEM) { // Each-to-each connections... qjackctlClientItem *pIClient = static_cast (pIItem); QListIterator oport(pOClient->ports()); QListIterator iport(pIClient->ports()); while (oport.hasNext() && iport.hasNext()) { qjackctlPortItem *pOPort = oport.next(); qjackctlPortItem *pIPort = iport.next(); connectPortsEx(pOPort, pIPort); } } else { // Many(all)-to-one/many connection... QListIterator oport(pOClient->ports()); while (oport.hasNext() && pIItem && pIItem->type() == QJACKCTL_PORTITEM) { qjackctlPortItem *pOPort = oport.next(); qjackctlPortItem *pIPort = static_cast (pIItem); connectPortsEx(pOPort, pIPort); pIItem = (m_pIClientList->listView())->itemBelow(pIItem); } } } else { qjackctlPortItem *pOPort = static_cast (pOItem); if (pIItem->type() == QJACKCTL_CLIENTITEM) { // One-to-many(all) connection... qjackctlClientItem *pIClient = static_cast (pIItem); QListIterator iport(pIClient->ports()); while (iport.hasNext()) { qjackctlPortItem *pIPort = iport.next(); connectPortsEx(pOPort, pIPort); } } else { // One-to-one connection... qjackctlPortItem *pIPort = static_cast (pIItem); connectPortsEx(pOPort, pIPort); } } return true; } // Test if selected ports are disconnectable. bool qjackctlConnect::canDisconnectSelected (void) { bool bResult = false; if (startMutex()) { bResult = canDisconnectSelectedEx(); endMutex(); } return bResult; } bool qjackctlConnect::canDisconnectSelectedEx (void) { QTreeWidgetItem *pOItem = (m_pOClientList->listView())->currentItem(); if (!pOItem) return false; QTreeWidgetItem *pIItem = (m_pIClientList->listView())->currentItem(); if (!pIItem) return false; if (pOItem->type() == QJACKCTL_CLIENTITEM) { qjackctlClientItem *pOClient = static_cast (pOItem); if (pIItem->type() == QJACKCTL_CLIENTITEM) { // Each-to-each connections... qjackctlClientItem *pIClient = static_cast (pIItem); QListIterator oport(pOClient->ports()); QListIterator iport(pIClient->ports()); while (oport.hasNext() && iport.hasNext()) { qjackctlPortItem *pOPort = oport.next(); qjackctlPortItem *pIPort = iport.next(); if (pOPort->findConnectPtr(pIPort) != NULL) return true; } } else { // Many(all)-to-one/many connection... QListIterator oport(pOClient->ports()); while (oport.hasNext() && pIItem && pIItem->type() == QJACKCTL_PORTITEM) { qjackctlPortItem *pOPort = oport.next(); qjackctlPortItem *pIPort = static_cast (pIItem); if (pOPort->findConnectPtr(pIPort) != NULL) return true; pIItem = (m_pIClientList->listView())->itemBelow(pIItem); } } } else { qjackctlPortItem *pOPort = static_cast (pOItem); if (pIItem->type() == QJACKCTL_CLIENTITEM) { // One-to-many(all) connection... qjackctlClientItem *pIClient = static_cast (pIItem); QListIterator iport(pIClient->ports()); while (iport.hasNext()) { qjackctlPortItem *pIPort = iport.next(); if (pOPort->findConnectPtr(pIPort) != NULL) return true; } } else { // One-to-one connection... qjackctlPortItem *pIPort = static_cast (pIItem); return (pOPort->findConnectPtr(pIPort) != NULL); } } return false; } // Disconnect current selected ports. bool qjackctlConnect::disconnectSelected (void) { bool bResult = false; if (startMutex()) { bResult = disconnectSelectedEx(); endMutex(); } m_pConnectView->connectorView()->update(); if (bResult) emit connectChanged(); return bResult; } bool qjackctlConnect::disconnectSelectedEx (void) { QTreeWidgetItem *pOItem = (m_pOClientList->listView())->currentItem(); if (pOItem == NULL) return false; QTreeWidgetItem *pIItem = (m_pIClientList->listView())->currentItem(); if (pIItem == NULL) return false; if (pOItem->type() == QJACKCTL_CLIENTITEM) { qjackctlClientItem *pOClient = static_cast (pOItem); if (pIItem->type() == QJACKCTL_CLIENTITEM) { // Each-to-each connections... qjackctlClientItem *pIClient = static_cast (pIItem); QListIterator oport(pOClient->ports()); QListIterator iport(pIClient->ports()); while (oport.hasNext() && iport.hasNext()) { qjackctlPortItem *pOPort = oport.next(); qjackctlPortItem *pIPort = iport.next(); disconnectPortsEx(pOPort, pIPort); } } else { // Many(all)-to-one/many connection... QListIterator oport(pOClient->ports()); while (oport.hasNext() && pIItem && pIItem->type() == QJACKCTL_PORTITEM) { qjackctlPortItem *pOPort = oport.next(); qjackctlPortItem *pIPort = static_cast (pIItem); disconnectPortsEx(pOPort, pIPort); pIItem = (m_pIClientList->listView())->itemBelow(pIItem); } } } else { qjackctlPortItem *pOPort = static_cast (pOItem); if (pIItem->type() == QJACKCTL_CLIENTITEM) { // One-to-many(all) connection... qjackctlClientItem *pIClient = static_cast (pIItem); QListIterator iport(pIClient->ports()); while (iport.hasNext()) { qjackctlPortItem *pIPort = iport.next(); disconnectPortsEx(pOPort, pIPort); } } else { // One-to-one connection... qjackctlPortItem *pIPort = static_cast (pIItem); disconnectPortsEx(pOPort, pIPort); } } return true; } // Test if any port is disconnectable. bool qjackctlConnect::canDisconnectAll (void) { bool bResult = false; if (startMutex()) { bResult = canDisconnectAllEx(); endMutex(); } return bResult; } bool qjackctlConnect::canDisconnectAllEx (void) { QListIterator iter(m_pOClientList->clients()); while (iter.hasNext()) { qjackctlClientItem *pOClient = iter.next(); QListIterator oport(pOClient->ports()); while (oport.hasNext()) { qjackctlPortItem *pOPort = oport.next(); if (pOPort->connects().count() > 0) return true; } } return false; } // Disconnect all ports. bool qjackctlConnect::disconnectAll (void) { if (QMessageBox::warning(m_pConnectView, tr("Warning") + " - " QJACKCTL_SUBTITLE1, tr("This will suspend sound processing\n" "from all client applications.\n\nAre you sure?"), QMessageBox::Yes | QMessageBox::No) == QMessageBox::No) { return false; } bool bResult = false; if (startMutex()) { bResult = disconnectAllEx(); endMutex(); } m_pConnectView->connectorView()->update(); if (bResult) emit connectChanged(); return bResult; } bool qjackctlConnect::disconnectAllEx (void) { QListIterator iter(m_pOClientList->clients()); while (iter.hasNext()) { qjackctlClientItem *pOClient = iter.next(); QListIterator oport(pOClient->ports()); while (oport.hasNext()) { qjackctlPortItem *pOPort = oport.next(); QListIterator iport(pOPort->connects()); while (iport.hasNext()) { qjackctlPortItem *pIPort = iport.next(); disconnectPortsEx(pOPort, pIPort); } } } return true; } // Expand all client ports. void qjackctlConnect::expandAll (void) { (m_pOClientList->listView())->expandAll(); (m_pIClientList->listView())->expandAll(); (m_pConnectView->connectorView())->update(); } // Complete/incremental contents rebuilder; check dirty status if incremental. void qjackctlConnect::updateContents ( bool bClear ) { int iDirtyCount = 0; if (startMutex()) { // Do we do a complete rebuild? if (bClear) { m_pOClientList->clear(); m_pIClientList->clear(); updateIconPixmaps(); } // Add (newer) client:ports and respective connections... if (m_pOClientList->updateClientPorts() > 0) { m_pOClientList->refresh(); iDirtyCount++; } if (m_pIClientList->updateClientPorts() > 0) { m_pIClientList->refresh(); iDirtyCount++; } updateConnections(); endMutex(); } (m_pConnectView->connectorView())->update(); if (!bClear && iDirtyCount > 0) emit connectChanged(); } // Incremental contents rebuilder; check dirty status. void qjackctlConnect::refresh (void) { updateContents(false); } // Dunno. But this may avoid some conflicts. bool qjackctlConnect::startMutex (void) { const bool bMutex = (m_iMutex == 0); if (bMutex) m_iMutex++; return bMutex; } void qjackctlConnect::endMutex (void) { if (m_iMutex > 0) m_iMutex--; } // Connect client list accessors. qjackctlClientList *qjackctlConnect::OClientList (void) const { return m_pOClientList; } qjackctlClientList *qjackctlConnect::IClientList (void) const { return m_pIClientList; } // Common pixmap factory-method. QPixmap *qjackctlConnect::createIconPixmap ( const QString& sIconName ) { QString sName = sIconName; const int iSize = m_pConnectView->iconSize() * 32; if (iSize > 0) sName += QString("_%1x%2").arg(iSize).arg(iSize); return new QPixmap(":/images/" + sName + ".png"); } // end of qjackctlConnect.cpp qjackctl-0.4.2/src/PaxHeaders.14935/qjackctlSessionFile.txt0000644000000000000000000000013212700760152020343 xustar0030 mtime=1459871850.623910288 30 atime=1459871850.623910288 30 ctime=1459871850.623910288 qjackctl-0.4.2/src/qjackctlSessionFile.txt0000644000175000001440000000123012700760152021103 0ustar00rncbcusers00000000000000qjackctlSession format specification ------------------------------------ client-command . . . . . . . . . session-name := string-literal client-name := string-literal client-uuid := string-literal client-command := string-literal port-name := string-literal port-type := "in" | "out" qjackctl-0.4.2/src/PaxHeaders.14935/qjackctlSetup.cpp0000644000000000000000000000013212700760152017163 xustar0030 mtime=1459871850.625911288 30 atime=1459871850.625911288 30 ctime=1459871850.625911288 qjackctl-0.4.2/src/qjackctlSetup.cpp0000644000175000001440000006745212700760152017745 0ustar00rncbcusers00000000000000// qjackctlSetup.cpp // /**************************************************************************** Copyright (C) 2003-2016, rncbc aka Rui Nuno Capela. All rights reserved. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. *****************************************************************************/ #include "qjackctlAbout.h" #include "qjackctlSetup.h" #include #include #include #include #include #include #if defined(WIN32) #define DEFAULT_DRIVER "portaudio" #else #define DEFAULT_DRIVER "alsa" #endif // Constructor. qjackctlSetup::qjackctlSetup (void) : m_settings(QJACKCTL_DOMAIN, QJACKCTL_TITLE) { bStartJackCmd = false; sDefPresetName = QObject::tr("(default)"); loadSetup(); } // Destructor; qjackctlSetup::~qjackctlSetup (void) { // saveSetup(); } // Settings accessor. QSettings& qjackctlSetup::settings (void) { return m_settings; } // Explicit load method. void qjackctlSetup::loadSetup (void) { m_settings.beginGroup("/Presets"); sDefPreset = m_settings.value("/DefPreset", sDefPresetName).toString(); QString sPrefix = "/Preset%1"; int i = 0; for (;;) { QString sItem = m_settings.value(sPrefix.arg(++i)).toString(); if (sItem.isEmpty()) break; presets.append(sItem); } m_settings.endGroup(); m_settings.beginGroup("/Options"); bSingleton = m_settings.value("/Singleton", true).toBool(); // sServerName = m_settings.value("/ServerName").toString(); bStartJack = m_settings.value("/StartJack", false).toBool(); // bStartJackCmd = m_settings.value("/StartJackCmd", false).toBool(); bStopJack = m_settings.value("/StopJack", true).toBool(); bStartupScript = m_settings.value("/StartupScript", false).toBool(); sStartupScriptShell = m_settings.value("/StartupScriptShell").toString(); bPostStartupScript = m_settings.value("/PostStartupScript", false).toBool(); sPostStartupScriptShell = m_settings.value("/PostStartupScriptShell").toString(); bShutdownScript = m_settings.value("/ShutdownScript", false).toBool(); sShutdownScriptShell = m_settings.value("/ShutdownScriptShell").toString(); bPostShutdownScript = m_settings.value("/PostShutdownScript", false).toBool(); sPostShutdownScriptShell = m_settings.value("/PostShutdownScriptShell").toString(); bStdoutCapture = m_settings.value("/StdoutCapture", true).toBool(); sXrunRegex = m_settings.value("/XrunRegex", "xrun of at least ([0-9|\\.]+) msecs").toString(); bActivePatchbay = m_settings.value("/ActivePatchbay", false).toBool(); sActivePatchbayPath = m_settings.value("/ActivePatchbayPath").toString(); bActivePatchbayReset = m_settings.value("/ActivePatchbayReset", false).toBool(); bQueryDisconnect = m_settings.value("/QueryDisconnect", true).toBool(); bMessagesLog = m_settings.value("/MessagesLog", false).toBool(); sMessagesLogPath = m_settings.value("/MessagesLogPath", "qjackctl.log").toString(); bBezierLines = m_settings.value("/BezierLines", false).toBool(); iTimeDisplay = m_settings.value("/TimeDisplay", 0).toInt(); iTimeFormat = m_settings.value("/TimeFormat", 0).toInt(); sMessagesFont = m_settings.value("/MessagesFont").toString(); bMessagesLimit = m_settings.value("/MessagesLimit", true).toBool(); iMessagesLimitLines = m_settings.value("/MessagesLimitLines", 1000).toInt(); sDisplayFont1 = m_settings.value("/DisplayFont1").toString(); sDisplayFont2 = m_settings.value("/DisplayFont2").toString(); bDisplayEffect = m_settings.value("/DisplayEffect", true).toBool(); bDisplayBlink = m_settings.value("/DisplayBlink", true).toBool(); iJackClientPortAlias = m_settings.value("/JackClientPortAlias", 0).toInt(); bJackClientPortMetadata = m_settings.value("/JackClientPortMetadata", false).toBool(); iConnectionsIconSize = m_settings.value("/ConnectionsIconSize", QJACKCTL_ICON_16X16).toInt(); sConnectionsFont = m_settings.value("/ConnectionsFont").toString(); bQueryClose = m_settings.value("/QueryClose", true).toBool(); bQueryShutdown = m_settings.value("/QueryShutdown", true).toBool(); bKeepOnTop = m_settings.value("/KeepOnTop", false).toBool(); bSystemTray = m_settings.value("/SystemTray", false).toBool(); bSystemTrayQueryClose = m_settings.value("/SystemTrayQueryClose", true).toBool(); bServerConfig = m_settings.value("/ServerConfig", true).toBool(); sServerConfigName = m_settings.value("/ServerConfigName", ".jackdrc").toString(); bServerConfigTemp = m_settings.value("/ServerConfigTemp", false).toBool(); bAlsaSeqEnabled = m_settings.value("/AlsaSeqEnabled", true).toBool(); bDBusEnabled = m_settings.value("/DBusEnabled", false).toBool(); bJackDBusEnabled = m_settings.value("/JackDBusEnabled", false).toBool(); bAliasesEnabled = m_settings.value("/AliasesEnabled", false).toBool(); bAliasesEditing = m_settings.value("/AliasesEditing", false).toBool(); bLeftButtons = m_settings.value("/LeftButtons", true).toBool(); bRightButtons = m_settings.value("/RightButtons", true).toBool(); bTransportButtons = m_settings.value("/TransportButtons", true).toBool(); bTextLabels = m_settings.value("/TextLabels", true).toBool(); iBaseFontSize = m_settings.value("/BaseFontSize", 0).toInt(); m_settings.endGroup(); m_settings.beginGroup("/Defaults"); sPatchbayPath = m_settings.value("/PatchbayPath").toString(); iMessagesStatusTabPage = m_settings.value("/MessagesStatusTabPage", 0).toInt(); iConnectionsTabPage = m_settings.value("/ConnectionsTabPage", 0).toInt(); bSessionSaveVersion = m_settings.value("/SessionSaveVersion", true).toBool(); m_settings.endGroup(); // Load recent patchbay list... m_settings.beginGroup("/Patchbays"); sPrefix = "/Patchbay%1"; i = 0; for (;;) { QString sItem = m_settings.value(sPrefix.arg(++i)).toString(); if (sItem.isEmpty()) break; if (QFileInfo(sItem).exists()) patchbays.append(sItem); } m_settings.endGroup(); // Load recent session directory list... m_settings.beginGroup("/SessionDirs"); sPrefix = "/SessionDir%1"; i = 0; for (;;) { QString sItem = m_settings.value(sPrefix.arg(++i)).toString(); if (sItem.isEmpty()) break; if (QFileInfo(sItem).isDir()) sessionDirs.append(sItem); } m_settings.endGroup(); } // Explicit save method. void qjackctlSetup::saveSetup (void) { // Save all settings and options... m_settings.beginGroup("/Program"); m_settings.setValue("/Version", QJACKCTL_VERSION); m_settings.endGroup(); m_settings.beginGroup("/Presets"); m_settings.setValue("/DefPreset", sDefPreset); // Save last preset list. QString sPrefix = "/Preset%1"; int i = 0; QStringListIterator iter(presets); while (iter.hasNext()) m_settings.setValue(sPrefix.arg(++i), iter.next()); // Cleanup old entries, if any... while (!m_settings.value(sPrefix.arg(++i)).toString().isEmpty()) m_settings.remove(sPrefix.arg(i)); m_settings.endGroup(); m_settings.beginGroup("/Options"); m_settings.setValue("/Singleton", bSingleton); // m_settings.setValue("/ServerName", sServerName); m_settings.setValue("/StartJack", bStartJack); // m_settings.setValue("/StartJackCmd", bStartJackCmd); m_settings.setValue("/StopJack", bStopJack); m_settings.setValue("/StartupScript", bStartupScript); m_settings.setValue("/StartupScriptShell", sStartupScriptShell); m_settings.setValue("/PostStartupScript", bPostStartupScript); m_settings.setValue("/PostStartupScriptShell", sPostStartupScriptShell); m_settings.setValue("/ShutdownScript", bShutdownScript); m_settings.setValue("/ShutdownScriptShell", sShutdownScriptShell); m_settings.setValue("/PostShutdownScript", bPostShutdownScript); m_settings.setValue("/PostShutdownScriptShell", sPostShutdownScriptShell); m_settings.setValue("/StdoutCapture", bStdoutCapture); m_settings.setValue("/XrunRegex", sXrunRegex); m_settings.setValue("/ActivePatchbay", bActivePatchbay); m_settings.setValue("/ActivePatchbayPath", sActivePatchbayPath); m_settings.setValue("/ActivePatchbayReset", bActivePatchbayReset); m_settings.setValue("/QueryDisconnect", bQueryDisconnect); m_settings.setValue("/MessagesLog", bMessagesLog); m_settings.setValue("/MessagesLogPath", sMessagesLogPath); m_settings.setValue("/BezierLines", bBezierLines); m_settings.setValue("/TimeDisplay", iTimeDisplay); m_settings.setValue("/TimeFormat", iTimeFormat); m_settings.setValue("/MessagesFont", sMessagesFont); m_settings.setValue("/MessagesLimit", bMessagesLimit); m_settings.setValue("/MessagesLimitLines", iMessagesLimitLines); m_settings.setValue("/DisplayFont1", sDisplayFont1); m_settings.setValue("/DisplayFont2", sDisplayFont2); m_settings.setValue("/DisplayEffect", bDisplayEffect); m_settings.setValue("/DisplayBlink", bDisplayBlink); m_settings.setValue("/JackClientPortAlias", iJackClientPortAlias); m_settings.setValue("/JackClientPortMetadata", bJackClientPortMetadata); m_settings.setValue("/ConnectionsIconSize", iConnectionsIconSize); m_settings.setValue("/ConnectionsFont", sConnectionsFont); m_settings.setValue("/QueryClose", bQueryClose); m_settings.setValue("/QueryShutdown", bQueryShutdown); m_settings.setValue("/KeepOnTop", bKeepOnTop); m_settings.setValue("/SystemTray", bSystemTray); m_settings.setValue("/SystemTrayQueryClose", bSystemTrayQueryClose); m_settings.setValue("/ServerConfig", bServerConfig); m_settings.setValue("/ServerConfigName", sServerConfigName); m_settings.setValue("/ServerConfigTemp", bServerConfigTemp); m_settings.setValue("/AlsaSeqEnabled", bAlsaSeqEnabled); m_settings.setValue("/DBusEnabled", bDBusEnabled); m_settings.setValue("/JackDBusEnabled", bJackDBusEnabled); m_settings.setValue("/AliasesEnabled", bAliasesEnabled); m_settings.setValue("/AliasesEditing", bAliasesEditing); m_settings.setValue("/LeftButtons", bLeftButtons); m_settings.setValue("/RightButtons", bRightButtons); m_settings.setValue("/TransportButtons", bTransportButtons); m_settings.setValue("/TextLabels", bTextLabels); m_settings.setValue("/BaseFontSize", iBaseFontSize); m_settings.endGroup(); m_settings.beginGroup("/Defaults"); m_settings.setValue("/PatchbayPath", sPatchbayPath); m_settings.setValue("/MessagesStatusTabPage", iMessagesStatusTabPage); m_settings.setValue("/ConnectionsTabPage", iConnectionsTabPage); m_settings.setValue("/SessionSaveVersion", bSessionSaveVersion); m_settings.endGroup(); // Save patchbay list... m_settings.beginGroup("/Patchbays"); sPrefix = "/Patchbay%1"; i = 0; QStringListIterator iter2(patchbays); while (iter2.hasNext()) m_settings.setValue(sPrefix.arg(++i), iter2.next()); // Cleanup old entries, if any... while (!m_settings.value(sPrefix.arg(++i)).toString().isEmpty()) m_settings.remove(sPrefix.arg(i)); m_settings.endGroup(); // Save session directory list... m_settings.beginGroup("/SessionDirs"); sPrefix = "/SessionDir%1"; i = 0; QStringListIterator iter3(sessionDirs); while (iter3.hasNext()) m_settings.setValue(sPrefix.arg(++i), iter3.next()); // Cleanup old entries, if any... while (!m_settings.value(sPrefix.arg(++i)).toString().isEmpty()) m_settings.remove(sPrefix.arg(i)); m_settings.endGroup(); // Commit all changes to disk. m_settings.sync(); } //--------------------------------------------------------------------------- // Aliases preset management methods. bool qjackctlSetup::loadAliases ( const QString& sPreset ) { QString sSuffix; if (sPreset != sDefPresetName && !sPreset.isEmpty()) { sSuffix = '/' + sPreset; // Check if on list. if (!presets.contains(sPreset)) return false; } // Load preset aliases... const QString sAliasesKey = "/Aliases" + sSuffix; m_settings.beginGroup(sAliasesKey); m_settings.beginGroup("/Jack"); // FIXME: Audio aliasAudioOutputs.loadSettings(m_settings, "/Outputs"); aliasAudioInputs.loadSettings(m_settings, "/Inputs"); m_settings.endGroup(); m_settings.beginGroup("/Midi"); aliasMidiOutputs.loadSettings(m_settings, "/Outputs"); aliasMidiInputs.loadSettings(m_settings, "/Inputs"); m_settings.endGroup(); m_settings.beginGroup("/Alsa"); aliasAlsaOutputs.loadSettings(m_settings, "/Outputs"); aliasAlsaInputs.loadSettings(m_settings, "/Inputs"); m_settings.endGroup(); m_settings.endGroup(); return true; } bool qjackctlSetup::saveAliases ( const QString& sPreset ) { QString sSuffix; if (sPreset != sDefPresetName && !sPreset.isEmpty()) { sSuffix = "/" + sPreset; // Append to list if not already. if (!presets.contains(sPreset)) presets.prepend(sPreset); } // Save preset aliases... const QString sAliasesKey = "/Aliases" + sSuffix; m_settings.remove(sAliasesKey); m_settings.beginGroup(sAliasesKey); m_settings.beginGroup("/Jack"); // FIXME: Audio aliasAudioOutputs.saveSettings(m_settings, "/Outputs"); aliasAudioInputs.saveSettings(m_settings, "/Inputs"); m_settings.endGroup(); m_settings.beginGroup("/Midi"); aliasMidiOutputs.saveSettings(m_settings, "/Outputs"); aliasMidiInputs.saveSettings(m_settings, "/Inputs"); m_settings.endGroup(); m_settings.beginGroup("/Alsa"); aliasAlsaOutputs.saveSettings(m_settings, "/Outputs"); aliasAlsaInputs.saveSettings(m_settings, "/Inputs"); m_settings.endGroup(); m_settings.endGroup(); return true; } //--------------------------------------------------------------------------- // Preset management methods. bool qjackctlSetup::loadPreset ( qjackctlPreset& preset, const QString& sPreset ) { QString sSuffix; if (sPreset != sDefPresetName && !sPreset.isEmpty()) { sSuffix = '/' + sPreset; // Check if on list. if (!presets.contains(sPreset)) return false; } m_settings.beginGroup("/Settings" + sSuffix); #if defined(WIN32) preset.sServerPrefix = m_settings.value("/Server", "jackd -S").toString(); #else preset.sServerPrefix = m_settings.value("/Server", "jackd").toString(); #endif preset.sServerName = m_settings.value("/ServerName").toString(); preset.bRealtime = m_settings.value("/Realtime", true).toBool(); preset.bSoftMode = m_settings.value("/SoftMode", false).toBool(); preset.bMonitor = m_settings.value("/Monitor", false).toBool(); preset.bShorts = m_settings.value("/Shorts", false).toBool(); preset.bNoMemLock = m_settings.value("/NoMemLock", false).toBool(); preset.bUnlockMem = m_settings.value("/UnlockMem", false).toBool(); preset.bHWMon = m_settings.value("/HWMon", false).toBool(); preset.bHWMeter = m_settings.value("/HWMeter", false).toBool(); preset.bIgnoreHW = m_settings.value("/IgnoreHW", false).toBool(); preset.iPriority = m_settings.value("/Priority", 0).toInt(); preset.iFrames = m_settings.value("/Frames", 1024).toInt(); preset.iSampleRate = m_settings.value("/SampleRate", 48000).toInt(); preset.iPeriods = m_settings.value("/Periods", 2).toInt(); preset.iWordLength = m_settings.value("/WordLength", 16).toInt(); preset.iWait = m_settings.value("/Wait", 21333).toInt(); preset.iChan = m_settings.value("/Chan", 0).toInt(); preset.sDriver = m_settings.value("/Driver", DEFAULT_DRIVER).toString(); preset.sInterface = m_settings.value("/Interface").toString(); preset.iAudio = m_settings.value("/Audio", 0).toInt(); preset.iDither = m_settings.value("/Dither", 0).toInt(); preset.iTimeout = m_settings.value("/Timeout", 500).toInt(); preset.sInDevice = m_settings.value("/InDevice").toString(); preset.sOutDevice = m_settings.value("/OutDevice").toString(); preset.iInChannels = m_settings.value("/InChannels", 0).toInt(); preset.iOutChannels = m_settings.value("/OutChannels", 0).toInt(); preset.iInLatency = m_settings.value("/InLatency", 0).toInt(); preset.iOutLatency = m_settings.value("/OutLatency", 0).toInt(); preset.iStartDelay = m_settings.value("/StartDelay", 2).toInt(); preset.bVerbose = m_settings.value("/Verbose", false).toBool(); preset.iPortMax = m_settings.value("/PortMax", 256).toInt(); preset.sMidiDriver = m_settings.value("/MidiDriver").toString(); preset.sServerSuffix = m_settings.value("/ServerSuffix").toString(); m_settings.endGroup(); #ifdef CONFIG_JACK_MIDI if (!preset.sMidiDriver.isEmpty() && preset.sMidiDriver != "raw" && preset.sMidiDriver != "seq") preset.sMidiDriver.clear(); #endif return true; } bool qjackctlSetup::savePreset ( qjackctlPreset& preset, const QString& sPreset ) { QString sSuffix; if (sPreset != sDefPresetName && !sPreset.isEmpty()) { sSuffix = '/' + sPreset; // Append to list if not already. if (!presets.contains(sPreset)) presets.prepend(sPreset); } m_settings.beginGroup("/Settings" + sSuffix); m_settings.setValue("/Server", preset.sServerPrefix); m_settings.setValue("/ServerName", preset.sServerName); m_settings.setValue("/Realtime", preset.bRealtime); m_settings.setValue("/SoftMode", preset.bSoftMode); m_settings.setValue("/Monitor", preset.bMonitor); m_settings.setValue("/Shorts", preset.bShorts); m_settings.setValue("/NoMemLock", preset.bNoMemLock); m_settings.setValue("/UnlockMem", preset.bUnlockMem); m_settings.setValue("/HWMon", preset.bHWMon); m_settings.setValue("/HWMeter", preset.bHWMeter); m_settings.setValue("/IgnoreHW", preset.bIgnoreHW); m_settings.setValue("/Priority", preset.iPriority); m_settings.setValue("/Frames", preset.iFrames); m_settings.setValue("/SampleRate", preset.iSampleRate); m_settings.setValue("/Periods", preset.iPeriods); m_settings.setValue("/WordLength", preset.iWordLength); m_settings.setValue("/Wait", preset.iWait); m_settings.setValue("/Chan", preset.iChan); m_settings.setValue("/Driver", preset.sDriver); m_settings.setValue("/Interface", preset.sInterface); m_settings.setValue("/Audio", preset.iAudio); m_settings.setValue("/Dither", preset.iDither); m_settings.setValue("/Timeout", preset.iTimeout); m_settings.setValue("/InDevice", preset.sInDevice); m_settings.setValue("/OutDevice", preset.sOutDevice); m_settings.setValue("/InChannels", preset.iInChannels); m_settings.setValue("/OutChannels", preset.iOutChannels); m_settings.setValue("/InLatency", preset.iInLatency); m_settings.setValue("/OutLatency", preset.iOutLatency); m_settings.setValue("/StartDelay", preset.iStartDelay); m_settings.setValue("/Verbose", preset.bVerbose); m_settings.setValue("/PortMax", preset.iPortMax); m_settings.setValue("/MidiDriver", preset.sMidiDriver); m_settings.setValue("/ServerSuffix", preset.sServerSuffix); m_settings.endGroup(); return true; } bool qjackctlSetup::deletePreset ( const QString& sPreset ) { QString sSuffix; if (sPreset != sDefPresetName && !sPreset.isEmpty()) { sSuffix = '/' + sPreset; int iPreset = presets.indexOf(sPreset); if (iPreset < 0) return false; presets.removeAt(iPreset); m_settings.remove("/Settings" + sSuffix); m_settings.remove("/Aliases" + sSuffix); } return true; } //------------------------------------------------------------------------- // Command-line argument stuff. // // Help about command line options. void qjackctlSetup::print_usage ( const QString& arg0 ) { QTextStream out(stderr); const QString sEot = "\n\t"; const QString sEol = "\n\n"; out << QObject::tr("Usage: %1" " [options] [command-and-args]").arg(arg0) + sEol; out << QJACKCTL_TITLE " - " + QObject::tr(QJACKCTL_SUBTITLE) + sEol; out << QObject::tr("Options:") + sEol; out << " -s, --start" + sEot + QObject::tr("Start JACK audio server immediately") + sEol; out << " -p, --preset=[label]" + sEot + QObject::tr("Set default settings preset name") + sEol; out << " -a, --active-patchbay=[path]" + sEot + QObject::tr("Set active patchbay definition file") + sEol; out << " -n, --server-name=[label]" + sEot + QObject::tr("Set default JACK audio server name") + sEol; out << " -h, --help" + sEot + QObject::tr("Show help about command line options") + sEol; out << " -v, --version" + sEot + QObject::tr("Show version information") + sEol; } // Parse command line arguments into m_settings. bool qjackctlSetup::parse_args ( const QStringList& args ) { QTextStream out(stderr); const QString sEol = "\n\n"; int iCmdArgs = 0; int argc = args.count(); for (int i = 1; i < argc; i++) { if (iCmdArgs > 0) { sCmdLine += ' '; sCmdLine += args.at(i); iCmdArgs++; continue; } QString sArg = args.at(i); QString sVal = QString::null; int iEqual = sArg.indexOf('='); if (iEqual >= 0) { sVal = sArg.right(sArg.length() - iEqual - 1); sArg = sArg.left(iEqual); } else if (i < argc - 1) sVal = args.at(i + 1); if (sArg == "-s" || sArg == "--start") { bStartJackCmd = true; } else if (sArg == "-p" || sArg == "--preset") { if (sVal.isNull()) { out << QObject::tr("Option -p requires an argument (preset).") + sEol; return false; } sDefPreset = sVal; if (iEqual < 0) i++; } else if (sArg == "-a" || sArg == "--active-patchbay") { if (sVal.isNull()) { out << QObject::tr("Option -a requires an argument (path).") + sEol; return false; } bActivePatchbay = true; sActivePatchbayPath = sVal; if (iEqual < 0) i++; } else if (sArg == "-n" || sArg == "--server-name") { if (sVal.isNull()) { out << QObject::tr("Option -n requires an argument (name).") + sEol; return false; } sServerName = sVal; if (iEqual < 0) i++; } else if (sArg == "-h" || sArg == "--help") { print_usage(args.at(0)); return false; } else if (sArg == "-v" || sArg == "--version") { out << QObject::tr("Qt: %1\n").arg(qVersion()); out << QObject::tr(QJACKCTL_TITLE ": %1\n").arg(QJACKCTL_VERSION); return false; } // FIXME: Avoid auto-start jackd stuffed args! else if (sArg != "-T" && sArg != "-ndefault") { // Here starts the optional command line... sCmdLine += sArg; iCmdArgs++; } } // HACK: If there's a command line, it must be spawned on background... if (iCmdArgs > 0) sCmdLine += " &"; // Alright with argument parsing. return true; } //--------------------------------------------------------------------------- // Combo box history persistence helper implementation. void qjackctlSetup::loadComboBoxHistory ( QComboBox *pComboBox, int iLimit ) { const bool bBlockSignals = pComboBox->blockSignals(true); // Load combobox list from configuration settings file... m_settings.beginGroup("/History/" + pComboBox->objectName()); if (m_settings.childKeys().count() > 0) { pComboBox->setUpdatesEnabled(false); pComboBox->setDuplicatesEnabled(false); pComboBox->clear(); for (int i = 0; i < iLimit; ++i) { const QString& sText = m_settings.value( "/Item" + QString::number(i + 1)).toString(); if (sText.isEmpty()) break; pComboBox->addItem(sText); } pComboBox->setUpdatesEnabled(true); } m_settings.endGroup(); pComboBox->blockSignals(bBlockSignals); } void qjackctlSetup::saveComboBoxHistory ( QComboBox *pComboBox, int iLimit ) { const bool bBlockSignals = pComboBox->blockSignals(true); // Add current text as latest item... const QString sCurrentText = pComboBox->currentText(); int iCount = pComboBox->count(); for (int i = 0; i < iCount; i++) { const QString& sText = pComboBox->itemText(i); if (sText == sCurrentText) { pComboBox->removeItem(i); --iCount; break; } } while (iCount >= iLimit) pComboBox->removeItem(--iCount); pComboBox->insertItem(0, sCurrentText); pComboBox->setCurrentIndex(0); ++iCount; // Save combobox list to configuration settings file... m_settings.beginGroup("/History/" + pComboBox->objectName()); for (int i = 0; i < iCount; ++i) { const QString& sText = pComboBox->itemText(i); if (sText.isEmpty()) break; m_settings.setValue("/Item" + QString::number(i + 1), sText); } m_settings.endGroup(); pComboBox->blockSignals(bBlockSignals); } //--------------------------------------------------------------------------- // Splitter widget sizes persistence helper methods. void qjackctlSetup::loadSplitterSizes ( QSplitter *pSplitter, QList& sizes ) { // Try to restore old splitter sizes... if (pSplitter) { m_settings.beginGroup("/Splitter/" + pSplitter->objectName()); QStringList list = m_settings.value("/sizes").toStringList(); if (!list.isEmpty()) { sizes.clear(); QStringListIterator iter(list); while (iter.hasNext()) sizes.append(iter.next().toInt()); } pSplitter->setSizes(sizes); m_settings.endGroup(); } } void qjackctlSetup::saveSplitterSizes ( QSplitter *pSplitter ) { // Try to save current splitter sizes... if (pSplitter) { m_settings.beginGroup("/Splitter/" + pSplitter->objectName()); QStringList list; QList sizes = pSplitter->sizes(); QListIterator iter(sizes); while (iter.hasNext()) list.append(QString::number(iter.next())); if (!list.isEmpty()) m_settings.setValue("/sizes", list); m_settings.endGroup(); } } //--------------------------------------------------------------------------- // Widget geometry persistence helper methods. void qjackctlSetup::loadWidgetGeometry ( QWidget *pWidget, bool bVisible ) { // Try to restore old form window positioning. if (pWidget) { // if (bVisible) pWidget->show(); -- force initial exposure? m_settings.beginGroup("/Geometry/" + pWidget->objectName()); #if QT_VERSION >= 0x050000 const QByteArray& geometry = m_settings.value("/geometry").toByteArray(); if (!geometry.isEmpty()) pWidget->restoreGeometry(geometry); else #else//--LOAD_OLD_GEOMETRY QPoint wpos; QSize wsize; wpos.setX(m_settings.value("/x", -1).toInt()); wpos.setY(m_settings.value("/y", -1).toInt()); wsize.setWidth(m_settings.value("/width", -1).toInt()); wsize.setHeight(m_settings.value("/height", -1).toInt()); if (wpos.x() > 0 && wpos.y() > 0) pWidget->move(wpos); if (wsize.width() > 0 && wsize.height() > 0) pWidget->resize(wsize); else #endif pWidget->adjustSize(); if (!bVisible) bVisible = m_settings.value("/visible", false).toBool(); if (bVisible) pWidget->show(); else pWidget->hide(); m_settings.endGroup(); } } void qjackctlSetup::saveWidgetGeometry ( QWidget *pWidget, bool bVisible ) { // Try to save form window position... // (due to X11 window managers ideossincrasies, we better // only save the form geometry while its up and visible) if (pWidget) { m_settings.beginGroup("/Geometry/" + pWidget->objectName()); #if QT_VERSION >= 0x050000 m_settings.setValue("/geometry", pWidget->saveGeometry()); #else//--SAVE_OLD_GEOMETRY const QPoint& wpos = pWidget->pos(); const QSize& wsize = pWidget->size(); m_settings.setValue("/x", wpos.x()); m_settings.setValue("/y", wpos.y()); m_settings.setValue("/width", wsize.width()); m_settings.setValue("/height", wsize.height()); #endif if (!bVisible) bVisible = pWidget->isVisible(); m_settings.setValue("/visible", bVisible); m_settings.endGroup(); } } // end of qjackctlSetup.cpp qjackctl-0.4.2/src/PaxHeaders.14935/qjackctlPatchbayFile.txt0000644000000000000000000000013212700760152020453 xustar0030 mtime=1459871850.622909789 30 atime=1459871850.622909789 30 ctime=1459871850.622909789 qjackctl-0.4.2/src/qjackctlPatchbayFile.txt0000644000175000001440000000263412700760152021224 0ustar00rncbcusers00000000000000qjackctlPatchbayFile format specification ----------------------------------------- plug-name . . . . . . plug-name . . . . . . # # # . # . # . # . . . patchbay-name := string-literal patchbay-version := string-literal socket-name := string-literal socket-type := "audio" | "midi" | "jack-audio" | "jack-midi" | "alsa-midi" # slot-name := string-literal # slot-mode := "open" | "half" | "full" client-name := string-regexp (JACK/ALSA client name) plug-name := string-regexp (JACK/ALSA port name) exclusive-flag := "on" | "off" | "yes" | "no" | "1" | "0" qjackctl-0.4.2/src/PaxHeaders.14935/src.pro0000644000000000000000000000013212700760152015153 xustar0030 mtime=1459871850.627912288 30 atime=1459871850.627912288 30 ctime=1459871850.627912288 qjackctl-0.4.2/src/src.pro0000644000175000001440000000453212700760152015723 0ustar00rncbcusers00000000000000# qjackctl.pro # TARGET = qjackctl TEMPLATE = app INCLUDEPATH += . include(src.pri) #DEFINES += DEBUG HEADERS += config.h \ qjackctlAbout.h \ qjackctlAlsaConnect.h \ qjackctlConnect.h \ qjackctlConnectAlias.h \ qjackctlInterfaceComboBox.h \ qjackctlJackConnect.h \ qjackctlPatchbay.h \ qjackctlPatchbayFile.h \ qjackctlPatchbayRack.h \ qjackctlSession.h \ qjackctlSetup.h \ qjackctlStatus.h \ qjackctlSystemTray.h \ qjackctlAboutForm.h \ qjackctlConnectionsForm.h \ qjackctlMainForm.h \ qjackctlMessagesStatusForm.h \ qjackctlPatchbayForm.h \ qjackctlSessionForm.h \ qjackctlSetupForm.h \ qjackctlSocketForm.h SOURCES += \ qjackctl.cpp \ qjackctlAlsaConnect.cpp \ qjackctlConnect.cpp \ qjackctlConnectAlias.cpp \ qjackctlInterfaceComboBox.cpp \ qjackctlJackConnect.cpp \ qjackctlPatchbay.cpp \ qjackctlPatchbayFile.cpp \ qjackctlPatchbayRack.cpp \ qjackctlSession.cpp \ qjackctlSetup.cpp \ qjackctlSystemTray.cpp \ qjackctlAboutForm.cpp \ qjackctlConnectionsForm.cpp \ qjackctlMainForm.cpp \ qjackctlMessagesStatusForm.cpp \ qjackctlPatchbayForm.cpp \ qjackctlSessionForm.cpp \ qjackctlSetupForm.cpp \ qjackctlSocketForm.cpp FORMS += \ qjackctlAboutForm.ui \ qjackctlConnectionsForm.ui \ qjackctlMainForm.ui \ qjackctlMessagesStatusForm.ui \ qjackctlPatchbayForm.ui \ qjackctlSessionForm.ui \ qjackctlSetupForm.ui \ qjackctlSocketForm.ui RESOURCES += \ qjackctl.qrc TRANSLATIONS += \ translations/qjackctl_cs.ts \ translations/qjackctl_de.ts \ translations/qjackctl_es.ts \ translations/qjackctl_fr.ts \ translations/qjackctl_it.ts \ translations/qjackctl_ja.ts \ translations/qjackctl_nl.ts \ translations/qjackctl_ru.ts unix { # variables OBJECTS_DIR = .obj MOC_DIR = .moc UI_DIR = .ui isEmpty(PREFIX) { PREFIX = /usr/local } BINDIR = $$PREFIX/bin DATADIR = $$PREFIX/share DEFINES += DATADIR=\"$$DATADIR\" # make install INSTALLS += target desktop icon appdata target.path = $$BINDIR desktop.path = $$DATADIR/applications desktop.files += $${TARGET}.desktop icon.path = $$DATADIR/icons/hicolor/32x32/apps icon.files += images/$${TARGET}.png appdata.path = $${DATADIR}/appdata appdata.files += appdata/$${TARGET}.appdata.xml } # XML/DOM support QT += xml # QT5 support !lessThan(QT_MAJOR_VERSION, 5) { QT += widgets unix:!macx { QT += x11extras } } win32 { CONFIG += static } qjackctl-0.4.2/src/PaxHeaders.14935/qjackctlAlsaConnect.h0000644000000000000000000000013212700760152017722 xustar0030 mtime=1459871850.616906788 30 atime=1459871850.616906788 30 ctime=1459871850.616906788 qjackctl-0.4.2/src/qjackctlAlsaConnect.h0000644000175000001440000000746712700760152020504 0ustar00rncbcusers00000000000000// qjackctlAlsaConnect.h // /**************************************************************************** Copyright (C) 2003-2014, rncbc aka Rui Nuno Capela. All rights reserved. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. *****************************************************************************/ #ifndef __qjackctlAlsaConnect_h #define __qjackctlAlsaConnect_h #include "qjackctlAbout.h" #include "qjackctlConnect.h" #ifdef CONFIG_ALSA_SEQ #include #else typedef void snd_seq_t; #endif // Forward declarations. class qjackctlAlsaPort; class qjackctlAlsaClient; class qjackctlAlsaClientList; class qjackctlAlsaConnect; // Pixmap-set array indexes. #define QJACKCTL_ALSA_CLIENTO 0 // Output client item pixmap. #define QJACKCTL_ALSA_CLIENTI 1 // Input client item pixmap. #define QJACKCTL_ALSA_PORTO 2 // Output port pixmap. #define QJACKCTL_ALSA_PORTI 3 // Input port pixmap. #define QJACKCTL_ALSA_PIXMAPS 4 // Number of pixmaps in local array. // Jack port list item. class qjackctlAlsaPort : public qjackctlPortItem { public: // Constructor. qjackctlAlsaPort(qjackctlAlsaClient *pClient, int iAlsaPort); // Default destructor. ~qjackctlAlsaPort(); // Jack handles accessors. int alsaClient() const; int alsaPort() const; private: // Instance variables. int m_iAlsaPort; }; // Jack client list item. class qjackctlAlsaClient : public qjackctlClientItem { public: // Constructor. qjackctlAlsaClient(qjackctlAlsaClientList *pClientList, int iAlsaClient); // Default destructor. ~qjackctlAlsaClient(); // Jack client accessors. int alsaClient() const; // Port finder by id. qjackctlAlsaPort *findPort(int iAlsaPort); private: // Instance variables. int m_iAlsaClient; }; // Jack client list. class qjackctlAlsaClientList : public qjackctlClientList { public: // Constructor. qjackctlAlsaClientList(qjackctlClientListView *pListView, bool bReadable); // Default destructor. ~qjackctlAlsaClientList(); // Client finder by id. qjackctlAlsaClient *findClient(int iAlsaClient); // Client port finder by id. qjackctlAlsaPort *findClientPort(int iAlsaClient, int iAlsaPort); // Client:port refreshner (return newest item count). int updateClientPorts(); }; //---------------------------------------------------------------------------- // qjackctlAlsaConnect -- Connections model integrated object. class qjackctlAlsaConnect : public qjackctlConnect { public: // Constructor. qjackctlAlsaConnect(qjackctlConnectView *pConnectView); // Default destructor. ~qjackctlAlsaConnect(); // Common pixmap accessor. const QPixmap& pixmap(int iPixmap) const; protected: // Virtual Connect/Disconnection primitives. bool connectPorts (qjackctlPortItem *pOPort, qjackctlPortItem *pIPort); bool disconnectPorts (qjackctlPortItem *pOPort, qjackctlPortItem *pIPort); // Update port connection references. void updateConnections(); // Update icon size implementation. void updateIconPixmaps(); private: // Local pixmap-set janitor methods. void createIconPixmaps(); void deleteIconPixmaps(); // Local pixmap-set array. QPixmap *m_apPixmaps[QJACKCTL_ALSA_PIXMAPS]; }; #endif // __qjackctlAlsaConnect_h // end of qjackctlAlsaConnect.h qjackctl-0.4.2/src/PaxHeaders.14935/qjackctlMessagesStatusForm.h0000644000000000000000000000013212700760152021327 xustar0030 mtime=1459871850.621909288 30 atime=1459871850.621909288 30 ctime=1459871850.621909288 qjackctl-0.4.2/src/qjackctlMessagesStatusForm.h0000644000175000001440000000524412700760152022100 0ustar00rncbcusers00000000000000// qjackctlMessagesStatusForm.h // /**************************************************************************** Copyright (C) 2003-2013, rncbc aka Rui Nuno Capela. All rights reserved. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. *****************************************************************************/ #ifndef __qjackctlMessagesStatusForm_h #define __qjackctlMessagesStatusForm_h #include "ui_qjackctlMessagesStatusForm.h" // Forward declarations. class QTreeWidgetItem; class QFile; //---------------------------------------------------------------------------- // qjackctlMessagesStatusForm -- UI wrapper form. class qjackctlMessagesStatusForm : public QWidget { Q_OBJECT public: // Constructor. qjackctlMessagesStatusForm(QWidget *pParent = 0, Qt::WindowFlags wflags = 0); // Destructor. ~qjackctlMessagesStatusForm(); enum TabPage { MessagesTab = 0, StatusTab = 1 }; void setTabPage(int iTabPage); int tabPage() const; QFont messagesFont() const; void setMessagesFont(const QFont& font); int messagesLimit() const; void setMessagesLimit(int iLimit); bool isLogging() const; void setLogging(bool bEnabled, const QString& sFilename = QString()); void appendMessages(const QString& s); void appendMessagesColor(const QString& s, const QString& c); void appendMessagesText(const QString& s); void updateStatusItem(int iStatusItem, const QString& sText); public slots: void resetXrunStats(); void refreshXrunStats(); protected: void appendMessagesLine(const QString& s); void appendMessagesLog(const QString& s); void showEvent(QShowEvent *); void hideEvent(QHideEvent *); void closeEvent(QCloseEvent *); void keyPressEvent(QKeyEvent *); private: // The Qt-designer UI struct... Ui::qjackctlMessagesStatusForm m_ui; // Instance variables. int m_iMessagesLines; int m_iMessagesLimit; int m_iMessagesHigh; // Logging stuff. QFile *m_pMessagesLog; // Status stuff. QTreeWidgetItem *m_apStatus[19]; }; #endif // __qjackctlMessagesStatusForm_h // end of qjackctlMessagesStatusForm.h qjackctl-0.4.2/src/PaxHeaders.14935/qjackctlAlsaConnect.cpp0000644000000000000000000000013212700760152020255 xustar0030 mtime=1459871850.616906788 30 atime=1459871850.616906788 30 ctime=1459871850.616906788 qjackctl-0.4.2/src/qjackctlAlsaConnect.cpp0000644000175000001440000002740012700760152021024 0ustar00rncbcusers00000000000000// qjackctlAlsaConnect.cpp // /**************************************************************************** Copyright (C) 2003-2014, rncbc aka Rui Nuno Capela. All rights reserved. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. *****************************************************************************/ #include "qjackctlAlsaConnect.h" #include "qjackctlMainForm.h" #include //---------------------------------------------------------------------- // class qjackctlAlsaPort -- Alsa port list item. // // Constructor. qjackctlAlsaPort::qjackctlAlsaPort ( qjackctlAlsaClient *pClient, int iAlsaPort ) : qjackctlPortItem(pClient) { m_iAlsaPort = iAlsaPort; qjackctlAlsaConnect *pAlsaConnect = static_cast ( ((pClient->clientList())->listView())->binding()); if (pAlsaConnect) { if (pClient->isReadable()) { QTreeWidgetItem::setIcon(0, QIcon(pAlsaConnect->pixmap(QJACKCTL_ALSA_PORTO))); } else { QTreeWidgetItem::setIcon(0, QIcon(pAlsaConnect->pixmap(QJACKCTL_ALSA_PORTI))); } } } // Default destructor. qjackctlAlsaPort::~qjackctlAlsaPort (void) { } // Alsa handles accessors. int qjackctlAlsaPort::alsaClient (void) const { return (static_cast (client()))->alsaClient(); } int qjackctlAlsaPort::alsaPort (void) const { return m_iAlsaPort; } //---------------------------------------------------------------------- // class qjackctlAlsaClient -- Alsa client list item. // // Constructor. qjackctlAlsaClient::qjackctlAlsaClient ( qjackctlAlsaClientList *pClientList, int iAlsaClient ) : qjackctlClientItem(pClientList) { m_iAlsaClient = iAlsaClient; qjackctlAlsaConnect *pAlsaConnect = static_cast ( (pClientList->listView())->binding()); if (pAlsaConnect) { if (pClientList->isReadable()) { QTreeWidgetItem::setIcon(0, QIcon(pAlsaConnect->pixmap(QJACKCTL_ALSA_CLIENTO))); } else { QTreeWidgetItem::setIcon(0, QIcon(pAlsaConnect->pixmap(QJACKCTL_ALSA_CLIENTI))); } } } // Default destructor. qjackctlAlsaClient::~qjackctlAlsaClient (void) { } // Jack client accessor. int qjackctlAlsaClient::alsaClient (void) const { return m_iAlsaClient; } // Derived port finder. qjackctlAlsaPort *qjackctlAlsaClient::findPort ( int iAlsaPort ) { QListIterator iter(ports()); while (iter.hasNext()) { qjackctlAlsaPort *pPort = static_cast (iter.next()); if (iAlsaPort == pPort->alsaPort()) return pPort; } return NULL; } //---------------------------------------------------------------------- // qjackctlAlsaClientList -- Jack client list. // // Constructor. qjackctlAlsaClientList::qjackctlAlsaClientList ( qjackctlClientListView *pListView, bool bReadable ) : qjackctlClientList(pListView, bReadable) { } // Default destructor. qjackctlAlsaClientList::~qjackctlAlsaClientList (void) { } // Client finder by id. qjackctlAlsaClient *qjackctlAlsaClientList::findClient ( int iAlsaClient ) { QListIterator iter(clients()); while (iter.hasNext()) { qjackctlAlsaClient *pClient = static_cast (iter.next()); if (iAlsaClient == pClient->alsaClient()) return pClient; } return NULL; } // Client port finder by id. qjackctlAlsaPort *qjackctlAlsaClientList::findClientPort ( int iAlsaClient, int iAlsaPort ) { qjackctlAlsaClient *pClient = findClient(iAlsaClient); if (pClient == NULL) return NULL; return pClient->findPort(iAlsaPort); } // Client:port refreshner. int qjackctlAlsaClientList::updateClientPorts (void) { qjackctlMainForm *pMainForm = qjackctlMainForm::getInstance(); if (pMainForm == NULL) return 0; snd_seq_t *pAlsaSeq = pMainForm->alsaSeq(); if (pAlsaSeq == NULL) return 0; int iDirtyCount = 0; markClientPorts(0); #ifdef CONFIG_ALSA_SEQ unsigned int uiAlsaFlags; if (isReadable()) uiAlsaFlags = SND_SEQ_PORT_CAP_READ | SND_SEQ_PORT_CAP_SUBS_READ; else uiAlsaFlags = SND_SEQ_PORT_CAP_WRITE | SND_SEQ_PORT_CAP_SUBS_WRITE; snd_seq_client_info_t *pClientInfo; snd_seq_port_info_t *pPortInfo; snd_seq_client_info_alloca(&pClientInfo); snd_seq_port_info_alloca(&pPortInfo); snd_seq_client_info_set_client(pClientInfo, -1); while (snd_seq_query_next_client(pAlsaSeq, pClientInfo) >= 0) { const int iAlsaClient = snd_seq_client_info_get_client(pClientInfo); if (iAlsaClient > 0) { qjackctlAlsaClient *pClient = findClient(iAlsaClient); snd_seq_port_info_set_client(pPortInfo, iAlsaClient); snd_seq_port_info_set_port(pPortInfo, -1); while (snd_seq_query_next_port(pAlsaSeq, pPortInfo) >= 0) { const unsigned int uiPortCapability = snd_seq_port_info_get_capability(pPortInfo); if (((uiPortCapability & uiAlsaFlags) == uiAlsaFlags) && ((uiPortCapability & SND_SEQ_PORT_CAP_NO_EXPORT) == 0)) { QString sClientName = QString::number(iAlsaClient) + ':'; sClientName += QString::fromUtf8( snd_seq_client_info_get_name(pClientInfo)); qjackctlAlsaPort *pPort = 0; const int iAlsaPort = snd_seq_port_info_get_port(pPortInfo); if (pClient == 0) { pClient = new qjackctlAlsaClient(this, iAlsaClient); pClient->setClientName(sClientName); iDirtyCount++; } else { pPort = pClient->findPort(iAlsaPort); if (sClientName != pClient->clientName()) { pClient->setClientName(sClientName); iDirtyCount++; } } if (pClient) { QString sPortName = QString::number(iAlsaPort) + ':'; sPortName += QString::fromUtf8( snd_seq_port_info_get_name(pPortInfo)); if (pPort == 0) { pPort = new qjackctlAlsaPort(pClient, iAlsaPort); pPort->setPortName(sPortName); iDirtyCount++; } else if (sPortName != pPort->portName()) { pPort->setPortName(sPortName); iDirtyCount++; } } if (pPort) pPort->markClientPort(1); } } } } #endif // CONFIG_ALSA_SEQ iDirtyCount += cleanClientPorts(0); return iDirtyCount; } //---------------------------------------------------------------------- // qjackctlAlsaConnect -- Output-to-Input client/ports connection object. // // Constructor. qjackctlAlsaConnect::qjackctlAlsaConnect ( qjackctlConnectView *pConnectView ) : qjackctlConnect(pConnectView) { createIconPixmaps(); setOClientList(new qjackctlAlsaClientList( connectView()->OListView(), true)); setIClientList(new qjackctlAlsaClientList( connectView()->IListView(), false)); } // Default destructor. qjackctlAlsaConnect::~qjackctlAlsaConnect (void) { deleteIconPixmaps(); } // Common pixmap accessor (static). const QPixmap& qjackctlAlsaConnect::pixmap ( int iPixmap ) const { return *m_apPixmaps[iPixmap]; } // Local pixmap-set janitor methods. void qjackctlAlsaConnect::createIconPixmaps (void) { m_apPixmaps[QJACKCTL_ALSA_CLIENTI] = createIconPixmap("mclienti"); m_apPixmaps[QJACKCTL_ALSA_CLIENTO] = createIconPixmap("mcliento"); m_apPixmaps[QJACKCTL_ALSA_PORTI] = createIconPixmap("mporti"); m_apPixmaps[QJACKCTL_ALSA_PORTO] = createIconPixmap("mporto"); } void qjackctlAlsaConnect::deleteIconPixmaps (void) { for (int i = 0; i < QJACKCTL_ALSA_PIXMAPS; i++) { if (m_apPixmaps[i]) delete m_apPixmaps[i]; m_apPixmaps[i] = NULL; } } // Connection primitive. bool qjackctlAlsaConnect::connectPorts ( qjackctlPortItem *pOPort, qjackctlPortItem *pIPort ) { #ifdef CONFIG_ALSA_SEQ qjackctlMainForm *pMainForm = qjackctlMainForm::getInstance(); if (pMainForm == NULL) return false; snd_seq_t *pAlsaSeq = pMainForm->alsaSeq(); if (pAlsaSeq == NULL) return false; qjackctlAlsaPort *pOAlsa = static_cast (pOPort); qjackctlAlsaPort *pIAlsa = static_cast (pIPort); snd_seq_port_subscribe_t *pAlsaSubs; snd_seq_addr_t seq_addr; snd_seq_port_subscribe_alloca(&pAlsaSubs); seq_addr.client = pOAlsa->alsaClient(); seq_addr.port = pOAlsa->alsaPort(); snd_seq_port_subscribe_set_sender(pAlsaSubs, &seq_addr); seq_addr.client = pIAlsa->alsaClient(); seq_addr.port = pIAlsa->alsaPort(); snd_seq_port_subscribe_set_dest(pAlsaSubs, &seq_addr); return (snd_seq_subscribe_port(pAlsaSeq, pAlsaSubs) >= 0); #else return false; #endif // CONFIG_ALSA_SEQ } // Disconnection primitive. bool qjackctlAlsaConnect::disconnectPorts ( qjackctlPortItem *pOPort, qjackctlPortItem *pIPort ) { #ifdef CONFIG_ALSA_SEQ qjackctlMainForm *pMainForm = qjackctlMainForm::getInstance(); if (pMainForm == NULL) return false; snd_seq_t *pAlsaSeq = pMainForm->alsaSeq(); if (pAlsaSeq == NULL) return false; qjackctlAlsaPort *pOAlsa = static_cast (pOPort); qjackctlAlsaPort *pIAlsa = static_cast (pIPort); snd_seq_port_subscribe_t *pAlsaSubs; snd_seq_addr_t seq_addr; snd_seq_port_subscribe_alloca(&pAlsaSubs); seq_addr.client = pOAlsa->alsaClient(); seq_addr.port = pOAlsa->alsaPort(); snd_seq_port_subscribe_set_sender(pAlsaSubs, &seq_addr); seq_addr.client = pIAlsa->alsaClient(); seq_addr.port = pIAlsa->alsaPort(); snd_seq_port_subscribe_set_dest(pAlsaSubs, &seq_addr); return (snd_seq_unsubscribe_port(pAlsaSeq, pAlsaSubs) >= 0); #else return false; #endif // CONFIG_ALSA_SEQ } // Update port connection references. void qjackctlAlsaConnect::updateConnections (void) { #ifdef CONFIG_ALSA_SEQ qjackctlMainForm *pMainForm = qjackctlMainForm::getInstance(); if (pMainForm == NULL) return; snd_seq_t *pAlsaSeq = pMainForm->alsaSeq(); if (pAlsaSeq == NULL) return; snd_seq_query_subscribe_t *pAlsaSubs; snd_seq_addr_t seq_addr; snd_seq_query_subscribe_alloca(&pAlsaSubs); // Proper type casts. qjackctlAlsaClientList *pOClientList = static_cast (OClientList()); qjackctlAlsaClientList *pIClientList = static_cast (IClientList()); // For each output client item... QListIterator oclient(pOClientList->clients()); while (oclient.hasNext()) { qjackctlClientItem *pOClient = oclient.next(); // For each output port item... QListIterator oport(pOClient->ports()); while (oport.hasNext()) { qjackctlPortItem *pOPort = oport.next(); // Are there already any connections? if (pOPort->connects().count() > 0) continue; // Hava a proper type cast. qjackctlAlsaPort *pOAlsa = static_cast (pOPort); // Get port connections... snd_seq_query_subscribe_set_type(pAlsaSubs, SND_SEQ_QUERY_SUBS_READ); snd_seq_query_subscribe_set_index(pAlsaSubs, 0); seq_addr.client = pOAlsa->alsaClient(); seq_addr.port = pOAlsa->alsaPort(); snd_seq_query_subscribe_set_root(pAlsaSubs, &seq_addr); while (snd_seq_query_port_subscribers(pAlsaSeq, pAlsaSubs) >= 0) { seq_addr = *snd_seq_query_subscribe_get_addr(pAlsaSubs); qjackctlPortItem *pIPort = pIClientList->findClientPort( seq_addr.client, seq_addr.port); if (pIPort) { pOPort->addConnect(pIPort); pIPort->addConnect(pOPort); } snd_seq_query_subscribe_set_index(pAlsaSubs, snd_seq_query_subscribe_get_index(pAlsaSubs) + 1); } } } #endif // CONFIG_ALSA_SEQ } // Update icon size implementation. void qjackctlAlsaConnect::updateIconPixmaps (void) { deleteIconPixmaps(); createIconPixmaps(); } // end of qjackctlAlsaConnect.cpp qjackctl-0.4.2/src/PaxHeaders.14935/qjackctlSocketForm.ui0000644000000000000000000000013212700760152017772 xustar0030 mtime=1459871850.627912288 30 atime=1459871850.627912288 30 ctime=1459871850.627912288 qjackctl-0.4.2/src/qjackctlSocketForm.ui0000644000175000001440000002760312700760152020546 0ustar00rncbcusers00000000000000 rncbc aka Rui Nuno Capela JACK Audio Connection Kit - Qt GUI Interface. Copyright (C) 2003-2014, rncbc aka Rui Nuno Capela. All rights reserved. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. qjackctlSocketForm 0 0 400 300 Socket - JACK Audio Connection Kit :/images/patchbay1.png 9 6 QTabWidget::Rounded &Socket 8 4 &Name (alias): Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter false SocketNameLineEdit Socket name (an alias for client name) Client name (regular expression) true Add plug to socket plug list Add P&lug :/images/add1.png &Plug: Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter false PlugNameComboBox Port name (regular expression) true Qt::CustomContextMenu Socket plug list false true false true Socket Plugs / Ports Edit currently selected plug &Edit :/images/edit1.png Remove currently selected plug from socket plug list &Remove :/images/remove1.png &Client: Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter false ClientNameComboBox Move down currently selected plug in socket plug list &Down :/images/down1.png Move up current selected plug in socket plug list &Up :/images/up1.png Qt::Vertical QSizePolicy::Expanding 8 8 Enforce only one exclusive cable connection E&xclusive &Forward: Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter false SocketForwardComboBox Forward (clone) all connections from this socket false Type 8 4 Audio socket type (JACK) &Audio MIDI socket type (JACK) &MIDI MIDI socket type (ALSA) AL&SA Qt::Horizontal QDialogButtonBox::Cancel|QDialogButtonBox::Ok SocketTabWidget SocketNameLineEdit AudioRadioButton MidiRadioButton AlsaRadioButton ClientNameComboBox PlugNameComboBox PlugAddPushButton PlugListView PlugEditPushButton PlugRemovePushButton PlugUpPushButton PlugDownPushButton ExclusiveCheckBox SocketForwardComboBox DialogButtonBox qjackctl-0.4.2/src/PaxHeaders.14935/qjackctlSocketForm.cpp0000644000000000000000000000013212700760152020137 xustar0030 mtime=1459871850.626911789 30 atime=1459871850.626911789 30 ctime=1459871850.626911789 qjackctl-0.4.2/src/qjackctlSocketForm.cpp0000644000175000001440000006431712700760152020716 0ustar00rncbcusers00000000000000// qjackctlSocketForm.cpp // /**************************************************************************** Copyright (C) 2003-2015, rncbc aka Rui Nuno Capela. All rights reserved. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. *****************************************************************************/ #include "qjackctlAbout.h" #include "qjackctlSocketForm.h" #include "qjackctlMainForm.h" #include "qjackctlPatchbay.h" #include "qjackctlConnectAlias.h" #include #include #include #include #include #include //---------------------------------------------------------------------------- // qjackctlSocketForm -- UI wrapper form. // Constructor. qjackctlSocketForm::qjackctlSocketForm ( QWidget *pParent, Qt::WindowFlags wflags ) : QDialog(pParent, wflags) { // Setup UI struct... m_ui.setupUi(this); m_pSocketList = NULL; m_bSocketNew = false; m_iSocketNameChanged = 0; m_ppPixmaps = NULL; m_iDirtyCount = 0; // Setup time-display radio-button group. m_pSocketTypeButtonGroup = new QButtonGroup(this); m_pSocketTypeButtonGroup->addButton(m_ui.AudioRadioButton, 0); m_pSocketTypeButtonGroup->addButton(m_ui.MidiRadioButton, 1); m_pSocketTypeButtonGroup->addButton(m_ui.AlsaRadioButton, 2); m_pSocketTypeButtonGroup->setExclusive(true); // Plug list is not sortable. //m_ui.PlugListView->setSorting(-1); // Plug list view... QHeaderView *pHeader = m_ui.PlugListView->header(); // pHeader->setDefaultAlignment(Qt::AlignLeft); // pHeader->setDefaultSectionSize(300); #if QT_VERSION >= 0x050000 // pHeader->setSectionResizeMode(QHeaderView::Custom); pHeader->setSectionsMovable(false); #else // pHeader->setResizeMode(QHeaderView::Custom); pHeader->setMovable(false); #endif pHeader->setStretchLastSection(true); #ifndef CONFIG_JACK_MIDI m_ui.MidiRadioButton->setEnabled(false); #endif #ifndef CONFIG_ALSA_SEQ m_ui.AlsaRadioButton->setEnabled(false); #endif // UI connections... QObject::connect(m_ui.PlugAddPushButton, SIGNAL(clicked()), SLOT(addPlug())); QObject::connect(m_ui.PlugRemovePushButton, SIGNAL(clicked()), SLOT(removePlug())); QObject::connect(m_ui.PlugEditPushButton, SIGNAL(clicked()), SLOT(editPlug())); QObject::connect(m_ui.PlugUpPushButton, SIGNAL(clicked()), SLOT(moveUpPlug())); QObject::connect(m_ui.PlugDownPushButton, SIGNAL(clicked()), SLOT(moveDownPlug())); QObject::connect(m_ui.PlugListView, SIGNAL(currentItemChanged(QTreeWidgetItem*, QTreeWidgetItem*)), SLOT(selectedPlug())); QObject::connect(m_ui.SocketNameLineEdit, SIGNAL(textChanged(const QString&)), SLOT(socketNameChanged())); QObject::connect(m_ui.AudioRadioButton, SIGNAL(toggled(bool)), SLOT(socketTypeChanged())); QObject::connect(m_ui.MidiRadioButton, SIGNAL(toggled(bool)), SLOT(socketTypeChanged())); QObject::connect(m_ui.AlsaRadioButton, SIGNAL(toggled(bool)), SLOT(socketTypeChanged())); QObject::connect(m_ui.ExclusiveCheckBox, SIGNAL(toggled(bool)), SLOT(socketTypeChanged())); QObject::connect(m_ui.ClientNameComboBox, SIGNAL(editTextChanged(const QString&)), SLOT(clientNameChanged())); QObject::connect(m_ui.PlugNameComboBox, SIGNAL(editTextChanged(const QString&)), SLOT(changed())); QObject::connect(m_ui.PlugListView, SIGNAL(customContextMenuRequested(const QPoint&)), SLOT(customContextMenu(const QPoint&))); QObject::connect(m_ui.PlugListView->itemDelegate(), SIGNAL(commitData(QWidget*)), SLOT(changed())); QObject::connect(m_ui.SocketForwardComboBox, SIGNAL(activated(int)), SLOT(changed())); QObject::connect(m_ui.DialogButtonBox, SIGNAL(accepted()), SLOT(accept())); QObject::connect(m_ui.DialogButtonBox, SIGNAL(rejected()), SLOT(reject())); } // Destructor. qjackctlSocketForm::~qjackctlSocketForm (void) { delete m_pSocketTypeButtonGroup; } // Socket caption utility method. void qjackctlSocketForm::setSocketCaption ( const QString& sSocketCaption ) { m_ui.SocketTabWidget->setTabText(0, sSocketCaption); (m_ui.PlugListView->headerItem())->setText(0, sSocketCaption + ' ' + tr("Plugs / Ports")); } // Socket list enablement. void qjackctlSocketForm::setSocketList ( qjackctlSocketList *pSocketList ) { m_pSocketList = pSocketList; } // Socket new flag. void qjackctlSocketForm::setSocketNew ( bool bSocketNew ) { m_bSocketNew = bSocketNew; } // Pixmap utility methods. void qjackctlSocketForm::setPixmaps ( QPixmap **ppPixmaps ) { m_ppPixmaps = ppPixmaps; } // Socket type and exclusiveness editing enablement. void qjackctlSocketForm::setConnectCount ( int iConnectCount ) { // m_ui.SocketTypeGroupBox->setEnabled(iConnectCount < 1); if (iConnectCount) { switch (m_pSocketTypeButtonGroup->checkedId()) { case 0: // QJACKCTL_SOCKETTYPE_JACK_AUDIO m_ui.MidiRadioButton->setEnabled(false); m_ui.AlsaRadioButton->setEnabled(false); break; case 1: // QJACKCTL_SOCKETTYPE_JACK_MIDI m_ui.AudioRadioButton->setEnabled(false); m_ui.AlsaRadioButton->setEnabled(false); break; case 2: // QJACKCTL_SOCKETTYPE_ALSA_MIDI m_ui.AudioRadioButton->setEnabled(false); m_ui.MidiRadioButton->setEnabled(false); break; } } m_ui.ExclusiveCheckBox->setEnabled(iConnectCount < 2); #ifndef CONFIG_JACK_MIDI m_ui.MidiRadioButton->setEnabled(false); #endif #ifndef CONFIG_ALSA_SEQ m_ui.AlsaRadioButton->setEnabled(false); #endif } // Load dialog controls from socket properties. void qjackctlSocketForm::load ( qjackctlPatchbaySocket *pSocket ) { m_ui.SocketNameLineEdit->setText(pSocket->name()); QRadioButton *pRadioButton = static_cast ( m_pSocketTypeButtonGroup->button(pSocket->type())); if (pRadioButton) pRadioButton->setChecked(true); m_ui.ClientNameComboBox->setEditText(pSocket->clientName()); m_ui.ExclusiveCheckBox->setChecked(pSocket->isExclusive()); m_ui.PlugListView->clear(); QTreeWidgetItem *pPlugItem = NULL; QStringListIterator iter(pSocket->pluglist()); while (iter.hasNext()) { const QString& sPlugName = iter.next(); pPlugItem = new QTreeWidgetItem(m_ui.PlugListView, pPlugItem); if (pPlugItem) { pPlugItem->setText(0, sPlugName); pPlugItem->setFlags(pPlugItem->flags() | Qt::ItemIsEditable); } } socketTypeChanged(); int iItemIndex = 0; if (!pSocket->forward().isEmpty()) { const int iItem = m_ui.SocketForwardComboBox->findText(pSocket->forward()); if (iItem >= 0) iItemIndex = iItem; } m_ui.SocketForwardComboBox->setCurrentIndex(iItemIndex); if (m_bSocketNew) m_iSocketNameChanged = 0; m_iDirtyCount = 0; stabilizeForm(); } // Save dialog controls into socket properties. void qjackctlSocketForm::save ( qjackctlPatchbaySocket *pSocket ) { pSocket->setName(m_ui.SocketNameLineEdit->text()); pSocket->setType(m_pSocketTypeButtonGroup->checkedId()); pSocket->setClientName(m_ui.ClientNameComboBox->currentText()); pSocket->setExclusive(m_ui.ExclusiveCheckBox->isChecked()); pSocket->pluglist().clear(); const int iPlugCount = m_ui.PlugListView->topLevelItemCount(); for (int iPlug = 0; iPlug < iPlugCount; ++iPlug) { QTreeWidgetItem *pItem = m_ui.PlugListView->topLevelItem(iPlug); pSocket->addPlug(pItem->text(0)); } if (m_ui.SocketForwardComboBox->currentIndex() > 0) pSocket->setForward(m_ui.SocketForwardComboBox->currentText()); else pSocket->setForward(QString::null); m_iDirtyCount = 0; } // Stabilize current state form. void qjackctlSocketForm::stabilizeForm (void) { m_ui.DialogButtonBox->button( QDialogButtonBox::Ok)->setEnabled(validateForm()); QTreeWidgetItem *pItem = m_ui.PlugListView->currentItem(); if (pItem) { const int iItem = m_ui.PlugListView->indexOfTopLevelItem(pItem); const int iItemCount = m_ui.PlugListView->topLevelItemCount(); m_ui.PlugEditPushButton->setEnabled(true); m_ui.PlugRemovePushButton->setEnabled(true); m_ui.PlugUpPushButton->setEnabled(iItem > 0); m_ui.PlugDownPushButton->setEnabled(iItem < iItemCount - 1); } else { m_ui.PlugEditPushButton->setEnabled(false); m_ui.PlugRemovePushButton->setEnabled(false); m_ui.PlugUpPushButton->setEnabled(false); m_ui.PlugDownPushButton->setEnabled(false); } bool bEnabled = !m_ui.PlugNameComboBox->currentText().isEmpty(); if (bEnabled) { bEnabled = (m_ui.PlugListView->findItems( m_ui.PlugNameComboBox->currentText(), Qt::MatchExactly).isEmpty()); } m_ui.PlugAddPushButton->setEnabled(bEnabled); } // Validate form fields. bool qjackctlSocketForm::validateForm (void) { bool bValid = (m_iDirtyCount > 0); bValid = bValid && !m_ui.SocketNameLineEdit->text().isEmpty(); bValid = bValid && !m_ui.ClientNameComboBox->currentText().isEmpty(); bValid = bValid && (m_ui.PlugListView->topLevelItemCount() > 0); return bValid; } // Validate form fields and accept it valid. void qjackctlSocketForm::accept (void) { if (m_pSocketList == NULL) return; if (!validateForm()) return; // Check if a socket with the same name already exists... if (m_bSocketNew) { QListIterator iter(m_pSocketList->sockets()); while (iter.hasNext()) { const QString& sSocketName = iter.next()->socketName(); if (m_ui.SocketNameLineEdit->text() == sSocketName) { QMessageBox::critical(this, tr("Error") + " - " QJACKCTL_SUBTITLE1, tr("A socket named \"%1\" already exists.") .arg(sSocketName), QMessageBox::Cancel); // Reject. return; } } } QDialog::accept(); } void qjackctlSocketForm::reject (void) { bool bReject = true; // Check if there's any pending changes... if (m_iDirtyCount > 0) { switch (QMessageBox::warning(this, tr("Warning") + " - " QJACKCTL_SUBTITLE1, tr("Some settings have been changed.\n\n" "Do you want to apply the changes?"), QMessageBox::Apply | QMessageBox::Discard | QMessageBox::Cancel)) { case QMessageBox::Apply: accept(); return; case QMessageBox::Discard: break; default: // Cancel. bReject = false; } } if (bReject) QDialog::reject(); } // Dirty up the current form. void qjackctlSocketForm::changed (void) { ++m_iDirtyCount; stabilizeForm(); } // Add new Plug to socket list. void qjackctlSocketForm::addPlug (void) { if (m_ppPixmaps == NULL) return; QString sPlugName = m_ui.PlugNameComboBox->currentText(); if (!sPlugName.isEmpty()) { QTreeWidgetItem *pItem = m_ui.PlugListView->currentItem(); if (pItem) pItem->setSelected(false); pItem = new QTreeWidgetItem(m_ui.PlugListView, pItem); if (pItem) { pItem->setText(0, sPlugName); pItem->setFlags(pItem->flags() | Qt::ItemIsEditable); QPixmap *pXpmPlug = NULL; switch (m_pSocketTypeButtonGroup->checkedId()) { case 0: // QJACKCTL_SOCKETTYPE_JACK_AUDIO pXpmPlug = m_ppPixmaps[QJACKCTL_XPM_AUDIO_PLUG]; break; case 1: // QJACKCTL_SOCKETTYPE_JACK_MIDI case 2: // QJACKCTL_SOCKETTYPE_ALSA_MIDI pXpmPlug = m_ppPixmaps[QJACKCTL_XPM_MIDI_PLUG]; break; } if (pXpmPlug) pItem->setIcon(0, QIcon(*pXpmPlug)); pItem->setSelected(true); m_ui.PlugListView->setCurrentItem(pItem); } m_ui.PlugNameComboBox->setEditText(QString::null); } clientNameChanged(); } // Rename current selected Plug. void qjackctlSocketForm::editPlug (void) { QTreeWidgetItem *pItem = m_ui.PlugListView->currentItem(); if (pItem) m_ui.PlugListView->editItem(pItem, 0); clientNameChanged(); } // Remove current selected Plug. void qjackctlSocketForm::removePlug (void) { QTreeWidgetItem *pItem = m_ui.PlugListView->currentItem(); if (pItem) delete pItem; clientNameChanged(); } // Move current selected Plug one position up. void qjackctlSocketForm::moveUpPlug (void) { QTreeWidgetItem *pItem = m_ui.PlugListView->currentItem(); if (pItem) { int iItem = m_ui.PlugListView->indexOfTopLevelItem(pItem); if (iItem > 0) { pItem->setSelected(false); pItem = m_ui.PlugListView->takeTopLevelItem(iItem); m_ui.PlugListView->insertTopLevelItem(iItem - 1, pItem); pItem->setSelected(true); m_ui.PlugListView->setCurrentItem(pItem); } } changed(); } // Move current selected Plug one position down void qjackctlSocketForm::moveDownPlug (void) { QTreeWidgetItem *pItem = m_ui.PlugListView->currentItem(); if (pItem) { int iItem = m_ui.PlugListView->indexOfTopLevelItem(pItem); int iItemCount = m_ui.PlugListView->topLevelItemCount(); if (iItem < iItemCount - 1) { pItem->setSelected(false); pItem = m_ui.PlugListView->takeTopLevelItem(iItem); m_ui.PlugListView->insertTopLevelItem(iItem + 1, pItem); pItem->setSelected(true); m_ui.PlugListView->setCurrentItem(pItem); } } changed(); } // Update selected plug one position down void qjackctlSocketForm::selectedPlug (void) { QTreeWidgetItem *pItem = m_ui.PlugListView->currentItem(); if (pItem) m_ui.PlugNameComboBox->setEditText(pItem->text(0)); stabilizeForm(); } // Add new Plug from context menu. void qjackctlSocketForm::activateAddPlugMenu ( QAction *pAction ) { const int iIndex = pAction->data().toInt(); if (iIndex >= 0 && iIndex < m_ui.PlugNameComboBox->count()) { m_ui.PlugNameComboBox->setCurrentIndex(iIndex); addPlug(); } } // Plug list context menu handler. void qjackctlSocketForm::customContextMenu ( const QPoint& pos ) { int iItem = 0; int iItemCount = 0; QTreeWidgetItem *pItem = m_ui.PlugListView->itemAt(pos); if (pItem == NULL) pItem = m_ui.PlugListView->currentItem(); if (pItem) { iItem = m_ui.PlugListView->indexOfTopLevelItem(pItem); iItemCount = m_ui.PlugListView->topLevelItemCount(); } QMenu menu(this); QAction *pAction; // Build the add plug sub-menu... QMenu *pAddPlugMenu = menu.addMenu( QIcon(":/images/add1.png"), tr("Add Plug")); int iIndex = 0; for (iIndex = 0; iIndex < m_ui.PlugNameComboBox->count(); iIndex++) { pAction = pAddPlugMenu->addAction( m_ui.PlugNameComboBox->itemText(iIndex)); pAction->setData(iIndex); } QObject::connect(pAddPlugMenu, SIGNAL(triggered(QAction*)), SLOT(activateAddPlugMenu(QAction*))); pAddPlugMenu->setEnabled(iIndex > 0); // Build the plug context menu... const bool bEnabled = (pItem != NULL); pAction = menu.addAction(QIcon(":/images/edit1.png"), tr("Edit"), this, SLOT(editPlug())); pAction->setEnabled(bEnabled); pAction = menu.addAction(QIcon(":/images/remove1.png"), tr("Remove"), this, SLOT(removePlug())); pAction->setEnabled(bEnabled); menu.addSeparator(); pAction = menu.addAction(QIcon(":/images/up1.png"), tr("Move Up"), this, SLOT(moveUpPlug())); pAction->setEnabled(bEnabled && iItem > 0); pAction = menu.addAction(QIcon(":/images/down1.png"), tr("Move Down"), this, SLOT(moveDownPlug())); pAction->setEnabled(bEnabled && iItem < iItemCount - 1); menu.exec((m_ui.PlugListView->viewport())->mapToGlobal(pos)); } void qjackctlSocketForm::updateJackClients ( int iSocketType ) { qjackctlMainForm *pMainForm = qjackctlMainForm::getInstance(); if (pMainForm == NULL) return; jack_client_t *pJackClient = pMainForm->jackClient(); if (pJackClient == NULL) return; const char *pszJackPortType = JACK_DEFAULT_AUDIO_TYPE; int iPixmap = QJACKCTL_XPM_AUDIO_CLIENT; #ifdef CONFIG_JACK_MIDI if (iSocketType == QJACKCTL_SOCKETTYPE_JACK_MIDI) { pszJackPortType = JACK_DEFAULT_MIDI_TYPE; iPixmap = QJACKCTL_XPM_MIDI_CLIENT; } #endif const bool bReadable = m_pSocketList->isReadable(); const QIcon icon(*m_ppPixmaps[iPixmap]); // Grab all client ports. const char **ppszClientPorts = jack_get_ports( pJackClient, NULL, pszJackPortType, (bReadable ? JackPortIsOutput : JackPortIsInput)); if (ppszClientPorts) { int iClientPort = 0; while (ppszClientPorts[iClientPort]) { QString sClientPort = QString::fromUtf8(ppszClientPorts[iClientPort]); int iColon = sClientPort.indexOf(':'); if (iColon >= 0) { QString sClientName = qjackctlClientAlias::escapeRegExpDigits( sClientPort.left(iColon)); bool bExists = false; for (int i = 0; i < m_ui.ClientNameComboBox->count() && !bExists; i++) bExists = (sClientName == m_ui.ClientNameComboBox->itemText(i)); if (!bExists) { m_ui.ClientNameComboBox->addItem(icon, sClientName); } } iClientPort++; } ::free(ppszClientPorts); } } // ALSA client names refreshner. void qjackctlSocketForm::updateAlsaClients ( int iSocketType ) { if (iSocketType != QJACKCTL_SOCKETTYPE_ALSA_MIDI) return; #ifdef CONFIG_ALSA_SEQ qjackctlMainForm *pMainForm = qjackctlMainForm::getInstance(); if (pMainForm == NULL) return; snd_seq_t *pAlsaSeq = pMainForm->alsaSeq(); if (pAlsaSeq == NULL) return; const bool bReadable = m_pSocketList->isReadable(); const QIcon icon(*m_ppPixmaps[QJACKCTL_XPM_MIDI_CLIENT]); // Readd all subscribers... snd_seq_client_info_t *pClientInfo; snd_seq_port_info_t *pPortInfo; unsigned int uiAlsaFlags; if (bReadable) uiAlsaFlags = SND_SEQ_PORT_CAP_READ | SND_SEQ_PORT_CAP_SUBS_READ; else uiAlsaFlags = SND_SEQ_PORT_CAP_WRITE | SND_SEQ_PORT_CAP_SUBS_WRITE; snd_seq_client_info_alloca(&pClientInfo); snd_seq_port_info_alloca(&pPortInfo); snd_seq_client_info_set_client(pClientInfo, -1); while (snd_seq_query_next_client(pAlsaSeq, pClientInfo) >= 0) { const int iAlsaClient = snd_seq_client_info_get_client(pClientInfo); QString sClient = qjackctlClientAlias::escapeRegExpDigits( QString::fromUtf8(snd_seq_client_info_get_name(pClientInfo))); if (iAlsaClient > 0) { bool bExists = false; snd_seq_port_info_set_client(pPortInfo, iAlsaClient); snd_seq_port_info_set_port(pPortInfo, -1); while (!bExists && snd_seq_query_next_port(pAlsaSeq, pPortInfo) >= 0) { const unsigned int uiPortCapability = snd_seq_port_info_get_capability(pPortInfo); if (((uiPortCapability & uiAlsaFlags) == uiAlsaFlags) && ((uiPortCapability & SND_SEQ_PORT_CAP_NO_EXPORT) == 0)) { for (int i = 0; i < m_ui.ClientNameComboBox->count() && !bExists; i++) bExists = (sClient == m_ui.ClientNameComboBox->itemText(i)); if (!bExists) { m_ui.ClientNameComboBox->addItem(icon, sClient); bExists = true; } } } } } #endif // CONFIG_ALSA_SEQ } // Socket type change slot. void qjackctlSocketForm::socketTypeChanged (void) { if (m_ppPixmaps == NULL) return; if (m_pSocketList == NULL) return; const bool bBlockSignals = m_ui.ClientNameComboBox->blockSignals(true); const QString sOldClientName = m_ui.ClientNameComboBox->currentText(); m_ui.ClientNameComboBox->clear(); QPixmap *pXpmSocket = NULL; QPixmap *pXpmPlug = NULL; const bool bReadable = m_pSocketList->isReadable(); const int iSocketType = m_pSocketTypeButtonGroup->checkedId(); switch (iSocketType) { case 0: // QJACKCTL_SOCKETTYPE_JACK_AUDIO if (m_ui.ExclusiveCheckBox->isChecked()) pXpmSocket = m_ppPixmaps[QJACKCTL_XPM_AUDIO_SOCKET_X]; else pXpmSocket = m_ppPixmaps[QJACKCTL_XPM_AUDIO_SOCKET]; m_ui.SocketTabWidget->setTabIcon(0, QIcon(*pXpmSocket)); pXpmPlug = m_ppPixmaps[QJACKCTL_XPM_AUDIO_PLUG]; updateJackClients(QJACKCTL_SOCKETTYPE_JACK_AUDIO); break; case 1: // QJACKCTL_SOCKETTYPE_JACK_MIDI if (m_ui.ExclusiveCheckBox->isChecked()) pXpmSocket = m_ppPixmaps[QJACKCTL_XPM_MIDI_SOCKET_X]; else pXpmSocket = m_ppPixmaps[QJACKCTL_XPM_MIDI_SOCKET]; m_ui.SocketTabWidget->setTabIcon(0, QIcon(*pXpmSocket)); pXpmPlug = m_ppPixmaps[QJACKCTL_XPM_MIDI_PLUG]; updateJackClients(QJACKCTL_SOCKETTYPE_JACK_MIDI); break; case 2: // QJACKCTL_SOCKETTYPE_ALSA_MIDI if (m_ui.ExclusiveCheckBox->isChecked()) pXpmSocket = m_ppPixmaps[QJACKCTL_XPM_MIDI_SOCKET_X]; else pXpmSocket = m_ppPixmaps[QJACKCTL_XPM_MIDI_SOCKET]; m_ui.SocketTabWidget->setTabIcon(0, QIcon(*pXpmSocket)); pXpmPlug = m_ppPixmaps[QJACKCTL_XPM_MIDI_PLUG]; updateAlsaClients(QJACKCTL_SOCKETTYPE_ALSA_MIDI); break; } const int iOldSocketNameChanged = m_iSocketNameChanged++; m_ui.ClientNameComboBox->setEditText(sOldClientName); clientNameChanged(); m_iSocketNameChanged = iOldSocketNameChanged; if (pXpmPlug) { const int iItemCount = m_ui.PlugListView->topLevelItemCount(); for (int iItem = 0; iItem < iItemCount; ++iItem) { QTreeWidgetItem *pItem = m_ui.PlugListView->topLevelItem(iItem); pItem->setIcon(0, QIcon(*pXpmPlug)); } } // Now the socket forward list... m_ui.SocketForwardComboBox->clear(); m_ui.SocketForwardComboBox->addItem(tr("(None)")); if (!bReadable) { QListIterator iter(m_pSocketList->sockets()); while (iter.hasNext()) { qjackctlSocketItem *pSocketItem = iter.next(); if (pSocketItem->socketType() == iSocketType && pSocketItem->socketName() != m_ui.SocketNameLineEdit->text()) { switch (iSocketType) { case 0: // QJACKCTL_SOCKETTYPE_JACK_AUDIO if (pSocketItem->isExclusive()) pXpmSocket = m_ppPixmaps[QJACKCTL_XPM_AUDIO_SOCKET_X]; else pXpmSocket = m_ppPixmaps[QJACKCTL_XPM_AUDIO_SOCKET]; break; case 1: // QJACKCTL_SOCKETTYPE_JACK_MIDI case 2: // QJACKCTL_SOCKETTYPE_ALSA_MIDI if (pSocketItem->isExclusive()) pXpmSocket = m_ppPixmaps[QJACKCTL_XPM_MIDI_SOCKET_X]; else pXpmSocket = m_ppPixmaps[QJACKCTL_XPM_MIDI_SOCKET]; break; } m_ui.SocketForwardComboBox->addItem( QIcon(*pXpmSocket), pSocketItem->socketName()); } } } const bool bEnabled = (m_ui.SocketForwardComboBox->count() > 1); m_ui.SocketForwardTextLabel->setEnabled(bEnabled); m_ui.SocketForwardComboBox->setEnabled(bEnabled); m_ui.ClientNameComboBox->blockSignals(bBlockSignals); } // Socket name change slot. void qjackctlSocketForm::socketNameChanged (void) { ++m_iSocketNameChanged; changed(); } // JACK client plugs refreshner. void qjackctlSocketForm::updateJackPlugs ( int iSocketType ) { qjackctlMainForm *pMainForm = qjackctlMainForm::getInstance(); if (pMainForm == NULL) return; jack_client_t *pJackClient = pMainForm->jackClient(); if (pJackClient == NULL) return; const char *pszJackPortType = JACK_DEFAULT_AUDIO_TYPE; int iPixmap = QJACKCTL_XPM_AUDIO_PLUG; #ifdef CONFIG_JACK_MIDI if (iSocketType == QJACKCTL_SOCKETTYPE_JACK_MIDI) { pszJackPortType = JACK_DEFAULT_MIDI_TYPE; iPixmap = QJACKCTL_XPM_MIDI_PLUG; } #endif const QString sClientName = m_ui.ClientNameComboBox->currentText(); if (sClientName.isEmpty()) return; QRegExp rxClientName(sClientName); const bool bReadable = m_pSocketList->isReadable(); const QIcon icon(*m_ppPixmaps[iPixmap]); const char **ppszClientPorts = jack_get_ports( pJackClient, NULL, pszJackPortType, (bReadable ? JackPortIsOutput : JackPortIsInput)); if (ppszClientPorts) { int iClientPort = 0; while (ppszClientPorts[iClientPort]) { QString sClientPort = QString::fromUtf8(ppszClientPorts[iClientPort]); const int iColon = sClientPort.indexOf(':'); if (iColon >= 0 && rxClientName.exactMatch(sClientPort.left(iColon))) { QString sPort = qjackctlClientAlias::escapeRegExpDigits( sClientPort.right(sClientPort.length() - iColon - 1)); if (m_ui.PlugListView->findItems(sPort, Qt::MatchExactly).isEmpty()) m_ui.PlugNameComboBox->addItem(icon, sPort); } iClientPort++; } ::free(ppszClientPorts); } } // ALSA client plugs refreshner. void qjackctlSocketForm::updateAlsaPlugs ( int iSocketType ) { if (iSocketType != QJACKCTL_SOCKETTYPE_ALSA_MIDI) return; #ifdef CONFIG_ALSA_SEQ qjackctlMainForm *pMainForm = qjackctlMainForm::getInstance(); if (pMainForm == NULL) return; snd_seq_t *pAlsaSeq = pMainForm->alsaSeq(); if (pAlsaSeq == NULL) return; const QString sClientName = m_ui.ClientNameComboBox->currentText(); if (sClientName.isEmpty()) return; QRegExp rxClientName(sClientName); const bool bReadable = m_pSocketList->isReadable(); const QIcon icon(*m_ppPixmaps[QJACKCTL_XPM_MIDI_PLUG]); // Fill sequencer plugs... snd_seq_client_info_t *pClientInfo; snd_seq_port_info_t *pPortInfo; unsigned int uiAlsaFlags; if (bReadable) uiAlsaFlags = SND_SEQ_PORT_CAP_READ | SND_SEQ_PORT_CAP_SUBS_READ; else uiAlsaFlags = SND_SEQ_PORT_CAP_WRITE | SND_SEQ_PORT_CAP_SUBS_WRITE; snd_seq_client_info_alloca(&pClientInfo); snd_seq_port_info_alloca(&pPortInfo); snd_seq_client_info_set_client(pClientInfo, -1); while (snd_seq_query_next_client(pAlsaSeq, pClientInfo) >= 0) { const int iAlsaClient = snd_seq_client_info_get_client(pClientInfo); QString sClient = QString::fromUtf8( snd_seq_client_info_get_name(pClientInfo)); if (iAlsaClient > 0 && rxClientName.exactMatch(sClient)) { snd_seq_port_info_set_client(pPortInfo, iAlsaClient); snd_seq_port_info_set_port(pPortInfo, -1); while (snd_seq_query_next_port(pAlsaSeq, pPortInfo) >= 0) { const unsigned int uiPortCapability = snd_seq_port_info_get_capability(pPortInfo); if (((uiPortCapability & uiAlsaFlags) == uiAlsaFlags) && ((uiPortCapability & SND_SEQ_PORT_CAP_NO_EXPORT) == 0)) { QString sPort = qjackctlClientAlias::escapeRegExpDigits( QString::fromUtf8(snd_seq_port_info_get_name(pPortInfo))); if (m_ui.PlugListView->findItems(sPort, Qt::MatchExactly).isEmpty()) m_ui.PlugNameComboBox->addItem(icon, sPort); } } } } #endif // CONFIG_ALSA_SEQ } // Update client list if available. void qjackctlSocketForm::clientNameChanged (void) { if (m_ppPixmaps == NULL) return; if (m_pSocketList == NULL) return; m_ui.PlugNameComboBox->clear(); const int iSocketType = m_pSocketTypeButtonGroup->checkedId(); switch (iSocketType) { case 0: updateJackPlugs(QJACKCTL_SOCKETTYPE_JACK_AUDIO); break; case 1: updateJackPlugs(QJACKCTL_SOCKETTYPE_JACK_MIDI); break; case 2: updateAlsaPlugs(QJACKCTL_SOCKETTYPE_ALSA_MIDI); break; } if (m_iSocketNameChanged < 1) { // Find a new distinguishable socket name, please. QString sSocketName = m_ui.ClientNameComboBox->currentText(); if (!sSocketName.isEmpty()) { int iSocketNo = 0; QString sSocketMask = sSocketName; sSocketMask.remove(QRegExp("[ |0-9]+$")).append(" %1"); do { sSocketName = sSocketMask.arg(++iSocketNo); } while (m_pSocketList->findSocket(sSocketName, iSocketType)); m_ui.SocketNameLineEdit->setText(sSocketName); m_iSocketNameChanged = 0; } } changed(); } // end of qjackctlSocketForm.cpp qjackctl-0.4.2/src/PaxHeaders.14935/qjackctlConnectAlias.h0000644000000000000000000000013212700760152020073 xustar0030 mtime=1459871850.617907288 30 atime=1459871850.617907288 30 ctime=1459871850.617907288 qjackctl-0.4.2/src/qjackctlConnectAlias.h0000644000175000001440000000611612700760152020643 0ustar00rncbcusers00000000000000// qjackctlConnectAlias.h // /**************************************************************************** Copyright (C) 2003-2014, rncbc aka Rui Nuno Capela. All rights reserved. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. *****************************************************************************/ #ifndef __qjackctlConnectAlias_h #define __qjackctlConnectAlias_h #include #include #include // Client item alias map. class qjackctlClientAlias { public: // Constructor. qjackctlClientAlias (const QString& sClientName, const QString& sClientAlias = QString::null); // Default destructor. ~qjackctlClientAlias(); // Client name accessor. QString clientName() const; // Client name matcher. bool matchClientName(const QString& sClientName) const; // Client aliasing methods. const QString& clientAlias() const; void setClientAlias(const QString& sClientAlias); // Port aliasing methods. QString portAlias (const QString& sPortName) const; void setPortAlias (const QString& sPortName, const QString& sPortAlias); // Save client/port aliases definitions. void saveSettings(QSettings& settings, const QString& sClientKey); // Need for generid sort. bool operator< (const qjackctlClientAlias& other); // Escape and format a string as a regular expresion. static QString escapeRegExpDigits(const QString& s, int iThreshold = 3); private: // Client name regexp. QRegExp m_rxClientName; // Client alias. QString m_sClientAlias; // Port aliases map. QMap m_ports; }; // Client list alias map. class qjackctlConnectAlias : public QList { public: // Constructor. qjackctlConnectAlias (); // Default destructor. ~qjackctlConnectAlias (); // Client aliasing methods. QString clientAlias (const QString& sClientName); void setClientAlias (const QString& sClientName, const QString& sClientAlias); // Port aliasing methods. QString portAlias (const QString& sClientName, const QString& sPortName); void setPortAlias (const QString& sClientName, const QString& sPortName, const QString& sPortAlias); // Load/save aliases definitions. void loadSettings(QSettings& settings, const QString& sAliasesKey); void saveSettings(QSettings& settings, const QString& sAliasesKey); private: // Client item finder. qjackctlClientAlias *findClientName (const QString& sClientName); }; #endif // __qjackctlConnectAlias_h // end of qjackctlConnectAlias.h qjackctl-0.4.2/src/PaxHeaders.14935/qjackctlPatchbay.h0000644000000000000000000000013212700760152017263 xustar0030 mtime=1459871850.622909789 30 atime=1459871850.621909288 30 ctime=1459871850.622909789 qjackctl-0.4.2/src/qjackctlPatchbay.h0000644000175000001440000002657312700760152020044 0ustar00rncbcusers00000000000000// qjackctlPatchbay.h // /**************************************************************************** Copyright (C) 2003-2015, rncbc aka Rui Nuno Capela. All rights reserved. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. *****************************************************************************/ #ifndef __qjackctlPatchbay_h #define __qjackctlPatchbay_h #include #include // Our external patchbay models. #include "qjackctlPatchbayRack.h" // QListViewItem::rtti return values. #define QJACKCTL_SOCKETITEM 2001 #define QJACKCTL_PLUGITEM 2002 // Forward declarations. class qjackctlPlugItem; class qjackctlSocketItem; class qjackctlSocketList; class qjackctlSocketListView; class qjackctlPatchworkView; class qjackctlPatchbayView; class qjackctlPatchbay; // Pixmap-set indexes. #define QJACKCTL_XPM_AUDIO_SOCKET 0 #define QJACKCTL_XPM_AUDIO_SOCKET_X 1 #define QJACKCTL_XPM_AUDIO_CLIENT 2 #define QJACKCTL_XPM_AUDIO_PLUG 3 #define QJACKCTL_XPM_MIDI_SOCKET 4 #define QJACKCTL_XPM_MIDI_SOCKET_X 5 #define QJACKCTL_XPM_MIDI_CLIENT 6 #define QJACKCTL_XPM_MIDI_PLUG 7 #define QJACKCTL_XPM_PIXMAPS 8 // Patchbay plug (port) list item. class qjackctlPlugItem : public QTreeWidgetItem { public: // Constructor. qjackctlPlugItem(qjackctlSocketItem *pSocket, const QString& sPlugName, qjackctlPlugItem *pPlugAfter); // Default destructor. ~qjackctlPlugItem(); // Instance accessors. const QString& socketName() const; const QString& plugName() const; // Patchbay socket item accessor. qjackctlSocketItem *socket() const; private: // Instance variables. qjackctlSocketItem *m_pSocket; QString m_sPlugName; }; // Patchbay socket (client) list item. class qjackctlSocketItem : public QTreeWidgetItem { public: // Constructor. qjackctlSocketItem(qjackctlSocketList *pSocketList, const QString& sSocketName, const QString& sClientName, int iSocketType,qjackctlSocketItem *pSocketAfter); // Default destructor. ~qjackctlSocketItem(); // Instance accessors. const QString& socketName() const; const QString& clientName() const; int socketType() const; bool isExclusive() const; const QString& forward() const; void setSocketName (const QString& sSocketName); void setClientName (const QString& sClientName); void setSocketType (int iSocketType); void setExclusive (bool bExclusive); void setForward (const QString& sSocketForward); // Socket flags accessor. bool isReadable() const; // Connected plug list primitives. void addConnect(qjackctlSocketItem *pSocket); void removeConnect(qjackctlSocketItem *pSocket); // Connected plug finders. qjackctlSocketItem *findConnectPtr(qjackctlSocketItem *pSocketPtr); // Connection list accessor. const QList& connects() const; // Plug list primitive methods. void addPlug(qjackctlPlugItem *pPlug); void removePlug(qjackctlPlugItem *pPlug); // Plug finder. qjackctlPlugItem *findPlug(const QString& sPlugName); // Plug list accessor. QList& plugs(); // Plug list cleaner. void clear(); // Retrieve a context pixmap. const QPixmap& pixmap(int iPixmap) const; // Update pixmap to its proper context. void updatePixmap(); // Client item openness status. void setOpen(bool bOpen); bool isOpen() const; private: // Instance variables. qjackctlSocketList *m_pSocketList; QString m_sSocketName; QString m_sClientName; int m_iSocketType; bool m_bExclusive; QString m_sSocketForward; // Plug (port) list. QList m_plugs; // Connection cache list. QList m_connects; }; // Patchbay socket (client) list. class qjackctlSocketList : public QObject { Q_OBJECT public: // Constructor. qjackctlSocketList(qjackctlSocketListView *pListView, bool bReadable); // Default destructor. ~qjackctlSocketList(); // Socket list primitive methods. void addSocket(qjackctlSocketItem *pSocket); void removeSocket(qjackctlSocketItem *pSocket); // Socket finder. qjackctlSocketItem *findSocket(const QString& sSocketName, int iSocketType); // List view accessor. qjackctlSocketListView *listView() const; // Socket flags accessor. bool isReadable() const; // Socket aesthetics accessors. const QString& socketCaption() const; // Socket list cleaner. void clear(); // Socket list accessor. QList& sockets(); // Find the current selected socket item in list. qjackctlSocketItem *selectedSocketItem() const; // Retrieve a context pixmap. const QPixmap& pixmap(int iPixmap) const; public slots: // Socket item interactivity methods. bool addSocketItem(); bool removeSocketItem(); bool editSocketItem(); bool copySocketItem(); bool exclusiveSocketItem(); bool moveUpSocketItem(); bool moveDownSocketItem(); private: // Merge two pixmaps with union of respective masks. QPixmap *createPixmapMerge(const QPixmap& xpmDst, const QPixmap& xpmSrc); // Instance variables. qjackctlSocketListView *m_pListView; bool m_bReadable; QString m_sSocketCaption; QPixmap *m_apPixmaps[QJACKCTL_XPM_PIXMAPS]; QList m_sockets; }; //---------------------------------------------------------------------------- // qjackctlSocketListView -- Socket list view, supporting drag-n-drop. class qjackctlSocketListView : public QTreeWidget { Q_OBJECT public: // Constructor. qjackctlSocketListView(qjackctlPatchbayView *pPatchbayView, bool bReadable); // Default destructor. ~qjackctlSocketListView(); // Patchbay dirty flag accessors. void setDirty (bool bDirty); bool dirty() const; // Auto-open timer methods. void setAutoOpenTimeout(int iAutoOpenTimeout); int autoOpenTimeout() const; protected slots: // Auto-open timeout slot. void timeoutSlot(); protected: // Trap for help/tool-tip events. bool eventFilter(QObject *pObject, QEvent *pEvent); // Drag-n-drop stuff. QTreeWidgetItem *dragDropItem(const QPoint& pos); // Drag-n-drop stuff -- reimplemented virtual methods. void dragEnterEvent(QDragEnterEvent *pDragEnterEvent); void dragMoveEvent(QDragMoveEvent *pDragMoveEvent); void dragLeaveEvent(QDragLeaveEvent *); void dropEvent(QDropEvent *pDropEvent); // Handle mouse events for drag-and-drop stuff. void mousePressEvent(QMouseEvent *pMouseEvent); void mouseMoveEvent(QMouseEvent *pMouseEvent); // Context menu request event handler. void contextMenuEvent(QContextMenuEvent *); private: // Bindings. qjackctlPatchbayView *m_pPatchbayView; bool m_bReadable; // Auto-open timer. int m_iAutoOpenTimeout; QTimer *m_pAutoOpenTimer; // Items we'll eventually drop something. QTreeWidgetItem *m_pDragItem; QTreeWidgetItem *m_pDropItem; // The point from where drag started. QPoint m_posDrag; }; //---------------------------------------------------------------------------- // qjackctlPatchworkView -- Socket plugging connector widget. class qjackctlPatchworkView : public QWidget { Q_OBJECT public: // Constructor. qjackctlPatchworkView(qjackctlPatchbayView *pPatchbayView); // Default destructor. ~qjackctlPatchworkView(); protected slots: // Useful slots (should this be protected?). void contentsChanged(); protected: // Draw visible port connection relation arrows. void paintEvent(QPaintEvent *); // Context menu request event handler. void contextMenuEvent(QContextMenuEvent *); private: // Legal socket item position helper. int itemY(QTreeWidgetItem *pItem) const; // Drawing methods. void drawForwardLine(QPainter *pPainter, int x, int dx, int y1, int y2, int h); void drawConnectionLine(QPainter *pPainter, int x1, int y1, int x2, int y2, int h1, int h2); // Local instance variables. qjackctlPatchbayView *m_pPatchbayView; }; //---------------------------------------------------------------------------- // qjackctlPatchbayView -- Patchbay integrated widget. class qjackctlPatchbayView : public QSplitter { Q_OBJECT public: // Constructor. qjackctlPatchbayView(QWidget *pParent = 0); // Default destructor. ~qjackctlPatchbayView(); // Widget accesors. qjackctlSocketListView *OListView() { return m_pOListView; } qjackctlSocketListView *IListView() { return m_pIListView; } qjackctlPatchworkView *PatchworkView() { return m_pPatchworkView; } // Patchbay object binding methods. void setBinding(qjackctlPatchbay *pPatchbay); qjackctlPatchbay *binding() const; // Socket list accessors. qjackctlSocketList *OSocketList() const; qjackctlSocketList *ISocketList() const; // Patchwork line style accessors. void setBezierLines(bool bBezierLines); bool isBezierLines() const; // Patchbay dirty flag accessors. void setDirty (bool bDirty); bool dirty() const; signals: // Contents change signal. void contentsChanged(); public slots: // Common context menu slots. void contextMenu(const QPoint& pos, qjackctlSocketList *pSocketList); void activateForwardMenu(QAction *); private: // Child controls. qjackctlSocketListView *m_pOListView; qjackctlSocketListView *m_pIListView; qjackctlPatchworkView *m_pPatchworkView; // The main binding object. qjackctlPatchbay *m_pPatchbay; // How we'll draw patchwork lines. bool m_bBezierLines; // The obnoxious dirty flag. bool m_bDirty; }; //---------------------------------------------------------------------------- // qjackctlPatchbay -- Patchbay integrated object. class qjackctlPatchbay : public QObject { Q_OBJECT public: // Constructor. qjackctlPatchbay(qjackctlPatchbayView *pPatchbayView); // Default destructor. ~qjackctlPatchbay(); // Explicit connection tests. bool canConnectSelected(); bool canDisconnectSelected(); bool canDisconnectAll(); // Socket list accessors. qjackctlSocketList *OSocketList() const; qjackctlSocketList *ISocketList() const; // External rack transfer methods. void loadRack(qjackctlPatchbayRack *pPatchbayRack); void saveRack(qjackctlPatchbayRack *pPatchbayRack); public slots: // Complete contents refreshner. void refresh(); // Explicit connection slots. bool connectSelected(); bool disconnectSelected(); bool disconnectAll(); // Expand all socket items. void expandAll(); // Complete patchbay clearer. void clear(); // Do actual and complete connections snapshot. void connectionsSnapshot(); private: // Internal rack transfer methods. void loadRackSockets (qjackctlSocketList *pSocketList, QList& socketlist); void saveRackSockets (qjackctlSocketList *pSocketList, QList& socketlist); // Connect/Disconnection primitives. void connectSockets(qjackctlSocketItem *pOSocket, qjackctlSocketItem *pISocket); void disconnectSockets(qjackctlSocketItem *pOSocket, qjackctlSocketItem *pISocket); // Instance variables. qjackctlPatchbayView *m_pPatchbayView; qjackctlSocketList *m_pOSocketList; qjackctlSocketList *m_pISocketList; }; #endif // __qjackctlPatchbay_h // end of qjackctlPatchbay.h qjackctl-0.4.2/src/PaxHeaders.14935/qjackctlAboutForm.h0000644000000000000000000000013212700760152017426 xustar0030 mtime=1459871850.616906788 30 atime=1459871850.616906788 30 ctime=1459871850.616906788 qjackctl-0.4.2/src/qjackctlAboutForm.h0000644000175000001440000000302512700760152020172 0ustar00rncbcusers00000000000000// qjackctlAboutForm.h // /**************************************************************************** Copyright (C) 2003-2013, rncbc aka Rui Nuno Capela. All rights reserved. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. *****************************************************************************/ #ifndef __qjackctlAboutForm_h #define __qjackctlAboutForm_h #include "ui_qjackctlAboutForm.h" //---------------------------------------------------------------------------- // qjackctlAboutForm -- UI wrapper form. class qjackctlAboutForm : public QDialog { Q_OBJECT public: // Constructor. qjackctlAboutForm(QWidget *pParent = 0, Qt::WindowFlags wflags = 0); // Destructor. ~qjackctlAboutForm(); public slots: void aboutQt(); private: // The Qt-designer UI struct... Ui::qjackctlAboutForm m_ui; }; #endif // __qjackctlAboutForm_h // end of qjackctlAboutForm.h qjackctl-0.4.2/src/PaxHeaders.14935/qjackctlMainForm.h0000644000000000000000000000013212700760152017240 xustar0030 mtime=1459871850.619908288 30 atime=1459871850.619908288 30 ctime=1459871850.619908288 qjackctl-0.4.2/src/qjackctlMainForm.h0000644000175000001440000002031012700760152020000 0ustar00rncbcusers00000000000000// qjackctlMainForm.h // /**************************************************************************** Copyright (C) 2003-2015, rncbc aka Rui Nuno Capela. All rights reserved. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. *****************************************************************************/ #ifndef __qjackctlMainForm_h #define __qjackctlMainForm_h #include "ui_qjackctlMainForm.h" #include "qjackctlSetup.h" #include #include #include #include #ifdef CONFIG_ALSA_SEQ #include #else typedef void snd_seq_t; #endif // Forward declarations. class qjackctlSetup; class qjackctlSetupForm; class qjackctlMessagesStatusForm; class qjackctlSessionForm; class qjackctlConnectionsForm; class qjackctlPatchbayForm; class qjackctlPatchbayRack; class qjackctlPortItem; #ifdef CONFIG_SYSTEM_TRAY class qjackctlSystemTray; #endif class QSocketNotifier; class QSessionManager; #ifdef CONFIG_DBUS class QDBusInterface; class qjackctlDBusLogWatcher; #endif //---------------------------------------------------------------------------- // qjackctlMainForm -- UI wrapper form. class qjackctlMainForm : public QWidget { Q_OBJECT public: // Constructor. qjackctlMainForm(QWidget *pParent = 0, Qt::WindowFlags wflags = 0); // Destructor. ~qjackctlMainForm(); static qjackctlMainForm *getInstance(); bool setup(qjackctlSetup * pSetup); jack_client_t *jackClient() const; snd_seq_t *alsaSeq() const; void appendMessages(const QString& s); bool isActivePatchbay(const QString& sPatchbayPath) const; void updateActivePatchbay(); void setActivePatchbay(const QString& sPatchbayPath); void setRecentPatchbays(const QStringList& patchbays); void stabilizeForm(); void stabilize(int msecs); void refreshXrunStats(); void refreshJackConnections(); void refreshAlsaConnections(); void refreshPatchbay(); void queryDisconnect( qjackctlPortItem *pOPort, qjackctlPortItem *pIPort, int iSocketType); void updateMessagesFont(); void updateMessagesLimit(); void updateMessagesLogging(); void updateConnectionsFont(); void updateConnectionsIconSize(); void updateJackClientPortAlias(); void updateJackClientPortMetadata(); void updateBezierLines(); void updateDisplayEffect(); void updateTimeDisplayFonts(); void updateTimeDisplayToolTips(); void updateTimeFormat(); void updateAliases(); void updateButtons(); #ifdef CONFIG_SYSTEM_TRAY void updateSystemTray(); #endif void showDirtySettingsWarning(); void showDirtySetupWarning(); public slots: void startJack(); void stopJack(); void toggleJack(); void resetXrunStats(); void commitData(QSessionManager& sm); protected slots: void readStdout(); void jackStarted(); void jackError(QProcess::ProcessError); void jackFinished(); void jackCleanup(); void jackStabilize(); void stdoutNotifySlot(int); void alsaNotifySlot(int); void timerSlot(); void jackConnectChanged(); void alsaConnectChanged(); void cableConnectSlot(const QString&, const QString&, unsigned int); void toggleMainForm(); void toggleMessagesStatusForm(); void toggleMessagesForm(); void toggleStatusForm(); void toggleSessionForm(); void toggleConnectionsForm(); void togglePatchbayForm(); void showSetupForm(); void showAboutForm(); void transportRewind(); void transportBackward(); void transportPlay(bool); void transportStart(); void transportStop(); void transportForward(); void contextMenu(const QPoint&); void activatePresetsMenu(QAction *); void activatePreset(const QString&); void activatePreset(int); void quitMainForm(); protected: bool queryClose(); void closeEvent(QCloseEvent * pCloseEvent); void customEvent(QEvent *pEvent); void appendStdoutBuffer(const QString&); void flushStdoutBuffer(); bool stdoutBlock(int fd, bool bBlock) const; QString formatExitStatus(int iExitStatus) const; void shellExecute(const QString& sShellCommand, const QString& sStartMessage, const QString& sStopMessage); void stopJackServer(); QString& detectXrun(QString& s); void updateXrunStats(float fXrunLast); void appendMessagesColor(const QString& s, const QString& c); void appendMessagesText(const QString& s); void appendMessagesError(const QString& s); void updateXrunCount(); QString formatTime(float secs) const; QString formatElapsedTime(int iStatusItem, const QTime& t, bool bElapsed) const; void updateElapsedTimes(); void portNotifyEvent(); void xrunNotifyEvent(); void buffNotifyEvent(); void shutNotifyEvent(); void exitNotifyEvent(); #ifdef CONFIG_JACK_METADATA void propNotifyEvent(); #endif void startJackClientDelay(); bool startJackClient(bool bDetach); void stopJackClient(); void refreshConnections(); void refreshStatus(); void updateStatusItem(int iStatusItem, const QString& sText); void updateTitleStatus(); void updateServerState(int iState); void contextMenuEvent(QContextMenuEvent *); void mousePressEvent(QMouseEvent *pMouseEvent); #ifdef CONFIG_DBUS // D-BUS: Set/reset parameter values // from current selected preset options. void setDBusParameters(); // D-BUS: Set parameter values (with reset option). bool setDBusEngineParameter( const QString& param, const QVariant& value, bool bSet = true); bool setDBusDriverParameter( const QString& param, const QVariant& value, bool bSet = true); bool setDBusParameter( const QStringList& path, const QVariant& value, bool bSet = true); // D-BUS: Reset parameter (to default) values. bool resetDBusEngineParameter(const QString& param); bool resetDBusDriverParameter(const QString& param); bool resetDBusParameter(const QStringList& path); // D-BUS: Set parameter values. QVariant getDBusEngineParameter(const QString& param); QVariant getDBusDriverParameter(const QString& param); QVariant getDBusParameter(const QStringList& path); #endif // Quotes string with embedded whitespace. QString formatQuoted(const QString& s) const; // Guarded transport play/pause toggle. void transportPlayStatus(bool bOn); private: // The Qt-designer UI struct... Ui::qjackctlMainForm m_ui; // Instance variables. qjackctlSetup *m_pSetup; QProcess *m_pJack; int m_iServerState; jack_client_t *m_pJackClient; bool m_bJackDetach; bool m_bJackShutdown; bool m_bJackStopped; snd_seq_t *m_pAlsaSeq; #ifdef CONFIG_DBUS QDBusInterface *m_pDBusControl; QDBusInterface *m_pDBusConfig; qjackctlDBusLogWatcher *m_pDBusLogWatcher; bool m_bDBusStarted; #endif int m_iStartDelay; int m_iTimerDelay; int m_iTimerRefresh; int m_iJackRefresh; int m_iAlsaRefresh; int m_iJackDirty; int m_iAlsaDirty; int m_iStatusBlink; int m_iStatusRefresh; int m_iPatchbayRefresh; #ifdef CONFIG_JACK_METADATA int m_iJackPropertyChange; #endif QSocketNotifier *m_pStdoutNotifier; QSocketNotifier *m_pAlsaNotifier; int m_iXrunCallbacks; int m_iXrunSkips; int m_iXrunStats; int m_iXrunCount; float m_fXrunTotal; float m_fXrunMax; float m_fXrunMin; float m_fXrunLast; QTime m_tXrunLast; QTime m_tResetLast; qjackctlMessagesStatusForm *m_pMessagesStatusForm; qjackctlSessionForm *m_pSessionForm; qjackctlConnectionsForm *m_pConnectionsForm; qjackctlPatchbayForm *m_pPatchbayForm; qjackctlSetupForm *m_pSetupForm; qjackctlPatchbayRack *m_pPatchbayRack; qjackctlPreset m_preset; QString m_sStdoutBuffer; QString m_sTimeDashes; QString m_sJackCmdLine; #ifdef CONFIG_SYSTEM_TRAY qjackctlSystemTray *m_pSystemTray; bool m_bQuitClose; #endif bool m_bQuitForce; float m_fSkipAccel; int m_iTransportPlay; // Kind-of singleton reference. static qjackctlMainForm *g_pMainForm; }; #endif // __qjackctlMainForm_h // end of qjackctlMainForm.h qjackctl-0.4.2/src/PaxHeaders.14935/qjackctl.qrc0000644000000000000000000000013212700760152016145 xustar0030 mtime=1459871850.616906788 30 atime=1459871850.616906788 30 ctime=1459871850.616906788 qjackctl-0.4.2/src/qjackctl.qrc0000644000175000001440000000776112700760152016724 0ustar00rncbcusers00000000000000 images/qjackctl.png images/about1.png images/accept1.png images/aclienti.png images/aclienti_32x32.png images/aclienti_64x64.png images/acliento.png images/acliento_32x32.png images/acliento_64x64.png images/add1.png images/aportlni.png images/aportlni_32x32.png images/aportlni_64x64.png images/aportlno.png images/aportlno_32x32.png images/aportlno_64x64.png images/aportlti.png images/aportlti_32x32.png images/aportlti_64x64.png images/aportlto.png images/aportlto_32x32.png images/aportlto_64x64.png images/aportpni.png images/aportpni_32x32.png images/aportpni_64x64.png images/aportpno.png images/aportpno_32x32.png images/aportpno_64x64.png images/aportpti.png images/aportpti_32x32.png images/aportpti_64x64.png images/aportpto.png images/aportpto_32x32.png images/aportpto_64x64.png images/apply1.png images/asocketi.png images/asocketo.png images/backward1.png images/client1.png images/connect1.png images/connections1.png images/copy1.png images/device1.png images/disconnect1.png images/disconnectall1.png images/displaybg1.png images/down1.png images/edit1.png images/expandall1.png images/forward1.png images/error1.png images/mclienti.png images/mclienti_32x32.png images/mclienti_64x64.png images/mcliento.png images/mcliento_32x32.png images/mcliento_64x64.png images/messages1.png images/messagesstatus1.png images/mporti.png images/mporti_32x32.png images/mporti_64x64.png images/mporto.png images/mporto_32x32.png images/mporto_64x64.png images/msocketi.png images/msocketo.png images/new1.png images/open1.png images/patchbay1.png images/pause1.png images/play1.png images/port1.png images/quit1.png images/refresh1.png images/remove1.png images/reset1.png images/rewind1.png images/save1.png images/session1.png images/setup1.png images/socket1.png images/start1.png images/status1.png images/stop1.png images/up1.png images/xactivating1.png images/xactive1.png images/xinactive1.png images/xsocket1.png images/xstarted1.png images/xstarting1.png images/xstopped1.png images/xstopping1.png images/qtlogo.png qjackctl-0.4.2/src/PaxHeaders.14935/qjackctlPatchbay.cpp0000644000000000000000000000013212700760152017616 xustar0030 mtime=1459871850.621909288 30 atime=1459871850.621909288 30 ctime=1459871850.621909288 qjackctl-0.4.2/src/qjackctlPatchbay.cpp0000644000175000001440000014657712700760152020406 0ustar00rncbcusers00000000000000// qjackctlPatchbay.cpp // /**************************************************************************** Copyright (C) 2003-2015, rncbc aka Rui Nuno Capela. All rights reserved. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. *****************************************************************************/ #include "qjackctlPatchbay.h" #include "qjackctlMainForm.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #if QT_VERSION >= 0x050000 #include #include #endif // Interactivity socket form. #include "qjackctlSocketForm.h" // External patchbay loader. #include "qjackctlPatchbayFile.h" //---------------------------------------------------------------------- // class qjackctlPlugItem -- Socket plug list item. // // Constructor. qjackctlPlugItem::qjackctlPlugItem ( qjackctlSocketItem *pSocket, const QString& sPlugName, qjackctlPlugItem *pPlugAfter ) : QTreeWidgetItem(pSocket, pPlugAfter, QJACKCTL_PLUGITEM) { QTreeWidgetItem::setText(0, sPlugName); m_pSocket = pSocket; m_sPlugName = sPlugName; m_pSocket->plugs().append(this); int iPixmap; if (pSocket->socketType() == QJACKCTL_SOCKETTYPE_JACK_AUDIO) iPixmap = QJACKCTL_XPM_AUDIO_PLUG; else iPixmap = QJACKCTL_XPM_MIDI_PLUG; QTreeWidgetItem::setIcon(0, QIcon(pSocket->pixmap(iPixmap))); QTreeWidgetItem::setFlags(QTreeWidgetItem::flags() & ~Qt::ItemIsSelectable); } // Default destructor. qjackctlPlugItem::~qjackctlPlugItem (void) { int iPlug = m_pSocket->plugs().indexOf(this); if (iPlug >= 0) m_pSocket->plugs().removeAt(iPlug); } // Instance accessors. const QString& qjackctlPlugItem::socketName (void) const { return m_pSocket->socketName(); } const QString& qjackctlPlugItem::plugName (void) const { return m_sPlugName; } // Patchbay socket item accessor. qjackctlSocketItem *qjackctlPlugItem::socket (void) const { return m_pSocket; } //---------------------------------------------------------------------- // class qjackctlSocketItem -- Jack client list item. // // Constructor. qjackctlSocketItem::qjackctlSocketItem ( qjackctlSocketList *pSocketList, const QString& sSocketName, const QString& sClientName, int iSocketType, qjackctlSocketItem *pSocketAfter ) : QTreeWidgetItem(pSocketList->listView(), pSocketAfter, QJACKCTL_SOCKETITEM) { QTreeWidgetItem::setText(0, sSocketName); m_pSocketList = pSocketList; m_sSocketName = sSocketName; m_sClientName = sClientName; m_iSocketType = iSocketType; m_bExclusive = false; m_sSocketForward.clear(); m_pSocketList->sockets().append(this); updatePixmap(); } // Default destructor. qjackctlSocketItem::~qjackctlSocketItem (void) { QListIterator iter(m_connects); while (iter.hasNext()) (iter.next())->removeConnect(this); m_connects.clear(); m_plugs.clear(); int iSocket = m_pSocketList->sockets().indexOf(this); if (iSocket >= 0) m_pSocketList->sockets().removeAt(iSocket); } // Instance accessors. const QString& qjackctlSocketItem::socketName (void) const { return m_sSocketName; } const QString& qjackctlSocketItem::clientName (void) const { return m_sClientName; } int qjackctlSocketItem::socketType (void) const { return m_iSocketType; } bool qjackctlSocketItem::isExclusive (void) const { return m_bExclusive; } const QString& qjackctlSocketItem::forward (void) const { return m_sSocketForward; } void qjackctlSocketItem::setSocketName ( const QString& sSocketName ) { m_sSocketName = sSocketName; } void qjackctlSocketItem::setClientName ( const QString& sClientName ) { m_sClientName = sClientName; } void qjackctlSocketItem::setSocketType ( int iSocketType ) { m_iSocketType = iSocketType; } void qjackctlSocketItem::setExclusive ( bool bExclusive ) { m_bExclusive = bExclusive; } void qjackctlSocketItem::setForward ( const QString& sSocketForward ) { m_sSocketForward = sSocketForward; } // Socket flags accessor. bool qjackctlSocketItem::isReadable (void) const { return m_pSocketList->isReadable(); } // Plug finder. qjackctlPlugItem *qjackctlSocketItem::findPlug ( const QString& sPlugName ) { QListIterator iter(m_plugs); while (iter.hasNext()) { qjackctlPlugItem *pPlug = iter.next(); if (sPlugName == pPlug->plugName()) return pPlug; } return NULL; } // Plug list accessor. QList& qjackctlSocketItem::plugs (void) { return m_plugs; } // Connected socket list primitives. void qjackctlSocketItem::addConnect( qjackctlSocketItem *pSocket ) { m_connects.append(pSocket); } void qjackctlSocketItem::removeConnect( qjackctlSocketItem *pSocket ) { int iSocket = m_connects.indexOf(pSocket); if (iSocket >= 0) m_connects.removeAt(iSocket); } // Connected socket finder. qjackctlSocketItem *qjackctlSocketItem::findConnectPtr ( qjackctlSocketItem *pSocketPtr ) { QListIterator iter(m_connects); while (iter.hasNext()) { qjackctlSocketItem *pSocket = iter.next(); if (pSocketPtr == pSocket) return pSocket; } return NULL; } // Connection cache list accessor. const QList& qjackctlSocketItem::connects (void) const { return m_connects; } // Plug list cleaner. void qjackctlSocketItem::clear (void) { qDeleteAll(m_plugs); m_plugs.clear(); } // Socket item pixmap peeker. const QPixmap& qjackctlSocketItem::pixmap ( int iPixmap ) const { return m_pSocketList->pixmap(iPixmap); } // Update pixmap to its proper context. void qjackctlSocketItem::updatePixmap (void) { int iPixmap; if (m_iSocketType == QJACKCTL_SOCKETTYPE_JACK_AUDIO) { iPixmap = (m_bExclusive ? QJACKCTL_XPM_AUDIO_SOCKET_X : QJACKCTL_XPM_AUDIO_SOCKET); } else { iPixmap = (m_bExclusive ? QJACKCTL_XPM_MIDI_SOCKET_X : QJACKCTL_XPM_MIDI_SOCKET); } QTreeWidgetItem::setIcon(0, QIcon(pixmap(iPixmap))); } // Socket item openness status. void qjackctlSocketItem::setOpen ( bool bOpen ) { QTreeWidgetItem::setExpanded(bOpen); } bool qjackctlSocketItem::isOpen (void) const { return QTreeWidgetItem::isExpanded(); } //---------------------------------------------------------------------- // qjackctlSocketList -- Jack client list. // // Constructor. qjackctlSocketList::qjackctlSocketList ( qjackctlSocketListView *pListView, bool bReadable ) { QPixmap pmXSocket1(":/images/xsocket1.png"); m_pListView = pListView; m_bReadable = bReadable; if (bReadable) { m_sSocketCaption = tr("Output"); m_apPixmaps[QJACKCTL_XPM_AUDIO_SOCKET] = new QPixmap(":/images/asocketo.png"); m_apPixmaps[QJACKCTL_XPM_AUDIO_SOCKET_X] = createPixmapMerge(*m_apPixmaps[QJACKCTL_XPM_AUDIO_SOCKET], pmXSocket1); m_apPixmaps[QJACKCTL_XPM_AUDIO_CLIENT] = new QPixmap(":/images/acliento.png"); m_apPixmaps[QJACKCTL_XPM_AUDIO_PLUG] = new QPixmap(":/images/aportlno.png"); m_apPixmaps[QJACKCTL_XPM_MIDI_SOCKET] = new QPixmap(":/images/msocketo.png"); m_apPixmaps[QJACKCTL_XPM_MIDI_SOCKET_X] = createPixmapMerge(*m_apPixmaps[QJACKCTL_XPM_MIDI_SOCKET], pmXSocket1); m_apPixmaps[QJACKCTL_XPM_MIDI_CLIENT] = new QPixmap(":/images/mcliento.png"); m_apPixmaps[QJACKCTL_XPM_MIDI_PLUG] = new QPixmap(":/images/mporto.png"); } else { m_sSocketCaption = tr("Input"); m_apPixmaps[QJACKCTL_XPM_AUDIO_SOCKET] = new QPixmap(":/images/asocketi.png"); m_apPixmaps[QJACKCTL_XPM_AUDIO_SOCKET_X] = createPixmapMerge(*m_apPixmaps[QJACKCTL_XPM_AUDIO_SOCKET], pmXSocket1); m_apPixmaps[QJACKCTL_XPM_AUDIO_CLIENT] = new QPixmap(":/images/aclienti.png"); m_apPixmaps[QJACKCTL_XPM_AUDIO_PLUG] = new QPixmap(":/images/aportlni.png"); m_apPixmaps[QJACKCTL_XPM_MIDI_SOCKET] = new QPixmap(":/images/msocketi.png"); m_apPixmaps[QJACKCTL_XPM_MIDI_SOCKET_X] = createPixmapMerge(*m_apPixmaps[QJACKCTL_XPM_MIDI_SOCKET], pmXSocket1); m_apPixmaps[QJACKCTL_XPM_MIDI_CLIENT] = new QPixmap(":/images/mclienti.png"); m_apPixmaps[QJACKCTL_XPM_MIDI_PLUG] = new QPixmap(":/images/mporti.png"); } if (!m_sSocketCaption.isEmpty()) m_sSocketCaption += ' '; m_sSocketCaption += tr("Socket"); } // Default destructor. qjackctlSocketList::~qjackctlSocketList (void) { clear(); for (int iPixmap = 0; iPixmap < QJACKCTL_XPM_PIXMAPS; iPixmap++) delete m_apPixmaps[iPixmap]; } // Client finder. qjackctlSocketItem *qjackctlSocketList::findSocket ( const QString& sSocketName, int iSocketType ) { QListIterator iter(m_sockets); while (iter.hasNext()) { qjackctlSocketItem *pSocket = iter.next(); if (sSocketName == pSocket->socketName() && iSocketType == pSocket->socketType()) return pSocket; } return NULL; } // Socket list accessor. QList& qjackctlSocketList::sockets (void) { return m_sockets; } // List view accessor. qjackctlSocketListView *qjackctlSocketList::listView (void) const { return m_pListView; } // Socket flags accessor. bool qjackctlSocketList::isReadable (void) const { return m_bReadable; } // Socket caption titler. const QString& qjackctlSocketList::socketCaption (void) const { return m_sSocketCaption; } // Socket list cleaner. void qjackctlSocketList::clear (void) { qDeleteAll(m_sockets); m_sockets.clear(); } // Socket list pixmap peeker. const QPixmap& qjackctlSocketList::pixmap ( int iPixmap ) const { return *m_apPixmaps[iPixmap]; } // Merge two pixmaps with union of respective masks. QPixmap *qjackctlSocketList::createPixmapMerge ( const QPixmap& xpmDst, const QPixmap& xpmSrc ) { QPixmap *pXpmMerge = new QPixmap(xpmDst); if (pXpmMerge) { QBitmap bmMask = xpmDst.mask(); QPainter(&bmMask).drawPixmap(0, 0, xpmSrc.mask()); pXpmMerge->setMask(bmMask); QPainter(pXpmMerge).drawPixmap(0, 0, xpmSrc); } return pXpmMerge; } // Return currently selected socket item. qjackctlSocketItem *qjackctlSocketList::selectedSocketItem (void) const { qjackctlSocketItem *pSocketItem = NULL; QTreeWidgetItem *pItem = m_pListView->currentItem(); if (pItem) { if (pItem->type() == QJACKCTL_PLUGITEM) { pSocketItem = static_cast (pItem->parent()); } else { pSocketItem = static_cast (pItem); } } return pSocketItem; } // Add a new socket item, using interactive form. bool qjackctlSocketList::addSocketItem (void) { bool bResult = false; qjackctlSocketForm socketForm(m_pListView); socketForm.setWindowTitle(tr(" - %1").arg(m_sSocketCaption)); socketForm.setSocketCaption(m_sSocketCaption); socketForm.setPixmaps(m_apPixmaps); socketForm.setSocketList(this); socketForm.setSocketNew(true); qjackctlPatchbaySocket socket(m_sSocketCaption + ' ' + QString::number(m_sockets.count() + 1), QString::null, QJACKCTL_SOCKETTYPE_JACK_AUDIO); socketForm.load(&socket); if (socketForm.exec()) { socketForm.save(&socket); qjackctlSocketItem *pSocketItem = selectedSocketItem(); // m_pListView->setUpdatesEnabled(false); if (pSocketItem) pSocketItem->setSelected(false); pSocketItem = new qjackctlSocketItem(this, socket.name(), socket.clientName(), socket.type(), pSocketItem); if (pSocketItem) { pSocketItem->setExclusive(socket.isExclusive()); pSocketItem->setForward(socket.forward()); qjackctlPlugItem *pPlugItem = NULL; QStringListIterator iter(socket.pluglist()); while (iter.hasNext()) { pPlugItem = new qjackctlPlugItem( pSocketItem, iter.next(), pPlugItem); } bResult = true; } pSocketItem->setSelected(true); m_pListView->setCurrentItem(pSocketItem); // m_pListView->setUpdatesEnabled(true); // m_pListView->update(); m_pListView->setDirty(true); } return bResult; } // Remove (delete) currently selected socket item. bool qjackctlSocketList::removeSocketItem (void) { bool bResult = false; qjackctlSocketItem *pSocketItem = selectedSocketItem(); if (pSocketItem) { if (QMessageBox::warning(m_pListView, tr("Warning") + " - " QJACKCTL_SUBTITLE1, tr("%1 about to be removed:\n\n" "\"%2\"\n\nAre you sure?") .arg(m_sSocketCaption) .arg(pSocketItem->socketName()), QMessageBox::Yes | QMessageBox::No) == QMessageBox::Yes) { delete pSocketItem; bResult = true; m_pListView->setDirty(true); } } return bResult; } // View or change the properties of currently selected socket item. bool qjackctlSocketList::editSocketItem (void) { bool bResult = false; qjackctlSocketItem *pSocketItem = selectedSocketItem(); if (pSocketItem) { qjackctlSocketForm socketForm(m_pListView); socketForm.setWindowTitle(pSocketItem->socketName() + " - " + m_sSocketCaption); socketForm.setSocketCaption(m_sSocketCaption); socketForm.setPixmaps(m_apPixmaps); socketForm.setSocketList(this); socketForm.setSocketNew(false); qjackctlPatchbaySocket socket(pSocketItem->socketName(), pSocketItem->clientName(), pSocketItem->socketType()); socket.setExclusive(pSocketItem->isExclusive()); socket.setForward(pSocketItem->forward()); QListIterator iter(pSocketItem->plugs()); while (iter.hasNext()) socket.pluglist().append((iter.next())->plugName()); socketForm.load(&socket); socketForm.setConnectCount(pSocketItem->connects().count()); if (socketForm.exec()) { socketForm.save(&socket); // m_pListView->setUpdatesEnabled(false); pSocketItem->clear(); pSocketItem->setText(0, socket.name()); pSocketItem->setSocketName(socket.name()); pSocketItem->setClientName(socket.clientName()); pSocketItem->setSocketType(socket.type()); pSocketItem->setExclusive(socket.isExclusive()); pSocketItem->setForward(socket.forward()); pSocketItem->updatePixmap(); qjackctlPlugItem *pPlugItem = NULL; QStringListIterator iter(socket.pluglist()); while (iter.hasNext()) { pPlugItem = new qjackctlPlugItem( pSocketItem, iter.next(), pPlugItem); } pSocketItem->setSelected(true); m_pListView->setCurrentItem(pSocketItem); // m_pListView->setUpdatesEnabled(true); // m_pListView->triggerUpdate(); m_pListView->setDirty(true); bResult = true; } } return bResult; } // Duplicate and change the properties of currently selected socket item. bool qjackctlSocketList::copySocketItem (void) { bool bResult = false; qjackctlSocketItem *pSocketItem = selectedSocketItem(); if (pSocketItem) { qjackctlSocketForm socketForm(m_pListView); // Find a new distinguishable socket name, please. int iSocketNo = 1; QString sSocketName = pSocketItem->socketName();; QString sSocketMask = sSocketName; sSocketMask.remove(QRegExp("[ |0-9]+$")).append(" %1"); const int iSocketType = pSocketItem->socketType(); do { sSocketName = sSocketMask.arg(++iSocketNo); } while (findSocket(sSocketName, iSocketType)); // Show up as a new socket... socketForm.setWindowTitle(tr("%1 - %2") .arg(pSocketItem->socketName()).arg(m_sSocketCaption)); socketForm.setSocketCaption(m_sSocketCaption); socketForm.setPixmaps(m_apPixmaps); socketForm.setSocketList(this); socketForm.setSocketNew(true); qjackctlPatchbaySocket socket(sSocketName, pSocketItem->clientName(), iSocketType); if (pSocketItem->isExclusive()) socket.setExclusive(true); QListIterator iter(pSocketItem->plugs()); while (iter.hasNext()) socket.pluglist().append((iter.next())->plugName()); socketForm.load(&socket); if (socketForm.exec()) { socketForm.save(&socket); pSocketItem = new qjackctlSocketItem(this, socket.name(), socket.clientName(), socket.type(), pSocketItem); if (pSocketItem) { pSocketItem->setExclusive(socket.isExclusive()); pSocketItem->setForward(socket.forward()); qjackctlPlugItem *pPlugItem = NULL; QStringListIterator iter(socket.pluglist()); while (iter.hasNext()) { pPlugItem = new qjackctlPlugItem( pSocketItem, iter.next(), pPlugItem); } bResult = true; } pSocketItem->setSelected(true); m_pListView->setCurrentItem(pSocketItem); // m_pListView->setUpdatesEnabled(true); // m_pListView->triggerUpdate(); m_pListView->setDirty(true); } } return bResult; } // Toggle exclusive currently selected socket item. bool qjackctlSocketList::exclusiveSocketItem (void) { bool bResult = false; qjackctlSocketItem *pSocketItem = selectedSocketItem(); if (pSocketItem) { pSocketItem->setExclusive(!pSocketItem->isExclusive()); pSocketItem->updatePixmap(); bResult = true; m_pListView->setDirty(true); } return bResult; } // Move current selected socket item up one position. bool qjackctlSocketList::moveUpSocketItem (void) { bool bResult = false; qjackctlSocketItem *pSocketItem = selectedSocketItem(); if (pSocketItem) { int iItem = m_pListView->indexOfTopLevelItem(pSocketItem); if (iItem > 0) { QTreeWidgetItem *pItem = m_pListView->takeTopLevelItem(iItem); if (pItem) { m_pListView->insertTopLevelItem(iItem - 1, pItem); pSocketItem->setSelected(true); m_pListView->setCurrentItem(pSocketItem); // m_pListView->setUpdatesEnabled(true); // m_pListView->update(); m_pListView->setDirty(true); bResult = true; } } } return bResult; } // Move current selected socket item down one position. bool qjackctlSocketList::moveDownSocketItem (void) { bool bResult = false; qjackctlSocketItem *pSocketItem = selectedSocketItem(); if (pSocketItem) { int iItem = m_pListView->indexOfTopLevelItem(pSocketItem); int iItemCount = m_pListView->topLevelItemCount(); if (iItem < iItemCount - 1) { QTreeWidgetItem *pItem = m_pListView->takeTopLevelItem(iItem); if (pItem) { m_pListView->insertTopLevelItem(iItem + 1, pItem); pSocketItem->setSelected(true); m_pListView->setCurrentItem(pSocketItem); // m_pListView->setUpdatesEnabled(true); // m_pListView->update(); m_pListView->setDirty(true); bResult = true; } } } return bResult; } //---------------------------------------------------------------------------- // qjackctlSocketListView -- Socket list view, supporting drag-n-drop. // Constructor. qjackctlSocketListView::qjackctlSocketListView ( qjackctlPatchbayView *pPatchbayView, bool bReadable ) : QTreeWidget(pPatchbayView) { m_pPatchbayView = pPatchbayView; m_bReadable = bReadable; m_pAutoOpenTimer = 0; m_iAutoOpenTimeout = 0; m_pDragItem = NULL; m_pDropItem = NULL; QHeaderView *pHeader = QTreeWidget::header(); // pHeader->setDefaultAlignment(Qt::AlignLeft); // pHeader->setDefaultSectionSize(120); #if QT_VERSION >= 0x050000 // pHeader->setSectionResizeMode(QHeaderView::Custom); pHeader->setSectionsMovable(false); pHeader->setSectionsClickable(true); #else // pHeader->setResizeMode(QHeaderView::Custom); pHeader->setMovable(false); pHeader->setClickable(true); #endif // pHeader->setSortIndicatorShown(true); pHeader->setStretchLastSection(true); QTreeWidget::setRootIsDecorated(true); QTreeWidget::setUniformRowHeights(true); // QTreeWidget::setDragEnabled(true); QTreeWidget::setAcceptDrops(true); QTreeWidget::setDropIndicatorShown(true); QTreeWidget::setAutoScroll(true); QTreeWidget::setSelectionMode(QAbstractItemView::SingleSelection); QTreeWidget::setSizePolicy( QSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding)); QTreeWidget::setSortingEnabled(false); QTreeWidget::setMinimumWidth(120); QTreeWidget::setColumnCount(1); // Trap for help/tool-tips events. QTreeWidget::viewport()->installEventFilter(this); QString sText; if (m_bReadable) sText = tr("Output Sockets / Plugs"); else sText = tr("Input Sockets / Plugs"); QTreeWidget::headerItem()->setText(0, sText); QTreeWidget::setToolTip(sText); setAutoOpenTimeout(800); } // Default destructor. qjackctlSocketListView::~qjackctlSocketListView (void) { setAutoOpenTimeout(0); } // Patchbay view dirty flag accessors. void qjackctlSocketListView::setDirty ( bool bDirty ) { m_pPatchbayView->setDirty(bDirty); } bool qjackctlSocketListView::dirty (void) const { return m_pPatchbayView->dirty(); } // Auto-open timeout method. void qjackctlSocketListView::setAutoOpenTimeout ( int iAutoOpenTimeout ) { m_iAutoOpenTimeout = iAutoOpenTimeout; if (m_pAutoOpenTimer) delete m_pAutoOpenTimer; m_pAutoOpenTimer = NULL; if (m_iAutoOpenTimeout > 0) { m_pAutoOpenTimer = new QTimer(this); QObject::connect(m_pAutoOpenTimer, SIGNAL(timeout()), SLOT(timeoutSlot())); } } // Auto-open timeout accessor. int qjackctlSocketListView::autoOpenTimeout (void) const { return m_iAutoOpenTimeout; } // Auto-open timer slot. void qjackctlSocketListView::timeoutSlot (void) { if (m_pAutoOpenTimer) { m_pAutoOpenTimer->stop(); if (m_pDropItem && m_pDropItem->type() == QJACKCTL_SOCKETITEM) { qjackctlSocketItem *pSocketItem = static_cast (m_pDropItem); if (pSocketItem && !pSocketItem->isOpen()) pSocketItem->setOpen(true); } } } // Trap for help/tool-tip events. bool qjackctlSocketListView::eventFilter ( QObject *pObject, QEvent *pEvent ) { QWidget *pViewport = QTreeWidget::viewport(); if (static_cast (pObject) == pViewport && pEvent->type() == QEvent::ToolTip) { QHelpEvent *pHelpEvent = static_cast (pEvent); if (pHelpEvent) { QTreeWidgetItem *pItem = QTreeWidget::itemAt(pHelpEvent->pos()); if (pItem && pItem->type() == QJACKCTL_SOCKETITEM) { qjackctlSocketItem *pSocketItem = static_cast (pItem); if (pSocketItem) { QToolTip::showText(pHelpEvent->globalPos(), pSocketItem->clientName(), pViewport); return true; } } else if (pItem && pItem->type() == QJACKCTL_PLUGITEM) { qjackctlPlugItem *pPlugItem = static_cast (pItem); if (pPlugItem) { QToolTip::showText(pHelpEvent->globalPos(), pPlugItem->plugName(), pViewport); return true; } } } } // Not handled here. return QTreeWidget::eventFilter(pObject, pEvent); } // Drag-n-drop stuff. QTreeWidgetItem *qjackctlSocketListView::dragDropItem ( const QPoint& pos ) { QTreeWidgetItem *pItem = QTreeWidget::itemAt(pos); if (pItem) { if (m_pDropItem != pItem) { QTreeWidget::setCurrentItem(pItem); m_pDropItem = pItem; if (m_pAutoOpenTimer) m_pAutoOpenTimer->start(m_iAutoOpenTimeout); qjackctlPatchbay *pPatchbay = m_pPatchbayView->binding(); if ((pItem->flags() & Qt::ItemIsDropEnabled) == 0 || pPatchbay == NULL || !pPatchbay->canConnectSelected()) pItem = NULL; } } else { m_pDropItem = NULL; if (m_pAutoOpenTimer) m_pAutoOpenTimer->stop(); } return pItem; } void qjackctlSocketListView::dragEnterEvent ( QDragEnterEvent *pDragEnterEvent ) { if (pDragEnterEvent->source() != this && pDragEnterEvent->mimeData()->hasText() && dragDropItem(pDragEnterEvent->pos())) { pDragEnterEvent->accept(); } else { pDragEnterEvent->ignore(); } } void qjackctlSocketListView::dragMoveEvent ( QDragMoveEvent *pDragMoveEvent ) { if (pDragMoveEvent->source() != this && pDragMoveEvent->mimeData()->hasText() && dragDropItem(pDragMoveEvent->pos())) { pDragMoveEvent->accept(); } else { pDragMoveEvent->ignore(); } } void qjackctlSocketListView::dragLeaveEvent ( QDragLeaveEvent * ) { m_pDropItem = 0; if (m_pAutoOpenTimer) m_pAutoOpenTimer->stop(); } void qjackctlSocketListView::dropEvent ( QDropEvent *pDropEvent ) { if (pDropEvent->source() != this && pDropEvent->mimeData()->hasText() && dragDropItem(pDropEvent->pos())) { const QString sText = pDropEvent->mimeData()->text(); qjackctlPatchbay *pPatchbay = m_pPatchbayView->binding(); if (!sText.isEmpty() && pPatchbay) pPatchbay->connectSelected(); } dragLeaveEvent(NULL); } // Handle mouse events for drag-and-drop stuff. void qjackctlSocketListView::mousePressEvent ( QMouseEvent *pMouseEvent ) { QTreeWidget::mousePressEvent(pMouseEvent); if (pMouseEvent->button() == Qt::LeftButton) { m_posDrag = pMouseEvent->pos(); m_pDragItem = QTreeWidget::itemAt(m_posDrag); } } void qjackctlSocketListView::mouseMoveEvent ( QMouseEvent *pMouseEvent ) { QTreeWidget::mouseMoveEvent(pMouseEvent); if ((pMouseEvent->buttons() & Qt::LeftButton) && m_pDragItem && ((pMouseEvent->pos() - m_posDrag).manhattanLength() >= QApplication::startDragDistance())) { // We'll start dragging something alright... QMimeData *pMimeData = new QMimeData(); pMimeData->setText(m_pDragItem->text(0)); QDrag *pDrag = new QDrag(this); pDrag->setMimeData(pMimeData); pDrag->setPixmap(m_pDragItem->icon(0).pixmap(16)); pDrag->setHotSpot(QPoint(-4, -12)); pDrag->start(Qt::LinkAction); // We've dragged and maybe dropped it by now... m_pDragItem = NULL; } } // Context menu request event handler. void qjackctlSocketListView::contextMenuEvent ( QContextMenuEvent *pContextMenuEvent ) { m_pPatchbayView->contextMenu( pContextMenuEvent->globalPos(), (m_bReadable ? m_pPatchbayView->OSocketList() : m_pPatchbayView->ISocketList()) ); } //---------------------------------------------------------------------- // qjackctlPatchworkView -- Socket connector widget. // // Constructor. qjackctlPatchworkView::qjackctlPatchworkView ( qjackctlPatchbayView *pPatchbayView ) : QWidget(pPatchbayView) { m_pPatchbayView = pPatchbayView; QWidget::setMinimumWidth(20); // QWidget::setMaximumWidth(120); QWidget::setSizePolicy( QSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding)); } // Default destructor. qjackctlPatchworkView::~qjackctlPatchworkView (void) { } // Legal socket item position helper. int qjackctlPatchworkView::itemY ( QTreeWidgetItem *pItem ) const { QRect rect; QTreeWidget *pList = pItem->treeWidget(); QTreeWidgetItem *pParent = pItem->parent(); qjackctlSocketItem *pSocketItem = NULL; if (pParent && pParent->type() == QJACKCTL_SOCKETITEM) pSocketItem = static_cast (pParent); if (pSocketItem && !pSocketItem->isOpen()) { rect = pList->visualItemRect(pParent); } else { rect = pList->visualItemRect(pItem); } return rect.top() + rect.height() / 2; } // Draw visible socket connection relation lines void qjackctlPatchworkView::drawConnectionLine ( QPainter *pPainter, int x1, int y1, int x2, int y2, int h1, int h2 ) { // Account for list view headers. y1 += h1; y2 += h2; // Invisible output plugs don't get a connecting dot. if (y1 > h1) pPainter->drawLine(x1, y1, x1 + 4, y1); // How do we'll draw it? if (m_pPatchbayView->isBezierLines()) { // Setup control points QPolygon spline(4); int cp = int(float(x2 - x1 - 8) * 0.4f); spline.putPoints(0, 4, x1 + 4, y1, x1 + 4 + cp, y1, x2 - 4 - cp, y2, x2 - 4, y2); // The connection line, it self. QPainterPath path; path.moveTo(spline.at(0)); path.cubicTo(spline.at(1), spline.at(2), spline.at(3)); pPainter->strokePath(path, pPainter->pen()); } // Old style... else pPainter->drawLine(x1 + 4, y1, x2 - 4, y2); // Invisible input plugs don't get a connecting dot. if (y2 > h2) pPainter->drawLine(x2 - 4, y2, x2, y2); } // Draw socket forwrading line (for input sockets / right pane only) void qjackctlPatchworkView::drawForwardLine ( QPainter *pPainter, int x, int dx, int y1, int y2, int h ) { // Account for list view headers. y1 += h; y2 += h; dx += 4; // Draw it... if (y1 < y2) { pPainter->drawLine(x - dx, y1 + 4, x, y1); pPainter->drawLine(x - dx, y1 + 4, x - dx, y2 - 4); pPainter->drawLine(x - dx, y2 - 4, x, y2); // Down arrow... pPainter->drawLine(x - dx, y2 - 8, x - dx - 2, y2 - 12); pPainter->drawLine(x - dx, y2 - 8, x - dx + 2, y2 - 12); } else { pPainter->drawLine(x - dx, y1 - 4, x, y1); pPainter->drawLine(x - dx, y1 - 4, x - dx, y2 + 4); pPainter->drawLine(x - dx, y2 + 4, x, y2); // Up arrow... pPainter->drawLine(x - dx, y2 + 8, x - dx - 2, y2 + 12); pPainter->drawLine(x - dx, y2 + 8, x - dx + 2, y2 + 12); } } // Draw visible socket connection relation arrows. void qjackctlPatchworkView::paintEvent ( QPaintEvent * ) { if (m_pPatchbayView->OSocketList() == NULL || m_pPatchbayView->ISocketList() == NULL) return; QPainter painter(this); int x1, y1, h1; int x2, y2, h2; int i, rgb[3] = { 0x99, 0x66, 0x33 }; // Draw all lines anti-aliased... painter.setRenderHint(QPainter::Antialiasing); // Inline adaptive to darker background themes... if (QWidget::palette().window().color().value() < 0x7f) for (i = 0; i < 3; ++i) rgb[i] += 0x33; // Initialize color changer. i = 0; // Almost constants. x1 = 0; x2 = width(); h1 = ((m_pPatchbayView->OListView())->header())->sizeHint().height(); h2 = ((m_pPatchbayView->IListView())->header())->sizeHint().height(); // For each client item... qjackctlSocketItem *pOSocket, *pISocket; QListIterator osocket( (m_pPatchbayView->OSocketList())->sockets()); while (osocket.hasNext()) { pOSocket = osocket.next(); // Set new connector color. ++i; painter.setPen(QColor(rgb[i % 3], rgb[(i / 3) % 3], rgb[(i / 9) % 3])); // Get starting connector arrow coordinates. y1 = itemY(pOSocket); // Get input socket connections... QListIterator isocket(pOSocket->connects()); while (isocket.hasNext()) { pISocket = isocket.next(); // Obviously, there is a connection from pOPlug to pIPlug items: y2 = itemY(pISocket); drawConnectionLine(&painter, x1, y1, x2, y2, h1, h2); } } // Look for forwarded inputs... QList iforwards; // Make a local copy of just the forwarding socket list, if any... QListIterator isocket( (m_pPatchbayView->ISocketList())->sockets()); while (isocket.hasNext()) { pISocket = isocket.next(); // Check if its forwarded... if (pISocket->forward().isEmpty()) continue; iforwards.append(pISocket); } // (Re)initialize color changer. i = 0; // Now traverse those for proper connection drawing... int dx = 0; QListIterator iter(iforwards); while (iter.hasNext()) { pISocket = iter.next(); qjackctlSocketItem *pISocketForward = m_pPatchbayView->ISocketList()->findSocket( pISocket->forward(), pISocket->socketType()); if (pISocketForward == NULL) continue; // Set new connector color. ++i; painter.setPen(QColor(rgb[i % 3], rgb[(i / 3) % 3], rgb[(i / 9) % 3])); // Get starting connector arrow coordinates. y1 = itemY(pISocketForward); y2 = itemY(pISocket); drawForwardLine(&painter, x2, dx, y1, y2, h2); dx += 2; } } // Context menu request event handler. void qjackctlPatchworkView::contextMenuEvent ( QContextMenuEvent *pContextMenuEvent ) { m_pPatchbayView->contextMenu(pContextMenuEvent->globalPos(), NULL); } // Widget event slots... void qjackctlPatchworkView::contentsChanged (void) { QWidget::update(); } //---------------------------------------------------------------------------- // qjackctlPatchbayView -- Integrated patchbay widget. // Constructor. qjackctlPatchbayView::qjackctlPatchbayView ( QWidget *pParent ) : QSplitter(Qt::Horizontal, pParent) { m_pOListView = new qjackctlSocketListView(this, true); m_pPatchworkView = new qjackctlPatchworkView(this); m_pIListView = new qjackctlSocketListView(this, false); m_pPatchbay = NULL; m_bBezierLines = false; QSplitter::setHandleWidth(2); QObject::connect(m_pOListView, SIGNAL(itemExpanded(QTreeWidgetItem *)), m_pPatchworkView, SLOT(contentsChanged())); QObject::connect(m_pOListView, SIGNAL(itemCollapsed(QTreeWidgetItem *)), m_pPatchworkView, SLOT(contentsChanged())); QObject::connect(m_pOListView->verticalScrollBar(), SIGNAL(valueChanged(int)), m_pPatchworkView, SLOT(contentsChanged())); // QObject::connect(m_pOListView->header(), SIGNAL(sectionClicked(int)), // m_pPatchworkView, SLOT(contentsChanged())); QObject::connect(m_pIListView, SIGNAL(itemExpanded(QTreeWidgetItem *)), m_pPatchworkView, SLOT(contentsChanged())); QObject::connect(m_pIListView, SIGNAL(itemCollapsed(QTreeWidgetItem *)), m_pPatchworkView, SLOT(contentsChanged())); QObject::connect(m_pIListView->verticalScrollBar(), SIGNAL(valueChanged(int)), m_pPatchworkView, SLOT(contentsChanged())); // QObject::connect(m_pIListView->header(), SIGNAL(sectionClicked(int)), // m_pPatchworkView, SLOT(contentsChanged())); m_bDirty = false; } // Default destructor. qjackctlPatchbayView::~qjackctlPatchbayView (void) { } // Common context menu slot. void qjackctlPatchbayView::contextMenu ( const QPoint& pos, qjackctlSocketList *pSocketList ) { qjackctlPatchbay *pPatchbay = binding(); if (pPatchbay == NULL) return; QMenu menu(this); QAction *pAction; if (pSocketList) { qjackctlSocketItem *pSocketItem = pSocketList->selectedSocketItem(); bool bEnabled = (pSocketItem != NULL); pAction = menu.addAction(QIcon(":/images/add1.png"), tr("Add..."), pSocketList, SLOT(addSocketItem())); pAction = menu.addAction(QIcon(":/images/edit1.png"), tr("Edit..."), pSocketList, SLOT(editSocketItem())); pAction->setEnabled(bEnabled); pAction = menu.addAction(QIcon(":/images/copy1.png"), tr("Copy..."), pSocketList, SLOT(copySocketItem())); pAction->setEnabled(bEnabled); pAction = menu.addAction(QIcon(":/images/remove1.png"), tr("Remove"), pSocketList, SLOT(removeSocketItem())); pAction->setEnabled(bEnabled); menu.addSeparator(); pAction = menu.addAction( tr("Exclusive"), pSocketList, SLOT(exclusiveSocketItem())); pAction->setCheckable(true); pAction->setChecked(bEnabled && pSocketItem->isExclusive()); pAction->setEnabled(bEnabled && (pSocketItem->connects().count() < 2)); // Construct the forwarding menu, // overriding the last one, if any... QMenu *pForwardMenu = menu.addMenu(tr("Forward")); // Assume sockets iteration follows item index order (0,1,2...) // and remember that we only do this for input sockets... int iIndex = 0; if (pSocketItem && pSocketList == ISocketList()) { QListIterator isocket(ISocketList()->sockets()); while (isocket.hasNext()) { qjackctlSocketItem *pISocket = isocket.next(); // Must be of same type of target one... int iSocketType = pISocket->socketType(); if (iSocketType != pSocketItem->socketType()) continue; const QString& sSocketName = pISocket->socketName(); if (pSocketItem->socketName() == sSocketName) continue; int iPixmap = 0; switch (iSocketType) { case QJACKCTL_SOCKETTYPE_JACK_AUDIO: iPixmap = (pISocket->isExclusive() ? QJACKCTL_XPM_AUDIO_SOCKET_X : QJACKCTL_XPM_AUDIO_SOCKET); break; case QJACKCTL_SOCKETTYPE_JACK_MIDI: case QJACKCTL_SOCKETTYPE_ALSA_MIDI: iPixmap = (pISocket->isExclusive() ? QJACKCTL_XPM_MIDI_SOCKET_X : QJACKCTL_XPM_MIDI_SOCKET); break; } pAction = pForwardMenu->addAction( QIcon(ISocketList()->pixmap(iPixmap)), sSocketName); pAction->setChecked(pSocketItem->forward() == sSocketName); pAction->setData(iIndex); iIndex++; } // Null forward always present, // and has invalid index parameter (-1)... if (iIndex > 0) pForwardMenu->addSeparator(); pAction = pForwardMenu->addAction(tr("(None)")); pAction->setCheckable(true); pAction->setChecked(pSocketItem->forward().isEmpty()); pAction->setData(-1); // We have something here... QObject::connect(pForwardMenu, SIGNAL(triggered(QAction*)), SLOT(activateForwardMenu(QAction*))); } pForwardMenu->setEnabled(iIndex > 0); menu.addSeparator(); int iItem = (pSocketList->listView())->indexOfTopLevelItem(pSocketItem); int iItemCount = (pSocketList->listView())->topLevelItemCount(); pAction = menu.addAction(QIcon(":/images/up1.png"), tr("Move Up"), pSocketList, SLOT(moveUpSocketItem())); pAction->setEnabled(bEnabled && iItem > 0); pAction = menu.addAction(QIcon(":/images/down1.png"), tr("Move Down"), pSocketList, SLOT(moveDownSocketItem())); pAction->setEnabled(bEnabled && iItem < iItemCount - 1); menu.addSeparator(); } pAction = menu.addAction(QIcon(":/images/connect1.png"), tr("&Connect"), pPatchbay, SLOT(connectSelected()), tr("Alt+C", "Connect")); pAction->setEnabled(pPatchbay->canConnectSelected()); pAction = menu.addAction(QIcon(":/images/disconnect1.png"), tr("&Disconnect"), pPatchbay, SLOT(disconnectSelected()), tr("Alt+D", "Disconnect")); pAction->setEnabled(pPatchbay->canDisconnectSelected()); pAction = menu.addAction(QIcon(":/images/disconnectall1.png"), tr("Disconnect &All"), pPatchbay, SLOT(disconnectAll()), tr("Alt+A", "Disconect All")); pAction->setEnabled(pPatchbay->canDisconnectAll()); menu.addSeparator(); pAction = menu.addAction(QIcon(":/images/refresh1.png"), tr("&Refresh"), pPatchbay, SLOT(refresh()), tr("Alt+R", "Refresh")); menu.exec(pos); } // Select the forwarding socket name from context menu. void qjackctlPatchbayView::activateForwardMenu ( QAction *pAction ) { int iIndex = pAction->data().toInt(); // Get currently input socket (assume its nicely selected) qjackctlSocketItem *pSocketItem = ISocketList()->selectedSocketItem(); if (pSocketItem) { // Check first for forward from nil... if (iIndex < 0) { pSocketItem->setForward(QString::null); setDirty(true); return; } // Hopefully, its a real socket about to be forwraded... QListIterator isocket(ISocketList()->sockets()); while (isocket.hasNext()) { qjackctlSocketItem *pISocket = isocket.next(); // Must be of same type of target one... if (pISocket->socketType() != pSocketItem->socketType()) continue; const QString& sSocketName = pISocket->socketName(); if (pSocketItem->socketName() == sSocketName) continue; if (iIndex == 0) { pSocketItem->setForward(sSocketName); setDirty(true); break; } --iIndex; } } } // Patchbay binding methods. void qjackctlPatchbayView::setBinding ( qjackctlPatchbay *pPatchbay ) { m_pPatchbay = pPatchbay; } qjackctlPatchbay *qjackctlPatchbayView::binding (void) const { return m_pPatchbay; } // Patchbay client list accessors. qjackctlSocketList *qjackctlPatchbayView::OSocketList (void) const { if (m_pPatchbay) return m_pPatchbay->OSocketList(); else return NULL; } qjackctlSocketList *qjackctlPatchbayView::ISocketList (void) const { if (m_pPatchbay) return m_pPatchbay->ISocketList(); else return NULL; } // Patchwork line style accessors. void qjackctlPatchbayView::setBezierLines ( bool bBezierLines ) { m_bBezierLines = bBezierLines; } bool qjackctlPatchbayView::isBezierLines (void) const { return m_bBezierLines; } // Dirty flag methods. void qjackctlPatchbayView::setDirty ( bool bDirty ) { m_bDirty = bDirty; if (bDirty) emit contentsChanged(); } bool qjackctlPatchbayView::dirty (void) const { return m_bDirty; } //---------------------------------------------------------------------- // qjackctlPatchbay -- Output-to-Input client/plugs connection object. // // Constructor. qjackctlPatchbay::qjackctlPatchbay ( qjackctlPatchbayView *pPatchbayView ) { m_pPatchbayView = pPatchbayView; m_pOSocketList = new qjackctlSocketList(m_pPatchbayView->OListView(), true); m_pISocketList = new qjackctlSocketList(m_pPatchbayView->IListView(), false); m_pPatchbayView->setBinding(this); } // Default destructor. qjackctlPatchbay::~qjackctlPatchbay (void) { m_pPatchbayView->setBinding(NULL); delete m_pOSocketList; m_pOSocketList = NULL; delete m_pISocketList; m_pISocketList = NULL; (m_pPatchbayView->PatchworkView())->update(); } // Connection primitive. void qjackctlPatchbay::connectSockets ( qjackctlSocketItem *pOSocket, qjackctlSocketItem *pISocket ) { if (pOSocket->findConnectPtr(pISocket) == NULL) { pOSocket->addConnect(pISocket); pISocket->addConnect(pOSocket); } } // Disconnection primitive. void qjackctlPatchbay::disconnectSockets ( qjackctlSocketItem *pOSocket, qjackctlSocketItem *pISocket ) { if (pOSocket->findConnectPtr(pISocket) != NULL) { pOSocket->removeConnect(pISocket); pISocket->removeConnect(pOSocket); } } // Test if selected plugs are connectable. bool qjackctlPatchbay::canConnectSelected (void) { QTreeWidgetItem *pOItem = (m_pOSocketList->listView())->currentItem(); if (pOItem == NULL) return false; QTreeWidgetItem *pIItem = (m_pISocketList->listView())->currentItem(); if (pIItem == NULL) return false; qjackctlSocketItem *pOSocket = NULL; switch (pOItem->type()) { case QJACKCTL_SOCKETITEM: pOSocket = static_cast (pOItem); break; case QJACKCTL_PLUGITEM: pOSocket = (static_cast (pOItem))->socket(); break; default: return false; } qjackctlSocketItem *pISocket = NULL; switch (pIItem->type()) { case QJACKCTL_SOCKETITEM: pISocket = static_cast (pIItem); break; case QJACKCTL_PLUGITEM: pISocket = (static_cast (pIItem))->socket(); break; default: return false; } // Sockets must be of the same type... if (pOSocket->socketType() != pISocket->socketType()) return false; // Exclusive sockets may not accept more than one cable. if (pOSocket->isExclusive() && pOSocket->connects().count() > 0) return false; if (pISocket->isExclusive() && pISocket->connects().count() > 0) return false; // One-to-one connection... return (pOSocket->findConnectPtr(pISocket) == NULL); } // Connect current selected plugs. bool qjackctlPatchbay::connectSelected (void) { QTreeWidgetItem *pOItem = (m_pOSocketList->listView())->currentItem(); if (pOItem == NULL) return false; QTreeWidgetItem *pIItem = (m_pISocketList->listView())->currentItem(); if (pIItem == NULL) return false; qjackctlSocketItem *pOSocket = NULL; switch (pOItem->type()) { case QJACKCTL_SOCKETITEM: pOSocket = static_cast (pOItem); break; case QJACKCTL_PLUGITEM: pOSocket = (static_cast (pOItem))->socket(); break; default: return false; } qjackctlSocketItem *pISocket = NULL; switch (pIItem->type()) { case QJACKCTL_SOCKETITEM: pISocket = static_cast (pIItem); break; case QJACKCTL_PLUGITEM: pISocket = (static_cast (pIItem))->socket(); break; default: return false; } // Sockets must be of the same type... if (pOSocket->socketType() != pISocket->socketType()) return false; // Exclusive sockets may not accept more than one cable. if (pOSocket->isExclusive() && pOSocket->connects().count() > 0) return false; if (pISocket->isExclusive() && pISocket->connects().count() > 0) return false; // One-to-one connection... connectSockets(pOSocket, pISocket); // Making one list dirty will take care of the rest... m_pPatchbayView->setDirty(true); return true; } // Test if selected plugs are disconnectable. bool qjackctlPatchbay::canDisconnectSelected (void) { QTreeWidgetItem *pOItem = (m_pOSocketList->listView())->currentItem(); if (pOItem == NULL) return false; QTreeWidgetItem *pIItem = (m_pISocketList->listView())->currentItem(); if (pIItem == NULL) return false; qjackctlSocketItem *pOSocket = NULL; switch (pOItem->type()) { case QJACKCTL_SOCKETITEM: pOSocket = static_cast (pOItem); break; case QJACKCTL_PLUGITEM: pOSocket = (static_cast (pOItem))->socket(); break; default: return false; } qjackctlSocketItem *pISocket = NULL; switch (pIItem->type()) { case QJACKCTL_SOCKETITEM: pISocket = static_cast (pIItem); break; case QJACKCTL_PLUGITEM: pISocket = (static_cast (pIItem))->socket(); break; default: return false; } // Sockets must be of the same type... if (pOSocket->socketType() != pISocket->socketType()) return false; return (pOSocket->findConnectPtr(pISocket) != 0); } // Disconnect current selected plugs. bool qjackctlPatchbay::disconnectSelected (void) { QTreeWidgetItem *pOItem = (m_pOSocketList->listView())->currentItem(); if (!pOItem) return false; QTreeWidgetItem *pIItem = (m_pISocketList->listView())->currentItem(); if (!pIItem) return false; qjackctlSocketItem *pOSocket = NULL; switch (pOItem->type()) { case QJACKCTL_SOCKETITEM: pOSocket = static_cast (pOItem); break; case QJACKCTL_PLUGITEM: pOSocket = (static_cast (pOItem))->socket(); break; default: return false; } qjackctlSocketItem *pISocket = NULL; switch (pIItem->type()) { case QJACKCTL_SOCKETITEM: pISocket = static_cast (pIItem); break; case QJACKCTL_PLUGITEM: pISocket = (static_cast (pIItem))->socket(); break; default: return false; } // Sockets must be of the same type... if (pOSocket->socketType() != pISocket->socketType()) return false; // One-to-one disconnection... disconnectSockets(pOSocket, pISocket); // Making one list dirty will take care of the rest... m_pPatchbayView->setDirty(true); return true; } // Test if any plug is disconnectable. bool qjackctlPatchbay::canDisconnectAll (void) { QListIterator osocket(m_pOSocketList->sockets()); while (osocket.hasNext()) { qjackctlSocketItem *pOSocket = osocket.next(); if (pOSocket->connects().count() > 0) return true; } return false; } // Disconnect all plugs. bool qjackctlPatchbay::disconnectAll (void) { if (QMessageBox::warning(m_pPatchbayView, tr("Warning") + " - " QJACKCTL_SUBTITLE1, tr("This will disconnect all sockets.\n\n" "Are you sure?"), QMessageBox::Yes | QMessageBox::No) == QMessageBox::No) { return false; } QListIterator osocket(m_pOSocketList->sockets()); while (osocket.hasNext()) { qjackctlSocketItem *pOSocket = osocket.next(); QListIterator isocket(pOSocket->connects()); while (isocket.hasNext()) disconnectSockets(pOSocket, isocket.next()); } // Making one list dirty will take care of the rest... m_pPatchbayView->setDirty(true); return true; } // Expand all socket items. void qjackctlPatchbay::expandAll (void) { (m_pOSocketList->listView())->expandAll(); (m_pISocketList->listView())->expandAll(); (m_pPatchbayView->PatchworkView())->update(); } // Complete contents rebuilder. void qjackctlPatchbay::refresh (void) { (m_pOSocketList->listView())->update(); (m_pISocketList->listView())->update(); (m_pPatchbayView->PatchworkView())->update(); } // Complete contents clearer. void qjackctlPatchbay::clear (void) { // Clear socket lists. m_pOSocketList->clear(); m_pISocketList->clear(); // Reset dirty flag. m_pPatchbayView->setDirty(false); // May refresh everything. refresh(); } // Patchbay client list accessors. qjackctlSocketList *qjackctlPatchbay::OSocketList (void) const { return m_pOSocketList; } qjackctlSocketList *qjackctlPatchbay::ISocketList (void) const { return m_pISocketList; } // External rack transfer method: copy patchbay structure from master rack model. void qjackctlPatchbay::loadRackSockets ( qjackctlSocketList *pSocketList, QList& socketlist ) { pSocketList->clear(); qjackctlSocketItem *pSocketItem = NULL; QListIterator sockit(socketlist); while (sockit.hasNext()) { qjackctlPatchbaySocket *pSocket = sockit.next(); pSocketItem = new qjackctlSocketItem(pSocketList, pSocket->name(), pSocket->clientName(), pSocket->type(), pSocketItem); if (pSocketItem) { pSocketItem->setExclusive(pSocket->isExclusive()); pSocketItem->setForward(pSocket->forward()); pSocketItem->updatePixmap(); qjackctlPlugItem *pPlugItem = NULL; QStringListIterator iter(pSocket->pluglist()); while (iter.hasNext()) { pPlugItem = new qjackctlPlugItem( pSocketItem, iter.next(), pPlugItem); } } } } void qjackctlPatchbay::loadRack ( qjackctlPatchbayRack *pPatchbayRack ) { (m_pOSocketList->listView())->setUpdatesEnabled(false); (m_pISocketList->listView())->setUpdatesEnabled(false); // Load ouput sockets. loadRackSockets(m_pOSocketList, pPatchbayRack->osocketlist()); // Load input sockets. loadRackSockets(m_pISocketList, pPatchbayRack->isocketlist()); // Now ready to load from cable model. QListIterator iter(pPatchbayRack->cablelist()); while (iter.hasNext()) { qjackctlPatchbayCable *pCable = iter.next(); // Get proper sockets... qjackctlPatchbaySocket *pOSocket = pCable->outputSocket(); qjackctlPatchbaySocket *pISocket = pCable->inputSocket(); if (pOSocket && pISocket) { qjackctlSocketItem *pOSocketItem = m_pOSocketList->findSocket(pOSocket->name(), pOSocket->type()); qjackctlSocketItem *pISocketItem = m_pISocketList->findSocket(pISocket->name(), pISocket->type()); if (pOSocketItem && pISocketItem) connectSockets(pOSocketItem, pISocketItem); } } (m_pOSocketList->listView())->setUpdatesEnabled(true); (m_pISocketList->listView())->setUpdatesEnabled(true); (m_pOSocketList->listView())->update(); (m_pISocketList->listView())->update(); (m_pPatchbayView->PatchworkView())->update(); // Reset dirty flag. m_pPatchbayView->setDirty(false); } // External rack transfer method: copy patchbay structure into master rack model. void qjackctlPatchbay::saveRackSockets ( qjackctlSocketList *pSocketList, QList& socketlist ) { // Have QTreeWidget item order into account: qjackctlSocketListView *pListView = pSocketList->listView(); if (pListView == NULL) return; socketlist.clear(); const int iItemCount = pListView->topLevelItemCount(); for (int iItem = 0; iItem < iItemCount; ++iItem) { QTreeWidgetItem *pItem = pListView->topLevelItem(iItem); if (pItem->type() != QJACKCTL_SOCKETITEM) continue; qjackctlSocketItem *pSocketItem = static_cast (pItem); if (pSocketItem == NULL) continue; qjackctlPatchbaySocket *pSocket = new qjackctlPatchbaySocket(pSocketItem->socketName(), pSocketItem->clientName(), pSocketItem->socketType()); if (pSocket) { pSocket->setExclusive(pSocketItem->isExclusive()); pSocket->setForward(pSocketItem->forward()); QListIterator iter(pSocketItem->plugs()); while (iter.hasNext()) pSocket->pluglist().append((iter.next())->plugName()); socketlist.append(pSocket); } } } void qjackctlPatchbay::saveRack ( qjackctlPatchbayRack *pPatchbayRack ) { // Save ouput sockets. saveRackSockets(m_pOSocketList, pPatchbayRack->osocketlist()); // Save input sockets. saveRackSockets(m_pISocketList, pPatchbayRack->isocketlist()); // Now ready to save into cable model. pPatchbayRack->cablelist().clear(); // Start from output sockets... QListIterator osocket(m_pOSocketList->sockets()); while (osocket.hasNext()) { qjackctlSocketItem *pOSocketItem = osocket.next(); // Then to input sockets... QListIterator isocket(pOSocketItem->connects()); while (isocket.hasNext()) { qjackctlSocketItem *pISocketItem = isocket.next(); // Now find proper racked sockets... qjackctlPatchbaySocket *pOSocket = pPatchbayRack->findSocket( pPatchbayRack->osocketlist(), pOSocketItem->socketName()); qjackctlPatchbaySocket *pISocket = pPatchbayRack->findSocket( pPatchbayRack->isocketlist(), pISocketItem->socketName()); if (pOSocket && pISocket) { pPatchbayRack->addCable( new qjackctlPatchbayCable(pOSocket, pISocket)); } } } // Reset dirty flag. m_pPatchbayView->setDirty(false); } // Connections snapshot. void qjackctlPatchbay::connectionsSnapshot (void) { qjackctlMainForm *pMainForm = qjackctlMainForm::getInstance(); if (pMainForm == NULL) return; qjackctlPatchbayRack rack; rack.connectJackSnapshot(pMainForm->jackClient()); rack.connectAlsaSnapshot(pMainForm->alsaSeq()); loadRack(&rack); // Set dirty flag. m_pPatchbayView->setDirty(true); } // end of qjackctlPatchbay.cpp qjackctl-0.4.2/src/PaxHeaders.14935/qjackctlConnect.h0000644000000000000000000000013212700760152017121 xustar0030 mtime=1459871850.617907288 30 atime=1459871850.617907288 30 ctime=1459871850.617907288 qjackctl-0.4.2/src/qjackctlConnect.h0000644000175000001440000003220012700760152017662 0ustar00rncbcusers00000000000000// qjackctlConnect.h // /**************************************************************************** Copyright (C) 2003-2015, rncbc aka Rui Nuno Capela. All rights reserved. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. *****************************************************************************/ #ifndef __qjackctlConnect_h #define __qjackctlConnect_h #include "qjackctlConnectAlias.h" #include #include // QListViewItem::rtti return values. #define QJACKCTL_CLIENTITEM 1001 #define QJACKCTL_PORTITEM 1002 // Forward declarations. class qjackctlPortItem; class qjackctlClientItem; class qjackctlClientList; class qjackctlClientListView; class qjackctlConnectorView; class qjackctlConnectView; class qjackctlConnect; // Port list item. class qjackctlPortItem : public QTreeWidgetItem { public: // Constructor. qjackctlPortItem(qjackctlClientItem *pClient); // Default destructor. virtual ~qjackctlPortItem(); // Instance accessors. void setPortName(const QString& sPortName); const QString& clientName() const; const QString& portName() const; // Port name alias accessors. void setPortNameAlias(const QString& sPortNameAlias); QString portNameAlias(bool *pbRenameEnabled) const; // Proto-pretty/display name accessors. virtual void updatePortName(bool bRename = false); // Tooltip text building. virtual QString tooltip() const; // Complete client:port name helper. QString clientPortName() const; // Connections client item method. qjackctlClientItem *client() const; // Client port cleanup marker. void markPort(int iMark); void markClientPort(int iMark); int portMark() const; // Connected port list primitives. void addConnect(qjackctlPortItem *pPort); void removeConnect(qjackctlPortItem *pPort); // Connected port finders. qjackctlPortItem *findConnect(const QString& sClientPortName); qjackctlPortItem *findConnectPtr(qjackctlPortItem *pPortPtr); // Connection list accessor. const QList& connects() const; // Connectiopn highlight methods. bool isHilite() const; void setHilite (bool bHilite); // Proxy sort override method. // - Natural decimal sorting comparator. bool operator< (const QTreeWidgetItem& other) const; protected: // Port name display name accessors. void setPortText(const QString& sPortText, bool bRenameEnabled); QString portText() const; private: // Instance variables. qjackctlClientItem *m_pClient; QString m_sPortName; int m_iPortMark; bool m_bHilite; // Connection cache list. QList m_connects; }; // Client list item. class qjackctlClientItem : public QTreeWidgetItem { public: // Constructor. qjackctlClientItem(qjackctlClientList *pClientList); // Default destructor. virtual ~qjackctlClientItem(); // Port list primitive methods. void addPort(qjackctlPortItem *pPort); void removePort(qjackctlPortItem *pPort); // Port finder. qjackctlPortItem *findPort(const QString& sPortName); // Instance accessors. void setClientName(const QString& sClientName); const QString& clientName() const; // Client name alias accessors. void setClientNameAlias(const QString& sClientNameAlias); QString clientNameAlias(bool *pbRenameEnabled) const; // Proto-pretty/display name method. virtual void updateClientName(bool bRename = false); // Readable flag accessor. bool isReadable() const; // Client list accessor. qjackctlClientList *clientList() const; // Port list accessor. QList& ports(); // Client port cleanup marker. void markClient(int iMark); void markClientPorts(int iMark); int cleanClientPorts(int iMark); int clientMark() const; // Connectiopn highlight methods. bool isHilite() const; void setHilite (bool bHilite); // Client item openness status. void setOpen(bool bOpen); bool isOpen() const; // Proxy sort override method. // - Natural decimal sorting comparator. bool operator< (const QTreeWidgetItem& other) const; protected: // Client name display name accessors. void setClientText(const QString& sClientText, bool bRenameEnabled); QString clientText() const; private: // Instance variables. qjackctlClientList *m_pClientList; QString m_sClientName; int m_iClientMark; int m_iHilite; QList m_ports; }; // Jack client list. class qjackctlClientList : public QObject { public: // Constructor. qjackctlClientList(qjackctlClientListView *pListView, bool bReadable); // Default destructor. ~qjackctlClientList(); // Do proper contents cleanup. void clear(); // Client list primitive methods. void addClient(qjackctlClientItem *pClient); void removeClient(qjackctlClientItem *pClient); // Client finder. qjackctlClientItem *findClient(const QString& sClientName); // Client:port finder. qjackctlPortItem *findClientPort(const QString& sClientPort); // List view accessor. qjackctlClientListView *listView() const; // Readable flag accessor. bool isReadable() const; // Client list accessor. QList& clients(); // Client ports cleanup marker. void markClientPorts(int iMark); int cleanClientPorts(int iMark); // Client:port refreshner (return newest item count). virtual int updateClientPorts() = 0; // Client:port hilite update stabilization. void hiliteClientPorts (void); // Do proper contents refresh/update. void refresh(); // Natural decimal sorting comparator. static bool lessThan(const QTreeWidgetItem& i1, const QTreeWidgetItem& i2); private: // Instance variables. qjackctlClientListView *m_pListView; bool m_bReadable; QList m_clients; QTreeWidgetItem *m_pHiliteItem; }; //---------------------------------------------------------------------------- // qjackctlClientListView -- Client list view, supporting drag-n-drop. class qjackctlClientListView : public QTreeWidget { Q_OBJECT public: // Constructor. qjackctlClientListView(qjackctlConnectView *pConnectView, bool bReadable); // Default destructor. ~qjackctlClientListView(); // Auto-open timer methods. void setAutoOpenTimeout(int iAutoOpenTimeout); int autoOpenTimeout() const; // Aliasing support methods. void setAliases(qjackctlConnectAlias *pAliases, bool bRenameEnabled); qjackctlConnectAlias *aliases() const; bool isRenameEnabled() const; // Binding indirect accessor. qjackctlConnect *binding() const; // Dirty flag accessors. void setDirty (bool bDirty); bool isDirty() const; protected slots: // In-place aliasing slots. void startRenameSlot(); void renamedSlot(); // Auto-open timeout slot. void timeoutSlot(); protected: // Trap for help/tool-tip events. bool eventFilter(QObject *pObject, QEvent *pEvent); // Drag-n-drop stuff. QTreeWidgetItem *dragDropItem(const QPoint& pos); // Drag-n-drop stuff -- reimplemented virtual methods. void dragEnterEvent(QDragEnterEvent *pDragEnterEvent); void dragMoveEvent(QDragMoveEvent *pDragMoveEvent); void dragLeaveEvent(QDragLeaveEvent *); void dropEvent(QDropEvent *pDropEvent); // Handle mouse events for drag-and-drop stuff. void mousePressEvent(QMouseEvent *pMouseEvent); void mouseMoveEvent(QMouseEvent *pMouseEvent); // Context menu request event handler. void contextMenuEvent(QContextMenuEvent *); private: // Bindings. qjackctlConnectView *m_pConnectView; // Auto-open timer. int m_iAutoOpenTimeout; QTimer *m_pAutoOpenTimer; // Items we'll eventually drop something. QTreeWidgetItem *m_pDragItem; QTreeWidgetItem *m_pDropItem; // The point from where drag started. QPoint m_posDrag; // Aliasing support. qjackctlConnectAlias *m_pAliases; bool m_bRenameEnabled; }; //---------------------------------------------------------------------------- // qjackctlConnectorView -- Jack port connector widget. class qjackctlConnectorView : public QWidget { Q_OBJECT public: // Constructor. qjackctlConnectorView(qjackctlConnectView *pConnectView); // Default destructor. ~qjackctlConnectorView(); protected slots: // Useful slots (should this be protected?). void contentsChanged(); protected: // Draw visible port connection relation arrows. void paintEvent(QPaintEvent *); // Context menu request event handler. virtual void contextMenuEvent(QContextMenuEvent *); private: // Legal client/port item position helper. int itemY(QTreeWidgetItem *pItem) const; // Drawing methods. void drawConnectionLine(QPainter *pPainter, int x1, int y1, int x2, int y2, int h1, int h2, const QPen& pen); // Local instance variables. qjackctlConnectView *m_pConnectView; }; //---------------------------------------------------------------------------- // qjackctlConnectView -- Connections view integrated widget. class qjackctlConnectView : public QSplitter { Q_OBJECT public: // Constructor. qjackctlConnectView(QWidget *pParent = 0); // Default destructor. ~qjackctlConnectView(); // Widget accesors. qjackctlClientListView *OListView() const { return m_pOListView; } qjackctlClientListView *IListView() const { return m_pIListView; } qjackctlConnectorView *connectorView() const { return m_pConnectorView; } // Connections object binding methods. void setBinding(qjackctlConnect *pConnect); qjackctlConnect *binding() const; // Client list accessors. qjackctlClientList *OClientList() const; qjackctlClientList *IClientList() const; // Connector line style accessors. void setBezierLines(bool bBezierLines); bool isBezierLines() const; // Common icon size pixmap accessors. void setIconSize (int iIconSize); int iconSize (void) const; // Dirty flag accessors. void setDirty (bool bDirty); bool isDirty() const; signals: // Contents change signal. void contentsChanged(); private: // Child controls. qjackctlClientListView *m_pOListView; qjackctlClientListView *m_pIListView; qjackctlConnectorView *m_pConnectorView; // The main binding object. qjackctlConnect *m_pConnect; // How we'll draw connector lines. bool m_bBezierLines; // How large will be those icons. // 0 = 16x16 (default), 1 = 32x32, 2 = 64x64. int m_iIconSize; // The obnoxious dirty flag. bool m_bDirty; }; //---------------------------------------------------------------------------- // qjackctlConnect -- Connections model integrated object. class qjackctlConnect : public QObject { Q_OBJECT public: // Constructor. qjackctlConnect(qjackctlConnectView *pConnectView); // Default destructor. ~qjackctlConnect(); // Explicit connection tests. bool canConnectSelected(); bool canDisconnectSelected(); bool canDisconnectAll(); // Client list accessors. qjackctlClientList *OClientList() const; qjackctlClientList *IClientList() const; public slots: // Incremental contents refreshner; check dirty status. void refresh(); // Explicit connection slots. bool connectSelected(); bool disconnectSelected(); bool disconnectAll(); // Expand all client ports. void expandAll(); // Complete/incremental contents rebuilder; check dirty status if incremental. void updateContents(bool bClear); signals: // Connection change signal. void connectChanged(); // Pre-notification of (dis)connection. void connecting(qjackctlPortItem *, qjackctlPortItem *); void disconnecting(qjackctlPortItem *, qjackctlPortItem *); protected: // Connect/Disconnection primitives. virtual bool connectPorts( qjackctlPortItem *pOPort, qjackctlPortItem *pIPort) = 0; virtual bool disconnectPorts( qjackctlPortItem *pOPort, qjackctlPortItem *pIPort) = 0; // Update port connection references. virtual void updateConnections() = 0; // These must be accessed by the descendant constructor. qjackctlConnectView *connectView() const; void setOClientList(qjackctlClientList *pOClientList); void setIClientList(qjackctlClientList *pIClientList); // Common pixmap factory helper-method. QPixmap *createIconPixmap (const QString& sIconName); // Update icon size implementation. virtual void updateIconPixmaps() = 0; private: // Dunno. But this may avoid some conflicts. bool startMutex(); void endMutex(); // Connection methods (unguarded). bool canConnectSelectedEx(); bool canDisconnectSelectedEx(); bool canDisconnectAllEx(); bool connectSelectedEx(); bool disconnectSelectedEx(); bool disconnectAllEx(); // Connect/Disconnection local primitives. bool connectPortsEx(qjackctlPortItem *pOPort, qjackctlPortItem *pIPort); bool disconnectPortsEx(qjackctlPortItem *pOPort, qjackctlPortItem *pIPort); // Instance variables. qjackctlConnectView *m_pConnectView; // These must be created on the descendant constructor. qjackctlClientList *m_pOClientList; qjackctlClientList *m_pIClientList; int m_iMutex; }; #endif // __qjackctlConnect_h // end of qjackctlConnect.h qjackctl-0.4.2/src/PaxHeaders.14935/qjackctlPatchbayForm.cpp0000644000000000000000000000013212700760152020442 xustar0030 mtime=1459871850.622909789 30 atime=1459871850.622909789 30 ctime=1459871850.622909789 qjackctl-0.4.2/src/qjackctlPatchbayForm.cpp0000644000175000001440000004510112700760152021207 0ustar00rncbcusers00000000000000// qjackctlPatchbayForm.cpp // /**************************************************************************** Copyright (C) 2003-2011, rncbc aka Rui Nuno Capela. All rights reserved. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. *****************************************************************************/ #include "qjackctlAbout.h" #include "qjackctlPatchbayForm.h" #include "qjackctlPatchbayFile.h" #include "qjackctlSetup.h" #include "qjackctlMainForm.h" #include #include #include #include #include #include //---------------------------------------------------------------------------- // qjackctlPatchbayForm -- UI wrapper form. // Constructor. qjackctlPatchbayForm::qjackctlPatchbayForm ( QWidget *pParent, Qt::WindowFlags wflags ) : QWidget(pParent, wflags) { // Setup UI struct... m_ui.setupUi(this); m_pSetup = NULL; // Create the patchbay view object. m_pPatchbay = new qjackctlPatchbay(m_ui.PatchbayView); m_iUntitled = 0; m_bActivePatchbay = false; m_iUpdate = 0; // UI connections... QObject::connect(m_ui.NewPatchbayPushButton, SIGNAL(clicked()), SLOT(newPatchbay())); QObject::connect(m_ui.LoadPatchbayPushButton, SIGNAL(clicked()), SLOT(loadPatchbay())); QObject::connect(m_ui.SavePatchbayPushButton, SIGNAL(clicked()), SLOT(savePatchbay())); QObject::connect(m_ui.PatchbayComboBox, SIGNAL(activated(int)), SLOT(selectPatchbay(int))); QObject::connect(m_ui.ActivatePatchbayPushButton, SIGNAL(clicked()), SLOT(toggleActivePatchbay())); QObject::connect(m_ui.OSocketAddPushButton, SIGNAL(clicked()), SLOT(addOSocket())); QObject::connect(m_ui.OSocketEditPushButton, SIGNAL(clicked()), SLOT(editOSocket())); QObject::connect(m_ui.OSocketCopyPushButton, SIGNAL(clicked()), SLOT(copyOSocket())); QObject::connect(m_ui.OSocketRemovePushButton, SIGNAL(clicked()), SLOT(removeOSocket())); QObject::connect(m_ui.OSocketMoveUpPushButton, SIGNAL(clicked()), SLOT(moveUpOSocket())); QObject::connect(m_ui.OSocketMoveDownPushButton, SIGNAL(clicked()), SLOT(moveDownOSocket())); QObject::connect(m_ui.ISocketAddPushButton, SIGNAL(clicked()), SLOT(addISocket())); QObject::connect(m_ui.ISocketEditPushButton, SIGNAL(clicked()), SLOT(editISocket())); QObject::connect(m_ui.ISocketCopyPushButton, SIGNAL(clicked()), SLOT(copyISocket())); QObject::connect(m_ui.ISocketRemovePushButton, SIGNAL(clicked()), SLOT(removeISocket())); QObject::connect(m_ui.ISocketMoveUpPushButton, SIGNAL(clicked()), SLOT(moveUpISocket())); QObject::connect(m_ui.ISocketMoveDownPushButton, SIGNAL(clicked()), SLOT(moveDownISocket())); QObject::connect(m_ui.ConnectPushButton, SIGNAL(clicked()), SLOT(connectSelected())); QObject::connect(m_ui.DisconnectPushButton, SIGNAL(clicked()), SLOT(disconnectSelected())); QObject::connect(m_ui.DisconnectAllPushButton, SIGNAL(clicked()), SLOT(disconnectAll())); QObject::connect(m_ui.ExpandAllPushButton, SIGNAL(clicked()), SLOT(expandAll())); QObject::connect(m_ui.RefreshPushButton, SIGNAL(clicked()), SLOT(refreshForm())); // Connect it to some UI feedback slot. QObject::connect(m_ui.PatchbayView->OListView(), SIGNAL(currentItemChanged(QTreeWidgetItem*,QTreeWidgetItem*)), SLOT(stabilizeForm())); QObject::connect(m_ui.PatchbayView->IListView(), SIGNAL(currentItemChanged(QTreeWidgetItem*,QTreeWidgetItem*)), SLOT(stabilizeForm())); // Dirty patchbay dispatcher (stabilization deferral). QObject::connect(m_ui.PatchbayView, SIGNAL(contentsChanged()), SLOT(contentsChanged())); newPatchbayFile(false); stabilizeForm(); } // Destructor. qjackctlPatchbayForm::~qjackctlPatchbayForm (void) { // May delete the patchbay view object. delete m_pPatchbay; } // Notify our parent that we're emerging. void qjackctlPatchbayForm::showEvent ( QShowEvent *pShowEvent ) { qjackctlMainForm *pMainForm = qjackctlMainForm::getInstance(); if (pMainForm) pMainForm->stabilizeForm(); stabilizeForm(); QWidget::showEvent(pShowEvent); } // Notify our parent that we're closing. void qjackctlPatchbayForm::hideEvent ( QHideEvent *pHideEvent ) { QWidget::hideEvent(pHideEvent); qjackctlMainForm *pMainForm = qjackctlMainForm::getInstance(); if (pMainForm) pMainForm->stabilizeForm(); } // Just about to notify main-window that we're closing. void qjackctlPatchbayForm::closeEvent ( QCloseEvent * /*pCloseEvent*/ ) { QWidget::hide(); qjackctlMainForm *pMainForm = qjackctlMainForm::getInstance(); if (pMainForm) pMainForm->stabilizeForm(); } // Set reference to global options, mostly needed for the // initial sizes of the main splitter views... void qjackctlPatchbayForm::setup ( qjackctlSetup *pSetup ) { m_pSetup = pSetup; // Load main splitter sizes... if (m_pSetup) { QList sizes; sizes.append(180); sizes.append(60); sizes.append(180); m_pSetup->loadSplitterSizes(m_ui.PatchbayView, sizes); } } // Patchbay view accessor. qjackctlPatchbayView *qjackctlPatchbayForm::patchbayView (void) const { return m_ui.PatchbayView; } // Window close event handlers. bool qjackctlPatchbayForm::queryClose (void) { bool bQueryClose = true; if (m_ui.PatchbayView->dirty()) { switch (QMessageBox::warning(this, tr("Warning") + " - " QJACKCTL_SUBTITLE1, tr("The patchbay definition has been changed:\n\n" "\"%1\"\n\nDo you want to save the changes?") .arg(m_sPatchbayName), QMessageBox::Save | QMessageBox::Discard | QMessageBox::Cancel)) { case QMessageBox::Save: savePatchbay(); // Fall thru.... case QMessageBox::Discard: break; default: // Cancel. bQueryClose = false; } } // Save main splitter sizes... if (m_pSetup && bQueryClose) m_pSetup->saveSplitterSizes(m_ui.PatchbayView); return bQueryClose; } // Contents change deferrer slot... void qjackctlPatchbayForm::contentsChanged (void) { qjackctlMainForm *pMainForm = qjackctlMainForm::getInstance(); if (pMainForm) pMainForm->refreshPatchbay(); } // Refresh complete form. void qjackctlPatchbayForm::refreshForm (void) { m_pPatchbay->refresh(); stabilizeForm(); } // A helper stabilization slot. void qjackctlPatchbayForm::stabilizeForm ( void ) { m_ui.SavePatchbayPushButton->setEnabled(m_ui.PatchbayView->dirty()); m_ui.ActivatePatchbayPushButton->setEnabled( QFileInfo(m_sPatchbayPath).exists()); qjackctlMainForm *pMainForm = qjackctlMainForm::getInstance(); m_bActivePatchbay = (pMainForm && pMainForm->isActivePatchbay(m_sPatchbayPath)); m_ui.ActivatePatchbayPushButton->setChecked(m_bActivePatchbay); if (m_ui.PatchbayView->dirty()) { m_ui.PatchbayComboBox->setItemText( m_ui.PatchbayComboBox->currentIndex(), tr("%1 [modified]").arg(m_sPatchbayName)); } // Take care that IT might be destroyed already... if (m_ui.PatchbayView->binding() == NULL) return; bool bExpandAll = false; qjackctlSocketList *pSocketList; qjackctlSocketItem *pSocketItem; int iItemCount, iItem; pSocketList = m_pPatchbay->OSocketList(); pSocketItem = pSocketList->selectedSocketItem(); iItemCount = (pSocketList->listView())->topLevelItemCount(); bExpandAll = bExpandAll || (iItemCount > 0); if (pSocketItem) { iItem = (pSocketList->listView())->indexOfTopLevelItem(pSocketItem); m_ui.OSocketEditPushButton->setEnabled(true); m_ui.OSocketCopyPushButton->setEnabled(true); m_ui.OSocketRemovePushButton->setEnabled(true); m_ui.OSocketMoveUpPushButton->setEnabled(iItem > 0); m_ui.OSocketMoveDownPushButton->setEnabled(iItem < iItemCount - 1); } else { m_ui.OSocketEditPushButton->setEnabled(false); m_ui.OSocketCopyPushButton->setEnabled(false); m_ui.OSocketRemovePushButton->setEnabled(false); m_ui.OSocketMoveUpPushButton->setEnabled(false); m_ui.OSocketMoveDownPushButton->setEnabled(false); } pSocketList = m_pPatchbay->ISocketList(); pSocketItem = pSocketList->selectedSocketItem(); iItemCount = (pSocketList->listView())->topLevelItemCount(); bExpandAll = bExpandAll || (iItemCount > 0); if (pSocketItem) { iItem = (pSocketList->listView())->indexOfTopLevelItem(pSocketItem); m_ui.ISocketEditPushButton->setEnabled(true); m_ui.ISocketCopyPushButton->setEnabled(true); m_ui.ISocketRemovePushButton->setEnabled(true); m_ui.ISocketMoveUpPushButton->setEnabled(iItem > 0); m_ui.ISocketMoveDownPushButton->setEnabled(iItem < iItemCount - 1); } else { m_ui.ISocketEditPushButton->setEnabled(false); m_ui.ISocketCopyPushButton->setEnabled(false); m_ui.ISocketRemovePushButton->setEnabled(false); m_ui.ISocketMoveUpPushButton->setEnabled(false); m_ui.ISocketMoveDownPushButton->setEnabled(false); } m_ui.ConnectPushButton->setEnabled( m_pPatchbay->canConnectSelected()); m_ui.DisconnectPushButton->setEnabled( m_pPatchbay->canDisconnectSelected()); m_ui.DisconnectAllPushButton->setEnabled( m_pPatchbay->canDisconnectAll()); m_ui.ExpandAllPushButton->setEnabled(bExpandAll); } // Patchbay path accessor. const QString& qjackctlPatchbayForm::patchbayPath (void) const { return m_sPatchbayPath; } // Reset patchbay definition from scratch. void qjackctlPatchbayForm::newPatchbayFile ( bool bSnapshot ) { m_pPatchbay->clear(); m_sPatchbayPath.clear(); m_sPatchbayName = tr("Untitled%1").arg(m_iUntitled++); if (bSnapshot) m_pPatchbay->connectionsSnapshot(); // updateRecentPatchbays(); } // Load patchbay definitions from specific file path. bool qjackctlPatchbayForm::loadPatchbayFile ( const QString& sFileName ) { // Check if we're going to discard safely the current one... if (!queryClose()) return false; // We'll have a temporary rack... qjackctlPatchbayRack rack; // Step 1: load from file... if (!qjackctlPatchbayFile::load(&rack, sFileName)) { QMessageBox::critical(this, tr("Error") + " - " QJACKCTL_SUBTITLE1, tr("Could not load patchbay definition file: \n\n\"%1\"") .arg(sFileName), QMessageBox::Cancel); // Reset/disable further trials. m_sPatchbayPath.clear(); return false; } // Step 2: load from rack... m_pPatchbay->loadRack(&rack); // Step 3: stabilize form... m_sPatchbayPath = sFileName; m_sPatchbayName = QFileInfo(sFileName).completeBaseName(); // updateRecentPatchbays(); return true; } // Save current patchbay definition to specific file path. bool qjackctlPatchbayForm::savePatchbayFile ( const QString& sFileName ) { // We'll have a temporary rack... qjackctlPatchbayRack rack; // Step 1: save to rack... m_pPatchbay->saveRack(&rack); // Step 2: save to file... if (!qjackctlPatchbayFile::save(&rack, sFileName)) { QMessageBox::critical(this, tr("Error") + " - " QJACKCTL_SUBTITLE1, tr("Could not save patchbay definition file: \n\n\"%1\"") .arg(sFileName), QMessageBox::Cancel); return false; } // Step 3: stabilize form... m_sPatchbayPath = sFileName; m_sPatchbayName = QFileInfo(sFileName).completeBaseName(); // updateRecentPatchbays(); // Step 4: notify main form if applicable ... qjackctlMainForm *pMainForm = qjackctlMainForm::getInstance(); m_bActivePatchbay = (pMainForm && pMainForm->isActivePatchbay(m_sPatchbayPath)); if (m_bActivePatchbay) pMainForm->updateActivePatchbay(); return true; } // Dirty-(re)load patchbay definitions from know rack. void qjackctlPatchbayForm::loadPatchbayRack ( qjackctlPatchbayRack *pRack ) { // Step 1: load from rack... m_pPatchbay->loadRack(pRack); // Override dirty flag. m_ui.PatchbayView->setDirty(true); // Done. stabilizeForm(); } // Create a new patchbay definition from scratch. void qjackctlPatchbayForm::newPatchbay (void) { // Assume a snapshot from scratch... bool bSnapshot = false; // Ask user what he/she wants to do... qjackctlMainForm *pMainForm = qjackctlMainForm::getInstance(); if (pMainForm && (pMainForm->jackClient() || pMainForm->alsaSeq())) { switch (QMessageBox::information(this, tr("New Patchbay definition") + " - " QJACKCTL_SUBTITLE1, tr("Create patchbay definition as a snapshot\n" "of all actual client connections?"), QMessageBox::Yes | QMessageBox::No | QMessageBox::Cancel)) { case QMessageBox::Yes: bSnapshot = true; break; case QMessageBox::No: bSnapshot = false; break; default: // Cancel. return; } } // Check if we can discard safely the current one... if (!queryClose()) return; // Reset patchbay editor. newPatchbayFile(bSnapshot); updateRecentPatchbays(); stabilizeForm(); } // Load patchbay definitions from file. void qjackctlPatchbayForm::loadPatchbay (void) { QString sFileName = QFileDialog::getOpenFileName( this, tr("Load Patchbay Definition"), // Parent & Caption. m_sPatchbayPath, // Start here. tr("Patchbay Definition files") + " (*.xml)" // Filter (XML files) ); if (sFileName.isEmpty()) return; // Load it right away. if (loadPatchbayFile(sFileName)) updateRecentPatchbays(); stabilizeForm(); } // Save current patchbay definition to file. void qjackctlPatchbayForm::savePatchbay (void) { QString sFileName = QFileDialog::getSaveFileName( this, tr("Save Patchbay Definition"), // Parent & Caption. m_sPatchbayPath, // Start here. tr("Patchbay Definition files") + " (*.xml)" // Filter (XML files) ); if (sFileName.isEmpty()) return; // Enforce .xml extension... if (QFileInfo(sFileName).suffix().isEmpty()) sFileName += ".xml"; // Save it right away. if (savePatchbayFile(sFileName)) updateRecentPatchbays(); stabilizeForm(); } // A new patchbay has been selected void qjackctlPatchbayForm::selectPatchbay ( int iPatchbay ) { // Remember and avoid reloading the previous (first) selected one. if (iPatchbay > 0) { // Take care whether the first is untitled, and // thus not present in the recenet ptachbays list if (m_sPatchbayPath.isEmpty()) iPatchbay--; if (iPatchbay >= 0 && iPatchbay < m_recentPatchbays.count()) { // If we cannot load the new one, backout... loadPatchbayFile(m_recentPatchbays[iPatchbay]); updateRecentPatchbays(); } } stabilizeForm(); } // Set current active patchbay definition file. void qjackctlPatchbayForm::toggleActivePatchbay (void) { // Check if we're going to discard safely the current one... if (!queryClose()) return; // Activate it... qjackctlMainForm *pMainForm = qjackctlMainForm::getInstance(); if (pMainForm) { pMainForm->setActivePatchbay( m_bActivePatchbay ? QString::null : m_sPatchbayPath); } // Need to force/refresh the patchbay list... updateRecentPatchbays(); stabilizeForm(); } // Set/initialize the MRU patchbay list. void qjackctlPatchbayForm::setRecentPatchbays ( const QStringList& patchbays ) { m_recentPatchbays = patchbays; } // Update patchbay MRU variables and widgets. void qjackctlPatchbayForm::updateRecentPatchbays (void) { // TRye not to be reeentrant. if (m_iUpdate > 0) return; m_iUpdate++; // Update the visible combobox... const QIcon icon(":/images/patchbay1.png"); m_ui.PatchbayComboBox->clear(); if (m_sPatchbayPath.isEmpty()) { // Display a probable untitled patchbay... m_ui.PatchbayComboBox->addItem(icon, m_sPatchbayName); } else { // Remove from list if already there (avoid duplicates)... int iIndex = m_recentPatchbays.indexOf(m_sPatchbayPath); if (iIndex >= 0) m_recentPatchbays.removeAt(iIndex); // Put it to front... m_recentPatchbays.push_front(m_sPatchbayPath); } // Time to keep the list under limits. while (m_recentPatchbays.count() > 8) m_recentPatchbays.pop_back(); // Update the main setup list... qjackctlMainForm *pMainForm = qjackctlMainForm::getInstance(); if (pMainForm) pMainForm->setRecentPatchbays(m_recentPatchbays); QStringListIterator iter(m_recentPatchbays); while (iter.hasNext()) { const QString& sPatchbayPath = iter.next(); QString sText = QFileInfo(sPatchbayPath).completeBaseName(); if (pMainForm && pMainForm->isActivePatchbay(sPatchbayPath)) sText += " [" + tr("active") + "]"; m_ui.PatchbayComboBox->addItem(icon, sText); } // Sure this one must be currently selected. m_ui.PatchbayComboBox->setCurrentIndex(0); // stabilizeForm(); m_iUpdate--; } // Output socket list push button handlers gallore... void qjackctlPatchbayForm::addOSocket (void) { (m_pPatchbay->OSocketList())->addSocketItem(); } void qjackctlPatchbayForm::removeOSocket (void) { (m_pPatchbay->OSocketList())->removeSocketItem(); } void qjackctlPatchbayForm::editOSocket (void) { (m_pPatchbay->OSocketList())->editSocketItem(); } void qjackctlPatchbayForm::copyOSocket (void) { (m_pPatchbay->OSocketList())->copySocketItem(); } void qjackctlPatchbayForm::moveUpOSocket (void) { (m_pPatchbay->OSocketList())->moveUpSocketItem(); } void qjackctlPatchbayForm::moveDownOSocket (void) { (m_pPatchbay->OSocketList())->moveDownSocketItem(); } // Input socket list push button handlers gallore... void qjackctlPatchbayForm::addISocket (void) { (m_pPatchbay->ISocketList())->addSocketItem(); } void qjackctlPatchbayForm::removeISocket (void) { (m_pPatchbay->ISocketList())->removeSocketItem(); } void qjackctlPatchbayForm::editISocket (void) { (m_pPatchbay->ISocketList())->editSocketItem(); } void qjackctlPatchbayForm::copyISocket (void) { (m_pPatchbay->ISocketList())->copySocketItem(); } void qjackctlPatchbayForm::moveUpISocket (void) { (m_pPatchbay->ISocketList())->moveUpSocketItem(); } void qjackctlPatchbayForm::moveDownISocket (void) { (m_pPatchbay->ISocketList())->moveDownSocketItem(); } // Connect current selected ports. void qjackctlPatchbayForm::connectSelected (void) { m_pPatchbay->connectSelected(); } // Disconnect current selected ports. void qjackctlPatchbayForm::disconnectSelected (void) { m_pPatchbay->disconnectSelected(); } // Disconnect all connected ports. void qjackctlPatchbayForm::disconnectAll (void) { m_pPatchbay->disconnectAll(); } // Expand all socket items. void qjackctlPatchbayForm::expandAll (void) { m_pPatchbay->expandAll(); } // Keyboard event handler. void qjackctlPatchbayForm::keyPressEvent ( QKeyEvent *pKeyEvent ) { #ifdef CONFIG_DEBUG_0 qDebug("qjackctlPatchbayForm::keyPressEvent(%d)", pKeyEvent->key()); #endif int iKey = pKeyEvent->key(); switch (iKey) { case Qt::Key_Escape: close(); break; default: QWidget::keyPressEvent(pKeyEvent); break; } } // end of qjackctlPatchbayForm.cpp qjackctl-0.4.2/src/PaxHeaders.14935/translations0000644000000000000000000000013212700760152016306 xustar0030 mtime=1459871850.633915289 30 atime=1459871850.627912288 30 ctime=1459871850.633915289 qjackctl-0.4.2/src/translations/0000755000175000001440000000000012700760152017127 5ustar00rncbcusers00000000000000qjackctl-0.4.2/src/translations/PaxHeaders.14935/qjackctl_cs.ts0000644000000000000000000000013212700760152021214 xustar0030 mtime=1459871850.629913288 30 atime=1459871850.627912288 30 ctime=1459871850.629913288 qjackctl-0.4.2/src/translations/qjackctl_cs.ts0000644000175000001440000050513512700760152021771 0ustar00rncbcusers00000000000000 PortAudioProber Probing... ZjiŔńuje se... Please wait, PortAudio is probing audio hardware. Počkejte, prosĆ­m, PortAudio zjiŔńuje zvukový hardware. Warning VarovĆ”nĆ­ Audio hardware probing timed out. DoÅ”lo k překročenĆ­ času při zjiŔńovĆ”nĆ­ zvukovĆ©ho hardware. QObject (default) (výchozĆ­) Usage: %1 [options] [command-and-args] PoužitĆ­: %1 [volby] [příkazy a argumenty] Options: Volby: Start JACK audio server immediately JACK audioserver spustit okamžitě Show help about command line options UkĆ”zat nĆ”povědu k volbĆ”m (argumentÅÆm) příkazovĆ©ho řÔdku Show version information UkĆ”zat informace o verzi Option -p requires an argument (preset). Volba -p vyžaduje argument (preset, přednastavenĆ­). Qt: %1 Qt: %1 Set default settings preset name Určit nĆ”zev přednastavenĆ­ výchozĆ­ho nastavenĆ­ Set active patchbay definition file Nastavit soubor s vymezenĆ­m činnĆ© zapojovacĆ­ desky Option -a requires an argument (path). Volba -a vyžaduje argument (cesta). Set default JACK audio server name Nastavit výchozĆ­ nĆ”zev pro zvukový server JACK Option -n requires an argument (name). Volba -n vyžaduje argument (nĆ”zev). %1 (%2 frames) %1 (%2 snĆ­mkÅÆ) qjackctlAboutForm About QjackCtl O QjackCtl &Close &Zavřít About Qt O Qt Version Verze Build SestavenĆ­ Using: JACK %1 PoužívĆ” se: JACK %1 Debugging option enabled. Povolena volba pro laděnĆ­. System tray disabled. ZakĆ”zĆ”na oznamovacĆ­ oblast. Transport status control disabled. ZakĆ”zĆ”no ovlĆ”dĆ”nĆ­ stavu předĆ”nĆ­. Realtime status disabled. ZakĆ”zĆ”n stav provĆ”děnĆ­ ve skutečnĆ©m čase. XRUN delay status disabled. ZakĆ”zĆ”n stav zpožděnĆ­ XRUN. Maximum delay status disabled. ZakĆ”zĆ”n stav největŔího zpožděnĆ­. JACK MIDI support disabled. JACK MIDI nenĆ­ podporovĆ”n. JACK Session support disabled. Podpora pro sezenĆ­ JACK byla zakĆ”zĆ”na. ALSA/MIDI sequencer support disabled. ALSA/MIDI řadič (sequencer) nenĆ­ podporovĆ”n. Website StrĆ”nky This program is free software; you can redistribute it and/or modify it Tento program je svobodným programem. Můžete jej Ŕířit a/nebo upravit under the terms of the GNU General Public License version 2 or later. za podmĆ­nek GNU General Public License ve verzi 2 nebo pozdějŔí. JACK Port aliases support disabled. Podpora pro přezdĆ­vky přípojek JACK zakĆ”zĆ”na. D-Bus interface support disabled. Podpora pro rozhranĆ­ D-Bus zakĆ”zĆ”na. qjackctlClientListView Readable Clients / Output Ports ČitelnĆ© přípojky pro klienty/výstupy Writable Clients / Input Ports ZapisovatelnĆ© přípojky pro klienty/výstupy &Connect &Spojit Alt+C Connect Alt+C &Disconnect &Rozpojit Alt+D Disconnect Alt+D Disconnect &All &Rozpojit vÅ”e Alt+A Disconect All Alt+A Re&name &Přejmenovat Alt+N Rename Alt+N &Refresh &Obnovit Alt+R Refresh Alt+R qjackctlConnect Warning VarovĆ”nĆ­ This will suspend sound processing from all client applications. Are you sure? TĆ­mto se pozastavĆ­ zpracovĆ”nĆ­ zvuku u vÅ”ech klientských aplikacĆ­. Jste si jistý? qjackctlConnectionsForm Connections - JACK Audio Connection Kit SpojenĆ­ - JACK Audio Connection Kit Audio Zvuk Connect currently selected ports Spojit nynĆ­ vybranĆ© přípojky &Connect &Spojit Disconnect currently selected ports Rozpojit nynĆ­ vybranĆ© přípojky &Disconnect &Rozpojit Disconnect all currently connected ports Rozpojit vÅ”echny nynĆ­ spojenĆ© přípojky Disconnect &All &Rozpojit vÅ”e Expand all client ports Rozbalit vÅ”echny klientskĆ© přípojky E&xpand All Rozbalit &vÅ”e Refresh current connections view Obnovit pohled na nynějŔí spojenĆ­ &Refresh &Obnovit MIDI JACK-MIDI ALSA ALSA-MIDI Warning VarovĆ”nĆ­ The preset aliases have been changed: "%1" Do you want to save the changes? PřezdĆ­vky pro přednastavenĆ­ byly změněny: "%1" Chcete uložit změny? qjackctlConnectorView &Connect &Spojit Alt+C Connect Alt+C &Disconnect &Rozpojit Alt+D Disconnect Alt+D Disconnect &All Rozpojit &vÅ”e Alt+A Disconect All Alt+A &Refresh &Obnovit Alt+R Refresh Alt+R qjackctlMainForm QjackCtl QjackCtl Quit processing and exit Ukončit zpracovĆ”nĆ­ signĆ”lu a ukončit program &Quit &Ukončit Start the JACK server Spustit server JACK &Start &Spustit Stop the JACK server Zastavit server JACK S&top &Zastavit St&atus &Stav Show information about this application UkĆ”zat informace o tĆ©to aplikaci Ab&out... &O... Set&up... &NastavenĆ­... Show settings and options dialog UkĆ”zat dialogovĆ© okno pro nastavenĆ­ a volby &Messages &HlÔŔenĆ­ Show/hide the patchbay editor window UkĆ”zat/Skrýt okno editoru se zapojovacĆ­ deskou &Patchbay &ZapojovacĆ­ deska Show/hide the actual connections patchbay window UkĆ”zat/Skrýt okno se zapojovacĆ­ deskou se stĆ”vajĆ­cĆ­mi spojenĆ­mi &Connect &Spojit JACK server state Stav serveru JACK JACK server mode Režim serveru JACK DSP Load ZatíženĆ­ DSP Sample rate VzorkovacĆ­ kmitočet XRUN Count (notifications) Počet XRUN (oznĆ”menĆ­) Time display Údaj o čase Transport state Stav předĆ”nĆ­ Transport BPM PředĆ”nĆ­ BPM Transport time Čas předĆ”nĆ­ Show/hide the session management window UkĆ”zat/Skrýt okno se sprĆ”vou sezenĆ­ Show/hide the messages log/status window UkĆ”zat/Skrýt okno se zĆ”pisy/stavem hlÔŔenĆ­ Backward transport PředĆ”nĆ­ zpět &Backward &Zpět Forward transport PředĆ”nĆ­ dopředu &Forward &Dopředu Rewind transport PředĆ”nĆ­ přetočit zpět &Rewind &Přetočit zpět Stop transport rolling Zastavit chod předĆ”nĆ­ Pa&use &Pozastavit Start transport rolling Spustit chod předĆ”nĆ­ &Play &PřehrĆ”t Could not open ALSA sequencer as a client. ALSA MIDI patchbay will be not available. Nepodařilo se otevřít řadič (sekvencer) ALSA jako klienta. ZapojovacĆ­ deska ALSA MIDI nebude dostupnĆ”. D-BUS: Service is available (%1 aka jackdbus). D-BUS: Služba je dostupnĆ” (%1 aka jackdbus). D-BUS: Service not available (%1 aka jackdbus). D-BUS: Služba nenĆ­ dostupnĆ” (%1 aka jackdbus). Information Informace Warning VarovĆ”nĆ­ JACK is currently running. Do you want to terminate the JACK audio server? Server JACK nynĆ­ běží. Chcete ukončit zvukový server JACK? successfully ĆŗspěŔně with exit status=%1 s vrĆ”cenou hodnotou = %1 Could not start JACK. Maybe JACK audio server is already started. JACK se nepodařilo spustit. MožnĆ” je server JACK už spuÅ”těn. Could not load preset "%1". Retrying with default. NastavenĆ­ "%1" se nepodařilo nahrĆ”t. ZkouŔí se znovu s výchozĆ­m přednastavenĆ­m. Could not load default preset. Sorry. Nepodařilo se nahrĆ”t výchozĆ­ přednastavenĆ­. Promiňte. Startup script... Skript pro spuÅ”těnĆ­... Startup script terminated Skript pro spuÅ”těnĆ­ ukončen D-BUS: JACK server is starting... D-BUS: SpouÅ”tĆ­ se server JACK... D-BUS: JACK server could not be started. Sorry D-BUS: Server JACK se nepodařilo spustit. Promiňte JACK is starting... JACK se spouÅ”tĆ­... Some client audio applications are still active and connected. Do you want to stop the JACK audio server? NěkterĆ© z klientských zvukových aplikacĆ­ jsou stĆ”le činnĆ© a spojenĆ©. Chcete zastavit zvukový server JACK? JACK is stopping... JACK se zastavuje... Shutdown script... Skript pro zastavenĆ­ chodu... Don't ask this again Neptat se znovu Shutdown script terminated Skript pro zastavenĆ­ chodu ukončen D-BUS: JACK server is stopping... D-BUS: Zastavuje se server JACK... D-BUS: JACK server could not be stopped. Sorry D-BUS: Server JACK se nepodařilo zastavit. Promiňte Post-shutdown script... Skript pro po-zastavenĆ­ chodu... Post-shutdown script terminated Skript pro po-zastavenĆ­ chodu ukončen JACK was started with PID=%1. JACK byl puÅ”těn s PID = %1. D-BUS: JACK server was started (%1 aka jackdbus). D-BUS: Server JACK byl spuÅ”těn (%1 aka jackdbus). JACK is being forced... JACK je nucen... JACK was stopped JACK byl zastaven D-BUS: JACK server was stopped (%1 aka jackdbus). D-BUS: Server JACK byl zastaven (%1 aka jackdbus). Error Chyba Transport time code PředĆ”nĆ­ časovĆ©ho kódu Elapsed time since last reset Čas uplynulý od poslednĆ­ho znovunastavenĆ­ Elapsed time since last XRUN Čas uplynulý od poslednĆ­ho XRUN Patchbay activated. ZapojovacĆ­ deska uvedena do chodu. Patchbay deactivated. ZapojovacĆ­ deska vyřazena z provozu. Statistics reset. Nastavit znovu statistiku. msec ms JACK connection graph change. NĆ”kres spojenĆ­ JACK změněn. XRUN callback (%1). ZavolĆ”nĆ­ nazpĆ”tek XRUN (%1). Buffer size change (%1). Velikost vyrovnĆ”vacĆ­ paměti změněna (%1). Shutdown notification. OznĆ”menĆ­ o zastavenĆ­. Could not start JACK. Sorry. Nepodařilo se spustit JACK. Promiňte. JACK has crashed. JACK spadl. JACK timed out. PřekročenĆ­ času u JACK. JACK write error. Chyba při psanĆ­ u JACK. JACK read error. Chyba při čtenĆ­ u JACK. Unknown JACK error (%d). NeznĆ”mĆ” chyba u JACK (%d). ALSA connection graph change. NĆ”kres spojenĆ­ ALSA změněn. JACK active patchbay scan ProhlĆ©dnutĆ­ činnĆ© zapojovacĆ­ desky JACK ALSA active patchbay scan ProhlĆ©dnutĆ­ činnĆ© zapojovacĆ­ desky ALSA JACK connection change. SpojenĆ­ JACK změněno. ALSA connection change. SpojenĆ­ ALSA změněno. checked přezkouÅ”eno connected spojeno disconnected rozpojeno failed nepodařilo se A patchbay definition is currently active, which is probable to redo this connection: %1 -> %2 Do you want to remove the patchbay connection? VymezenĆ­ zapojovacĆ­ desky je nynĆ­ aktivnĆ­, což pravděpodobně znamenĆ” předělat toto spojenĆ­: %1 -> %2 Chcete odstranit spojenĆ­ zapojovacĆ­ desky? The program will keep running in the system tray. To terminate the program, please choose "Quit" in the context menu of the system tray icon. Program poběží dĆ”le v oznamovacĆ­ ÄĆ”sti panelu. Pro ukončenĆ­ programu vyberte, prosĆ­m, "Ukončit" v souvisejĆ­cĆ­ nabĆ­dce vyskakujĆ­cĆ­ z ikony v oznamovacĆ­ ÄĆ”sti panelu. Don't show this message again Toto hlÔŔenĆ­ neukazovat znovu Transport BBT (bar.beat.ticks) PředĆ”nĆ­ BBT (takt:doba.tiknutĆ­ - bar:beat.ticks) Patchbay reset. UvedenĆ­ zapojovacĆ­ desky do výchozĆ­ho stavu. Could not load active patchbay definition. "%1" Disabled. Nepodařilo se nahrĆ”t vymezenĆ­ aktivnĆ­ zapojovacĆ­ desky. "%1" ZakĆ”zĆ”no. JACK property change. Vlastnost JACK změněna. Overall operation failed. CelkovĆ” operace se nezdařila. Invalid or unsupported option. NeplatnĆ” nebo nepodporovanĆ” volba. Client name not unique. NĆ”zev klienta nenĆ­ jedinečný. Server is started. Server je spuÅ”těn. Unable to connect to server. Nelze se připojit k serveru. Server communication error. Chyba spojenĆ­ se serverem. Client does not exist. Klient neexistuje. Unable to load internal client. Nepodařilo se nahrĆ”t vnitřnĆ­ho klienta. Unable to initialize client. Nepodařilo se inicializovat vnitřnĆ­ho klienta. Unable to access shared memory. Nepodařilo se přistoupit ke sdĆ­lenĆ© paměti. Client protocol version mismatch. NevhodnĆ” verze klientskĆ©ho protokolu. Could not connect to JACK server as client. - %1 Please check the messages window for more info. Nepodařilo se připojit k serveru JACK jako klient. - %1 DalŔí informace hledejte, prosĆ­m, v okně s hlÔŔenĆ­m. Server configuration saved to "%1". NastavenĆ­ serveru uloženo do "%1". Client activated. Klient uveden do chodu. Post-startup script... Skript pro po-spuÅ”těnĆ­... Post-startup script terminated Skript pro po-spuÅ”těnĆ­ ukončen Command line argument... Argument pro příkazový řÔdek... Command line argument started Argument pro příkazový řÔdek spuÅ”těn Client deactivated. Klient vyřazen z provozu. Transport rewind. PředĆ”nĆ­ přetočit zpět. Transport backward. PředĆ”nĆ­ zpět. Starting SpouÅ”tĆ­ se Transport start. Spustit předĆ”nĆ­. Stopping Zastavuje se Transport stop. Zastavit předĆ”nĆ­. Transport forward. PředĆ”nĆ­ dopředu. Stopped Zastaveno %1 (%2%) %1 (%2 %) %1 (%2%, %3 xruns) %1 (%2%, %3 xruns) %1 % %1 % %1 Hz %1 Hz %1 frames %1 snĆ­mkÅÆ Yes Ano No Ne RT RT Rolling Jede Looping ZapĆ­nĆ” se do jednoduchĆ©ho obvodu %1 msec %1 ms XRUN callback (%1 skipped). ZavolĆ”nĆ­ nazpĆ”tek XRUN (%1 přeskočeno). Started Běží Active Činný Activating UvĆ”dĆ­ se do chodu Inactive Nečinný &Hide &Skrýt Mi&nimize &ZmenÅ”it S&how &UkĆ”zat Rest&ore &NahrĆ”t znovu &Stop &Zastavit &Reset &Nastavit znovu &Presets &PřednastavenĆ­ &Versioning &VerzovĆ”nĆ­ Re&fresh Ob&novit S&ession &SezenĆ­ &Load... &NahrĆ”t... &Save... &Uložit... Save and &Quit... Uložit a &ukončit... Save &Template... Uložit jako &předlohu... &Connections &SpojenĆ­ Patch&bay &ZapojovacĆ­ deska &Transport &PředĆ”nĆ­ Server settings will be only effective after restarting the JACK audio server. NastavenĆ­ serveru se projevĆ­ až po novĆ©m spuÅ”těnĆ­ serveru JACK. D-BUS: SetParameterValue('%1', '%2'): %3. (%4) D-BUS: Nastavit hodnotu parametru SetParameterValue('%1', '%2'): %3. (%4) D-BUS: ResetParameterValue('%1'): %2. (%3) D-BUS: Nastavit znovu hodnotu parametru ResetParameterValue('%1'): %2. (%3) D-BUS: GetParameterValue('%1'): %2. (%3) D-BUS: ZĆ­skat hodnotu parametru GetParameterValue('%1'): %2. (%3) Some settings will be only effective the next time you start this program. NěkterĆ” nastavenĆ­ se projevĆ­ až tehdy, když příŔtě spustĆ­te tento program. qjackctlMessagesStatusForm Messages / Status - JACK Audio Connection Kit HlÔŔenĆ­/Stav - JACK Audio Connection Kit &Messages &HlÔŔenĆ­ Messages log ZĆ”pis hlÔŔenĆ­ Messages output log ZĆ”pis hlÔŔenĆ­ o výstupu &Status &Stav Status information Informace o stavu Statistics since last server startup Statistika od poslednĆ­ho spuÅ”těnĆ­ serveru Description Popis Value Hodnota Reset XRUN statistic values Nastavit znovu Ćŗdaje ve statistice XRUN Re&set &Nastavit znovu Refresh XRUN statistic values Obnovit Ćŗdaje ve statistice XRUN &Refresh &Obnovit Server name NĆ”zev serveru Server state Stav serveru DSP Load ZatíženĆ­ DSP Sample Rate VzorkovacĆ­ kmitočet Buffer Size Velikost vyrovnĆ”vacĆ­ paměti Realtime Mode Režim skutečnĆ©ho času Transport state Stav předĆ”nĆ­ Transport Timecode PředĆ”nĆ­ časovĆ©ho kódu Transport BBT PředĆ”nĆ­ BBT Transport BPM PředĆ”nĆ­ BPM XRUN count since last server startup Počet XRUN od poslednĆ­ho spuÅ”těnĆ­ serveru XRUN last time detected Čas poslednĆ­ho zjiÅ”těnĆ­ XRUN XRUN last PoslednĆ­ XRUN XRUN maximum NejvětŔí počet XRUN XRUN minimum NejmenŔí počet XRUN XRUN average PrÅÆměrný počet XRUN XRUN total Celkový počet XRUN Maximum scheduling delay NejvětŔí zpožděnĆ­ času Time of last reset Čas poslednĆ­ho znovunastavenĆ­ Logging stopped --- %1 --- ZĆ”pis zastaven --- %1 --- Logging started --- %1 --- ZĆ”pis spuÅ”těn --- %1 --- qjackctlPatchbay Warning VarovĆ”nĆ­ This will disconnect all sockets. Are you sure? Tento krok odpojĆ­ vÅ”echny zĆ”suvky. Jste si jistýr? qjackctlPatchbayForm Patchbay - JACK Audio Connection Kit ZapojovacĆ­ deska - JACK Audio Connection Kit Move currently selected output socket down one position Posunout nynĆ­ vybranĆ© výstupnĆ­ zĆ”suvky dolÅÆ o jedno mĆ­sto Down DolÅÆ Create a new output socket Vytvořit novou výstupnĆ­ zĆ”suvku Add... Přidat... Edit currently selected input socket properties Upravit vlastnosti nynĆ­ vybranĆ© vstupnĆ­ zĆ”suvky Edit... Upravit... Move currently selected output socket up one position Posunout nynĆ­ vybranĆ© výstupnĆ­ zĆ”suvky nahoru o jedno mĆ­sto Up Nahoru Remove currently selected output socket Odstranit nynĆ­ vybranou výstupnĆ­ zĆ”suvku Remove Odstranit Duplicate (copy) currently selected output socket Zdvojit (kopĆ­rovat) nynĆ­ vybranou výstupnĆ­ zĆ”suvku Copy... KopĆ­rovat... Remove currently selected input socket Odstranit nynĆ­ vybranou vstupnĆ­ zĆ”suvku Duplicate (copy) currently selected input socket Zdvojit (kopĆ­rovat) nynĆ­ vybranou vstupnĆ­ zĆ”suvku Create a new input socket Vytvořit novou vstupnĆ­ zĆ”suvku Edit currently selected output socket properties Upravit vlastnosti nynĆ­ vybranĆ© výstupnĆ­ zĆ”suvky Connect currently selected sockets Spojit nynĆ­ vybranĆ© zĆ”suvky &Connect &Spojit Disconnect currently selected sockets Odpojit nynĆ­ vybranĆ© zĆ”suvky &Disconnect &Odpojit Disconnect all currently connected sockets Odpojit vÅ”echny nynĆ­ spojenĆ© zĆ”suvky Disconnect &All &Odpojit vÅ”e Expand all items Rozbalit vÅ”echny položky E&xpand All Rozbalit &vÅ”e Refresh current patchbay view Obnovit nynějŔí pohled na zapojovacĆ­ desku &Refresh &Obnovit Create a new patchbay profile Vytvořit nový profil zapojovacĆ­ desky &New &Nový Load patchbay profile NahrĆ”t profil zapojovacĆ­ desky &Load... &NahrĆ”t... Save current patchbay profile Uložit nynějŔí profil zapojovacĆ­ desky &Save... &Uložit... Current (recent) patchbay profile(s) NynějŔí (naposledy použitĆ©) profil(y) zapojovacĆ­ desky Toggle activation of current patchbay profile Přepnout spuÅ”těnĆ­ nynějŔího profilu zapojovacĆ­ desky Acti&vate &Spustit Warning VarovĆ”nĆ­ The patchbay definition has been changed: "%1" Do you want to save the changes? VymezenĆ­ zapojovacĆ­ desky bylo změněno: "%1" Chcete uložit změny? %1 [modified] %1 [změněn] Untitled%1 Bez nĆ”zvu%1 Error Chyba Could not load patchbay definition file: "%1" Nepodařilo se nahrĆ”t soubor s vymezenĆ­m zapojovacĆ­ desky: "%1" Could not save patchbay definition file: "%1" Nepodařilo se uložit soubor s vymezenĆ­m zapojovacĆ­ desky: "%1" New Patchbay definition NovĆ© vymezenĆ­ zapojovacĆ­ desky Create patchbay definition as a snapshot of all actual client connections? Vytvořit vymezenĆ­ zapojovacĆ­ desky jako snĆ­mek vÅ”ech skutečných klientských spojenĆ­? Load Patchbay Definition NahrĆ”t vymezenĆ­ zapojovacĆ­ desky Patchbay Definition files Soubory s vymezenĆ­m zapojovacĆ­ desky Save Patchbay Definition Uložit vymezenĆ­ zapojovacĆ­ desky active činný qjackctlPatchbayView Add... Přidat... Edit... Upravit... Copy... KopĆ­rovat... Remove Odstranit Exclusive VýhradnĆ­ Forward Dopředu (None) (ŽÔdný) Move Up Přesunout nahoru Move Down Přesunout dolÅÆ &Connect &Spojit Alt+C Connect Alt+C &Disconnect &Rozpojit Alt+D Disconnect Alt+D Disconnect &All &Rozpojit vÅ”e Alt+A Disconect All Alt+A &Refresh &Obnovit Alt+R Refresh Alt+R qjackctlSessionForm Session - JACK Audio Connection Kit SezenĆ­ - JACK Audio Connection Kit Load session NahrĆ”t sezenĆ­ &Load... &NahrĆ”t... Recent session Naposledy otevřenĆ© sezenĆ­ &Recent &Naposledy otevřenĆ© Save session Uložit sezenĆ­ Save session versioning Uložit verzovĆ”nĆ­ sezenĆ­ &Versioning &VerzovĆ”nĆ­ Re&fresh Ob&novit Session clients / connections Klienti sezenĆ­/spojenĆ­ Infra-clients / commands Infra-klienti/Příkazy Infra-client Infra-klient Infra-command Infra-příkaz Add infra-client Přidat infra-klient &Add Přid&at Edit infra-client Upravit infra-klient &Edit &Upravit Remove infra-client Odstranit infra-klient Re&move &Odstranit &Save... &Uložit... Update session Obnovit sezenĆ­ Client / Ports Klient/Přípojky UUID UUID Command Příkaz &Save &Uložit Load Session NahrĆ”t sezenĆ­ Session directory AdresÔř se sezenĆ­m Save Session Uložit sezenĆ­ and Quit a ukončit Template Předloha &Clear &Smazat Warning VarovĆ”nĆ­ A session could not be found in this folder: "%1" SezenĆ­ se v tĆ©to složce nepodařilo nalĆ©zt: "%1" %1: loading session... %1: nahrĆ”vĆ” se sezenĆ­... %1: load session %2. %1: nahrĆ”t sezenĆ­ %2. A session already exists in this folder: "%1" Are you sure to overwrite the existing session? V tĆ©to složce již existuje sezenĆ­: "%1" Jste si jistý, že chcete přepsat stĆ”vajĆ­cĆ­ sezenĆ­? This folder already exists and is not empty: "%1" Are you sure to overwrite the existing folder? Tato složka již existuje a nenĆ­ prĆ”zdnĆ”: "%1" Jste si jistý, že chcete přepsat stĆ”vajĆ­cĆ­ složku? %1: saving session... %1: uklĆ”dĆ” se sezenĆ­... %1: save session %2. %1: uložit sezenĆ­ %2. New Client Nový klient Save and &Quit... Uložit a &ukončit... Save &Template... Uložit jako &předlohu... qjackctlSessionInfraClientItemEditor Infra-command Infra-příkaz qjackctlSetupForm Setup - JACK Audio Connection Kit NastavenĆ­ - JACK Audio Connection Kit Settings NastavenĆ­ Preset &Name: &NĆ”zev přednastavenĆ­: Settings preset name NĆ”zev pro přednastavenĆ­ nastavenĆ­ (default) (výchozĆ­) Save settings as current preset name Uložit nastavenĆ­ s nynějŔím nĆ”zvem přednastavenĆ­ &Save &Uložit Delete current settings preset Smazat přednastavenĆ­ nynějŔího nastavenĆ­ &Delete &Smazat jackd jackd jackdmp jackdmp jackstart jackstart Driv&er: &Ovladač: The audio backend driver interface to use RozhranĆ­ ovladače k zadnĆ­ ÄĆ”sti zvuku, kterĆ© se bude používat dummy dummy sun sun oss oss alsa alsa portaudio portaudio coreaudio coreaudio freebob freebob firewire firewire Parameters Parametry MIDI Driv&er: Ovla&dač MIDI: The ALSA MIDI backend driver to use Ovladač k zadnĆ­ ÄĆ”sti ALSA MIDI, který se bude používat none žÔdný raw raw seq seq Time in seconds that client is delayed after server startup Čas v sekundĆ”ch, o který je klient opožděn po spuÅ”těnĆ­ serveru Latency: Prodleva: Output latency in milliseconds, calculated based on the period, rate and buffer settings VýstupnĆ­ prodleva v milisekundĆ”ch, jejíž výpočet je založen na nastavenĆ­ ĆŗdobĆ­ (period), rychlosti (snĆ­mĆ”nĆ­) a vyrovnĆ”vacĆ­ paměti Use realtime scheduling Použít zpracovĆ”nĆ­ ve skutečnĆ©m čase &Realtime &Skutečný čas Do not attempt to lock memory, even if in realtime mode NepokouÅ”ejte se uzamknout paměń, dokonce ani v režimu skutečnĆ©ho času No Memory Loc&k &Neuzamknout paměń Unlock memory of common toolkit libraries (GTK+, QT, FLTK, Wine) Odemknout paměń běžných knihoven s nĆ”stroji (GTK+, QT, FLTK, Wine) &Unlock Memory &Odemknout paměń Ignore xruns reported by the backend driver Přehlížet xruns hlÔŔenĆ© ovladačem zadnĆ­ ÄĆ”sti So&ft Mode &Snadný režim Provide output monitor ports Poskytnout přípojky pro sledovĆ”nĆ­ výstupu &Monitor &SledovĆ”nĆ­ Force 16bit mode instead of failing over 32bit (default) Vynutit 16bitový režim namĆ­sto selhĆ”nĆ­ ve 32bitovĆ©m (výchozĆ­) Force &16bit Vynutit &16bitový režim Enable hardware monitoring of capture ports Povolit přístrojovĆ© sledovĆ”nĆ­ zachytĆ”vacĆ­ch přípojek H/W M&onitor H/W &sledovĆ”nĆ­ Enable hardware metering on cards that support it Povolit přístrojovĆ© měřenĆ­ u karet, kterĆ© to podporujĆ­ H/&W Meter H/&W měřidlo Ignore hardware period/buffer size Přehlížet ĆŗdobĆ­ (periodu)/velikost vyrovnĆ”vacĆ­ paměti přístroje &Ignore H/W &Přehlížet H/W Whether to give verbose output on messages DĆ”t hlÔŔenĆ­m podrobný výstup &Verbose messages &PodrobnĆ” hlÔŔenĆ­ &Output Device: &VýstupnĆ­ zařízenĆ­: &Interface: &RozhranĆ­: Maximum input audio hardware channels to allocate NejvětŔí množstvĆ­ přidělitelných vstupnĆ­ch zvukových přístrojových kanĆ”lÅÆ &Audio: &Zvuk: Dit&her: &VloženĆ­ Å”umu do signĆ”lu (dithering): External output latency (frames) VnějŔí výstupnĆ­ prodleva (snĆ­mky) &Input Device: Vstup&nĆ­ zařízenĆ­: Provide either audio capture, playback or both Poskytnout buď zachytĆ”vĆ”nĆ­ zvuku, přehrĆ”vĆ”nĆ­ nebo obojĆ­ Duplex Zdvojený Capture Only Pouze zachytĆ”vĆ”nĆ­ Playback Only Pouze přehrĆ”vĆ”nĆ­ The PCM device name to use NĆ”zev používanĆ©ho zařízenĆ­ PCM hw:0 hw:0 plughw:0 plughw:0 /dev/audio /dev/audio /dev/dsp /dev/dsp > > Alternate input device for capture Střídat vstupnĆ­ zařízenĆ­ pro zachytĆ”vĆ”nĆ­ Maximum output audio hardware channels to allocate NejvětŔí množstvĆ­ přidělitelných výstupnĆ­ch zvukových přístrojových kanĆ”lÅÆ Alternate output device for playback Střídat výstupnĆ­ zařízenĆ­ pro přehrĆ”vĆ”nĆ­ External input latency (frames) VnějŔí vstupnĆ­ prodleva (snĆ­mky) Set dither mode Nastavit režim vloženĆ­ Å”umu do signĆ”lu (dithering) None ŽÔdný Rectangular ObdĆ©lnĆ­kový Shaped ObalovĆ” křivka Triangular TrojĆŗhelnĆ­kový Number of periods in the hardware buffer Počet ĆŗdobĆ­ (period) ve vyrovnĆ”vacĆ­ paměti přístroje Priorit&y: &Přednost: &Frames/Period: &SnĆ­mky/ÚdobĆ­ (perioda): Frames per period between process() calls SnĆ­mkÅÆ za ĆŗdobĆ­ (periodu) mezi volĆ”nĆ­m process() Aufrufen 16 16 32 32 64 64 128 128 256 256 512 512 1024 1024 2048 2048 4096 4096 Port Ma&ximum: &NejvětŔí počet přípojek: &Channels: &KanĆ”ly: 21333 21333 Sample rate in frames per second VzorkovacĆ­ kmitočet (rychlost snĆ­mkovĆ”nĆ­) ve snĆ­mcĆ­ch za sekundu 22050 22050 32000 32000 44100 44100 48000 48000 88200 88200 96000 96000 192000 192000 Scheduler priority when running realtime Přednost rozvrhu při běhu ve skutečnĆ©m čase &Word Length: &DĆ©lka slova: Periods/&Buffer: Ú&dobĆ­/VyrovnĆ”vacĆ­ paměń: Word length DĆ©lka slova Maximum number of ports the JACK server can manage NejvětŔí počet přípojek, kterĆ© server JACK může spravovat &Wait (usec): &Čekat (µs): Sample &Rate: VzorkovacĆ­ &kmitočet: Maximum number of audio channels to allocate NejvětŔí množstvĆ­ přidělitelných zvukových kanĆ”lÅÆ &Timeout (msec): &PřekročenĆ­ času (ms): Set client timeout limit in miliseconds Nastavit mez pro překročenĆ­ času u klienta; Ćŗdaj v milisekundĆ”ch 200 200 500 500 1000 1000 2000 2000 5000 5000 10000 10000 &Channels I/O: &KanĆ”ly vstup/výstup: &Latency I/O: &Prodleva vstup/výstup: Server Suffi&x: Příp&ona serveru: Start De&lay: &ZpožděnĆ­ spuÅ”těnĆ­: secs s 0 msecs 0 ms Advanced PokročilĆ© Options Volby Scripting SkriptovĆ”nĆ­ Whether to execute a custom shell script before starting up the JACK audio server. ProvĆ©st vlastnĆ­ shellový skript před spuÅ”těnĆ­m zvukovĆ©ho serveru JACK. Execute script on Start&up: ProvĆ©st skript při &spuÅ”těnĆ­: Whether to execute a custom shell script after starting up the JACK audio server. ProvĆ©st vlastnĆ­ shellový skript po spuÅ”těnĆ­ zvukovĆ©ho serveru JACK. Execute script after &Startup: ProvĆ©st skript &po spuÅ”těnĆ­: Whether to execute a custom shell script before shuting down the JACK audio server. ProvĆ©st vlastnĆ­ shellový skript před zastavenĆ­m zvukovĆ©ho serveru JACK. Execute script on Shut&down: ProvĆ©st skript při zasta&venĆ­: Command line to be executed before starting up the JACK audio server Příkazový řÔdek k provedenĆ­ před spuÅ”těnĆ­m zvukovĆ©ho serveru JACK Scripting argument meta-symbols Meta symboly pro argument při skriptovĆ”nĆ­ Browse for script to be executed before starting up the JACK audio server Vybrat skript, který se provede před spuÅ”těnĆ­m zvukovĆ©ho serveru JACK ... ... Command line to be executed after starting up the JACK audio server Příkazový řÔdek k provedenĆ­ po spuÅ”těnĆ­ zvukovĆ©ho serveru JACK Browse for script to be executed after starting up the JACK audio server Vybrat skript, který se provede po spuÅ”těnĆ­ zvukovĆ©ho serveru JACK Browse for script to be executed before shutting down the JACK audio server Vybrat skript, který se provede před zastavenĆ­m zvukovĆ©ho serveru JACK Command line to be executed before shutting down the JACK audio server Příkazový řÔdek k provedenĆ­ před zastavenĆ­m zvukovĆ©ho serveru JACK Whether to execute a custom shell script after shuting down the JACK audio server. ProvĆ©st vlastnĆ­ shellový skript po zastavenĆ­ zvukovĆ©ho serveru JACK. Execute script after Shu&tdown: ProvĆ©st skript po zas&tavenĆ­: Browse for script to be executed after shutting down the JACK audio server Vybrat skript, který se provede po zastavenĆ­ zvukovĆ©ho serveru JACK Command line to be executed after shutting down the JACK audio server Příkazový řÔdek k provedenĆ­ po zastavenĆ­ zvukovĆ©ho serveru JACK Statistics Statistika Whether to capture standard output (stdout/stderr) into messages window VĆ©st obvyklý výstup (stdout/stderr) do okna s hlÔŔenĆ­mi &Capture standard output &VĆ©st obvyklý výstup &XRUN detection regex: Pravidelný výraz pro zjiÅ”těnĆ­ &XRUN: Regular expression used to detect XRUNs on server output messages Pravidelný výraz užitý pro poznĆ”nĆ­ XRUN v hlÔŔenĆ­ch posĆ­laných serverem xrun of at least ([0-9|\.]+) msecs xrun alespoň ([0-9|\.]+) ms Connections SpojenĆ­ Whether to enable JACK D-Bus interface &Enable JACK D-Bus interface 10 10 Patchbay definition file to be activated as connection persistence profile Spustit soubor s vymezenĆ­m zapojovacĆ­ desky jako stĆ”lý profil spojenĆ­ Browse for a patchbay definition file to be activated Vybrat soubor s vymezenĆ­m zapojovacĆ­ desky pro spuÅ”těnĆ­ Whether to activate a patchbay definition for connection persistence profile. Spustit stĆ”lý profil s vymezenĆ­m zapojovacĆ­ desky spojenĆ­. Activate &Patchbay persistence: Spustit stĆ”lý profil se &zapojovacĆ­ deskou: Logging ProvĆ”děnĆ­ zĆ”pisu Messages log file Soubor se zĆ”pisem hlÔŔenĆ­ Browse for the messages log file location Vybrat mĆ­sto pro umĆ­stěnĆ­ souboru se zĆ”pisem hlÔŔenĆ­ Whether to activate a messages logging to file. Spustit provĆ”děnĆ­ zĆ”pisu hlÔŔenĆ­ do souboru. Please do not touch these settings unless you know what you are doing. Nedotýkejte se, prosĆ­m, těchto nastavenĆ­, pokud nevĆ­te, co dělĆ”te. Server &Prefix: Pře&dpona serveru: Extra driver options (command line suffix) DalŔí volby pro ovladač (přípona příkazovĆ©ho řÔdku) Whether to reset all connections when a patchbay definition is activated. Nastavit vÅ”echna spojenĆ­ na výchozĆ­ hodnoty, když je zapnuto vymezenĆ­ zapojovacĆ­ desky. &Reset all connections on patchbay activation &Nastavit vÅ”echna spojenĆ­ při zapnutĆ­ zapojovacĆ­ desky na výchozĆ­ hodnoty Whether to issue a warning on active patchbay port disconnections. Vydat varovĆ”nĆ­ při odpojenĆ­ činných přípojek zapojovacĆ­ desky. &Warn on active patchbay disconnections &Varovat při odpojenĆ­ činných přípojek zapojovacĆ­ desky &Messages log file: &Soubor se zĆ”pisem hlÔŔenĆ­: Display Zobrazit Time Display Údaj o čase Time F&ormat: &FormĆ”t času: The general time format on display Obecný formĆ”t času pro zobrazenĆ­ hh:mm:ss hh:mm:ss hh:mm:ss.d hh:mm:ss.d hh:mm:ss.dd hh:mm:ss.dd hh:mm:ss.ddd hh:mm:ss.ddd Transport &Time Code PředĆ”nĆ­ &časovĆ©ho kódu Transport &BBT (bar:beat.ticks) PředĆ”nĆ­ &BBT (takt:doba.tiknutĆ­ - bar:beat.ticks) Elapsed time since last &Reset Čas uplynulý od poslednĆ­ho &znovunastavenĆ­ Elapsed time since last &XRUN Čas uplynulý od poslednĆ­ho &XRUN Sample front panel normal display font PředvĆ©st pĆ­smo pro obvyklĆ© zobrazenĆ­ na přednĆ­ straně panelu Sample big time display font PředvĆ©st pĆ­smo pro velkĆ© zobrazenĆ­ Ćŗdaje o čase Big Time display: VelkĆ© zobrazenĆ­ Ćŗdaje o čase: Select font for front panel normal display Vybrat pĆ­smo pro zobrazenĆ­ pĆ­sma na přednĆ­ straně panelu &Font... &PĆ­smo... Select font for big time display Vybrat pĆ­smo pro velkĆ© zobrazenĆ­ Ćŗdaje o čase Normal display: ObvyklĆ© zobrazenĆ­: Whether to enable a shiny glass light effect on the main display Povolit zobrazenĆ­ ĆŗdajÅÆ s lesklým sklenným světelným efektem &Display shiny glass light effect &Zobrazit Ćŗdaje s lesklým sklenným světelným efektem Whether to enable blinking (flashing) of the server mode (RT) indicator Povolit mrkĆ”nĆ­ indikĆ”toru serverovĆ©ho režimu (realtime -RT) Blin&k server mode indicator Zobrazovat mr&kĆ”nĆ­ indikĆ”toru režimu serveru Messages Window Okno s hlÔŔenĆ­m Sample messages text font display PředvĆ©st zobrazenĆ­ textu v okně s hlÔŔenĆ­m Select font for the messages text display Vybrat pĆ­smo pro zobrazenĆ­ textu hlÔŔenĆ­ Whether to keep a maximum number of lines in the messages window Určit největŔí počet řÔdkÅÆ zobrazovaných v okně s hlÔŔenĆ­m &Messages limit: &NejvětŔí počet hlÔŔenĆ­: The maximum number of message lines to keep in view NejvětŔí počet řÔdkÅÆ zobrazovaných v okně s hlÔŔenĆ­m 100 100 250 250 2500 2500 Connections Window Přehled spojenĆ­ Sample connections view font PředvĆ©st zobrazenĆ­ pĆ­sma v přehledu spojenĆ­ Select font for the connections view Vybrat pĆ­smo pro přehled spojenĆ­ &Icon size: &Velikost ikon: The icon size for each item of the connections view Velikost jednotlivých symbolÅÆ v přehledu spojenĆ­ 16 x 16 16 x 16 32 x 32 32 x 32 64 x 64 64 x 64 Whether to enable in-place client/port name editing (rename) Povolit Ćŗpravu vedlejŔího nĆ”zvu (přezdĆ­vka) klienta/přípojky (přejmenovĆ”nĆ­) Ena&ble client/port aliases editing (rename) Po&volit Ćŗpravu vedlejŔího nĆ”zvu (přezdĆ­vka) klienta/přípojky (přejmenovĆ”nĆ­) Whether to enable client/port name aliases on the connections window Povolit vedlejŔí nĆ”zvy (přezdĆ­vky) klienta/přípojky v přehledu spojenĆ­ E&nable client/port aliases &Povolit vedlejŔí nĆ”zvy (přezdĆ­vky) klienta/přípojky Whether to draw connection lines as cubic Bezier curves Určit, zda se majĆ­ ÄĆ”ry spojenĆ­ kreslit jako BĆ©zierovy křivky Server path (command line prefix) Cesta k serveru (předpona příkazovĆ©ho řÔdku) Draw connection and patchbay lines as Be&zier curves ČÔry pro spojenĆ­ a ÄĆ”ry zapojovacĆ­ desky kreslit jako &BĆ©zierovy křivky Misc RÅÆznĆ© Other DalŔí Whether to start JACK audio server immediately on application startup Spustit zvukový server JACK okamžitě při spuÅ”těnĆ­ aplikace &Start JACK audio server on application startup &Spustit zvukový server JACK okamžitě při spuÅ”těnĆ­ aplikace Whether to ask for confirmation on application exit ŽÔdat o potvrzenĆ­ při ukončenĆ­ aplikace JACK client/port pretty-name (metadata) display mode Režim zobrazenĆ­ pěkných nĆ”zvÅÆ (popisnĆ” data) pro klienty/přípojky JACK Enable JA&CK client/port pretty-names (metadata) Povolit pěknĆ© nĆ”zvy (popisnĆ” data) pro klienty/přípojky JA&CK &Confirm application close &Potvrdit ukončenĆ­ aplikace Whether to keep all child windows on top of the main window VÅ”echna dalŔí okna udržovat nad hlavnĆ­m oknem &Keep child windows always on top &VÅ”echna dalŔí okna udržovat vždy nahoře Whether to enable the system tray icon UkĆ”zat ikonu v systĆ©movĆ© ÄĆ”sti panelu &Enable system tray icon Po&volit ikonu v systĆ©movĆ© ÄĆ”sti panelu Whether to save the JACK server command-line configuration into a local file (auto-start) NastavenĆ­ příkazovĆ©ho řÔdku ke spuÅ”těnĆ­ serveru JACK-uložit do mĆ­stnĆ­ho souboru (auto-start) S&ave JACK audio server configuration to: NastavenĆ­ ke spuÅ”těnĆ­ serveru JACK &uložit jako: The server configuration local file name (auto-start) NĆ”zev mĆ­stnĆ­ho souboru s nastavenĆ­m serveru (auto-start) .jackdrc .jackdrc Whether to exit once all clients have closed (auto-start) Ukončit program, když jsou rozpojena vÅ”echna klientskĆ” spojenĆ­ (auto-start) C&onfigure as temporary server Nastavit jako &dočasný server Whether to ask for confirmation on JACK audio server shutdown ŽÔdat o potvrzenĆ­ při zastavenĆ­ serveru JACK Confirm server sh&utdown Potvrdit &zastavenĆ­ serveru Whether to enable ALSA Sequencer (MIDI) support on startup Povolit podporu (MIDI) pro řadič (sekvencer) ALSA při spuÅ”těnĆ­ E&nable ALSA Sequencer support P&ovolit podporu (MIDI) pro řadič (sekvencer) ALSA Buttons Tlačƭtka Whether to hide the left button group on the main window Skrýt skupinu s tlačƭtky nalevo v hlavnĆ­m okně Hide main window &Left buttons Skrýt &levĆ” tlačƭtka v hlavnĆ­m okně Whether to hide the right button group on the main window Skrýt skupinu s tlačƭtky napravo v hlavnĆ­m okně Hide main window &Right buttons Skrýt &pravĆ” tlačƭtka v hlavnĆ­m okně Whether to hide the transport button group on the main window Skrýt skupinu s tlačƭtky pro předĆ”nĆ­ v hlavnĆ­m okně Hide main window &Transport buttons Skrýt &předĆ”vacĆ­ tlačƭtka v hlavnĆ­m okně Whether to hide the text labels on the main window buttons Skrýt textovĆ© popisky tlačƭtek v hlavnĆ­m okně Hide main window &button text labels Skrýt textovĆ© popisky &tlačƭtek v hlavnĆ­m okně Warning VarovĆ”nĆ­ Some settings have been changed: "%1" Do you want to save the changes? NěkterĆ” nastavenĆ­ byla změněna: "%1" Chcete uložit změny? Delete preset: "%1" Are you sure? Smazat přednastavenĆ­ "%1" Jste si jistý? msec ms n/a n/a &Preset Name &NĆ”zev přednastavenĆ­ &Server Name &NĆ”zev serveru &Server Path &Cesta k serveru &Driver &Ovladač &Interface &RozhranĆ­ Sample &Rate VzorkovacĆ­ &kmitočet &Frames/Period &SnĆ­mky/ÚdobĆ­ (perioda) Periods/&Buffer Ú&dobĆ­/VyrovnĆ”vacĆ­ paměń Startup Script Skript pro spuÅ”těnĆ­ Post-Startup Script Skript pro po-spuÅ”těnĆ­ Shutdown Script Skript pro zastavenĆ­ chodu Post-Shutdown Script Skript pro po-zastavenĆ­ chodu Active Patchbay Definition ČinnĆ© vymezenĆ­ zapojovacĆ­ desky Patchbay Definition files Soubory s vymezenĆ­m zapojovacĆ­ desky Messages Log ZĆ”pis s hlÔŔenĆ­m Log files Soubory se zĆ”pisy Some settings have been changed. Do you want to apply the changes? NěkterĆ” nastavenĆ­ byla změněna. Chcete použít změny? &JACK client/port aliases: VedlejŔí nĆ”zvy (přezdĆ­vky) pro klienty/přípojky &JACK: JACK client/port aliases display mode Režim zobrazenĆ­ vedlejŔích nĆ”zvÅÆ (přezdĆ­vek) pro klienty/přípojky JACK Default VýchozĆ­ First PrvnĆ­ Second Druhý Whether to show system tray message on main window close UkĆ”zat zprĆ”vu v oznamovacĆ­ oblasti panelu při zavřenĆ­ hlavnĆ­ho okna Sho&w system tray message on close &UkĆ”zat zprĆ”vu v oznamovacĆ­ oblasti panelu při zavřenĆ­ Whether to stop JACK audio server on application exit Zastavit zvukový server JACK při ukončenĆ­ aplikace S&top JACK audio server on application exit &Zastavit zvukový server JACK při ukončenĆ­ aplikace Defaults VýchozĆ­ &Base font size: &ZĆ”kladnĆ­ velikost pĆ­sma: Base application font size (pt.) ZĆ”kladnĆ­ velikost pĆ­sma v aplikaci (pt.) 6 6 7 7 8 8 9 9 11 11 12 12 net sĆ­Å„ &Name: &NĆ”zev: The JACK Audio Connection Kit sound server name NĆ”zev zvukovĆ©ho serveru JACK Audio Connection Kit netone sĆ­Å„_1 Number of microseconds to wait between engine processes (dummy) Počet mikrosekund, po kterĆ© se čekĆ” mezi strojovými procesy (dummy) Whether to enable D-Bus interface Zda povolit rozhranĆ­ D-Bus &Enable D-Bus interface &Povolit rozhranĆ­ D-Bus Whether to restrict to one single application instance (X11) Zda omezit na Ćŗroveň jednoho programu (X11) Single application &instance Ú&roveň jednoho programu qjackctlSocketForm Socket - JACK Audio Connection Kit ZĆ”suvka - JACK Audio Connection Kit &Socket &ZĆ”suvka &Name (alias): &NĆ”zev (PřezdĆ­vka): Socket name (an alias for client name) NĆ”zev zĆ”suvky (přezdĆ­vka pro nĆ”zev klienta) Client name (regular expression) NĆ”zev pro klienta (pravidelný výraz) Add plug to socket plug list Přidat zĆ”strčku do seznamu se zĆ”strčkami do zĆ”suvky Add P&lug &Přidat zĆ”strčku &Plug: &ZĆ”strčka: Port name (regular expression) NĆ”zev přípojky (pravidelný výraz) Socket plug list Seznam se zĆ”strčkami do zĆ”suvky Socket Plugs / Ports ZĆ”strčky do zĆ”suvky/Přípojky Edit currently selected plug Upravit nynĆ­ vybranou zĆ”strčku &Edit &Upravit Remove currently selected plug from socket plug list Odstranit nynĆ­ vybranou zĆ”strčku ze seznamu se zĆ”strčkami do zĆ”suvky &Remove &Odstranit &Client: &Klient: Move down currently selected plug in socket plug list Posunout nynĆ­ vybranou zĆ”strčku v seznamu se zĆ”strčkami do zĆ”suvky dolÅÆ &Down &DolÅÆ Move up current selected plug in socket plug list Posunout nynĆ­ vybranou zĆ”strčku v seznamu se zĆ”strčkami do zĆ”suvky nahoru &Up &Nahoru Enforce only one exclusive cable connection Vynutit jedno výlučnĆ© kabelovĆ© spojenĆ­ E&xclusive Vý&lučnĆ© &Forward: &Dopředu: Forward (clone) all connections from this socket Předat vÅ”echna spojenĆ­ z tĆ©to zĆ”suvky (klonovat) Type Typ Audio socket type (JACK) Zvukový typ zĆ”suvky (napojenĆ­) JACK &Audio &Zvuk MIDI socket type (JACK) MIDI typ zĆ”suvky (napojenĆ­) (JACK) &MIDI &JACK-MIDI MIDI socket type (ALSA) MIDI typ zĆ”suvky (napojenĆ­) (ALSA) AL&SA AL&SA-MIDI Plugs / Ports ZĆ”strčky/Přípojky Error Chyba A socket named "%1" already exists. ZĆ”suvka s nĆ”zvem "%1" již existuje. Warning VarovĆ”nĆ­ Some settings have been changed. Do you want to apply the changes? NěkterĆ” nastavenĆ­ byla změněna. Chcete použít změny? Add Plug Přidat zĆ”strčku Edit Upravit Remove Odstranit Move Up Přesunout nahoru Move Down Přesunout dolÅÆ (None) (ŽÔdný) qjackctlSocketList Output Výstup Input Vstup Socket ZĆ”suvka <New> - %1 <Nový> %1 Warning VarovĆ”nĆ­ %1 about to be removed: "%2" Are you sure? %1 mĆ” být odstraněno: "%2" Jste si jistý? %1 <Copy> - %2 %1 <KopĆ­rovat> - %2 qjackctlSocketListView Output Sockets / Plugs VýstupnĆ­ zĆ”suvky/zĆ”strčky Input Sockets / Plugs VstupnĆ­ zĆ”suvky/zĆ”strčky qjackctl-0.4.2/src/translations/PaxHeaders.14935/qjackctl_ja.ts0000644000000000000000000000013212700760152021201 xustar0030 mtime=1459871850.632914789 30 atime=1459871850.632914789 30 ctime=1459871850.632914789 qjackctl-0.4.2/src/translations/qjackctl_ja.ts0000644000175000001440000052725512700760152021765 0ustar00rncbcusers00000000000000 PortAudioProber Probing... Please wait, PortAudio is probing audio hardware. Warning č­¦å‘Š Audio hardware probing timed out. QObject (default) (ę—¢å®š) Usage: %1 [options] [command-and-args] 使用法: %1 [ć‚Ŗćƒ—ć‚·ćƒ§ćƒ³] [ć‚³ćƒžćƒ³ćƒ‰ćØå¼•ę•°] Options: ć‚Ŗćƒ—ć‚·ćƒ§ćƒ³: Start JACK audio server immediately JACKć‚Ŗćƒ¼ćƒ‡ć‚£ć‚Ŗć‚µćƒ¼ćƒćƒ¼ć‚’é–‹å§‹ć—ć¾ć™ Set default settings preset name ę—¢å®šć®ćƒ—ćƒŖć‚»ćƒƒćƒˆåć‚’čØ­å®šć—ć¾ć™ Set active patchbay definition file ć‚¢ć‚Æćƒ†ć‚£ćƒ–ćŖćƒ‘ćƒƒćƒćƒ™ć‚¤å®šē¾©ćƒ•ć‚”ć‚¤ćƒ«ć‚’ć‚»ćƒƒćƒˆć—ć¾ć™ Set default JACK audio server name ę—¢å®šć®JACKć‚Ŗćƒ¼ćƒ‡ć‚£ć‚Ŗć‚µćƒ¼ćƒćƒ¼åć‚’ć‚»ćƒƒćƒˆć—ć¾ć™ Show help about command line options ć‚³ćƒžćƒ³ćƒ‰ćƒ©ć‚¤ćƒ³ć‚Ŗćƒ—ć‚·ćƒ§ćƒ³ć«ć¤ć„ć¦ć®ćƒ˜ćƒ«ćƒ—ć‚’č”Øē¤ŗć—ć¾ć™ Show version information ćƒćƒ¼ć‚øćƒ§ćƒ³ęƒ…å ±ć‚’č”Øē¤ŗć—ć¾ć™ Option -p requires an argument (preset). pć‚Ŗćƒ—ć‚·ćƒ§ćƒ³ćÆå¼•ę•°ćØć—ć¦ćƒ—ćƒŖć‚»ćƒƒćƒˆåć‚’åæ…č¦ćØć—ć¾ć™ć€‚ Option -a requires an argument (path). ać‚Ŗćƒ—ć‚·ćƒ§ćƒ³ćÆå¼•ę•°ćØć—ć¦ćƒ‘ć‚¹ć‚’åæ…č¦ćØć—ć¾ć™ć€‚ Option -n requires an argument (name). nć‚Ŗćƒ—ć‚·ćƒ§ćƒ³ćÆå¼•ę•°ćØć—ć¦åå‰ć‚’åæ…č¦ćØć—ć¾ć™ć€‚ Qt: %1 %1 (%2 frames) qjackctlAboutForm About QjackCtl QjackCtl恫恤恄恦 &Close 閉恘悋(&C) About Qt Qt恫恤恄恦 Version Build Using: JACK %1 Debugging option enabled. System tray disabled. Transport status control disabled. Realtime status disabled. XRUN delay status disabled. Maximum delay status disabled. JACK Port aliases support disabled. JACK MIDI support disabled. JACK Session support disabled. ALSA/MIDI sequencer support disabled. D-Bus interface support disabled. Website This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License version 2 or later. qjackctlClientListView Readable Clients / Output Ports čŖ­ćæč¾¼ćæåÆčƒ½ćŖć‚Æćƒ©ć‚¤ć‚¢ćƒ³ćƒˆ / å‡ŗåŠ›ćƒćƒ¼ćƒˆ Writable Clients / Input Ports ę›øćč¾¼ćæåÆčƒ½ćŖć‚Æćƒ©ć‚¤ć‚¢ćƒ³ćƒˆ / å…„åŠ›ćƒćƒ¼ćƒˆ &Connect ęŽ„ē¶š(&C) Alt+C Connect &Disconnect åˆ‡ę–­(&D) Alt+D Disconnect Disconnect &All ć™ć¹ć¦åˆ‡ę–­(&A) Alt+A Disconect All Re&name ćƒŖćƒćƒ¼ćƒ (&n) Alt+N Rename &Refresh ꛓꖰ(&R) Alt+R Refresh qjackctlConnect Warning č­¦å‘Š This will suspend sound processing from all client applications. Are you sure? ć™ć¹ć¦ć®ć‚Æćƒ©ć‚¤ć‚¢ćƒ³ćƒˆć‚¢ćƒ—ćƒŖć‚±ćƒ¼ć‚·ćƒ§ćƒ³ć® ć‚µć‚¦ćƒ³ćƒ‰å‡¦ē†ć‚’ć‚µć‚¹ćƒšćƒ³ćƒ‰ć—ć¾ć™ 悈悍恗恄恧恙恋? qjackctlConnectionsForm Connections - JACK Audio Connection Kit ęŽ„ē¶š - JACK Audio Connection Kit Audio ć‚Ŗćƒ¼ćƒ‡ć‚£ć‚Ŗ Connect currently selected ports éøęŠžć—ć¦ć„ć‚‹ćƒćƒ¼ćƒˆć‚’ęŽ„ē¶šć—ć¾ć™ &Connect ęŽ„ē¶š(&C) Disconnect currently selected ports éøęŠžć—ć¦ć„ć‚‹ćƒćƒ¼ćƒˆć‚’åˆ‡ę–­ć—ć¾ć™ &Disconnect åˆ‡ę–­(&D) Disconnect all currently connected ports ęŽ„ē¶šć—ć¦ć„ć‚‹ć™ć¹ć¦ć®ćƒćƒ¼ćƒˆć‚’åˆ‡ę–­ć—ć¾ć™ Disconnect &All ć™ć¹ć¦åˆ‡ę–­(&A) Expand all client ports ć™ć¹ć¦ć®ć‚Æćƒ©ć‚¤ć‚¢ćƒ³ćƒˆćƒćƒ¼ćƒˆć‚’å±•é–‹ć—ć¾ć™ E&xpand All すべて展開(&x) Refresh current connections view ęŽ„ē¶šć®č”Øē¤ŗć‚’ę›“ę–°ć—ć¾ć™ &Refresh ꛓꖰ(&R) MIDI ALSA Warning č­¦å‘Š The preset aliases have been changed: "%1" Do you want to save the changes? ćƒ—ćƒŖć‚»ćƒƒćƒˆć®ć‚Øć‚¤ćƒŖć‚¢ć‚¹åćŒå¤‰ę›“ć•ć‚Œć¦ć„ć¾ć™: "%1" å¤‰ę›“ć‚’äæå­˜ć—ć¾ć™ć‹? qjackctlConnectorView &Connect ęŽ„ē¶š(&C) Alt+C Connect &Disconnect åˆ‡ę–­(&D) Alt+D Disconnect Disconnect &All ć™ć¹ć¦åˆ‡ę–­(&A) Alt+A Disconect All &Refresh ꛓꖰ(&R) Alt+R Refresh qjackctlMainForm QjackCtl Start the JACK server JACKć‚µćƒ¼ćƒćƒ¼ć‚’é–‹å§‹ &Start 開始(&S) Stop the JACK server JACKć‚µćƒ¼ćƒć‚’åœę­¢ S&top 停止(&T) JACK server state JACKć‚µćƒ¼ćƒćƒ¼ć®ēŠ¶ę…‹ JACK server mode JACKć‚µćƒ¼ćƒćƒ¼ćƒ¢ćƒ¼ćƒ‰ DSP Load DSPć®č² č· Sample rate ć‚µćƒ³ćƒ—ćƒ«ćƒ¬ćƒ¼ćƒˆ XRUN Count (notifications) XRUNć®ć‚«ć‚¦ćƒ³ćƒˆ(notifications) Time display 時間の蔨示 Transport state ćƒˆćƒ©ćƒ³ć‚¹ćƒćƒ¼ćƒˆć®ēŠ¶ę…‹ Transport BPM ćƒˆćƒ©ćƒ³ć‚¹ćƒćƒ¼ćƒˆć®BPM Transport time ćƒˆćƒ©ćƒ³ć‚¹ćƒćƒ¼ćƒˆć®ę™‚é–“ Quit processing and exit å‡¦ē†ć‚’ēµ‚ć‚ć‚‰ć›ēµ‚äŗ†ć—ć¾ć™ &Quit 終了(&Q) Show/hide the session management window ć‚»ćƒƒć‚·ćƒ§ćƒ³ē®”ē†ć‚¦ć‚£ćƒ³ćƒ‰ć‚¦ć‚’č”Øē¤ŗ/隠恙 S&ession ć‚»ćƒƒć‚·ćƒ§ćƒ³(&E) Show/hide the messages log/status window ćƒ”ćƒƒć‚»ćƒ¼ć‚øćƒ­ć‚°/ēŠ¶ę…‹ć‚¦ć‚£ćƒ³ćƒ‰ć‚¦ć‚’č”Øē¤ŗ/隠恙 &Messages ćƒ”ćƒƒć‚»ćƒ¼ć‚ø(&M) Show settings and options dialog čØ­å®šćØć‚Ŗćƒ—ć‚·ćƒ§ćƒ³ćƒ€ć‚¤ć‚¢ćƒ­ć‚°ć‚’č”Øē¤ŗ Set&up... 設定(&U)... Show/hide the actual connections patchbay window ē¾åœØęŽ„ē¶šć—ć¦ć„ć‚‹ćƒ‘ćƒƒćƒćƒ™ć‚¤ć‚¦ć‚£ćƒ³ćƒ‰ć‚¦ć‚’č”Øē¤ŗ/隠恙 &Connect ęŽ„ē¶š(&C) Show/hide the patchbay editor window ćƒ‘ćƒƒćƒćƒ™ć‚¤ē·Øé›†ć‚¦ć‚£ćƒ³ćƒ‰ć‚¦ć‚’č”Øē¤ŗ/隠恙 &Patchbay 惑惃惁惙悤(&P) Rewind transport ćƒˆćƒ©ćƒ³ć‚¹ćƒćƒ¼ćƒˆć‚’å…ˆé ­ć«ęˆ»ć™ &Rewind å…ˆé ­ć«ęˆ»ć™(&R) Backward transport ćƒˆćƒ©ćƒ³ć‚¹ćƒćƒ¼ćƒˆć®é€†å†ē”Ÿ &Backward é€†å†ē”Ÿ(&B) Start transport rolling ćƒˆćƒ©ćƒ³ć‚¹ćƒćƒ¼ćƒˆć®ćƒ­ćƒ¼ćƒŖćƒ³ć‚°ć‚’ć‚¹ć‚æćƒ¼ćƒˆć™ć‚‹ &Play å†ē”Ÿ(&P) Stop transport rolling ćƒˆćƒ©ćƒ³ć‚¹ćƒćƒ¼ćƒˆć®ćƒ­ćƒ¼ćƒŖćƒ³ć‚°ć‚’ć‚¹ćƒˆćƒƒćƒ—ć™ć‚‹ Pa&use äø€ę™‚åœę­¢(&U) Forward transport ćƒˆćƒ©ćƒ³ć‚¹ćƒćƒ¼ćƒˆć‚’ę—©é€ć‚Šć™ć‚‹ &Forward ꗩ送悊(&F) Show information about this application ć“ć®ć‚¢ćƒ—ćƒŖć‚±ćƒ¼ć‚·ćƒ§ćƒ³ć«ć¤ć„ć¦ć®ęƒ…å ±ć‚’č”Øē¤ŗć—ć¾ć™ Ab&out... ęƒ…å ±(&O)... Could not open ALSA sequencer as a client. ALSA MIDI patchbay will be not available. ć‚Æćƒ©ć‚¤ć‚¢ćƒ³ćƒˆćØć—ć¦ALSAć‚·ćƒ¼ć‚±ćƒ³ć‚µćƒ¼ć‚’é–‹ćć“ćØćŒć§ćć¾ć›ć‚“ć§ć—ćŸ ALSA MIDIćƒ‘ćƒƒćƒćƒ™ć‚¤ćÆåˆ©ē”Øć§ćć¾ć›ć‚“ć€‚ D-BUS: Service is available (%1 aka jackdbus). D-BUS: ć‚µćƒ¼ćƒ“ć‚¹ć‚’åˆ©ē”Øć§ćć¾ć™ (%1 ć™ćŖć‚ć”jackdbus)怂 D-BUS: Service not available (%1 aka jackdbus). D-BUS: ć‚µćƒ¼ćƒ“ć‚¹ć‚’åˆ©ē”Øć§ćć¾ć›ć‚“ (%1 ć™ćŖć‚ć”jackdbus)怂 Information ęƒ…å ± The program will keep running in the system tray. To terminate the program, please choose "Quit" in the context menu of the system tray icon. ć“ć®ćƒ—ćƒ­ć‚°ćƒ©ćƒ ćÆć‚·ć‚¹ćƒ†ćƒ ćƒˆćƒ¬ć‚¤ć«č”Øē¤ŗć•ć‚Œć¾ć™ć€‚ ćƒ—ćƒ­ć‚°ćƒ©ćƒ ć‚’ēµ‚äŗ†ć™ć‚‹ę™‚ćÆć€ć‚·ć‚¹ćƒ†ćƒ ćƒˆćƒ¬ć‚¤ć‚¢ć‚¤ć‚³ćƒ³ć® ć‚³ćƒ³ćƒ†ć‚­ć‚¹ćƒˆćƒ”ćƒ‹ćƒ„ćƒ¼ć§"Quit"ć‚’éøęŠžć—ć¦äø‹ć•ć„ć€‚ Don't show this message again Warning č­¦å‘Š JACK is currently running. Do you want to terminate the JACK audio server? JACKćÆå‹•ä½œäø­ć§ć™ć€‚ JACKć‚Ŗćƒ¼ćƒ‡ć‚£ć‚Ŗć‚µćƒ¼ćƒćƒ¼ć‚’ēµ‚äŗ†ć—ć¾ć™ć‹ļ¼Ÿ successfully 成功 with exit status=%1 ēµ‚äŗ†ć‚¹ćƒ†ćƒ¼ć‚æć‚¹ = %1 Could not start JACK. Maybe JACK audio server is already started. JACKć‚’é–‹å§‹ć§ćć¾ć›ć‚“ć§ć—ćŸć€‚ 恊恝悉恏悂恆JACKć‚µć‚¦ćƒ³ćƒ‰ć‚µćƒ¼ćƒćƒ¼ćŒé–‹å§‹ć•ć‚Œć¦ć„ć¾ć™ć€‚ Could not load preset "%1". Retrying with default. ćƒ—ćƒŖć‚»ćƒƒćƒˆ "%1" ć‚’ćƒ­ćƒ¼ćƒ‰ć§ćć¾ć›ć‚“ć€‚ ę—¢å®šć®čØ­å®šć§ćƒŖćƒˆćƒ©ć‚¤ć—ć¾ć™ć€‚ Could not load default preset. Sorry. ę—¢å®šć®ćƒ—ćƒŖć‚»ćƒƒćƒˆć‚’ćƒ­ćƒ¼ćƒ‰ć§ćć¾ć›ć‚“ć€‚ ごめんなさい。 Startup script... ć‚¹ć‚æćƒ¼ćƒˆć‚¢ćƒƒćƒ—ć‚¹ć‚ÆćƒŖćƒ—ćƒˆ... Startup script terminated ć‚¹ć‚æćƒ¼ćƒˆć‚¢ćƒƒćƒ—ć‚¹ć‚ÆćƒŖćƒ—ćƒˆćÆēµ‚äŗ†ć—ć¾ć—ćŸ D-BUS: JACK server is starting... D-BUS: JACKć‚µćƒ¼ćƒćƒ¼ć‚’é–‹å§‹ć—ć¦ć„ć¾ć™... D-BUS: JACK server could not be started. Sorry D-BUS: JACKć‚µćƒ¼ćƒćƒ¼ć‚’é–‹å§‹ć™ć‚‹ć“ćØćŒć§ćć¾ć›ć‚“ć€‚ ごめんなさい JACK is starting... JACKを開始しています... Some client audio applications are still active and connected. Do you want to stop the JACK audio server? ć„ćć¤ć‹ć®ć‚Æćƒ©ć‚¤ć‚¢ćƒ³ćƒˆć®ć‚Ŗćƒ¼ćƒ‡ć‚£ć‚Ŗć‚¢ćƒ—ćƒŖć‚±ćƒ¼ć‚·ćƒ§ćƒ³ćÆ ć¾ć ć‚¢ć‚Æćƒ†ć‚£ćƒ–ćŖęŽ„ē¶šć‚’ęŒć£ć¦ć„ć¾ć™ć€‚ 恝悌恧悂JACKć‚Ŗćƒ¼ćƒ‡ć‚£ć‚Ŗć‚µćƒ¼ćƒćƒ¼ć‚’ēµ‚äŗ†ć—ć¾ć™ć‹ļ¼Ÿ Shutdown script... ć‚·ćƒ£ćƒƒćƒˆćƒ€ć‚¦ćƒ³ć‚¹ć‚ÆćƒŖćƒ—ćƒˆ... Shutdown script terminated ć‚·ćƒ£ćƒƒćƒˆćƒ€ć‚¦ćƒ³ć‚¹ć‚ÆćƒŖćƒ—ćƒˆćÆēµ‚äŗ†ć—ć¾ć—ćŸ JACK is stopping... JACKを終了しています... D-BUS: JACK server is stopping... D-BUS: JACKć‚µćƒ¼ćƒćƒ¼ć‚’ēµ‚äŗ†ć—ć¦ć„ć¾ć™... D-BUS: JACK server could not be stopped. Sorry D-BUS: JACKć‚µćƒ¼ćƒćƒ¼ć‚’ēµ‚äŗ†ć™ć‚‹ć“ćØćŒć§ćć¾ć›ć‚“ć§ć—ćŸć€‚ ごめんなさい JACK was started with PID=%1. JACKćÆćƒ—ćƒ­ć‚»ć‚¹ID=%1ć§é–‹å§‹ć—ć¾ć—ćŸć€‚ D-BUS: JACK server was started (%1 aka jackdbus). D-BUS: JACKć‚µćƒ¼ćƒćƒ¼ćÆć‚¹ć‚æćƒ¼ćƒˆć—ć¾ć—ćŸ (%1 ć™ćŖć‚ć”jackdbus)怂 JACK is being forced... JACKćÆå¼·åˆ¶ēµ‚äŗ†ć—ć¾ć™... JACK was stopped JACKćÆēµ‚äŗ†ć—ć¾ć—ćŸ D-BUS: JACK server was stopped (%1 aka jackdbus). D-BUS: JACKć‚µćƒ¼ćƒćƒ¼ćÆēµ‚äŗ†ć—ć¾ć—ćŸ (%1 ć™ćŖć‚ć”jackdbus)怂 Post-shutdown script... ćƒć‚¹ćƒˆć‚·ćƒ£ćƒƒćƒˆćƒ€ć‚¦ćƒ³ć‚¹ć‚ÆćƒŖćƒ—ćƒˆ... Post-shutdown script terminated ćƒć‚¹ćƒˆć‚·ćƒ£ćƒƒćƒˆćƒ€ć‚¦ćƒ³ć‚¹ć‚ÆćƒŖćƒ—ćƒˆćÆēµ‚äŗ†ć—ć¾ć—ćŸ Error ć‚Øćƒ©ćƒ¼ Don't ask this again Transport BBT (bar.beat.ticks) Transport time code ćƒˆćƒ©ćƒ³ć‚¹ćƒćƒ¼ćƒˆć®ć‚æć‚¤ćƒ ć‚³ćƒ¼ćƒ‰ Elapsed time since last reset ęœ€å¾Œć®ćƒŖć‚»ćƒƒćƒˆć‹ć‚‰ć®ēµŒéŽę™‚é–“ Elapsed time since last XRUN ęœ€å¾Œć®XRUNć‹ć‚‰ć®ēµŒéŽę™‚é–“ Patchbay reset. Could not load active patchbay definition. "%1" Disabled. ć‚¢ć‚Æćƒ†ć‚£ćƒ–ćŖćƒ‘ćƒƒćƒćƒ™ć‚¤å®šē¾©ć‚’ćƒ­ćƒ¼ćƒ‰ć§ćć¾ć›ć‚“ć€‚ "%1" ē„”åŠ¹ć«ć—ć¾ć—ćŸć€‚ Patchbay activated. ćƒ‘ćƒƒćƒćƒ™ć‚¤ć‚’ęœ‰åŠ¹ć«ć—ć¾ć—ćŸć€‚ Patchbay deactivated. ćƒ‘ćƒƒćƒćƒ™ć‚¤ć‚’ē„”åŠ¹ć«ć—ć¾ć—ćŸć€‚ Statistics reset. ēµ±čØˆć®ćƒŖć‚»ćƒƒćƒˆć€‚ msec ćƒŸćƒŖē§’ JACK connection graph change. JACKęŽ„ē¶šć‚°ćƒ©ćƒ•ćÆå¤‰ę›“ć•ć‚Œć¾ć—ćŸć€‚ XRUN callback (%1). XRUNć‚³ćƒ¼ćƒ«ćƒćƒƒć‚Æ (%1)怂 Buffer size change (%1). ćƒćƒƒćƒ•ć‚”ć‚µć‚¤ć‚ŗć‚’å¤‰ę›“ć—ć¾ć—ćŸ (%1)怂 Shutdown notification. ć‚·ćƒ£ćƒƒćƒˆćƒ€ć‚¦ćƒ³ć®é€šēŸ„ć€‚ Could not start JACK. Sorry. JACKć‚’é–‹å§‹ć§ćć¾ć›ć‚“ć§ć—ćŸć€‚ ごめんなさい。 JACK has crashed. JACKćÆć‚Æćƒ©ćƒƒć‚·ćƒ„ć—ć¾ć—ćŸć€‚ JACK timed out. JACKćÆć‚æć‚¤ćƒ ć‚¢ć‚¦ćƒˆć—ć¾ć—ćŸć€‚ JACK write error. JACK writeć‚Øćƒ©ćƒ¼ć€‚ JACK read error. JACK readć‚Øćƒ©ćƒ¼ć€‚ Unknown JACK error (%d). äøę˜ŽćŖJACKć‚Øćƒ©ćƒ¼ (%d)怂 JACK property change. ALSA connection graph change. ALSAęŽ„ē¶šć‚°ćƒ©ćƒ•ćÆå¤‰ę›“ć•ć‚Œć¾ć—ćŸć€‚ JACK active patchbay scan JACKć®ć‚¢ć‚Æćƒ†ć‚£ćƒ–ćŖćƒ‘ćƒƒćƒćƒ™ć‚¤ć®ć‚¹ć‚­ćƒ£ćƒ³ ALSA active patchbay scan ALSAć®ć‚¢ć‚Æćƒ†ć‚£ćƒ–ćŖćƒ‘ćƒƒćƒćƒ™ć‚¤ć®ć‚¹ć‚­ćƒ£ćƒ³ JACK connection change. JACKć®ęŽ„ē¶šćÆå¤‰ę›“ć•ć‚Œć¾ć—ćŸć€‚ ALSA connection change. ALSAć®ć‚³ćƒć‚Æć‚·ćƒ§ćƒ³ćÆå¤‰ę›“ć•ć‚Œć¾ć—ćŸć€‚ checked ē¢ŗčŖęøˆćæ connected ęŽ„ē¶šäø­ disconnected ęŽ„ē¶šćŖć— failed 失敗 A patchbay definition is currently active, which is probable to redo this connection: %1 -> %2 Do you want to remove the patchbay connection? ćƒ‘ćƒƒćƒćƒ™ć‚¤å®šē¾©ćÆē¾åœØć‚¢ć‚Æćƒ†ć‚£ćƒ–ć§ć‚ć‚Š ęŽ„ē¶šć‚’å†åŗ¦ć‚„ć‚Šē›“ć—ć¾ć™ć€‚ %1 -> %2 ćƒ‘ćƒƒćƒćƒ™ć‚¤ęŽ„ē¶šć‚’å–ć‚Šé™¤ćć¾ć™ć‹? Overall operation failed. ę“ä½œå…Øä½“ćŒå¤±ę•—ć—ć¾ć—ćŸć€‚ Invalid or unsupported option. äøę­£ćŖć‚Ŗćƒ—ć‚·ćƒ§ćƒ³ć‹ć€ć‚µćƒćƒ¼ćƒˆć•ć‚Œć¦ć„ćŖć„ć‚Ŗćƒ—ć‚·ćƒ§ćƒ³ć§ć™ć€‚ Client name not unique. å›ŗęœ‰ć®ć‚Æćƒ©ć‚¤ć‚¢ćƒ³ćƒˆåć§ćÆć‚ć‚Šć¾ć›ć‚“ć€‚ Server is started. ć‚µćƒ¼ćƒćƒ¼ć‚’é–‹å§‹ć—ć¾ć—ćŸć€‚ Unable to connect to server. ć‚µćƒ¼ćƒćƒ¼ć«ęŽ„ē¶šć™ć‚‹ć“ćØćŒć§ćć¾ć›ć‚“ć€‚ Server communication error. ć‚µćƒ¼ćƒćƒ¼ćØć®ć‚³ćƒŸćƒ„ćƒ‹ć‚±ćƒ¼ć‚·ćƒ§ćƒ³ć‚Øćƒ©ćƒ¼ć§ć™ć€‚ Client does not exist. ć‚Æćƒ©ć‚¤ć‚¢ćƒ³ćƒˆćŒå­˜åœØć—ć¾ć›ć‚“ć€‚ Unable to load internal client. å†…éƒØć‚Æćƒ©ć‚¤ć‚¢ćƒ³ćƒˆć‚’ćƒ­ćƒ¼ćƒ‰ć™ć‚‹ć“ćØćŒć§ćć¾ć›ć‚“ć€‚ Unable to initialize client. ć‚Æćƒ©ć‚¤ć‚¢ćƒ³ćƒˆć‚’åˆęœŸåŒ–ć™ć‚‹ć“ćØćŒć§ćć¾ć›ć‚“ć€‚ Unable to access shared memory. å…±ęœ‰ćƒ”ćƒ¢ćƒŖćƒ¼ćøć‚¢ć‚Æć‚»ć‚¹ć™ć‚‹ć“ćØćŒć§ćć¾ć›ć‚“ć€‚ Client protocol version mismatch. ć‚Æćƒ©ć‚¤ć‚¢ćƒ³ćƒˆć®ćƒ—ćƒ­ćƒˆć‚³ćƒ«ćƒćƒ¼ć‚øćƒ§ćƒ³ćŒäø€č‡“ć—ć¾ć›ć‚“ć€‚ Could not connect to JACK server as client. - %1 Please check the messages window for more info. JACKć‚µćƒ¼ćƒćƒ¼ćØć‚Æćƒ©ć‚¤ć‚¢ćƒ³ćƒˆćØć—ć¦ęŽ„ē¶šć™ć‚‹ć“ćØćŒć§ćć¾ć›ć‚“ć§ć—ćŸć€‚ - %1 ćƒ”ćƒƒć‚»ćƒ¼ć‚øć‚¦ć‚£ćƒ³ćƒ‰ć‚¦ć§č©³ē“°ćŖęƒ…å ±ć‚’ē¢ŗčŖć—ć¦äø‹ć•ć„ć€‚ Server configuration saved to "%1". ć‚µćƒ¼ćƒćƒ¼čØ­å®šć‚’ "%1" ć«äæå­˜ć—ć¾ć—ćŸć€‚ Client activated. ć‚Æćƒ©ć‚¤ć‚¢ćƒ³ćƒˆćÆęœ‰åŠ¹ćØćŖć‚Šć¾ć—ćŸć€‚ Post-startup script... ćƒć‚¹ćƒˆć‚¹ć‚æćƒ¼ćƒˆć‚¢ćƒƒćƒ—ć‚¹ć‚ÆćƒŖćƒ—ćƒˆ... Post-startup script terminated ćƒć‚¹ćƒˆć‚¹ć‚æćƒ¼ćƒˆć‚¢ćƒƒćƒ—ć‚¹ć‚ÆćƒŖćƒ—ćƒˆć®ēµ‚äŗ† Command line argument... ć‚³ćƒžćƒ³ćƒ‰ćƒ©ć‚¤ćƒ³å¼•ę•°... Command line argument started ć‚³ćƒžćƒ³ćƒ‰ćƒ©ć‚¤ćƒ³å¼•ę•°ć®é–‹å§‹ Client deactivated. ć‚Æćƒ©ć‚¤ć‚¢ćƒ³ćƒˆćÆē„”åŠ¹ćØćŖć‚Šć¾ć—ćŸć€‚ Transport rewind. ćƒˆćƒ©ćƒ³ć‚¹ćƒćƒ¼ćƒˆć‚’é–‹å§‹ć¾ć§ęˆ»ć—ć¾ć™ć€‚ Transport backward. ćƒˆćƒ©ćƒ³ć‚¹ćƒćƒ¼ćƒˆć‚’é€†å†ē”Ÿć—ć¾ć™ć€‚ Starting 開始 Transport start. ćƒˆćƒ©ćƒ³ć‚¹ćƒćƒ¼ćƒˆć®é–‹å§‹ć€‚ Stopping 停止 Transport stop. ćƒˆćƒ©ćƒ³ć‚¹ćƒćƒ¼ćƒˆć‚’åœę­¢ć—ć¾ć—ćŸć€‚ Transport forward. ćƒˆćƒ©ćƒ³ć‚¹ćƒćƒ¼ćƒˆć‚’ę—©é€ć‚Šć—ć¾ć™ć€‚ Stopped 停止 %1 (%2%) %1 (%2%, %3 xruns) %1 % %1 Hz %1 frames Yes はい No 恄恄恈 RT Rolling ćƒ­ćƒ¼ćƒŖćƒ³ć‚° Looping ćƒ«ćƒ¼ćƒ— %1 msec XRUN callback (%1 skipped). XRUNć‚³ćƒ¼ćƒ«ćƒćƒƒć‚Æ (%1 ć‚’ć‚¹ć‚­ćƒƒćƒ—)怂 Started 開始 Active ęœ‰åŠ¹ Activating ęœ‰åŠ¹åŒ– Inactive ē„”åŠ¹ &Hide éžč”Øē¤ŗ(&H) Mi&nimize ęœ€å°åŒ–(&n) S&how 蔨示(&h) Rest&ore å…ƒć«ęˆ»ć™(&o) &Stop 停止(&S) &Reset ćƒŖć‚»ćƒƒćƒˆ(&R) &Presets ćƒ—ćƒŖć‚»ćƒƒćƒˆ(&P) &Load... 読み込み(&L)... &Save... äæå­˜(&S)... Save and &Quit... äæå­˜ć—ć¦ēµ‚äŗ†(&Q)... Save &Template... ćƒ†ćƒ³ćƒ—ćƒ¬ćƒ¼ćƒˆć‚’äæå­˜(&T)... &Versioning ćƒćƒ¼ć‚øćƒ§ćƒ³(&V) Re&fresh ꛓꖰ(&F) St&atus ēŠ¶ę…‹(&A) &Connections ęŽ„ē¶š(&C) Patch&bay 惑惃惁惙悤(&B) &Transport ćƒˆćƒ©ćƒ³ć‚¹ćƒćƒ¼ćƒˆ(&T) Server settings will be only effective after restarting the JACK audio server. ć‚µćƒ¼ćƒćƒ¼čØ­å®šćÆJACKć‚Ŗćƒ¼ćƒ‡ć‚£ć‚Ŗć‚µćƒ¼ćƒćƒ¼ć‚’å†čµ·å‹•å¾Œć«ć®ćæ ęœ‰åŠ¹ćØćŖć‚Šć¾ć™ć€‚ Some settings will be only effective the next time you start this program. ć„ćć¤ć‹ć®čØ­å®šćÆę¬”å›žć«ć“ć®ćƒ—ćƒ­ć‚°ćƒ©ćƒ ć‚’čµ·å‹•ć—ćŸéš›ć«ć®ćæ ęœ‰åŠ¹ćØćŖć‚Šć¾ć™ć€‚ D-BUS: SetParameterValue('%1', '%2'): %3. (%4) D-BUS: ResetParameterValue('%1'): %2. (%3) D-BUS: GetParameterValue('%1'): %2. (%3) qjackctlMessagesStatusForm Messages / Status - JACK Audio Connection Kit ćƒ”ćƒƒć‚»ćƒ¼ć‚ø / ēŠ¶ę…‹ - -JACK Audio Connection Kit &Messages ćƒ”ćƒƒć‚»ćƒ¼ć‚ø(&M) Messages log ćƒ”ćƒƒć‚»ćƒ¼ć‚øć®ćƒ­ć‚° Messages output log ćƒ”ćƒƒć‚»ćƒ¼ć‚øå‡ŗåŠ›ćƒ­ć‚° &Status ēŠ¶ę…‹(&S) Status information ēŠ¶ę…‹ć®ęƒ…å ± Statistics since last server startup ęœ€å¾Œć«ć‚µćƒ¼ćƒćƒ¼ćŒé–‹å§‹ć—ć¦ć‹ć‚‰ć®ēµ±čØˆ Description é …ē›® Value 値 Reset XRUN statistic values XRUNēµ±čØˆå€¤ć®ćƒŖć‚»ćƒƒćƒˆ Re&set ćƒŖć‚»ćƒƒćƒˆ(&S) Refresh XRUN statistic values XRUNēµ±čØˆå€¤ć®ę›“ę–° &Refresh ꛓꖰ(&R) Server name ć‚µćƒ¼ćƒćƒ¼å Server state ć‚µćƒ¼ćƒćƒ¼ć®ēŠ¶ę…‹ DSP Load DSPč² č· Sample Rate ć‚µćƒ³ćƒ—ćƒ«ćƒ¬ćƒ¼ćƒˆ Buffer Size ćƒćƒƒćƒ•ć‚”ć‚µć‚¤ć‚ŗ Realtime Mode ćƒŖć‚¢ćƒ«ć‚æć‚¤ćƒ ćƒ¢ćƒ¼ćƒ‰ Transport state ćƒˆćƒ©ćƒ³ć‚¹ćƒćƒ¼ćƒˆć®ēŠ¶ę…‹ Transport Timecode ćƒˆćƒ©ćƒ³ć‚¹ćƒćƒ¼ćƒˆ ć‚æć‚¤ćƒ ć‚³ćƒ¼ćƒ‰ Transport BBT ćƒˆćƒ©ćƒ³ć‚¹ćƒćƒ¼ćƒˆ BBT Transport BPM ćƒˆćƒ©ćƒ³ć‚¹ćƒćƒ¼ćƒˆ BPM XRUN count since last server startup ęœ€å¾Œć«ć‚µćƒ¼ćƒćƒ¼ćŒé–‹å§‹ć—ć¦ć‹ć‚‰ć®XRUN恮ꕰ XRUN last time detected ę¤œå‡ŗć•ć‚ŒćŸXRUNć®ē¶™ē¶šę™‚é–“ XRUN last XRUNć®ē¶™ē¶š XRUN maximum XRUNć®ęœ€å¤§å€¤ XRUN minimum XRUNć®ęœ€å°å€¤ XRUN average XRUNć®å¹³å‡å€¤ XRUN total XRUNの合計 Maximum scheduling delay ć‚¹ć‚±ć‚øćƒ„ćƒ¼ćƒ«ć•ć‚ŒćŸćƒ‡ć‚£ćƒ¬ć‚¤ć®ęœ€å¤§å€¤ Time of last reset ęœ€å¾Œć®ćƒŖć‚»ćƒƒćƒˆć®ę™‚é–“ Logging stopped --- %1 --- ćƒ­ć‚°ć®ēµ‚äŗ† --- %1 --- Logging started --- %1 --- ćƒ­ć‚°ć®é–‹å§‹ --- %1 --- qjackctlPatchbay Warning č­¦å‘Š This will disconnect all sockets. Are you sure? ć™ć¹ć¦ć®ć‚½ć‚±ćƒƒćƒˆć‚’åˆ‡ę–­ć—ć¾ć™ 悈悍恗恄恧恙恋? qjackctlPatchbayForm Patchbay - JACK Audio Connection Kit 惑惃惁惙悤 - JACK Audio Connection Kit Move currently selected output socket down one position éøęŠžć—ć¦ć„ć‚‹å‡ŗåŠ›ć‚½ć‚±ćƒƒćƒˆć‚’äø‹ćøē§»å‹•ć—ć¾ć™ Down 下へ Create a new output socket ę–°ć—ć„å‡ŗåŠ›ć‚½ć‚±ćƒƒćƒˆć‚’ä½œęˆć—ć¾ć™ Add... 追加... Edit currently selected input socket properties éøęŠžć—ć¦ć„ć‚‹å…„åŠ›ć‚½ć‚±ćƒƒćƒˆć®ćƒ—ćƒ­ćƒ‘ćƒ†ć‚£ć‚’ē·Øé›†ć—ć¾ć™ Edit... 編集... Move currently selected output socket up one position éøęŠžć—ć¦ć„ć‚‹å‡ŗåŠ›ć‚½ć‚±ćƒƒćƒˆć‚’äøŠć«ē§»å‹•ć—ć¾ć™ Up 上へ Remove currently selected output socket éøęŠžć—ć¦ć„ć‚‹å‡ŗåŠ›ć‚½ć‚±ćƒƒćƒˆć‚’å‰Šé™¤ć—ć¾ć™ Remove 削除 Duplicate (copy) currently selected output socket éøęŠžć—ć¦ć„ć‚‹å‡ŗåŠ›ć‚½ć‚±ćƒƒćƒˆć‚’č¤‡č£½(ć‚³ćƒ”ćƒ¼)します Copy... ć‚³ćƒ”ćƒ¼... Remove currently selected input socket éøęŠžć—ć¦ć„ć‚‹å…„åŠ›ć‚½ć‚±ćƒƒćƒˆć‚’å‰Šé™¤ć—ć¾ć™ Duplicate (copy) currently selected input socket éøęŠžć—ć¦ć„ć‚‹å…„åŠ›ć‚½ć‚±ćƒƒćƒˆć‚’č¤‡č£½(ć‚³ćƒ”ćƒ¼)します Create a new input socket ę–°ć—ć„å…„åŠ›ć‚½ć‚±ćƒƒćƒˆć‚’ä½œęˆć—ć¾ć™ Edit currently selected output socket properties éøęŠžć—ć¦ć„ć‚‹å‡ŗåŠ›ć‚½ć‚±ćƒƒćƒˆć®ćƒ—ćƒ­ćƒ‘ćƒ†ć‚£ć‚’ē·Øé›†ć—ć¾ć™ Connect currently selected sockets éøęŠžć—ć¦ć„ć‚‹ć‚½ć‚±ćƒƒćƒˆć‚’ęŽ„ē¶šć—ć¾ć™ &Connect ęŽ„ē¶š(&C) Disconnect currently selected sockets éøęŠžć—ć¦ć„ć‚‹ć‚½ć‚±ćƒƒćƒˆć‚’åˆ‡ę–­ć—ć¾ć™ &Disconnect åˆ‡ę–­(&D) Disconnect all currently connected sockets ęŽ„ē¶šć•ć‚Œć¦ć„ć‚‹ć™ć¹ć¦ć®ć‚½ć‚±ćƒƒćƒˆć‚’åˆ‡ę–­ć—ć¾ć™ Disconnect &All ć™ć¹ć¦åˆ‡ę–­(&A) Expand all items ć™ć¹ć¦ć®ć‚¢ć‚¤ćƒ†ćƒ ć‚’å±•é–‹ć—ć¾ć™ E&xpand All すべて展開(&X) Refresh current patchbay view ćƒ‘ćƒƒćƒćƒ™ć‚¤ć®č”Øē¤ŗć‚’ę›“ę–°ć—ć¾ć™ &Refresh ꛓꖰ(&R) Create a new patchbay profile ę–°ć—ć„ćƒ‘ćƒƒćƒćƒ™ć‚¤ćƒ—ćƒ­ćƒ•ć‚”ć‚¤ćƒ«ć‚’ä½œęˆć—ć¾ć™ &New ę–°č¦(&N) Load patchbay profile ćƒ‘ćƒƒćƒćƒ™ć‚¤ćƒ—ćƒ­ćƒ•ć‚”ć‚¤ćƒ«ć‚’ćƒ­ćƒ¼ćƒ‰ć—ć¾ć™ &Load... 読み込み(&L)... Save current patchbay profile ćƒ‘ćƒƒćƒćƒ™ć‚¤ćƒ—ćƒ­ćƒ•ć‚”ć‚¤ćƒ«ć‚’äæå­˜ć—ć¾ć™ &Save... äæå­˜(&S)... Current (recent) patchbay profile(s) ē¾åœØć®(ęœ€čæ‘ä½æć£ćŸ)ćƒ‘ćƒƒćƒćƒ™ć‚¤ćƒ—ćƒ­ćƒ•ć‚”ć‚¤ćƒ« Toggle activation of current patchbay profile ē¾åœØć®ćƒ‘ćƒƒćƒćƒ™ć‚¤ćƒ—ćƒ­ćƒ•ć‚”ć‚¤ćƒ«ć®ęœ‰åŠ¹åŒ–/ē„”åŠ¹åŒ– Acti&vate ęœ‰åŠ¹åŒ–(&V) Warning č­¦å‘Š The patchbay definition has been changed: "%1" Do you want to save the changes? ćƒ‘ćƒƒćƒćƒ™ć‚¤ć®å®šē¾©ćŒå¤‰ę›“ć•ć‚Œć¦ć„ć¾ć™: "%1" å¤‰ę›“ć‚’äæå­˜ć—ć¾ć™ć‹? %1 [modified] %1 [変曓] Untitled%1 ē„”é”Œ%1 Error ć‚Øćƒ©ćƒ¼ Could not load patchbay definition file: "%1" ćƒ‘ćƒƒćƒćƒ™ć‚¤å®šē¾©ćƒ•ć‚”ć‚¤ćƒ«ć‚’ćƒ­ćƒ¼ćƒ‰ć§ćć¾ć›ć‚“: "%1" Could not save patchbay definition file: "%1" ćƒ‘ćƒƒćƒćƒ™ć‚¤å®šē¾©ćƒ•ć‚”ć‚¤ćƒ«ć‚’äæå­˜ć§ćć¾ć›ć‚“: "%1" New Patchbay definition ę–°č¦ćƒ‘ćƒƒćƒćƒ™ć‚¤ć®å®šē¾© Create patchbay definition as a snapshot of all actual client connections? ē¾åœØęœ‰åŠ¹ćŖć™ć¹ć¦ć®ć®ć‚Æćƒ©ć‚¤ć‚¢ćƒ³ćƒˆęŽ„ē¶šć‚’å…ƒć« ćƒ‘ćƒƒćƒćƒ™ć‚¤å®šē¾©ć‚’ä½œęˆć—ć¾ć™ć‹? Load Patchbay Definition ćƒ‘ćƒƒćƒćƒ™ć‚¤ć®å®šē¾©ć‚’ćƒ­ćƒ¼ćƒ‰ć—ć¾ć™ Patchbay Definition files ćƒ‘ćƒƒćƒćƒ™ć‚¤å®šē¾©ćƒ•ć‚”ć‚¤ćƒ« Save Patchbay Definition ćƒ‘ćƒƒćƒćƒ™ć‚¤ć®å®šē¾©ć‚’äæå­˜ć—ć¾ć™ active ć‚¢ć‚Æćƒ†ć‚£ćƒ– qjackctlPatchbayView Add... 追加... Edit... 編集... Copy... ć‚³ćƒ”ćƒ¼... Remove 削除 Exclusive ęŽ’ä»–ēš„ Forward ꗩ送悊 (None) (なし) Move Up äøŠćøē§»å‹• Move Down 下へ移動 &Connect ęŽ„ē¶š(&C) Alt+C Connect &Disconnect åˆ‡ę–­(&D) Alt+D Disconnect Disconnect &All ć™ć¹ć¦åˆ‡ę–­(&A) Alt+A Disconect All &Refresh ꛓꖰ(&R) Alt+R Refresh qjackctlSessionForm Session - JACK Audio Connection Kit ć‚»ćƒƒć‚·ćƒ§ćƒ³ - JACK Audio Connection Kit Load session ć‚»ćƒƒć‚·ćƒ§ćƒ³ć‚’ćƒ­ćƒ¼ćƒ‰ć—ć¾ć™ &Load... 読み込み(&L)... Recent session ęœ€čæ‘ć®ć‚»ćƒƒć‚·ćƒ§ćƒ³ &Recent ęœ€čæ‘ć®ć‚»ćƒƒć‚·ćƒ§ćƒ³(&R) Save session ć‚»ćƒƒć‚·ćƒ§ćƒ³ć‚’äæå­˜ć—ć¾ć™ &Save äæå­˜(&S) Save session versioning ć‚»ćƒƒć‚·ćƒ§ćƒ³ć®ćƒćƒ¼ć‚øćƒ§ćƒ³ć‚’äæå­˜ć—ć¾ć™ &Versioning ćƒćƒ¼ć‚øćƒ§ćƒ³(&V) Update session ć‚»ćƒƒć‚·ćƒ§ćƒ³ć®ę›“ę–° Re&fresh ꛓꖰ(&F) Session clients / connections Client / Ports ć‚Æćƒ©ć‚¤ć‚¢ćƒ³ćƒˆ / ćƒćƒ¼ćƒˆ UUID Command ć‚³ćƒžćƒ³ćƒ‰ Infra-clients / commands Infra-client Infra-command Add infra-client &Add Edit infra-client &Edit 編集(&E) Remove infra-client Re&move &Save... äæå­˜(&S)... Save and &Quit... äæå­˜ć—ć¦ēµ‚äŗ†(&Q)... Save &Template... ćƒ†ćƒ³ćƒ—ćƒ¬ćƒ¼ćƒˆć‚’äæå­˜(&T)... Load Session ć‚»ćƒƒć‚·ćƒ§ćƒ³ć‚’ćƒ­ćƒ¼ćƒ‰ Session directory ć‚»ćƒƒć‚·ćƒ§ćƒ³ć®ćƒ‡ć‚£ćƒ¬ć‚ÆćƒˆćƒŖ Save Session ć‚»ćƒƒć‚·ćƒ§ćƒ³ć®äæå­˜ and Quit ćć—ć¦ēµ‚äŗ† Template ćƒ†ćƒ³ćƒ—ćƒ¬ćƒ¼ćƒˆ &Clear ć‚ÆćƒŖć‚¢(&C) Warning č­¦å‘Š A session could not be found in this folder: "%1" ć“ć®ćƒ•ć‚©ćƒ«ćƒ€ćƒ¼ć«ć‚»ćƒƒć‚·ćƒ§ćƒ³ć‚’č¦‹ć¤ć‘ć‚‹ć“ćØćŒć§ćć¾ć›ć‚“: "%1" %1: loading session... %1: ć‚»ćƒƒć‚·ćƒ§ćƒ³ć‚’ćƒ­ćƒ¼ćƒ‰ć—ć¦ć„ć¾ć™... %1: load session %2. %1: ć‚»ćƒƒć‚·ćƒ§ćƒ³ć®ćƒ­ćƒ¼ćƒ‰ %2怂 A session already exists in this folder: "%1" Are you sure to overwrite the existing session? ć‚»ćƒƒć‚·ćƒ§ćƒ³ćÆć™ć§ć«ć“ć®ćƒ•ć‚©ćƒ«ćƒ€ćƒ¼ć«ć‚ć‚Šć¾ć™: "%1" å­˜åœØć™ć‚‹ć‚»ćƒƒć‚·ćƒ§ćƒ³ć‚’äøŠę›øćć—ć¾ć™ć‹? This folder already exists and is not empty: "%1" Are you sure to overwrite the existing folder? ć“ć®ćƒ•ć‚©ćƒ«ćƒ€ćƒ¼ćÆć™ć§ć«å­˜åœØć—ć¦ć„ć¦ć€ē©ŗć§ć™: "%1" å­˜åœØć™ć‚‹ćƒ•ć‚©ćƒ«ćƒ€ćƒ¼ć‚’äøŠę›øćć—ć¾ć™ć‹? %1: saving session... %1: ć‚»ćƒƒć‚·ćƒ§ćƒ³ć‚’äæå­˜ć—ć¦ć„ć¾ć™... %1: save session %2. %1: ć‚»ćƒƒć‚·ćƒ§ćƒ³ć®äæå­˜ %2怂 New Client qjackctlSessionInfraClientItemEditor Infra-command qjackctlSetupForm Setup - JACK Audio Connection Kit 設定 - JACK Audio Connection Kit Settings 設定 Preset &Name: ćƒ—ćƒŖć‚»ćƒƒćƒˆå(&N): Settings preset name ćƒ—ćƒŖć‚»ćƒƒćƒˆčØ­å®šå (default) defaultćÆå†…éƒØēš„ć«ćÆć‚·ćƒ³ćƒœćƒ«åćØćŖć£ć¦ć„ć‚‹ć‚ˆć†ć§ć€ć€Œę—¢å®šć€ćØć—ć¦ć—ć¾ć†ćØćć†ć„ć†ę–°č¦ćƒ—ćƒŖć‚»ćƒƒćƒˆćØć—ć¦ę‰±ć‚ć‚Œć‚‹ć‚ˆć†ć§ć™ć€‚ Save settings as current preset name čØ­å®šć‚’ē¾åœØć®ćƒ—ćƒŖć‚»ćƒƒćƒˆåćØć—ć¦äæå­˜ &Save äæå­˜(&S) Delete current settings preset ē¾åœØć®ćƒ—ćƒŖć‚»ćƒƒćƒˆć‚’å‰Šé™¤ć—ć¾ć™ &Delete 削除(&D) jackd jackdmp jackstart &Name: 名前(&N): The JACK Audio Connection Kit sound server name JACK Audio Connection Kitć‚µć‚¦ćƒ³ćƒ‰ć‚µćƒ¼ćƒćƒ¼å Driv&er: ćƒ‰ćƒ©ć‚¤ćƒćƒ¼(&E): The audio backend driver interface to use ä½æē”Øć™ć‚‹ć‚Ŗćƒ¼ćƒ‡ć‚£ć‚Ŗćƒćƒƒć‚Æć‚Øćƒ³ćƒ‰ćƒ‰ćƒ©ć‚¤ćƒćƒ¼ć‚¤ćƒ³ć‚æćƒ¼ćƒ•ć‚§ć‚¤ć‚¹ dummy sun oss alsa portaudio coreaudio freebob firewire net netone Parameters ćƒ‘ćƒ©ćƒ”ćƒ¼ć‚æćƒ¼ MIDI Driv&er: MIDIćƒ‰ćƒ©ć‚¤ćƒćƒ¼(&E): The ALSA MIDI backend driver to use 使用するALSA MIDIćƒćƒƒć‚Æć‚Øćƒ³ćƒ‰ćƒ‰ćƒ©ć‚¤ćƒćƒ¼ none なし raw seq Time in seconds that client is delayed after server startup ć‚µćƒ¼ćƒćƒ¼ć‚’é–‹å§‹ć—ć¦ć‹ć‚‰ć®ć‚Æćƒ©ć‚¤ć‚¢ćƒ³ćƒˆćŒé…å»¶ć™ć‚‹ę™‚é–“(ē§’) Latency: ćƒ¬ć‚¤ćƒ†ćƒ³ć‚·ćƒ¼: Output latency in milliseconds, calculated based on the period, rate and buffer settings ćƒ”ćƒŖć‚Ŗćƒ‰ć€ć‚µćƒ³ćƒ—ćƒ«ćƒ¬ćƒ¼ćƒˆćć—ć¦ćƒćƒƒćƒ•ć‚”ćƒ¼ć‚µć‚¤ć‚ŗć‹ć‚‰čØˆē®—ć—ćŸć€å‡ŗåŠ›ć®ćƒ¬ć‚¤ćƒ†ćƒ³ć‚· (ćƒŸćƒŖē§’) Use realtime scheduling ćƒŖć‚¢ćƒ«ć‚æć‚¤ćƒ ć‚¹ć‚±ć‚øćƒ„ćƒ¼ćƒŖćƒ³ć‚°ć‚’ä½æē”Øć—ć¾ć™ &Realtime ćƒŖć‚¢ćƒ«ć‚æć‚¤ćƒ (&R) Do not attempt to lock memory, even if in realtime mode ćƒŖć‚¢ćƒ«ć‚æć‚¤ćƒ ćƒ¢ćƒ¼ćƒ‰ć§ćŖćć¦ć‚‚ć€ćƒ”ćƒ¢ćƒŖćƒ¼ć‚’ćƒ­ćƒƒć‚Æć—ćŖć„ć‚ˆć†ć«ć—ć¾ć™ No Memory Loc&k Unlock memory of common toolkit libraries (GTK+, QT, FLTK, Wine) äø€čˆ¬ēš„ćŖćƒ„ćƒ¼ćƒ«ć‚­ćƒƒćƒˆćƒ©ć‚¤ćƒ–ćƒ©ćƒŖćƒ¼ć®ćƒ”ćƒ¢ćƒŖćƒ¼ć‚’ć‚¢ćƒ³ćƒ­ćƒƒć‚Æć™ć‚‹ (GTK+, QT, FLTK, Wine) &Unlock Memory Ignore xruns reported by the backend driver ćƒćƒƒć‚Æć‚Øćƒ³ćƒ‰ćƒ‰ćƒ©ć‚¤ćƒćƒ¼ćŒå ±å‘Šć™ć‚‹XRUNを焔視します So&ft Mode ć‚½ćƒ•ćƒˆćƒ¢ćƒ¼ćƒ‰(&f) Provide output monitor ports å‡ŗåŠ›ćƒ¢ćƒ‹ć‚æćƒ¼ē”Øć«ćƒćƒ¼ćƒˆć‚’ęä¾›ć—ć¾ć™ &Monitor ćƒ¢ćƒ‹ć‚æćƒ¼(&M) Force 16bit mode instead of failing over 32bit (default) 32ćƒ“ćƒƒćƒˆćƒ¢ćƒ¼ćƒ‰(ę—¢å®š)ć§å¤±ę•—ć™ć‚‹å “åˆć«16ćƒ“ćƒƒćƒˆćƒ¢ćƒ¼ćƒ‰ć‚’å¼·åˆ¶ć§ćć¾ć™ Force &16bit å¼·åˆ¶ēš„ć«16bitを使用(&1) Enable hardware monitoring of capture ports éŒ²éŸ³ćƒćƒ¼ćƒˆć®ćƒćƒ¼ćƒ‰ć‚¦ć‚§ć‚¢ćƒ¢ćƒ‹ć‚æćƒŖćƒ³ć‚°ć‚’ęœ‰åŠ¹ć«ć™ć‚‹ H/W M&onitor H/Wćƒ¢ćƒ‹ć‚æćƒ¼ć‚’ęœ‰åŠ¹(&O) Enable hardware metering on cards that support it ćƒćƒ¼ćƒ‰ć‚¦ć‚§ć‚¢ćƒ”ćƒ¼ć‚æćƒ¼ć‚’ć‚µćƒćƒ¼ćƒˆć—ć¦ć„ć‚‹ć‚«ćƒ¼ćƒ‰ć§ćÆćć‚Œć‚’ęœ‰åŠ¹ć«ć—ć¾ć™ H/&W Meter H/Wćƒ”ćƒ¼ć‚æćƒ¼ć‚’ęœ‰åŠ¹(&W) Ignore hardware period/buffer size ćƒćƒ¼ćƒ‰ć‚¦ć‚§ć‚¢ć®ćƒ”ćƒŖć‚Ŗćƒ‰/ćƒćƒƒćƒ•ć‚”ćƒ¼ć‚µć‚¤ć‚ŗć‚’ē„”č¦–ć—ć¾ć™ &Ignore H/W H/Wを焔視(&I) Whether to give verbose output on messages ćƒ”ćƒƒć‚»ćƒ¼ć‚øć«č©³ē“°ćŖå‡ŗåŠ›ć‚’č”Œć†ć‹ć©ć†ć‹ &Verbose messages č©³ē“°ćŖćƒ”ćƒƒć‚»ćƒ¼ć‚ø(&V) &Output Device: å‡ŗåŠ›ćƒ‡ćƒć‚¤ć‚¹(&O): &Interface: ć‚¤ćƒ³ć‚æćƒ¼ćƒ•ć‚§ćƒ¼ć‚¹(&I): Maximum input audio hardware channels to allocate å‰²ć‚Šå½“ć¦ć‚‹å…„åŠ›ć‚Ŗćƒ¼ćƒ‡ć‚£ć‚Ŗćƒćƒ¼ćƒ‰ć‚¦ć‚§ć‚¢ćƒćƒ£ćƒ³ćƒćƒ«ć®ęœ€å¤§å€¤ &Audio: ć‚Ŗćƒ¼ćƒ‡ć‚£ć‚Ŗ(&A): Dit&her: ćƒ‡ć‚£ć‚¶ćƒŖćƒ³ć‚°(&h): External output latency (frames) å¤–éƒØå‡ŗåŠ›ćƒ¬ć‚¤ćƒ†ćƒ³ć‚·ćƒ¼(ćƒ•ćƒ¬ćƒ¼ćƒ ) &Input Device: å…„åŠ›ćƒ‡ćƒć‚¤ć‚¹(&I): Provide either audio capture, playback or both éŸ³å£°ć®å…„åŠ›ć‹å‡ŗåŠ›ć€ć‚ć‚‹ć„ćÆå…„å‡ŗåŠ›ć‹ć‚‰éøęŠžć—ć¾ć™ Duplex å…„å‡ŗåŠ› Capture Only å…„åŠ›ć®ćæ Playback Only å‡ŗåŠ›ć®ćæ The PCM device name to use 使用するPCMćƒ‡ćƒć‚¤ć‚¹å hw:0 plughw:0 /dev/audio /dev/dsp > Alternate input device for capture éŒ²éŸ³ć®ćŸć‚ć®å…„åŠ›ćƒ‡ćƒć‚¤ć‚¹ć‚’éøęŠž Maximum output audio hardware channels to allocate å‰²ć‚Šå½“ć¦ć‚‹ć‚Ŗćƒ¼ćƒ‡ć‚£ć‚Ŗå‡ŗåŠ›ćƒćƒ¼ćƒ‰ć‚¦ć‚§ć‚¢ćƒćƒ£ćƒ³ćƒćƒ«ć®ęœ€å¤§å€¤ Alternate output device for playback å†ē”Ÿć®ćŸć‚ć®å‡ŗåŠ›ćƒ‡ćƒć‚¤ć‚¹ External input latency (frames) å¤–éƒØå…„åŠ›ć®ćƒ¬ć‚¤ćƒ†ćƒ³ć‚·ćƒ¼(ćƒ•ćƒ¬ćƒ¼ćƒ ) Set dither mode ćƒ‡ć‚£ć‚¶ćƒŖćƒ³ć‚°ćƒ¢ćƒ¼ćƒ‰ć‚’ć‚»ćƒƒćƒˆć—ć¾ć™ None なし Rectangular Shaped Triangular Number of periods in the hardware buffer ćƒćƒ¼ćƒ‰ć‚¦ć‚§ć‚¢ćƒćƒƒćƒ•ć‚”ćƒ¼ć®ćƒ”ćƒŖć‚Ŗćƒ‰ę•° Priorit&y: å„Ŗå…ˆåŗ¦(&y): &Frames/Period: ćƒ•ćƒ¬ćƒ¼ćƒ /ćƒ”ćƒŖć‚Ŗćƒ‰(&F): Frames per period between process() calls process()ć‚³ćƒ¼ćƒ«é–“ć®ćƒ”ćƒŖć‚Ŗćƒ‰ęÆŽć®ćƒ•ćƒ¬ćƒ¼ćƒ ę•° 16 32 64 128 256 512 1024 2048 4096 Port Ma&ximum: ęœ€å¤§ćƒćƒ¼ćƒˆę•°(&x): &Channels: ćƒćƒ£ćƒ³ćƒćƒ«(&C): Number of microseconds to wait between engine processes (dummy) ć‚Øćƒ³ć‚øćƒ³ćƒ—ćƒ­ć‚»ć‚¹é–“ć®å¾…ć”ę™‚é–“ć‚’ćƒžć‚¤ć‚Æćƒ­ē§’ć§ęŒ‡å®šć—ć¾ć™(dummy) 21333 Sample rate in frames per second ć‚µćƒ³ćƒ—ćƒŖćƒ³ć‚°ćƒ¬ćƒ¼ćƒˆć‚’1ē§’ć‚ćŸć‚Šć®ćƒ•ćƒ¬ćƒ¼ćƒ ę•°ć§ęŒ‡å®šć—ć¾ć™ 22050 32000 44100 48000 88200 96000 192000 Scheduler priority when running realtime ćƒŖć‚¢ćƒ«ć‚æć‚¤ćƒ ćƒ¢ćƒ¼ćƒ‰ć§ēØ¼å‹•ć—ć¦ć„ć‚‹å “åˆć®ć‚¹ć‚±ć‚øćƒ„ćƒ¼ćƒ©ćƒ¼ć«ćŠć‘ć‚‹å„Ŗå…ˆåŗ¦ć‚’čØ­å®šć—ć¾ć™ &Word Length: ćƒÆćƒ¼ćƒ‰é•·(&W): Periods/&Buffer: ćƒ”ćƒŖć‚Ŗćƒ‰/ćƒćƒƒćƒ•ć‚”ćƒ¼(&B): Word length ćƒÆćƒ¼ćƒ‰é•· Maximum number of ports the JACK server can manage JACKć‚µćƒ¼ćƒćƒ¼ćŒē®”ē†ć™ć‚‹ćƒćƒ¼ćƒˆć®ęœ€å¤§ę•° &Wait (usec): 待ご時間(ćƒžć‚¤ć‚Æćƒ­ē§’)(&W): Sample &Rate: ć‚µćƒ³ćƒ—ćƒ«ćƒ¬ćƒ¼ćƒˆ(&R): Maximum number of audio channels to allocate å‰²ć‚Šå½“ć¦ć‚‹ć‚Ŗćƒ¼ćƒ‡ć‚£ć‚Ŗćƒćƒ£ćƒ³ćƒćƒ«ć®ęœ€å¤§å€¤ &Timeout (msec): ć‚æć‚¤ćƒ ć‚¢ć‚¦ćƒˆ(ćƒŸćƒŖē§’)(&T): Set client timeout limit in miliseconds ć‚Æćƒ©ć‚¤ć‚¢ćƒ³ćƒˆć®ć‚æć‚¤ćƒ ćƒŖćƒŸćƒƒćƒˆć‚’ćƒŸćƒŖē§’ć§ęŒ‡å®šć—ć¾ć™ Please do not touch these settings unless you know what you are doing. 200 500 1000 2000 5000 10000 Options ć‚Ŗćƒ—ć‚·ćƒ§ćƒ³ Scripting ć‚¹ć‚ÆćƒŖćƒ—ćƒˆ Whether to execute a custom shell script before starting up the JACK audio server. JACKć‚Ŗćƒ¼ćƒ‡ć‚£ć‚Ŗć‚µćƒ¼ćƒćƒ¼ć‚’é–‹å§‹ć™ć‚‹å‰ć«ä»»ę„ć®ć‚·ć‚§ćƒ«ć‚¹ć‚ÆćƒŖćƒ—ćƒˆć‚’å®Ÿč”Œć™ć‚‹ć‹ć©ć†ć‹ć€‚ Execute script on Start&up: ć‚¹ć‚æćƒ¼ćƒˆć‚¢ćƒƒćƒ—ę™‚ć«ć‚¹ć‚ÆćƒŖćƒ—ćƒˆć‚’å®Ÿč”Œ(&U): Whether to execute a custom shell script after starting up the JACK audio server. JACKć‚Ŗćƒ¼ćƒ‡ć‚£ć‚Ŗć‚µćƒ¼ćƒćƒ¼ć‚’é–‹å§‹ć—ćŸē›“å¾Œć«ä»»ę„ć®ć‚·ć‚§ćƒ«ć‚¹ć‚ÆćƒŖćƒ—ćƒˆć‚’å®Ÿč”Œć™ć‚‹ć‹ć©ć†ć‹ć€‚ Execute script after &Startup: ć‚¹ć‚æćƒ¼ćƒˆć‚¢ćƒƒćƒ—å¾Œć«ć‚¹ć‚ÆćƒŖćƒ—ćƒˆć‚’å®Ÿč”Œ(&S): Whether to execute a custom shell script before shuting down the JACK audio server. JACKć‚Ŗćƒ¼ćƒ‡ć‚£ć‚Ŗć‚µćƒ¼ćƒćƒ¼ć‚’ēµ‚äŗ†ć™ć‚‹ē›“å‰ć«ä»»ę„ć®ć‚·ć‚§ćƒ«ć‚¹ć‚ÆćƒŖćƒ—ćƒˆć‚’å®Ÿč”Œć™ć‚‹ć‹ć©ć†ć‹ć€‚ Execute script on Shut&down: ć‚·ćƒ£ćƒƒćƒˆćƒ€ć‚¦ćƒ³ę™‚ć«ć‚¹ć‚ÆćƒŖćƒ—ćƒˆć‚’å®Ÿč”Œ(&D): Command line to be executed before starting up the JACK audio server JACKć‚Ŗćƒ¼ćƒ‡ć‚£ć‚Ŗć‚µćƒ¼ćƒćƒ¼ć‚’é–‹å§‹ć™ć‚‹å‰ć«å®Ÿč”Œć•ć‚Œć‚‹ć‚³ćƒžćƒ³ćƒ‰ćƒ©ć‚¤ćƒ³ Scripting argument meta-symbols ćƒ”ć‚æć‚·ćƒ³ćƒœćƒ«ćØć—ć¦ä½æćˆć‚‹ć‚¹ć‚ÆćƒŖćƒ—ćƒˆå¼•ę•° Browse for script to be executed before starting up the JACK audio server JACKć‚Ŗćƒ¼ćƒ‡ć‚£ć‚Ŗć‚µćƒ¼ćƒćƒ¼ć‚’é–‹å§‹ć™ć‚‹å‰ć«å®Ÿč”Œć™ć‚‹ć‚¹ć‚ÆćƒŖćƒ—ćƒˆć‚’å‚ē…§ć—ć¾ć™ ... Command line to be executed after starting up the JACK audio server JACKć‚Ŗćƒ¼ćƒ‡ć‚£ć‚Ŗć‚µćƒ¼ćƒćƒ¼ć‚’é–‹å§‹ć—ćŸå¾Œć«å®Ÿč”Œć•ć‚Œć‚‹ć‚³ćƒžćƒ³ćƒ‰ćƒ©ć‚¤ćƒ³ Browse for script to be executed after starting up the JACK audio server JACKć‚Ŗćƒ¼ćƒ‡ć‚£ć‚Ŗć‚µćƒ¼ćƒćƒ¼ć‚’é–‹å§‹ć—ćŸå¾Œć«å®Ÿč”Œć™ć‚‹ć‚¹ć‚ÆćƒŖćƒ—ćƒˆć‚’å‚ē…§ć—ć¾ć™ Browse for script to be executed before shutting down the JACK audio server JACKć‚Ŗćƒ¼ćƒ‡ć‚£ć‚Ŗć‚µćƒ¼ćƒćƒ¼ć‚’ēµ‚äŗ†ć™ć‚‹ē›“å‰ć«å®Ÿč”Œć™ć‚‹ć‚¹ć‚ÆćƒŖćƒ—ćƒˆć‚’å‚ē…§ć—ć¾ć™ Command line to be executed before shutting down the JACK audio server JACKć‚Ŗćƒ¼ćƒ‡ć‚£ć‚Ŗć‚µćƒ¼ćƒćƒ¼ć‚’ēµ‚äŗ†ć™ć‚‹ē›“å‰ć«å®Ÿč”Œć•ć‚Œć‚‹ć‚³ćƒžćƒ³ćƒ‰ćƒ©ć‚¤ćƒ³ Whether to execute a custom shell script after shuting down the JACK audio server. JACKć‚Ŗćƒ¼ćƒ‡ć‚£ć‚Ŗć‚µćƒ¼ćƒćƒ¼ć‚’ēµ‚äŗ†ć—ćŸē›“å¾Œć«ä»»ę„ć®ć‚·ć‚§ćƒ«ć‚¹ć‚ÆćƒŖćƒ—ćƒˆć‚’å®Ÿč”Œć™ć‚‹ć‹ć©ć†ć‹ć€‚ Execute script after Shu&tdown: ć‚·ćƒ£ćƒƒćƒˆćƒ€ć‚¦ćƒ³å¾Œć«ć‚¹ć‚ÆćƒŖćƒ—ćƒˆć‚’å®Ÿč”Œ(&D): Browse for script to be executed after shutting down the JACK audio server JACKć‚Ŗćƒ¼ćƒ‡ć‚£ć‚Ŗć‚µćƒ¼ćƒćƒ¼ć‚’ēµ‚äŗ†ć—ćŸē›“å¾Œć«å®Ÿč”Œć™ć‚‹ć‚¹ć‚ÆćƒŖćƒ—ćƒˆć‚’å‚ē…§ć—ć¾ć™ Command line to be executed after shutting down the JACK audio server JACKć‚Ŗćƒ¼ćƒ‡ć‚£ć‚Ŗć‚µćƒ¼ćƒćƒ¼ć‚’ēµ‚äŗ†ć—ćŸē›“å¾Œć«å®Ÿč”Œć•ć‚Œć‚‹ć‚³ćƒžćƒ³ćƒ‰ćƒ©ć‚¤ćƒ³ Statistics 統計 Whether to capture standard output (stdout/stderr) into messages window ćƒ”ćƒƒć‚»ćƒ¼ć‚øć‚¦ć‚£ćƒ³ćƒ‰ć‚¦äø­ć«ęØ™ęŗ–å‡ŗåŠ›(stdout/stderr)ć‚’čØ˜éŒ²ć™ć‚‹ć‹ć©ć†ć‹ &Capture standard output ęØ™ęŗ–å‡ŗåŠ›ć®čØ˜éŒ²(&C) &XRUN detection regex: XRUNę¤œå‡ŗć®ę­£č¦č”Øē¾(&X): Regular expression used to detect XRUNs on server output messages ć‚µćƒ¼ćƒćƒ¼å‡ŗåŠ›ćƒ”ćƒƒć‚»ćƒ¼ć‚øå†…ć«ćŠć„ć¦XRUNć‚’ę¤œå‡ŗć—ćŸéš›ć«ä½æē”Øć•ć‚Œć‚‹ę­£č¦č”Øē¾ xrun of at least ([0-9|\.]+) msecs Connections ęŽ„ē¶š Whether to reset all connections when a patchbay definition is activated. &Reset all connections on patchbay activation Whether to issue a warning on active patchbay port disconnections. &Warn on active patchbay disconnections Whether to enable JACK D-Bus interface &Enable JACK D-Bus interface 10 Patchbay definition file to be activated as connection persistence profile ęŽ„ē¶šć«ćŠć„ć¦ęŒē¶šć—ć¦ęœ‰åŠ¹ć«ć™ć‚‹ćƒ‘ćƒƒćƒćƒ™ć‚¤å®šē¾©ćƒ•ć‚”ć‚¤ćƒ«ć‚’ęŒ‡å®šć—ć¾ć™ Browse for a patchbay definition file to be activated ęœ‰åŠ¹ć«ć™ć‚‹ćƒ‘ćƒƒćƒćƒ™ć‚¤å®šē¾©ć®å‚ē…§ Whether to activate a patchbay definition for connection persistence profile. ęŽ„ē¶šć«ćŠć„ć¦ē¶™ē¶šć—ć¦ęœ‰åŠ¹ć«ć™ć‚‹ćƒ‘ćƒƒćƒćƒ™ć‚¤å®šē¾©ć‚’ęœ‰åŠ¹ć«ć™ć‚‹ć‹ć©ć†ć‹ć€‚ Activate &Patchbay persistence: ęŒē¶šēš„ćƒ‘ćƒƒćƒćƒ™ć‚¤ęœ‰åŠ¹(&P): Logging ćƒ­ć‚°ć®čØ˜éŒ² Messages log file ćƒ”ćƒƒć‚»ćƒ¼ć‚øćƒ­ć‚°ćƒ•ć‚”ć‚¤ćƒ« Browse for the messages log file location ćƒ”ćƒƒć‚»ćƒ¼ć‚øćƒ­ć‚°ćƒ•ć‚”ć‚¤ćƒ«ć®å “ę‰€ć‚’å‚ē…§ć—ć¾ć™ Whether to activate a messages logging to file. ćƒ”ćƒƒć‚»ćƒ¼ć‚øć‚’ćƒ•ć‚”ć‚¤ćƒ«ć«čØ˜éŒ²ć™ć‚‹ć‹ć©ć†ć‹ć€‚ Server &Prefix: ć‚µćƒ¼ćƒćƒ¼ęŽ„é ­č¾ž(&P): Server path (command line prefix) ć‚µćƒ¼ćƒćƒ¼ćƒ‘ć‚¹ (ć‚³ćƒžćƒ³ćƒ‰ćƒ©ć‚¤ćƒ³ęŽ„é ­č¾ž) &Channels I/O: ćƒćƒ£ćƒ³ćƒćƒ«I/O(&C): &Latency I/O: ćƒ¬ć‚¤ćƒ†ćƒ³ć‚·ćƒ¼I/O(&L): Server Suffi&x: ć‚µćƒ¼ćƒćƒ¼ęŽ„å°¾č¾ž(&X): Extra driver options (command line suffix) ä»»ę„ć®ćƒ‰ćƒ©ć‚¤ćƒćƒ¼ć‚Ŗćƒ—ć‚·ćƒ§ćƒ³ (ć‚³ćƒžćƒ³ćƒ‰ćƒ©ć‚¤ćƒ³ęŽ„å°¾č¾ž) Start De&lay: é–‹å§‹ćƒ‡ć‚£ćƒ¬ć‚¤(&L): secs ē§’ 0 msecs 0ćƒŸćƒŖē§’ &Messages log file: ćƒ”ćƒƒć‚»ćƒ¼ć‚øćƒ­ć‚°ćƒ•ć‚”ć‚¤ćƒ«(&M): Display 蔨示 Time Display 時間蔨示 Time F&ormat: ę™‚é–“ćƒ•ć‚©ćƒ¼ćƒžćƒƒćƒˆ(&O): The general time format on display å…±é€šć—ć¦ä½æć‚ć‚Œć‚‹ę™‚é–“č”ØčØ˜ćƒ•ć‚©ćƒ¼ćƒžćƒƒćƒˆ hh:mm:ss hh:mm:ss.d hh:mm:ss.dd hh:mm:ss.ddd Transport &Time Code ćƒˆćƒ©ćƒ³ć‚¹ćƒćƒ¼ćƒˆć®ć‚æć‚¤ćƒ ć‚³ćƒ¼ćƒ‰(&T) Transport &BBT (bar:beat.ticks) ćƒˆćƒ©ćƒ³ć‚¹ćƒćƒ¼ćƒˆć®BBT (bar: beat, ticks)(&B) Elapsed time since last &Reset ęœ€å¾Œć®ćƒŖć‚»ćƒƒćƒˆć‹ć‚‰ć®ēµŒéŽę™‚é–“(&R) Elapsed time since last &XRUN ęœ€å¾Œć®XRUNć‹ć‚‰ć®ēµŒéŽę™‚é–“(&X) Sample front panel normal display font ćƒ•ćƒ­ćƒ³ćƒˆćƒ‘ćƒćƒ«ć®é€šåøøč”Øē¤ŗć®ćƒ•ć‚©ćƒ³ćƒˆć‚µćƒ³ćƒ—ćƒ« Sample big time display font ćƒ“ćƒƒć‚°ć‚æć‚¤ćƒ č”Øē¤ŗć®ć‚µćƒ³ćƒ—ćƒ«ćƒ•ć‚©ćƒ³ćƒˆ Big Time display: ćƒ“ćƒƒć‚°ć‚æć‚¤ćƒ č”Øē¤ŗ: Select font for front panel normal display ćƒ•ćƒ­ćƒ³ćƒˆćƒ‘ćƒćƒ«č”Øē¤ŗć«ä½æē”Øć™ć‚‹ćƒ•ć‚©ćƒ³ćƒˆć‚’éøęŠžć—ć¾ć™ &Font... ćƒ•ć‚©ćƒ³ćƒˆ(&F)... Select font for big time display ćƒ“ćƒƒć‚°ć‚æć‚¤ćƒ č”Øē¤ŗć«ä½æē”Øć™ć‚‹ćƒ•ć‚©ćƒ³ćƒˆć‚’éøęŠžć—ć¾ć™ Normal display: é€šåøøć®č”Øē¤ŗ: Whether to enable a shiny glass light effect on the main display ćƒ”ć‚¤ćƒ³č”Øē¤ŗć®åŠ¹ęžœć«å…‰ę²¢ć®ć‚ć‚‹ć‚¬ćƒ©ć‚¹ćƒ©ć‚¤ćƒˆć‚’é©ē”Øć™ć‚‹ć‹ć©ć†ć‹ &Display shiny glass light effect å…‰ę²¢ć®ć‚ć‚‹ć‚¬ćƒ©ć‚¹ćƒ©ć‚¤ćƒˆåŠ¹ęžœ(&D) Whether to enable blinking (flashing) of the server mode (RT) indicator ć‚µćƒ¼ćƒćƒ¼ćƒ¢ćƒ¼ćƒ‰(RT)ć‚¤ćƒ³ć‚øć‚±ćƒ¼ć‚æćƒ¼ć‚’ē‚¹ę»…ć™ć‚‹ć‹ć©ć†ć‹ Blin&k server mode indicator ć‚µćƒ¼ćƒćƒ¼ćƒ¢ćƒ¼ćƒ‰ć‚¤ćƒ³ć‚øć‚±ćƒ¼ć‚æćƒ¼ć®ē‚¹ę»…(&K) Messages Window ćƒ”ćƒƒć‚»ćƒ¼ć‚øć‚¦ć‚£ćƒ³ćƒ‰ć‚¦ Sample messages text font display ćƒ”ćƒƒć‚»ćƒ¼ć‚øćƒ†ć‚­ć‚¹ćƒˆč”Øē¤ŗć«ä½æē”Øć™ć‚‹ćƒ•ć‚©ćƒ³ćƒˆć®ć‚µćƒ³ćƒ—ćƒ« Select font for the messages text display ćƒ”ćƒƒć‚»ćƒ¼ć‚øćƒ†ć‚­ć‚¹ćƒˆč”Øē¤ŗć«ä½æē”Øć™ć‚‹ćƒ•ć‚©ćƒ³ćƒˆć‚’éøęŠžć—ć¾ć™ Whether to keep a maximum number of lines in the messages window ćƒ”ćƒƒć‚»ćƒ¼ć‚øć‚¦ć‚£ćƒ³ćƒ‰ć‚¦ć«1åŗ¦ć«č”Øē¤ŗć§ćć‚‹č”Œę•°ć®ęœ€å¤§å€¤ &Messages limit: ćƒ”ćƒƒć‚»ćƒ¼ć‚øćƒŖćƒŸćƒƒćƒˆ(&M): The maximum number of message lines to keep in view ćƒ”ćƒƒć‚»ćƒ¼ć‚øćƒ“ćƒ„ćƒ¼ć«ļ¼‘åŗ¦ć«č”Øē¤ŗć§ćć‚‹č”Œę•°ć®ęœ€å¤§å€¤ 100 250 2500 Connections Window ęŽ„ē¶šć‚¦ć‚£ćƒ³ćƒ‰ć‚¦ Sample connections view font ęŽ„ē¶šćƒ“ćƒ„ćƒ¼ć«ä½æē”Øć™ć‚‹ćƒ•ć‚©ćƒ³ćƒˆć®ć‚µćƒ³ćƒ—ćƒ« Select font for the connections view ęŽ„ē¶šćƒ“ćƒ„ćƒ¼ć«ä½æē”Øć™ć‚‹ćƒ•ć‚©ćƒ³ćƒˆć‚’éøęŠžć—ć¾ć™ &Icon size: ć‚¢ć‚¤ć‚³ćƒ³ć‚µć‚¤ć‚ŗ(&I): The icon size for each item of the connections view ć‚³ćƒć‚Æć‚·ćƒ§ćƒ³ćƒ“ćƒ„ćƒ¼ć«č”Øē¤ŗć•ć‚Œć‚‹ćć‚Œćžć‚Œć®ć‚¢ć‚¤ć‚³ćƒ³ć®ć‚µć‚¤ć‚ŗ 16 x 16 32 x 32 64 x 64 Whether to draw connection lines as cubic Bezier curves ęŽ„ē¶šē·šć‚’ć‚­ćƒ„ćƒ¼ćƒ“ćƒƒć‚Æćƒ™ć‚øć‚§ę›²ē·šć§ęćć‹ć©ć†ć‹ Draw connection and patchbay lines as Be&zier curves ęŽ„ē¶šćØćƒ‘ćƒƒćƒćƒ™ć‚¤ć®ē·šć‚’ćƒ™ć‚øć‚§ę›²ē·šć§ęē”»(&z) Whether to enable client/port name aliases on the connections window ęŽ„ē¶šć‚¦ć‚£ćƒ³ćƒ‰ć‚¦ć«ć‚Æćƒ©ć‚¤ć‚¢ćƒ³ćƒˆ/ćƒćƒ¼ćƒˆć®ć‚Øć‚¤ćƒŖć‚¢ć‚¹åć‚’ęœ‰åŠ¹ćØć™ć‚‹ć‹ć©ć†ć‹ E&nable client/port aliases ć‚Æćƒ©ć‚¤ć‚¢ćƒ³ćƒˆ/ćƒćƒ¼ćƒˆć®ć‚Øć‚¤ćƒŖć‚¢ć‚¹åć®ęœ‰åŠ¹åŒ–(&n) Whether to enable in-place client/port name editing (rename) ć‚Æćƒ©ć‚¤ć‚¢ćƒ³ćƒˆ/ćƒćƒ¼ćƒˆåć®ē·Øé›†ļ¼ˆćƒŖćƒćƒ¼ćƒ ļ¼‰ Ena&ble client/port aliases editing (rename) ć‚Æćƒ©ć‚¤ć‚¢ćƒ³ćƒˆ/ćƒćƒ¼ćƒˆć®ć‚Øć‚¤ćƒŖć‚¢ć‚¹åē·Øé›†(ćƒŖćƒćƒ¼ćƒ )ć‚’ęœ‰åŠ¹(&b) &JACK client/port aliases: JACKć‚Æćƒ©ć‚¤ć‚¢ćƒ³ćƒˆ/ćƒćƒ¼ćƒˆ ć‚Øć‚¤ćƒŖć‚¢ć‚¹(&J): Advanced JACK client/port aliases display mode JACKć®ć‚Æćƒ©ć‚¤ć‚¢ćƒ³ćƒˆ/ćƒćƒ¼ćƒˆć‚Øć‚¤ćƒŖć‚¢ć‚¹č”Øē¤ŗćƒ¢ćƒ¼ćƒ‰ Default ę—¢å®š First 1番目 Second 2番目 JACK client/port pretty-name (metadata) display mode Enable JA&CK client/port pretty-names (metadata) Misc ćć®ä»– Other ćć®ä»– Whether to start JACK audio server immediately on application startup ć‚¢ćƒ—ćƒŖć‚±ćƒ¼ć‚·ćƒ§ćƒ³é–‹å§‹ę™‚ć«JACKć‚Ŗćƒ¼ćƒ‡ć‚£ć‚Ŗć‚µćƒ¼ćƒćƒ¼ć‚’é–‹å§‹ć™ć‚‹ć‹ć©ć†ć‹ &Start JACK audio server on application startup JACKć‚Ŗćƒ¼ćƒ‡ć‚£ć‚Ŗć‚µćƒ¼ćƒćƒ¼ć®č‡Ŗå‹•čµ·å‹•(&S) Whether to ask for confirmation on application exit ć‚¢ćƒ—ćƒŖć‚±ćƒ¼ć‚·ćƒ§ćƒ³ćŒēµ‚äŗ†ć™ć‚‹éš›ć«ē¢ŗčŖć™ć‚‹ &Confirm application close ć‚¢ćƒ—ćƒŖć‚±ćƒ¼ć‚·ćƒ§ćƒ³ć®ēµ‚äŗ†ć®ē¢ŗčŖ(&C) Whether to keep all child windows on top of the main window å­ć‚¦ć‚£ćƒ³ćƒ‰ć‚¦ć‚’åøøć«å‰é¢ć«č”Øē¤ŗć—ć¾ć™ &Keep child windows always on top å­ć‚¦ć‚£ćƒ³ćƒ‰ć‚¦ć‚’åøøć«å‰é¢č”Øē¤ŗ(&K) Whether to enable the system tray icon ć‚·ć‚¹ćƒ†ćƒ ćƒˆćƒ¬ć‚¤ć‚¢ć‚¤ć‚³ćƒ³ć‚’ęœ‰åŠ¹ć«ć™ć‚‹ć‹ć©ć†ć‹ &Enable system tray icon ć‚·ć‚¹ćƒ†ćƒ ćƒˆćƒ¬ć‚¤ć‚¢ć‚¤ć‚³ćƒ³ć‚’ęœ‰åŠ¹(&E) Whether to show system tray message on main window close Sho&w system tray message on close Whether to restrict to one single application instance (X11) ć‚¢ćƒ—ćƒŖć‚±ćƒ¼ć‚·ćƒ§ćƒ³ć®ć‚¤ćƒ³ć‚¹ć‚æćƒ³ć‚¹ć‚’ć²ćØć¤ć«åˆ¶é™ć™ć‚‹ć‹ć©ć†ć‹ (X11) Single application &instance ć‚·ćƒ³ć‚°ćƒ«ć‚¢ćƒ—ćƒŖć‚±ćƒ¼ć‚·ćƒ§ćƒ³ć‚¤ćƒ³ć‚¹ć‚æćƒ³ć‚¹(&I) Whether to save the JACK server command-line configuration into a local file (auto-start) JACKć‚µćƒ¼ćƒćƒ¼ć®ć‚³ćƒžćƒ³ćƒ‰ćƒ©ć‚¤ćƒ³čØ­å®šć‚’ćƒ­ćƒ¼ć‚«ćƒ«ćƒ•ć‚”ć‚¤ćƒ«ć«äæå­˜ć™ć‚‹ć‹ć©ć†ć‹ (č‡Ŗå‹•ć§äæå­˜ć•ć‚Œć¾ć™) S&ave JACK audio server configuration to: JACKć‚Ŗćƒ¼ćƒ‡ć‚£ć‚Ŗć‚µćƒ¼ćƒćƒ¼čØ­å®šć®äæå­˜å…ˆ(&A): The server configuration local file name (auto-start) ć‚µćƒ¼ćƒćƒ¼čØ­å®šćƒ­ćƒ¼ć‚«ćƒ«ćƒ•ć‚”ć‚¤ćƒ«å(自動起動) .jackdrc Whether to exit once all clients have closed (auto-start) ć™ć¹ć¦ć®ć‚Æćƒ©ć‚¤ć‚¢ćƒ³ćƒˆćŒēµ‚äŗ†ć—ćŸć‚‰ć‚¢ćƒ—ćƒŖć‚±ćƒ¼ć‚·ćƒ§ćƒ³ć‚‚ēµ‚äŗ†ć™ć‚‹ć‹ć©ć†ć‹ (自動起動) C&onfigure as temporary server äø€ę™‚ć‚µćƒ¼ćƒćƒ¼ćØć—ć¦čØ­å®š(&C) Whether to ask for confirmation on JACK audio server shutdown ć‚µćƒ¼ćƒćƒ¼ć®ć‚·ćƒ£ćƒƒćƒˆćƒ€ć‚¦ćƒ³ć‚’ē¢ŗčŖć™ć‚‹ć‹ć©ć†ć‹ Confirm server sh&utdown ć‚µćƒ¼ćƒćƒ¼ć®ć‚·ćƒ£ćƒƒćƒˆćƒ€ć‚¦ćƒ³ć‚’ē¢ŗčŖć™ć‚‹(&U) Whether to enable ALSA Sequencer (MIDI) support on startup 開始時にALSAć‚·ćƒ¼ć‚±ćƒ³ć‚µćƒ¼ (MIDI) ć‚µćƒćƒ¼ćƒˆć‚’ęœ‰åŠ¹ć«ć™ć‚‹ć‹ć©ć†ć‹ E&nable ALSA Sequencer support ALSAć‚·ćƒ¼ć‚±ćƒ³ć‚µćƒ¼ć‚µćƒćƒ¼ćƒˆć‚’ęœ‰åŠ¹(&N) Whether to enable D-Bus interface D-Busć‚¤ćƒ³ć‚æćƒ¼ćƒ•ć‚§ć‚¤ć‚¹ć‚’ęœ‰åŠ¹ć«ć™ć‚‹ć‹ć©ć†ć‹ &Enable D-Bus interface D-Busć‚¤ćƒ³ć‚æćƒ¼ćƒ•ć‚§ćƒ¼ć‚¹ć®ęœ‰åŠ¹åŒ–(&E) Whether to stop JACK audio server on application exit ć‚¢ćƒ—ćƒŖć‚±ćƒ¼ć‚·ćƒ§ćƒ³ćŒēµ‚äŗ†ć™ć‚‹ę™‚ć«JACKć‚Ŗćƒ¼ćƒ‡ć‚£ć‚Ŗć‚µćƒ¼ćƒćƒ¼ć‚’åœę­¢ć™ć‚‹ć‹ć©ć†ć‹ S&top JACK audio server on application exit JACKć‚Ŗćƒ¼ćƒ‡ć‚£ć‚Ŗć‚µćƒ¼ćƒćƒ¼ć®č‡Ŗå‹•ēµ‚äŗ†(&S) Buttons ćƒœć‚æćƒ³ Whether to hide the left button group on the main window ćƒ”ć‚¤ćƒ³ć‚¦ć‚£ćƒ³ćƒ‰ć‚¦å·¦ć®ćƒœć‚æćƒ³ć‚°ćƒ«ćƒ¼ćƒ—ć‚’éš ć™ć‹ć©ć†ć‹ Hide main window &Left buttons ćƒ”ć‚¤ćƒ³ć‚¦ć‚£ćƒ³ćƒ‰ć‚¦å·¦å“ć®ćƒœć‚æćƒ³ć‚’éš ć™(&L) Whether to hide the right button group on the main window ćƒ”ć‚¤ćƒ³ć‚¦ć‚£ćƒ³ćƒ‰ć‚¦å³ć®ćƒœć‚æćƒ³ć‚°ćƒ«ćƒ¼ćƒ—ć‚’éš ć™ć‹ć©ć†ć‹ Hide main window &Right buttons ćƒ”ć‚¤ćƒ³ć‚¦ć‚£ćƒ³ćƒ‰ć‚¦å³å“ć®ćƒœć‚æćƒ³ć‚’éš ć™(&R) Whether to hide the transport button group on the main window ćƒ”ć‚¤ćƒ³ć‚¦ć‚£ćƒ³ćƒ‰ć‚¦ć®ćƒˆćƒ©ćƒ³ć‚¹ćƒćƒ¼ćƒˆćƒœć‚æćƒ³ć‚°ćƒ«ćƒ¼ćƒ—ć‚’éš ć™ć‹ć©ć†ć‹ Hide main window &Transport buttons ćƒ”ć‚¤ćƒ³ć‚¦ć‚£ćƒ³ćƒ‰ć‚¦ć®ćƒˆćƒ©ćƒ³ć‚¹ćƒćƒ¼ćƒˆćƒœć‚æćƒ³ć‚’éš ć™(&T) Whether to hide the text labels on the main window buttons ćƒ”ć‚¤ćƒ³ć‚¦ć‚£ćƒ³ćƒ‰ć‚¦ćƒœć‚æćƒ³ć®ćƒ†ć‚­ć‚¹ćƒˆćƒ©ćƒ™ćƒ«ć‚’éš ć™ć‹ć©ć†ć‹ Hide main window &button text labels ćƒ”ć‚¤ćƒ³ć‚¦ć‚£ćƒ³ćƒ‰ć‚¦ćƒœć‚æćƒ³ć®ćƒ†ć‚­ć‚¹ćƒˆćƒ©ćƒ™ćƒ«ć‚’éš ć™(&B) Defaults ę—¢å®š &Base font size: åŸŗęœ¬ćƒ•ć‚©ćƒ³ćƒˆć‚µć‚¤ć‚ŗ(&B): Base application font size (pt.) ć‚¢ćƒ—ćƒŖć‚±ćƒ¼ć‚·ćƒ§ćƒ³ć®åŸŗęœ¬ćƒ•ć‚©ćƒ³ćƒˆć‚µć‚¤ć‚ŗ(pt) 6 7 8 9 11 12 Warning č­¦å‘Š Some settings have been changed: "%1" Do you want to save the changes? čØ­å®šć®äø€éƒØćŒå¤‰ę›“ć•ć‚Œć¦ć„ć¾ć™: "%1" å¤‰ę›“ć‚’äæå­˜ć—ć¾ć™ć‹? Delete preset: "%1" Are you sure? ćƒ—ćƒŖć‚»ćƒƒćƒˆć‚’å‰Šé™¤ć—ć¾ć™: "%1" 悈悍恗恄恧恙恋? msec ćƒŸćƒŖē§’ n/a &Preset Name ćƒ—ćƒŖć‚»ćƒƒćƒˆå(&P) &Server Name ć‚µćƒ¼ćƒćƒ¼å(&S) &Server Path ć‚µćƒ¼ćƒćƒ¼ćƒ‘ć‚¹(&S) &Driver ćƒ‰ćƒ©ć‚¤ćƒćƒ¼(&D) &Interface ć‚¤ćƒ³ć‚æćƒ¼ćƒ•ć‚§ćƒ¼ć‚¹(&I) Sample &Rate ć‚µćƒ³ćƒ—ćƒ«ćƒ¬ćƒ¼ćƒˆ(&R) &Frames/Period ćƒ•ćƒ¬ćƒ¼ćƒ /ćƒ”ćƒŖć‚Ŗćƒ‰(&F) Periods/&Buffer ćƒ”ćƒŖć‚Ŗćƒ‰/ćƒćƒƒćƒ•ć‚”ćƒ¼(&B) Startup Script ć‚¹ć‚æćƒ¼ćƒˆć‚¢ćƒƒćƒ—ć‚¹ć‚ÆćƒŖćƒ—ćƒˆ Post-Startup Script ćƒć‚¹ćƒˆć‚¹ć‚æćƒ¼ćƒˆć‚¢ćƒƒćƒ—ć‚¹ć‚ÆćƒŖćƒ—ćƒˆ Shutdown Script ć‚·ćƒ£ćƒƒćƒˆćƒ€ć‚¦ćƒ³ć‚¹ć‚ÆćƒŖćƒ—ćƒˆ Post-Shutdown Script ćƒć‚¹ćƒˆć‚·ćƒ£ćƒƒćƒˆćƒ€ć‚¦ćƒ³ć‚¹ć‚ÆćƒŖćƒ—ćƒˆ Active Patchbay Definition ęœ‰åŠ¹ćŖćƒ‘ćƒƒćƒćƒ™ć‚¤å®šē¾© Patchbay Definition files ćƒ‘ćƒƒćƒćƒ™ć‚¤å®šē¾©ćƒ•ć‚”ć‚¤ćƒ« Messages Log ćƒ”ćƒƒć‚»ćƒ¼ć‚øćƒ­ć‚° Log files ćƒ­ć‚°ćƒ•ć‚”ć‚¤ćƒ« Some settings have been changed. Do you want to apply the changes? ć„ćć¤ć‹ć®čØ­å®šćŒå¤‰ę›“ć•ć‚Œć¾ć—ćŸć€‚ 変曓を適用しますか? qjackctlSocketForm Socket - JACK Audio Connection Kit ć‚½ć‚±ćƒƒćƒˆ - -JACK Audio Connection Kit &Socket ć‚½ć‚±ćƒƒćƒˆ(&S) &Name (alias): 名前(ć‚Øć‚¤ćƒŖć‚¢ć‚¹)(&N): Socket name (an alias for client name) ć‚½ć‚±ćƒƒćƒˆå(ć‚Æćƒ©ć‚¤ć‚¢ćƒ³ćƒˆåć®ć‚Øć‚¤ćƒŖć‚¢ć‚¹) Client name (regular expression) ć‚Æćƒ©ć‚¤ć‚¢ćƒ³ćƒˆå (ę­£č¦č”Øē¾) Add plug to socket plug list ćƒ—ćƒ©ć‚°ć‚’ć‚½ć‚±ćƒƒćƒˆćƒ—ćƒ©ć‚°ćƒŖć‚¹ćƒˆć«čæ½åŠ ć—ć¾ć™ Add P&lug ćƒ—ćƒ©ć‚°čæ½åŠ (&L) &Plug: ćƒ—ćƒ©ć‚°(&P): Port name (regular expression) ćƒćƒ¼ćƒˆå (ę­£č¦č”Øē¾) Socket plug list ć‚½ć‚±ćƒƒćƒˆćƒ—ćƒ©ć‚°ć®ćƒŖć‚¹ćƒˆ Socket Plugs / Ports ć‚½ć‚±ćƒƒćƒˆćƒ—ćƒ©ć‚°/ćƒćƒ¼ćƒˆ Edit currently selected plug éøęŠžć—ć¦ć„ć‚‹ćƒ—ćƒ©ć‚°ć‚’ē·Øé›†ć—ć¾ć™ &Edit 編集(&E) Remove currently selected plug from socket plug list ć‚½ć‚±ćƒƒćƒˆćƒ—ćƒ©ć‚°ćƒŖć‚¹ćƒˆć‹ć‚‰éøęŠžć—ć¦ć„ć‚‹ćƒ—ćƒ©ć‚°ć‚’å¤–ć—ć¾ć™ &Remove 削除(&R) &Client: ć‚Æćƒ©ć‚¤ć‚¢ćƒ³ćƒˆ(&C): Move down currently selected plug in socket plug list ć‚½ć‚±ćƒƒćƒˆćƒ—ćƒ©ć‚°ćƒŖć‚¹ćƒˆć§éøęŠžć—ć¦ć„ć‚‹ćƒ—ćƒ©ć‚°ć‚’ć²ćØć¤äø‹ć«ē§»å‹•ć—ć¾ć™ &Down 下へ(&D) Move up current selected plug in socket plug list ć‚½ć‚±ćƒƒćƒˆćƒ—ćƒ©ć‚°ćƒŖć‚¹ćƒˆć§éøęŠžć—ć¦ć„ć‚‹ćƒ—ćƒ©ć‚°ć‚’ć²ćØć¤äøŠć«ē§»å‹•ć—ć¾ć™ &Up 上へ(&U) Enforce only one exclusive cable connection ęŽ’ä»–ēš„ćŖć‚±ćƒ¼ćƒ–ćƒ«ęŽ„ē¶šć‚’å¼·åˆ¶ć—ć¾ć™ E&xclusive ęŽ’ä»–ēš„(&X) &Forward: 転送(&F): Forward (clone) all connections from this socket ć“ć®ć‚½ć‚±ćƒƒćƒˆć‹ć‚‰ć™ć¹ć¦ć®ęŽ„ē¶šć‚’č»¢é€(ć‚Æćƒ­ćƒ¼ćƒ³)します Type ć‚æć‚¤ćƒ— Audio socket type (JACK) ć‚Ŗćƒ¼ćƒ‡ć‚£ć‚Ŗć‚½ć‚±ćƒƒćƒˆć‚æć‚¤ćƒ—(JACK) &Audio ć‚Ŗćƒ¼ćƒ‡ć‚£ć‚Ŗ(&A) MIDI socket type (JACK) MIDIć‚½ć‚±ćƒƒćƒˆć‚æć‚¤ćƒ—(JACK) &MIDI MIDI socket type (ALSA) MIDIć‚½ć‚±ćƒƒćƒˆć‚æć‚¤ćƒ—(ALSA) AL&SA Plugs / Ports ćƒ—ćƒ©ć‚°/ćƒćƒ¼ćƒˆ Error ć‚Øćƒ©ćƒ¼ A socket named "%1" already exists. ć‚½ć‚±ćƒƒćƒˆå "%1" ćÆć™ć§ć«å­˜åœØć—ć¾ć™ć€‚ Warning č­¦å‘Š Some settings have been changed. Do you want to apply the changes? ć„ćć¤ć‹ć®čØ­å®šćŒå¤‰ę›“ć•ć‚Œć¾ć—ćŸć€‚ 変曓を適用しますか? Add Plug ćƒ—ćƒ©ć‚°ć‚’čæ½åŠ  Edit 編集 Remove 削除 Move Up äøŠćøē§»å‹• Move Down 下へ移動 (None) (なし) qjackctlSocketList Output å‡ŗåŠ› Input 兄力 Socket ć‚½ć‚±ćƒƒćƒˆ <New> - %1 <ę–°č¦> - %1 Warning č­¦å‘Š %1 about to be removed: "%2" Are you sure? %1ć‚’å‰Šé™¤ć—ć‚ˆć†ćØć—ć¦ć„ć¾ć™: "%2" 悈悍恗恄恧恙恋? %1 <Copy> - %2 %1 <ć‚³ćƒ”ćƒ¼> - %2 qjackctlSocketListView Output Sockets / Plugs å‡ŗåŠ›ć‚½ć‚±ćƒƒćƒˆ / ćƒ—ćƒ©ć‚° Input Sockets / Plugs å…„åŠ›ć‚½ć‚±ćƒƒćƒˆ / ćƒ—ćƒ©ć‚° qjackctl-0.4.2/src/translations/PaxHeaders.14935/qjackctl_es.ts0000644000000000000000000000013212700760152021216 xustar0030 mtime=1459871850.631914289 30 atime=1459871850.630913789 30 ctime=1459871850.631914289 qjackctl-0.4.2/src/translations/qjackctl_es.ts0000644000175000001440000050066612700760152021777 0ustar00rncbcusers00000000000000 PortAudioProber Probing... Please wait, PortAudio is probing audio hardware. Warning Advertencia Audio hardware probing timed out. QObject (default) Start JACK audio server immediately Iniciar servidor de audio JACK ahora Set active patchbay definition file Establecer el fichero del patchbay activo Show help about command line options Mostrar ayuda sobre las opciones de lĆ­nea de comando Show version information Mostrar información sobre esta versión Option -p requires an argument (preset). La opción -p nececita un argumento (nombre de un preset). Usage: %1 [options] [command-and-args] Uso: %1 [opciones] [comandos-y-argumentos] Options: Opciones: Set default settings preset name Establece el preset predeterminado Option -a requires an argument (path). La opción -a requiere un argumento (ruta). Qt: %1 Qt: %1 Set default JACK audio server name Establecer el nombre predetermindado del servidor de audio JACK Option -n requires an argument (name). La opción -n necesita un argumento (nombre). %1 (%2 frames) qjackctlAboutForm About Qt Acerca de QT &Close &Cerrar Version Versión Build Build Debugging option enabled. Depuración habilitada. System tray disabled. Bandeja del sistema deshabilitada. Transport status control disabled. Reporte del estado de transporte deshabilitado. Realtime status disabled. Estado de Realtime deshabilitado. XRUN delay status disabled. Reporte del retardo de XRUN deshabilitado. Maximum delay status disabled. Reporte del retardo mĆ”ximo deshabilitado. ALSA/MIDI sequencer support disabled. Soporte para secuenciador ALSA/MIDI deshabilitado. Website Website This program is free software; you can redistribute it and/or modify it Este programa es software libre; Usted puede redistribuirlo y/o modificarlo under the terms of the GNU General Public License version 2 or later. bajo los tĆ©rminos de la Licencia PĆŗblica General GNU versión 2 o posterior. JACK MIDI support disabled. Soporte MIDI en JACK deshabilitado. About QjackCtl Acerca de QjackCtl JACK Port aliases support disabled. Soporte para alias de los puertos de JACK deshabilitado. D-Bus interface support disabled. Soporte para la interfaz D-Bus deshabilitado. JACK Session support disabled. Soporte para sesiones de JACK deshabilitado. Using: JACK %1 Usando: JACK %1 qjackctlClientListView &Connect &Conectar Alt+C Connect Alt+C &Disconnect &Desconectar Alt+D Disconnect Alt+D Disconnect &All Desconectar &Todo Alt+A Disconect All Alt+T Re&name Cambiar &Nombre Alt+N Rename Alt+N &Refresh &Refrescar Alt+R Refresh Alt+R Readable Clients / Output Ports Puertos de Salida / Clientes LeĆ­bles Writable Clients / Input Ports Puertos de Entrada / Clientes Escribibles qjackctlConnect Warning Advertencia This will suspend sound processing from all client applications. Are you sure? Esto suspenderĆ” el procesamiento de sonido de todas las aplicaciones. EstĆ” seguro? qjackctlConnectionsForm Connections - JACK Audio Connection Kit Conexiones - JACK Audio Connection Kit Audio Audio &Connect &Conectar Connect currently selected ports Conectar los puertos seleccionados &Disconnect &Desconectar Disconnect currently selected ports Desconectar los puertos seleccionados Disconnect &All Desconectar &Todo Disconnect all currently connected ports Desconectar todos los puertos seleccionados &Refresh &Refrescar Refresh current connections view Refrescar la vista actual de conexiones MIDI MIDI Warning Advertencia The preset aliases have been changed: "%1" Do you want to save the changes? Los alias de presets han cambiado: "%1" Desea guardar los cambios? ALSA ALSA Expand all client ports Expandir todos los puertos de los clientes E&xpand All E&xpandir Todos qjackctlConnectorView &Connect &Conectar Alt+C Connect Alt+C &Disconnect &Desconectar Alt+D Disconnect Alt+D Disconnect &All Desconectar &Todo Alt+A Disconect All Alt+T &Refresh &Refrescar Alt+R Refresh Alt+R qjackctlMainForm &Quit &Salir Quit processing and exit Terminar procesamiento y salir &Start &Iniciar Start the JACK server Iniciar el servidor JACK S&top &Detener Stop the JACK server Detener el servidor JACK St&atus &Estado Ab&out... Ace&rca... Show information about this application Mostrar información sobre esta aplicación Show settings and options dialog Mostrar el diĆ”logo de opciones y preferencias &Messages &Mensajes Patch&bay Patch&bay Show/hide the patchbay editor window Mostrar / ocultar el editor de patchbay &Connect &Conexiones Show/hide the actual connections patchbay window Mostrar / ocultar el patchbay con las conexiones actuales JACK server state Estado del servidor JACK JACK server mode Modo del servidor JACK Sample rate Frecuencia de muestreo Time display Visor de tiempo Transport state Estado del transporte Transport BPM BPM del transporte Transport time Tiempo del transporte Backward transport Retroceder transporte Forward transport Avanzar transporte (Alt+L) Rewind transport Rebobinar transporte (Alt+K) Stop transport rolling Detener el transporte (Shift+Espacio) Start transport rolling Iniciar el transporte (Espacio) Warning Advertencia successfully satisfactoriamente with exit status=%1 con estado %1 Could not load preset "%1". Retrying with default. No se pudo cargar el preset "%1". Probando con el predeterminado. Could not load default preset. Sorry. Lo siento. No se pudo cargar el preset predeterminado. Startup script... Script de inicio... Startup script terminated El script de inicio finalizó JACK is starting... JACK estĆ” iniciĆ”ndose... Could not start JACK. Sorry. Lo siento. No se pudo iniciar JACK. JACK is stopping... JACK estĆ” deteniĆ©ndose... The program will keep running in the system tray. To terminate the program, please choose "Quit" in the context menu of the system tray icon. El programa seguirĆ” corriendo en la bandeja del sistema. Para terminarlo, por favor eljia "Salir" en el menĆŗ contextual del Ć­cono en la bandeja del sistema. Shutdown script... Script de apagado... Shutdown script terminated El script de apagado finalizó JACK was stopped JACK ha sido detenido Post-shutdown script... Script de post - apagado... D-BUS: Service is available (%1 aka jackdbus). D-BUS: Disponible (%1 aka jackdbus). D-BUS: Service not available (%1 aka jackdbus). D-BUS: No disponible (%1 aka jackdbus). Don't show this message again Don't ask this again D-BUS: JACK server is starting... D-BUS: Iniciando servidor JACK... D-BUS: JACK server could not be started. Sorry D-BUS: El servidor JACK no puede iniciarse. Disculpa D-BUS: JACK server is stopping... D-BUS: Deteniendo el servidor JACK... D-BUS: JACK server could not be stopped. Sorry D-BUS: El servidor JACK no puede detenerse. Disculpa Post-shutdown script terminated El script de post - apagado finalizó D-BUS: JACK server was started (%1 aka jackdbus). D-BUS: El servidor JACK se ha iniciado (%1 aka jackdbus). D-BUS: JACK server was stopped (%1 aka jackdbus). D-BUS: El servidor JACK se ha detenido (%1 aka jackdbus). Error Error Transport time code Código de tiempo del transporte Elapsed time since last reset Tiempo transcurrido desde el Ćŗltimo reset Elapsed time since last XRUN Tiempo transcurrido desde el Ćŗltimo XRUN Patchbay activated. Patchbay activada. Patchbay deactivated. Patchbay desactivada. Statistics reset. Reiniciar estadĆ­sticas. msec mseg XRUN callback (%1). XRUN callback (%1). Buffer size change (%1). Cambio en el tamaƱo de buffer (%1). Shutdown notification. Notificación de apagado. JACK property change. checked verificado connected conectado disconnected desconectado failed falló Server configuration saved to "%1". Configuración del servidor salvada en "%1". Client activated. Cliente activado. Post-startup script... Script de post - inicio... Post-startup script terminated El script de post - inicio finalizó Command line argument... Argumento de la lĆ­nea de comando... Command line argument started Argumento de la lĆ­nea de comando iniciado Client deactivated. Cliente desactivado. Transport rewind. Rebobinar transporte. Transport backward. Retroceder transporte. Starting Iniciando Transport start. Iniciar transporte. Stopping Deteniendo Transport stop. Detener transporte. Transport forward. Avanzar transporte. Stopped Detenido Yes Si No No RT RT Rolling Rolling Looping Looping XRUN callback (%1 skipped). XRUN callback (%1 omitidos). Started Iniciado Active Activo Activating Activando Inactive Inactivo &Hide &Ocultar Mi&nimize Mi&nimizar S&how &Mostrar Rest&ore &Restablecer &Stop &Detener &Reset &Reset &Connections &Conexiones Server settings will be only effective after restarting the JACK audio server. La configuración sólo se harĆ” efectiva reiniciando el servidor JACK. D-BUS: SetParameterValue('%1', '%2'): %3. (%4) D-BUS: ResetParameterValue('%1'): %2. (%3) D-BUS: GetParameterValue('%1'): %2. (%3) Information Información Some settings will be only effective the next time you start this program. Algunas configuraciones sólo se aplicarĆ”n la próxima vez que inicie este programa. Could not open ALSA sequencer as a client. ALSA MIDI patchbay will be not available. No se puede abrir el secuenciador ALSA como cliente El patchbay MIDI de ALSA no estarĆ” disponible. JACK is currently running. Do you want to terminate the JACK audio server? JACK se estĆ” ejecutando actualmente. Desea terminar el servidor de audio JACK? Could not start JACK. Maybe JACK audio server is already started. No puede iniciarse JACK. QuizĆ”s el servidor de audio JACK ya haya sido iniciado. Some client audio applications are still active and connected. Do you want to stop the JACK audio server? Algunas aplicaciones de audio estĆ”n activas y conectadas. Desea detener el servidor de audio JACK? JACK was started with PID=%1. JACK se inició con PID=%1. JACK is being forced... JACK estĆ” siendo forzado... Patchbay reset. JACK connection graph change. Cambió el grĆ”fico de conexiones de JACK. JACK has crashed. JACK ha petado. JACK timed out. Tiempo de espera para JACK agotado. JACK write error. Error de escritura JACK. JACK read error. Error de lectura JACK. Unknown JACK error (%d). Error JACK desconocido (%d). ALSA connection graph change. Cambió el grĆ”fico de conexiones ALSA. JACK active patchbay scan Escaneo del patchbay JACK activo ALSA active patchbay scan Escaneo del patchbay ALSA activo JACK connection change. Cambios en las conexiones JACK. ALSA connection change. Cambios en las conexiones ALSA. A patchbay definition is currently active, which is probable to redo this connection: %1 -> %2 Do you want to remove the patchbay connection? Una definición de patchbay estĆ” activa actualmente, y es probable rehacer esta conexion: %1 -> %2 Desea remover la conexion? Overall operation failed. La operación global falló. Invalid or unsupported option. Opción invĆ”lida o no soportada. Client name not unique. El nombre de cliente no es Ćŗnico. Server is started. El servidor estĆ” iniciado. Unable to connect to server. No puede conectarse al servidor. Server communication error. Error de comunicación con el servidor. Client does not exist. El cliente no existe. Unable to load internal client. No puede cargarse el cliente interno. Unable to initialize client. No puede inicializarse el cliente. Unable to access shared memory. No puede accederse a la memoria compartida. Client protocol version mismatch. La versión del protocolo cliente no concuerda. Could not connect to JACK server as client. - %1 Please check the messages window for more info. No puede conectarse al servidor JACK como cliente. - %1 Por favor revise la ventana de mensajes para mas información. %1 (%2%) %1 % %1 Hz %1 frames %1 cuadros %1 msec &Presets &Presets &Transport &Transporte &Rewind Re&bobinar &Play &Reproducir Pa&use Pa&usa QjackCtl QjackCtl &Patchbay &Patchbay DSP Load Uso de CPU del DSP XRUN Count (notifications) Cuenta de XRUN (notificaciones) &Backward &Retroceder &Forward &Avanzar Set&up... Set&up... S&ession S&esion &Load... &Abrir... &Save... &Guardar... Save and &Quit... Guardar y &Salir... Save &Template... Guardar Plan&tilla... Show/hide the session management window Mostrar/ocultar la ventana para administrar sesiones Show/hide the messages log/status window Mostrar/ocultar la ventana de estado/log Could not load active patchbay definition. "%1" Disabled. No se puede cargar el patchbay. "%1" Ha sido deshabilitado. &Versioning &Versiones Re&fresh Re&frescar %1 (%2%, %3 xruns) Transport BBT (bar.beat.ticks) qjackctlMessagesStatusForm Messages / Status - JACK Audio Connection Kit Mensajes / Estado - JACK Audio Connection Kit &Messages &Mensajes Messages log Registro de mensajes Messages output log Registro de mensajes &Status &Estado Status information Información de estado Statistics since last server startup EstadĆ­sticas desde el Ćŗltimo inicio de JACK Description Descripción Value Valor Reset XRUN statistic values Reiniciar estadĆ­sticas de XRUN Re&set re&Iniciar Refresh XRUN statistic values Refrescar estadĆ­sticas de XRUN &Refresh &Refrescar Server name Nombre del servidor Server state Estado del Servidor DSP Load Uso de CPU del DSP Sample Rate Frecuencia de muestreo Buffer Size TamaƱo de Buffer Realtime Mode Modo Realtime Transport state Estado del transporte Transport Timecode Código de tiempo del transporte Transport BBT BBT del Transporte Transport BPM BPM del transporte XRUN count since last server startup XRUNs desde el Ćŗltimo inicio XRUN last time detected Fecha de la Ćŗltima XRUN detectada XRUN last Última XRUN XRUN maximum MĆ”ximo de XRUN XRUN minimum MĆ­nimo de XRUN XRUN average Promedio de XRUN XRUN total Total de XRUN Maximum scheduling delay MĆ”ximo retardo de programación(scheduling) Time of last reset Tiempo desde el Ćŗltimo reset Logging stopped --- %1 --- Registro detenido --- %1 --- Logging started --- %1 --- Registro iniciado --- %1 --- qjackctlPatchbay Warning Advertencia This will disconnect all sockets. Are you sure? Esto desconectarĆ” todos los sockets. EstĆ” seguro? qjackctlPatchbayForm Patchbay - JACK Audio Connection Kit Patchbay - JACK Audio Connection Kit &New &Nueva Create a new patchbay profile &Load... &Abrir... Load patchbay profile Cargar perfil de patchbay &Save... &Salvar... Save current patchbay profile Salvar el perfil actual del patchbay Acti&vate Acti&var Toggle activation of current patchbay profile Conmutar la activación del esquema actual &Connect &Conectar Connect currently selected sockets Conectar los puertos seleccionados &Disconnect &Desconectar Disconnect currently selected sockets Desconectar los puertos seleccionados Disconnect &All Desconectar &Todo Disconnect all currently connected sockets Desconectar los socket seleccionados &Refresh &Refrescar Refresh current patchbay view Refrescar la vista actual Down Bajar Move currently selected output socket down one position Mover el socket de salida seleccionado una posición hacia abajo Add... AƱadir... Create a new output socket Crear un nuevo socket de salida Edit... Editar... Edit currently selected input socket properties Editar las propiedades del socket de entrada seleccionado Up Subir Move currently selected output socket up one position Mover el socket de salida seleccionado una posición hacia arriba Remove Remover Remove currently selected output socket Remover el socket de salida seleccionado Copy... Copiar... Duplicate (copy) currently selected output socket Duplicar (copiar) el socket de salida seleccionado Remove currently selected input socket Remover el socket de entrada seleccionado Duplicate (copy) currently selected input socket Duplicar (copiar) el socket de entrada seleccionado Create a new input socket Crear un nuevo socket de entrada Edit currently selected output socket properties Editar las propiedades del socket de salida seleccionado Warning Advertencia active activa New Patchbay definition Nuevo esquema de patchbay Patchbay Definition files Archivos de esquemas de patchbay Load Patchbay Definition Cargar esquema de patchbay Save Patchbay Definition Salvar esquema de patchbay The patchbay definition has been changed: "%1" Do you want to save the changes? La definición del patchbay ha cambiado: "%1" Desea guardar los cambios? %1 [modified] %1 [modificado] Untitled%1 SinNombre%1 Error Error Could not load patchbay definition file: "%1" No se puede cargar el archivo con el esquema del patchbay: "%1" Could not save patchbay definition file: "%1" No se puede guardar el archivo con el esquema del patchbay: "%1" Create patchbay definition as a snapshot of all actual client connections? Crear un esquema del patchbay en base a una instantĆ”nea de las conexiones actuales? Current (recent) patchbay profile(s) Perfil actual (reciente) de patchbay Expand all items Expandir todos los elementos E&xpand All E&xpandir Todos qjackctlPatchbayView Add... AƱadir... Edit... Editar... Copy... Copiar... Remove Remover Exclusive Exclusivo Move Up Subir Move Down Bajar &Connect &Conectar Alt+C Connect Alt+C &Disconnect &Desconectar Alt+D Disconnect Alt+D Disconnect &All Desconectar &Todo Alt+A Disconect All Alt+T &Refresh &Refrescar Alt+R Refresh Alt+R Forward Avanzar (None) (Ninguno) qjackctlSessionForm Session - JACK Audio Connection Kit Sesión - JACK Audio Connection Kit Load session Cargar sesión &Load... &Abrir... Recent session Sesión reciente &Recent &Reciente Save session Guardar sesión &Save... &Guardar... Client / Ports Cliente / Puertos UUID Command Comando Load Session Cargar Sesión Session directory Directorio de la sesión Save Session Guardar Sesión and Quit y Salir Template Plantilla &Clear &Limpiar Warning Advertencia A session could not be found in this folder: "%1" No se encontró una sesión en esta carpeta: "%1" %1: loading session... %1: cargando sesión... %1: load session %2. %1: cargar sesión %2. A session already exists in this folder: "%1" Are you sure to overwrite the existing session? Una sesión ya existe en esta carpeta: "%1" EstĆ” seguro de querer sobreescribirla? This folder already exists and is not empty: "%1" Are you sure to overwrite the existing folder? Esta carpeta existe y no estĆ” vacĆ­a: "%1" EstĆ” seguro de sobreescribir esta carpeta? %1: saving session... %1: guardando sesión... %1: save session %2. %: guardar sesión %2. Update session Actualizar sesión Save and &Quit... Guardar y &Salir... Save &Template... Guardar Plan&tilla... &Save &Salvar Save session versioning Guardar las versiones de la sesión &Versioning &Versiones Re&fresh Re&frescar Session clients / connections Infra-clients / commands Infra-client Infra-command Add infra-client &Add Edit infra-client &Edit &Editar Remove infra-client Re&move New Client qjackctlSessionInfraClientItemEditor Infra-command qjackctlSetupForm Setup - JACK Audio Connection Kit Configuración - JACK Audio Connection Kit Settings Configuraciones Preset &Name: &Nombre del Preset: (default) Settings preset name Preset con las configuraciones &Save &Salvar Save settings as current preset name Salvar configuraciones en el preset actual &Delete &Eliminar Delete current settings preset Eliminar el preset con la configuración actual jackstart jackstart jackd jackd Driv&er: Dri&ver: dummy dummy oss oss alsa alsa portaudio portaudio coreaudio coreaudio Parameters ParĆ”metros Number of periods in the hardware buffer NĆŗmero de perĆ­odos en el buffer de hardware Priorit&y: &Prioridad: &Frames/Period: &Cuadros / PerĆ­odo: 16 16 32 32 64 64 128 128 256 256 512 512 1024 1024 2048 2048 4096 4096 Frames per period between process() calls Cuadros por perĆ­odo entre llamadas a process() Port Ma&ximum: MĆ”&ximos Puertos: 21333 21333 22050 22050 32000 32000 44100 44100 48000 48000 88200 88200 96000 96000 Sample rate in frames per second Frecuencia de muestreo en cuadros por segundo Scheduler priority when running realtime Prioridad del scheduler cuando se ejecuta en tiempo real &Word Length: &Largo de palabra: Periods/&Buffer: PerĆ­odos / &Buffer: Word length TamaƱo de palabra Maximum number of ports the JACK server can manage MĆ”ximo nĆŗmero de puertos que podrĆ” manejar el servidor JACK &Wait (usec): &Retardo (microseg): Sample &Rate: &Frecuencia de muestreo: &Timeout (msec): LĆ­mite de &Tiempo (mseg): 200 200 500 500 1000 1000 2000 2000 5000 5000 10000 10000 Set client timeout limit in miliseconds Establece el lĆ­mite de tiempo de los clientes en milisegundos &Realtime Tiempo &Real Use realtime scheduling Usar prioridad(scheduling) de tiempo real No Memory Loc&k No b&loquear memoria Do not attempt to lock memory, even if in realtime mode No intentar bloquear memoria, incluso en modo de tiempo real &Unlock Memory &Desbloquear Memoria Unlock memory of common toolkit libraries (GTK+, QT, FLTK, Wine) No bloquear memoria de las librerĆ­as comunes (GTK+, QT, FLTK, Wine) So&ft Mode Modo &Tolerante Ignore xruns reported by the backend driver Ignorar las xruns reportadas por el driver de sonido. JACK tendrĆ” menos tendencia a desconectar los puertos que no respondan. Útil cuando no se corre en tiempo real &Monitor &Monitorear Provide output monitor ports Proveer puertos para monitoreo de la salida Force &16bit Forzar &16bit Force 16bit mode instead of failing over 32bit (default) Forzar modo 16 bit en lugar de 32 bit (predeterminado) H/W M&onitor M&onitoreo por Hardware Enable hardware monitoring of capture ports Habilitar monitoreo por hardware de los puertos de captura H/&W Meter Monitoreo por H/&W Enable hardware metering on cards that support it Habilita monitoreo por hardware en las placas que lo soporten &Ignore H/W &Ignorar H/W Ignore hardware period/buffer size Ignorar el tamaƱo de bufer / perĆ­odo del hardware &Output Device: Dispositiv&o de salida: &Interface: &Interfaz: Maximum input audio hardware channels to allocate MĆ”ximo nĆŗmero de canales de entrada por hardware a establecer &Audio: &Audio: Dit&her: &Suavizado: External output latency (frames) Latencia de la salida externa (cuadros) &Input Device: D&ispositivo de entrada: Duplex Duplex Capture Only Sólo Captura Playback Only Sólo Reproducción Provide either audio capture, playback or both Proveer de puertos de audio para captura, reproducción o ambos hw:0 The PCM device name to use Nombre del dispositivo PCM a usar > > /dev/dsp Alternate input device for capture Dispositivo de entrada alternativo para captura Maximum output audio hardware channels to allocate MĆ”ximo nĆŗmero de canales de salida por hardware a establecer Alternate output device for playback Dispositivo de salida alternativo para reproducción External input latency (frames) Latencia de la entrada externa (cuadros) None Ninguno Rectangular Rectangular Shaped Triangular Triangular Set dither mode Establecer mĆ©todo de suavizado Whether to give verbose output on messages Mostrar información mas detallada en los mensajes Time in seconds that client is delayed after server startup Tiempo en segundos que el cliente es demorado luego de iniciar el servidor Latency: Latencia: Output latency in milliseconds, calculated based on the period, rate and buffer settings Latencia del sistema en milisegundos, calculada en base a la configuración de perĆ­odo, buffer y frecuencia de muestreo Options Opciones Scripting Scripting Execute script on Start&up: Script a ejecutar al iniciar el servi&dor: Whether to execute a custom shell script before starting up the JACK audio server. Ejecutar un script personalizado antes de iniciar el servidor JACK. Execute script after &Startup: &Script a ejecutar luego de iniciar: Whether to execute a custom shell script after starting up the JACK audio server. Ejecutar un script personalizado despuĆ©s de iniciar el servidor JACK. Execute script on Shut&down: Script a ejecutar antes de d&etener: Whether to execute a custom shell script before shuting down the JACK audio server. Ejecutar un script personalizado antes de detener el servidor JACK. Command line to be executed before starting up the JACK audio server Comando a ejecutar antes de iniciar el servidor JACK Scripting argument meta-symbols Variables especiales para pasar al script ... ... Browse for script to be executed before starting up the JACK audio server Buscar el script a ejecutar antes de iniciar el servidor de audio JACK Command line to be executed after starting up the JACK audio server Comando a ejecutar luego de iniciar el servidor JACK Browse for script to be executed after starting up the JACK audio server Buscar el script a ejecutar luego de iniciar el servidor de audio JACK Browse for script to be executed before shutting down the JACK audio server Buscar el script a ejecutar antes de terminar el servidor de audio JACK Command line to be executed before shutting down the JACK audio server Comando a ejecutar antes de detener el servidor JACK Execute script after Shu&tdown: Script a ejecutar luego de &Terminar: Whether to execute a custom shell script after shuting down the JACK audio server. Ejecutar un script personalizado despuĆ©s de terminar el servidor JACK. Browse for script to be executed after shutting down the JACK audio server Buscar el script a ejecutar luego de terminar el servidor de audio JACK Command line to be executed after shutting down the JACK audio server Comando a ejecutar luego de detener el servidor JACK Statistics EstadĆ­sticas &Capture standard output &Capturar salida estĆ”ndar Whether to capture standard output (stdout/stderr) into messages window Capturar la salida estĆ”ndar de JACK en la ventana de mensajes &XRUN detection regex: Expresión regular para detectar &XRUN: xrun of at least ([0-9|\.]+) msecs xrun of at least ([0-9|\.]+) msecs Regular expression used to detect XRUNs on server output messages Expresión regular usada para detectar XRUNs en los mensajes del servidor Connections Conexiones 10 10 Patchbay definition file to be activated as connection persistence profile Esquemas de patchbay a activar como un perfil persistente de las conexiones Browse for a patchbay definition file to be activated Buscar el esquema de patchbay para activar Activate &Patchbay persistence: Activar &Persistencia del patchbay: Whether to activate a patchbay definition for connection persistence profile. Utilizar un perfil para conservar el esquema del patchbay entre sesiones. Display Display Time Display Display de tiempo Time F&ormat: F&ormato de tiempo: hh:mm:ss hh:mm:ss hh:mm:ss.d hh:mm:ss.d hh:mm:ss.dd hh:mm:ss.dd hh:mm:ss.ddd hh:mm:ss.ddd The general time format on display El formato general para mostrar el tiempo Transport &Time Code Código de Tiempo del &Transporte Transport &BBT (bar:beat.ticks) &BBT del Transporte (bar:beat:ticks) Elapsed time since last &Reset Tiempo transcurrido desde el Ćŗltimo &Reset Elapsed time since last &XRUN Tiempo transcurrido desde la Ćŗltima &XRUN Sample front panel normal display font Muestra de la fuente para el panel frontal Sample big time display font Muestra de la fuente para el display de tiempo grande Big Time display: Display de tiempo grande: &Font... Fuen&te... Select font for front panel normal display Seleccionar fuente para el panel normal Select font for big time display Seleccionar fuente para el display de tiempo grande Normal display: Display normal: &Display shiny glass light effect Usar &efecto de Resplandor VĆ­treo Whether to enable a shiny glass light effect on the main display Dibujar la ventana principal con un efecto sĆ­mil cristal Messages Window Ventana de Mensajes Sample messages text font display Muestra de la fuente para la ventana de mensajes Select font for the messages text display Seleccionar fuente para el display de mensajes &Messages limit: LĆ­mite de &Mensajes: Whether to keep a maximum number of lines in the messages window Almacenar un nĆŗmero limitado de lĆ­neas en la ventana de mensajes 100 100 250 250 2500 2500 The maximum number of message lines to keep in view MĆ”ximo nĆŗmero de lĆ­neas para mantener en la ventana de mensajes Please do not touch these settings unless you know what you are doing. Connections Window Ventana de conexiones Sample connections view font Muestra de la fuente para la ventana de conexiones Select font for the connections view Seleccionar fuente para la ventana de conexiones &Icon size: TamaƱo de &Icono: 16 x 16 16 x 16 32 x 32 32 x 32 64 x 64 64 x 64 The icon size for each item of the connections view TamaƱo de Ć­cono para cada Ć­tem en la vista de conexiones Ena&ble client/port aliases editing (rename) Ha&bilitar la edición de alias para los puertos / clientes (renombrarlos) Whether to enable in-place client/port name editing (rename) Permitir la edición in-situ de los nobres asignados a puertos o clientes E&nable client/port aliases Habilitar alias para los nombres de &puertos / clientes Whether to enable client/port name aliases on the connections window Permitir alias para los puertos / clientes en la ventana de conexiones Draw connection and patchbay lines as Be&zier curves Dibujar lĆ­neas en el Patchbay y ventana de conexiones como curvas BĆ©&zier Whether to draw connection lines as cubic Bezier curves Utilizar curvas cĆŗbicas BĆ©zier en lugar de rectas (mĆ”s estilizado) Misc Otras Other Otro &Start JACK audio server on application startup Iniciar el &servidor JACK al cargar qjackctl Whether to start JACK audio server immediately on application startup Iniciar en forma automĆ”tica JACK cuando se lanza qjackctl &Confirm application close Pedir &Confirmación al salir Whether to ask for confirmation on application exit Preguntar antes de salir de qjackctl &Keep child windows always on top &Las ventanas hijas siempre arriba Whether to keep all child windows on top of the main window Todas las ventanas creadas por qjackctl estarĆ”n sobre la ventana principal &Enable system tray icon Habilitar Ć­cono en band&eja del sistema Whether to enable the system tray icon Permitir Ć­conos en la bandeja del sistema S&ave JACK audio server configuration to: S&alvar la configuración del servidor JACK en: Whether to save the JACK server command-line configuration into a local file (auto-start) Guardar la lĆ­nea de comando de JACK a un archivo (auto - inicio) .jackdrc .jackdrc The server configuration local file name (auto-start) El archivo con la configuración de JACK (auto - inicio) C&onfigure as temporary server C&onfigurar como servidor temporal Whether to exit once all clients have closed (auto-start) Salir una vez que todos los clientes hayan finalizado (auto - inicio) Whether to ask for confirmation on JACK audio server shutdown Preguntar antes de detener JACK Warning Advertencia msec mseg n/a n/d &Preset Name Nombre del &Preset &Server Path Ruta hacia el &Servidor &Driver &Driver &Interface &Interfaz Sample &Rate &Frecuencia de muestreo &Frames/Period &Cuadros / PerĆ­odo Periods/&Buffer PerĆ­odos / &Buffer Patchbay Definition files Archivos de esquema de patchbay Some settings have been changed: "%1" Do you want to save the changes? Algunas configuraciones han cambiado: "%1" Desea guardarlas? Delete preset: "%1" Are you sure? Borrar preset: "%1" EstĆ” seguro? Startup Script Script de Inicio Post-Startup Script Script de Post-Inicio Shutdown Script Script de Apagado Post-Shutdown Script Script de Post-Acabado Active Patchbay Definition Definición Activa de Patchbay Messages Log Registro de Mensajes Log files Archivos de registros Some settings have been changed. Do you want to apply the changes? Algunas configuraciones han cambiado.Desea aplicar los cambios? jackdmp jackdmp The audio backend driver interface to use El driver de audio a utilizar sun freebob firewire MIDI Driv&er: Driv&er MIDI: The ALSA MIDI backend driver to use El driver MIDI de ALSA a utilizar none ninguno raw seq &Verbose messages Mensajes &Verbosos plughw:0 /dev/audio &Channels: &Canales: 192000 192000 Maximum number of audio channels to allocate El mĆ”ximo nĆŗmero de canales de audio a utilizar Logging Registro Messages log file Archivo de registro de mensajes Browse for the messages log file location Ir hasta la ubicación del archivo con el registro de mensajes Whether to activate a messages logging to file. Si guardar los mensajes a un archivo. Advanced Whether to reset all connections when a patchbay definition is activated. &Reset all connections on patchbay activation Whether to issue a warning on active patchbay port disconnections. &Warn on active patchbay disconnections &Messages log file: Archivo con los &Mensajes: Whether to enable blinking (flashing) of the server mode (RT) indicator Si hablilitar el parpadeo del indicador de modo del servidor (RT) Blin&k server mode indicator &Parpadeo del indicador de modo del servidor &JACK client/port aliases: Alias de cliente/puerto para &JACK: JACK client/port aliases display mode Modo de visualización de los alias cliente/puerto de JACK Default Predeterminado First Primero Second Segundo JACK client/port pretty-name (metadata) display mode Enable JA&CK client/port pretty-names (metadata) Whether to show system tray message on main window close Sho&w system tray message on close Confirm server sh&utdown Confirmar apa&gado del servidor Whether to enable ALSA Sequencer (MIDI) support on startup Si habilitar soporte para el Secuenciador ALSA (MIDI) al iniciar E&nable ALSA Sequencer support Habilitar Secue&nciador ALSA Whether to enable JACK D-Bus interface &Enable JACK D-Bus interface Buttons Botones Whether to hide the left button group on the main window Si esconder el grupo de botones a la izquierda de la ventana principal Hide main window &Left buttons Esconder botones de &la izquierda Whether to hide the right button group on the main window Si esconder el grupo de botones a la derecha de la ventana principal Hide main window &Right buttons Esconder botones de la de&recha Whether to hide the transport button group on the main window Si esconder el grupo de botones del transporte en la ventana principal Hide main window &Transport buttons Esconder los botones del &Transporte Whether to hide the text labels on the main window buttons Si esconder las etiquetas en los botones de la ventana principal Hide main window &button text labels Esconder etiquetas en los &botones Defaults Predeterminados &Base font size: TamaƱo &bĆ”sico de tipografĆ­as: Base application font size (pt.) TamaƱo bĆ”sico de tipografĆ­as para la aplicación (pt.) 6 6 7 7 8 8 9 9 11 11 12 12 net Whether to enable D-Bus interface Habilitar la interfaz por D-Bus &Enable D-Bus interface &Habilitar la interfaz via D-Bus Number of microseconds to wait between engine processes (dummy) NĆŗmero de microsegundos a esperar entre procesamientos (dummy) netone Whether to restrict to one single application instance (X11) Restringir una sola instancia de la aplicación (X11) Single application &instance Una sola &instancia &Name: &Nombre: The JACK Audio Connection Kit sound server name El nombre del servidor JACK Audio Connection Kit &Server Name Nombre del &Servidor Server path (command line prefix) Ruta del servidor (prefijo de la lĆ­nea de comando) &Channels I/O: &Canales de E/S: &Latency I/O: &Latencia E/S: Start De&lay: Demora antes de&l inicio: secs segs 0 msecs 0 msegs Server Suffi&x: Sufijo del &Servidor: Server &Prefix: &Prefijo del servidor: Extra driver options (command line suffix) Opciones extra para el driver (sufijo de la lĆ­nea de comandos) Whether to stop JACK audio server on application exit S&top JACK audio server on application exit qjackctlSocketForm &Socket &Socket &Name (alias): &Nombre (alias): Socket name (an alias for client name) Nombre del socket (un alias para el nombre de cliente) Client name (regular expression) Nombre del cliente (expresión regular) Add P&lug AƱadir p&Lug Add plug to socket plug list AƱadir plug a la lista de sockets &Plug: &Plug: Port name (regular expression) Nombre del puerto (expresión regular) Socket Plugs / Ports Socket Plug / Puerto Socket plug list Lista de socket tipo plug &Edit &Editar &Remove &Remover Remove currently selected plug from socket plug list Remover el plug seleccionado de la lista &Client: &Cliente: &Down &Bajar &Up &Subir E&xclusive E&xclusivo Enforce only one exclusive cable connection Permitir una conexión Ćŗnicamente Type Tipo &Audio A&udio Audio socket type (JACK) Socket tipo audio (JACK) &MIDI &MIDI MIDI socket type (ALSA) Socket tipo MIDI (ALSA) Plugs / Ports Plugs / Puertos Error Error A socket named "%1" already exists. Un socket llamado "%1" ya existe. Add Plug AƱadir Plug Remove Remover Edit Editar Move Up Subir Move Down Bajar Warning Advertencia Some settings have been changed. Do you want to apply the changes? Algunas configuraciones han cambiado. Desea aplicar los cambios? (None) (Ninguno) Socket - JACK Audio Connection Kit Sockets - JACK Audio Connection Kit Edit currently selected plug Editar el plug seleccionado Move down currently selected plug in socket plug list Mover hacia abajo en la lista el plug seleccionado Move up current selected plug in socket plug list Mover hacia arriba en la lista el plug seleccionado &Forward: &Avanzar: Forward (clone) all connections from this socket Reenviar (clonar) todas las conexiones desde este socket MIDI socket type (JACK) Tipo de socket MIDI (JACK) AL&SA AL&SA qjackctlSocketList Output Salida Input Entrada Socket Socket Warning Advertencia <New> - %1 <Nuevo> - %1 %1 about to be removed: "%2" Are you sure? A punto de remover %1: "%2" EstĆ” seguro? %1 <Copy> - %2 %1 <Copia> - %2 qjackctlSocketListView Output Sockets / Plugs Sockets de Salida / Plugs Input Sockets / Plugs Sockets de Entrada / Plugs qjackctl-0.4.2/src/translations/PaxHeaders.14935/qjackctl_nl.ts0000644000000000000000000000013212700760152021220 xustar0030 mtime=1459871850.633915289 30 atime=1459871850.633915289 30 ctime=1459871850.633915289 qjackctl-0.4.2/src/translations/qjackctl_nl.ts0000644000175000001440000047774412700760152022013 0ustar00rncbcusers00000000000000 PortAudioProber Probing... Please wait, PortAudio is probing audio hardware. Warning Opgelet Audio hardware probing timed out. QObject (default) (standaard) Start JACK audio server immediately De JACK audio server onmiddlijk starten Show help about command line options Toon hulp over command line opties Show version information Toon versie informatie Option -p requires an argument (preset). Optie -p vereist een argument (preset). Usage: %1 [options] [command-and-args] Gebruik: %1 [opties] [commandos-en-args] Options: Opties: Set active patchbay definition file Kies het actieve patchbay definition bestand Set default JACK audio server name Kies de standaard JACK audio server naam Option -a requires an argument (path). Optie -a vereist een argument (pad). Option -n requires an argument (name). Optie -n vereist een argument (naam). Qt: %1 Qt : %1 Set default settings preset name Kies standaard instellingen preset naam %1 (%2 frames) qjackctlAboutForm About QjackCtl Over QjackCtl About Qt Over Qt &Close &Sluiten Version Versie Build "I build" is translated in Dutch to "Ik bouw", but "build" could also be translated as "compilatie" which comes from "to compile" Bouw Using: JACK %1 Gebruikt : JACK %1 Debugging option enabled. Debug optie geactiveerd. System tray disabled. Systeem pictogram uitgeschakeld. Transport status control disabled. Transport status controle uitgeschakeld. Realtime status disabled. Realtime status uitgeschakeld. XRUN delay status disabled. XRUN delay status uitgeschakeld. Maximum delay status disabled. Maximum delay status uitgeschakeld. JACK Session support disabled. Jack Sessie ondersteuning uitgeschakeld. ALSA/MIDI sequencer support disabled. ALSA/MIDI sequencer ondersteuning uitgeschakeld. Website Webstek This program is free software; you can redistribute it and/or modify it Dit programma is vrije software; je mag het doorgeven en/of aanpassen under the terms of the GNU General Public License version 2 or later. volgens de bepalingen in de GNU-General Public Licentie versie 2 of later. JACK MIDI support disabled. JACK MIDI ondersteuning uitgeschakeld. JACK Port aliases support disabled. JACK Poort alias ondersteuning uitgeschakeld. D-Bus interface support disabled. D-Bus interface ondersteuning uitgeschakeld. qjackctlClientListView &Connect &Verbinden Alt+C Connect Koppelen Alt+K &Disconnect Af&Koppelen Alt+D Disconnect Afkoppelen Alt+K Disconnect &All &Alles afkoppelen Alt+A Disconect All Alles afkoppelen Alt+A Re&name Her&noemen Alt+N Rename Hernoemen Alt+N &Refresh Ve&rversen Alt+R Refresh Verversen Alt+R Readable Clients / Output Ports Leesbare clients / Uitgangspoorten Writable Clients / Input Ports Beschrijfbare clients / ingangspoorten qjackctlConnect Warning Opgelet This will suspend sound processing from all client applications. Are you sure? Dit zal het verwerken van geluid onderbreken voor alle client toepassingen. Bent u zeker? qjackctlConnectionsForm Connections - JACK Audio Connection Kit Verbindingen - JACK Audio Connectie Kit Audio Audio &Connect &Verbinden Connect currently selected ports Verbind geselecteerde poorten &Disconnect Af&Koppelen Disconnect currently selected ports Geselecteerde poorten loskoppelen Disconnect &All &Alles afkoppelen Disconnect all currently connected ports Alle verbonden poorten afkoppelen Expand all client ports Toon alle client poorten E&xpand All &Toon alles &Refresh Ve&rversen Refresh current connections view Ververs huidig verbindingen venster MIDI MIDI Warning Opgelet ALSA ALSA The preset aliases have been changed: "%1" Do you want to save the changes? De preset aliases zijn aangepast: Ā« %1 Ā» Wil u deze aanpassingen opslaan? qjackctlConnectorView &Connect &Verbinden Alt+C Connect Verbinden Alt+V &Disconnect Af&Koppelen Alt+D Disconnect Afkoppelen - Knippen Alt+K Disconnect &All &Alles afkoppelen Alt+A Disconect All Alles afkoppelen Alt+A &Refresh &Verversen Alt+R Refresh Verversen Alt+V qjackctlMainForm QjackCtl QjackCtl &Quit &Sluiten Quit processing and exit Stop proces en sluit af &Start Sta&rt Start the JACK server Start de JACK server S&top S&top Stop the JACK server Stop de JACK server St&atus St&atus Ab&out... &over… Show information about this application Toon informatie over deze toepassing Show settings and options dialog Toon instellingen en opties venster &Messages &Berichten &Patchbay I don't know a translation to dutch for the word patchbay &Patchbay Show/hide the patchbay editor window Toon/verberg de patchbay editor &Connect &Verbindingen Set&up... &Instellingen… Show/hide the actual connections patchbay window Toon/verberg de huidige verbindingen patchbay JACK server state JACK server status JACK server mode JACK server mode Sample rate No translation known to Dutch Sample rate Time display Tijd weergave Transport state Transport status Transport BPM Transport BPM Transport time Transport tijd Show/hide the session management window Toon/verberg het sessie management venster Show/hide the messages log/status window Toon/verberg het berichten log/status venster &Backward &Terug Backward transport Terugwaarts afspelen &Forward &Voorwaarts Forward transport Voorwaarts afspelen &Rewind Te&rugspoelen Rewind transport Terugspoelen Pa&use Pa&use Stop transport rolling Stop het afspelen &Play &Spelen Start transport rolling Start het afspelen Warning Opgelet successfully met succes with exit status=%1 met exit status=%1 Could not load preset "%1". Retrying with default. Kon de preset Ā« %1 Ā» niet laden. Opnieuw aan het proberen met standaard. Could not load default preset. Sorry. Kon de standaard preset niet inladen. Sorry. Startup script... Opstart script... Startup script terminated Opstart script beĆ«indigd JACK is starting... JACK start op... Could not start JACK. Sorry. JACK kon niet opstarten. Sorry. JACK is stopping... JACK stopt... Shutdown script... Afsluit script... Don't ask this again Shutdown script terminated Afsluit script beĆ«indigd Post-shutdown script... Na-afsluit script... Post-shutdown script terminated Na-afsluit script beĆ«indigd JACK was stopped JACK is gestopt Error Fout Transport time code Transport tijdscode Elapsed time since last reset Verlopen tijd sinds laatste reset Elapsed time since last XRUN Verlopen tijd sinds laatste XRUN Patchbay activated. Patchbay ingeschakeld. Patchbay deactivated. Patchbay uitgeschakeld. Statistics reset. Initialisatie van statistieken. msec ms XRUN callback (%1). Buffer size change (%1). Buffergrootte aanpassing (%1). Shutdown notification. Afluit melding. checked this is correct if checked means "controlled to see if everything is OK", but if it means checked like in a check box, then the translation should be: "aangevinkt" nagekeken connected verbonden disconnected afgesloten failed mislukt Server configuration saved to "%1". Server configuratie opgeslagen in Ā« %1 Ā». Client activated. Client geactiveerd. Post-startup script... Na-startup script... Post-startup script terminated Na-startup script beĆ«indigd Command line argument... Command line argument started Client deactivated. Client gedeactiveerd. Transport rewind. Transport terugspoelen. Transport backward. Transport achterwaarts. Starting Startend Transport start. Stopping Stoppend Transport stop. Transport forward. Transport voorwaarts. Stopped Gestopt Yes Ja No Nee RT RT Rolling Looping XRUN callback (%1 skipped). XRUN callback (%1 overgeslagen). Started Gestart Active Actief Activating Activering Inactive Inactief &Hide Ver&hullen Mi&nimize Verklei&nen S&how &Tonen Rest&ore &Herstellen &Stop &Stop &Reset &Herstel &Presets &Presets &Versioning Re&fresh &Connections &Verbindingen Patch&bay &Transport Server settings will be only effective after restarting the JACK audio server. Server instellingen worden toegepast na het herstarten van de JACK audio server. Information Informatie Some settings will be only effective the next time you start this program. Sommige instellingen worden pas toegepast nadat u dit programma opnieuw opstart. DSP Load DSP-Verbruik XRUN Count (notifications) XRUN Telling (meldingen) JACK connection graph change. JACK verbindingen tekening aangepast. ALSA connection graph change. ALSA verbindingen aangepast. JACK connection change. JACK verbindingen aangepast. ALSA connection change. ALSA verbindingen aangepast. JACK is currently running. Do you want to terminate the JACK audio server? JACK wordt momenteel gebruikt. Wil u de JACK audio server stoppen? D-BUS: Service is available (%1 aka jackdbus). DBUS : Service is beschikbaar (%1 ook gekend als jackdbus). D-BUS: Service not available (%1 aka jackdbus). DBUS : Service is niet beschikbaar (%1 ook gekend als jackdbus). The program will keep running in the system tray. To terminate the program, please choose "Quit" in the context menu of the system tray icon. Het programma zal in de systeem balk blijven lopen. Om het programma te stoppen, gelieve Ā« Sluiten Ā» te kiezen in het menu van het systeem balk icoon. Don't show this message again Could not start JACK. Maybe JACK audio server is already started. Kon JACK niet starten. Misschien is de JACK audio server al gestart. D-BUS: JACK server is starting... D-BUS : JACK server start op… D-BUS: JACK server could not be started. Sorry DBUS : JACK server kon niet worden gestart. Sorry Some client audio applications are still active and connected. Do you want to stop the JACK audio server? Sommige client audio toepassingen zijn nog steeds actief en verbonden. Wil u de JACK audio server stoppen? D-BUS: JACK server is stopping... DBUS : JACK server is stoppende… D-BUS: JACK server could not be stopped. Sorry D-BUS : JACK server kon niet worden gestopt. Sorry JACK was started with PID=%1. JACK is gestart met PID=%1. D-BUS: JACK server was started (%1 aka jackdbus). DBUS : JACK server is gestart (%1 ook gekend als jackdbus). JACK is being forced... JACK wordt geforceerd… D-BUS: JACK server was stopped (%1 aka jackdbus). DBUS : JACK server werd gestopt (%1 soit jackdbus). Transport BBT (bar.beat.ticks) Patchbay reset. Could not load active patchbay definition. "%1" Disabled. JACK has crashed. JACK is ingestort. JACK timed out. JACK was te laat. JACK write error. JACK schrijffout. JACK read error. JACK leesfout. Unknown JACK error (%d). Onbekende JACK fout (%d). JACK property change. Overall operation failed. Gehele toepassing gefaald. Invalid or unsupported option. Ongeldige of niet-ondersteunde optie. Client name not unique. Client naam niet uniek. Server is started. Server is gestart. Unable to connect to server. Kan niet met de server verbinden. Server communication error. Server communicatie fout. Client does not exist. Client bestaat niet. Unable to load internal client. Kan interne client niet laden. Unable to initialize client. Kan client niet initializeren. Unable to access shared memory. Geen toegang tot gedeeld geheugen. Client protocol version mismatch. Client protocol versie ongeldig. Could not connect to JACK server as client. - %1 Please check the messages window for more info. Kon niet verbinden als client met de JACK server. - %1 Gelieve het berichten venster te lezen voor meer info. %1 (%2%) %1 (%2%) %1 (%2%, %3 xruns) %1 % %1 % %1 Hz %1 Hz %1 frames %1 frames %1 msec %1 ms S&ession S&essie &Load... &Laden... &Save... &Bewaren… Save and &Quit... Bewaren en af&sluiten… Save &Template... &Template bewaren… D-BUS: SetParameterValue('%1', '%2'): %3. (%4) D-BUS : SetParameterValue('%1', '%2') : %3. (%4) D-BUS: ResetParameterValue('%1'): %2. (%3) D-BUS : ResetParameterValue('%1') : %2. (%3) D-BUS: GetParameterValue('%1'): %2. (%3) D-BUS : GetParameterValue('%1') : %2. (%3) Could not open ALSA sequencer as a client. ALSA MIDI patchbay will be not available. Kon de ALSA sequencer niet als client openen. De ALSA MIDI patchbay zal niet beschikbaar zijn. JACK active patchbay scan JACK actieve patchbay scan ALSA active patchbay scan ALSA actieve patchbay scan A patchbay definition is currently active, which is probable to redo this connection: %1 -> %2 Do you want to remove the patchbay connection? Er is een patchbay definitie actief, die deze verbinding waarschijnlijk zal herstellen: %1 -> %2 Wil u de patchbay verbinding verwijderen? qjackctlMessagesStatusForm Messages / Status - JACK Audio Connection Kit Meldingen / Status - JACK Audio Connectie Kit &Messages &Meldingen Messages log Meldingen logboek Messages output log Meldingen uitgang logboek &Status &Status Status information Status informatie Statistics since last server startup Statistiek sinds laatste server opstart Description Beschrijving Value Waarde Reset XRUN statistic values Initialiseer XRUN statistiek waarden Re&set Refresh XRUN statistic values Ververs XRUN statistiek waarden &Refresh &Ververs Server name Server naam Server state Server status DSP Load DSP lading Sample Rate Buffer Size Buffergrootte Realtime Mode Realtime Modus Transport state Transport status Transport Timecode Transport Tijdscode Transport BBT Transport BPM XRUN count since last server startup Aantal XRUNS sinds laatste server opstart XRUN last time detected Laatst opgemerkte XRUN XRUN last Laatste XRUN XRUN maximum XRUN minimum XRUN average XRUN gemiddelde XRUN total XRUN totaal Maximum scheduling delay Time of last reset Tijd sinds laatste reset Logging stopped --- %1 --- Loggen gestopt --- %1 --- Logging started --- %1 --- Loggen gestart --- %1 --- qjackctlPatchbay Warning Opgelet This will disconnect all sockets. Are you sure? Dit zal alle sockets ontkoppelen. Bent u zeker? qjackctlPatchbayForm Patchbay - JACK Audio Connection Kit Patchbay - JACK Audio Connectie Kit &New &Nieuw Create a new patchbay profile CreĆ«er een nieuw patchbay profiel &Load... &Laden… Load patchbay profile Laad patchbay profiel &Save... &Bewaren... Save current patchbay profile Bewaar huidig patchbay profiel Expand all items Toon alle items E&xpand All &Toon alle Current (recent) patchbay profile(s) Huidig (recent) patchbay profiel(en) Acti&vate Acti&veer Toggle activation of current patchbay profile Schakel activatie van huidig patchbay profiel in/uit &Connect &Verbind Connect currently selected sockets Verbind huidige geselecteerde sockets &Disconnect &Ontkoppel Disconnect currently selected sockets Ontkoppel huidig geselecteerde sockets Disconnect &All Ontkoppel &alle Disconnect all currently connected sockets Ontkoppel alle huidige verbonden sockets &Refresh Ve&rvers Refresh current patchbay view Ververs huidig patchbay venster Down Omlaag Move currently selected output socket down one position Verplaats de geselecteerde uitgang socket ƩƩn positie omlaag Add... Voeg toe… Create a new output socket CreĆ«er een nieuwe uitgang socket Edit... Bewerk... Edit currently selected input socket properties Bewerk eigenschappen van geselecteerde ingang socket Up Omhoog Move currently selected output socket up one position Verplaats de geselecteerde uitgang socket ƩƩn positie omhoog Remove Verwijder Remove currently selected output socket Verwijder de geselecteerde uitgang socket Copy... Kopieer… Duplicate (copy) currently selected output socket Dupliceer de geselecteerde uitgang socket Remove currently selected input socket Verwijder de geselecteerde uitgang socket Duplicate (copy) currently selected input socket Dupliceer de geselecteerde ingang socket Create a new input socket CreĆ«er een nieuwe ingang socket Edit currently selected output socket properties Bewerk eigenschappen van geselecteerde uitgang socket Warning Opgelet Error Fout New Patchbay definition Nieuwe patchbay definitie Patchbay Definition files Patchbay definitie bestanden Load Patchbay Definition Laad Patchbay Definitie Save Patchbay Definition Bewaar Patchbay Definitie active actief The patchbay definition has been changed: "%1" Do you want to save the changes? De patchbay definitie is aangepast : Ā« %1 Ā» Wil u de veranderingen bewaren? %1 [modified] %1 [aangepast] Untitled%1 Ongetieteld%1 Could not load patchbay definition file: "%1" Kon patchbay definite bestand niet laden : Ā« %1 Ā» Could not save patchbay definition file: "%1" Kon patchbay definitie bestand niet bewaren : Ā« %1 Ā» Create patchbay definition as a snapshot of all actual client connections? CreĆ«er patchbay definitie als een momentopname van alle huidige client verbindingen? qjackctlPatchbayView Add... Voeg toe… Edit... Bewerk… Copy... Kopieer… Remove Verwijder Exclusive Exclusief (None) (Geen) Forward Vooruit Move Up Omhoog Move Down Omlaag &Connect &Verbind Alt+C Connect Verbind Alt+V &Disconnect &Loskoppelen Alt+D Disconnect Loskoppelen Alt+L Disconnect &All &Alle loskoppelen Alt+A Disconect All Alle loskoppelen Alt+A &Refresh Ve&rvers Alt+R Refresh Ververs Alt+R qjackctlSessionForm Session - JACK Audio Connection Kit Sessie - JACK Audio Connectie Kit Load session Laad sessie &Load... &Laden… Recent session Vorige sessie &Recent Vo&rige Save session Bewaar sessie Save session versioning &Versioning Re&fresh Session clients / connections Infra-clients / commands Infra-client Infra-command Add infra-client &Add Edit infra-client &Edit B&ewerken Remove infra-client Re&move &Save... &Bewaar… Update session Sessie updaten Client / Ports Client / Poorten UUID UUID Command Opdracht &Save &Bewaren Load Session Laad sessie Session directory Sessie map Save Session Bewaar Sessie and Quit en Sluit Template Sjabloon &Clear &Wissen Warning Opgelet A session could not be found in this folder: "%1" Een sessie werd niet gevonden in deze map: Ā« %1 Ā» %1: loading session... %1 : sessie laden… %1: load session %2. %1: sessie laden %2. A session already exists in this folder: "%1" Are you sure to overwrite the existing session? Een sessie bestaat al in deze map: Ā« %1 Ā» Bent u zeker dat u deze bestaande sessie wil overschrijven ? This folder already exists and is not empty: "%1" Are you sure to overwrite the existing folder? Deze map bestaat al en is niet leeg : Ā« %1 Ā» Bent u zeker dat u de bestaande map wil vervangen ? %1: saving session... %1 : sessie wordt bewaard… %1: save session %2. %1 : sessie wordt bewaard %2. New Client Save and &Quit... &Bewaren en afsluiten… Save &Template... Bewaar S&jabloon… qjackctlSessionInfraClientItemEditor Infra-command qjackctlSetupForm Setup - JACK Audio Connection Kit Instellingen - JACK Audio Connectie Kit Settings Instellingen Preset &Name: Preset &Naam: (default) (standaard) Settings preset name Naam instellingen preset &Save &Bewaren Save settings as current preset name Bewaar instellingen als huidige preset naam &Delete &Wissen Delete current settings preset Huidige instellingen preset wissen jackstart jackstart jackd jackd Driv&er: Driv&er: dummy dummie oss oss alsa alsa portaudio portaudio coreaudio coreaudio freebob freebob Parameters Parameters Number of periods in the hardware buffer Aantal periodes in hardware buffer Priorit&y: Pri&oriteit : &Frames/Period: &Frames/Periode: 16 16 32 32 64 64 128 128 256 256 512 512 1024 1024 2048 2048 4096 4096 Frames per period between process() calls Frames per periode tussen process() calls Port Ma&ximum: Poorten ma&ximum : 21333 21333 22050 22050 32000 32000 44100 44100 48000 48000 88200 88200 96000 96000 192000 192000 Sample rate in frames per second Sample rate in frames per seconde Scheduler priority when running realtime Scheduler prioriteit wanneer in realtime modus &Word Length: &Resolutie (bit) : Periods/&Buffer: Periodes/&Buffer : Word length Resolutie Maximum number of ports the JACK server can manage Maximum aantal poorten dat de JACK server aankan &Wait (usec): &Wacht (µsec): Sample &Rate: Sample &Rate (Hz): &Timeout (msec): &Timeout (in ms) : 200 200 500 500 1000 1000 2000 2000 5000 5000 10000 10000 Set client timeout limit in miliseconds Zet client timeout limiet in milisecondes &Realtime &Realtime Use realtime scheduling Gebruik realtime scheduling No Memory Loc&k Geen Memory Loc&k Do not attempt to lock memory, even if in realtime mode Probeer niet om geheugen te "locken", zelfs niet in realtime modus &Unlock Memory &Unlock Memory Unlock memory of common toolkit libraries (GTK+, QT, FLTK, Wine) Deblokkeer geheugen van gemeenschappelijke toolkit libraries (GTK+, QT, FLTK, Wine) So&ft Mode So&ft Mode Ignore xruns reported by the backend driver Negeer xruns meldingen van de backend driver &Monitor &Monitor Provide output monitor ports Voorzie monitor uitgang poorten Force &16bit Forceer &16bit Force 16bit mode instead of failing over 32bit (default) Forceer 16bit in plaats van te falen bij 32bit (standaard) H/W M&onitor H/W M&onitor Enable hardware monitoring of capture ports Schakel hardware monitor van opnamepoorten in H/&W Meter H/&W Meter Enable hardware metering on cards that support it Schakel hardware meten in op kaarten die het ondersteunen &Ignore H/W &Negeer H/W Ignore hardware period/buffer size Negeer hardware period/buffer grootte &Output Device: &Output Apparaat: &Interface: &Interface : Maximum input audio hardware channels to allocate Maximum bruikbare input audio hardware kanalen &Audio: &Audio: Dit&her: Dit&her: External output latency (frames) Externe output vertraging (in frames) &Input Device: &Input Apparaat : Duplex Duplex Capture Only Enkel opnemen Playback Only Enkel afspelen Provide either audio capture, playback or both Voorzie audio opname, afspelen of beide hw:0 hw:0 The PCM device name to use De PCM apparaats naam te gebruiken > > &Name: &Naam: The JACK Audio Connection Kit sound server name De JACK Audio Connectie Kit geluid server naam /dev/dsp /dev/dsp Alternate input device for capture Alternatief input apparaat voor opname Maximum output audio hardware channels to allocate Maximum bruikbare output audio hardware kanalen Alternate output device for playback Alternatief output apparaat voor afspelen External input latency (frames) Externe input vertraging (in frames) None Geen Rectangular Blok Shaped Sinus Triangular Driehoek Set dither mode Kies dither modus Whether to give verbose output on messages Geef veel info bij berichten Time in seconds that client is delayed after server startup Tijd in secondes waarmee de client wordt vertraagd na opstarten van de server Latency: Vertraging: Output latency in milliseconds, calculated based on the period, rate and buffer settings Output vertraging in milliseconden, berekend vanuit periodes, rate en buffer instellingen Options Opties Scripting Scripts Execute script on Start&up: Script &uitvoeren voor opstarten: Whether to execute a custom shell script before starting up the JACK audio server. Custom shell script uitvoeren vóór het opstarten van de JACK audio server. Execute script after &Startup: &Script uitvoeren na opstarten: Whether to execute a custom shell script after starting up the JACK audio server. Custom shell script uitvoeren na het opstarten van de JACK audio server. Execute script on Shut&down: Script uitvoeren &bij afsluiten: Whether to execute a custom shell script before shuting down the JACK audio server. Custom shell script uitvoeren vóór het afsluiten van de JACK audio server. Command line to be executed before starting up the JACK audio server Commando om uit te voeren vóór het opstarten van de JACK audio server Scripting argument meta-symbols Script argument meta symbolen ... … Browse for script to be executed before starting up the JACK audio server Bladeren naar een script om uit te voeren vóór het starten van de JACK audio server Command line to be executed after starting up the JACK audio server Commando om uit te voeren na het opstarten van de JACK audio server Browse for script to be executed after starting up the JACK audio server Bladeren naar een script om uit te voeren na het starten van de JACK audio server Browse for script to be executed before shutting down the JACK audio server Bladeren naar een script om uit te voeren vóór het stoppen van de JACK audio server Command line to be executed before shutting down the JACK audio server Commando om uit te voeren vóór het stoppen van de JACK audio server Execute script after Shu&tdown: Script uitvoeren &na afsluiten: Whether to execute a custom shell script after shuting down the JACK audio server. Custom shell script uitvoeren na het afsluiten van de JACK audio server. Browse for script to be executed after shutting down the JACK audio server Bladeren naar een script om uit te voeren na het stoppen van de JACK audio server Command line to be executed after shutting down the JACK audio server Commando om uit te voeren na het stoppen van de JACK audio server Statistics Statistieken &Capture standard output Standaard &output weergeven Whether to capture standard output (stdout/stderr) into messages window Standaard output (stdout/stderr) weergeven in berichten venster &XRUN detection regex: regex voor &XRUN detectie: xrun of at least ([0-9|\.]+) msecs xrun van ten minste ([0-9|\.]+) ms Regular expression used to detect XRUNs on server output messages Expression rĆ©guliĆØre utilisĆ©e pour dĆ©tecter les dĆ©synchronisations (XRUN) dans les messages de sortie du serveur Connections Verbindingen 10 10 Patchbay definition file to be activated as connection persistence profile Patchbay definitie bestand om verbindingen profiel te bewaren Browse for a patchbay definition file to be activated Bladeren naar een patchbay definitie bestand om te activeren Activate &Patchbay persistence: Activeer &Patchbay bewaring: Whether to activate a patchbay definition for connection persistence profile. Patchbay definitie bestand activeren om verbindingen profiel te bewaren. Display Weergave Time Display Tijdsweergave Time F&ormat: Tijdsf&ormaat: hh:mm:ss hh:mm:ss hh:mm:ss.d hh:mm:ss.d hh:mm:ss.dd hh:mm:ss.dd hh:mm:ss.ddd hh:mm:ss.ddd The general time format on display Algemeen formaat voor tijdsweergave Server Suffi&x: Transport &Time Code Transport &Time Code Transport &BBT (bar:beat.ticks) Transport &BBT (bar:beat.ticks) Elapsed time since last &Reset Verlopen tijd sinds laatste &Reset Elapsed time since last &XRUN Verlopen tijd sinds laatste &XRUN Sample front panel normal display font Voorbeeld hoofdvenster normale weergave lettertype Sample big time display font Voorbeeld grote klok weergave lettertype Big Time display: Grote klok weergave: &Font... &Lettertype… Select font for front panel normal display Kies lettertype voor hoofdvenster normale weergave Select font for big time display Kies lettertype voor grote klok weergave Normal display: Normale weergave: &Display shiny glass light effect &Weergave glanzend glas licht effect Whether to enable a shiny glass light effect on the main display Een glanzend glass licht effect gebruiken in het hoofdvenster Messages Window Berichten venster Sample messages text font display Voorbeeld lettertype voor berichten Select font for the messages text display Kies lettertype voor tekst in berichtenvenster &Messages limit: &Berichten limiet: Whether to keep a maximum number of lines in the messages window Een maximum aantal lijnen behouden in het berichten venster 100 100 250 250 2500 2500 The maximum number of message lines to keep in view Het maximum aantal berichten om in beeld te houden Connections Window Verbindingen venster Sample connections view font Voorbeeld lettertype verbindingen venster Select font for the connections view Kies lettertype voor het verbindingen venster &Icon size: &Icoon grootte: 16 x 16 16 x 16 32 x 32 32 x 32 64 x 64 64 x 64 The icon size for each item of the connections view De grootte van het icoon voor elk element uit het verbindingen venster Ena&ble client/port aliases editing (rename) Client/poort &hernoemen mogelijk maken (aliases) Whether to enable in-place client/port name editing (rename) Bewerken van de naam van een client/poort toestaan E&nable client/port aliases Activeer client/p&ort aliasen Whether to enable client/port name aliases on the connections window Alternatieve naam (alias) van client/poort tonen in verbindingen venster Draw connection and patchbay lines as Be&zier curves Teken verbindingen en patchbay lijnen als Be&zier curves Whether to draw connection lines as cubic Bezier curves Verbindingen en patchbay lijnen als cubische Bezier curves tekenen Misc Meer Other Andere &Start JACK audio server on application startup &Start JACK audio server bij opstarten van QjackCtl Whether to start JACK audio server immediately on application startup JACK audio server onmiddelijk starten bij opstarten van de toepassing &Confirm application close &Bevestig sluiten van QjackCtl Whether to ask for confirmation on application exit Vragen om bevestiging wanneer de toepassing wordt beĆ«indigd &Keep child windows always on top &Kind vensters steeds bovenaan houden Whether to keep all child windows on top of the main window Kind vensters al dan niet over het hoofdvenster laten verschijnen &Enable system tray icon Activ&eer systeem balk icoon Whether to enable the system tray icon Minimaliseren naar systeem balk icoon of niet S&ave JACK audio server configuration to: Bew&aar JACK audio server configuratie als: Whether to save the JACK server command-line configuration into a local file (auto-start) De JACK server commando configuratie in een lokaal bestand opslaan (auto start) .jackdrc .jackdrc The server configuration local file name (auto-start) Naam van het lokale server configuratie bestand (auto start) C&onfigure as temporary server C&onfigureer als tijdelijke server Whether to exit once all clients have closed (auto-start) Afsluiten eens alle clienten afgesloten werden (auto start) Confirm server sh&utdown Bevestig s&toppen van de server Whether to ask for confirmation on JACK audio server shutdown Bevestiging vragen bij het stoppen van de JACK audio server Buttons Knoppen Hide main window &Left buttons Verberg knoppen aan &linkerkant van hoofdvenster Whether to hide the left button group on the main window De knoppen groep aan de linkerkant van het hoofdvenster verbergen Hide main window &Right buttons Verberg knoppen aan &rechterkant van hoofdvenster Whether to hide the right button group on the main window De knoppen groep aan de rechterkant van het hoofdvenster verbergen Hide main window &Transport buttons Verberg hoofdvenster &Transport knoppen Whether to hide the transport button group on the main window De transport knoppengroep in het hoofdvenster al dan niet verbergen Hide main window &button text labels Verberg tekst bij &knoppen in hoofdvenster Whether to hide the text labels on the main window buttons Verberg de tekst labels onder knoppen in het hoofdvenster Warning Opgelet msec ms n/a n/a &Preset Name &Preset Naam &Server Name &Server Naam &Server Path &Server Pad &Driver &Driver &Interface &Interface Sample &Rate Sample &Rate &Frames/Period &Frames/Periode Periods/&Buffer Periodes/&Buffer Startup Script Opstart Script Post-Startup Script Na-opstart Script Shutdown Script Afsluit Script Post-Shutdown Script Na-afsluit Script Patchbay Definition files Patchbay Definitie bestanden Active Patchbay Definition Actieve Patchbay Definitie The audio backend driver interface to use De te gebruiken audio backend driver interface &Verbose messages Uit&voerige berichten MIDI Driv&er: MIDI Driv&er: none geen raw raw seq seq The ALSA MIDI backend driver to use De te gebruiken ALSA MIDI backend driver jackdmp jackdmp firewire firewire plughw:0 plughw:0 Some settings have been changed: "%1" Do you want to save the changes? Sommige instellingen zijn veranderd: Ā« %1 Ā» Wil u deze aanpassingen opslaan? Delete preset: "%1" Are you sure? Verwijder preset : Ā« %1 Ā» Bent u zeker? Some settings have been changed. Do you want to apply the changes? Sommige instellingen zijn veranderd. Wil u de veranderingen toepassen? Messages Log Berichten Log Log files Log bestanden sun sun netone netone /dev/audio /dev/audio &Channels: &Sporen: Server path (command line prefix) Maximum number of audio channels to allocate Maximum aantal te gebruiken audio sporen &Channels I/O: &Latency I/O: Logging Loggen Messages log file Berichten log bestand Browse for the messages log file location Blader naar de berichten log bestand locatie Whether to activate a messages logging to file. Berichten opslaan in een bestand activeren. Server &Prefix: Extra driver options (command line suffix) Start De&lay: secs 0 msecs Please do not touch these settings unless you know what you are doing. &Messages log file: &Berichten log bestand: Whether to enable blinking (flashing) of the server mode (RT) indicator Activeer het knipperen van de server modus (RT) indicator Blin&k server mode indicator &Knipperende server modus indicator &JACK client/port aliases: &JACK client/poort aliassen: JACK client/port aliases display mode JACK client/poort aliassen weergave modus Default Standaard First Eerste Second Tweede JACK client/port pretty-name (metadata) display mode Advanced Whether to reset all connections when a patchbay definition is activated. &Reset all connections on patchbay activation Whether to issue a warning on active patchbay port disconnections. &Warn on active patchbay disconnections Enable JA&CK client/port pretty-names (metadata) Whether to show system tray message on main window close Sho&w system tray message on close Whether to restrict to one single application instance (X11) Beperken tot ƩƩn enkele toepassings instantie (X11) Single application &instance Slechts ƩƩn QjackCtl laten draa&ien Whether to enable ALSA Sequencer (MIDI) support on startup Activeer ALSA Sequencer (MIDI) ondersteuning bij opstarten E&nable ALSA Sequencer support Activeer &ALSA Sequencer ondersteuning Whether to enable JACK D-Bus interface &Enable JACK D-Bus interface Whether to stop JACK audio server on application exit S&top JACK audio server on application exit Defaults Standaard &Base font size: &Basis lettertype grootte: Base application font size (pt.) Basis lettertype grootte voor toepassing (pt.) 6 6 7 7 8 8 9 9 11 11 12 12 net net Whether to enable D-Bus interface D-Bus activeren &Enable D-Bus interface &D-Bus interface activeren Number of microseconds to wait between engine processes (dummy) Aantal microseconden wachten tussen engine processen (dummie) qjackctlSocketForm Socket - JACK Audio Connection Kit Socket - JACK Audio Connectie Kit &Socket &Socket &Name (alias): &Naam (alias): Socket name (an alias for client name) Socket naam (een alias voor client naam) Client name (regular expression) Client naam (reguliere expressie) Add P&lug Plug &toevoegen Add plug to socket plug list Plug toevoegen aan socket plug lijst &Plug: &Plug: Port name (regular expression) Poort naam (reguliere expressie) Socket Plugs / Ports Socket Plugs / Poorten Socket plug list Socket plug lijst &Edit B&ewerken &Remove &Verwijderen Remove currently selected plug from socket plug list Verwijder geselecteerde plug uit socket plug lijst &Client: &Client: &Down Om&laag &Up Om&hoog E&xclusive E&xclusief Enforce only one exclusive cable connection Sta slechts ƩƩn enkele aansluiting toe &Forward: &Stuur door: Forward (clone) all connections from this socket Stuur alle verbindingen van deze socket door (clonen) Type Type &Audio &Audio Audio socket type (JACK) Audio socket type (JACK) &MIDI &MIDI MIDI socket type (ALSA) MIDI socket type (ALSA) Plugs / Ports Plugs / Poorten Add Plug Plug toevoegen Remove Verwijder Edit Bewerken Error Fout A socket named "%1" already exists. Een socket genaamd Ā« %1 Ā» bestaat al. Move Up Omhoog Move Down Omlaag (None) (Geen) Edit currently selected plug Bewerk de geselecteerde plug Move down currently selected plug in socket plug list Verplaats geselecteerde plug omlaag in socket plug lijst Move up current selected plug in socket plug list Verplaats geselecteerde plug omhoog in socket plug lijst Warning Opgelet Some settings have been changed. Do you want to apply the changes? Sommige instellingen zijn veranderd. Wil u de veranderingen toepassen? MIDI socket type (JACK) MIDI socket type (JACK) AL&SA AL&SA qjackctlSocketList Output Uitgang Input Ingang Socket Socket Warning Opgelet <New> - %1 <Nieuw> - %1 %1 about to be removed: "%2" Are you sure? %1 zal verwijderd worden: Ā« %2 Ā» Bent u zeker? %1 <Copy> - %2 %1 <KopiĆ«er> - %2 qjackctlSocketListView Output Sockets / Plugs Uitgang Sockets / Plugs Input Sockets / Plugs Ingang Sockets / Plugs qjackctl-0.4.2/src/translations/PaxHeaders.14935/qjackctl_ru.ts0000644000000000000000000000013212700760152021235 xustar0030 mtime=1459871850.634915789 30 atime=1459871850.633915289 30 ctime=1459871850.634915789 qjackctl-0.4.2/src/translations/qjackctl_ru.ts0000644000175000001440000052576312700760152022023 0ustar00rncbcusers00000000000000 PortAudioProber Probing... Please wait, PortAudio is probing audio hardware. Warning ŠŸŃ€ŠµŠ“ŃƒŠæŃ€ŠµŠ¶Š“ŠµŠ½ŠøŠµ Audio hardware probing timed out. QObject Show help about command line options ŠŸŠ¾ŠŗŠ°Š·Š°Ń‚ŃŒ ŃŠæŃ€Š°Š²ŠŗŃƒ по ŠøŃŠæŠ¾Š»ŃŒŠ·Š¾Š²Š°Š½ŠøŃŽ параметров команГной строки Start JACK audio server immediately ŠŠµŠ¼ŠµŠ“Š»ŠµŠ½Š½Š¾ Š·Š°ŠæŃƒŃŃ‚ŠøŃ‚ŃŒ сервер JACK Show version information ŠŸŠ¾ŠŗŠ°Š·Š°Ń‚ŃŒ ŠøŠ½Ń„Š¾Ń€Š¼Š°Ń†ŠøŃŽ о версии Option -p requires an argument (preset). ŠšŠ»ŃŽŃ‡ -p Ń‚Ń€ŠµŠ±ŃƒŠµŃ‚ Š°Ń€Š³ŃƒŠ¼ŠµŠ½Ń‚Š° (пресет). (default) (как обычно) Usage: %1 [options] [command-and-args] Использование: %1 [ŠŗŠ»ŃŽŃ‡Šø] [команГы-Šø-Š°Ń€Š³ŃƒŠ¼ŠµŠ½Ń‚Ń‹] Options: ŠšŠ»ŃŽŃ‡Šø: Set default settings preset name Š£ŠŗŠ°Š·Š°Ń‚ŃŒ название ŠæŃ€Š¾Ń„ŠøŠ»Ń с параметрами по ŃƒŠ¼Š¾Š»Ń‡Š°Š½ŠøŃŽ Set active patchbay definition file Š£ŠŗŠ°Š·Š°Ń‚ŃŒ файл Š¾ŠæŠøŃŠ°Š½ŠøŃ активного ŠŗŠ¾Š¼Š¼ŃƒŃ‚атора Option -a requires an argument (path). ŠšŠ»ŃŽŃ‡Ńƒ -a необхоГим Š°Ń€Š³ŃƒŠ¼ŠµŠ½Ń‚ (расположение) Qt: %1 Qt: %1 Set default JACK audio server name Š£ŃŃ‚Š°Š½Š¾Š²ŠøŃ‚ŃŒ используемое по ŃƒŠ¼Š¾Š»Ń‡Š°Š½ŠøŃŽ название сервера JACK Option -n requires an argument (name). ŠšŠ»ŃŽŃ‡Ńƒ -n необхоГим Š°Ń€Š³ŃƒŠ¼ŠµŠ½Ń‚ (название). %1 (%2 frames) qjackctlAboutForm About Qt Šž Qt &Close &Š—Š°ŠŗŃ€Ń‹Ń‚ŃŒ Version Š’ŠµŃ€ŃŠøŃ Build Дборка Using: JACK %1 Š˜ŃŠæŠ¾Š»ŃŒŠ·ŃƒŠµŃ‚ŃŃ JACK %1 Transport status control disabled. Š”Ń‚Š°Ń‚ŃƒŃ ŃƒŠæŃ€Š°Š²Š»ŠµŠ½ŠøŃ транспортом Š¾Ń‚ŠŗŠ»ŃŽŃ‡Ń‘Š½. Realtime status disabled. Š”Ń‚Š°Ń‚ŃƒŃ режима Ń€ŠµŠ°Š»ŃŒŠ½Š¾Š³Š¾ времени Š¾Ń‚ŠŗŠ»ŃŽŃ‡Ń‘Š½. JACK Session support disabled. ŠŸŠ¾Š“Š“ŠµŃ€Š¶ŠŗŠ° JACK Session Š¾Ń‚ŠŗŠ»ŃŽŃ‡ŠµŠ½Š°. Website Š”Š¾Š¼Š°ŃˆŠ½ŃŃ страница This program is free software; you can redistribute it and/or modify it Это программа ŃŠ²Š»ŃŠµŃ‚ŃŃ свобоГной; вы можете Ń€Š°ŃŠæŃ€Š¾ŃŃ‚Ń€Š°Š½ŃŃ‚ŃŒ Šø/или ŠøŠ·Š¼ŠµŠ½ŃŃ‚ŃŒ её без ограничений under the terms of the GNU General Public License version 2 or later. на ŃƒŃŠ»Š¾Š²ŠøŃŃ… лицензии GNU General Public License версии 2 или более новой. Debugging option enabled. ŠŸŠ°Ń€Š°Š¼ŠµŃ‚Ń€ отлаГки Š²ŠŗŠ»ŃŽŃ‡ŠµŠ½. System tray disabled. ŠžŠ±Š»Š°ŃŃ‚ŃŒ ŃƒŠ²ŠµŠ“Š¾Š¼Š»ŠµŠ½ŠøŃ Š¾Ń‚ŠŗŠ»ŃŽŃ‡ŠµŠ½Š°. XRUN delay status disabled. Š”Ń‚Š°Ń‚ŃƒŃ заГержки XRUN Š¾Ń‚ŠŗŠ»ŃŽŃ‡ŠµŠ½. Maximum delay status disabled. Š”Ń‚Š°Ń‚ŃƒŃ максимальной заГержки Š¾Ń‚ŠŗŠ»ŃŽŃ‡ŠµŠ½. JACK MIDI support disabled. ŠŸŠ¾Š“Š“ŠµŃ€Š¶ŠŗŠ° JACK MIDI Š¾Ń‚ŠŗŠ»ŃŽŃ‡ŠµŠ½Š°. ALSA/MIDI sequencer support disabled. ŠŸŠ¾Š“Š“ŠµŃ€Š¶ŠŗŠ° секвенсера ALSA/MIDI Š¾Ń‚ŠŗŠ»ŃŽŃ‡ŠµŠ½Š°. About QjackCtl о QJackCtl JACK Port aliases support disabled. ŠŸŠ¾Š“Š“ŠµŃ€Š¶ŠŗŠ° алиасов портов JACK Š¾Ń‚ŠŗŠ»ŃŽŃ‡ŠµŠ½Š°. D-Bus interface support disabled. ŠŸŠ¾Š“Š“ŠµŃ€Š¶ŠŗŠ° интерфейса D-Bus Š¾Ń‚ŠŗŠ»ŃŽŃ‡ŠµŠ½Š°. qjackctlClientListView Readable Clients / Output Ports ŠŸŠ¾Ń€Ń‚Ń‹ выхоГа Writable Clients / Input Ports ŠŸŠ¾Ń€Ń‚Ń‹ вхоГа &Connect &Š”Š¾ŠµŠ“ŠøŠ½ŠøŃ‚ŃŒ Alt+C Connect Alt+с &Disconnect &Š Š°ŃŃŠ¾ŠµŠ“ŠøŠ½ŠøŃ‚ŃŒ Alt+D Disconnect Alt+р Disconnect &All Š Š°ŃŃŠ¾ŠµŠ“ŠøŠ½ŠøŃ‚ŃŒ &все Alt+A Disconect All Alt+в Re&name ŠŸŠµŃ€Šµ&ŠøŠ¼ŠµŠ½Š¾Š²Š°Ń‚ŃŒ Alt+N Rename Alt+Šø &Refresh &ŠžŠ±Š½Š¾Š²ŠøŃ‚ŃŒ Alt+R Refresh Alt+о qjackctlConnect Warning ŠŸŃ€ŠµŠ“ŃƒŠæŃ€ŠµŠ¶Š“ŠµŠ½ŠøŠµ This will suspend sound processing from all client applications. Are you sure? ŠžŠ±Ń€Š°Š±Š¾Ń‚ŠŗŠ° звука от клиентских приложений Š±ŃƒŠ“ет прекращена. Š’Ń‹ ŃƒŠ²ŠµŃ€ŠµŠ½Ń‹? qjackctlConnectionsForm Connections - JACK Audio Connection Kit Š”Š¾ŠµŠ“ŠøŠ½ŠµŠ½ŠøŃ &Connect &Š”Š¾ŠµŠ“ŠøŠ½ŠøŃ‚ŃŒ Connect currently selected ports Š”Š¾ŠµŠ“ŠøŠ½ŠøŃ‚ŃŒ выбранные сейчас порты &Disconnect &Š Š°ŃŃŠ¾ŠµŠ“ŠøŠ½ŠøŃ‚ŃŒ Disconnect currently selected ports Š Š°ŃŃŠ¾ŠµŠ“ŠøŠ½ŠøŃ‚ŃŒ выбранные сейчас порты Disconnect &All Š Š°ŃŃŠ¾ŠµŠ“ŠøŠ½ŠøŃ‚ŃŒ &все Disconnect all currently connected ports Š Š°ŃŃŠ¾ŠµŠ“ŠøŠ½ŠøŃ‚ŃŒ все соеГинённые сейчас порты Expand all client ports Š Š°ŃŠŗŃ€Ń‹Ń‚ŃŒ все порты клиентов E&xpand All &Š Š°ŃŠŗŃ€Ń‹Ń‚ŃŒ все &Refresh &ŠžŠ±Š½Š¾Š²ŠøŃ‚ŃŒ Refresh current connections view ŠžŠ±Š½Š¾Š²ŠøŃ‚ŃŒ отображение Ń‚ŠµŠŗŃƒŃ‰ŠøŃ… соеГинений Audio Š—Š²ŃƒŠŗ MIDI MIDI Warning ŠŸŃ€ŠµŠ“ŃƒŠæŃ€ŠµŠ¶Š“ŠµŠ½ŠøŠµ The preset aliases have been changed: "%1" Do you want to save the changes? Алиасы профилей изменились: "%1" Š’Ń‹ хотите ŃŠ¾Ń…Ń€Š°Š½ŠøŃ‚ŃŒ ŠøŠ·Š¼ŠµŠ½ŠµŠ½ŠøŃ? ALSA ALSA qjackctlConnectorView &Connect &Š”Š¾ŠµŠ“ŠøŠ½ŠøŃ‚ŃŒ Alt+C Connect Alt+с &Disconnect &Š Š°ŃŃŠ¾ŠµŠ“ŠøŠ½ŠøŃ‚ŃŒ Alt+D Disconnect Alt+р Disconnect &All Š Š°ŃŃŠ¾ŠµŠ“ŠøŠ½ŠøŃ‚ŃŒ &все Alt+A Disconect All Alt+в &Refresh &ŠžŠ±Š½Š¾Š²ŠøŃ‚ŃŒ Alt+R Refresh Alt+о qjackctlMainForm &Start &Š—Š°ŠæŃƒŃŃ‚ŠøŃ‚ŃŒ Start the JACK server Š—Š°ŠæŃƒŃŃ‚ŠøŃ‚ŃŒ сервер JACK S&top Š”&топ Stop the JACK server ŠžŃŃ‚Š°Š½Š¾Š²ŠøŃ‚ŃŒ сервер JACK &Quit Š’&ыхоГ Quit processing and exit ŠžŃŃ‚Š°Š½Š¾Š²ŠøŃ‚ŃŒ сервер Šø выйти ŠøŠ· программы JACK is starting... JACK Š·Š°ŠæŃƒŃŠŗŠ°ŠµŃ‚ŃŃ ... JACK is stopping... JACK Š¾ŃŃ‚Š°Š½Š°Š²Š»ŠøŠ²Š°ŠµŃ‚ŃŃ ... msec мс Error ŠžŃˆŠøŠ±ŠŗŠ° JACK server state Š”Š¾ŃŃ‚Š¾ŃŠ½ŠøŠµ сервера JACK Sample rate Частота ŃŃŠ¼ŠæŠ»ŠøŃ€Š¾Š²Š°Š½ŠøŃ Time display Š’Ń€ŠµŠ¼Ń Transport state Š”Š¾ŃŃ‚Š¾ŃŠ½ŠøŠµ транспорта Transport BPM BPM транспорта Transport time Š’Ń€ŠµŠ¼Ń транспорта &Play &Воспроизвести Start transport rolling Š—Š°ŠæŃƒŃŃ‚ŠøŃ‚ŃŒ воспроизвеГение через транспорт Pa&use Пау&за Stop transport rolling ŠžŃŃ‚Š°Š½Š¾Š²ŠøŃ‚ŃŒ воспроизвеГение с транспорта St&atus Š”&Ń‚Š°Ń‚ŃƒŃ Ab&out... Šž про&грамме... Show information about this application ŠŸŠ¾ŠŗŠ°Š·Š°Ń‚ŃŒ ŠøŠ½Ń„Š¾Ń€Š¼Š°Ń†ŠøŃŽ о приложении Show settings and options dialog ŠŸŠ¾ŠŗŠ°Š·Š°Ń‚ŃŒ Гиалог настройки программы &Messages Š”&Š¾Š¾Š±Ń‰ŠµŠ½ŠøŃ Patch&bay &ŠšŠ¾Š¼Š¼ŃƒŃ‚Š°Ń‚Š¾Ń€ Show/hide the patchbay editor window ŠŸŠ¾ŠŗŠ°Š·Š°Ń‚ŃŒ/ŃŠŗŃ€Ń‹Ń‚ŃŒ окно ŠŗŠ¾Š¼Š¼ŃƒŃ‚атора &Connections Дое&Š“ŠøŠ½ŠµŠ½ŠøŃ Show/hide the actual connections patchbay window ŠŸŠ¾ŠŗŠ°Š·Š°Ń‚ŃŒ/ŃŠæŃ€ŃŃ‚Š°Ń‚ŃŒ окно ŠŗŠ¾Š¼Š¼ŃƒŃ‚атора с Š°ŠŗŃ‚ŃƒŠ°Š»ŃŒŠ½Ń‹Š¼Šø ŃŠ¾ŠµŠ“ŠøŠ½ŠµŠ½ŠøŃŠ¼Šø successfully успешно Activating ŠŠŗŃ‚ŠøŠ²ŠøŃ€ŃƒŠµŃ‚ŃŃ Starting Š—Š°ŠæŃƒŃŠŗ The program will keep running in the system tray. To terminate the program, please choose "Quit" in the context menu of the system tray icon. ŠŸŃ€Š¾Š³Ń€Š°Š¼Š¼Š° проГолжит Ń€Š°Š±Š¾Ń‚Š°Ń‚ŃŒ в области ŃƒŠ²ŠµŠ“Š¾Š¼Š»ŠµŠ½ŠøŃ. Š”Š»Ń Š·Š°Š²ŠµŃ€ŃˆŠµŠ½ŠøŃ выберите в контекстном Š¼ŠµŠ½ŃŽ области ŃƒŠ²ŠµŠ“Š¾Š¼Š»ŠµŠ½ŠøŃ ŠæŃƒŠ½ŠŗŃ‚ «ВыхоГ». Startup script... Дценарий, Š²Ń‹ŠæŠ¾Š»Š½ŃŠµŠ¼Ń‹Š¹ при запуске... Startup script terminated Выполнение стартового ŃŃ†ŠµŠ½Š°Ń€ŠøŃ прекращено Started Š—Š°ŠæŃƒŃ‰ŠµŠ½ Stopping ŠžŃŃ‚Š°Š½Š¾Š²ŠŗŠ° JACK was stopped Cервер JACK остановлен Shutdown script... ŠŸŠ¾ŃŠ»ŠµŠ¾ŃŃ‚Š°Š½Š¾Š²Š¾Ń‡Š½Ń‹Š¹ сценарий... Shutdown script terminated Выполнение послеостановочного ŃŃ†ŠµŠ½Š°Ń€ŠøŃ прекращено Inactive ŠŠµ активен Active Активен Stopped Дтоп Could not load active patchbay definition. "%1" Disabled. ŠŠµ уГалось Š·Š°Š³Ń€ŃƒŠ·ŠøŃŒ описание активного ŠŗŠ¾Š¼Š¼ŃƒŃ‚атора. "%1" ŠžŃ‚ŠŗŠ»ŃŽŃ‡ŠµŠ½Š¾. Statistics reset. ŠŸŠµŃ€ŠµŠ·Š°ŠæŃƒŃŠŗ статистики Shutdown notification. УвеГомление об остановке checked проверено connected соеГинено failed не уГалось Client activated. ŠšŠ»ŠøŠµŠ½Ń‚ активирован Post-startup script... ŠŸŠ¾ŃŠ»ŠµŃŃ‚Š°Ń€Ń‚Š¾Š²Ń‹Š¹ сценарий... Post-startup script terminated Выполнение послестартового ŃŃ†ŠµŠ½Š°Ń€ŠøŃ прекращено Client deactivated. ŠšŠ»ŠøŠµŠ½Ń‚ Геактивирован Transport start. Транспорт Š·Š°ŠæŃƒŃ‰ŠµŠ½ Transport stop. Транспорт остановлен Yes Да No ŠŠµŃ‚ Rolling Š˜Š³Ń€Š°ŠµŃ‚ Looping ŠŸŠµŃ‚Š»Ń Transport time code Тайм-коГ транспорта Elapsed time since last reset Времени с послеГней ŠæŠµŃ€ŠµŠ·Š°Š³Ń€ŃƒŠ·ŠŗŠø Elapsed time since last XRUN Времени с послеГнего XRUN disconnected рассоеГинено Command line argument... ŠŃ€Š³ŃƒŠ¼ŠµŠ½Ń‚ Š“Š»Ń команГной строки... Command line argument started Information Š˜Š½Ń„Š¾Ń€Š¼Š°Ń†ŠøŃ Some settings will be only effective the next time you start this program. ŠŠµŠŗŠ¾Ń‚Š¾Ń€Ń‹Šµ ŠøŠ·Š¼ŠµŠ½ŠµŠ½ŠøŃ Š²ŃŃ‚ŃƒŠæŃŃ‚ в силу Ń‚Š¾Š»ŃŒŠŗŠ¾ при ŃŠ»ŠµŠ“ŃƒŃŽŃ‰ŠµŠ¼ запуске программы. JACK server mode Режим сервера JACK Server settings will be only effective after restarting the JACK audio server. ŠŸŠ°Ń€Š°Š¼ŠµŃ‚Ń€Ń‹ работы сервера JACK Š²ŃŃ‚ŃƒŠæŃŃ‚ в силу Ń‚Š¾Š»ŃŒŠŗŠ¾ при ŃŠ»ŠµŠ“ŃƒŃŽŃ‰ŠµŠ¼ запуске сервера. RT RT &Hide Š”&ŠŗŃ€Ń‹Ń‚ŃŒ S&how &ŠŸŠ¾ŠŗŠ°Š·Š°Ń‚ŃŒ &Stop &Дтоп Could not open ALSA sequencer as a client. ALSA MIDI patchbay will be not available. ŠŠµ уГалось Š¾Ń‚ŠŗŃ€Ń‹Ń‚ŃŒ секвенсер ALSA как клиентское приложение. ŠšŠ¾Š¼Š¼ŃƒŃ‚Š°Ń‚Š¾Ń€ ALSA MIDI Š±ŃƒŠ“ŠµŃ‚ Š½ŠµŠ“Š¾ŃŃ‚ŃƒŠæŠµŠ½. D-BUS: Service is available (%1 aka jackdbus). D-BUS: служба Š“Š¾ŃŃ‚ŃƒŠæŠ½Š° (%1, известный как jackdbus). D-BUS: Service not available (%1 aka jackdbus). D-BUS: служба Š½ŠµŠ“Š¾ŃŃ‚ŃƒŠæŠ½Š° (%1, известный как jackdbus). Warning ŠŸŃ€ŠµŠ“ŃƒŠæŃ€ŠµŠ¶Š“ŠµŠ½ŠøŠµ JACK is currently running. Do you want to terminate the JACK audio server? Дервер JACK работает. Š’Ń‹ хотите Š¾ŃŃ‚Š°Š½Š¾Š²ŠøŃ‚ŃŒ его? Don't ask this again with exit status=%1 со ŃŃ‚Š°Ń‚ŃƒŃŠ¾Š¼ выхоГа %1 Could not start JACK. Maybe JACK audio server is already started. ŠŠµ уГалось Š·Š°ŠæŃƒŃŃ‚ŠøŃ‚ŃŒ JACK. Возможно, звуковой сервер уже Š·Š°ŠæŃƒŃ‰ŠµŠ½. Could not load preset "%1". Retrying with default. ŠŠµ уГалось Š·Š°Š³Ń€ŃƒŠ·ŠøŃ‚ŃŒ ŠæŃ€Š¾Ń„ŠøŠ»ŃŒ "%1". ŠŸŠ¾ŠæŃ‹Ń‚ŠŗŠ° Š·Š°Š³Ń€ŃƒŠ·ŠøŃ‚ŃŒ ŠøŃŠæŠ¾Š»ŃŒŠ·ŃƒŠµŠ¼Ń‹Š¹ по ŃƒŠ¼Š¾Š»Ń‡Š°Š½ŠøŃŽ ŠæŃ€Š¾Ń„ŠøŠ»ŃŒ. Could not load default preset. Sorry. ŠŠµ уГалось Š·Š°ŠæŃƒŃŃ‚ŠøŃ‚ŃŒ ŠæŃ€Š¾Ń„ŠøŠ»ŃŒ по ŃƒŠ¼Š¾Š»Ń‡Š°Š½ŠøŃŽ. Š˜Š·Š²ŠøŠ½ŠøŃ‚Šµ. D-BUS: JACK server is starting... D-BUS: Š·Š°ŠæŃƒŃŠŗŠ°ŠµŃ‚ŃŃ сервер JACK... D-BUS: JACK server could not be started. Sorry D-BUS: не уГалось Š·Š°ŠæŃƒŃŃ‚ŠøŃ‚ŃŒ сервер JACK. Š˜Š·Š²ŠøŠ½ŠøŃ‚Šµ. Some client audio applications are still active and connected. Do you want to stop the JACK audio server? ŠŠµŠŗŠ¾Ń‚Š¾Ń€Ń‹Šµ клиентские Š·Š²ŃƒŠŗŠ¾Š²Ń‹Šµ ŠæŃ€ŠøŠ»Š¾Š¶ŠµŠ½ŠøŃ всё ещё активны Šø поГсоеГинены. Š’Ń‹ хотите Š¾ŃŃ‚Š°Š½Š¾Š²ŠøŃ‚ŃŒ звуковой сервер JACK? D-BUS: JACK server is stopping... D-BUS: сервер JACK Š¾ŃŃ‚Š°Š½Š°Š²Š»ŠøŠ²Š°ŠµŃ‚ŃŃ... D-BUS: JACK server could not be stopped. Sorry D-BUS: не уГалось Š¾ŃŃ‚Š°Š½Š¾Š²ŠøŃ‚ŃŒ сервер JACK. Š˜Š·Š²ŠøŠ½ŠøŃ‚Šµ. Post-shutdown script... Post-shutdown script terminated JACK was started with PID=%1. JACK был Š·Š°ŠæŃƒŃ‰ŠµŠ½ с PID=%1. Don't show this message again D-BUS: JACK server was started (%1 aka jackdbus). D-BUS: сервер JACK был Š·Š°ŠæŃƒŃ‰ŠµŠ½ (%1, известный как jackdbus). JACK is being forced... D-BUS: JACK server was stopped (%1 aka jackdbus). D-BUS: сервер JACK был остановлен (%1, известный как jackdbus). Transport BBT (bar.beat.ticks) Patchbay reset. Patchbay activated. ŠšŠ¾Š¼Š¼ŃƒŃ‚Š°Ń‚Š¾Ń€ активирован. Patchbay deactivated. ŠšŠ¾Š¼Š¼ŃƒŃ‚Š°Ń‚Š¾Ń€ Геактивирован. JACK connection graph change. Дмена графа соеГинений JACK. XRUN callback (%1). Buffer size change (%1). Дмена размера Š±ŃƒŃ„ера (%1). Could not start JACK. Sorry. ŠŠµ уГалось Š·Š°ŠæŃƒŃŃ‚ŠøŃ‚ŃŒ JACK. Š˜Š·Š²ŠøŠ½ŠøŃ‚Šµ. JACK has crashed. JACK timed out. JACK write error. ŠžŃˆŠøŠ±ŠŗŠ° записи JACK. JACK read error. ŠžŃˆŠøŠ±ŠŗŠ° Ń‡Ń‚ŠµŠ½ŠøŃ JACK. Unknown JACK error (%d). ŠŠµŠøŠ·Š²ŠµŃŃ‚Š½Š°Ń ошибка JACK (%d). JACK property change. ALSA connection graph change. Дмена графа соеГинений ALSA. JACK active patchbay scan Дканирование активного ŠŗŠ¾Š¼Š¼ŃƒŃ‚атора JACK. ALSA active patchbay scan Дканирование активного ŠŗŠ¾Š¼Š¼ŃƒŃ‚атора ALSA. JACK connection change. Дмена соеГинений JACK. ALSA connection change. Дмена соеГинений ALSA. A patchbay definition is currently active, which is probable to redo this connection: %1 -> %2 Do you want to remove the patchbay connection? %1 (%2%, %3 xruns) &Versioning &Версии Re&fresh Šž&Š±Š½Š¾Š²ŠøŃ‚ŃŒ D-BUS: SetParameterValue('%1', '%2'): %3. (%4) D-BUS: ResetParameterValue('%1'): %2. (%3) D-BUS: GetParameterValue('%1'): %2. (%3) Overall operation failed. Выполнение операции в целом Š½ŠµŃƒŠ“ачно. Invalid or unsupported option. ŠŠµŠŗŠ¾Ń€Ń€ŠµŠŗŃ‚Š½Ń‹Š¹ или непоГГерживаемый параметр Client name not unique. Š˜Š¼Ń клиента не уникально. Server is started. Дервер Š·Š°ŠæŃƒŃ‰ŠµŠ½. Unable to connect to server. ŠŠµ уГалось ŃŠ¾ŠµŠ“ŠøŠ½ŠøŃ‚ŃŒŃŃ с сервером. Server communication error. ŠžŃˆŠøŠ±ŠŗŠ° ŠŗŠ¾Š¼Š¼ŃƒŠ½ŠøŠŗŠ°Ń†ŠøŠø с сервером. Client does not exist. ŠšŠ»ŠøŠµŠ½Ń‚ не ŃŃƒŃ‰ŠµŃŃ‚Š²ŃƒŠµŃ‚. Unable to load internal client. ŠŠµ уГалось Š·Š°Š³Ń€ŃƒŠ·ŠøŃ‚ŃŒ Š²Š½ŃƒŃ‚Ń€ŠµŠ½Š½ŠøŠ¹ клиент. Unable to initialize client. ŠŠµ уГалось ŠøŠ½ŠøŃ†ŠøŠ°Š»ŠøŠ·ŠøŃ€Š¾Š²Š°Ń‚ŃŒ клиент. Unable to access shared memory. ŠŠµ уГалось ŠæŠ¾Š»ŃƒŃ‡ŠøŃ‚ŃŒ Š“Š¾ŃŃ‚ŃƒŠæ Šŗ Ń€Š°Š·Š“ŠµŠ»ŃŠµŠ¼Š¾Š¹ ŠæŠ°Š¼ŃŃ‚Šø. Client protocol version mismatch. ŠŠµŃŠ¾Š²ŠæŠ°Š“ŠµŠ½ŠøŠµ версии клиентского протокола Could not connect to JACK server as client. - %1 Please check the messages window for more info. ŠŠµ уГалось ŃŠ¾ŠµŠ“ŠøŠ½ŠøŃ‚ŃŒŃŃ с сервером JACK. - %1 ŠŸŃ€Š¾ŃŠ¼Š¾Ń‚Ń€ŠøŃ‚Šµ вывоГ в окне сообщений. Server configuration saved to "%1". ŠšŠ¾Š½Ń„ŠøŠ³ŃƒŃ€Š°Ń†ŠøŃ сервера сохранена в "%1". Transport rewind. ŠŸŠµŃ€ŠµŠ¼Š¾Ń‚ŠŗŠ° Šŗ Š½Š°Ń‡Š°Š»Ńƒ Transport backward. ŠŸŠµŃ€ŠµŠ¼Š¾Ń‚ŠŗŠ° назаГ Transport forward. ŠŸŠµŃ€ŠµŠ¼Š¾Ń‚ŠŗŠ° вперёГ %1 (%2%) %1 (%2%) %1 % %1% %1 Hz %1Гц %1 frames %1 выборок %1 msec %1 мс XRUN callback (%1 skipped). Mi&nimize &Š”Š²ŠµŃ€Š½ŃƒŃ‚ŃŒ Rest&ore &Š’Š¾ŃŃŃ‚Š°Š½Š¾Š²ŠøŃ‚ŃŒ &Reset Š”&Š±Ń€Š¾ŃŠøŃ‚ŃŒ &Presets &ŠŸŃ€Š¾Ń„ŠøŠ»Šø S&ession Š”&еансы &Load... &Š—Š°Š³Ń€ŃƒŠ·ŠøŃ‚ŃŒ... &Save... &Š”Š¾Ń…Ń€Š°Š½ŠøŃ‚ŃŒ Save and &Quit... Š”Š¾Ń…Ń€Š°Š½ŠøŃ‚ŃŒ Šø вы&йти Save &Template... Š”Š¾Ń…Ń€Š°Š½ŠøŃ‚ŃŒ &шаблон &Transport &Транспорт &Rewind К &Š½Š°Ń‡Š°Š»Ńƒ QjackCtl QjackCtl Set&up... &ŠŸŠ°Ń€Š°Š¼ŠµŃ‚Ń€Ń‹ &Patchbay &ŠšŠ¾Š¼Š¼ŃƒŃ‚Š°Ń‚Š¾Ń€ &Connect &Š”Š¾ŠµŠ“ŠøŠ½ŠµŠ½ŠøŃ DSP Load Š—Š°Š³Ń€ŃƒŠ·ŠŗŠ° DSP XRUN Count (notifications) Число XRUN (увеГомлений) Show/hide the session management window Show/hide the messages log/status window Backward transport ŠŸŠµŃ€ŠµŠ¼Š¾Ń‚Š°Ń‚ŃŒ назаГ &Backward Š&азаГ Forward transport ŠŸŠµŃ€ŠµŠ¼Š¾Ń‚Š°Ń‚ŃŒ вперёГ &Forward &ВперёГ Rewind transport ŠŸŠµŃ€ŠµŠ¼Š¾Ń‚Š°Ń‚ŃŒ Šŗ Š½Š°Ń‡Š°Š»Ńƒ qjackctlMessagesStatusForm Messages / Status - JACK Audio Connection Kit Š”Š¾Š¾Š±Ń‰ŠµŠ½ŠøŃ Šø ŃŃ‚Š°Ń‚ŃƒŃ &Messages Š”&Š¾Š¾Š±Ń‰ŠµŠ½ŠøŃ Messages log Š–ŃƒŃ€Š½Š°Š» сообщений Messages output log Š–ŃƒŃ€Š½Š°Š» вывеГенных сообщений &Status Š”&Ń‚Š°Ń‚ŃƒŃ Status information Š˜Š½Ń„Š¾Ń€Š¼Š°Ń†ŠøŃ о ŃŃ‚Š°Ń‚ŃƒŃŠµ Statistics since last server startup Дтатистика с послеГнего запуска сервера Description ŠžŠæŠøŃŠ°Š½ŠøŠµ Value Значение Reset XRUN statistic values ŠžŠ±Š½ŃƒŠ»ŠøŃ‚ŃŒ ŃŃ‚Š°Ń‚ŠøŃŃ‚ŠøŠŗŃƒ по рассинхронизации Re&set Š”&Š±Ń€Š¾ŃŠøŃ‚ŃŒ Refresh XRUN statistic values ŠžŠ±Š½Š¾Š²ŠøŃ‚ŃŒ ŃŃ‚Š°Ń‚ŠøŃŃ‚ŠøŠŗŃƒ по рассинхронизации &Refresh &ŠžŠ±Š½Š¾Š²ŠøŃ‚ŃŒ Server name Š˜Š¼Ń сервера Server state Š”Ń‚Š°Ń‚ŃƒŃ сервера DSP Load Š—Š°Š³Ń€ŃƒŠ·ŠŗŠ° DSP Sample Rate Частота ŃŃŠ¼ŠæŠ»ŠøŃ€Š¾Š²Š°Š½ŠøŃ Buffer Size Размер Š±ŃƒŃ„ŠµŃ€Š° Realtime Mode Режим Ń€ŠµŠ°Š»ŃŒŠ½Š¾Š³Š¾ времени Transport state Š”Š¾ŃŃ‚Š¾ŃŠ½ŠøŠµ транспорта Transport Timecode Тайм-коГ транспорта Transport BBT BBT транспорта Transport BPM BPM транспорта XRUN count since last server startup Рассинхронизаций с послеГнего запуска сервера XRUN last time detected ŠŸŠ¾ŃŠ»ŠµŠ“Š½ŃŃ Š¾Š±Š½Š°Ń€ŃƒŠ¶ŠµŠ½Š½Š°Ń Ń€Š°ŃŃŠøŠ½Ń…Ń€Š¾Š½ŠøŠ·Š°Ń†ŠøŃ XRUN last ŠŸŠ¾ŃŠ»ŠµŠ“Š½ŃŃ Ń€Š°ŃŃŠøŠ½Ń…Ń€Š¾Š½ŠøŠ·Š°Ń†ŠøŃ XRUN maximum ŠœŠ°ŠŗŃŠøŠ¼Š°Š»ŃŒŠ½Š°Ń Ń€Š°ŃŃŠøŠ½Ń…Ń€Š¾Š½ŠøŠ·Š°Ń†ŠøŃ XRUN minimum ŠœŠøŠ½ŠøŠ¼Š°Š»ŃŒŠ½Š°Ń Ń€Š°ŃŃŠøŠ½Ń…Ń€Š¾Š½ŠøŠ·Š°Ń†ŠøŃ XRUN average Š”Ń€ŠµŠ“Š½ŃŃ Š“Š»ŠøŃ‚ŠµŠ»ŃŒŠ½Š¾ŃŃ‚ŃŒ рассинхронизаций XRUN total Всего рассинхронизаций Maximum scheduling delay ŠœŠ°ŠŗŃŠøŠ¼Š°Š»ŃŒŠ½Š°Ń заГержка Ń€Š°ŃŠæŠøŃŠ°Š½ŠøŃ Time of last reset Š’Ń€ŠµŠ¼Ń послеГнего сброса Logging stopped --- %1 --- Š–ŃƒŃ€Š½Š°Š»ŠøŃ€Š¾Š²Š°Š½ŠøŠµ остановлено --- %1 --- Logging started --- %1 --- Š–ŃƒŃ€Š½Š°Š»ŠøŃ€Š¾Š²Š°Š½ŠøŠµ Š·Š°ŠæŃƒŃ‰ŠµŠ½Š¾ --- %1 --- qjackctlPatchbay Warning ŠŸŃ€ŠµŠ“ŃƒŠæŃ€ŠµŠ¶Š“ŠµŠ½ŠøŠµ This will disconnect all sockets. Are you sure? Все сокеты Š±ŃƒŠ“ŃƒŃ‚ рассоеГинены. ŠŸŃ€Š¾Š“Š¾Š»Š¶ŠøŃ‚ŃŒ? qjackctlPatchbayForm Patchbay - JACK Audio Connection Kit ŠšŠ¾Š¼Š¼ŃƒŃ‚Š°Ń‚Š¾Ń€ &New &Š”Š¾Š·Š“Š°Ń‚ŃŒ Create a new patchbay profile Š”Š¾Š·Š“Š°Ń‚ŃŒ новый ŠæŃ€Š¾Ń„ŠøŠ»ŃŒ ŠŗŠ¾Š¼Š¼ŃƒŃ‚Š°Ń‚Š¾Ń€Š° &Load... &Š—Š°Š³Ń€ŃƒŠ·ŠøŃ‚ŃŒ... Load patchbay profile Š—Š°Š³Ń€ŃƒŠ·ŠøŃ‚ŃŒ ŠæŃ€Š¾Ń„ŠøŠ»ŃŒ ŠŗŠ¾Š¼Š¼ŃƒŃ‚Š°Ń‚Š¾Ń€Š° &Save... &Š”Š¾Ń…Ń€Š°Š½ŠøŃ‚ŃŒ... Save current patchbay profile Š”Š¾Ń…Ń€Š°Š½ŠøŃ‚ŃŒ Ń‚ŠµŠŗŃƒŃ‰ŠøŠ¹ ŠæŃ€Š¾Ń„ŠøŠ»ŃŒ ŠŗŠ¾Š¼Š¼ŃƒŃ‚Š°Ń‚Š¾Ń€Š° Acti&vate &ŠŠŗŃ‚ŠøŠ²ŠøŃ€Š¾Š²Š°Ń‚ŃŒ &Connect &Š”Š¾ŠµŠ“ŠøŠ½ŠøŃ‚ŃŒ Connect currently selected sockets Š”Š¾ŠµŠ“ŠøŠ½ŠøŃ‚ŃŒ выбранные сейчас сокеты &Disconnect &Š Š°ŃŃŠ¾ŠµŠ“ŠøŠ½ŠøŃ‚ŃŒ Disconnect currently selected sockets Š Š°ŃŃŠ¾ŠµŠ“ŠøŠ½ŠøŃ‚ŃŒ выбранные сейчас сокеты Disconnect &All Š Š°ŃŃŠ¾ŠµŠ“ŠøŠ½ŠøŃ‚ŃŒ &все Disconnect all currently connected sockets Š Š°ŃŃŠ¾ŠµŠ“ŠøŠ½ŠøŃ‚ŃŒ все соеГинённые сейчас сокеты &Refresh &ŠžŠ±Š½Š¾Š²ŠøŃ‚ŃŒ Refresh current patchbay view ŠžŠ±Š½Š¾Š²ŠøŃ‚ŃŒ Ń‚ŠµŠŗŃƒŃ‰ŠøŠ¹ виГ ŠŗŠ¾Š¼Š¼ŃƒŃ‚Š°Ń‚Š¾Ń€Š° Down Вниз Move currently selected output socket down one position ŠŸŠµŃ€ŠµŠ¼ŠµŃŃ‚ŠøŃ‚ŃŒ выбранный сейчас сокет вниз на оГну ŠæŠ¾Š·ŠøŃ†ŠøŃŽ Add... Š”Š¾Š±Š°Š²ŠøŃ‚ŃŒ... Create a new output socket Š”Š¾Š·Š“Š°Ń‚ŃŒ новый сокет выхоГа Edit... Š˜Š·Š¼ŠµŠ½ŠøŃ‚ŃŒ... Edit currently selected input socket properties Š˜Š·Š¼ŠµŠ½ŠøŃ‚ŃŒ свойства выбранного сейчас сокета вхоГа Up Вверх Move currently selected output socket up one position ŠŸŠµŃ€ŠµŠ¼ŠµŃŃ‚ŠøŃ‚ŃŒ выбранный сейчас сокет вверх на оГну ŠæŠ¾Š·ŠøŃ†ŠøŃŽ Remove Š£Š“Š°Š»ŠøŃ‚ŃŒ Remove currently selected output socket Š£Š“Š°Š»ŠøŃ‚ŃŒ выбранный сейчас сокет выхоГа Remove currently selected input socket Š£Š“Š°Š»ŠøŃ‚ŃŒ выбранный сейчас сокет вхоГа Create a new input socket Š”Š¾Š·Š“Š°Ń‚ŃŒ новый сокет вхоГа Edit currently selected output socket properties Š˜Š·Š¼ŠµŠ½ŠøŃ‚ŃŒ свойства выбранного сейчас сокета выхоГа Warning ŠŸŃ€ŠµŠ“ŃƒŠæŃ€ŠµŠ¶Š“ŠµŠ½ŠøŠµ active активно New Patchbay definition ŠŠ¾Š²Š¾Šµ описание ŠŗŠ¾Š¼Š¼ŃƒŃ‚атора Patchbay Definition files Файл Š¾ŠæŠøŃŠ°Š½ŠøŃ ŠŗŠ¾Š¼Š¼ŃƒŃ‚Š°Ń‚Š¾Ń€Š° Load Patchbay Definition Š—Š°Š³Ń€ŃƒŠ·ŠøŃ‚ŃŒ описание ŠŗŠ¾Š¼Š¼ŃƒŃ‚атора Save Patchbay Definition Š”Š¾Ń…Ń€Š°Š½ŠøŃ‚ŃŒ описание ŠŗŠ¾Š¼Š¼ŃƒŃ‚атора The patchbay definition has been changed: "%1" Do you want to save the changes? ŠžŠæŠøŃŠ°Š½ŠøŠµ ŠŗŠ¾Š¼Š¼ŃƒŃ‚Š°Ń‚Š¾Ń€Š° изменилось: "%1" Š’Ń‹ хотите ŃŠ¾Ń…Ń€Š°Š½ŠøŃ‚ŃŒ ŠøŠ·Š¼ŠµŠ½ŠµŠ½ŠøŃ? %1 [modified] Untitled%1 Без имени %1 Error ŠžŃˆŠøŠ±ŠŗŠ° Could not load patchbay definition file: "%1" ŠŠµ уГалось Š·Š°Š³Ń€ŃƒŠ·ŠøŃ‚ŃŒ файл Š¾ŠæŠøŃŠ°Š½ŠøŃ ŠŗŠ¾Š¼Š¼ŃƒŃ‚Š°Ń‚Š¾Ń€Š°: "%1" Could not save patchbay definition file: "%1" ŠŠµ уГалось ŃŠ¾Ń…Ń€Š°Š½ŠøŃ‚ŃŒ файл Š¾ŠæŠøŃŠ°Š½ŠøŃ ŠŗŠ¾Š¼Š¼ŃƒŃ‚Š°Ń‚Š¾Ń€Š°: "%1" Create patchbay definition as a snapshot of all actual client connections? Š”Š¾Š·Š“Š°Ń‚ŃŒ описание ŠŗŠ¾Š¼Š¼ŃƒŃ‚атора как снимок активных соеГинений клиентов? Duplicate (copy) currently selected output socket Copy... Š”ŠŗŠ¾ŠæŠøŃ€Š¾Š²Š°Ń‚ŃŒ... Duplicate (copy) currently selected input socket Expand all items Š Š°ŃŠŗŃ€Ń‹Ń‚ŃŒ все ŃŠ»ŠµŠ¼ŠµŠ½Ń‚Ń‹ E&xpand All &Š Š°ŃŠŗŃ€Ń‹Ń‚ŃŒ все Current (recent) patchbay profile(s) Toggle activation of current patchbay profile ŠŸŠµŃ€ŠµŠŗŠ»ŃŽŃ‡ŠøŃ‚ŃŒ Š°ŠŗŃ‚ŠøŠ²Š½Š¾ŃŃ‚ŃŒ Ń‚ŠµŠŗŃƒŃ‰ŠµŠ³Š¾ ŠæŃ€Š¾Ń„ŠøŠ»Ń ŠŗŠ¾Š¼Š¼ŃƒŃ‚Š°Ń‚Š¾Ń€Š° qjackctlPatchbayView Add... Š”Š¾Š±Š°Š²ŠøŃ‚ŃŒ... Edit... Š˜Š·Š¼ŠµŠ½ŠøŃ‚ŃŒ... Remove Š£Š“Š°Š»ŠøŃ‚ŃŒ Move Up Š’Ń‹ŃˆŠµ Move Down ŠŠøŠ¶Šµ &Connect &Š”Š¾ŠµŠ“ŠøŠ½ŠøŃ‚ŃŒ Alt+C Connect Alt+C &Disconnect &Š Š°ŃŃŠ¾ŠµŠ“ŠøŠ½ŠøŃ‚ŃŒ Alt+D Disconnect Alt+D Disconnect &All Š Š°ŃŃŠ¾ŠµŠ“ŠøŠ½ŠøŃ‚ŃŒ &все Alt+A Disconect All Alt+A &Refresh &ŠžŠ±Š½Š¾Š²ŠøŃ‚ŃŒ Alt+R Refresh Alt+R Exclusive Copy... Š”ŠŗŠ¾ŠæŠøŃ€Š¾Š²Š°Ń‚ŃŒ... Forward (None) (ŠŠµŃ‚) qjackctlSessionForm Session - JACK Audio Connection Kit Деансы Load session Š—Š°Š³Ń€ŃƒŠ·ŠøŃ‚ŃŒ сеанс &Load... &Š—Š°Š³Ń€ŃƒŠ·ŠøŃ‚ŃŒ Recent session ŠŠµŠ“Š°Š²Š½ŠøŠµ сеансы &Recent &ŠŠµŠ“Š°Š²Š½ŠøŠµ Save session Š”Š¾Ń…Ń€Š°Š½ŠøŃ‚ŃŒ сеанс Save session versioning Š”Š¾Ń…Ń€Š°Š½ŃŃ‚ŃŒ версии сеансов &Versioning &Версии Re&fresh Šž&Š±Š½Š¾Š²ŠøŃ‚ŃŒ Session clients / connections ŠšŠ»ŠøŠµŠ½Ń‚Ń‹ Šø ŃŠ¾ŠµŠ“ŠøŠ½ŠµŠ½ŠøŃ сеанса Infra-clients / commands Š˜Š½Ń„Ń€Š°-клиенты Šø команГы Infra-client Š˜Š½Ń„Ń€Š°-клиент Infra-command Š˜Š½Ń„Ń€Š°-команГа Add infra-client Š”Š¾Š±Š°Š²ŠøŃ‚ŃŒ инфра-клиент &Add &Š”Š¾Š±Š°Š²ŠøŃ‚ŃŒ Edit infra-client Š˜Š·Š¼ŠµŠ½ŠøŃ‚ŃŒ инфра-клиент &Edit &Š˜Š·Š¼ŠµŠ½ŠøŃ‚ŃŒ Remove infra-client Š£Š“Š°Š»ŠøŃ‚ŃŒ инфра-клиент Re&move &Š£Š“Š°Š»ŠøŃ‚ŃŒ &Save... &Š”Š¾Ń…Ń€Š°Š½ŠøŃ‚ŃŒ Update session ŠžŠ±Š½Š¾Š²ŠøŃ‚ŃŒ сеанс Client / Ports ŠšŠ»ŠøŠµŠ½Ń‚Ń‹ / ŠŸŠ¾Ń€Ń‚Ń‹ UUID UUID Command КоманГа &Save &Š”Š¾Ń…Ń€Š°Š½ŠøŃ‚ŃŒ Load Session Š—Š°Š³Ń€ŃƒŠ·ŠøŃ‚ŃŒ сеанс Session directory ŠšŠ°Ń‚Š°Š»Š¾Š³ с сеансами Save Session Š”Š¾Ń…Ń€Š°Š½ŠøŃ‚ŃŒ сеанс and Quit Šø выйти Template Шаблон &Clear Šž&Ń‡ŠøŃŃ‚ŠøŃ‚ŃŒ Warning ŠŸŃ€ŠµŠ“ŃƒŠæŃ€ŠµŠ¶Š“ŠµŠ½ŠøŠµ A session could not be found in this folder: "%1" ŠŠµ уГалось найти сеанс в каталоге Ā«%1Ā» %1: loading session... %1: Š·Š°Š³Ń€ŃƒŠ¶Š°ŠµŃ‚ŃŃ сеанс... %1: load session %2. %1: Š·Š°Š³Ń€ŃƒŠ·ŠøŃ‚ŃŒ сеанс %2. A session already exists in this folder: "%1" Are you sure to overwrite the existing session? Š’ ŃŃ‚Š¾Š¹ папке уже ŠµŃŃ‚ŃŒ сеанс: "%1" Š’Ń‹ ŃƒŠ²ŠµŃ€ŠµŠ½Ń‹, что хотите ŠæŠµŃ€ŠµŠ·Š°ŠæŠøŃŠ°Ń‚ŃŒ его? This folder already exists and is not empty: "%1" Are you sure to overwrite the existing folder? Эта папка уже ŃŃƒŃ‰ŠµŃŃ‚Š²ŃƒŠµŃ‚ Šø не ŠæŃƒŃŃ‚а: "%1" Š’Ń‹ ŃƒŠ²ŠµŃ€ŠµŠ½Ń‹, что хотите ŠæŠµŃ€ŠµŠ·Š°ŠæŠøŃŠ°Ń‚ŃŒ ŃŃƒŃ‰ŠµŃŃ‚Š²ŃƒŃŽŃ‰ŃƒŃŽ папку? %1: saving session... %1: ŃŠ¾Ń…Ń€Š°Š½ŃŠµŃ‚ŃŃ сеанс... %1: save session %2. %1: ŃŠ¾Ń…Ń€Š°Š½ŠøŃ‚ŃŒ сеанс %2. New Client ŠŠ¾Š²Ń‹Š¹ клиент Save and &Quit... Š”Š¾Ń…Ń€Š°Š½ŠøŃ‚ŃŒ Šø вы&йти Save &Template... Š”Š¾Ń…Ń€Š°Š½ŠøŃ‚ŃŒ &шаблон qjackctlSessionInfraClientItemEditor Infra-command инфра-команГа qjackctlSetupForm Setup - JACK Audio Connection Kit ŠŸŠ°Ń€Š°Š¼ŠµŃ‚Ń€Ń‹ Settings ŠžŠ±Ń‰ŠøŠµ jackstart jackstart jackd jackd dummy dummy alsa alsa portaudio portaudio Parameters ŠžŃŠ½Š¾Š²Š½Ń‹Šµ 22050 22050 32000 32000 44100 44100 48000 48000 88200 88200 96000 96000 Sample rate in frames per second Частота Гискретизации выборок в секунГу) 6 6 7 7 8 8 9 9 10 10 Scheduler priority when running realtime ŠŸŃ€ŠøŠ¾Ń€ŠøŃ‚ŠµŃ‚ планировщика в режиме Ń€ŠµŠ°Š»ŃŒŠ½Š¾Š³Š¾ времени 21333 21333 16 16 32 32 Priorit&y: П&риоритет: &Wait (usec): Šž&жиГание (мс): &Frames/Period: &Выборок в Š±ŃƒŃ„ере: 64 64 128 128 256 256 512 512 1024 1024 2048 2048 4096 4096 Frames per period between process() calls Выборок в периоГ межГу вызовами process() Sample &Rate: &Частота Гискр.: H/&W Meter Аппаратный &счётчик None ŠŠµŃ‚ Rectangular ŠŸŃ€ŃŠ¼Š¾ŃƒŠ³Š¾Š»ŃŒŠ½Š¾Šµ Shaped По Š¾Ń‡ŠµŃ€Ń‚Š°Š½ŠøŃŠ¼ Triangular Š¢Ń€ŠµŃƒŠ³Š¾Š»ŃŒŠ½Š¾Šµ Duplex Š”ŃƒŠæŠ»ŠµŠŗŃ Provide either audio capture, playback or both Š Š°Š·Ń€ŠµŃˆŠøŃ‚ŃŒ захват звука, его воспроизвеГение или всё ŃŃ€Š°Š·Ńƒ hw:0 hw:0 &Timeout (msec): &Тайм-Š°ŃƒŃ‚ (мс): Dit&her: ПоГмешивание &шума: 200 200 500 500 1000 1000 2000 2000 5000 5000 10000 10000 Set client timeout limit in miliseconds Š£ŃŃ‚Š°Š½Š¾Š²ŠøŃ‚ŃŒ тайм-Š°ŃƒŃ‚ Š“Š»Ń клиента в Š¼ŠøŠ»Š»ŠøŃŠµŠŗŃƒŠ½Š“ах &Interface: &Š˜Š½Ń‚ŠµŃ€Ń„ŠµŠ¹Ń: So&ft Mode &ŠŸŃ€Š¾Š³Ń€Š°Š¼Š¼Š½Ń‹Š¹ режим &Monitor &ŠšŠ¾Š½Ń‚Ń€Š¾Š»ŃŒ Provide output monitor ports Š—Š°Š“ŠµŠ¹ŃŃ‚Š²Š¾Š²Š°Ń‚ŃŒ порты ŠŗŠ¾Š½Ń‚Ń€Š¾Š»Ń выхоГа &Realtime Режим &реал. времени Use realtime scheduling Š˜ŃŠæŠ¾Š»ŃŒŠ·Š¾Š²Š°Ń‚ŃŒ планирование в реал. времени (default) (как обычно) Whether to give verbose output on messages ŠŸŠ¾Š“Ń€Š¾Š±Š½Š¾ ли Š²Ń‹Š²Š¾Š“ŠøŃ‚ŃŒ ŃŠ¾Š¾Š±Ń‰ŠµŠ½ŠøŃ Latency: ЗаГержка: Output latency in milliseconds, calculated based on the period, rate and buffer settings ЗаГержка выхоГа в мс, расчитанных на основе настроек периоГа, частоты Šø Š±ŃƒŃ„ŠµŃ€Š° Options Дценарии Šø Š¶ŃƒŃ€Š½Š°Š» Scripting Дценарии Execute script on Start&up: Š’Ń‹ŠæŠ¾Š»Š½ŃŃ‚ŃŒ сценарий при &запуске: Whether to execute a custom shell script before starting up the JACK audio server. Š’Ń‹ŠæŠ¾Š»Š½ŃŃ‚ŃŒ ли собственный сценарий переГ запуском сервера JACK. Execute script after &Startup: Š’Ń‹ŠæŠ¾Š»Š½ŃŃ‚ŃŒ сценарий после Š·&апуска: Whether to execute a custom shell script after starting up the JACK audio server. Š’Ń‹ŠæŠ¾Š»Š½ŃŃ‚ŃŒ ли собственный сценарий после запуска сервера JACK. Whether to execute a custom shell script after shuting down the JACK audio server. Š’Ń‹ŠæŠ¾Š»Š½ŃŃ‚ŃŒ ли собственный сценарий после остановки сервера JACK. Command line to be executed before starting up the JACK audio server КоманГа, Š²Ń‹ŠæŠ¾Š»Š½ŃŠµŠ¼Š°Ń переГ запуском сервера JACK ... ... Browse for script to be executed before starting up the JACK audio server Š£ŠŗŠ°Š·Š°Ń‚ŃŒ сценарий, Š²Ń‹ŠæŠ¾Š»Š½ŃŠµŠ¼Ń‹Š¹ переГ запуском сервера JACK Command line to be executed after starting up the JACK audio server КоманГа, Š²Ń‹ŠæŠ¾Š»Š½ŃŠµŠ¼Š°Ń после запуска сервера JACK Browse for script to be executed after starting up the JACK audio server Š£ŠŗŠ°Š·Š°Ń‚ŃŒ сценарий, Š²Ń‹ŠæŠ¾Š»Š½ŃŠµŠ¼Ń‹Š¹ после запуска сервера JACK Browse for script to be executed after shutting down the JACK audio server Š£ŠŗŠ°Š·Š°Ń‚ŃŒ сценарий, Š²Ń‹ŠæŠ¾Š»Š½ŃŠµŠ¼Ń‹Š¹ после остановки сервера JACK Command line to be executed after shutting down the JACK audio server КоманГа, Š²Ń‹ŠæŠ¾Š»Š½ŃŠµŠ¼Š°Ń после остановки сервера JACK Statistics Дтатистика &XRUN detection regex: &Š ŠµŠ³ŃƒŠ»ŃŃ€Š½Š¾Šµ выражение Š“Š»Ń Š¾ŠæŃ€ŠµŠ“ŠµŠ»ŠµŠ½ŠøŃ XRUN: xrun of at least ([0-9|\.]+) msecs xrun of at least ([0-9|\.]+) msecs Regular expression used to detect XRUNs on server output messages Š ŠµŠ³ŃƒŠ»ŃŃ€Š½Š¾Šµ выражение Š“Š»Ń Š¾ŠæŃ€ŠµŠ“ŠµŠ»ŠµŠ½ŠøŃ рассинхронизаций среГи сообщений от сервера Connections Š”Š¾ŠµŠ“ŠøŠ½ŠµŠ½ŠøŃ Patchbay definition file to be activated as connection persistence profile Файл Š¾ŠæŠøŃŠ°Š½ŠøŃ ŠŗŠ¾Š¼Š¼ŃƒŃ‚Š°Ń‚Š¾Ń€Š°, Š°ŠŗŃ‚ŠøŠ²ŠøŃ€ŃƒŠµŠ¼Ń‹Š¹ как ŠæŃ€Š¾Ń„ŠøŠ»ŃŒ ŠæŠ¾ŃŃ‚Š¾ŃŠ½Š½Š¾Š³Š¾ ŃŠ¾ŠµŠ“ŠøŠ½ŠµŠ½ŠøŃ Browse for a patchbay definition file to be activated Š£ŠŗŠ°Š·Š°Ń‚ŃŒ Š°ŠŗŃ‚ŠøŠ²ŠøŃ€ŃƒŠµŠ¼Ń‹Š¹ файл Š¾ŠæŠøŃŠ°Š½ŠøŃ ŠŗŠ¾Š¼Š¼ŃƒŃ‚Š°Ń‚Š¾Ń€Š° Activate &Patchbay persistence: ŠŠŗŃ‚ŠøŠ²ŠøŃ€Š¾Š²Š°Ń‚ŃŒ &ŠæŠ¾ŃŃ‚Š¾ŃŠ½Š½Ń‹Š¹ ŠŗŠ¾Š¼Š¼ŃƒŃ‚Š°Ń‚Š¾Ń€: Whether to activate a patchbay definition for connection persistence profile. ŠŠŗŃ‚ŠøŠ²ŠøŃ€Š¾Š²Š°Ń‚ŃŒ ли описание ŠŗŠ¾Š¼Š¼ŃƒŃ‚атора Š“Š»Ń ŠæŃ€Š¾Ń„ŠøŠ»Ń ŠæŠ¾ŃŃ‚Š¾ŃŠ½Š½Š¾Š³Š¾ ŃŠ¾ŠµŠ“ŠøŠ½ŠµŠ½ŠøŃ. Display Š˜Š½Ń‚ŠµŃ€Ń„ŠµŠ¹Ń Transport &BBT (bar:beat.ticks) &BBT транспорта (такт:Š“Š¾Š»Ń.тики) Elapsed time since last &Reset Š’Ń€ŠµŠ¼Ń, ŠæŃ€Š¾ŃˆŠµŠ“ŃˆŠµŠµ с послеГнего &сброса Elapsed time since last &XRUN Š’Ń€ŠµŠ¼Ń, пошеГшее с послеГней &рассинхронизации Messages Window ŠžŠŗŠ½Š¾ сообщений Sample messages text font display Каким Š±ŃƒŠ“ет ŃˆŃ€ŠøŃ„Ń‚ Š“Š»Ń вывоГа сообщений сервера &Font... &Шрифт... Select font for the messages text display Выберите ŃˆŃ€ŠøŃ„Ń‚ Š“Š»Ń Š¾Ń‚Š¾Š±Ń€Š°Š¶ŠµŠ½ŠøŃ сообщений сервера msec мс n/a н/Š“ Patchbay Definition files Файлы Š¾ŠæŠøŃŠ°Š½ŠøŃ ŠŗŠ¾Š¼Š¼ŃƒŃ‚Š°Ń‚Š¾Ń€Š° Driv&er: &Драйвер: Preset &Name: Š˜Š¼Ń &ŠæŃ€Š¾Ń„ŠøŠ»Ń: Settings preset name Š˜Š¼Ń ŠæŃ€Š¾Ń„ŠøŠ»Ń параметров &Save &Š”Š¾Ń…Ń€Š°Š½ŠøŃ‚ŃŒ Save settings as current preset name Š”Š¾Ń…Ń€Š°Š½ŠøŃ‚ŃŒ параметры в Ń‚ŠµŠŗŃƒŃ‰ŠøŠ¹ ŠæŃ€Š¾Ń„ŠøŠ»ŃŒ &Delete &Š£Š“Š°Š»ŠøŃ‚ŃŒ Delete current settings preset Š£Š“Š°Š»ŠøŃ‚ŃŒ Ń‚ŠµŠŗŃƒŃ‰ŠøŠ¹ ŠæŃ€Š¾Ń„ŠøŠ»ŃŒ &Audio: &Š—Š²ŃƒŠŗ: H/W M&onitor Аппаратный &ŠŗŠ¾Š½Ń‚Ń€Š¾Š»ŃŒ Force &16bit ŠŸŃ€ŠøŠ½ŃƒŠ“ŠøŃ‚ŠµŠ»ŃŒŠ½Š¾ &16 бит Force 16bit mode instead of failing over 32bit (default) ŠŸŃ€ŠøŠ½ŃƒŠ“ŠøŃ‚ŠµŠ»ŃŒŠ½Š¾ ŠøŃŠæŠ¾Š»ŃŒŠ·Š¾Š²Š°Ń‚ŃŒ 16бит-режим вместо 32бит (по ŃƒŠ¼Š¾Š»Ń‡Š°Š½ŠøŃŽ) Periods/&Buffer: ŠŸŠµŃ€ŠøŠ¾Š“Š¾Š² на &Š±ŃƒŃ„ŠµŃ€: Time in seconds that client is delayed after server startup Дколько секунГ клиент жГёт после запуска сервера > > Scripting argument meta-symbols ŠœŠµŃ‚Š°ŃŠøŠ¼Š²Š¾Š»Ń‹ Š°Ń€Š³ŃƒŠ¼ŠµŠ½Ń‚Š¾Š² в ŃŃ†ŠµŠ½Š°Ń€ŠøŃŃ… &Capture standard output &Š—Š°Ń…Š²Š°Ń‚Ń‹Š²Š°Ń‚ŃŒ станГартный вывоГ Whether to capture standard output (stdout/stderr) into messages window Š—Š°Ń…Š²Š°Ń‚Ń‹Š²Š°Ń‚ŃŒ ли станГартный вывоГ (stdout/stderr) hh:mm:ss чч:мм:сс Other Š”Ń€ŃƒŠ³Š¾Šµ &Confirm application close За&ŠæŃ€Š°ŃˆŠøŠ²Š°Ń‚ŃŒ поГтвержГение на выхоГ Whether to ask for confirmation on application exit Š”ŠæŃ€Š°ŃˆŠøŠ²Š°Ń‚ŃŒ ли поГтвержГение на выхоГ ŠøŠ· программы &Preset Name Š˜Š¼Ń &ŠæŃ€Š¾Ń„ŠøŠ»Ń &Server Path За&пуск сервера &Driver &Драйвер &Interface &Š˜Š½Ń‚ŠµŃ€Ń„ŠµŠ¹Ń Sample &Rate &Частота Гискр. &Frames/Period &Фреймов/периоГ Periods/&Buffer ŠŸŠµŃ€ŠøŠ¾Š“Š¾Š²/&Š±ŃƒŃ„ŠµŃ€ oss oss Port Ma&ximum: &Макс. портов: Maximum number of ports the JACK server can manage Максимальное кол-во портов, обрабатываемых сервером JACK &Input Device: Устройство &вхоГа: &Output Device: Устройство в&ыхоГа: /dev/dsp /dev/dsp No Memory Loc&k Š‘&ез блокировки ŠæŠ°Š¼ŃŃ‚Šø Do not attempt to lock memory, even if in realtime mode ŠŠµ ŠæŃ‹Ń‚Š°Š¹Ń‚ŠµŃŃŒ Š·Š°Š±Š»Š¾ŠŗŠøŃ€Š¾Š²Š°Ń‚ŃŒ ŠæŠ°Š¼ŃŃ‚ŃŒ, Гаже в режиме Ń€ŠµŠ°Š»ŃŒŠ½Š¾Š³Š¾ времени &Ignore H/W &Š˜Š³Š½Š¾Ń€ŠøŃ€Š¾Š²Š°Ń‚ŃŒ апп. Š±ŃƒŃ„ŠµŃ€ Šø периоГ &Word Length: Ра&Š·Ń€ŃŠ“Š½Š¾ŃŃ‚ŃŒ слова: Time Display ŠžŃ‚Š¾Š±Ń€Š°Š¶ŠµŠ½ŠøŠµ времени Transport &Time Code &Тайм-коГ транспорта Sample front panel normal display font ŠŸŃ€ŠøŠ¼ŠµŃ€ текста в малом счётчике Sample big time display font ŠŸŃ€ŠøŠ¼ŠµŃ€ текста в большом счётчике Normal display: ŠœŠ°Š»Ń‹Š¹ счётчик: Big Time display: Š‘Š¾Š»ŃŒŃˆŠ¾Š¹ счётчик: Time F&ormat: &Формат времени: hh:mm:ss.d чч:мм:сс.Š“ hh:mm:ss.dd чч:мм:сс.ГГ hh:mm:ss.ddd чч:мм:сс.ГГГ The general time format on display ŠžŠ±Ń‰ŠøŠ¹ формат вывоГа времени на Гисплей &Messages limit: ŠŸŃ€ŠµŠ“ŠµŠ» кол-ва &сообщений: Whether to keep a maximum number of lines in the messages window ŠžŠ³Ń€Š°Š½ŠøŃ‡ŠøŠ²Š°Ń‚ŃŒ ли количество строк в окне сообщений 100 100 250 250 2500 2500 The maximum number of message lines to keep in view Максимальное количество строк сообщений, Š“Š¾ŃŃ‚ŃƒŠæŠ½Š¾Šµ при просмотре &Start JACK audio server on application startup &Š—Š°ŠæŃƒŃŠŗŠ°Ń‚ŃŒ звуковой сервер JACK при старте программы Whether to start JACK audio server immediately on application startup Š—Š°ŠæŃƒŃŠŗŠ°Ń‚ŃŒ ли сервер JACK при старте QJackCtl &Keep child windows always on top Šž&кна программы всегГа Š½Š°Š²ŠµŃ€Ń…Ńƒ Whether to keep all child windows on top of the main window &Enable system tray icon &Š’ŠŗŠ»ŃŽŃ‡ŠøŃ‚ŃŒ Š¾Š±Š»Š°ŃŃ‚ŃŒ ŃƒŠ²ŠµŠ“Š¾Š¼Š»ŠµŠ½ŠøŃ Whether to enable the system tray icon Š’ŠŗŠ»ŃŽŃ‡Š°Ń‚ŃŒ ли Š¾Š±Š»Š°ŃŃ‚ŃŒ ŃƒŠ²ŠµŠ“Š¾Š¼Š»ŠµŠ½ŠøŃ (системный лоток, system tray) S&ave JACK audio server configuration to: До&Ń…Ń€Š°Š½ŃŃ‚ŃŒ ŠŗŠ¾Š½Ń„ŠøŠ³ŃƒŃ€Š°Ń†ŠøŃŽ JACK в файл: Whether to save the JACK server command-line configuration into a local file (auto-start) .jackdrc .jackdrc The server configuration local file name (auto-start) C&onfigure as temporary server &ŠŠ°ŃŃ‚Ń€Š¾ŠøŃ‚ŃŒ как временный сервер Whether to exit once all clients have closed (auto-start) Š—Š°Š²ŠµŃ€ŃˆŠ°Ń‚ŃŒ ли Ń€Š°Š±Š¾Ń‚Ńƒ при отсоеГинении все клиентов Warning ŠŸŃ€ŠµŠ“ŃƒŠæŃ€ŠµŠ¶Š“ŠµŠ½ŠøŠµ Some settings have been changed: "%1" Do you want to save the changes? ŠŠµŠŗŠ¾Ń‚Š¾Ń€Ń‹Šµ параметры изменились: "%1" Š’Ń‹ хотите ŃŠ¾Ń…Ń€Š°Š½ŠøŃ‚ŃŒ ŠøŠ·Š¼ŠµŠ½ŠµŠ½ŠøŃ? Delete preset: "%1" Are you sure? Š£Š“Š°Š»ŠøŃ‚ŃŒ ŠæŃ€Š¾Ń„ŠøŠ»ŃŒ: "%1" Š’Ń‹ ŃƒŠ²ŠµŃ€ŠµŠ½Ń‹? &Server Name &Š˜Š¼Ń сервера Startup Script Дценарий, Š²Ń‹ŠæŠ¾Š»Š½ŃŠµŠ¼Ń‹Š¹ при запуске Post-Startup Script Дценарий, Š²Ń‹ŠæŠ¾Š»Š½ŃŠµŠ¼Ń‹Š¹ после запуска Shutdown Script Дценарий, Š²Ń‹ŠæŠ¾Š»Š½ŃŠµŠ¼Ń‹Š¹ при Š²Ń‹ŠŗŠ»ŃŽŃ‡ŠµŠ½ŠøŠø Post-Shutdown Script Дценарий, Š²Ń‹ŠæŠ¾Š»Š½ŃŠµŠ¼Ń‹Š¹ после Š²Ń‹ŠŗŠ»ŃŽŃ‡ŠµŠ½ŠøŃ Active Patchbay Definition Активное описание ŠŗŠ¾Š¼Š¼ŃƒŃ‚атора Messages Log Š–ŃƒŃ€Š½Š°Š» сообщений Log files Файлы Š¶ŃƒŃ€Š½Š°Š»Š¾Š² Some settings have been changed. Do you want to apply the changes? ŠŠµŠŗŠ¾Ń‚Š¾Ń€Ń‹Šµ параметры были изменены. ŠŸŃ€ŠøŠ¼ŠµŠ½ŠøŃ‚ŃŒ ŃŃ‚Šø ŠøŠ·Š¼ŠµŠ½ŠµŠ½ŠøŃ? jackdmp jackdmp &Name: &ŠŠ°Š·Š²Š°Š½ŠøŠµ: The JACK Audio Connection Kit sound server name The audio backend driver interface to use Š˜ŃŠæŠ¾Š»ŃŒŠ·ŃƒŠµŠ¼Ń‹Š¹ звуковой Грайвер sun sun coreaudio coreaudio freebob freebob firewire firewire MIDI Driv&er: &Драйвер MIDI: The ALSA MIDI backend driver to use Š˜ŃŠæŠ¾Š»ŃŒŠ·ŃƒŠµŠ¼Ń‹Š¹ Грайвер ALSA MIDI none нет raw raw seq seq Please do not touch these settings unless you know what you are doing. Unlock memory of common toolkit libraries (GTK+, QT, FLTK, Wine) Š Š°Š·Š±Š»Š¾ŠŗŠøŃ€Š¾Š²Š°Ń‚ŃŒ ŠæŠ°Š¼ŃŃ‚ŃŒ основных библиотек интерфейсов (GTK+, QT, FLTK, Wine) &Unlock Memory &Š Š°Š·Š±Š»Š¾ŠŗŠøŃ€Š¾Š²Š°Ń‚ŃŒ ŠæŠ°Š¼ŃŃ‚ŃŒ Ignore xruns reported by the backend driver Enable hardware monitoring of capture ports Š’ŠŗŠ»ŃŽŃ‡ŠøŃ‚ŃŒ аппаратный ŠŗŠ¾Š½Ń‚Ń€Š¾Š»ŃŒ портов захвата Enable hardware metering on cards that support it Š’ŠŗŠ»ŃŽŃ‡ŠøŃ‚ŃŒ аппаратное измерение Š“Š»Ń ŠæŠ¾Š“Š“ŠµŃ€Š¶ŠøŠ²Š°ŃŽŃ‰ŠøŃ… эту Ń„ŃƒŠ½ŠŗŃ†ŠøŃŽ карт Ignore hardware period/buffer size &Verbose messages &ŠŸŠ¾Š“Ń€Š¾Š±Š½Ń‹Š¹ вывоГ Maximum input audio hardware channels to allocate Максимальное число Ń€ŠµŠ·ŠµŃ€Š²ŠøŃ€ŃƒŠµŠ¼Ń‹Ń… каналов вхоГа External output latency (frames) Capture Only Только захват Playback Only Только воспроизвеГение The PCM device name to use Š˜Š¼Ń используемого ŃƒŃŃ‚Ń€Š¾Š¹ŃŃ‚Š²Š° PCM plughw:0 plughw:0 /dev/audio /dev/audio Alternate input device for capture Выберите ŃƒŃŃ‚Ń€Š¾Š¹ŃŃ‚Š²Š¾ вхоГа Š“Š»Ń захвата Maximum output audio hardware channels to allocate Максимальное Ń€ŠµŠ·ŠµŃ€Š²ŠøŃ€ŃƒŠµŠ¼Š¾Šµ число Š·Š²ŃƒŠŗŠ¾Š²Ń‹Ń… каналов ŃƒŃŃ‚Ń€Š¾Š¹ŃŃ‚Š²Š° Alternate output device for playback ŠŠ»ŃŒŃ‚ŠµŃ€Š½Š°Ń‚ŠøŠ²Š½Š¾Šµ ŃƒŃŃ‚Ń€Š¾Š¹ŃŃ‚Š²Š¾ Š²Š¾ŃŠæŃ€Š¾ŠøŠ·Š²ŠµŠ“ŠµŠ½ŠøŃ External input latency (frames) Set dither mode Выберите способ ŠæŠ¾Š“Š¼ŠµŃˆŠøŠ²Š°Š½ŠøŃ шума Server path (command line prefix) Number of periods in the hardware buffer ŠšŠ¾Š»ŠøŃ‡ŠµŃŃ‚Š²Š¾ периоГов в аппаратном Š±ŃƒŃ„ере &Channels: &Каналов: 192000 192000 Word length Длина слова в байтах Maximum number of audio channels to allocate Максимальное число Ń€ŠµŠ·ŠµŃ€Š²ŠøŃ€ŃƒŠµŠ¼Ń‹Ń… Š·Š²ŃƒŠŗŠ¾Š²Ń‹Ń… каналов &Channels I/O: I/O &каналов: &Latency I/O: &ЗаГержка I/O: Server Suffi&x: Ду&ффикс сервера: Whether to execute a custom shell script before shuting down the JACK audio server. Execute script on Shut&down: Š’&Ń‹ŠæŠ¾Š»Š½ŃŃ‚ŃŒ сценарий при выхоГе: Browse for script to be executed before shutting down the JACK audio server Command line to be executed before shutting down the JACK audio server Execute script after Shu&tdown: Š’Ń‹ŠæŠ¾Š»Š½ŃŃ‚ŃŒ сценарий после &Š²Ń‹ŠŗŠ»ŃŽŃ‡ŠµŠ½ŠøŃ: Whether to reset all connections when a patchbay definition is activated. Š”Š±Ń€Š°ŃŃ‹Š²Š°Ń‚ŃŒ ли все ŃŠ¾ŠµŠ“ŠøŠ½ŠµŠ½ŠøŃ при активации Š¾ŠæŠøŃŠ°Š½ŠøŃ ŠŗŠ¾Š¼Š¼ŃƒŃ‚Š°Ń‚Š¾Ń€Š° &Reset all connections on patchbay activation Š”&Š±Ń€Š°ŃŃ‹Š²Š°Ń‚ŃŒ все ŃŠ¾ŠµŠ“ŠøŠ½ŠµŠ½ŠøŃ при активации ŠŗŠ¾Š¼Š¼ŃƒŃ‚атора Whether to issue a warning on active patchbay port disconnections. ŠŸŠ¾ŠŗŠ°Š·Ń‹Š²Š°Ń‚ŃŒ ли ŠæŃ€ŠµŠ“ŃƒŠæŃ€ŠµŠ¶Š“ŠµŠ½ŠøŠµ о рассоеГинениии портов активного ŠŗŠ¾Š¼Š¼ŃƒŃ‚атора &Warn on active patchbay disconnections ŠŸŃ€ŠµŠ“ŃƒŠæŃ€Šµ&Š¶Š“Š°Ń‚ŃŒ о Ń€Š°ŃŃŠ¾ŠµŠ“ŠøŠ½ŠµŠ½ŠøŃ в активном ŠŗŠ¾Š¼Š¼ŃƒŃ‚аторе Logging Š–ŃƒŃ€Š½Š°Š»ŠøŃ€Š¾Š²Š°Š½ŠøŠµ Messages log file Файл Š¶ŃƒŃ€Š½Š°Š»Š° сообщений Browse for the messages log file location Š£ŠŗŠ°Š·Š°Ń‚ŃŒ расположение файла Š¶ŃƒŃ€Š½Š°Š»Š° Whether to activate a messages logging to file. Š”Š¾Ń…Ń€Š°Š½ŃŃ‚ŃŒ ли протокол в файл Š¶ŃƒŃ€Š½Š°Š»Š° Advanced Š”Š¾ŠæŠ¾Š»Š½ŠøŃ‚ŠµŠ»ŃŒŠ½Ń‹Šµ &Messages log file: Файл &Š¶ŃƒŃ€Š½Š°Š»Š°: Select font for front panel normal display Š’Ń‹Š±Ń€Š°Ń‚ŃŒ ŃˆŃ€ŠøŃ„Ń‚ Š“Š»Ń малого счётчика Select font for big time display Š’Ń‹Š±Ń€Š°Ń‚ŃŒ ŃˆŃ€ŠøŃ„Ń‚ Š“Š»Ń большого счётчика Whether to enable a shiny glass light effect on the main display Š˜Š·Š¾Š±Ń€Š°Š¶Š°Ń‚ŃŒ ли блик на основном Гисплее &Display shiny glass light effect Š’ŠŗŠ»ŃŽŃ‡ŠøŃ‚ŃŒ ŃŃ„Ń„ŠµŠŗŃ‚ &блика на Гисплее Whether to enable blinking (flashing) of the server mode (RT) indicator Blin&k server mode indicator &ŠœŠµŃ€Ń†Š°Ń‚ŃŒ инГикатором режима сервера Connections Window ŠžŠŗŠ½Š¾ соеГинений Sample connections view font Шрифт Š“Š»Ń Гиалога ŃƒŠæŃ€Š°Š²Š»ŠµŠ½ŠøŃ ŃŠ¾ŠµŠ“ŠøŠ½ŠµŠ½ŠøŃŠ¼Šø Select font for the connections view Выберите ŃˆŃ€ŠøŃ„Ń‚ Š“Š»Ń просмотра соеГинений &Icon size: &Размер значков: The icon size for each item of the connections view Размер значка кажГого ŃŠ»ŠµŠ¼ŠµŠ½Ń‚Š° в окне соеГинений 16 x 16 16 Ɨ 16 32 x 32 32 Ɨ 32 64 x 64 64 Ɨ 64 Whether to enable in-place client/port name editing (rename) Ena&ble client/port aliases editing (rename) Ра&Š·Ń€ŠµŃˆŠøŃ‚ŃŒ переименование алиасов клиентов/портов Whether to enable client/port name aliases on the connections window E&nable client/port aliases &Š Š°Š·Ń€ŠµŃˆŠøŃ‚ŃŒ алиасы клиентов/портов Whether to draw connection lines as cubic Bezier curves Š ŠøŃŠ¾Š²Š°Ń‚ŃŒ ли ŃŠ¾ŠµŠ“ŠøŠ½ŠøŃ‚ŠµŠ»ŃŒŠ½Ń‹Šµ линии в Гиалогах Ā«Š”Š¾ŠµŠ“ŠøŠ½ŠµŠ½ŠøŃĀ» Šø Ā«ŠšŠ¾Š¼Š¼ŃƒŃ‚Š°Ń‚Š¾Ń€Ā» как ŠŗŃƒŠ±ŠøŃ‡ŠµŃŠŗŠøŠµ кривые Š‘ŠµŠ·ŃŒŠµ Server &Prefix: ŠŸŃ€Šµ&фикс сервера: Extra driver options (command line suffix) Š”Š¾ŠæŠ¾Š»Š½ŠøŃ‚ŠµŠ»ŃŒŠ½Ń‹Šµ ŠŗŠ»ŃŽŃ‡Šø Гравера (ŃŃƒŃ„Ń„ŠøŠŗŃ в команГной строке) Start De&lay: ЗаГер&жка запуска: secs с 0 msecs 0 мс Draw connection and patchbay lines as Be&zier curves Š ŠøŃŠ¾Š²Š°Ń‚ŃŒ линии ŃŠ¾ŠµŠ“ŠøŠ½ŠµŠ½ŠøŃ как кривые &Š‘ŠµŠ·ŃŒŠµ Misc Разное Whether to stop JACK audio server on application exit ŠžŃŃ‚Š°Š½Š°Š²Š»ŠøŠ²Š°Ń‚ŃŒ ли звуково сервера JACK при выхоГе ŠøŠ· ŠæŃ€ŠøŠ»Š¾Š¶ŠµŠ½ŠøŃ S&top JACK audio server on application exit ŠžŃŃ‚Š°&Š½Š°Š²Š»ŠøŠ²Š°Ń‚ŃŒ JACK при выхоГе ŠøŠ· ŠæŃ€ŠøŠ»Š¾Š¶ŠµŠ½ŠøŃ JACK client/port pretty-name (metadata) display mode Enable JA&CK client/port pretty-names (metadata) Whether to show system tray message on main window close ŠŸŠ¾ŠŗŠ°Š·Ń‹Š²Š°Ń‚ŃŒ ли ŃŠ¾Š¾Š±Ń‰ŠµŠ½ŠøŃ программы в области ŃƒŠ²ŠµŠ“Š¾Š¼Š»ŠµŠ½ŠøŃ, когГа основное окно скрыто Sho&w system tray message on close ŠŸŠ¾ŠŗŠ°Š·Ń‹Š²Š°Ń‚ŃŒ сооб&Ń‰ŠµŠ½ŠøŃ в области ŃƒŠ²ŠµŠ“Š¾Š¼Š»ŠµŠ½ŠøŃ Whether to ask for confirmation on JACK audio server shutdown Confirm server sh&utdown &Š—Š°ŠæŃ€Š°Š¶ŠøŠ²Š°Ń‚ŃŒ поГтвержГение на Š¾ŃŃ‚Š°Š½Š¾Š²ŠŗŃƒ сервера Whether to enable ALSA Sequencer (MIDI) support on startup Š’ŠŗŠ»ŃŽŃ‡Š°Ń‚ŃŒ ли при запуске ŠæŠ¾Š“Š“ŠµŃ€Š¶ŠŗŃƒ MIDI-секвенсера ALSA E&nable ALSA Sequencer support &Š’ŠŗŠ»ŃŽŃ‡ŠøŃ‚ŃŒ ŠæŠ¾Š“Š“ŠµŃ€Š¶ŠŗŃƒ секвенсера ALSA Whether to enable JACK D-Bus interface &Enable JACK D-Bus interface Buttons Кнопки Whether to hide the left button group on the main window Š”ŠŗŃ€Ń‹Š²Š°Ń‚ŃŒ ли Š³Ń€ŃƒŠæŠæŃƒ кнопок в левой части основного окна Hide main window &Left buttons Š”ŠŗŃ€Ń‹Š²Š°Ń‚ŃŒ &левые кнопки основного окна Whether to hide the right button group on the main window Š”ŠŗŃ€Ń‹Š²Š°Ń‚ŃŒ ли Š³Ń€ŃƒŠæŠæŃƒ кнопок в правой части основного окна Hide main window &Right buttons Š”ŠŗŃ€Ń‹Š²Š°Ń‚ŃŒ прав&ые кнопки основного окна Whether to hide the transport button group on the main window Š”ŠŗŃ€Ń‹Š²Š°Ń‚ŃŒ ли Š³Ń€ŃƒŠæŠæŃƒ кнопок ŃƒŠæŃ€Š°Š²Š»ŠµŠ½ŠøŃ транспортом в основном окне Hide main window &Transport buttons Š”ŠŗŃ€Ń‹Š²Š°Ń‚ŃŒ кнопки &транспорта Whether to hide the text labels on the main window buttons Š”ŠŗŃ€Ń‹Š²Š°Ń‚ŃŒ ли наГписи на кнопках в основном окне Hide main window &button text labels Š”ŠŗŃ€Ń‹Š²Š°Ń‚ŃŒ по&Гписи кнопок основного окна &JACK client/port aliases: &Алиасы клиентов/портов JACK: JACK client/port aliases display mode Default По ŃƒŠ¼Š¾Š»Ń‡Š°Š½ŠøŃŽ First ŠŸŠµŃ€Š²Ń‹Š¹ Second Второй Defaults Š˜ŃŠæŠ¾Š»ŃŒŠ·ŃƒŠµŠ¼Ń‹Šµ по ŃƒŠ¼Š¾Š»Ń‡Š°Š½ŠøŃŽ параметры &Base font size: &Кегль ŃˆŃ€ŠøŃ„Ń‚Š° в интерфейсе: Base application font size (pt.) 11 11 12 12 net net Whether to enable D-Bus interface Š’Š»ŃŽŃ‡Š°Ń‚ŃŒ ли интерфейс D-Bus &Enable D-Bus interface Š’ŠŗŠ»ŃŽ&Ń‡ŠøŃ‚ŃŒ интерфейс D-Bus Number of microseconds to wait between engine processes (dummy) netone netone Whether to restrict to one single application instance (X11) Single application &instance Зап&ŃƒŃŠŗŠ°Ń‚ŃŒ Ń‚Š¾Š»ŃŒŠŗŠ¾ оГну ŠŗŠ¾ŠæŠøŃŽ программы qjackctlSocketForm &Socket &Докет &Client: &ŠšŠ»ŠøŠµŠ½Ń‚: Socket name (an alias for client name) Š˜Š¼Ń сокета (псевГоним имени клиента) &Name (alias): &Š˜Š¼Ń (псевГоним): Socket Plugs / Ports Докетовые ŃˆŃ‚ŠµŠæŃŠµŠ»Šø / ŠŸŠ¾Ń€Ń‚Ń‹ Socket plug list Дписок ŃˆŃ‚ŠµŠæŃŠµŠ»ŠµŠ¹ сокета &Down Š’&низ &Up Š’&верх Add plug to socket plug list Š”Š¾Š±Š°Š²ŠøŃ‚ŃŒ ŃˆŃ‚ŠµŠæŃŠµŠ»ŃŒ в список ŃˆŃ‚ŠµŠæŃŠµŠ»ŠµŠ¹ сокета &Plug: &ŠØŃ‚ŠµŠæŃŠµŠ»ŃŒ: &Edit И&Š·Š¼ŠµŠ½ŠøŃ‚ŃŒ &Remove &Š£Š“Š°Š»ŠøŃ‚ŃŒ Remove currently selected plug from socket plug list Š£Š“Š°Š»ŠøŃ‚ŃŒ выбранный ŃˆŃ‚ŠµŠæŃŠµŠ»ŃŒ ŠøŠ· списка ŃˆŃ‚ŠµŠæŃŠµŠ»ŠµŠ¹ сокета Plugs / Ports Штепсели / ŠŸŠ¾Ń€Ń‚Ń‹ Error ŠžŃˆŠøŠ±ŠŗŠ° A socket named "%1" already exists. Докет с именем Ā«%1Ā» уже ŃŃƒŃ‰ŠµŃŃ‚Š²ŃƒŠµŃ‚. Add Plug Š”Š¾Š±Š°Š²ŠøŃ‚ŃŒ ŃˆŃ‚ŠµŠæŃŠµŠ»ŃŒ Remove Š£Š“Š°Š»ŠøŃ‚ŃŒ Edit Š˜Š·Š¼ŠµŠ½ŠøŃ‚ŃŒ Move Up ŠŸŠµŃ€ŠµŠ¼ŠµŃŃ‚ŠøŃ‚ŃŒ Š²Ń‹ŃˆŠµ Move Down ŠŸŠµŃ€ŠµŠ¼ŠµŃŃ‚ŠøŃ‚ŃŒ ниже Client name (regular expression) Š˜Š¼Ń клиента (Ń€ŠµŠ³ŃƒŠ»ŃŃ€Š½Š¾Šµ выражение) Add P&lug Š”Š¾Š±Š°Š²ŠøŃ‚ŃŒ &ŃˆŃ‚ŠµŠæŃŠµŠ»ŃŒ Port name (regular expression) Š˜Š¼Ń порта (Ń€ŠµŠ³ŃƒŠ»ŃŃ€Š½Š¾Šµ выражение) Type Тип &Audio &Š—Š²ŃƒŠŗ Audio socket type (JACK) Тип звукового сокета (JACK) &MIDI &MIDI MIDI socket type (ALSA) Тип MIDI-сокета (ALSA) E&xclusive Enforce only one exclusive cable connection ŠŸŃ€ŠøŠ½ŃƒŠ“ŠøŃ‚ŠµŠ»ŃŒŠ½Š¾ Ń‚Š¾Š»ŃŒŠŗŠ¾ оГно кабельное соеГинение Warning ŠŸŃ€ŠµŠ“ŃƒŠæŃ€ŠµŠ¶Š“ŠµŠ½ŠøŠµ Some settings have been changed. Do you want to apply the changes? ŠŠµŠŗŠ¾Ń‚Š¾Ń€Ń‹Šµ параметры были изменены. ŠŸŃ€ŠøŠ¼ŠµŠ½ŠøŃ‚ŃŒ ŃŃ‚Šø ŠøŠ·Š¼ŠµŠ½ŠµŠ½ŠøŃ? (None) (ŠŠµŃ‚) Socket - JACK Audio Connection Kit Докет Edit currently selected plug Š˜Š·Š¼ŠµŠ½ŠøŃ‚ŃŒ выбранный ŃˆŃ‚ŠµŠæŃŠµŠ»ŃŒ Move down currently selected plug in socket plug list Move up current selected plug in socket plug list &Forward: Forward (clone) all connections from this socket MIDI socket type (JACK) Тип MIDI-сокета (JACK) AL&SA AL&SA qjackctlSocketList Output ВыхоГ Input ВхоГ Socket Докет Warning ŠŸŃ€ŠµŠ“ŃƒŠæŃ€ŠµŠ¶Š“ŠµŠ½ŠøŠµ <New> - %1 <ŠŠ¾Š²Ń‹Š¹> - %1 %1 about to be removed: "%2" Are you sure? %1 Š±ŃƒŠ“ŠµŃ‚ уГален: "%2" Š’Ń‹ ŃƒŠ²ŠµŃ€ŠµŠ½Ń‹? %1 <Copy> - %2 %1 <ŠšŠ¾ŠæŠøŃ> - %2 qjackctlSocketListView Output Sockets / Plugs ГнезГа Š½Š°Ń€ŃƒŠ¶Ńƒ Input Sockets / Plugs ГнезГа Š²Š½ŃƒŃ‚Ń€ŃŒ qjackctl-0.4.2/src/translations/PaxHeaders.14935/qjackctl_it.ts0000644000000000000000000000013212700760152021223 xustar0030 mtime=1459871850.632914789 30 atime=1459871850.631914289 30 ctime=1459871850.632914789 qjackctl-0.4.2/src/translations/qjackctl_it.ts0000644000175000001440000050146412700760152022001 0ustar00rncbcusers00000000000000 PortAudioProber Probing... Please wait, PortAudio is probing audio hardware. Warning Attenzione Audio hardware probing timed out. QObject (default) (predefinito) Start JACK audio server immediately Avvia subito il server Jack Set active patchbay definition file Imposta il file Patchbay predefinito Show help about command line options Mostra la guida sulle opzioni della riga di comando Show version information Mostra info sulla versione Option -p requires an argument (preset). L'opzione -p richiede un argomento (preset). Usage: %1 [options] [command-and-args] Uso: %1 [opzioni] [comandi-e-argomenti] Options: Opzioni: Set default settings preset name Imposta il nome per le impostazioni predefinite Option -a requires an argument (path). L'opzione -a richiede un argomento (indirizzo). Qt: %1 Qt: %1 Set default JACK audio server name Salva il nome predefinito del server JACK Option -n requires an argument (name). L'opzione -n richiede un argomento (nome). %1 (%2 frames) qjackctlAboutForm About Qt Info su QT &Close &Chiudi Version Versione Build Build Debugging option enabled. Opzione di debbugging abilitata. System tray disabled. Vassoio di sistema (system tray) non abilitata. Transport status control disabled. Controllo dello stato del transport disabilitato. Realtime status disabled. Stato Realtime disabilitato. XRUN delay status disabled. Stato del ritardo degli XRUN disabilitato. Maximum delay status disabled. Stato del massimo ritardo disabilitato. ALSA/MIDI sequencer support disabled. Supporto del sequencer ALSA/MIDI disabilitato. Website Sito Web This program is free software; you can redistribute it and/or modify it Questo programma ĆØ free software; ĆØ possibile ridistribuirlo e/o modificarlo under the terms of the GNU General Public License version 2 or later. nei termini dell GNU General Public License version 2 o superiore. JACK MIDI support disabled. Supporto del MIDI di Jack disabilitato. About QjackCtl Info su QjackCtl JACK Port aliases support disabled. Supporto per gli alias delle porte di Jack disabilitato. D-Bus interface support disabled. Supporto per l'interfaccia D-Bus disabilitato. JACK Session support disabled. supporto per le Sessioni di JACK disabilitato. Using: JACK %1 In uso: JACK %1 qjackctlClientListView &Connect &Connetti &Disconnect &Disconnetti Disconnect &All Disconnetti &Tutto Re&name Ri&omina &Refresh &Aggiorna Readable Clients / Output Ports Clients leggibili / Porte d'uscita Writable Clients / Input Ports Clients Scrivibili / Porte d'entrata Alt+C Connect Connetti Alt+C Alt+D Disconnect Disconnetti Alt+D Alt+A Disconect All Disconnetti Tutto Alt+A Alt+N Rename Rinomina Alt+N Alt+R Refresh Aggiorna Alt+R qjackctlConnect Warning Attenzione This will suspend sound processing from all client applications. Are you sure? Quest'azione sospenderĆ  il processamento sonoro da tutte le applicazioni clients. Sei sicuro? qjackctlConnectionsForm Connections - JACK Audio Connection Kit Connessioni - JACK Audio Connection Kit Audio Audio &Connect &Connetti Connect currently selected ports Connetti le porte selezionate &Disconnect &Disconnetti Disconnect currently selected ports Disconnetti le porte selezionate Disconnect &All Disconnetti &Tutto Disconnect all currently connected ports Disconnetti tutte le porte connesse &Refresh &Aggiorna Refresh current connections view Aggiorna la situazione delle connessioni MIDI MIDI Warning Attenzione The preset aliases have been changed: "%1" Do you want to save the changes? Gli alias delle porte sono cambiati: "%1" Salvare i cambiamenti? ALSA ALSA Expand all client ports Espandi tutte le porte dei clients E&xpand All E&spandi tutto qjackctlConnectorView &Connect &Connetti Disconnect &All Disconnetti &Tutto &Refresh &Aggiorna Alt+C Connect Connetti Alt+C &Disconnect &Disconnetti Alt+D Disconnect Disconnetti Alt+D Alt+A Disconect All Disconnetti Tutto Alt+A Alt+R Refresh Aggiorna Alt+R qjackctlMainForm &Quit &Esci Quit processing and exit Termina il processo sonoro ed esci &Start &Avvia Start the JACK server Avvia il server JACK S&top &Ferma Stop the JACK server Ferma il server JACK St&atus &Stato Ab&out... Inf&o su... Show information about this application Mostra le info riguardo questo software Show settings and options dialog Mostra la finestra delle impostazioni/opzioni &Messages &Messaggi Patch&bay Patch&bay Show/hide the patchbay editor window Mostra/nascondi la finestra del patchbay &Connect &Connetti Show/hide the actual connections patchbay window Mostra/nascondi la finestra delle connessioni del Patchbay JACK server state Stato del server JACK JACK server mode ModalitĆ  del server JACK Sample rate Frequenza di Campionamento Time display Visuale del Tempo Transport state Stato del transport Transport BPM BPM del transport Transport time Tempo del transport Backward transport Retrocedi transport Forward transport Avanza transport Rewind transport Riavvolgi transport Stop transport rolling Ferma il transport Start transport rolling Fai partire il transport Warning Attenzione successfully con successo with exit status=%1 con stato di uscita %1 Could not load preset "%1". Retrying with default. Non sono riuscito a caricare il preset "%1". Provo con il predefinito. Could not load default preset. Sorry. Non riesco a caricare il preset predefinito. Mi dispiace. Startup script... Script di inizio... Startup script terminated Script di inizio terminato JACK is starting... JACK sta partendo... Could not start JACK. Sorry. Non riesco ad avviare JACK. Mi dispiace. JACK is stopping... JACK si sta arrestando... The program will keep running in the system tray. To terminate the program, please choose "Quit" in the context menu of the system tray icon. Il programma continuerĆ  a lavorare nel vassoio di sistema (system tray). Per terminarlo, clicca su "Esci" nel menù del tasto destro sull icona nel vassoio. Shutdown script... Script d'arresto... Shutdown script terminated Script d'arresto terminato JACK was stopped JACK ĆØ stato fermato Post-shutdown script... Script di post - arresto... D-BUS: Service is available (%1 aka jackdbus). D-BUS: Servizio disponibile (%1 aka jackdbus). D-BUS: Service not available (%1 aka jackdbus). D-BUS: Servizio non disponibile (%1 aka jackdbus). Don't show this message again Don't ask this again D-BUS: JACK server is starting... D-BUS: JACK si sta avviando... D-BUS: JACK server could not be started. Sorry D-BUS: il server JACK non può essere avviato. Mi dispiace D-BUS: JACK server is stopping... D-BUS: JACK si sta arrestando... D-BUS: JACK server could not be stopped. Sorry D-BUS: il server JACK non può essere arrestato. Mi dispiace Post-shutdown script terminated Script di post - arresto terminato D-BUS: JACK server was started (%1 aka jackdbus). D-BUS: JACK ĆØ stato avviato (%1 aka jackdbus). D-BUS: JACK server was stopped (%1 aka jackdbus). D-BUS: JACK ĆØ stato fermato (%1 aka jackdbus). Error Errore Transport time code Codice temporale del transport Elapsed time since last reset Tempo trascorso dall'ultimo reset Elapsed time since last XRUN Tempo trascorso dall'ultimo XRUN Patchbay activated. Patchbay attivato. Patchbay deactivated. Patchbay disattivato. Statistics reset. Resetta le statistiche. msec msec XRUN callback (%1). XRUN callback (%1). Buffer size change (%1). Cambio della dimensione del buffer (%1). Shutdown notification. Notifica dell'arresto. JACK property change. checked verificato connected connesso disconnected disconnesso failed fallito Server configuration saved to "%1". Configurazione del server salvata in "%1". Client activated. Client attivato. Post-startup script... Script post - avvio... Post-startup script terminated Script di post - avvio terminato Command line argument... Argomento della linea di comando... Command line argument started Argomento della linea di comando eseguita Client deactivated. Client disattivato. Transport rewind. Riavvorgere il transport. Transport backward. Retrocedere il transport. Starting Avvio Transport start. Transport partito. Stopping Arresto Transport stop. Transport arrestato. Transport forward. Avanzare il transport. Stopped Arrestato Yes Si No No RT RT Rolling Riproduzione Looping Looping XRUN callback (%1 skipped). XRUN callback (%1 omitidos). Started Avviato Active Attivo Activating Attivazione Inactive Inattivo &Hide &Nascondi Mi&nimize Mi&nimizza S&how &Mostra Rest&ore &Ristabilisci &Stop &Ferma &Reset &Reset &Connections &Connessioni Server settings will be only effective after restarting the JACK audio server. I cambiamenti diventeranno effettivi solo al riavvio di JACK. D-BUS: SetParameterValue('%1', '%2'): %3. (%4) D-BUS: SetParameterValue('%1', '%2'): %3. (%4) D-BUS: ResetParameterValue('%1'): %2. (%3) D-BUS: ResetParameterValue('%1'): %2. (%3) D-BUS: GetParameterValue('%1'): %2. (%3) D-BUS: GetParameterValue('%1'): %2. (%3) Information Informazioni Some settings will be only effective the next time you start this program. Alcune modifiche saranno effettive solo al prossimo avvio dell'applicazione. Could not open ALSA sequencer as a client. ALSA MIDI patchbay will be not available. Non riesco ad aprire il sequencer ALSA come client. Il Patchbay MIDI non sarĆ  disponibile. JACK is currently running. Do you want to terminate the JACK audio server? JACK ĆØ attualmente attivato. Vuoi arrestare il server JACK? Could not start JACK. Maybe JACK audio server is already started. Non riesco ad avviare JACK. Forse il server JACK ĆØ giĆ  avviato. Some client audio applications are still active and connected. Do you want to stop the JACK audio server? Alcune applicazioni audio sono ancora attive e connesse. Vuoi arrestare il server JACK? JACK was started with PID=%1. JACK ĆØ stato avviato con PID=%1. JACK is being forced... JACK viene forzato... Patchbay reset. JACK connection graph change. Grafico delle connessioni di JACK modificato. JACK has crashed. JACK ha crashato. JACK timed out. Tempo d'attesa per JACK terminato. JACK write error. Errore di scrittura di JACK. JACK read error. Errore di lettura di JACK. Unknown JACK error (%d). Errore di JACK sconosciuto (%d). ALSA connection graph change. Cambiamento nel grafico delle connessioni di ALSA. JACK active patchbay scan Scansione del patchbay per JACK activo ALSA active patchbay scan Scansione del patchbay per ALSA attivo JACK connection change. Connessioni di JACK cambiate. ALSA connection change. Connessioni di ALSA cambiate. A patchbay definition is currently active, which is probable to redo this connection: %1 -> %2 Do you want to remove the patchbay connection? Una connessione ĆØ definita nel Patchbay, che probabilmente ripeterĆ  la connessione: %1 -> %2 Vuoi rimuovere questa connessione dal Patchbay? Overall operation failed. Operazione fallita. Invalid or unsupported option. Opzione non valida o non supportata. Client name not unique. Il nome del client non ĆØ unico. Server is started. Il server JACK ĆØ stato avviato. Unable to connect to server. Impossibile connettersi al server JACK. Server communication error. Errore di comunicazione col server JACK. Client does not exist. Il client non esiste. Unable to load internal client. Impossibile caricare il client interno. Unable to initialize client. Impossibile inizializzare il client. Unable to access shared memory. Impossibile accedere alla memoria condivisa. Client protocol version mismatch. La versione del protocollo del client ĆØ incongruente. Could not connect to JACK server as client. - %1 Please check the messages window for more info. Non sono riuscito ad avviare JACK come client. - %1 Controlla la finestra dei messaggi per maggiori informazioni. %1 (%2%) %1 (%2%) %1 % %1 % %1 Hz %1 Hz %1 frames %1 fotogrammi %1 msec %1 msec &Presets &Presets &Transport &Transport &Rewind &Riavvolgi &Play Ri&produci Pa&use Pa&usa QjackCtl QjackCtl &Patchbay &Patchbay DSP Load Carico DSP XRUN Count (notifications) Conteggio XRUN (notifiche) &Backward R&etrocedi &Forward &Avanza Set&up... Imp&ostazioni... S&ession S&essioni &Load... &Apri... &Save... &Salva... Save and &Quit... Salva ed E&sci... Save &Template... Salva &Modello... Show/hide the session management window Mostra/Nascondi la finestra di gestione delle sessioni Show/hide the messages log/status window Mostra/Nascondi la finestra di stato/log Could not load active patchbay definition. "%1" Disabled. Non riesco a caricare il file del patchbay attivo. "%1" Disabilitato. &Versioning &Versione Re&fresh Agg&iorna %1 (%2%, %3 xruns) %1 (%2%, %3 xruns) Transport BBT (bar.beat.ticks) qjackctlMessagesStatusForm Messages / Status - JACK Audio Connection Kit Messaggi / Stato - JACK Audio Connection Kit &Messages &Messaggi Messages log Log dei messaggi Messages output log Log dei messaggi di output &Status &Stato Status information Informazioni sullo Stato Statistics since last server startup Statistiche dall'ultimo avvio del server Description Descrizione Value Valore Reset XRUN statistic values Reimposta le statistiche degli XRUN Re&set Reimpo&sta Refresh XRUN statistic values Aggiorna le statistiche degli XRUN &Refresh &Refresh Server name Nome del server Server state Stato del server DSP Load Carico DSP Sample Rate Frequenza di campionamento Buffer Size Dimensione del buffer Realtime Mode Modo Realtime Transport state Stato del transport Transport Timecode Codice temporale del transport Transport BBT BBT del transport Transport BPM BPM del transport XRUN count since last server startup Conteggio degli XRUN dall'ultimo avvio del server XRUN last time detected Momento dell'ultimo XRUN XRUN last Ultimo XRUN XRUN maximum XRUN massimi XRUN minimum XRUN minimi XRUN average XRUN medi XRUN total XRUN totali Maximum scheduling delay Massimo ritardo nello scheduling Time of last reset Tempo dell'ultimo reset Logging stopped --- %1 --- Logging fermato --- %1 --- Logging started --- %1 --- Logging avviato --- %1 --- qjackctlPatchbay Warning Attenzione This will disconnect all sockets. Are you sure? Questo disconnetterĆ  tutte le porte. Sei sicuro? qjackctlPatchbayForm Patchbay - JACK Audio Connection Kit Patchbay - JACK Audio Connection Kit &New &Nuovo Create a new patchbay profile Crea un nuovo profilo Patchbay &Load... &Apri... Load patchbay profile Carica il profilo del Patchbay &Save... &Salva... Save current patchbay profile Salva il profilo corrente del Patchbay Acti&vate Atti&va Toggle activation of current patchbay profile Modifica lo stato di attivazione del Patchbay corrente &Connect &Connetti Connect currently selected sockets Connetti le porte selezionate &Disconnect &Disconnetti Disconnect currently selected sockets Disconnetti le porte selezionate Disconnect &All Disconnetti &Tutto Disconnect all currently connected sockets Disconnetti tutte le porte connesse &Refresh &Aggiorna Refresh current patchbay view Aggiorna la vista del Patchbay Down Giù Move currently selected output socket down one position Muovi la porta selezionata in basso Add... Aggiungi... Create a new output socket Crea una nuova porta d'uscita Edit... Modifica... Edit currently selected input socket properties Modifica la porta d'entrata selezionata Up Su Move currently selected output socket up one position Muovi la porta selezionata in alto Remove Rimuovi Remove currently selected output socket Rimuovi la porta d'uscita selezionata Copy... Copia... Duplicate (copy) currently selected output socket Duplica (copia) la porta d'uscita selezionata Remove currently selected input socket Rimuovi la porta d'entrata selezionata Duplicate (copy) currently selected input socket Duplica (copia) la porta d'entrata selezionata Create a new input socket Crea una nuova porta d'entrata Edit currently selected output socket properties Modifica la porta d'uscita selezionata Warning Attenzione active attivo New Patchbay definition Nuova definizione del Patchbay Patchbay Definition files Files di definizione del Patchbay Load Patchbay Definition Carica definizione del Patchbay Save Patchbay Definition Salva definizione del Patchbay The patchbay definition has been changed: "%1" Do you want to save the changes? Le definizioni del Patchbay sono cambiate: "%1" Vuoi salvare le modifiche? %1 [modified] %1 [modificato] Untitled%1 Senza titolo%1 Error Errore Could not load patchbay definition file: "%1" Non riesco a caricare il file di definizioni del Patchbay: "%1" Could not save patchbay definition file: "%1" Non riesco a salvare il file di definizioni del Patchbay: "%1" Create patchbay definition as a snapshot of all actual client connections? Creo un Patchbay partendo dalle connessioni attuali? Current (recent) patchbay profile(s) Profilo (recente) del Patchbay Expand all items Espandi tutti gli elementi E&xpand All E&spandi tutto qjackctlPatchbayView Add... Aggiungi... Edit... Modifica... Copy... Copia... Remove Rimuovi Exclusive Esclusiva Move Up Porta su Move Down Porta giù &Connect &Connetti &Disconnect &Disconnetti Disconnect &All Desconnetti &Tutto &Refresh &Aggiorna Alt+R Refresh Alt+A Forward Avanza (None) (Nessuno) Alt+C Connect Connetti Alt+C Alt+D Disconnect Disconnetti Alt+D Alt+A Disconect All Disconnetti Tutto Alt+A qjackctlSessionForm Session - JACK Audio Connection Kit Sessione - JACK Audio Connection Kit Load session Carica Sessione &Load... &Apri... Recent session Sessione recente &Recent &Recente Save session Salva sessione &Save... &Salva... Client / Ports Client / Porte UUID UUID Command Comando Load Session Carica Sessione Session directory Cartella della Sessione Save Session Salva Sessione and Quit ed Esci Template Modello &Clear Pulis&ci Warning Attenzione A session could not be found in this folder: "%1" non riesco a trovare una Sessione in questa cartella: "%1" %1: loading session... %1: carico la sessione... %1: load session %2. %1: carico la sessione %2. A session already exists in this folder: "%1" Are you sure to overwrite the existing session? Una Sessione esiste giĆ  in questa cartella: "%1" Sovrascivo la Sessione? This folder already exists and is not empty: "%1" Are you sure to overwrite the existing folder? Questa cartella esiste giĆ  e non ĆØ vuota: "%1" Sovrascrivo la cartella? %1: saving session... %1: salvo la sessione... %1: save session %2. %1: salvo la sessione %2. Update session Aggiorna sessione Save and &Quit... Salva ed Es&ci... Save &Template... Salva &Modello... &Save &Salva Save session versioning Salva la versione della sessione &Versioning &Versione Re&fresh Agg&iorna Session clients / connections Infra-clients / commands Infra-client Infra-command Add infra-client &Add Edit infra-client &Edit &Modifica Remove infra-client Re&move New Client qjackctlSessionInfraClientItemEditor Infra-command qjackctlSetupForm Setup - JACK Audio Connection Kit Configurazione - JACK Audio Connection Kit Settings Impostazioni Preset &Name: &Nome del Preset: (default) (predefinito) Settings preset name Nome del preset &Save &Salva Save settings as current preset name Salva le impostazioni sul preset corrente &Delete &Elimina Delete current settings preset Elimina il preset con le impostazioni correnti jackstart jackstart jackd jackd Driv&er: Dri&ver: dummy dummy oss oss alsa alsa portaudio portaudio coreaudio coreaudio Parameters Parametri Number of periods in the hardware buffer Numero di periodi nel buffer hardware Priorit&y: &PrioritĆ : &Frames/Period: &Fotogrammi/Periodo: 16 16 32 32 64 64 128 128 256 256 512 512 1024 1024 2048 2048 4096 4096 Frames per period between process() calls Fotogrammi per periodo tra chiamate a process() Port Ma&ximum: Numero mas&simo di porte: 21333 21333 22050 22050 32000 32000 44100 44100 48000 48000 88200 88200 96000 96000 Sample rate in frames per second Frequenza di campionamento in fotogrammi al secondo Scheduler priority when running realtime PrioritĆ  dello scheduler quando eseguito in realtime &Word Length: &Lunghezza delle parole: Periods/&Buffer: Periodi/&Buffer: Word length Lunghezza delle parole Maximum number of ports the JACK server can manage Numero massimo di porte che JACK può gestire &Wait (usec): &Attesa massima (microsec): Sample &Rate: &Campionamento: &Timeout (msec): &Attesa massima (msec): 200 200 500 500 1000 1000 2000 2000 5000 5000 10000 10000 Set client timeout limit in miliseconds Imposta il limite di tempo di attesa per il client, in msec &Realtime Tempo &Reale Use realtime scheduling Usa prioritĆ  dello scheduling in tempo reale No Memory Loc&k Non b&loccare memoria Do not attempt to lock memory, even if in realtime mode Non bloccare la memoria, anche in tempo reale &Unlock Memory &Sblocca Memoria Unlock memory of common toolkit libraries (GTK+, QT, FLTK, Wine) Sblocca la memoria per i toolkit classici (GTK+, QT, FLTK, Wine) So&ft Mode Modo So&ft Ignore xruns reported by the backend driver Ignora gli XRUN provenienti dal driver &Monitor &Monitor Provide output monitor ports Attiva porte d'uscita per il monitor Force &16bit Forza &16bit Force 16bit mode instead of failing over 32bit (default) Forza il modo 16bit invece del predefinito 32bit H/W M&onitor M&onitor Hardware Enable hardware monitoring of capture ports Abilita l'hardware monitor delle porte d'ingresso H/&W Meter Meter Hard&ware Enable hardware metering on cards that support it Abilita il metering per le schede che lo supportano &Ignore H/W &Ignora HardWare Ignore hardware period/buffer size Ignora la dimensione periodo/buffer dell'hardware &Output Device: Dispositiv&o d'uscita: &Interface: &Interfaccia: Maximum input audio hardware channels to allocate Numero massimo di canali hardware d'entrata &Audio: A&udio: Dit&her: Dit&her: External output latency (frames) Latenza esterna d'uscita (fotogrammi) &Input Device: D&ispositivo d'entrata: Duplex Duplex Capture Only Solo Cattura Playback Only Solo Riproduzione Provide either audio capture, playback or both Scegli se abilitare l'audio in cattura, in registrazione o entrambi hw:0 hw:0 The PCM device name to use Nome del dispositivo PCM da usare > > /dev/dsp Alternate input device for capture Seleziona il dispositivo alternativo d'entrata per la registrazione Maximum output audio hardware channels to allocate Numero massimo di canali hardware d'uscita Alternate output device for playback Seleziona il dispositivo alternativo d'uscita per la riproduzione External input latency (frames) Latenza esterna d'entrata (fotogrammi) None Nessuno Rectangular Rettangolare Shaped Modellato Triangular Triangolare Set dither mode Scegli il modo del dither Whether to give verbose output on messages VerbositĆ  nei messaggi d'uscita Time in seconds that client is delayed after server startup Tempo di ritardo nell'avvio del server JACK (in secondi) Latency: Latenza: Output latency in milliseconds, calculated based on the period, rate and buffer settings Latenza d'uscita in millisecondi, calcolata in base al rapporto fra periodo, fotogrammi e buffer Options Opzioni Scripting Scripting Execute script on Start&up: Esegui script prima dell'Avvi&o: Whether to execute a custom shell script before starting up the JACK audio server. Eseguire uno script prima dell'avvio del server JACK. Execute script after &Startup: Esegui script dopo l'Avv&io: Whether to execute a custom shell script after starting up the JACK audio server. Eseguire uno script dopo l'avvio del server JACK. Execute script on Shut&down: Esegui script prima dell'Ar&resto: Whether to execute a custom shell script before shuting down the JACK audio server. Eseguire uno script prima dell'arresto del server JACK. Command line to be executed before starting up the JACK audio server Comando da eseguire prima dell'avvio di JACK Scripting argument meta-symbols Meta simboli utilizzabili negli script ... ... Browse for script to be executed before starting up the JACK audio server Cerca uno script da eseguire prima dell'avvio del server JACK Command line to be executed after starting up the JACK audio server Comando da eseguire dopo l'avvio di JACK Browse for script to be executed after starting up the JACK audio server Cerca uno script da eseguire dopo l'avvio del server JACK Browse for script to be executed before shutting down the JACK audio server Cerca uno script da eseguire prima dell'arresto del server JACK Command line to be executed before shutting down the JACK audio server Comando da eseguire prima dell'arresto di JACK Execute script after Shu&tdown: Esegui script dopo l'Ar&resto: Whether to execute a custom shell script after shuting down the JACK audio server. Eseguire uno script dopo l'arresto di JACK. Browse for script to be executed after shutting down the JACK audio server Cerca uno script da eseguire dopo l'arresto del server JACK Command line to be executed after shutting down the JACK audio server Comando da eseguire dopo l'arresto di JACK Statistics Statistiche &Capture standard output &Cattura l'output standard dei comandi Whether to capture standard output (stdout/stderr) into messages window Catturare l'output standard nella finestra dei messaggi &XRUN detection regex: Espressione regolare per individuare gli &XRUN: xrun of at least ([0-9|\.]+) msecs XRUN di ([0-9|\.]+) msecs al massimo Regular expression used to detect XRUNs on server output messages Espressione regolare usata per il riconoscimento degli XRUN Connections Connessioni 10 10 Patchbay definition file to be activated as connection persistence profile Attiva il Patchbay in maniera persistente Browse for a patchbay definition file to be activated Sfoglia i file per caricare un Patchbay salvato Activate &Patchbay persistence: Attiva un &Patchbay persistente: Whether to activate a patchbay definition for connection persistence profile. Attiva un Patchbay predefinito per effettuare connessioni persistenti. Display Display Time Display Display del tempo Time F&ormat: F&ormato del tempo: hh:mm:ss hh:mm:ss hh:mm:ss.d hh:mm:ss.d hh:mm:ss.dd hh:mm:ss.dd hh:mm:ss.ddd hh:mm:ss.ddd The general time format on display Il formato temporale generico da mostrare Transport &Time Code Codice temporale del &Transport Transport &BBT (bar:beat.ticks) &BBT del Transport (battuta:pulsazione:frazioni) Elapsed time since last &Reset Tempo trascorso dall'ultimo &Reset Elapsed time since last &XRUN Tempo trascorso dall'ultimo &XRUN Sample front panel normal display font Carattere normale da mostrare nel display frontale Sample big time display font Carattere grande da mostrare nel display frontale Big Time display: Display grande del tempo: &Font... Cara&ttere... Select font for front panel normal display Tipo di carattere normale da mostrare nel display frontale Select font for big time display Tipo di carattere grande da mostrare nel display frontale Normal display: Display normale: &Display shiny glass light effect Usare effetto &di riflesso di vetro Whether to enable a shiny glass light effect on the main display Abilita l'effetto di riflesso di vetro sul display principale Messages Window Finestra dei messaggi Sample messages text font display Tipo di carattere per la finestra dei messaggi Select font for the messages text display Seleziona il tipo di carattere per la finestra dei messaggi &Messages limit: Limite dei &Messaggi: Whether to keep a maximum number of lines in the messages window Se limitare ad un numero massimo di righe nella finestra dei messaggi 100 100 250 250 2500 2500 The maximum number of message lines to keep in view Il numero massimo di messaggi da mostrare a vista Please do not touch these settings unless you know what you are doing. Connections Window Finestra delle Connessioni Sample connections view font Tipo di carattere per la finestra delle connessioni Select font for the connections view Seleziona il tipo di carattere per la finestra delle connessioni &Icon size: Dimensione delle &Icone: 16 x 16 16 x 16 32 x 32 32 x 32 64 x 64 64 x 64 The icon size for each item of the connections view Dimensione delle icone per gli elementi nella finestra delle connessioni Ena&ble client/port aliases editing (rename) A&bilita la modifica degli alias di clients/porte (rinomina) Whether to enable in-place client/port name editing (rename) Permetti la modifica veloce dei nomi dei clients/porte E&nable client/port aliases Abilita gli alias per &porte/clients Whether to enable client/port name aliases on the connections window Permetti gli alias per i nomi dei clients/porte Draw connection and patchbay lines as Be&zier curves Disegna le connessioni in forma di curve Be&zier Whether to draw connection lines as cubic Bezier curves Permetti il disegno delle connessioni in forma di curve cubiche Bezier Misc Varie Other Altro &Start JACK audio server on application startup Avvia il &server JACK all'avvio dell'applicazione Whether to start JACK audio server immediately on application startup Avvia immediatamente il server JACK all'avvio dell'applicazione &Confirm application close &Chiedi conferma alla chiusura Whether to ask for confirmation on application exit Chiedi conferma prima di chiudere l'applicazione &Keep child windows always on top Mantieni le finestre fi&glie sempre sopra le altre Whether to keep all child windows on top of the main window Scegli se mantenere le finestre figlie sempre sopra le altre &Enable system tray icon Abilita l'icona nel vassoio di sist&ema Whether to enable the system tray icon Scegli se visualizzare un'icona sul vassoio di sistema (system tray) S&ave JACK audio server configuration to: S&alva la configurazione di JACK in: Whether to save the JACK server command-line configuration into a local file (auto-start) Scegli se salvare la configurazione del server JACK in un file locale (all'avvio) .jackdrc .jackdrc The server configuration local file name (auto-start) Configurazione locale del server (all'avvio) C&onfigure as temporary server C&onfigura come server temporaneo Whether to exit once all clients have closed (auto-start) Scegli se uscire dopo che tutti i clients sono disconnessi (all'avvio) Whether to ask for confirmation on JACK audio server shutdown Scegli di chiedere conferma alla chiusura del server JACK Warning Attenzione msec msec n/a n/d &Preset Name Nome del &Preset &Server Path Indirizzo del &Server &Driver &Driver &Interface &Interfaccia Sample &Rate &Frequenza di campionamento &Frames/Period &Fotogrammi/Periodo Periods/&Buffer Periodi/&Buffer Patchbay Definition files Files di definizione del Patchbay Some settings have been changed: "%1" Do you want to save the changes? Alcune impostazioni sono cambiate: "%1" Vuoi salvarle? Delete preset: "%1" Are you sure? Cancello Preset: "%1" Sei sicuro? Startup Script Script all'avvio Post-Startup Script Script dopo l'avvio Shutdown Script Script all'arresto Post-Shutdown Script Script dopo l'arresto Active Patchbay Definition Definizione attiva del Patchbay Messages Log Log dei messaggi Log files Files di log Some settings have been changed. Do you want to apply the changes? Alcune impostazioni sono cambiate. Vuoi applicare i cambiamenti? jackdmp jackdmp The audio backend driver interface to use Driver dell'interfaccia audio da usare sun sun freebob freebob firewire firewire MIDI Driv&er: Driv&er MIDI: The ALSA MIDI backend driver to use Driver MIDI di ALSA da usare none nessuno raw raw seq seq &Verbose messages &VerbositĆ  nei messaggi plughw:0 plughw:0 /dev/audio /dev/audio &Channels: &Canali: 192000 192000 Maximum number of audio channels to allocate Massimo numero di canali audio allocabili Logging Logging Messages log file File di log dei messaggi Browse for the messages log file location Scegli il file in cui loggare i messaggi Whether to activate a messages logging to file. Scegli se attivare il logging dei messaggi su file. Advanced Whether to reset all connections when a patchbay definition is activated. &Reset all connections on patchbay activation Whether to issue a warning on active patchbay port disconnections. &Warn on active patchbay disconnections &Messages log file: File log dei &messaggi: Whether to enable blinking (flashing) of the server mode (RT) indicator Scegli se abilitare l'indicazione intermittente della modalitĆ  del server (RT) Blin&k server mode indicator Intermittenza nell'indicatore modo ser&ver &JACK client/port aliases: Alias clients/porte di &JACK: JACK client/port aliases display mode ModalitĆ  di visualizzazione degli alias di clients/porte Default Predefinito First Primo Second Secondo JACK client/port pretty-name (metadata) display mode Enable JA&CK client/port pretty-names (metadata) Whether to show system tray message on main window close Sho&w system tray message on close Confirm server sh&utdown Co&nferma l'arresto del server Whether to enable ALSA Sequencer (MIDI) support on startup Scegli se abilitare il sequencer ALSA (MIDI) all'avvio E&nable ALSA Sequencer support Abilita se&quencer ALSA Whether to enable JACK D-Bus interface &Enable JACK D-Bus interface Buttons Pulsanti Whether to hide the left button group on the main window Scegli se nascondere i pulsanti a sinistra nella finestra principale Hide main window &Left buttons Nascondi i pu&lsanti di sinistra nella finestra principale Whether to hide the right button group on the main window Scegli se nascondere i pulsanti a destra nella finestra principale Hide main window &Right buttons Nascondi i pulsanti di dest&ra nella finestra principale Whether to hide the transport button group on the main window Scegli se nascondere i pulsanti del transport nella finestra principale Hide main window &Transport buttons Nascondi i pulsanti del &Transport nella finestra principale Whether to hide the text labels on the main window buttons Scegli se nascondere il testo dei pulsanti nella finestra principale Hide main window &button text labels Nascondi il testo dei p&ulsanti nella finestra principale Defaults Predefinite &Base font size: Dimensione &base dei caratteri: Base application font size (pt.) Dimesione predefinita dei caratteri nell'applicazione (pt.) 6 6 7 7 8 8 9 9 11 11 12 12 net net Whether to enable D-Bus interface Scegli se abilitare l'interfaccia D-Bus &Enable D-Bus interface &Abilita l'interfaccia D-Bus Number of microseconds to wait between engine processes (dummy) Microsecondi d'attesa fra i processi del motore (dummy) netone netone Whether to restrict to one single application instance (X11) Scegli se registrare un'unica istanza dell'applicazione (X11) Single application &instance Permetti una sola &istanza &Name: &Nome: The JACK Audio Connection Kit sound server name Il nome del server audio Jack &Server Name Nome del &Server Server path (command line prefix) Indirizzo del server (prefisso nella riga di comando) &Channels I/O: &Canali I/O: &Latency I/O: &Latenza I/O: Start De&lay: Ritardo a&ll'avvio: secs secondi 0 msecs 0 millisecondi Server Suffi&x: Suffisso per il Ser&ver: Server &Prefix: Prefis&so per il Server: Extra driver options (command line suffix) Opzioni extra per il driver (suffisso nella riga di comando) Whether to stop JACK audio server on application exit S&top JACK audio server on application exit qjackctlSocketForm &Socket &Socket &Name (alias): &Nome (alias): Socket name (an alias for client name) Nome del socket (un alias per il nome del client) Client name (regular expression) Nome del client (espressione regolare) Add P&lug Aggiungi p&resa Add plug to socket plug list Aggiungi una presa alla lista delle prese &Plug: &Presa: Port name (regular expression) Nome della porta (espressione regolare) Socket Plugs / Ports Prese / Porte del Socket Socket plug list Lista dei socket tipo presa &Edit &Modifica &Remove &Rimuovi Remove currently selected plug from socket plug list Rimuovi la presa selezionata dalla lista del socket &Client: &Client: &Down &Giù &Up S&u E&xclusive Esclusi&vo Enforce only one exclusive cable connection Permetti una connessione da un solo cavo Type Tipo &Audio &Audio Audio socket type (JACK) Socket di tipo audio (JACK) &MIDI &MIDI MIDI socket type (ALSA) Socket di tipo MIDI (ALSA) Plugs / Ports Prese / Porte Error Errore A socket named "%1" already exists. Un socket chiamato "%1" esiste giĆ . Add Plug Aggiungi presa Remove Rimuovi Edit Modifica Move Up Sposta Su Move Down Sposta Giù Warning Attenzione Some settings have been changed. Do you want to apply the changes? Alcune impostazioni sono state modificate. Applicare le modifiche ora? (None) (Nessuno) Socket - JACK Audio Connection Kit Sockets - JACK Audio Connection Kit Edit currently selected plug Modifica la presa selezionata Move down currently selected plug in socket plug list Sposta giù la presa selezionata nella lista socket Move up current selected plug in socket plug list Sposta su la presa selezionata nella lista socket &Forward: C&lona: Forward (clone) all connections from this socket Clona tutte le connessioni di questo socket MIDI socket type (JACK) Tipo di socket MIDI (JACK) AL&SA AL&SA qjackctlSocketList Output Uscita Input Entrata Socket Socket Warning Attenzione <New> - %1 <Nuovo> - %1 %1 about to be removed: "%2" Are you sure? Sto per rimuovere %1: "%2" Sei sicuro? %1 <Copy> - %2 %1 <Copia> - %2 qjackctlSocketListView Output Sockets / Plugs Sockets / Prese d'uscita Input Sockets / Plugs Sockets / Prese d'entrata qjackctl-0.4.2/src/translations/PaxHeaders.14935/qjackctl_de.ts0000644000000000000000000000013212700760152021177 xustar0030 mtime=1459871850.630913789 30 atime=1459871850.629913288 30 ctime=1459871850.630913789 qjackctl-0.4.2/src/translations/qjackctl_de.ts0000644000175000001440000050026112700760152021747 0ustar00rncbcusers00000000000000 PortAudioProber Probing... Please wait, PortAudio is probing audio hardware. Warning Warnung Audio hardware probing timed out. QObject (default) (voreingestellt) Usage: %1 [options] [command-and-args] Benutzung: %1 [Optionen] [Kommandos und Argumente] Options: Optionen: Start JACK audio server immediately JACK Audioserver sofort starten Set active patchbay definition file Steckfeldkonfigurationsdatei festlegen Show help about command line options Zeige Hilfe zu Kommandozeilenargumenten an Show version information Zeige Versionsinformation an Option -p requires an argument (preset). Option -p benƶtigt ein Argument (Preset). Option -a requires an argument (path). Option -a benƶtigt ein Argument (Pfad). Qt: %1 Qt: %1 Set default settings preset name Name für die Voreinstellungen festlegen Set default JACK audio server name Voreingestellten JACK-Audioservernamen einstellen Option -n requires an argument (name). Option -n benƶtigt ein Argument (Name). %1 (%2 frames) qjackctlAboutForm About QjackCtl Über QjackCtl &Close &Schließen About Qt Über Qt Version Version Build Build Using: JACK %1 Nutze: JACK %1 Debugging option enabled. Debugging-Option aktiviert. System tray disabled. Benachrichtigungsfeld deaktiviert. Transport status control disabled. Transportstatuskontrolle abgeschaltet. Realtime status disabled. Echtzeitstatus deaktiviert. XRUN delay status disabled. XRUN Verzƶgerungsstatus abgeschaltet. Maximum delay status disabled. Status für maximale Verzƶgerung abgeschaltet. JACK MIDI support disabled. JACK MIDI wird nicht unterstütz. JACK Session support disabled. JACK Session nicht unterstützt. ALSA/MIDI sequencer support disabled. ALSA/MIDI Sequencer wird nicht unterstützt. Website Webseite This program is free software; you can redistribute it and/or modify it Dieses Programm ist freie Software; Sie kƶnnen es gemäß der under the terms of the GNU General Public License version 2 or later. GNU General Public License weiterverteilen und/oder modifizieren. JACK Port aliases support disabled. Alternativnamen für JACK-Anschlüsse abgeschaltet. D-Bus interface support disabled. Unterstützung der D-Bus-Schnittstelle abgeschaltet. qjackctlClientListView Readable Clients / Output Ports Lesbare Clients/AusgƤnge Writable Clients / Input Ports Beschreibbare Clients/EingƤnge &Connect &Verbinden Alt+C Connect Alt+V &Disconnect &Trennen Alt+D Disconnect Alt+T Disconnect &All &Alle trennen Alt+A Disconect All Alt+A Re&name &Umbenennen Alt+N Rename Alt+U &Refresh Au&ffrischen Alt+R Refresh Alt+F qjackctlConnect Warning Warnung This will suspend sound processing from all client applications. Are you sure? Hiermit wird die Klangverarbeitung aller Client-Anwendungen unterbrochen. Sind Sie sicher? qjackctlConnectionsForm Connections - JACK Audio Connection Kit Verbindungen - JACK Audio Connection Kit Audio Audio Connect currently selected ports AusgewƤhlte Anschlüsse verbinden &Connect &Verbinden Disconnect currently selected ports AusgewƤhlte Anschlüsse trennen &Disconnect &Trennen Disconnect all currently connected ports Alle verbundenen Anschlüsse trennen Disconnect &All &Alle trennen Expand all client ports Alle Client-Anschlüsse aufklappen E&xpand All Alle auf&klappen Refresh current connections view Ansicht der bestehenden Verbindungen erneuern &Refresh &Auffrischen MIDI JACK-MIDI ALSA ALSA-MIDI Warning Warnung The preset aliases have been changed: "%1" Do you want to save the changes? Die Alternativbezeichnungen für Voreinstellungen wurden verƤndert: "%1" Ƅnderungen speichern? qjackctlConnectorView &Connect &Verbinden Alt+C Connect Alt+V &Disconnect &Trennen Alt+D Disconnect Trennen Disconnect &All &Alle trennen Alt+A Disconect All Alt+A &Refresh Au&ffrischen Alt+R Refresh Alt+F qjackctlMainForm QjackCtl QjackCtl Quit processing and exit Signalverarbeitung und Programm beenden &Quit &Beenden Start the JACK server JACK-Server starten &Start &Start Stop the JACK server JACK-Server beenden S&top S&topp St&atus St&atus... Show information about this application Informationen über diese Anwendung anzeigen Ab&out... &Über... Set&up... &Einstellungen... Show settings and options dialog Dialogfenster für Einstellungen und Optionen anzeigen &Messages &Meldungen... Show/hide the patchbay editor window Steckfeldfenster anzeigen/verbergen &Patchbay Ste&ckfeld... Show/hide the actual connections patchbay window Zeige/Verberge das Steckfeldfenster mit den vorhandenen Verbindungen &Connect &Verbinden... JACK server state Status des JACK-Servers JACK server mode Modus des JACK-Servers DSP Load DSP-Last Sample rate Abtastrate XRUN Count (notifications) XRUN Anzahl (Benachrichtigungen) Time display Zeitanzeige Transport state Transportstatus Transport BPM Transport BPM Transport time Transport Zeit Show/hide the session management window Fenster für Sitzungsmanagement anzeigen/verbergen Show/hide the messages log/status window Meldungsfenster anzeigen/verbergen Backward transport Transport rückwƤrts &Backward &RückwƤrts Forward transport Transport vorwƤrts &Forward &VorwƤrts Rewind transport Transport zurückspulen &Rewind &Zurückspulen Stop transport rolling Transportvorgang anhalten Pa&use Pa&usieren Start transport rolling Transportvorgang starten &Play Abs&pielen Could not open ALSA sequencer as a client. ALSA MIDI patchbay will be not available. ALSA Sequencer konnte nicht als Client geƶffnet werden. Das ALSA-MIDI-Steckfeld wird nicht verfügbar sein. D-BUS: Service is available (%1 aka jackdbus). D-BUS: Dienst ist verfügbar (%1 aka jackdbus). D-BUS: Service not available (%1 aka jackdbus). D-Bus: Dienst ist nicht verfügbar (%1 aka jackdbus). Information Information Don't show this message again Diese Meldung nicht mehr anzeigen Warning Warnung JACK is currently running. Do you want to terminate the JACK audio server? Der JACK-Server lƤuft noch. Wollen Sie diesen beenden? successfully erfolgreich with exit status=%1 mit Rückgabewert = %1 Could not start JACK. Maybe JACK audio server is already started. Konnte JACK nicht starten. Mƶglicherweise lƤuft der JACK-Server schon. Could not load preset "%1". Retrying with default. Konnte Einstellung "%1" nicht laden. Versuche erneut mit Voreinstellung. Could not load default preset. Sorry. Konnte leider die Voreinstellung nicht laden. Startup script... Start-Skript... Startup script terminated Start-Skript beendet D-BUS: JACK server is starting... D-BUS: JACK-Server startet... D-BUS: JACK server could not be started. Sorry D-BUS: JACK-Server konnte nicht gestartet werden. Tut mir Leid JACK is starting... JACK startet... Some client audio applications are still active and connected. Do you want to stop the JACK audio server? Einige Client-Audio-Anwendungen sind noch aktiv und verbunden. Wollen Sie den JACK-Server anhalten? JACK is stopping... JACK fƤhrt herunter... Shutdown script... Herunterfahr-Skript... The program will keep running in the system tray. To terminate the program, please choose "Quit" in the context menu of the system tray icon. Programm lƤuft weiter sichtbar als Symbol im Benachrichtigungsfeld. Zum Beenden des Programms, wƤhlen Sie bitte "Beenden" im Kontextmenü des Benachrichtigungsfeldsymbols. Don't ask this again Nicht nochmal nachfragen Shutdown script terminated Herunterfahr-Skript beendet D-BUS: JACK server is stopping... D-BUS: JACK-Server fƤhrt herunter... D-BUS: JACK server could not be stopped. Sorry D-BUS: JACK-Server konnte nicht angehalten werden. Tut mir Leid Post-shutdown script... Nach-Herunterfahr-Skript... Post-shutdown script terminated Nach-Herunterfahr-Skript beendet JACK was started with PID=%1. JACK wurde mit PID = %1 gestartet. D-BUS: JACK server was started (%1 aka jackdbus). D-BUS: JACK-Server wurde gestartet (%1 aka jackdbus). JACK is being forced... JACK wird gezwungen... JACK was stopped JACK wurde angehalten D-BUS: JACK server was stopped (%1 aka jackdbus). D-BUS: JACK-Server wurde angehalten (%1 aka jackdbus). Error Fehler Transport BBT (bar.beat.ticks) Transport BBT (bar.beat.ticks) Transport time code Transport Timecode Elapsed time since last reset Seit dem letzten Zurücksetzen vergangene Zeit Elapsed time since last XRUN Seit dem letzten XRUN vergangene Zeit Patchbay reset. Steckfeld zurückgesetzt. Could not load active patchbay definition. "%1" Disabled. Konnte aktive Steckfelddefinition nicht laden. Patchbay activated. Steckfeld aktiviert. Patchbay deactivated. Steckfeld deaktiviert. Statistics reset. Statistik zurückgesetzt. msec ms JACK connection graph change. Schaubild der JACK-Verbindungen geƤndert. XRUN callback (%1). Buffer size change (%1). Puffergröße geƤndert (%1). Shutdown notification. Benachrichtigung zum Herunterfahren. Could not start JACK. Sorry. Konnte JACK nicht starten. JACK has crashed. JACK ist abgestürzt. JACK timed out. JACK Zeitüberschreitung. JACK write error. JACK Schreibfehler. JACK read error. JACK Lesefehler. Unknown JACK error (%d). Unbekannter JACK-Fehler (%d). JACK property change. JACK-Eigenschaft geƤndert. ALSA connection graph change. Schaubild der ALSA-Verbindungen geƤndert. JACK active patchbay scan JACK aktive Steckfeldsuche ALSA active patchbay scan ALSA aktive Steckfeldsuche JACK connection change. JACK-Verbindung geƤndert. ALSA connection change. ALSA-Verbindung geƤndert. checked überprüft connected verbunden disconnected getrennt failed fehlgeschlagen A patchbay definition is currently active, which is probable to redo this connection: %1 -> %2 Do you want to remove the patchbay connection? Zur Zeit ist eine Steckfeldkonfiguration aktiv, die wahrscheinlich diese Verbindung rückgƤngig macht: %1 -> %2 Wollen Sie diese Steckfeldverbindung entfernen? Overall operation failed. Gesamtbetrieb schlug fehl. Invalid or unsupported option. Ungültige oder nicht unterstützte Option. Client name not unique. Name des Clients nicht einzigartig. Server is started. Server ist gestartet. Unable to connect to server. Verbindungsaufnahme zum Server gescheitert. Server communication error. Server-Kommunikationsfehler. Client does not exist. Client existiert nicht. Unable to load internal client. Interner Client konnte nicht geladen werden. Unable to initialize client. Client konnte nicht initialisiert werden. Unable to access shared memory. Kein Zugriff auf Shared Memory mƶglich. Client protocol version mismatch. Unpassende Client-Protokollversion Could not connect to JACK server as client. - %1 Please check the messages window for more info. Keine Verbindungsaufnahme als Client zum JACK-Server mƶglich. - %1 Bitte sehen Sie im Meldungsfenster nach weiteren Informationen. Server configuration saved to "%1". Serverkonfiguration nach "%1" gespeichert. Client activated. Client aktiviert Post-startup script... Nach-Start-Skript... Post-startup script terminated Nach-Start-Skript beendet Command line argument... Kommandozeilenargument... Command line argument started Kommandozeilenargument gestartet Client deactivated. Client deaktiviert. Transport rewind. Transport zurückspulen. Transport backward. Transport zurück. Starting Startet Transport start. Transport starten. Stopping Stoppe Transport stop. Transport anhalten. Transport forward. Transport vorwƤrts. Stopped Steht %1 (%2%) %1 (%2 %) %1 (%2%, %3 xruns) %1 (%2%, %3 xruns) %1 % %1 % %1 Hz %1 Hz %1 frames %1 Frames Yes Ja No Nein RT RT Rolling Rollt Looping Schleifen ausführend %1 msec %1 ms XRUN callback (%1 skipped). XRUN callback (%1 übersprungen). Started LƤuft Active Aktiv Activating Aktivierend Inactive Inaktiv &Hide &Verbergen Mi&nimize Mi&nimieren S&how An&zeigen Rest&ore Neu&laden &Stop &Stopp &Reset &Zurücksetzen &Presets &Voreinstellungen &Versioning &Versionierung Re&fresh Au&ffrischen S&ession S&itzung... &Load... &Laden... &Save... &Speichern... Save and &Quit... Speichern und &beenden... Save &Template... &Vorlage speichern... &Connections &Verbindungen Patch&bay Steck&feld &Transport &Transport Server settings will be only effective after restarting the JACK audio server. Die Server-Einstellungen werden erst nach einem Neustart des JACK-Servers wirksam. D-BUS: SetParameterValue('%1', '%2'): %3. (%4) D-BUS: ResetParameterValue('%1'): %2. (%3) D-BUS: GetParameterValue('%1'): %2. (%3) Some settings will be only effective the next time you start this program. Einige Einstellungen werden erst nach einem Neustart des Programms wirksam. qjackctlMessagesStatusForm Messages / Status - JACK Audio Connection Kit Meldungen/Status - JACK Audio Connection Kit &Messages &Meldungen Messages log Meldungsprotokoll Messages output log Meldungsausgabeprotokoll &Status &Status Status information Statusinformationen Statistics since last server startup Statistik seit dem letzten Serverstart Description Beschreibung Value Wert Reset XRUN statistic values Daten der XRUN-Statistik zurücksetzen Re&set &Zurücksetzen Refresh XRUN statistic values Daten der XRUN-Statistik erneuern &Refresh &Auffrischen Server name Servername Server state Serverstatus DSP Load DSP-Last Sample Rate Abtastrate Buffer Size Puffergröße Realtime Mode Echtzeit-Modus Transport state Transportstatus Transport Timecode Transport Timecode Transport BBT Transport BBT Transport BPM Transport BPM XRUN count since last server startup Anzahl XRUNs seit dem letzten Serverstart XRUN last time detected Zeitpunkt der letzten XRUN-Beobachtung XRUN last Letzter XRUN XRUN maximum XRUN Maximum XRUN minimum XRUN Minimum XRUN average XRUN Durchschnitt XRUN total XRUN Summe Maximum scheduling delay Maximale Zeitverzƶgerung Time of last reset Zeitpunkt der letzten Zurücksetzung Logging stopped --- %1 --- Protokollierung angehalten --- %1 --- Logging started --- %1 --- Protokollierung gestartet --- %1 --- qjackctlPatchbay Warning Warnung This will disconnect all sockets. Are you sure? Diese Aktion wird alle Anschlüsse trennen. Sind Sie sicher? qjackctlPatchbayForm Patchbay - JACK Audio Connection Kit Steckfeld - JACK Audio Connection Kit Move currently selected output socket down one position AusgewƤhlten Ausgangsanschlus eine Position nach unten verschieben Down Ab Create a new output socket Einen neuen Ausgangsanschlus anlegen Add... Hinzufügen... Edit currently selected input socket properties Eigenschaften des gewƤhlten Eingangsanschlusses bearbeiten Edit... Bearbeiten... Move currently selected output socket up one position AusgewƤhlten Ausgangsanschluss eine Position nach oben verschieben Up Auf Remove currently selected output socket AusgewƤhlten Ausgangsanschluss entfernen Remove Entfernen Duplicate (copy) currently selected output socket Dupliziere den gewƤhlten Ausgangsanschluss Copy... Kopieren... Remove currently selected input socket AusgewƤhlten Eingangsanschluss entfernen Duplicate (copy) currently selected input socket Dupliziere den gewƤhlten Eingangsanschluss Create a new input socket Einen neuen Eingangsanschluss anlegen Edit currently selected output socket properties Eigenschaften des gewƤhlten Ausgangsanschlusses bearbeiten Connect currently selected sockets GewƤhlte Anschlüsse miteinander verbinden &Connect &Verbinden Disconnect currently selected sockets Verbindung zwischen den gewƤhlten Anschlüssen trennen &Disconnect &Trennen Disconnect all currently connected sockets Alle verbundenen Anschlüsse trennen Disconnect &All &Alle trennen Expand all items Alle EintrƤge aufklappen E&xpand All Alle auf&klappen Refresh current patchbay view Steckfeldansicht auffrischen &Refresh Auf&frischen Create a new patchbay profile Neues Steckfeldprofil anlegen &New &Neu Load patchbay profile Steckfeldprofil laden &Load... &Laden... Save current patchbay profile Aktuelles Steckfeldprofil speichern &Save... &Speichern... Current (recent) patchbay profile(s) Aktuelle (zuletzt verwendete) Steckfeldprofile Toggle activation of current patchbay profile Aktivierung des aktuellen Steckfeldprofils umschalten Acti&vate A&ktivieren Warning Warnung The patchbay definition has been changed: "%1" Do you want to save the changes? Die Steckfelddefinition wurde verƤndert: "%1" Wollen Sie die Ƅnderungen speichern? %1 [modified] %1 [verƤndert] Untitled%1 Unbenannt%1 Error Fehler Could not load patchbay definition file: "%1" Konnte Steckfelddefinitionsdatei nicht laden: "%1" Could not save patchbay definition file: "%1" Konnte Steckfelddefinitionsdatei nicht speichern: "%1" New Patchbay definition Neue Steckfelddefinition Create patchbay definition as a snapshot of all actual client connections? Steckfelddefinitionsdatei als Schnappschuss der aktuell vorhandenen Verbindungen erstellen? Load Patchbay Definition Steckfelddefinition laden Patchbay Definition files Steckfelddefinitionsdateien Save Patchbay Definition Speichere Steckfelddefinition active aktiv qjackctlPatchbayView Add... Hinzufügen... Edit... Bearbeiten... Copy... Kopieren... Remove Entfernen Exclusive Exklusiv Forward Weiterleiten (None) (Keine) Move Up Nach oben Move Down Nach unten &Connect &Verbinden Alt+C Connect Alt+V &Disconnect &Trennen Alt+D Disconnect Alt+T Disconnect &All &Alle trennen Alt+A Disconect All Alt+A &Refresh Auf&frischen Alt+R Refresh Alt+F qjackctlSessionForm Session - JACK Audio Connection Kit Sitzung - JACK Audio Connection Kit Load session Sitzung laden &Load... &Laden... Recent session Letzte Sitzung &Recent &Zuletzt Save session Sitzung speichern Save session versioning Sitzungsversionierung speichern &Versioning &Versionierung Re&fresh Au&ffrischen Infra-clients / commands Infra-client Infra-command Add infra-client &Add &Hinzufügen Edit infra-client &Edit &Bearbeiten Remove infra-client Re&move En&tfernen &Save... &Speichern... Update session Sitzung aktualisieren Session clients / connections Client / Ports Client/EingƤnge UUID UUID Command Kommando &Save &Speichern Load Session Sitzung laden Session directory Sitzungsverzeichnis Save Session Sitzung speichern and Quit und beenden Template Vorlage &Clear &Lƶschen Warning Warnung A session could not be found in this folder: "%1" Eine Sitzung konnte in diesem Verzeichnis nicht gefunden werden: "%1" %1: loading session... %1: lade Sitzung... %1: load session %2. %1: lade Sitzung %2. A session already exists in this folder: "%1" Are you sure to overwrite the existing session? Es existiert bereits eine Sitzung in diesem Verzeichnis: "%1" Soll diese Sitzung überschrieben werden? This folder already exists and is not empty: "%1" Are you sure to overwrite the existing folder? Dieses Verzeichnis existiert bereits und ist nicht leer: "%1" Soll das existierende Verzeichnis überschrieben werden? %1: saving session... %1: speichere Sitzung... %1: save session %2. %1: speichere Sitzung %2. New Client Neuer Client Save and &Quit... Speichern und &beenden... Save &Template... &Vorlage speichern... qjackctlSessionInfraClientItemEditor Infra-command qjackctlSetupForm Setup - JACK Audio Connection Kit Einstellungen - JACK Audio Connection Kit Settings Einstellungen Preset &Name: &Benennung: Settings preset name Benennung der Einstellung (default) (voreinst.) Save settings as current preset name Einstellungen mit aktueller Benennung speichern &Save &Speichern Delete current settings preset Aktuelle Einstellung lƶschen &Delete &Lƶschen jackd jackd jackdmp jackdmp jackstart jackstart Driv&er: Trei&ber: The audio backend driver interface to use Zu nutzender Audio-Schnittstellentreiber dummy dummy sun sun oss oss alsa alsa portaudio portaudio coreaudio coreaudio freebob freebob firewire firewire Parameters Parameter MIDI Driv&er: MIDI-&Treiber: The ALSA MIDI backend driver to use Zu nutzender ALSA-MIDI-Treiber none keiner raw raw seq seq Time in seconds that client is delayed after server startup Zeitverzƶgerung für den Client nach Start des Servers Latency: Latenz: Output latency in milliseconds, calculated based on the period, rate and buffer settings Ausgangslatenz in Millisekunden. Berechnung basiert auf Perioden-, Abtastraten- und Puffereinstellungen Use realtime scheduling Echtzeitverarbeitung nutzen &Realtime Echt&zeit Do not attempt to lock memory, even if in realtime mode Keinen Arbeitsspeicher sperren, auch nicht im Echtzeitmodus No Memory Loc&k Spei&cher nicht sperren Unlock memory of common toolkit libraries (GTK+, QT, FLTK, Wine) Arbeitsspeicher von gƤngigen Bibliotheken (GTK+, Qt, FLTK, Wine) entsperren &Unlock Memory S&peicher entsperren Ignore xruns reported by the backend driver Xruns des Schnittstellentreibers ignorieren So&ft Mode So&ft-Modus Provide output monitor ports Anschlüsse zur Ausgangsüberwachung anbieten &Monitor &Überwachung Force 16bit mode instead of failing over 32bit (default) 16-Bit-Modus erzwingen statt versuchsweiser Aktivierung des 32-Bit-Modus (voreingestellt) Force &16bit &16 Bit erzwingen Enable hardware monitoring of capture ports Hardware-Überwachung der Capture-Anschlüsse aktivieren H/W M&onitor H/W Über&wachung Enable hardware metering on cards that support it Hardware-Messung bei Karten aktivieren, die diese unterstützen H/&W Meter H/W &Messung Ignore hardware period/buffer size Ignoriere Periode/Puffergröße der Hardware &Ignore H/W &Ignoriere H/W Whether to give verbose output on messages Ausführliche Meldungen anzeigen &Verbose messages Aus&führliche Meldungen &Output Device: A&usgabegerƤt: &Interface: S&chnittstelle: Maximum input audio hardware channels to allocate Maximum belegbarer Audio-Hardware-EingƤnge &Audio: &Audio: Dit&her: External output latency (frames) Externe Ausgangslatenz (Frames) &Input Device: Eingangsger&Ƥt: Provide either audio capture, playback or both Entweder Audio-Aufnahme, -Wiedergabe oder beides anbieten Duplex Duplex Capture Only Nur Aufnahme Playback Only Nur Wiedergabe The PCM device name to use Name des genutzten PCM-GerƤtes hw:0 hw:0 plughw:0 plughw:0 /dev/audio /dev/audio /dev/dsp /dev/dsp > > Alternate input device for capture Alternativer GerƤteeingang für Aufnahme Maximum output audio hardware channels to allocate Maximum der belegbaren Audio-Hardware-AusgƤnge Alternate output device for playback Alternatives AusgabegerƤt für Wiedergabe External input latency (frames) Externe Eingangslatenz (Frames) Set dither mode Dither-Modus festlegen None Keiner Rectangular Rechteck Shaped Hüllkurve Triangular Dreieck Number of periods in the hardware buffer Anzahl der Perioden im Hardware-Puffer Server &Prefix: Server &PrƤfix: Server path (command line prefix) Serverpfad (Kommandozeilen PrƤfix) Priorit&y: Priorit&Ƥt: &Frames/Period: &Frames/Periode: Frames per period between process() calls Frames pro Periode zwischen process() Aufrufen 16 16 32 32 64 64 128 128 256 256 512 512 1024 1024 2048 2048 4096 4096 Port Ma&ximum: Ma&ximaler Port: &Channels: &KanƤle: 21333 21333 Sample rate in frames per second Abtastrate in Frames pro Sekunde 22050 22050 32000 32000 44100 44100 48000 48000 88200 88200 96000 96000 192000 192000 Scheduler priority when running realtime PrioritƤt für die Echtzeitsteuerung &Word Length: Wortl&Ƥnge: Periods/&Buffer: Per&ioden/Puffer: Word length WortlƤnge Maximum number of ports the JACK server can manage Maximum an Anschlüssen, die der JACK-Server verarbeiten kann &Wait (usec): &Warten (µs) Sample &Rate: Abtast&rate: Maximum number of audio channels to allocate Maximale Anzahl der belegbaren AudiokanƤle festlegen &Timeout (msec): &Timeout (ms): Set client timeout limit in miliseconds Timeout-Limitierung für Clients festlegen; Angabe in Millisekunden 200 200 500 500 1000 1000 2000 2000 5000 5000 10000 10000 &Channels I/O: &KanƤle I/O: &Latency I/O: &Latenz I/O: Server Suffi&x: Server Suffi&x: Start De&lay: Startver&zƶgerung: secs s 0 msecs 0 ms Advanced Options Optionen Scripting Skript-Steuerung Whether to execute a custom shell script before starting up the JACK audio server. Festlegen, ob ein angepasstes Shell-Skript vor dem Start des JACK-Servers ausgeführt werden soll Execute script on Start&up: Skript &beim Start ausführen: Whether to execute a custom shell script after starting up the JACK audio server. Festlegen, ob ein angepasstes Shell-Skript nach dem Start des JACK-Servers ausgeführt werden soll. Execute script after &Startup: Skript &nach Start ausführen: Whether to execute a custom shell script before shuting down the JACK audio server. Festlegen, ob ein angepasstes Shell-Skript vor dem Herunterfahren des JACK-Servers ausgeführt werden soll Execute script on Shut&down: Skript beim &Herunterfahren ausführen: Command line to be executed before starting up the JACK audio server Vor dem Starten des JACK-Servers ausgeführte Kommandozeile Scripting argument meta-symbols Meta-Symbole der Skriptargumente Browse for script to be executed before starting up the JACK audio server Skript auswƤhlen, das vor dem Starten des JACK-Servers ausgeführt wird ... ... Command line to be executed after starting up the JACK audio server Nach dem Starten des JACK-Servers ausgeführte Kommandozeile Browse for script to be executed after starting up the JACK audio server Skript auswƤhlen, das nach dem Starten des JACK-Servers ausgeführt wird Browse for script to be executed before shutting down the JACK audio server Skript auswƤhlen, das vor dem Herunterfahren des JACK-Servers ausgeführt wird Command line to be executed before shutting down the JACK audio server Vor dem Herunterfahren des JACK-Servers ausgeführte Kommandozeile Whether to execute a custom shell script after shuting down the JACK audio server. Festlegen, ob ein angepasstes Shell-Skript nach dem Herunterfahren des JACK-Servers ausgeführt werden soll. Execute script after Shu&tdown: Skript nach dem Herunter&fahren ausführen: Browse for script to be executed after shutting down the JACK audio server Skript auswƤhlen, das nach dem Herunterfahren des JACK-Servers ausgeführt wird Command line to be executed after shutting down the JACK audio server Nach dem Herunterfahren des JACK-Servers ausgeführte Kommandozeile Statistics Statistik Whether to capture standard output (stdout/stderr) into messages window Standardausgabe (stdout/stderr) in Meldungsfenster umleiten &Capture standard output Standardausgabe &umleiten &XRUN detection regex: Regular expression used to detect XRUNs on server output messages RegulƤrer Ausdruck zur Erkennung von XRUNs in vom Server gesendeten Meldungen xrun of at least ([0-9|\.]+) msecs xrun mit mindestens ([0-9|\.]+) ms Connections Verbindungen Whether to enable JACK D-Bus interface &Enable JACK D-Bus interface 10 10 Patchbay definition file to be activated as connection persistence profile Steckfelddefinitionsdatei als bestƤndiges Verbindungsprofil aktivieren Browse for a patchbay definition file to be activated Eine Steckfelddefinitionsdatei zum aktivieren wƤhlen Whether to activate a patchbay definition for connection persistence profile. Ein bestƤndiges Verbindungsprofil für das Steckfeld aktivieren. Activate &Patchbay persistence: Steck&feldkonfiguration hat Bestand: Logging Protokollierung Messages log file Protokolldatei für Meldungen Browse for the messages log file location Speicherort für Protokolldatei wƤhlen Whether to activate a messages logging to file. Protokollierung der Meldungen in eine Datei festlegen. Please do not touch these settings unless you know what you are doing. Extra driver options (command line suffix) Sonderoptionen für Treiber (Kommandozeilen PrƤfix) Whether to reset all connections when a patchbay definition is activated. Alle Verbindungen zurücksetzen, wenn eine Steckfeldkonfiguration aktiviert wird &Reset all connections on patchbay activation Alle &Verbindungen bei Steckfaktivierung zurücksetzen Whether to issue a warning on active patchbay port disconnections. Warnung anzeigen, wenn eine aktive Verbindung getrennt wird &Warn on active patchbay disconnections Beim &Trennen aktiver Verbindungen warnen &Messages log file: &Protokolldatei: Display Anzeige Time Display Zeitanzeige Time F&ormat: Zeit&format: The general time format on display Allgemeines Zeitformat der Anzeige hh:mm:ss hh:mm:ss hh:mm:ss.d hh:mm:ss.d hh:mm:ss.dd hh:mm:ss.dd hh:mm:ss.ddd hh:mm:ss.ddd Transport &Time Code Transport &BBT (bar:beat.ticks) Elapsed time since last &Reset Seit dem letzten &Zurücksetzen verstrichene Zeit Elapsed time since last &XRUN Seit dem letzten &XRUN verstrichene Zeit Sample front panel normal display font Beispielhafte Darstellung der normalen Anzeige Sample big time display font Beispielhafte Darstellung der großen Anzeige Big Time display: Große Zeitanzeige: Select font for front panel normal display Schriftart für normale Anzeige wƤhlen &Font... &Schriftart... Select font for big time display Schriftart für große Zeitanzeige wƤhlen Normal display: Normale Anzeige: Whether to enable a shiny glass light effect on the main display Anzeige mit Schimmereffekt darstellen &Display shiny glass light effect Schi&mmereffekt darstellen Whether to enable blinking (flashing) of the server mode (RT) indicator Realtime-Indikator (RT) für Servermodus blinkend darstellen Blin&k server mode indicator Ser&vermodus blinkend darstellen Messages Window Meldungsfenster Sample messages text font display Beispielhafte Darstellung des Textes im Meldungsfenster Select font for the messages text display Schriftart für Text im Meldungsfenster wƤhlen Whether to keep a maximum number of lines in the messages window Maximale Anzahl der im Meldungsfenster angezeigten Zeilen festlegen &Messages limit: &Meldungsmaximum: The maximum number of message lines to keep in view Maximale Anzahl der Nachrichten im Meldungsfenster 100 100 250 250 2500 2500 Connections Window Verbindungsübersicht Sample connections view font Beispielhafte Darstellung der Schrift in der Verbindungsübersicht Select font for the connections view Schriftart für Verbindungsübersicht wƤhlen &Icon size: &Symbolgröße: The icon size for each item of the connections view Größe der einzelnen Symbole in der Verbindungsübersicht 16 x 16 16 x 16 32 x 32 32 x 32 64 x 64 64 x 64 Whether to enable in-place client/port name editing (rename) Direktes Bearbeiten der Client/Anschluss-Alternativbezeichnung (Alias) erlauben Ena&ble client/port aliases editing (rename) Bearbeiten von &Deckbezeichnungen für Client/Anschlüsse Whether to enable client/port name aliases on the connections window Verwendung von Deckbezeichnungen (Alias) für Anschlüsse in der Verbindungsübersicht erlauben E&nable client/port aliases Dec&kbezeichnungen (Alias) für Client/Anschlüsse Whether to draw connection lines as cubic Bezier curves Festlegen, ob Verbindungslinien als Bezier-Kurven gezeichnet werden sollen Draw connection and patchbay lines as Be&zier curves Verbindungslinien als Be&zier-Kurven zeichen Misc Verschiedenes Other Weiteres Whether to start JACK audio server immediately on application startup JACK-Server unmittelbar bei Anwendungsstart starten &Start JACK audio server on application startup JACK-&Server bei Anwendungsstart starten Whether to ask for confirmation on application exit Vor dem Beenden des JACK-Servers nachfragen JACK client/port pretty-name (metadata) display mode Enable JA&CK client/port pretty-names (metadata) &Confirm application close Beenden der An&wendung bestƤtigen Whether to keep all child windows on top of the main window Alle Kindfenster oberhalb des Hauptfensters halten &Keep child windows always on top &Kindfenster immer oben belassen Whether to enable the system tray icon Anwendungssymbol im Benachrichtigungsfeld anzeigen &Enable system tray icon S&ymbol im Benachrichtigungsfeld anzeigen Whether to save the JACK server command-line configuration into a local file (auto-start) Kommandozeilenkonfiguration zum Starten des JACK-Servers in einer lokalen Datei speichern (auto-start) S&ave JACK audio server configuration to: Konfi&guration für JACK-Server speichern unter: The server configuration local file name (auto-start) Name der lokal gespeicherten Serverkonfigurationsdatei (auto-start) .jackdrc .jackdrc Whether to exit once all clients have closed (auto-start) Programm beenden, wenn alle Client-Verbindungen getrennt sind (auto-start) C&onfigure as temporary server Als temporƤren Ser&ver konfigurieren Whether to ask for confirmation on JACK audio server shutdown Das Herunterfahren des JACK-Servers per Nachfrage bestƤtigen Confirm server sh&utdown Herunter&fahren des Servers bestƤtigen Whether to enable ALSA Sequencer (MIDI) support on startup Unterstützung für den ALSA Sequencer (MIDI) beim Programmstart aktivieren E&nable ALSA Sequencer support Unterstützung für ALSA-Se&quencer bereitstellen Buttons SchaltflƤchen Whether to hide the left button group on the main window Linke SchaltflƤchengruppe im Hauptfenster verbergen Hide main window &Left buttons &Linke SchaltflƤchen des Hauptfensters verbergen Whether to hide the right button group on the main window Rechte SchaltflƤchengruppe im Hauptfenster verbergen Hide main window &Right buttons &Rechte SchaltflƤchen des Hauptfensters verbergen Whether to hide the transport button group on the main window SchaltflƤchen der Transportsteuerung im Hauptfenster verbergen Hide main window &Transport buttons SchaltflƤchen für &Transportsteuerung verbergen Whether to hide the text labels on the main window buttons Beschriftung der SchaltflƤchen im Hauptfenster verbergen Hide main window &button text labels Besch&riftung der SchaltflƤchen verbergen Warning Warnung Some settings have been changed: "%1" Do you want to save the changes? Einige Einstellungen wurden verƤndert: "%1" Wollen Sie diese speichern? Delete preset: "%1" Are you sure? Voreinstellung lƶschen: "%1" Sind Sie sicher? msec ms n/a n/a &Preset Name Benennung der &Voreinstellung &Server Name &Servername &Server Path &Serverpfad &Driver Trei&ber &Interface Sc&hnittstelle Sample &Rate Abtast&rate &Frames/Period &Frames/Periode Periods/&Buffer Perioden/&Puffer Startup Script Start-Skript Post-Startup Script Nach-Start-Skript Shutdown Script Herunterfahr-Skript Post-Shutdown Script Nach-Herunterfahr-Skript Active Patchbay Definition Aktive Steckfelddefinition Patchbay Definition files Steckfelddefinitionsdateien Messages Log Meldungsprotokoll Log files Protokolldateien Some settings have been changed. Do you want to apply the changes? Einige Einstellungen wurden verƤndert. Wollen Sie diese übernehmen? &JACK client/port aliases: Deckbezeichnungen bei &JACK-Anschlüssen: JACK client/port aliases display mode Anzeigemodus für die JACK-Client/Anschlussbenennung Default Voreinstellung First Erster Second Zweiter Whether to show system tray message on main window close Nachrichten des Benachrichtigungsfelds beim Schließen des Hauptfensters anzeigen Sho&w system tray message on close &Nachrichten des Benachrichtigungsfelds beim Beenden anzeigen Whether to stop JACK audio server on application exit JACK Audio-Server bei Programmbeendung anhalten S&top JACK audio server on application exit JACK Audio-&Server bei Programmbeendung anhalten Defaults Voreinstellungen &Base font size: &Basisschriftgröße: Base application font size (pt.) Generelle Schriftgröße (pt.) für die Anwendung festlegen 6 6 7 7 8 8 9 9 11 11 12 12 net net Whether to enable D-Bus interface D-Bus-Schnittstelle aktivieren &Enable D-Bus interface D-Bus-S&chnittstelle aktivieren Number of microseconds to wait between engine processes (dummy) Wartezeit in Mikrosekunden zwischen Verarbeitungsprozessen (dummy) &Name: &Name: The JACK Audio Connection Kit sound server name Name des JACK Audio Connection Kit Soundservers netone Whether to restrict to one single application instance (X11) Festlegen, ob nur eine Anwendungsinstanz (X11) gestartet werden darf Single application &instance Nur eine Anwendungsinstan&z zulassen qjackctlSocketForm Socket - JACK Audio Connection Kit Anschluss - JACK Audio Connection Kit &Socket &Anschluss &Name (alias): &Name (Alias): Socket name (an alias for client name) Anschlussbenennung (Alias für Name des Clients) Client name (regular expression) Name des Clients (RegulƤrer Ausdruck) Add plug to socket plug list Füge Anschluss zur Liste hinzu Add P&lug &Anschluss hinzufügen &Plug: A&nschluss: Port name (regular expression) Anschlussbezeichnung (RegulƤrer Ausdruck) Socket plug list Anschlussliste Socket Plugs / Ports Socket-Anschlüsse Edit currently selected plug AusgewƤhlten Anschluss bearbeiten &Edit &Bearbeiten Remove currently selected plug from socket plug list AusgewƤhlten Anschluss von der Liste entfernen &Remove En&tfernen &Client: &Client: Move down currently selected plug in socket plug list AusgewƤhlten Anschluss in Liste nach unten schieben &Down A&b Move up current selected plug in socket plug list AusgewƤhlten Anschluss in Liste nach oben schieben &Up Au&f Enforce only one exclusive cable connection Erzwinge eine singulƤre Kabelverbindung E&xclusive E&xklusiv &Forward: &Weiterleiten: Forward (clone) all connections from this socket Alle Verbindungen dieses Anschlusses weiterleiten (klonen) Type Typ Audio socket type (JACK) JACK-Audio-Anbindung &Audio JACK-&Audio MIDI socket type (JACK) JACK-MIDI-Anbindung &MIDI JACK-&MIDI MIDI socket type (ALSA) ALSA-MIDI-Anbindung AL&SA AL&SA-MIDI Plugs / Ports Anschlüsse Error Fehler A socket named "%1" already exists. Socket mit dem Namen "%1" existiert bereits. Warning Warnung Some settings have been changed. Do you want to apply the changes? Einige Einstellungen wurden verƤndert. Wollen Sie diese übernehmen? Add Plug Anschluss hinzufügen Edit Bearbeiten Remove Entfernen Move Up Auf Move Down Ab (None) (Keiner) qjackctlSocketList Output Ausgang Input Eingang Socket Anbindung <New> - %1 <Neu> - %1 Warning Warnung %1 about to be removed: "%2" Are you sure? %1 soll entfernt werden: "%2" Sind Sie sicher? %1 <Copy> - %2 %1 <Kopieren> - %2 qjackctlSocketListView Output Sockets / Plugs Ausgangsanschlüsse Input Sockets / Plugs Eingangsanschlüsse qjackctl-0.4.2/src/translations/PaxHeaders.14935/qjackctl_fr.ts0000644000000000000000000000013212700760152021216 xustar0030 mtime=1459871850.631914289 30 atime=1459871850.631914289 30 ctime=1459871850.631914289 qjackctl-0.4.2/src/translations/qjackctl_fr.ts0000644000175000001440000051015512700760152021771 0ustar00rncbcusers00000000000000 PortAudioProber Probing... DĆ©tection… Please wait, PortAudio is probing audio hardware. Merci de patienter, PortAudio dĆ©tecte le matĆ©riel audio. Warning Attention Audio hardware probing timed out. La dĆ©tection du matĆ©riel audio a Ć©chouĆ©. QObject (default) (par dĆ©faut) Start JACK audio server immediately DĆ©marrer immĆ©diatement le serveur audio JACK Show help about command line options Montrer l'aide Ć  propos des options en ligne de commande Show version information Montrer les informations de version Option -p requires an argument (preset). L'option -p nĆ©cessite un argument (prĆ©rĆ©glage). Usage: %1 [options] [command-and-args] Utilisation : %1 [options] [commandes-et-args] Options: Options : Set active patchbay definition file Choisir le fichier de dĆ©finition de baie de brassage actif Set default JACK audio server name Choisir le nom du serveur audio JACK par dĆ©faut Option -a requires an argument (path). L'option -a nĆ©cessite un argument (chemin). Option -n requires an argument (name). L'option -n nĆ©cessite un argument (nom). Qt: %1 Qt : %1 Set default settings preset name RĆ©gler le nom du prĆ©rĆ©glage des paramĆØtres par dĆ©faut %1 (%2 frames) %1 (%2 Ć©chantillons) qjackctlAboutForm About QjackCtl ƀ propos de QjackCtl About Qt ƀ propos de Qt &Close &Fermer Version Version Build Compilation Using: JACK %1 Utilisation de : JACK %1 Debugging option enabled. Option de dĆ©bogage activĆ©e. System tray disabled. Zone de notification systĆØme dĆ©sactivĆ©e. Transport status control disabled. ContrĆ“le du statut du dĆ©placement dĆ©sactivĆ©. Realtime status disabled. Statut temps rĆ©el dĆ©sactivĆ©. XRUN delay status disabled. Statut du dĆ©lai de dĆ©synchronisation (XRUN) dĆ©sactivĆ©. Maximum delay status disabled. Statut du dĆ©lai maximal dĆ©sactivĆ©. JACK Session support disabled. Prise en charge de session JACK dĆ©sactivĆ©e. ALSA/MIDI sequencer support disabled. Prise en charge du sĆ©quenceur ALSA/MIDI dĆ©sactivĆ©e. Website Site web This program is free software; you can redistribute it and/or modify it Ce programme est libre; vous pouvez le redistribuer et/ou le modifier under the terms of the GNU General Public License version 2 or later. selon les termes de la Licence Publique GĆ©nĆ©rale GNU version 2 ou ultĆ©rieure. JACK MIDI support disabled. Prise en charge de JACK MIDI dĆ©sactivĆ©e. JACK Port aliases support disabled. Prise en charge des alias de port JACK dĆ©sactivĆ©e. D-Bus interface support disabled. Prise en charge de l'interface D-Bus dĆ©sactivĆ©e. qjackctlClientListView &Connect &Connecter Alt+C Connect Alt+C &Disconnect &DĆ©connecter Alt+D Disconnect Alt+D Disconnect &All &Tout dĆ©connecter Alt+A Disconect All Alt+T Re&name Re&nommer Alt+N Rename Alt+N &Refresh &RafraĆ®chir Alt+R Refresh Alt+R Readable Clients / Output Ports Clients en lecture / Ports de sortie Writable Clients / Input Ports Clients en Ć©criture / Ports d'entrĆ©e qjackctlConnect Warning Attention This will suspend sound processing from all client applications. Are you sure? Cela va suspendre le traitement du son de toutes les applications clientes. Êtes-vous certain ? qjackctlConnectionsForm Connections - JACK Audio Connection Kit Connexions - Kit de Connexion Audio JACK Audio Audio &Connect &Connecter Connect currently selected ports Connecter les ports actuellement sĆ©lectionnĆ©s &Disconnect &DĆ©connecter Disconnect currently selected ports DĆ©connecter les ports actuellement sĆ©lectionnĆ©s Disconnect &All &Tout dĆ©connecter Disconnect all currently connected ports DĆ©connecter tous les ports actuellement connectĆ©s Expand all client ports Afficher tous les ports clients E&xpand All &Afficher tout &Refresh &RafraĆ®chir Refresh current connections view RafraĆ®chir la vue actuelle des connexions MIDI MIDI Warning Attention ALSA ALSA The preset aliases have been changed: "%1" Do you want to save the changes? Les alias de prĆ©rĆ©glage ont Ć©tĆ© changĆ©s : Ā« %1 Ā» Voulez-vous enregistrer les changements ? qjackctlConnectorView &Connect &Connecter Alt+C Connect Alt+C &Disconnect &DĆ©connecter Alt+D Disconnect Alt+D Disconnect &All &Tout dĆ©connecter Alt+A Disconect All Alt+T &Refresh &RafraĆ®chir Alt+R Refresh Alt+R qjackctlMainForm QjackCtl QjackCtl &Quit &Quitter Quit processing and exit Quitter le traitement et sortir &Start &DĆ©marrer Start the JACK server DĆ©marrer le serveur JACK S&top &ArrĆŖter Stop the JACK server ArrĆŖter le serveur JACK St&atus S&tatut Ab&out... ƀ pr&opos… Show information about this application Montrer des informations Ć  propos de cette application Show settings and options dialog Montrer la fenĆŖtre d'options et de paramĆØtres &Messages &Messages &Patchbay &Baie de brassage Show/hide the patchbay editor window Montrer/cacher la fenĆŖtre de l'Ć©diteur de baie de brassage &Connect &Connecter Set&up... R&Ć©glages… Show/hide the actual connections patchbay window Montrer/cacher la fenĆŖtre des connexions actuelles de la baie de brassage JACK server state Ɖtat du serveur JACK JACK server mode Mode du serveur JACK Sample rate FrĆ©quence d'Ć©chantillonnage Time display Horloge Transport state Ɖtat du dĆ©placement Transport BPM BPM du dĆ©placement Transport time Horaire du dĆ©placement Show/hide the session management window Montrer/cacher la fenĆŖtre de gestion de session Show/hide the messages log/status window Montrer/cacher la fenĆŖtre de journal/statut &Backward A&rriĆØre Backward transport DĆ©placer en arriĆØre &Forward A&vant Forward transport DĆ©placer en avant &Rewind Remb&obiner Rewind transport Rembobiner Pa&use Pa&use Stop transport rolling ArrĆŖter le dĆ©placement &Play &Lecture Start transport rolling DĆ©marrer le dĆ©placement Warning Attention successfully avec succĆØs with exit status=%1 avec statut de sortie=%1 Could not load preset "%1". Retrying with default. Impossible de charger le prĆ©rĆ©glage Ā« %1 Ā». Nouvel essai avec celui par dĆ©faut. Could not load default preset. Sorry. Impossible de charger le prĆ©rĆ©glage par dĆ©faut. DĆ©solĆ©. Startup script... Script de dĆ©marrage... Startup script terminated Script de dĆ©marrage terminĆ© JACK is starting... JACK dĆ©marre... Could not start JACK. Sorry. Impossible de dĆ©marrer JACK. DĆ©solĆ©. JACK is stopping... JACK s'arrĆŖte... Shutdown script... Script d'extinction... Don't ask this again Ne pas redemander Shutdown script terminated Script d'extinction terminĆ© Post-shutdown script... Script post-extinction... Post-shutdown script terminated Script post-extinction terminĆ© JACK was stopped JACK a Ć©tĆ© arrĆŖtĆ© Error Erreur Transport time code Code temporel (Timecode) du dĆ©placement Elapsed time since last reset Temps Ć©coulĆ© depuis la derniĆØre rĆ©initialisation Elapsed time since last XRUN Temps Ć©coulĆ© depuis la derniĆØre dĆ©synchronisation (XRUN) Patchbay activated. Baie de brassage activĆ©e. Patchbay deactivated. Baie de brassage dĆ©sactivĆ©e. Statistics reset. RĆ©initialisation des statistiques. msec ms XRUN callback (%1). RĆ©cupĆ©ration dĆ©synchronisation (XRUN) (%1). Buffer size change (%1). Changement de la taille du tampon (%1). Shutdown notification. Notification d'extinction. checked vĆ©rifiĆ© connected connectĆ© disconnected dĆ©connectĆ© failed Ć©chouĆ© Server configuration saved to "%1". Configuration du serveur enregistrĆ©e dans Ā« %1 Ā». Client activated. Client activĆ©. Post-startup script... Script post-dĆ©marrage... Post-startup script terminated Script post-dĆ©marrage terminĆ© Command line argument... Argument de ligne de commande... Command line argument started Argument de ligne de commande dĆ©marrĆ© Client deactivated. Client dĆ©sactivĆ©. Transport rewind. DĆ©placement en rembobinage. Transport backward. DĆ©placement en marche arriĆØre. Starting DĆ©marre Transport start. DĆ©placement dĆ©marrĆ©. Stopping S'arrĆŖte Transport stop. DĆ©placement arrĆŖtĆ©. Transport forward. DĆ©placement en marche avant. Stopped ArrĆŖtĆ© Yes Oui No Non RT TR Rolling DĆ©file Looping Boucle XRUN callback (%1 skipped). RĆ©cupĆ©ration de dĆ©synchronisation (XRUN) (%1 sautĆ©). Started DĆ©marrĆ© Active Actif Activating Activation Inactive Inactif &Hide Cac&her Mi&nimize Mi&nimiser S&how M&ontrer Rest&ore R&estaurer &Stop &ArrĆŖter &Reset RĆ©&initialiser &Presets &PrĆ©rĆ©glages &Versioning Gestion de rĆ©&visions Re&fresh Ra&fraĆ®chir &Connections &Connexions Patch&bay &Baie de brassage &Transport DĆ©placemen&t Server settings will be only effective after restarting the JACK audio server. Les paramĆØtres du serveur ne seront effectifs qu'aprĆØs avoir redĆ©marrĆ© le serveur audio JACK. Information Information Some settings will be only effective the next time you start this program. Certains paramĆØtres ne seront effectifs qu'au prochain dĆ©marrage de ce programme. DSP Load Charge DSP XRUN Count (notifications) DĆ©compte des dĆ©synchronisations (notifications XRUN) JACK connection graph change. Changement du graphique des connexions JACK. ALSA connection graph change. Changement du graphique des connexions ALSA. JACK connection change. Changement des connexions JACK. ALSA connection change. Changement des connexions ALSA. JACK is currently running. Do you want to terminate the JACK audio server? JACK fonctionne actuellement. Voulez-vous arrĆŖter le serveur audio JACK ? D-BUS: Service is available (%1 aka jackdbus). DBUS : le service est disponible (%1 soit jackdbus). D-BUS: Service not available (%1 aka jackdbus). DBUS : le service n'est pas disponible (%1 soit jackdbus). The program will keep running in the system tray. To terminate the program, please choose "Quit" in the context menu of the system tray icon. Le programme continuera de s'exĆ©cuter dans la zone de notification systĆØme. Pour terminer le programme, merci de choisir Ā« Quitter Ā» dans le menu contextuel de l'icĆ“ne de la zone de notification systĆØme. Don't show this message again Ne pas montrer ce message Ć  nouveau Could not start JACK. Maybe JACK audio server is already started. Impossible de dĆ©marrer JACK. Peut-ĆŖtre que le serveur audio JACK est dĆ©jĆ  dĆ©marrĆ©. D-BUS: JACK server is starting... DBUS : le serveur JACK dĆ©marre… D-BUS: JACK server could not be started. Sorry DBUS : impossible de dĆ©marrer le serveur JACK. DĆ©solĆ© Some client audio applications are still active and connected. Do you want to stop the JACK audio server? Certaines applications audio clientes sont encore actives et connectĆ©es. Voulez-vous arrĆŖter le serveur audio JACK ? D-BUS: JACK server is stopping... DBUS : le serveur JACK s'arrĆŖte… D-BUS: JACK server could not be stopped. Sorry DBUS : impossible d'arrĆŖter le serveur JACK. DĆ©solĆ© JACK was started with PID=%1. JACK a Ć©tĆ© dĆ©marrĆ© avec le PID=%1. D-BUS: JACK server was started (%1 aka jackdbus). DBUS : le serveur JACK a Ć©tĆ© dĆ©marrĆ© (%1 soit jackdbus). JACK is being forced... JACK est forcé… D-BUS: JACK server was stopped (%1 aka jackdbus). DBUS : le serveur JACK a Ć©tĆ© arrĆŖtĆ© (%1 soit jackdbus). Transport BBT (bar.beat.ticks) Transport MTB (mesure temps battement) Patchbay reset. RĆ©initialisation de la baie de brassage. Could not load active patchbay definition. "%1" Disabled. Impossible de charger la dĆ©finition de baie de brassage active. "%1" DĆ©sactivĆ©. JACK has crashed. JACK a plantĆ©. JACK timed out. JACK n'a pas rĆ©pondu Ć  temps. JACK write error. Erreur d'Ć©criture JACK. JACK read error. Erreur de lecture JACK. Unknown JACK error (%d). Erreur JACK inconnue (%d). JACK property change. Changement d'une propriĆ©tĆ© de JACK. Overall operation failed. L'opĆ©ration a Ć©chouĆ©. Invalid or unsupported option. Option invalide ou non prise en charge. Client name not unique. Nom de client non unique. Server is started. Le serveur est dĆ©marrĆ©. Unable to connect to server. Incapable de se connecter au serveur. Server communication error. Erreur de communication serveur. Client does not exist. Le client n'existe pas. Unable to load internal client. Incapable de charger le client interne. Unable to initialize client. Incapable d'initialiser le client. Unable to access shared memory. Incapable d'accĆ©der Ć  la mĆ©moire partagĆ©e. Client protocol version mismatch. Mauvaise version du protocole client. Could not connect to JACK server as client. - %1 Please check the messages window for more info. Impossible de connecter le serveur JACK comme client. - %1 Veuillez consulter la fenĆŖtre des messages pour plus d'informations. %1 (%2%) %1 (%2%) %1 (%2%, %3 xruns) %1 (%2%, %3 xruns) %1 % %1 % %1 Hz %1 Hz %1 frames %1 Ć©chantillons %1 msec %1 ms S&ession S&ession &Load... &Charger… &Save... &Enregistrer… Save and &Quit... Enregistrer et &Quitter… Save &Template... Enregistrer &modĆØle… D-BUS: SetParameterValue('%1', '%2'): %3. (%4) D-BUS : SetParameterValue('%1', '%2') : %3. (%4) D-BUS: ResetParameterValue('%1'): %2. (%3) D-BUS : ResetParameterValue('%1') : %2. (%3) D-BUS: GetParameterValue('%1'): %2. (%3) D-BUS : GetParameterValue('%1') : %2. (%3) Could not open ALSA sequencer as a client. ALSA MIDI patchbay will be not available. Impossible d'ouvrir le sequenceur ALSA comme client. La baie de brassage ALSA MIDI ne sera pas disponible. JACK active patchbay scan Balayage de la baie de brassage JACK active ALSA active patchbay scan Balayage de la baie de brassage ALSA active A patchbay definition is currently active, which is probable to redo this connection: %1 -> %2 Do you want to remove the patchbay connection? Une dĆ©finition de baie de brassage est actuellement active, il est probable que cela refasse cette connexion : %1 -> %2 Voulez-vous enlever la connexion de la baie de brassage ? qjackctlMessagesStatusForm Messages / Status - JACK Audio Connection Kit Messages / Statut - Kit de Connexion Audio JACK &Messages &Messages Messages log Journal des messages Messages output log Journal des messages de sortie &Status &Statut Status information Information de statut Statistics since last server startup Statistiques depuis le dernier dĆ©marrage du serveur Description Description Value Valeur Reset XRUN statistic values RĆ©initialiser les valeurs statistiques des dĆ©synchronisations (XRUN) Re&set RĆ©initiali&ser Refresh XRUN statistic values RafraĆ®chir les valeurs statistiques des dĆ©synchronisations (XRUN) &Refresh &RafraĆ®chir Server name Nom du serveur Server state Ɖtat du serveur DSP Load Charge DSP Sample Rate FrĆ©quence d'Ć©chantillonnage Buffer Size Taille du tampon Realtime Mode Mode temps rĆ©el Transport state Ɖtat du dĆ©placement Transport Timecode Code temporel (Timecode) du dĆ©placement Transport BBT MTB du dĆ©placement Transport BPM BPM du dĆ©placement XRUN count since last server startup DĆ©compte des dĆ©synchronisations (XRUN) depuis le dernier dĆ©marrage du serveur XRUN last time detected Horaire de la derniĆØre dĆ©synchronisation (XRUN) dĆ©tectĆ©e XRUN last DerniĆØre dĆ©synchronisation (XRUN) XRUN maximum Nombre maximal de dĆ©synchronisation (XRUN) XRUN minimum Nombre minimal de dĆ©synchronisation (XRUN) XRUN average Moyenne de dĆ©synchronisation (XRUN) XRUN total Nombre total de dĆ©synchronisation (XRUN) Maximum scheduling delay DĆ©lai d'ordonnancement maximal Time of last reset Temps depuis la derniĆØre rĆ©initialisation Logging stopped --- %1 --- Journalisation arrĆŖtĆ©e --- %1 --- Logging started --- %1 --- Journalisation dĆ©marrĆ©e --- %1 --- qjackctlPatchbay Warning Attention This will disconnect all sockets. Are you sure? Cela va dĆ©connecter toutes les prises. Êtes-vous certain ? qjackctlPatchbayForm Patchbay - JACK Audio Connection Kit Baie de brassage - Kit de Connexion Audio JACK &New &Nouveau Create a new patchbay profile CrĆ©er un nouveau profil de baie de brassage &Load... &Charger… Load patchbay profile Charger un profil de baie de brassage &Save... &Enregistrer… Save current patchbay profile Enregistrer le profil actuel de la baie de brassage Expand all items Afficher tous les Ć©lĆ©ments E&xpand All &Afficher tout Current (recent) patchbay profile(s) Profil(s) actuel(s) (rĆ©cent(s)) de la baie de brassage Acti&vate Acti&ver Toggle activation of current patchbay profile Basculer l'activation du profil actuel de baie de brassage &Connect &Connecter Connect currently selected sockets Connecter les prises actuellement sĆ©lectionnĆ©es &Disconnect &DĆ©connecter Disconnect currently selected sockets DĆ©connecter les prises actuellement sĆ©lectionnĆ©es Disconnect &All &Tout dĆ©connecter Disconnect all currently connected sockets DĆ©connecter les prises actuellement connectĆ©es &Refresh &RafraĆ®chir Refresh current patchbay view RafraĆ®chir la vue actuelle de la baie de brassage Down Vers le bas Move currently selected output socket down one position DĆ©placer d'une position vers le bas la prise de sortie actuellement sĆ©lectionnĆ©e Add... Ajouter… Create a new output socket CrĆ©er une nouvelle prise de sortie Edit... Ɖditer… Edit currently selected input socket properties Ɖditer les propriĆ©tĆ©s de la prise d'entrĆ©e actuellement sĆ©lectionnĆ©e Up Vers le haut Move currently selected output socket up one position DĆ©placer d'une position vers le haut la prise de sortie actuellement sĆ©lectionnĆ©e Remove Enlever Remove currently selected output socket Enlever la prise de sortie actuellement sĆ©lectionnĆ©e Copy... Copier… Duplicate (copy) currently selected output socket Dupliquer (copier) la prise de sortie actuellement sĆ©lectionnĆ©e Remove currently selected input socket Enlever la prise d'entrĆ©e actuellement sĆ©lectionnĆ©e Duplicate (copy) currently selected input socket Dupliquer (copier) la prise d'entrĆ©e actuellement sĆ©lectionnĆ©e Create a new input socket CrĆ©er une nouvelle prise d'entrĆ©e Edit currently selected output socket properties Ɖditer les propriĆ©tĆ©s de la prise de sortie actuellement sĆ©lectionnĆ©e Warning Attention Error Erreur New Patchbay definition Nouvelle dĆ©finition de baie de brassage Patchbay Definition files Fichiers de dĆ©finition de baie de brassage Load Patchbay Definition Charger une dĆ©finition de baie de brassage Save Patchbay Definition Enregistrer la dĆ©finition de baie de brassage active actif The patchbay definition has been changed: "%1" Do you want to save the changes? La dĆ©finition de baie de brassage a Ć©tĆ© changĆ©e : Ā« %1 Ā» Voulez-vous enregistrer les changements ? %1 [modified] %1 [modifiĆ©] Untitled%1 SansTitre%1 Could not load patchbay definition file: "%1" Impossible de charger le fichier de dĆ©finition de baie de brassage : Ā« %1 Ā» Could not save patchbay definition file: "%1" Impossible d'enregistrer le fichier de dĆ©finition de baie de brassage : Ā« %1 Ā» Create patchbay definition as a snapshot of all actual client connections? Prendre un clichĆ© de toutes les connexions clientes actuelles pour crĆ©er une dĆ©finition de baie de brassage ? qjackctlPatchbayView Add... Ajouter… Edit... Ɖditer… Copy... Copier… Remove Enlever Exclusive Exclusif (None) (Aucun) Forward Renvoi Move Up Vers le haut Move Down Vers le bas &Connect &Connecter Alt+C Connect Alt+C &Disconnect &DĆ©connecter Alt+D Disconnect Alt+D Disconnect &All &Tout dĆ©connecter Alt+A Disconect All Alt+T &Refresh &RafraĆ®chir Alt+R Refresh Alt+R qjackctlSessionForm Session - JACK Audio Connection Kit Session - Kit de Connexion Audio JACK Load session Charger session &Load... &Charger… Recent session Session rĆ©cente &Recent &RĆ©cente Save session Enregistrer session Save session versioning Enregistrer la session avec gestion de rĆ©visions &Versioning Gestion de rĆ©&visions Re&fresh Ra&fraĆ®chir Session clients / connections Clients / connexions de la session Infra-clients / commands Commandes / clients-infra Infra-client Client-infra Infra-command Commande-infra Add infra-client Ajouter un client-infra &Add &Ajouter Edit infra-client Modifier un client-infra &Edit Modifi&er Remove infra-client Supprimer un client-infra Re&move Suppri&mer &Save... &Enregistrer… Update session Mettre Ć  jour la session Client / Ports Clients / Ports UUID UUID Command Commande &Save &Enregistrer Load Session Charger session Session directory RĆ©pertoire de session Save Session Enregistrer session and Quit et quitter Template ModĆØle &Clear &Effacer Warning Attention A session could not be found in this folder: "%1" Impossible de trouver une session dans ce dossier : Ā« %1 Ā» %1: loading session... %1 : chargement de la session… %1: load session %2. %1 : charger session %2. A session already exists in this folder: "%1" Are you sure to overwrite the existing session? Il existe dĆ©jĆ  une session dans ce dossier : Ā« %1 Ā» Êtes-vous certain de vouloir remlplacer la session existante ? This folder already exists and is not empty: "%1" Are you sure to overwrite the existing folder? Ce dossier existe dĆ©jĆ  et n'est pas vide : Ā« %1 Ā» Êtes-vous certain de vouloir remplacer le dossier existant ? %1: saving session... %1 : enregistrement de la session… %1: save session %2. %1 : enregistrer session %2. New Client Nouveau client Save and &Quit... Enregistrer et &Quitter… Save &Template... Enregistrer &modĆØle… qjackctlSessionInfraClientItemEditor Infra-command Commande-infra qjackctlSetupForm Setup - JACK Audio Connection Kit RĆ©glages - Kit de Connexion Audio JACK Settings ParamĆØtres Preset &Name: &Nom du prĆ©rĆ©glage : (default) (par dĆ©faut) Settings preset name Nom du prĆ©rĆ©glage des paramĆØtres &Save &Enregistrer Save settings as current preset name Enregistrer les paramĆØtres sous le nom du prĆ©rĆ©glage actuel &Delete E&ffacer Delete current settings preset Effacer le prĆ©rĆ©glage des paramĆØtres actuel jackstart jackstart jackd jackd Driv&er: Pilot&e : dummy factice oss oss alsa alsa portaudio portaudio coreaudio coreaudio freebob freebob Parameters ParamĆØtres Number of periods in the hardware buffer Nombre de pĆ©riodes dans le tampon matĆ©riel Priorit&y: Pri&oritĆ© : &Frames/Period: &Ɖchantillons/PĆ©riode : 16 16 32 32 64 64 128 128 256 256 512 512 1024 1024 2048 2048 4096 4096 Frames per period between process() calls Ɖchantillons par pĆ©riode entre appels de process() Port Ma&ximum: Nombre de port ma&ximal : 21333 21333 22050 22050 32000 32000 44100 44100 48000 48000 88200 88200 96000 96000 192000 192000 Sample rate in frames per second FrĆ©quence d'Ć©chantillonage en Ć©chantillons par seconde Scheduler priority when running realtime PrioritĆ© de l'ordonnanceur quand fonctionne en temps rĆ©el &Word Length: &RĆ©solution (bit) : Periods/&Buffer: PĆ©riodes/&Tampon : Word length RĆ©solution Maximum number of ports the JACK server can manage Nombre maximal de ports que peut gĆ©rer le serveur JACK &Wait (usec): &Attente (en µs) : Sample &Rate: &FrĆ©quence d'Ć©chantillonnage (Hz) : &Timeout (msec): &DĆ©compte (en ms) : 200 200 500 500 1000 1000 2000 2000 5000 5000 10000 10000 Set client timeout limit in miliseconds RĆ©gler le limite du dĆ©compte client en millisecondes &Realtime Temps &rĆ©el Use realtime scheduling Utiliser ordonnancement temps rĆ©el No Memory Loc&k P&as de verrouillage mĆ©moire Do not attempt to lock memory, even if in realtime mode Ne pas essayer de verrouiller la mĆ©moire mĆŖme en mode temps-rĆ©el &Unlock Memory &DĆ©verrouiller la mĆ©moire Unlock memory of common toolkit libraries (GTK+, QT, FLTK, Wine) DĆ©verrouiller la mĆ©moire des bibliothĆØques d'interface communes (GTK+, QT, FLTK, Wine) So&ft Mode Mode &logiciel Ignore xruns reported by the backend driver Ignorer les dĆ©synchronisations (XRUN) rapportĆ©es par le pilote principal &Monitor &Ɖcoute de contrĆ“le Provide output monitor ports Fournir des ports de sortie d'Ć©coute de contrĆ“le Force &16bit Forcer &16bit Force 16bit mode instead of failing over 32bit (default) Forcer mode 16bit au lieu d'Ć©chouer sur 32bit (par dĆ©faut) H/W M&onitor Ɖc&oute de contrĆ“le matĆ©rielle Enable hardware monitoring of capture ports Activer l'Ć©coute de contrĆ“le matĆ©rielle des ports de capture H/&W Meter Mes&ure matĆ©rielle Enable hardware metering on cards that support it Activer la mesure matĆ©rielle sur les cartes qui la prennent en charge &Ignore H/W &Ignorer matĆ©riel Ignore hardware period/buffer size Ignore la taille des pĆ©riode/tampon matĆ©riels &Output Device: PĆ©riphĆ©rique de s&ortie : &Interface: &Interface : Maximum input audio hardware channels to allocate Nombre maximal de canaux d'entrĆ©e audio matĆ©riels Ć  allouer &Audio: &Audio : Dit&her: Bruit de dispertion (dit&her) : External output latency (frames) Latence de sortie externe (en Ć©chantillons) &Input Device: PĆ©r&iphĆ©rique d'entrĆ©e : Duplex Duplex Capture Only Capture seulement Playback Only Reproduction seulement Provide either audio capture, playback or both Fournir la capture audio, la reproduction audio ou les deux hw:0 hw:0 The PCM device name to use Nom du pĆ©riphĆ©rique PCM Ć  utiliser > > &Name: &Nom : The JACK Audio Connection Kit sound server name Le nom du serveur de son du Kit de Connexion Audio JACK /dev/dsp /dev/dsp Alternate input device for capture PĆ©riphĆ©rique d'entrĆ©e alternatif pour la capture Maximum output audio hardware channels to allocate Nombre maximal de canaux de sortie audio matĆ©riels Ć  allouer Alternate output device for playback PĆ©riphĆ©rique de sortie alternatif pour la reproduction External input latency (frames) Latence d'entrĆ©e externe (en Ć©chantillons) None Aucun Rectangular Rectangulaire Shaped SinusoĆÆdal Triangular Triangulaire Set dither mode RĆ©gler le mode du bruit de dispersion (dither) Whether to give verbose output on messages Donner une sortie bavarde sur les messages Time in seconds that client is delayed after server startup Temps en secondes dont le client est retardĆ© aprĆØs le dĆ©marrage du serveur Latency: Latence : Output latency in milliseconds, calculated based on the period, rate and buffer settings Latence de sortie en millisecondes calculĆ©e Ć  partir des rĆ©glages de la pĆ©riode, de la frĆ©quence d'Ć©chantillonnage et du tampon Options Options Scripting Scripts Execute script on Start&up: ExĆ©c&uter un script au dĆ©marrage : Whether to execute a custom shell script before starting up the JACK audio server. ExĆ©cuter un script de commande personnalisĆ© avant de dĆ©marrer le serveur audio JACK. Execute script after &Startup: ExĆ©cuter un &script aprĆØs le dĆ©marrage : Whether to execute a custom shell script after starting up the JACK audio server. ExĆ©cuter un script de commande personnalisĆ© aprĆØs avoir dĆ©marrĆ© le serveur audio JACK. Execute script on Shut&down: ExĆ©cuter un script Ć  l'extinctio&n : Whether to execute a custom shell script before shuting down the JACK audio server. ExĆ©cuter un script de commande personnalisĆ© avant d'Ć©teindre le serveur audio JACK. Command line to be executed before starting up the JACK audio server Ligne de commande Ć  exĆ©cuter avant de dĆ©marrer le serveur audio JACK Scripting argument meta-symbols MĆ©ta-symboles des arguments de script ... … Browse for script to be executed before starting up the JACK audio server Pointer sur le script Ć  exĆ©cuter avant de dĆ©marrer le serveur audio JACK Command line to be executed after starting up the JACK audio server Ligne de commande Ć  exĆ©cuter aprĆØs avoir dĆ©marrĆ© le serveur audio JACK Browse for script to be executed after starting up the JACK audio server Pointer sur le script Ć  exĆ©cuter aprĆØs avoir dĆ©marrĆ© le serveur audio JACK Browse for script to be executed before shutting down the JACK audio server Pointer sur le script Ć  exĆ©cuter avant d'Ć©teindre le serveur audio JACK Command line to be executed before shutting down the JACK audio server Ligne de commande Ć  exĆ©cuter avant d'Ć©teindre le serveur audio JACK Execute script after Shu&tdown: ExĆ©cuter un script aprĆØs l'ex&tinction : Whether to execute a custom shell script after shuting down the JACK audio server. ExĆ©cuter un script de commande personnalisĆ© aprĆØs avoir Ć©teint le serveur audio JACK. Browse for script to be executed after shutting down the JACK audio server Pointer sur le script Ć  exĆ©cuter aprĆØs avoir Ć©teint le serveur audio JACK Command line to be executed after shutting down the JACK audio server Ligne de commande Ć  exĆ©cuter aprĆØs avoir Ć©teint le serveur audio JACK Statistics Statistiques &Capture standard output &Capturer la sortie standard Whether to capture standard output (stdout/stderr) into messages window Capturer la sortie standard (stdout/stderr) dans la fenĆŖtre de messages &XRUN detection regex: Regex de dĆ©tection des dĆ©synchronisations (&XRUN) : xrun of at least ([0-9|\.]+) msecs dĆ©synchronisation (XRUN) d'au moins ([0-9|\.]+) ms Regular expression used to detect XRUNs on server output messages Expression rĆ©guliĆØre utilisĆ©e pour dĆ©tecter les dĆ©synchronisations (XRUN) dans les messages de sortie du serveur Connections Connexions 10 10 Patchbay definition file to be activated as connection persistence profile Fichier de dĆ©finition de baie de brassage Ć  activer comme profil de persistance de connexion Browse for a patchbay definition file to be activated Pointer sur un fichier de dĆ©finition de baie de brassage Ć  activer Activate &Patchbay persistence: Activer la &persistance de baie de brassage : Whether to activate a patchbay definition for connection persistence profile. Activer une dĆ©finition de baie de brassage pour le profil de persistance de connexion. Display Affichage Time Display Horloge Time F&ormat: F&ormat du temps : hh:mm:ss hh:mm:ss hh:mm:ss.d hh:mm:ss.d hh:mm:ss.dd hh:mm:ss.dd hh:mm:ss.ddd hh:mm:ss.ddd The general time format on display Format gĆ©nĆ©ral du temps affichĆ© Server Suffi&x: Suffi&xe Serveur : Transport &Time Code Code &temporel (Timecode) du dĆ©placement Transport &BBT (bar:beat.ticks) MT&B (mesure:temps.battement) du dĆ©placement Elapsed time since last &Reset Temps Ć©coulĆ© depuis la derniĆØre &rĆ©initialisation Elapsed time since last &XRUN Temps Ć©coulĆ© depuis la derniĆØre dĆ©synchronisation (&XRUN) Sample front panel normal display font AperƧu de l'affichage normal Sample big time display font AperƧu de la grande horloge Big Time display: Grande horloge : &Font... &Police… Select font for front panel normal display SĆ©lectionner la police pour l'affichage normal Select font for big time display SĆ©lectionner la police pour la grande horloge Normal display: Affichage normal : &Display shiny glass light effect &Afficher un effet de vitre Ć©clairĆ©e brillante Whether to enable a shiny glass light effect on the main display Activer un effet de vitre Ć©clairĆ©e brillante sur l'affichage principal Messages Window FenĆŖtre de messages Sample messages text font display AperƧu de la police du texte des messages Select font for the messages text display SĆ©lectionner la police pour le texte des messages &Messages limit: Limite des &messages : Whether to keep a maximum number of lines in the messages window Garder un nombre maximal de lignes dans la fenĆŖtre de messages 100 100 250 250 2500 2500 The maximum number of message lines to keep in view Nombre maximal de ligne de messages Ć  garder visibles Connections Window FenĆŖtre de connexions Sample connections view font AperƧu de la police de la vue des connexions Select font for the connections view SĆ©lectionner la police pour la vue des connexions &Icon size: Taille des &icĆ“nes : 16 x 16 16 x 16 32 x 32 32 x 32 64 x 64 64 x 64 The icon size for each item of the connections view Taille de l'icĆ“ne pour chaque Ć©lĆ©ment de la vue des connexions Ena&ble client/port aliases editing (rename) Activer l'Ć©&dition (renommage) des aliases de client/port Whether to enable in-place client/port name editing (rename) Activer l'Ć©dition (renommage) en place des aliases de client/port E&nable client/port aliases Activer les aliases de client/p&ort Whether to enable client/port name aliases on the connections window Activer les aliases de client/port dans la fenĆŖtre de connexions Draw connection and patchbay lines as Be&zier curves Dessiner les lignes de connexion et de baie de brassage en courbes de Be&zier Whether to draw connection lines as cubic Bezier curves Dessiner les lignes de connexion et de baie de brassage en courbes de Bezier cubiques Misc Divers Other Autres &Start JACK audio server on application startup &DĆ©marrer le serveur audio JACK au dĆ©marrage de l'application Whether to start JACK audio server immediately on application startup DĆ©marrer le serveur audio JACK immĆ©diatement au dĆ©marrage de l'application &Confirm application close &Confirmer la fermeture de l'application Whether to ask for confirmation on application exit Demander une confirmation lors de la sortie de l'application &Keep child windows always on top &Garder les fenĆŖtres filles au premier plan Whether to keep all child windows on top of the main window Garder les fenĆŖtres filles au dessus de la fenĆŖtre principale &Enable system tray icon Activ&er l'icĆ“ne de notification systĆØme Whether to enable the system tray icon Activer l'icĆ“ne de notification systĆØme S&ave JACK audio server configuration to: &Enregistrer la configuration du serveur audio JACK dans : Whether to save the JACK server command-line configuration into a local file (auto-start) Enregistrer la configuration en ligne de commande du serveur JACK dans un fichier local (dĆ©marrage automatique) .jackdrc .jackdrc The server configuration local file name (auto-start) Nom du fichier local de configuration du serveur (dĆ©marrage automatique) C&onfigure as temporary server C&onfigurer comme serveur temporaire Whether to exit once all clients have closed (auto-start) Sortir dĆØs que tous les clients ont fermĆ© (dĆ©marrage automatique) Confirm server sh&utdown Confirmer l'e&xtinction du serveur Whether to ask for confirmation on JACK audio server shutdown Demander une confirmation Ć  l'extinction du serveur audio JACK Buttons Boutons Hide main window &Left buttons Cacher les boutons de &gauche de la fenĆŖtre principale Whether to hide the left button group on the main window Cacher le groupe de bouton de gauche sur la fenĆŖtre principale Hide main window &Right buttons Cacher les boutons de &droite de la fenĆŖtre principale Whether to hide the right button group on the main window Cacher le groupe de bouton de droite sur la fenĆŖtre principale Hide main window &Transport buttons Cacher les boutons de &dĆ©placement de la fenĆŖtre principale Whether to hide the transport button group on the main window Cacher le groupe de bouton de dĆ©placement sur la fenĆŖtre principale Hide main window &button text labels Cacher le texte des &boutons de la fenĆŖtre principale Whether to hide the text labels on the main window buttons Cacher le texte des boutons sur la fenĆŖtre principale Warning Attention msec ms n/a n/a &Preset Name &Nom du prĆ©rĆ©glage &Server Name Nom du &serveur &Server Path &Chemin du serveur &Driver Pilot&e &Interface &Interface Sample &Rate &FrĆ©quence d'Ć©chantillonnage &Frames/Period &Ɖchantillons/PĆ©riode Periods/&Buffer PĆ©riodes/&Tampon Startup Script Script de dĆ©marrage Post-Startup Script Script post-dĆ©marrage Shutdown Script Script d'extinction Post-Shutdown Script Script post-extinction Patchbay Definition files Fichiers de dĆ©finition de baie de brassage Active Patchbay Definition DĆ©finition de baie de brassage Ć  activer The audio backend driver interface to use Le pilote d'interface audio Ć  utiliser &Verbose messages Messages ba&vards MIDI Driv&er: Pilot&e MIDI : none aucun raw brut seq seq The ALSA MIDI backend driver to use Le pilote ALSA MIDI Ć  utiliser jackdmp jackdmp firewire firewire plughw:0 plughw:0 Some settings have been changed: "%1" Do you want to save the changes? Des paramĆØtres ont Ć©tĆ© modifiĆ©s : Ā« %1 Ā» Voulez-vous enregistrer les changements ? Delete preset: "%1" Are you sure? Effacer le prĆ©rĆ©glage : Ā« %1 Ā» Êtes-vous certain ? Some settings have been changed. Do you want to apply the changes? Des paramĆØtres ont Ć©tĆ© modifiĆ©s. Voulez-vous appliquer les changements ? Messages Log Journal des messages Log files Fichiers du journal sun sun netone netone /dev/audio /dev/audio &Channels: &Canaux : Server path (command line prefix) Chemin serveur (prĆ©fixe de ligne de commande) Maximum number of audio channels to allocate Nombre maximal de canaux audio Ć  allouer &Channels I/O: &Canaux E/S : &Latency I/O: &Latence E/S : Logging Journalisation Messages log file Fichier de journal des messages Browse for the messages log file location Pointer sur l'emplacement du fichier de journal des messages Whether to activate a messages logging to file. Activer la journalisation des messages dans un fichier. Server &Prefix: &PrĆ©fixe Serveur : Extra driver options (command line suffix) Options supplĆ©mentaires du pilote (Suffixe de ligne de commande) Start De&lay: &Retard du dĆ©marrage : secs s 0 msecs 0 ms Please do not touch these settings unless you know what you are doing. Veuillez ne pas toucher ces rĆ©glages si vous ne savez pas ce que vous faites. &Messages log file: Fichier de journal des &messages : Whether to enable blinking (flashing) of the server mode (RT) indicator Activer le clignotement de l'indicateur de mode serveur (TR) Blin&k server mode indicator &Clignotement de l'indicateur de mode serveur &JACK client/port aliases: Alias de client/port &JACK : JACK client/port aliases display mode Mode d'affichage des alias de client/port JACK Default Par dĆ©faut First Premier Second DeuxiĆØme JACK client/port pretty-name (metadata) display mode Activer le mode d'affichage Ā« joli-nom Ā» (mĆ©tadonnĆ©es) de client/port JACK Advanced AvancĆ© Whether to reset all connections when a patchbay definition is activated. RĆ©initialiser ou non toutes les connexions quand une dĆ©finition de baie de brassage est activĆ©e. &Reset all connections on patchbay activation &RĆ©initialiser toutes les connections Ć  l'activation d'une baie de brassage Whether to issue a warning on active patchbay port disconnections. Afficher ou non une alerte lors des dĆ©connexions de port faisant partie d'une baie de brassage active. &Warn on active patchbay disconnections A&lerter lors des dĆ©connexions sur la baie de brassage active Enable JA&CK client/port pretty-names (metadata) Activer les Ā« jolis-noms Ā» (mĆ©tadonnĆ©es) de client/port JA&CK Whether to show system tray message on main window close Afficher on non les messages de la zone de notification systĆØme lors de la fermeture de la fenĆŖtre principale Sho&w system tray message on close A&fficher les messages de la zone de notification lors de la fermeture de la fenĆŖtre Whether to restrict to one single application instance (X11) Restreindre Ć  une seule instance de l'application (X11) Single application &instance &Instance d'application unique Whether to enable ALSA Sequencer (MIDI) support on startup Activer la prise en charge du sĆ©quenceur ALSA (MIDI) au dĆ©marrage E&nable ALSA Sequencer support Activer la prise e&n charge du sĆ©quenceur ALSA Whether to enable JACK D-Bus interface &Enable JACK D-Bus interface Whether to stop JACK audio server on application exit ArrĆŖter le serveur audio JACK lors de la sortie de l'application S&top JACK audio server on application exit ArrĆŖter le &serveur audio JACK lors de la sortie de l'application Defaults Par dĆ©faut &Base font size: Taille de police de &base : Base application font size (pt.) Taille de base de police de l'application (pt.) 6 6 7 7 8 8 9 9 11 11 12 12 net net Whether to enable D-Bus interface Activer l'interface D-Bus &Enable D-Bus interface Activ&er l'interface D-Bus Number of microseconds to wait between engine processes (dummy) Nombre de microsecondes Ć  attendre entre les traitements du moteur (factice) qjackctlSocketForm Socket - JACK Audio Connection Kit Prise - Kit de Connexion Audio JACK &Socket &Prise &Name (alias): &Nom (alias) : Socket name (an alias for client name) Nom de la prise (un alias pour le nom du client) Client name (regular expression) Nom du client (expression rĆ©guliĆØre) Add P&lug Ajouter une &fiche Add plug to socket plug list Ajouter la fiche Ć  la liste des prises &Plug: &Fiche : Port name (regular expression) Nom du port (expression rĆ©guliĆØre) Socket Plugs / Ports Prises / Ports Socket plug list Liste des prises &Edit &Ɖditer &Remove Enleve&r Remove currently selected plug from socket plug list Enlever la fiche actuellement sĆ©lectionnĆ©e de la liste des prises &Client: &Client : &Down Vers le &bas &Up Vers le &haut E&xclusive E&xclusif Enforce only one exclusive cable connection S'assurer de l'utilisation d'une seule connexion cablĆ©e exclusive &Forward: Renvo&i : Forward (clone) all connections from this socket Renvoyer (cloner) toutes les connexions depuis cette prise Type Type &Audio &Audio Audio socket type (JACK) Type de prise audio (JACK) &MIDI &MIDI MIDI socket type (ALSA) Type de prise MIDI (ALSA) Plugs / Ports Fiches / Ports Add Plug Ajouter une Fiche Remove Enlever Edit Ɖditer Error Erreur A socket named "%1" already exists. Une prise nommĆ©e Ā« %1 Ā» existe dĆ©jĆ . Move Up Vers le haut Move Down Vers le bas (None) (Aucun) Edit currently selected plug Ɖditer la fiche actuellement sĆ©lectionnĆ©e Move down currently selected plug in socket plug list DĆ©placer vers le bas la fiche actuellement sĆ©lectionnĆ©e dans la liste des prises Move up current selected plug in socket plug list DĆ©placer vers le haut la fiche actuellement sĆ©lectionnĆ©e dans la liste des prises Warning Attention Some settings have been changed. Do you want to apply the changes? Des paramĆØtres ont Ć©tĆ© modifiĆ©s. Voulez-vous appliquer les changements ? MIDI socket type (JACK) Type de prise MIDI (JACK) AL&SA AL&SA qjackctlSocketList Output Sortie Input EntrĆ©e Socket Prise Warning Attention <New> - %1 <Nouvelle> - %1 %1 about to be removed: "%2" Are you sure? %1 est sur le point d'ĆŖtre enlevĆ©e : Ā« %2 Ā» Êtes-vous certain ? %1 <Copy> - %2 %1 <Copie> - %2 qjackctlSocketListView Output Sockets / Plugs Prises/Fiches de Sortie Input Sockets / Plugs Prises/Fiches d'EntrĆ©e qjackctl-0.4.2/src/PaxHeaders.14935/qjackctlInterfaceComboBox.h0000644000000000000000000000013212700760152021061 xustar0030 mtime=1459871850.618907789 30 atime=1459871850.618907789 30 ctime=1459871850.618907789 qjackctl-0.4.2/src/qjackctlInterfaceComboBox.h0000644000175000001440000000364012700760152021630 0ustar00rncbcusers00000000000000// qjackctlInterfaceComboBox.h // /**************************************************************************** Copyright (C) 2013, Arnout Engelen. All rights reserved. Copyright (C) 2003-2013, rncbc aka Rui Nuno Capela. All rights reserved. Copyright (C) 2015, Kjetil Matheussen. (portaudio_probe_thread) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. *****************************************************************************/ #ifndef __qjackctlInterfaceComboBox_h #define __qjackctlInterfaceComboBox_h #include // Forward decls. class qjackctlSetup; class QStandardItemModel; //---------------------------------------------------------------------------- // Combobox for device interfaces class qjackctlInterfaceComboBox : public QComboBox { public: // Constructor. qjackctlInterfaceComboBox(QWidget *pPrent = 0); void setup(QComboBox *pDriverComboBox, int iAudio, const QString& sDefName); protected: void clearCards(); void addCard(const QString& sName, const QString& sDescription); void populateModel(); void showPopup(); QStandardItemModel *model() const; private: QComboBox *m_pDriverComboBox; int m_iAudio; QString m_sDefName; }; #endif // __qjackctlInterfaceComboBox_h // end of qjackctlInterfaceComboBox.h qjackctl-0.4.2/src/PaxHeaders.14935/qjackctlAbout.h0000644000000000000000000000013212700760152016602 xustar0030 mtime=1459871850.616906788 30 atime=1459871850.616906788 30 ctime=1459871850.616906788 qjackctl-0.4.2/src/qjackctlAbout.h0000644000175000001440000000312412700760152017346 0ustar00rncbcusers00000000000000// qjackctlAbout.h // /**************************************************************************** Copyright (C) 2003-2016, rncbc aka Rui Nuno Capela. All rights reserved. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. *****************************************************************************/ #ifndef __qjackctlAbout_h #define __qjackctlAbout_h #include "config.h" #define QJACKCTL_TITLE PACKAGE_NAME #define QJACKCTL_VERSION PACKAGE_VERSION #define QJACKCTL_SUBTITLE0 "JACK" #define QJACKCTL_SUBTITLE1 QJACKCTL_SUBTITLE0 " Audio Connection Kit" #define QJACKCTL_SUBTITLE2 "Qt GUI Interface" #define QJACKCTL_SUBTITLE QJACKCTL_SUBTITLE1 " - " QJACKCTL_SUBTITLE2 #define QJACKCTL_WEBSITE "http://qjackctl.sourceforge.net" #define QJACKCTL_COPYRIGHT "Copyright (C) 2003-2016, rncbc aka Rui Nuno Capela. All rights reserved." #define QJACKCTL_DOMAIN "rncbc.org" #endif // __qjackctlAbout_h // end of qjackctlAbout.h qjackctl-0.4.2/src/PaxHeaders.14935/qjackctlSetupForm.ui0000644000000000000000000000013212700760152017642 xustar0030 mtime=1459871850.626911789 30 atime=1459871850.626911789 30 ctime=1459871850.626911789 qjackctl-0.4.2/src/qjackctlSetupForm.ui0000644000175000001440000042263512700760152020422 0ustar00rncbcusers00000000000000 rncbc aka Rui Nuno Capela JACK Audio Connection Kit - Qt GUI Interface. Copyright (C) 2003-2016, rncbc aka Rui Nuno Capela. All rights reserved. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. S1ee the GNU General Public License for more details. with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. qjackctlSetupForm 0 0 640 520 Setup - JACK Audio Connection Kit :/images/setup1.png true false 0 Settings 4 4 Preset &Name: false PresetComboBox 0 0 Settings preset name true (default) Save settings as current preset name &Save :/images/save1.png false Delete current settings preset &Delete :/images/remove1.png false 0 Parameters 50 false Driv&er: Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter false DriverComboBox 50 false The audio backend driver interface to use false dummy sun oss alsa portaudio coreaudio freebob firewire net netone Qt::Horizontal 8 20 50 false &Interface: Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter false InterfaceComboBox 140 0 50 false The PCM device name to use true (default) hw:0 plughw:0 /dev/audio /dev/dsp Qt::Horizontal 8 20 50 false MIDI Driv&er: Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter false MidiDriverComboBox 80 0 50 false The ALSA MIDI backend driver to use false none raw seq 50 false Use realtime scheduling &Realtime 50 false QFrame::NoFrame QFrame::Plain Sample &Rate: Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter false SampleRateComboBox 50 false Sample rate in frames per second true 22050 32000 44100 48000 88200 96000 192000 Qt::Horizontal 8 20 50 false &Frames/Period: Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter false FramesComboBox 50 false Frames per period between process() calls true 16 32 64 128 256 512 1024 2048 4096 50 false Periods/&Buffer: Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter false PeriodsSpinBox 50 false Number of periods in the hardware buffer 2 999 Qt::Vertical 20 8 50 false Whether to give verbose output on messages &Verbose messages Qt::Horizontal 8 20 50 false QFrame::NoFrame QFrame::Plain Latency: Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter false 72 0 50 false Output latency in milliseconds, calculated based on the period, rate and buffer settings QFrame::StyledPanel QFrame::Sunken 0 msecs Qt::AlignCenter false Advanced Please do not touch these settings unless you know what you are doing. 8 50 false Server &Prefix: false ServerPrefixComboBox 0 0 50 false Server path (command line prefix) true jackd jackdmp jackstart 50 false &Name: Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter false ServerNameComboBox 120 0 50 false The JACK Audio Connection Kit sound server name true (default) Qt::Vertical 20 8 50 false Do not attempt to lock memory, even if in realtime mode No Memory Loc&k 50 false Unlock memory of common toolkit libraries (GTK+, QT, FLTK, Wine) &Unlock Memory 50 false Enable hardware metering on cards that support it H/&W Meter 50 false Provide output monitor ports &Monitor 50 false Ignore xruns reported by the backend driver So&ft Mode 50 false Enable hardware monitoring of capture ports H/W M&onitor 50 false Force 16bit mode instead of failing over 32bit (default) Force &16bit 50 false Ignore hardware period/buffer size &Ignore H/W Qt::Horizontal 8 20 50 false Maximum number of audio channels to allocate (default) 999 Sans Serif 50 false false Number of microseconds to wait between engine processes (dummy) true 21333 50 false QFrame::NoFrame QFrame::Plain Priorit&y: Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter false PrioritySpinBox 50 false Set client timeout limit in miliseconds true 1 200 500 1000 2000 5000 10000 50 false Port Ma&ximum: Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter false PortMaxComboBox 50 false &Channels: Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter false 0 ChanSpinBox 50 false false Word length true 16 32 64 50 false &Wait (usec): Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter false WaitComboBox 50 false false QFrame::NoFrame QFrame::Plain &Timeout (msec): Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter false TimeoutComboBox 60 0 50 false Maximum number of ports the JACK server can manage true 1 128 256 512 1024 50 false &Word Length: Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter false WordLengthComboBox 50 false Scheduler priority when running realtime (default) 1 5 99 Qt::Horizontal 8 20 50 false &Audio: Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter false AudioComboBox 0 0 50 false Provide either audio capture, playback or both Duplex Capture Only Playback Only 50 false QFrame::NoFrame QFrame::Plain Dit&her: Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter false DitherComboBox 0 0 50 false Set dither mode None Rectangular Shaped Triangular 50 false &Output Device: Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter false OutDeviceComboBox 50 false Alternate output device for playback true (default) hw:0 plughw:0 /dev/audio /dev/dsp 50 false &Input Device: Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter false InDeviceComboBox 50 false Alternate input device for capture true (default) hw:0 plughw:0 /dev/audio /dev/dsp 50 false &Channels I/O: Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter false InChannelsSpinBox 0 0 80 0 50 false Maximum input audio hardware channels to allocate (default) 999 0 0 80 0 50 false Maximum output audio hardware channels to allocate (default) 999 50 false &Latency I/O: Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter false InLatencySpinBox 0 0 80 0 50 false External input latency (frames) (default) 9999999 0 0 80 0 50 false External output latency (frames) (default) 9999999 Qt::Vertical 20 8 Qt::Vertical 20 8 50 false Server Suffi&x: false ServerSuffixComboBox 0 0 50 false Extra driver options (command line suffix) true 50 false Start De&lay: Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter false StartDelaySpinBox 50 false Time in seconds that client is delayed after server startup secs 0 999 Options 75 true Scripting true 8 4 50 false Whether to execute a custom shell script before starting up the JACK audio server. Execute script on Start&up: 50 false Whether to execute a custom shell script after starting up the JACK audio server. Execute script after &Startup: 50 false Whether to execute a custom shell script before shuting down the JACK audio server. Execute script on Shut&down: 0 0 50 false Command line to be executed before starting up the JACK audio server true 22 22 24 24 50 false Qt::TabFocus Scripting argument meta-symbols > 22 22 24 24 50 false Qt::TabFocus Browse for script to be executed before starting up the JACK audio server ... 0 0 50 false Command line to be executed after starting up the JACK audio server true 22 22 24 24 50 false Qt::TabFocus Scripting argument meta-symbols > 22 22 24 24 50 false Qt::TabFocus Browse for script to be executed after starting up the JACK audio server ... 22 22 24 24 50 false Qt::TabFocus Scripting argument meta-symbols > 22 22 24 24 50 false Qt::TabFocus Browse for script to be executed before shutting down the JACK audio server ... 0 0 50 false Command line to be executed before shutting down the JACK audio server true 50 false Whether to execute a custom shell script after shuting down the JACK audio server. Execute script after Shu&tdown: 22 22 24 24 50 false Qt::TabFocus Scripting argument meta-symbols > 22 22 24 24 50 false Qt::TabFocus Browse for script to be executed after shutting down the JACK audio server ... 0 0 50 false Command line to be executed after shutting down the JACK audio server true 75 true Statistics true 8 4 50 false Whether to capture standard output (stdout/stderr) into messages window &Capture standard output 50 false &XRUN detection regex: false XrunRegexComboBox 0 0 50 false Regular expression used to detect XRUNs on server output messages true xrun of at least ([0-9|\.]+) msecs 75 true Connections true 50 false Whether to activate a patchbay definition for connection persistence profile. Activate &Patchbay persistence: 0 0 50 false Patchbay definition file to be activated as connection persistence profile true 22 22 24 24 50 false Qt::TabFocus Browse for a patchbay definition file to be activated ... 50 false Whether to reset all connections when a patchbay definition is activated. &Reset all connections on patchbay activation 50 false Whether to issue a warning on active patchbay port disconnections. &Warn on active patchbay disconnections Qt::Vertical 20 8 75 true Logging true 50 false Whether to activate a messages logging to file. &Messages log file: 0 0 50 false Messages log file true 22 22 24 24 50 false Qt::TabFocus Browse for the messages log file location ... Display 75 true Time Display true 4 4 50 false Transport &Time Code 50 false Transport &BBT (bar:beat.ticks) 50 false Elapsed time since last &Reset 50 false Elapsed time since last &XRUN Qt::Horizontal 8 20 4 4 180 0 260 32767 50 false Sample front panel normal display font true QFrame::StyledPanel QFrame::Sunken Qt::AlignCenter false 180 0 260 32767 50 false Sample big time display font true QFrame::StyledPanel QFrame::Sunken Qt::AlignCenter false 50 false Big Time display: false 50 false Select font for front panel normal display &Font... false 50 false Select font for big time display &Font... false 50 false Normal display: false 50 false Whether to enable a shiny glass light effect on the main display &Display shiny glass light effect 50 false Whether to enable blinking (flashing) of the server mode (RT) indicator Blin&k server mode indicator 4 4 50 false Time F&ormat: Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter false TimeFormatComboBox 50 false The general time format on display false hh:mm:ss hh:mm:ss.d hh:mm:ss.dd hh:mm:ss.ddd 75 true Messages Window true 4 8 180 0 260 16777215 50 false Sample messages text font display true QFrame::StyledPanel QFrame::Sunken Qt::AlignCenter false 50 false Select font for the messages text display &Font... false Qt::Horizontal 8 20 50 false Whether to keep a maximum number of lines in the messages window &Messages limit: 50 false The maximum number of message lines to keep in view true 3 100 250 500 1000 2500 5000 Qt::Vertical 20 8 75 true Connections Window true 180 0 260 16777215 50 false Sample connections view font true QFrame::StyledPanel QFrame::Sunken Qt::AlignCenter false 50 false Select font for the connections view &Font... false Qt::Horizontal 8 20 50 false &Icon size: Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter false ConnectionsIconSizeComboBox 50 false The icon size for each item of the connections view false 0 16 x 16 32 x 32 64 x 64 Qt::Vertical 20 8 50 false Whether to draw connection lines as cubic Bezier curves Draw connection and patchbay lines as Be&zier curves 50 false Whether to enable client/port name aliases on the connections window E&nable client/port aliases 50 false &JACK client/port aliases: Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter false JackClientPortAliasComboBox 50 false JACK client/port aliases display mode false 0 Default First Second 50 false Whether to enable in-place client/port name editing (rename) Ena&ble client/port aliases editing (rename) 50 false JACK client/port pretty-name (metadata) display mode Enable JA&CK client/port pretty-names (metadata) Misc 4 4 75 true Other true 4 4 4 0 50 false Whether to start JACK audio server immediately on application startup &Start JACK audio server on application startup 50 false Whether to ask for confirmation on application exit &Confirm application close 50 false Whether to ask for confirmation on JACK audio server shutdown Confirm server sh&utdown 50 false false Whether to keep all child windows on top of the main window &Keep child windows always on top 50 false Whether to enable the system tray icon &Enable system tray icon 50 false Whether to show system tray message on main window close Sho&w system tray message on close 50 false Whether to restrict to one single application instance (X11) Single application &instance 4 0 50 false Whether to save the JACK server command-line configuration into a local file (auto-start) S&ave JACK audio server configuration to: 50 false The server configuration local file name (auto-start) true .jackdrc 50 false Whether to exit once all clients have closed (auto-start) C&onfigure as temporary server 50 false Whether to enable ALSA Sequencer (MIDI) support on startup E&nable ALSA Sequencer support 50 false Whether to enable D-Bus interface &Enable D-Bus interface 50 false Whether to enable JACK D-Bus interface &Enable JACK D-Bus interface 50 false Whether to stop JACK audio server on application exit S&top JACK audio server on application exit Qt::Vertical 20 8 Qt::Vertical 20 8 75 true Buttons true 4 0 50 false Whether to hide the left button group on the main window Hide main window &Left buttons 50 false Whether to hide the right button group on the main window Hide main window &Right buttons 50 false Whether to hide the transport button group on the main window Hide main window &Transport buttons 50 false Whether to hide the text labels on the main window buttons Hide main window &button text labels Qt::Vertical 20 8 75 true Defaults true 4 4 Qt::Vertical 20 8 50 false &Base font size: Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter BaseFontSizeComboBox 50 false Base application font size (pt.) true (default) 6 7 8 9 10 11 12 Qt::Horizontal QDialogButtonBox::Cancel|QDialogButtonBox::Ok qjackctlInterfaceComboBox QComboBox
qjackctlInterfaceComboBox.h
SetupTabWidget PresetComboBox PresetSavePushButton PresetDeletePushButton SettingsTabWidget DriverComboBox RealtimeCheckBox InterfaceComboBox SampleRateComboBox FramesComboBox PeriodsSpinBox MidiDriverComboBox VerboseCheckBox ServerPrefixComboBox ServerNameComboBox NoMemLockCheckBox UnlockMemCheckBox HWMeterCheckBox MonitorCheckBox SoftModeCheckBox HWMonCheckBox ShortsCheckBox IgnoreHWCheckBox PrioritySpinBox WordLengthComboBox WaitComboBox ChanSpinBox PortMaxComboBox TimeoutComboBox AudioComboBox DitherComboBox OutDeviceComboBox InDeviceComboBox InChannelsSpinBox OutChannelsSpinBox InLatencySpinBox OutLatencySpinBox ServerSuffixComboBox StartDelaySpinBox StartupScriptCheckBox StartupScriptShellComboBox StartupScriptSymbolToolButton StartupScriptBrowseToolButton PostStartupScriptCheckBox PostStartupScriptShellComboBox PostStartupScriptSymbolToolButton PostStartupScriptBrowseToolButton ShutdownScriptCheckBox ShutdownScriptShellComboBox ShutdownScriptSymbolToolButton ShutdownScriptBrowseToolButton PostShutdownScriptCheckBox PostShutdownScriptShellComboBox PostShutdownScriptSymbolToolButton PostShutdownScriptBrowseToolButton StdoutCaptureCheckBox XrunRegexComboBox ActivePatchbayCheckBox ActivePatchbayPathComboBox ActivePatchbayPathToolButton ActivePatchbayResetCheckBox QueryDisconnectCheckBox MessagesLogCheckBox MessagesLogPathComboBox MessagesLogPathToolButton TransportTimeRadioButton TransportBBTRadioButton ElapsedResetRadioButton ElapsedXrunRadioButton TimeFormatComboBox DisplayFont1PushButton DisplayFont2PushButton DisplayEffectCheckBox DisplayBlinkCheckBox MessagesFontPushButton MessagesLimitCheckBox MessagesLimitLinesComboBox ConnectionsFontPushButton ConnectionsIconSizeComboBox BezierLinesCheckBox AliasesEnabledCheckBox AliasesEditingCheckBox JackClientPortAliasComboBox JackClientPortMetadataCheckBox StartJackCheckBox QueryCloseCheckBox QueryShutdownCheckBox KeepOnTopCheckBox SystemTrayCheckBox SystemTrayQueryCloseCheckBox SingletonCheckBox ServerConfigCheckBox ServerConfigNameComboBox ServerConfigTempCheckBox AlsaSeqEnabledCheckBox DBusEnabledCheckBox JackDBusEnabledCheckBox StopJackCheckBox LeftButtonsCheckBox RightButtonsCheckBox TransportButtonsCheckBox TextLabelsCheckBox BaseFontSizeComboBox DialogButtonBox
qjackctl-0.4.2/src/PaxHeaders.14935/qjackctlSessionForm.h0000644000000000000000000000013212700760152017777 xustar0030 mtime=1459871850.623910288 30 atime=1459871850.623910288 30 ctime=1459871850.623910288 qjackctl-0.4.2/src/qjackctlSessionForm.h0000644000175000001440000001144612700760152020551 0ustar00rncbcusers00000000000000// qjackctlSessionForm.h // /**************************************************************************** Copyright (C) 2003-2013, rncbc aka Rui Nuno Capela. All rights reserved. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. *****************************************************************************/ #ifndef __qjackctlSessionForm_h #define __qjackctlSessionForm_h #include "ui_qjackctlSessionForm.h" #include #include // Forward declarations. class qjackctlSession; class qjackctlSetup; class QMenu; class QIcon; class QLineEdit; class QToolButton; //------------------------------------------------------------------------- // qjackctlSessionInfraClientItemEditor class qjackctlSessionInfraClientItemEditor : public QWidget { Q_OBJECT public: // Constructor. qjackctlSessionInfraClientItemEditor( QWidget *pParent, const QModelIndex& index); // Shortcut text accessors. void setText(const QString& sText); QString text() const; // Default (initial) shortcut text accessors. void setDefaultText(const QString& sDefaultText) { m_sDefaultText = sDefaultText; } const QString& defaultText() const { return m_sDefaultText; } signals: void finishSignal(); protected slots: void browseSlot(); void resetSlot(); void finishSlot(); private: // Instance variables. QModelIndex m_index; QLineEdit *m_pItemEdit; QToolButton *m_pBrowseButton; QToolButton *m_pResetButton; QString m_sDefaultText; }; //------------------------------------------------------------------------- // qjackctlSessionInfraClientItemDelegate class qjackctlSessionInfraClientItemDelegate : public QItemDelegate { Q_OBJECT public: // Constructor. qjackctlSessionInfraClientItemDelegate(QObject *pParent = NULL); protected: QWidget *createEditor(QWidget *pParent, const QStyleOptionViewItem& option, const QModelIndex& index) const; void setEditorData(QWidget *pEditor, const QModelIndex &index) const; void setModelData(QWidget *pEditor, QAbstractItemModel *pModel, const QModelIndex& index) const; protected slots: void commitEditor(); }; //---------------------------------------------------------------------------- // qjackctlSessionForm -- UI wrapper form. class qjackctlSessionForm : public QWidget { Q_OBJECT public: // Constructor. qjackctlSessionForm(QWidget *pParent = 0, Qt::WindowFlags wflags = 0); // Destructor. ~qjackctlSessionForm(); // Global setup method. void setup(qjackctlSetup *pSetup); // Maybe ask whether we can close. bool queryClose(); // Recent session directories and save type accessors. const QStringList& sessionDirs() const; bool isSaveSessionVersion() const; // Recent menu accessor. QMenu *recentMenu() const; // Save menu accessor. QMenu *saveMenu() const; void stabilizeForm(bool bEnabled); public slots: void loadSession(); void saveSessionSave(); void saveSessionSaveAndQuit(); void saveSessionSaveTemplate(); void saveSessionVersion(bool); void updateSession(); protected slots: void recentSession(); void updateRecentMenu(); void clearRecentMenu(); void sessionViewContextMenu(const QPoint& pos); void addInfraClient(); void editInfraClient(); void editInfraClientCommit(); void removeInfraClient(); void selectInfraClient(); void updateInfraClients(); void infraClientContextMenu(const QPoint& pos); protected: void showEvent(QShowEvent *); void hideEvent(QHideEvent *); void closeEvent(QCloseEvent *); void keyPressEvent(QKeyEvent *); void saveSessionEx(int iSessionType = 0); void loadSessionDir(const QString& sSessionDir); void saveSessionDir(const QString& sSessionDir, int iSessionType = 0); void updateRecent(const QString& sSessionDir); void updateSessionView(); static QIcon iconStatus(const QIcon& icon, bool bStatus); private: // The Qt-designer UI struct... Ui::qjackctlSessionForm m_ui; // Common (sigleton) session object. qjackctlSession *m_pSession; // Recent session menu. QMenu *m_pRecentMenu; // Save session menu. QMenu *m_pSaveMenu; // Setup options. qjackctlSetup *m_pSetup; // Session directory history. QStringList m_sessionDirs; }; #endif // __qjackctlSessionForm_h // end of qjackctlSessionForm.h qjackctl-0.4.2/src/PaxHeaders.14935/qjackctlMainForm.cpp0000644000000000000000000000013212700760152017573 xustar0030 mtime=1459871850.619908288 30 atime=1459871850.618907789 30 ctime=1459871850.619908288 qjackctl-0.4.2/src/qjackctlMainForm.cpp0000644000175000001440000034511312700760152020346 0ustar00rncbcusers00000000000000// qjackctlMainForm.cpp // /**************************************************************************** Copyright (C) 2003-2015, rncbc aka Rui Nuno Capela. All rights reserved. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. *****************************************************************************/ #include "qjackctlAbout.h" #include "qjackctlMainForm.h" #include "qjackctlStatus.h" #include "qjackctlPatchbay.h" #include "qjackctlPatchbayFile.h" #include "qjackctlMessagesStatusForm.h" #include "qjackctlSessionForm.h" #include "qjackctlConnectionsForm.h" #include "qjackctlPatchbayForm.h" #include "qjackctlSetupForm.h" #include "qjackctlAboutForm.h" #ifdef CONFIG_SYSTEM_TRAY #include "qjackctlSystemTray.h" #endif #include #include #include #include #include #include #include #include #include #include #include #include #include #if defined(WIN32) #include #endif #if QT_VERSION < 0x040500 namespace Qt { const WindowFlags WindowCloseButtonHint = WindowFlags(0x08000000); } #endif #ifdef CONFIG_DBUS #include #include #endif #ifdef CONFIG_JACK_STATISTICS #include #endif #ifdef CONFIG_JACK_METADATA #include #endif // Timer constant stuff. #define QJACKCTL_TIMER_MSECS 200 // Status refresh cycle (~2 secs) #define QJACKCTL_STATUS_CYCLE 10 // Server display enumerated states. #define QJACKCTL_INACTIVE 0 #define QJACKCTL_ACTIVATING 1 #define QJACKCTL_ACTIVE 2 #define QJACKCTL_STARTING 3 #define QJACKCTL_STARTED 4 #define QJACKCTL_STOPPING 5 #define QJACKCTL_STOPPED 6 #if defined(WIN32) #include #undef HAVE_POLL_H #undef HAVE_SIGNAL_H #else #include #include // Notification pipes descriptors #define QJACKCTL_FDNIL -1 #define QJACKCTL_FDREAD 0 #define QJACKCTL_FDWRITE 1 static int g_fdStdout[2] = { QJACKCTL_FDNIL, QJACKCTL_FDNIL }; #endif #ifdef HAVE_POLL_H #include #endif #ifdef HAVE_SIGNAL_H #include #endif // Custom event types. #define QJACKCTL_PORT_EVENT QEvent::Type(QEvent::User + 1) #define QJACKCTL_XRUN_EVENT QEvent::Type(QEvent::User + 2) #define QJACKCTL_BUFF_EVENT QEvent::Type(QEvent::User + 3) #define QJACKCTL_SHUT_EVENT QEvent::Type(QEvent::User + 4) #define QJACKCTL_EXIT_EVENT QEvent::Type(QEvent::User + 5) #ifdef CONFIG_DBUS #define QJACKCTL_LINE_EVENT QEvent::Type(QEvent::User + 6) #endif #ifdef CONFIG_JACK_METADATA #define QJACKCTL_PROP_EVENT QEvent::Type(QEvent::User + 7) #endif //---------------------------------------------------------------------------- // qjackctl -- Static callback posters. // To have clue about current buffer size (in frames). static jack_nframes_t g_nframes = 0; static QProcess::ProcessError g_error = QProcess::UnknownError; // Jack port registration callback funtion, called // whenever a jack port is registered or unregistered. static void qjackctl_port_registration_callback ( jack_port_id_t, int, void * ) { QApplication::postEvent( qjackctlMainForm::getInstance(), new QEvent(QJACKCTL_PORT_EVENT)); } // Jack graph order callback function, called // whenever the processing graph is reordered. static int qjackctl_graph_order_callback ( void * ) { QApplication::postEvent( qjackctlMainForm::getInstance(), new QEvent(QJACKCTL_PORT_EVENT)); return 0; } // Jack XRUN callback function, called // whenever there is a xrun. static int qjackctl_xrun_callback ( void * ) { QApplication::postEvent( qjackctlMainForm::getInstance(), new QEvent(QJACKCTL_XRUN_EVENT)); return 0; } // Jack buffer size function, called // whenever the server changes buffer size. static int qjackctl_buffer_size_callback ( jack_nframes_t nframes, void * ) { // Update our global static variable. g_nframes = nframes; QApplication::postEvent( qjackctlMainForm::getInstance(), new QEvent(QJACKCTL_BUFF_EVENT)); return 0; } // Jack shutdown function, called // whenever the server terminates this client. static void qjackctl_on_shutdown ( void * ) { QApplication::postEvent( qjackctlMainForm::getInstance(), new QEvent(QJACKCTL_SHUT_EVENT)); } // Jack process exit function, called // whenever the server terminates abnormally. static void qjackctl_on_error ( QProcess::ProcessError error ) { g_error = error; QApplication::postEvent( qjackctlMainForm::getInstance(), new QEvent(QJACKCTL_EXIT_EVENT)); } #ifdef CONFIG_DBUS //---------------------------------------------------------------------- // class qjackctlDBusLogWatcher -- Simple D-BUS log watcher thread. // class qjackctlDBusLogWatcher : public QThread { public: // Constructor. qjackctlDBusLogWatcher(const QString& sFilename) : QThread(), m_sFilename(sFilename), m_bRunState(false) {} // Destructor. ~qjackctlDBusLogWatcher() { if (isRunning()) do { m_bRunState = false; } while (!wait(1000)); } // Custom log event. class LineEvent : public QEvent { public: // Constructor. LineEvent(QEvent::Type eType, const QString& sLine) : QEvent(eType), m_sLine(sLine) { m_sLine.remove(QRegExp("\x1B\[[0-9|;]+m")); } // Accessor. const QString& line() const { return m_sLine; } private: // Custom event data. QString m_sLine; }; protected: // The main thread executive. void run() { QFile file(m_sFilename); m_bRunState = true; while (m_bRunState) { if (file.isOpen()) { char achBuffer[1024]; while (file.readLine(achBuffer, sizeof(achBuffer)) > 0) { QApplication::postEvent( qjackctlMainForm::getInstance(), new LineEvent(QJACKCTL_LINE_EVENT, achBuffer)); } if (file.size() == file.pos() && file.error() == QFile::NoError) { msleep(1000); } else { file.close(); } } else if (file.open(QIODevice::ReadOnly | QIODevice::Text)) { file.seek(file.size()); } else msleep(1000); } } private: // The log filename to watch. QString m_sFilename; // Whether the thread is logically running. volatile bool m_bRunState; }; #endif // CONFIG_DBUS #ifdef CONFIG_JACK_METADATA // Jack property change function, called // whenever metadata is changed static void qjackctl_property_change_callback ( jack_uuid_t, const char *key, jack_property_change_t, void * ) { // PRETTY_NAME is the only metadata we are currently interested in... if (qjackctlJackClientList::isJackClientPortMetadata() && key && (strcmp(key, JACK_METADATA_PRETTY_NAME) == 0)) { QApplication::postEvent( qjackctlMainForm::getInstance(), new QEvent(QJACKCTL_PROP_EVENT)); } } #endif //---------------------------------------------------------------------------- // qjackctlMainForm -- UI wrapper form. // Kind of singleton reference. qjackctlMainForm *qjackctlMainForm::g_pMainForm = NULL; // Constructor. qjackctlMainForm::qjackctlMainForm ( QWidget *pParent, Qt::WindowFlags wflags ) : QWidget(pParent, wflags) { #if defined(WIN32) QApplication::setStyle(new QPlastiqueStyle()); #endif // Setup UI struct... m_ui.setupUi(this); // Pseudo-singleton reference setup. g_pMainForm = this; m_pSetup = NULL; m_iServerState = QJACKCTL_INACTIVE; m_pJack = NULL; m_pJackClient = NULL; m_bJackDetach = false; m_bJackShutdown = false; m_bJackStopped = false; m_pAlsaSeq = NULL; #ifdef CONFIG_DBUS m_pDBusControl = NULL; m_pDBusConfig = NULL; m_pDBusLogWatcher = NULL; m_bDBusStarted = false; #endif m_iStartDelay = 0; m_iTimerDelay = 0; m_iTimerRefresh = 0; m_iJackRefresh = 0; m_iAlsaRefresh = 0; m_iJackDirty = 0; m_iAlsaDirty = 0; m_iStatusRefresh = 0; m_iStatusBlink = 0; m_iPatchbayRefresh = 0; #ifdef CONFIG_JACK_METADATA m_iJackPropertyChange = 0; #endif m_pStdoutNotifier = NULL; m_pAlsaNotifier = NULL; // All forms are to be created later on setup. m_pMessagesStatusForm = NULL; m_pSessionForm = NULL; m_pConnectionsForm = NULL; m_pPatchbayForm = NULL; m_pSetupForm = NULL; // Patchbay rack can be readily created. m_pPatchbayRack = new qjackctlPatchbayRack(); #ifdef CONFIG_SYSTEM_TRAY // The eventual system tray widget. m_pSystemTray = NULL; m_bQuitClose = false; #endif // We're not quitting so early :) m_bQuitForce = false; // Transport skip accelerate factor. m_fSkipAccel = 1.0; // Avoid extra transport toggles (play/stop) m_iTransportPlay = 0; // Whether we've Qt::Tool flag (from bKeepOnTop), // this is actually the main last application window... QWidget::setAttribute(Qt::WA_QuitOnClose); #ifdef HAVE_SIGNAL_H // Set to ignore any fatal "Broken pipe" signals. signal(SIGPIPE, SIG_IGN); #endif #if 0 // FIXME: Iterate for every child text label... m_ui.StatusDisplayFrame->setAutoFillBackground(true); QList labels = m_ui.StatusDisplayFrame->findChildren (); QListIterator iter(labels); while (iter.hasNext()) iter.next()->setAutoFillBackground(false); #endif // UI connections... QObject::connect(m_ui.StartToolButton, SIGNAL(clicked()), SLOT(startJack())); QObject::connect(m_ui.StopToolButton, SIGNAL(clicked()), SLOT(stopJack())); QObject::connect(m_ui.MessagesStatusToolButton, SIGNAL(clicked()), SLOT(toggleMessagesStatusForm())); QObject::connect(m_ui.SessionToolButton, SIGNAL(clicked()), SLOT(toggleSessionForm())); QObject::connect(m_ui.ConnectionsToolButton, SIGNAL(clicked()), SLOT(toggleConnectionsForm())); QObject::connect(m_ui.PatchbayToolButton, SIGNAL(clicked()), SLOT(togglePatchbayForm())); QObject::connect(m_ui.QuitToolButton, SIGNAL(clicked()), SLOT(quitMainForm())); QObject::connect(m_ui.SetupToolButton, SIGNAL(clicked()), SLOT(showSetupForm())); QObject::connect(m_ui.AboutToolButton, SIGNAL(clicked()), SLOT(showAboutForm())); QObject::connect(m_ui.RewindToolButton, SIGNAL(clicked()), SLOT(transportRewind())); QObject::connect(m_ui.BackwardToolButton, SIGNAL(clicked()), SLOT(transportBackward())); QObject::connect(m_ui.PlayToolButton, SIGNAL(toggled(bool)), SLOT(transportPlay(bool))); QObject::connect(m_ui.PauseToolButton, SIGNAL(clicked()), SLOT(transportStop())); QObject::connect(m_ui.ForwardToolButton, SIGNAL(clicked()), SLOT(transportForward())); } // Destructor. qjackctlMainForm::~qjackctlMainForm (void) { // Stop server, if not already... #ifdef CONFIG_DBUS if (m_pSetup->bStopJack || !m_pSetup->bJackDBusEnabled) stopJackServer(); if (m_pDBusLogWatcher) delete m_pDBusLogWatcher; if (m_pDBusConfig) delete m_pDBusConfig; if (m_pDBusControl) delete m_pDBusControl; m_pDBusControl = NULL; m_pDBusConfig = NULL; m_pDBusLogWatcher = NULL; m_bDBusStarted = false; #else stopJackServer(); #endif // Terminate local ALSA sequencer interface. if (m_pAlsaNotifier) delete m_pAlsaNotifier; #ifdef CONFIG_ALSA_SEQ if (m_pAlsaSeq) snd_seq_close(m_pAlsaSeq); #endif m_pAlsaNotifier = NULL; m_pAlsaSeq = NULL; // Finally drop any popup widgets around... if (m_pMessagesStatusForm) delete m_pMessagesStatusForm; if (m_pSessionForm) delete m_pSessionForm; if (m_pConnectionsForm) delete m_pConnectionsForm; if (m_pPatchbayForm) delete m_pPatchbayForm; if (m_pSetupForm) delete m_pSetupForm; #ifdef CONFIG_SYSTEM_TRAY // Quit off system tray widget. if (m_pSystemTray) delete m_pSystemTray; #endif // Patchbay rack is also dead. if (m_pPatchbayRack) delete m_pPatchbayRack; // Pseudo-singleton reference shut-down. g_pMainForm = NULL; } // Kind of singleton reference. qjackctlMainForm *qjackctlMainForm::getInstance (void) { return g_pMainForm; } // Make and set a proper setup step. bool qjackctlMainForm::setup ( qjackctlSetup *pSetup ) { // Finally, fix settings descriptor // and stabilize the form. m_pSetup = pSetup; // To avoid any background flickering, // we'll hide the main display. m_ui.StatusDisplayFrame->hide(); updateButtons(); // What style do we create these forms? QWidget *pParent = NULL; Qt::WindowFlags wflags = Qt::Window | Qt::CustomizeWindowHint | Qt::WindowTitleHint | Qt::WindowSystemMenuHint | Qt::WindowMinMaxButtonsHint | Qt::WindowCloseButtonHint; if (m_pSetup->bKeepOnTop) { pParent = this; wflags |= Qt::Tool; } // All forms are to be created right now. m_pMessagesStatusForm = new qjackctlMessagesStatusForm (pParent, wflags); m_pSessionForm = new qjackctlSessionForm (pParent, wflags); m_pConnectionsForm = new qjackctlConnectionsForm (pParent, wflags); m_pPatchbayForm = new qjackctlPatchbayForm (pParent, wflags); // Setup form is kind of special (modeless dialog). m_pSetupForm = new qjackctlSetupForm(this); // Setup appropriately... m_pMessagesStatusForm->setTabPage(m_pSetup->iMessagesStatusTabPage); m_pMessagesStatusForm->setLogging( m_pSetup->bMessagesLog, m_pSetup->sMessagesLogPath); m_pSessionForm->setup(m_pSetup); m_pConnectionsForm->setTabPage(m_pSetup->iConnectionsTabPage); m_pConnectionsForm->setup(m_pSetup); m_pPatchbayForm->setup(m_pSetup); m_pSetupForm->setup(m_pSetup); // Check out some initial nullities(tm)... if (m_pSetup->sMessagesFont.isEmpty() && m_pMessagesStatusForm) m_pSetup->sMessagesFont = m_pMessagesStatusForm->messagesFont().toString(); if (m_pSetup->sDisplayFont1.isEmpty()) m_pSetup->sDisplayFont1 = m_ui.TimeDisplayTextLabel->font().toString(); if (m_pSetup->sDisplayFont2.isEmpty()) m_pSetup->sDisplayFont2 = m_ui.ServerStateTextLabel->font().toString(); if (m_pSetup->sConnectionsFont.isEmpty() && m_pConnectionsForm) m_pSetup->sConnectionsFont = m_pConnectionsForm->connectionsFont().toString(); // Set the patchbay cable connection notification signal/slot. QObject::connect( m_pPatchbayRack, SIGNAL(cableConnected(const QString&, const QString&, unsigned int)), this, SLOT(cableConnectSlot(const QString&, const QString&, unsigned int))); // Try to restore old window positioning and appearence. m_pSetup->loadWidgetGeometry(this, true); // And for the whole widget gallore... m_pSetup->loadWidgetGeometry(m_pMessagesStatusForm); m_pSetup->loadWidgetGeometry(m_pSessionForm); m_pSetup->loadWidgetGeometry(m_pConnectionsForm); m_pSetup->loadWidgetGeometry(m_pPatchbayForm); // m_pSetup->loadWidgetGeometry(m_pSetupForm); // Make it final show... m_ui.StatusDisplayFrame->show(); // Set other defaults... updateDisplayEffect(); updateTimeDisplayFonts(); updateTimeDisplayToolTips(); updateTimeFormat(); updateMessagesFont(); updateMessagesLimit(); updateConnectionsFont(); updateConnectionsIconSize(); updateJackClientPortAlias(); updateJackClientPortMetadata(); updateBezierLines(); // updateActivePatchbay(); #ifdef CONFIG_SYSTEM_TRAY updateSystemTray(); #endif // Initial XRUN statistics reset. resetXrunStats(); // Check if we can redirect our own stdout/stderr... #if !defined(WIN32) if (m_pSetup->bStdoutCapture && ::pipe(g_fdStdout) == 0) { ::dup2(g_fdStdout[QJACKCTL_FDWRITE], STDOUT_FILENO); ::dup2(g_fdStdout[QJACKCTL_FDWRITE], STDERR_FILENO); stdoutBlock(g_fdStdout[QJACKCTL_FDWRITE], false); m_pStdoutNotifier = new QSocketNotifier( g_fdStdout[QJACKCTL_FDREAD], QSocketNotifier::Read, this); QObject::connect(m_pStdoutNotifier, SIGNAL(activated(int)), SLOT(stdoutNotifySlot(int))); } #endif #ifdef CONFIG_ALSA_SEQ if (m_pSetup->bAlsaSeqEnabled) { // Start our ALSA sequencer interface. if (snd_seq_open(&m_pAlsaSeq, "hw", SND_SEQ_OPEN_DUPLEX, 0) < 0) m_pAlsaSeq = NULL; if (m_pAlsaSeq) { snd_seq_port_subscribe_t *pAlsaSubs; snd_seq_addr_t seq_addr; struct pollfd pfd[1]; int iPort = snd_seq_create_simple_port( m_pAlsaSeq, "qjackctl", SND_SEQ_PORT_CAP_WRITE | SND_SEQ_PORT_CAP_SUBS_WRITE | SND_SEQ_PORT_CAP_NO_EXPORT, SND_SEQ_PORT_TYPE_APPLICATION ); if (iPort >= 0) { snd_seq_port_subscribe_alloca(&pAlsaSubs); seq_addr.client = SND_SEQ_CLIENT_SYSTEM; seq_addr.port = SND_SEQ_PORT_SYSTEM_ANNOUNCE; snd_seq_port_subscribe_set_sender(pAlsaSubs, &seq_addr); seq_addr.client = snd_seq_client_id(m_pAlsaSeq); seq_addr.port = iPort; snd_seq_port_subscribe_set_dest(pAlsaSubs, &seq_addr); snd_seq_subscribe_port(m_pAlsaSeq, pAlsaSubs); snd_seq_poll_descriptors(m_pAlsaSeq, pfd, 1, POLLIN); m_pAlsaNotifier = new QSocketNotifier(pfd[0].fd, QSocketNotifier::Read); QObject::connect(m_pAlsaNotifier, SIGNAL(activated(int)), SLOT(alsaNotifySlot(int))); } } // Could we start without it? if (m_pAlsaSeq) { // Rather obvious setup. if (m_pConnectionsForm) m_pConnectionsForm->stabilizeAlsa(true); } else { appendMessagesError( tr("Could not open ALSA sequencer as a client.\n\n" "ALSA MIDI patchbay will be not available.")); } } #endif #ifdef CONFIG_DBUS // Register D-Bus service... if (m_pSetup->bDBusEnabled) { const QString s; // Just an empty string. const QString sDBusName("org.rncbc.qjackctl"); QDBusConnection dbus = QDBusConnection::systemBus(); dbus.connect(s, s, sDBusName, "start", this, SLOT(startJack())); dbus.connect(s, s, sDBusName, "stop", this, SLOT(stopJack())); dbus.connect(s, s, sDBusName, "main", this, SLOT(toggleMainForm())); dbus.connect(s, s, sDBusName, "messages", this, SLOT(toggleMessagesForm())); dbus.connect(s, s, sDBusName, "status", this, SLOT(toggleStatusForm())); dbus.connect(s, s, sDBusName, "session", this, SLOT(toggleSessionForm())); dbus.connect(s, s, sDBusName, "connections", this, SLOT(toggleConnectionsForm())); dbus.connect(s, s, sDBusName, "patchbay", this, SLOT(togglePatchbayForm())); dbus.connect(s, s, sDBusName, "rewind", this, SLOT(transportRewind())); dbus.connect(s, s, sDBusName, "backward", this, SLOT(transportBackward())); dbus.connect(s, s, sDBusName, "play", this, SLOT(transportStart())); dbus.connect(s, s, sDBusName, "pause", this, SLOT(transportStop())); dbus.connect(s, s, sDBusName, "forward", this, SLOT(transportForward())); dbus.connect(s, s, sDBusName, "setup", this, SLOT(showSetupForm())); dbus.connect(s, s, sDBusName, "about", this, SLOT(showAboutForm())); dbus.connect(s, s, sDBusName, "quit", this, SLOT(quitMainForm())); dbus.connect(s, s, sDBusName, "preset", this, SLOT(activatePreset(const QString&))); // Session related slots... if (m_pSessionForm) { dbus.connect(s, s, sDBusName, "load", m_pSessionForm, SLOT(loadSession())); dbus.connect(s, s, sDBusName, "save", m_pSessionForm, SLOT(saveSessionSave())); #ifdef CONFIG_JACK_SESSION dbus.connect(s, s, sDBusName, "savequit", m_pSessionForm, SLOT(saveSessionSaveAndQuit())); dbus.connect(s, s, sDBusName, "savetemplate", m_pSessionForm, SLOT(saveSessionSaveTemplate())); #endif } } // Register JACK D-Bus service... if (m_pSetup->bJackDBusEnabled) { // Detect whether jackdbus is avaliable... QDBusConnection dbusc = QDBusConnection::sessionBus(); m_pDBusControl = new QDBusInterface( "org.jackaudio.service", // Service "/org/jackaudio/Controller", // Path "org.jackaudio.JackControl", // Interface dbusc); // Connection QDBusMessage dbusm = m_pDBusControl->call("IsStarted"); if (dbusm.type() == QDBusMessage::ReplyMessage) { // Yes, jackdbus is available and/or already started // -- use jackdbus control interface... appendMessages(tr("D-BUS: Service is available (%1 aka jackdbus).") .arg(m_pDBusControl->service())); // Parse reply (should be boolean) m_bDBusStarted = dbusm.arguments().first().toBool(); // Register server start/stop notification slots... dbusc.connect( m_pDBusControl->service(), m_pDBusControl->path(), m_pDBusControl->interface(), "ServerStarted", this, SLOT(jackStarted())); dbusc.connect( m_pDBusControl->service(), m_pDBusControl->path(), m_pDBusControl->interface(), "ServerStopped", this, SLOT(jackFinished())); // -- use jackdbus configure interface... m_pDBusConfig = new QDBusInterface( m_pDBusControl->service(), // Service m_pDBusControl->path(), // Path "org.jackaudio.Configure", // Interface m_pDBusControl->connection()); // Connection // Start our log watcher thread... m_pDBusLogWatcher = new qjackctlDBusLogWatcher( QDir::homePath() + "/.log/jack/jackdbus.log"); m_pDBusLogWatcher->start(); // Ready now. } else { // No, jackdbus is not available, not started // or not even installed -- use classic jackd, BAU... appendMessages(tr("D-BUS: Service not available (%1 aka jackdbus).") .arg(m_pDBusControl->service())); // Destroy tentative jackdbus interface. delete m_pDBusControl; m_pDBusControl = NULL; } } #endif // Load patchbay form recent paths... if (m_pPatchbayForm) { m_pPatchbayForm->setRecentPatchbays(m_pSetup->patchbays); if (!m_pSetup->sPatchbayPath.isEmpty() && QFileInfo(m_pSetup->sPatchbayPath).exists()) m_pPatchbayForm->loadPatchbayFile(m_pSetup->sPatchbayPath); m_pPatchbayForm->updateRecentPatchbays(); m_pPatchbayForm->stabilizeForm(); } // Try to find if we can start in detached mode (client-only) // just in case there's a JACK server already running. startJackClient(true); // Final startup stabilization... stabilizeForm(); jackStabilize(); // Look for immediate server startup?... if (m_pSetup->bStartJack || !m_pSetup->sCmdLine.isEmpty()) m_pSetup->bStartJackCmd = true; if (m_pSetup->bStartJackCmd) startJack(); // Register the first timer slot. QTimer::singleShot(QJACKCTL_TIMER_MSECS, this, SLOT(timerSlot())); // We're ready to go... return true; } // Window close event handlers. bool qjackctlMainForm::queryClose (void) { bool bQueryClose = true; #ifdef CONFIG_SYSTEM_TRAY // If we're not quitting explicitly and there's an // active system tray icon, then just hide ourselves. if (!m_bQuitClose && !m_bQuitForce && isVisible() && m_pSetup->bSystemTray && m_pSystemTray) { m_pSetup->saveWidgetGeometry(this, true); if (m_pSetup->bSystemTrayQueryClose) { const QString& sTitle = tr("Information") + " - " QJACKCTL_SUBTITLE1; const QString& sText = tr("The program will keep running in the system tray.\n\n" "To terminate the program, please choose \"Quit\"\n" "in the context menu of the system tray icon."); #if 0//QJACKCTL_SYSTEM_TRAY_QUERY_CLOSE if (QSystemTrayIcon::supportsMessages()) { m_pSystemTray->showMessage( sTitle, sText, QSystemTrayIcon::Information); } else QMessageBox::information(this, sTitle, sText); #else QMessageBox mbox(this); mbox.setIcon(QMessageBox::Information); mbox.setWindowTitle(sTitle); mbox.setText(sText); mbox.setStandardButtons(QMessageBox::Ok); QCheckBox cbox(tr("Don't show this message again")); cbox.setChecked(false); cbox.blockSignals(true); mbox.addButton(&cbox, QMessageBox::ActionRole); mbox.exec(); if (cbox.isChecked()) m_pSetup->bSystemTrayQueryClose = false; #endif } hide(); bQueryClose = false; } #endif // Check if JACK daemon is currently running... if (bQueryClose && !m_bQuitForce && m_pJack && m_pJack->state() == QProcess::Running && (m_pSetup->bQueryClose || m_pSetup->bQueryShutdown)) { show(); raise(); activateWindow(); if (m_pSetup->bQueryClose) { const QString& sTitle = tr("Warning") + " - " QJACKCTL_SUBTITLE1; const QString& sText = tr("JACK is currently running.\n\n" "Do you want to terminate the JACK audio server?"); #if 0//QJACKCTL_QUERY_CLOSE bQueryClose = (QMessageBox::warning(this, sTitle, sText, QMessageBox::Ok | QMessageBox::Cancel) == QMessageBox::Ok); #else QMessageBox mbox(this); mbox.setIcon(QMessageBox::Warning); mbox.setWindowTitle(sTitle); mbox.setText(sText); mbox.setStandardButtons(QMessageBox::Ok | QMessageBox::Cancel); QCheckBox cbox(tr("Don't ask this again")); cbox.setChecked(false); cbox.blockSignals(true); mbox.addButton(&cbox, QMessageBox::ActionRole); bQueryClose = (mbox.exec() == QMessageBox::Ok); if (bQueryClose && cbox.isChecked()) m_pSetup->bQueryClose = false; #endif } } // Try to save current setup settings. if (bQueryClose && m_pSetupForm && !m_bQuitForce) bQueryClose = m_pSetupForm->queryClose(); // Try to save current aliases default settings. if (bQueryClose && m_pConnectionsForm) { if (!m_bQuitForce) bQueryClose = m_pConnectionsForm->queryClose(); if (bQueryClose) m_pSetup->iConnectionsTabPage = m_pConnectionsForm->tabPage(); } // Try to save current patchbay default settings. if (bQueryClose && m_pPatchbayForm) { if (!m_bQuitForce) bQueryClose = m_pPatchbayForm->queryClose(); if (bQueryClose && !m_pPatchbayForm->patchbayPath().isEmpty()) m_pSetup->sPatchbayPath = m_pPatchbayForm->patchbayPath(); } // Try to save current session directories list... if (bQueryClose && m_pSessionForm) { if (!m_bQuitForce) bQueryClose = m_pSessionForm->queryClose(); if (bQueryClose) { m_pSetup->sessionDirs = m_pSessionForm->sessionDirs(); m_pSetup->bSessionSaveVersion = m_pSessionForm->isSaveSessionVersion(); } } // Some windows default fonts are here on demand too. if (bQueryClose && m_pMessagesStatusForm) { m_pSetup->sMessagesFont = m_pMessagesStatusForm->messagesFont().toString(); m_pSetup->iMessagesStatusTabPage = m_pMessagesStatusForm->tabPage(); } // Whether we're really quitting. #ifdef CONFIG_SYSTEM_TRAY m_bQuitClose = bQueryClose; #endif m_bQuitForce = bQueryClose; // Try to save current positioning. if (bQueryClose) { m_pSetup->saveWidgetGeometry(m_pMessagesStatusForm); m_pSetup->saveWidgetGeometry(m_pSessionForm); m_pSetup->saveWidgetGeometry(m_pConnectionsForm); m_pSetup->saveWidgetGeometry(m_pPatchbayForm); // m_pSetup->saveWidgetGeometry(m_pSetupForm); m_pSetup->saveWidgetGeometry(this, true); // Close popup widgets. if (m_pMessagesStatusForm) m_pMessagesStatusForm->close(); if (m_pSessionForm) m_pSessionForm->close(); if (m_pConnectionsForm) m_pConnectionsForm->close(); if (m_pPatchbayForm) m_pPatchbayForm->close(); if (m_pSetupForm) m_pSetupForm->close(); #ifdef CONFIG_SYSTEM_TRAY // And the system tray icon too. if (m_pSystemTray) m_pSystemTray->close(); #endif // Stop any service out there... if (m_pSetup->bStopJack) stopJackServer(); // Finally, save settings. m_pSetup->saveSetup(); } return bQueryClose; } void qjackctlMainForm::closeEvent ( QCloseEvent *pCloseEvent ) { // Let's be sure about that... if (queryClose()) { pCloseEvent->accept(); QApplication::quit(); } else { pCloseEvent->ignore(); } } void qjackctlMainForm::customEvent ( QEvent *pEvent ) { switch (int(pEvent->type())) { case QJACKCTL_PORT_EVENT: portNotifyEvent(); break; case QJACKCTL_XRUN_EVENT: xrunNotifyEvent(); break; case QJACKCTL_BUFF_EVENT: buffNotifyEvent(); break; case QJACKCTL_SHUT_EVENT: shutNotifyEvent(); break; case QJACKCTL_EXIT_EVENT: exitNotifyEvent(); break; #ifdef CONFIG_DBUS case QJACKCTL_LINE_EVENT: appendStdoutBuffer( static_cast (pEvent)->line()); break; #endif #ifdef CONFIG_JACK_METADATA case QJACKCTL_PROP_EVENT: propNotifyEvent(); break; #endif default: QWidget::customEvent(pEvent); break; } } // Common exit status text formatter... QString qjackctlMainForm::formatExitStatus ( int iExitStatus ) const { QString sTemp = " "; if (iExitStatus == 0) sTemp += tr("successfully"); else sTemp += tr("with exit status=%1").arg(iExitStatus); return sTemp + "."; } // Common shell script executive, with placeholder substitution... void qjackctlMainForm::shellExecute ( const QString& sShellCommand, const QString& sStartMessage, const QString& sStopMessage ) { QString sTemp = sShellCommand; sTemp.replace("%P", m_pSetup->sDefPreset); sTemp.replace("%N", m_pSetup->sServerName); sTemp.replace("%s", m_preset.sServerPrefix); sTemp.replace("%d", m_preset.sDriver); sTemp.replace("%i", m_preset.sInterface); sTemp.replace("%r", QString::number(m_preset.iSampleRate)); sTemp.replace("%p", QString::number(m_preset.iFrames)); sTemp.replace("%n", QString::number(m_preset.iPeriods)); appendMessages(sStartMessage); appendMessagesColor(sTemp.trimmed(), "#990099"); stabilize(QJACKCTL_TIMER_MSECS); // Execute and set exit status message... sTemp = sStopMessage + formatExitStatus( ::system(sTemp.toUtf8().constData())); // Wait a litle bit before continue... stabilize(QJACKCTL_TIMER_MSECS); // Final log message... appendMessages(sTemp); } // Start jack audio server... void qjackctlMainForm::startJack (void) { // If can't be already a client, are we? if (m_pJackClient) return; // Is the server process instance still here? if (m_pJack) { if (QMessageBox::warning(this, tr("Warning") + " - " QJACKCTL_SUBTITLE1, tr("Could not start JACK.\n\n" "Maybe JACK audio server is already started."), QMessageBox::Ok | QMessageBox::Cancel) == QMessageBox::Ok) { m_pJack->terminate(); m_pJack->kill(); } return; } // Stabilize emerging server state... QPalette pal; pal.setColor(QPalette::Foreground, Qt::yellow); m_ui.ServerStateTextLabel->setPalette(pal); m_ui.StartToolButton->setEnabled(false); updateServerState(QJACKCTL_ACTIVATING); // Reset our timer counters... m_iStartDelay = 0; m_iTimerDelay = 0; m_iJackRefresh = 0; // Now we're sure it ain't detached. m_bJackShutdown = false; m_bJackDetach = false; // Load primary/default server preset... if (!m_pSetup->loadPreset(m_preset, m_pSetup->sDefPreset)) { appendMessagesError(tr("Could not load preset \"%1\".\n\nRetrying with default.").arg(m_pSetup->sDefPreset)); m_pSetup->sDefPreset = m_pSetup->sDefPresetName; if (!m_pSetup->loadPreset(m_preset, m_pSetup->sDefPreset)) { appendMessagesError(tr("Could not load default preset.\n\nSorry.")); jackCleanup(); return; } } // Override server name now... if (m_pSetup->sServerName.isEmpty()) m_pSetup->sServerName = m_preset.sServerName; #if 0 // defined(__GNUC__) && defined(Q_OS_LINUX) // Take care for the environment as well... if (!m_pSetup->sServerName.isEmpty()) { setenv("JACK_DEFAULT_SERVER", m_pSetup->sServerName.toUtf8().constData(), 1); } #endif // If we ain't to be the server master, maybe we'll start // detached as client only (jackd server already running?) if (startJackClient(true)) { m_ui.StopToolButton->setEnabled(true); return; } // Say that we're starting... updateServerState(QJACKCTL_STARTING); // Do we have any startup script?... if (m_pSetup->bStartupScript && !m_pSetup->sStartupScriptShell.isEmpty()) { shellExecute(m_pSetup->sStartupScriptShell, tr("Startup script..."), tr("Startup script terminated")); } // Split the server path into arguments... QStringList args = m_preset.sServerPrefix.split(' '); // Look for the executable in the search path; // this enforces the server command to be an // executable absolute path whenever possible. QString sCommand = args[0]; QFileInfo fi(sCommand); if (fi.isRelative()) { #if defined(WIN32) const char chPathSep = ';'; if (fi.suffix().isEmpty()) sCommand += ".exe"; #else const char chPathSep = ':'; #endif const QString sPath = ::getenv("PATH"); QStringList paths = sPath.split(chPathSep); #if defined(WIN32) paths = paths << "C:\\Program Files\\Jack" << "C:\\Program Files (x86)\\Jack"; #endif QStringListIterator iter(paths); while (iter.hasNext()) { const QString& sDirectory = iter.next(); fi.setFile(QDir(sDirectory), sCommand); #if defined(WIN32) #ifdef CONFIG_DEBUG printf("\n\n\n\n abs_path: -%s-\ndir: -%s-\nsCommand: -%s-\nexists: %d, executable: %d\n\n", fi.absolutePath().toUtf8().constData(), sDirectory.toUtf8().constData(), sCommand.toUtf8().constData(), fi.exists(), fi.isExecutable() ); #endif #endif if (fi.exists() && fi.isExecutable()) { sCommand = fi.filePath(); break; } } } // Now that we got a command, remove it from args list... args.removeAt(0); // Build process arguments... const bool bDummy = (m_preset.sDriver == "dummy"); const bool bSun = (m_preset.sDriver == "sun"); const bool bOss = (m_preset.sDriver == "oss"); const bool bAlsa = (m_preset.sDriver == "alsa"); const bool bPortaudio = (m_preset.sDriver == "portaudio"); const bool bCoreaudio = (m_preset.sDriver == "coreaudio"); const bool bFreebob = (m_preset.sDriver == "freebob"); const bool bFirewire = (m_preset.sDriver == "firewire"); const bool bNet = (m_preset.sDriver == "net" || m_preset.sDriver == "netone"); if (!m_pSetup->sServerName.isEmpty()) args.append("-n" + m_pSetup->sServerName); if (m_preset.bVerbose) args.append("-v"); if (m_preset.bRealtime) { // args.append("-R"); if (m_preset.iPriority > 5 && !bCoreaudio) args.append("-P" + QString::number(m_preset.iPriority)); } else args.append("-r"); if (m_preset.iPortMax > 0 && m_preset.iPortMax != 256) args.append("-p" + QString::number(m_preset.iPortMax)); if (m_preset.iTimeout > 0 && m_preset.iTimeout != 500) args.append("-t" + QString::number(m_preset.iTimeout)); if (m_preset.bNoMemLock) args.append("-m"); else if (m_preset.bUnlockMem) args.append("-u"); args.append("-d" + m_preset.sDriver); if ((bAlsa || bPortaudio) && (m_preset.iAudio != QJACKCTL_DUPLEX || m_preset.sInDevice.isEmpty() || m_preset.sOutDevice.isEmpty())) { QString sInterface = m_preset.sInterface; if (bAlsa && sInterface.isEmpty()) sInterface = "hw:0"; if (!sInterface.isEmpty()) args.append("-d" + formatQuoted(sInterface)); } if (bPortaudio && m_preset.iChan > 0) args.append("-c" + QString::number(m_preset.iChan)); if ((bCoreaudio || bFreebob || bFirewire) && !m_preset.sInterface.isEmpty()) args.append("-d" + formatQuoted(m_preset.sInterface)); if (m_preset.iSampleRate > 0 && !bNet) args.append("-r" + QString::number(m_preset.iSampleRate)); if (m_preset.iFrames > 0 && !bNet) args.append("-p" + QString::number(m_preset.iFrames)); if (bAlsa || bSun || bOss || bFreebob || bFirewire) { if (m_preset.iPeriods > 0) args.append("-n" + QString::number(m_preset.iPeriods)); } if (bAlsa) { if (m_preset.bSoftMode) args.append("-s"); if (m_preset.bMonitor) args.append("-m"); if (m_preset.bShorts) args.append("-S"); if (m_preset.bHWMon) args.append("-H"); if (m_preset.bHWMeter) args.append("-M"); #ifdef CONFIG_JACK_MIDI if (!m_preset.sMidiDriver.isEmpty()) args.append("-X" + formatQuoted(m_preset.sMidiDriver)); #endif } if (bAlsa || bPortaudio) { switch (m_preset.iAudio) { case QJACKCTL_DUPLEX: if (!m_preset.sInDevice.isEmpty() || !m_preset.sOutDevice.isEmpty()) args.append("-D"); if (!m_preset.sInDevice.isEmpty()) args.append("-C" + formatQuoted(m_preset.sInDevice)); if (!m_preset.sOutDevice.isEmpty()) args.append("-P" + formatQuoted(m_preset.sOutDevice)); break; case QJACKCTL_CAPTURE: args.append("-C" + formatQuoted(m_preset.sInDevice)); break; case QJACKCTL_PLAYBACK: args.append("-P" + formatQuoted(m_preset.sOutDevice)); break; } if (m_preset.iInChannels > 0 && m_preset.iAudio != QJACKCTL_PLAYBACK) args.append("-i" + QString::number(m_preset.iInChannels)); if (m_preset.iOutChannels > 0 && m_preset.iAudio != QJACKCTL_CAPTURE) args.append("-o" + QString::number(m_preset.iOutChannels)); switch (m_preset.iDither) { case 0: // args.append("-z-"); break; case 1: args.append("-zr"); break; case 2: args.append("-zs"); break; case 3: args.append("-zt"); break; } } else if (bOss || bSun) { if (m_preset.bIgnoreHW) args.append("-b"); if (m_preset.iWordLength > 0) args.append("-w" + QString::number(m_preset.iWordLength)); if (!m_preset.sInDevice.isEmpty() && m_preset.iAudio != QJACKCTL_PLAYBACK) args.append("-C" + formatQuoted(m_preset.sInDevice)); if (!m_preset.sOutDevice.isEmpty() && m_preset.iAudio != QJACKCTL_CAPTURE) args.append("-P" + formatQuoted(m_preset.sOutDevice)); if (m_preset.iAudio == QJACKCTL_PLAYBACK) args.append("-i0"); else if (m_preset.iInChannels > 0) args.append("-i" + QString::number(m_preset.iInChannels)); if (m_preset.iAudio == QJACKCTL_CAPTURE) args.append("-o0"); else if (m_preset.iOutChannels > 0) args.append("-o" + QString::number(m_preset.iOutChannels)); } else if (bCoreaudio || bFirewire || bNet) { if (m_preset.iInChannels > 0 && m_preset.iAudio != QJACKCTL_PLAYBACK) args.append("-i" + QString::number(m_preset.iInChannels)); if (m_preset.iOutChannels > 0 && m_preset.iAudio != QJACKCTL_CAPTURE) args.append("-o" + QString::number(m_preset.iOutChannels)); } else if (bFreebob) { switch (m_preset.iAudio) { case QJACKCTL_DUPLEX: args.append("-D"); break; case QJACKCTL_CAPTURE: args.append("-C"); args.append("-o0"); break; case QJACKCTL_PLAYBACK: args.append("-P"); args.append("-i0"); break; } } if (bDummy && m_preset.iWait > 0 && m_preset.iWait != 21333) args.append("-w" + QString::number(m_preset.iWait)); if (bAlsa || bSun || bOss || bCoreaudio || bPortaudio || bFreebob || bFirewire) { if (m_preset.iInLatency > 0) args.append("-I" + QString::number(m_preset.iInLatency)); if (m_preset.iOutLatency > 0) args.append("-O" + QString::number(m_preset.iOutLatency)); } // Split the server path into arguments... if (!m_preset.sServerSuffix.isEmpty()) args.append(m_preset.sServerSuffix.split(' ')); // This is emulated jackd command line, for future reference purposes... m_sJackCmdLine = sCommand + ' ' + args.join(" ").trimmed(); #ifdef CONFIG_DBUS // Jack D-BUS server backend startup method... if (m_pDBusControl) { // Jack D-BUS server backend configuration... setDBusParameters(); QDBusMessage dbusm = m_pDBusControl->call("StartServer"); if (dbusm.type() == QDBusMessage::ReplyMessage) { appendMessages( tr("D-BUS: JACK server is starting...")); } else { appendMessagesError( tr("D-BUS: JACK server could not be started.\n\nSorry")); } // Delay our control client... startJackClientDelay(); } else { #endif // !CONFIG_DBUS // Jack classic server backend startup process... m_pJack = new QProcess(this); // Setup stdout/stderr capture... if (m_pSetup->bStdoutCapture) { #if defined(WIN32) // QProcess::ForwardedChannels doesn't seem to work in windows. m_pJack->setProcessChannelMode(QProcess::MergedChannels); #else m_pJack->setProcessChannelMode(QProcess::ForwardedChannels); #endif QObject::connect(m_pJack, SIGNAL(readyReadStandardOutput()), SLOT(readStdout())); QObject::connect(m_pJack, SIGNAL(readyReadStandardError()), SLOT(readStdout())); } // The unforgiveable signal communication... QObject::connect(m_pJack, SIGNAL(started()), SLOT(jackStarted())); QObject::connect(m_pJack, SIGNAL(error(QProcess::ProcessError)), SLOT(jackError(QProcess::ProcessError))); QObject::connect(m_pJack, SIGNAL(finished(int, QProcess::ExitStatus)), SLOT(jackFinished())); appendMessages(tr("JACK is starting...")); appendMessagesColor(m_sJackCmdLine, "#990099"); #if defined(WIN32) const QString& sCurrentDir = QFileInfo(sCommand).dir().absolutePath(); m_pJack->setWorkingDirectory(sCurrentDir); // QDir::setCurrent(sCurrentDir); #endif // Unquote arguments as necessary... const QChar q = '"'; QStringList cmd_args; QStringListIterator iter(args); while (iter.hasNext()) { const QString& arg = iter.next(); if (arg.contains(q)) { cmd_args.append(arg.section(q, 0, 0)); cmd_args.append(arg.section(q, 1, 1)); } else { cmd_args.append(arg); } } // Go jack, go... m_pJack->start(sCommand, cmd_args); #ifdef CONFIG_DBUS } #endif } // Stop jack audio server... void qjackctlMainForm::stopJack (void) { bool bQueryShutdown = true; // Check if we're allowed to stop (shutdown)... if (m_pSetup->bQueryShutdown && m_pConnectionsForm && (m_pConnectionsForm->isAudioConnected() || m_pConnectionsForm->isMidiConnected())) { const QString& sTitle = tr("Warning") + " - " QJACKCTL_SUBTITLE1; const QString& sText = tr("Some client audio applications\n" "are still active and connected.\n\n" "Do you want to stop the JACK audio server?"); #if 0//QJACKCTL_QUERY_SHUTDOWN bQueryShutdown = (QMessageBox::warning(this, sTitle, sText, QMessageBox::Ok | QMessageBox::Cancel) == QMessageBox::Ok); #else QMessageBox mbox(this); mbox.setIcon(QMessageBox::Warning); mbox.setWindowTitle(sTitle); mbox.setText(sText); QCheckBox cbox(tr("Don't ask this again")); cbox.setChecked(false); cbox.blockSignals(true); mbox.addButton(&cbox, QMessageBox::ActionRole); mbox.setStandardButtons(QMessageBox::Ok | QMessageBox::Cancel); bQueryShutdown = (mbox.exec() == QMessageBox::Ok); if (bQueryShutdown && cbox.isChecked()) m_pSetup->bQueryShutdown = false; #endif } // Stop the server unconditionally. if (bQueryShutdown) stopJackServer(); } // Stop jack audio server... void qjackctlMainForm::stopJackServer (void) { // Clear timer counters... m_iStartDelay = 0; m_iTimerDelay = 0; m_iJackRefresh = 0; // Stop client code. stopJackClient(); // And try to stop server. #ifdef CONFIG_DBUS if ((m_pJack && m_pJack->state() == QProcess::Running) || (m_pDBusControl && m_bDBusStarted)) { #else if (m_pJack && m_pJack->state() == QProcess::Running) { #endif updateServerState(QJACKCTL_STOPPING); // Do we have any pre-shutdown script?... if (m_pSetup->bShutdownScript && !m_pSetup->sShutdownScriptShell.isEmpty()) { shellExecute(m_pSetup->sShutdownScriptShell, tr("Shutdown script..."), tr("Shutdown script terminated")); } // Now it's the time to real try stopping the server daemon... if (!m_bJackShutdown) { // Jack classic server backend... if (m_pJack) { appendMessages(tr("JACK is stopping...")); m_bJackStopped = true; #if defined(WIN32) // Try harder... m_pJack->kill(); #else // Try softly... m_pJack->terminate(); #endif } #ifdef CONFIG_DBUS // Jack D-BUS server backend... if (m_pDBusControl) { QDBusMessage dbusm = m_pDBusControl->call("StopServer"); if (dbusm.type() == QDBusMessage::ReplyMessage) { appendMessages( tr("D-BUS: JACK server is stopping...")); } else { appendMessagesError( tr("D-BUS: JACK server could not be stopped.\n\nSorry")); } } #endif // Give it some time to terminate gracefully and stabilize... stabilize(QJACKCTL_TIMER_MSECS); // Keep on, if not exiting for good. if (!m_bQuitForce) return; } } // Do final processing anyway. jackCleanup(); } void qjackctlMainForm::toggleJack (void) { if (m_pJackClient) stopJack(); else startJack(); } // Stdout handler... void qjackctlMainForm::readStdout (void) { appendStdoutBuffer(m_pJack->readAllStandardOutput()); } // Stdout buffer handler -- now splitted by complete new-lines... void qjackctlMainForm::appendStdoutBuffer ( const QString& s ) { m_sStdoutBuffer.append(s); const int iLength = m_sStdoutBuffer.lastIndexOf('\n'); if (iLength > 0) { QString sTemp = m_sStdoutBuffer.left(iLength); m_sStdoutBuffer.remove(0, iLength + 1); QStringList list = sTemp.split('\n'); QStringListIterator iter(list); while (iter.hasNext()) { sTemp = iter.next(); if (!sTemp.isEmpty()) #if defined(WIN32) appendMessagesText(detectXrun(sTemp).trimmed()); #else appendMessagesText(detectXrun(sTemp)); #endif } } } // Stdout flusher -- show up any unfinished line... void qjackctlMainForm::flushStdoutBuffer (void) { if (!m_sStdoutBuffer.isEmpty()) { appendMessagesText(detectXrun(m_sStdoutBuffer)); m_sStdoutBuffer.clear(); } } // Jack audio server startup. void qjackctlMainForm::jackStarted (void) { // Show startup results... if (m_pJack) { appendMessages(tr("JACK was started with PID=%1.") .arg(quint64(m_pJack->pid()))); } #ifdef CONFIG_DBUS // Special for D-BUS control.... if (m_pDBusControl) { m_bDBusStarted = true; appendMessages(tr("D-BUS: JACK server was started (%1 aka jackdbus).") .arg(m_pDBusControl->service())); } #endif // Delay our control client... startJackClientDelay(); } // Jack audio server got an error. void qjackctlMainForm::jackError ( QProcess::ProcessError error ) { qjackctl_on_error(error); } // Jack audio server finish. void qjackctlMainForm::jackFinished (void) { // Force client code cleanup. if (!m_bJackShutdown) jackCleanup(); } // Jack audio server cleanup. void qjackctlMainForm::jackCleanup (void) { // Force client code cleanup. bool bPostShutdown = m_bJackDetach; if (!bPostShutdown) stopJackClient(); // Flush anything that maybe pending... flushStdoutBuffer(); // Classic server control... if (m_pJack) { if (m_pJack->state() != QProcess::NotRunning) { appendMessages(tr("JACK is being forced...")); // Force final server shutdown... m_pJack->kill(); // Give it some time to terminate gracefully and stabilize... stabilize(QJACKCTL_TIMER_MSECS); } // Force final server shutdown... appendMessages(tr("JACK was stopped")); // Destroy it. delete m_pJack; m_pJack = NULL; // Flag we need a post-shutdown script... bPostShutdown = true; } #ifdef CONFIG_DBUS // Special for D-BUS control... if (m_pDBusControl && m_bDBusStarted) { m_bDBusStarted = false; appendMessages(tr("D-BUS: JACK server was stopped (%1 aka jackdbus).") .arg(m_pDBusControl->service())); // Flag we need a post-shutdown script... bPostShutdown = true; } #endif // Cannot be detached anymore. m_bJackDetach = false; // Do we have any post-shutdown script?... // (this will be always called, despite we've started the server or not) if (bPostShutdown && m_pSetup->bPostShutdownScript && !m_pSetup->sPostShutdownScriptShell.isEmpty()) { shellExecute(m_pSetup->sPostShutdownScriptShell, tr("Post-shutdown script..."), tr("Post-shutdown script terminated")); } // Reset server name. m_pSetup->sServerName.clear(); // Stabilize final server state... jackStabilize(); } // Stabilize server state... void qjackctlMainForm::jackStabilize (void) { QPalette pal; pal.setColor(QPalette::Foreground, m_pJackClient == NULL ? Qt::darkYellow : Qt::yellow); m_ui.ServerStateTextLabel->setPalette(pal); m_ui.StartToolButton->setEnabled(m_pJackClient == NULL); m_ui.StopToolButton->setEnabled(m_pJackClient != NULL); m_ui.RewindToolButton->setEnabled(false); m_ui.BackwardToolButton->setEnabled(false); m_ui.PlayToolButton->setEnabled(false); m_ui.PauseToolButton->setEnabled(false); m_ui.ForwardToolButton->setEnabled(false); transportPlayStatus(false); int iServerState; if (m_bJackDetach) iServerState = (m_pJackClient ? QJACKCTL_ACTIVE : QJACKCTL_INACTIVE); else iServerState = QJACKCTL_STOPPED; updateServerState(iServerState); } // XRUN detection routine. QString& qjackctlMainForm::detectXrun ( QString& s ) { if (m_iXrunSkips > 1) return s; QRegExp rx(m_pSetup->sXrunRegex); int iPos = rx.indexIn(s); if (iPos >= 0) { s.insert(iPos + rx.matchedLength(), "
"); s.insert(iPos, ""); #ifndef CONFIG_JACK_XRUN_DELAY m_tXrunLast.restart(); updateXrunStats(rx.cap(1).toFloat()); refreshXrunStats(); #endif } return s; } // Update the XRUN last delay and immediate statistical values (in msecs). void qjackctlMainForm::updateXrunStats ( float fXrunLast ) { if (m_iXrunStats > 0) { m_fXrunLast = fXrunLast; m_fXrunTotal += m_fXrunLast; if (m_fXrunLast < m_fXrunMin || m_iXrunCount == 0) m_fXrunMin = m_fXrunLast; if (m_fXrunLast > m_fXrunMax || m_iXrunCount == 0) m_fXrunMax = m_fXrunLast; m_iXrunCount++; // refreshXrunStats(); } m_iXrunStats++; } // Set stdout/stderr blocking mode. bool qjackctlMainForm::stdoutBlock ( int fd, bool bBlock ) const { #if !defined(WIN32) const int iFlags = ::fcntl(fd, F_GETFL, 0); const bool bNonBlock = bool(iFlags & O_NONBLOCK); if (bBlock && bNonBlock) bBlock = (::fcntl(fd, F_SETFL, iFlags & ~O_NONBLOCK) == 0); else if (!bBlock && !bNonBlock) bBlock = (::fcntl(fd, F_SETFL, iFlags | O_NONBLOCK) != 0); #endif return bBlock; } // Own stdout/stderr socket notifier slot. void qjackctlMainForm::stdoutNotifySlot ( int fd ) { #if !defined(WIN32) // Set non-blocking reads, if not already... const bool bBlock = stdoutBlock(fd, false); // Read as much as is available... QString sTemp; char achBuffer[1024]; const int cchBuffer = sizeof(achBuffer) - 1; int cchRead = ::read(fd, achBuffer, cchBuffer); while (cchRead > 0) { achBuffer[cchRead] = (char) 0; sTemp.append(achBuffer); cchRead = (bBlock ? 0 : ::read(fd, achBuffer, cchBuffer)); } // Needs to be non-empty... if (!sTemp.isEmpty()) appendStdoutBuffer(sTemp); #endif } // Messages output methods. void qjackctlMainForm::appendMessages ( const QString& s ) { if (m_pMessagesStatusForm) m_pMessagesStatusForm->appendMessages(s); } void qjackctlMainForm::appendMessagesColor ( const QString& s, const QString& c ) { if (m_pMessagesStatusForm) m_pMessagesStatusForm->appendMessagesColor(s, c); } void qjackctlMainForm::appendMessagesText ( const QString& s ) { if (m_pMessagesStatusForm) m_pMessagesStatusForm->appendMessagesText(s); } void qjackctlMainForm::appendMessagesError ( const QString& s ) { if (m_pMessagesStatusForm) { m_pMessagesStatusForm->setTabPage( int(qjackctlMessagesStatusForm::MessagesTab)); m_pMessagesStatusForm->show(); } appendMessagesColor(s.simplified(), "#ff0000"); const QString& sTitle = tr("Error") + " - " QJACKCTL_SUBTITLE1; #ifdef CONFIG_SYSTEM_TRAY if (m_pSetup->bSystemTray && m_pSystemTray && QSystemTrayIcon::supportsMessages()) m_pSystemTray->showMessage(sTitle, s, QSystemTrayIcon::Critical); else #endif QMessageBox::critical(this, sTitle, s, QMessageBox::Cancel); } // Force update of the messages font. void qjackctlMainForm::updateMessagesFont (void) { if (m_pSetup == NULL) return; if (m_pMessagesStatusForm && !m_pSetup->sMessagesFont.isEmpty()) { QFont font; if (font.fromString(m_pSetup->sMessagesFont)) m_pMessagesStatusForm->setMessagesFont(font); } } // Update messages window line limit. void qjackctlMainForm::updateMessagesLimit (void) { if (m_pSetup == NULL) return; if (m_pMessagesStatusForm) { if (m_pSetup->bMessagesLimit) m_pMessagesStatusForm->setMessagesLimit(m_pSetup->iMessagesLimitLines); else m_pMessagesStatusForm->setMessagesLimit(-1); } } // Update messages logging state. void qjackctlMainForm::updateMessagesLogging (void) { if (m_pSetup == NULL) return; if (m_pMessagesStatusForm) { m_pMessagesStatusForm->setLogging( m_pSetup->bMessagesLog, m_pSetup->sMessagesLogPath); } } // Force update of the connections font. void qjackctlMainForm::updateConnectionsFont (void) { if (m_pSetup == NULL) return; if (m_pConnectionsForm && !m_pSetup->sConnectionsFont.isEmpty()) { QFont font; if (font.fromString(m_pSetup->sConnectionsFont)) m_pConnectionsForm->setConnectionsFont(font); } } // Update of the connections view icon size. void qjackctlMainForm::updateConnectionsIconSize (void) { if (m_pSetup == NULL) return; if (m_pConnectionsForm) m_pConnectionsForm->setConnectionsIconSize(m_pSetup->iConnectionsIconSize); } // Update of JACK client/port alias display mode. void qjackctlMainForm::updateJackClientPortAlias (void) { if (m_pSetup == NULL) return; qjackctlJackClientList::setJackClientPortAlias(m_pSetup->iJackClientPortAlias); refreshJackConnections(); } // Update of JACK client/port pretty-name (metadata) display mode. void qjackctlMainForm::updateJackClientPortMetadata (void) { if (m_pSetup == NULL) return; qjackctlJackClientList::setJackClientPortMetadata(m_pSetup->bJackClientPortMetadata); refreshJackConnections(); } // Update the connection and patchbay line style. void qjackctlMainForm::updateBezierLines (void) { if (m_pSetup == NULL) return; if (m_pConnectionsForm) { m_pConnectionsForm->audioConnectView()->setBezierLines(m_pSetup->bBezierLines); m_pConnectionsForm->midiConnectView()->setBezierLines(m_pSetup->bBezierLines); m_pConnectionsForm->alsaConnectView()->setBezierLines(m_pSetup->bBezierLines); m_pConnectionsForm->audioConnectView()->connectorView()->update(); m_pConnectionsForm->midiConnectView()->connectorView()->update(); m_pConnectionsForm->alsaConnectView()->connectorView()->update(); } if (m_pPatchbayForm) { m_pPatchbayForm->patchbayView()->setBezierLines(m_pSetup->bBezierLines); m_pPatchbayForm->patchbayView()->PatchworkView()->update(); } } // Update main display background effect. void qjackctlMainForm::updateDisplayEffect (void) { if (m_pSetup == NULL) return; // Set the main background... QPalette pal; if (m_pSetup->bDisplayEffect) { QPixmap pm(":/images/displaybg1.png"); pal.setBrush(QPalette::Background, QBrush(pm)); } else { pal.setColor(QPalette::Background, Qt::black); } m_ui.StatusDisplayFrame->setPalette(pal); } // Force update of big time display related fonts. void qjackctlMainForm::updateTimeDisplayFonts (void) { QFont font; if (!m_pSetup->sDisplayFont1.isEmpty() && font.fromString(m_pSetup->sDisplayFont1)) m_ui.TimeDisplayTextLabel->setFont(font); if (!m_pSetup->sDisplayFont2.isEmpty() && font.fromString(m_pSetup->sDisplayFont2)) { m_ui.ServerStateTextLabel->setFont(font); m_ui.ServerModeTextLabel->setFont(font); m_ui.DspLoadTextLabel->setFont(font); m_ui.SampleRateTextLabel->setFont(font); m_ui.XrunCountTextLabel->setFont(font); m_ui.TransportStateTextLabel->setFont(font); m_ui.TransportBpmTextLabel->setFont(font); font.setBold(true); m_ui.TransportTimeTextLabel->setFont(font); } } // Force update of big time display related tooltips. void qjackctlMainForm::updateTimeDisplayToolTips (void) { QString sTimeDisplay = tr("Transport BBT (bar.beat.ticks)"); QString sTransportTime = tr("Transport time code"); switch (m_pSetup->iTimeDisplay) { case DISPLAY_TRANSPORT_TIME: { QString sTemp = sTimeDisplay; sTimeDisplay = sTransportTime; sTransportTime = sTemp; break; } case DISPLAY_RESET_TIME: sTimeDisplay = tr("Elapsed time since last reset"); break; case DISPLAY_XRUN_TIME: sTimeDisplay = tr("Elapsed time since last XRUN"); break; } m_ui.TimeDisplayTextLabel->setToolTip(sTimeDisplay); m_ui.TransportTimeTextLabel->setToolTip(sTransportTime); } // Force update of time format dependant stuff. void qjackctlMainForm::updateTimeFormat (void) { // Time dashes format helper. m_sTimeDashes = "--:--:--"; switch (m_pSetup->iTimeFormat) { case 1: // Tenths of second. m_sTimeDashes += ".-"; break; case 2: // Hundredths of second. m_sTimeDashes += ".--"; break; case 3: // Raw milliseconds m_sTimeDashes += ".---"; break; } } // Update the connections client/port aliases. void qjackctlMainForm::updateAliases (void) { if (m_pConnectionsForm) m_pConnectionsForm->updateAliases(); } // Update the main form buttons display. void qjackctlMainForm::updateButtons (void) { updateTitleStatus(); if (m_pSetup->bLeftButtons) { m_ui.StartToolButton->show(); m_ui.StopToolButton->show(); m_ui.MessagesStatusToolButton->show(); m_ui.SessionToolButton->show(); m_ui.ConnectionsToolButton->show(); m_ui.PatchbayToolButton->show(); } else { m_ui.StartToolButton->hide(); m_ui.StopToolButton->hide(); m_ui.MessagesStatusToolButton->hide(); m_ui.SessionToolButton->hide(); m_ui.ConnectionsToolButton->hide(); m_ui.PatchbayToolButton->hide(); } if (m_pSetup->bRightButtons) { m_ui.QuitToolButton->show(); m_ui.SetupToolButton->show(); } else { m_ui.QuitToolButton->hide(); m_ui.SetupToolButton->hide(); } if (m_pSetup->bRightButtons && (m_pSetup->bLeftButtons || m_pSetup->bTransportButtons)) { m_ui.AboutToolButton->show(); } else { m_ui.AboutToolButton->hide(); } if (m_pSetup->bLeftButtons || m_pSetup->bTransportButtons) { m_ui.RewindToolButton->show(); m_ui.BackwardToolButton->show(); m_ui.PlayToolButton->show(); m_ui.PauseToolButton->show(); m_ui.ForwardToolButton->show(); } else { m_ui.RewindToolButton->hide(); m_ui.BackwardToolButton->hide(); m_ui.PlayToolButton->hide(); m_ui.PauseToolButton->hide(); m_ui.ForwardToolButton->hide(); } Qt::ToolButtonStyle toolButtonStyle = (m_pSetup->bTextLabels ? Qt::ToolButtonTextBesideIcon : Qt::ToolButtonIconOnly); m_ui.StartToolButton->setToolButtonStyle(toolButtonStyle); m_ui.StopToolButton->setToolButtonStyle(toolButtonStyle); m_ui.MessagesStatusToolButton->setToolButtonStyle(toolButtonStyle); m_ui.SessionToolButton->setToolButtonStyle(toolButtonStyle); m_ui.ConnectionsToolButton->setToolButtonStyle(toolButtonStyle); m_ui.PatchbayToolButton->setToolButtonStyle(toolButtonStyle); m_ui.QuitToolButton->setToolButtonStyle(toolButtonStyle); m_ui.SetupToolButton->setToolButtonStyle(toolButtonStyle); m_ui.AboutToolButton->setToolButtonStyle(toolButtonStyle); adjustSize(); } // Force update of active patchbay definition profile, if applicable. bool qjackctlMainForm::isActivePatchbay ( const QString& sPatchbayPath ) const { bool bActive = false; if (m_pSetup && m_pSetup->bActivePatchbay && !m_pSetup->sActivePatchbayPath.isEmpty()) bActive = (m_pSetup->sActivePatchbayPath == sPatchbayPath); return bActive; } // Force update of active patchbay definition profile, if applicable. void qjackctlMainForm::updateActivePatchbay (void) { if (m_pSetup == NULL) return; // Time to load the active patchbay rack profiler? if (m_pSetup->bActivePatchbay && !m_pSetup->sActivePatchbayPath.isEmpty()) { // Check whether to reset/disconect-all on patchbay activation... if (m_pSetup->bActivePatchbayReset) { if (m_pJackClient) { m_pPatchbayRack->disconnectAllJackPorts(m_pJackClient); m_iJackRefresh = 0; } if (m_pAlsaSeq) { m_pPatchbayRack->disconnectAllAlsaPorts(m_pAlsaSeq); m_iAlsaRefresh = 0; } appendMessages(tr("Patchbay reset.")); } // Load/activate patchbay-rack... const QFileInfo fi(m_pSetup->sActivePatchbayPath); if (fi.isRelative()) m_pSetup->sActivePatchbayPath = fi.absoluteFilePath(); if (!qjackctlPatchbayFile::load(m_pPatchbayRack, m_pSetup->sActivePatchbayPath)) { appendMessagesError( tr("Could not load active patchbay definition.\n\n\"%1\"\n\nDisabled.") .arg(m_pSetup->sActivePatchbayPath)); m_pSetup->bActivePatchbay = false; } else { appendMessages(tr("Patchbay activated.")); // If we're up and running, make it dirty :) if (m_pJackClient) m_iJackDirty++; if (m_pAlsaSeq) m_iAlsaDirty++; } } // We're sure there's no active patchbay... else appendMessages(tr("Patchbay deactivated.")); // Should refresh anyway. m_iPatchbayRefresh++; } // Toggle active patchbay setting. void qjackctlMainForm::setActivePatchbay ( const QString& sPatchbayPath ) { if (m_pSetup == NULL) return; if (sPatchbayPath.isEmpty()) { m_pSetup->bActivePatchbay = false; } else { m_pSetup->bActivePatchbay = true; m_pSetup->sActivePatchbayPath = sPatchbayPath; } updateActivePatchbay(); } // Reset the MRU patchbay list. void qjackctlMainForm::setRecentPatchbays ( const QStringList& patchbays ) { m_pSetup->patchbays = patchbays; } // Stabilize current form toggle buttons that may be astray. void qjackctlMainForm::stabilizeForm (void) { m_ui.MessagesStatusToolButton->setChecked( m_pMessagesStatusForm && m_pMessagesStatusForm->isVisible()); m_ui.SessionToolButton->setChecked( m_pSessionForm && m_pSessionForm->isVisible()); m_ui.ConnectionsToolButton->setChecked( m_pConnectionsForm && m_pConnectionsForm->isVisible()); m_ui.PatchbayToolButton->setChecked( m_pPatchbayForm && m_pPatchbayForm->isVisible()); m_ui.SetupToolButton->setChecked( m_pSetupForm && m_pSetupForm->isVisible()); } // Stabilize current business over the application event loop. void qjackctlMainForm::stabilize ( int msecs ) { QTime t; t.start(); while (t.elapsed() < msecs) QApplication::processEvents(QEventLoop::ExcludeUserInputEvents); } // Reset XRUN cache items. void qjackctlMainForm::resetXrunStats (void) { m_tResetLast = QTime::currentTime(); m_iXrunStats = 0; m_iXrunCount = 0; m_fXrunTotal = 0.0f; m_fXrunMin = 0.0f; m_fXrunMax = 0.0f; m_fXrunLast = 0.0f; m_tXrunLast.setHMS(0, 0, 0); m_iXrunCallbacks = 0; m_iXrunSkips = 0; #ifdef CONFIG_JACK_MAX_DELAY if (m_pJackClient) jack_reset_max_delayed_usecs(m_pJackClient); #endif refreshXrunStats(); appendMessages(tr("Statistics reset.")); // Make sure all status(es) will be updated ASAP. m_iStatusRefresh += QJACKCTL_STATUS_CYCLE; } // Update the XRUN count/callbacks item. void qjackctlMainForm::updateXrunCount (void) { // We'll change XRUN status colors here! QColor color = (m_pJackClient ? Qt::green : Qt::darkGreen); if ((m_iXrunCount + m_iXrunCallbacks) > 0) { if (m_iXrunCallbacks > 0) color = (m_pJackClient ? Qt::red : Qt::darkRed); else color = (m_pJackClient ? Qt::yellow : Qt::darkYellow); #ifdef CONFIG_SYSTEM_TRAY // Change the system tray icon background color! if (m_pSystemTray) m_pSystemTray->setBackground(color); } // Reset the system tray icon background! else if (m_pSystemTray) m_pSystemTray->setBackground(Qt::transparent); #else } #endif QPalette pal; pal.setColor(QPalette::Foreground, color); m_ui.XrunCountTextLabel->setPalette(pal); QString sText = QString::number(m_iXrunCount); sText += " ("; sText += QString::number(m_iXrunCallbacks); sText += ")"; updateStatusItem(STATUS_XRUN_COUNT, sText); } // Convert whole elapsed seconds to hh:mm:ss time format. QString qjackctlMainForm::formatTime ( float secs ) const { unsigned int hh, mm, ss; hh = mm = ss = 0; if (secs >= 3600.0f) { hh = (unsigned int) (secs / 3600.0f); secs -= (float) hh * 3600.0f; } if (secs >= 60.0f) { mm = (unsigned int) (secs / 60.0f); secs -= (float) mm * 60.0f; } if (secs >= 0.0) { ss = (unsigned int) secs; secs -= (float) ss; } QString sTemp; switch (m_pSetup->iTimeFormat) { case 1: // Tenths of second. sTemp.sprintf("%02u:%02u:%02u.%u", hh, mm, ss, (unsigned int) (secs * 10.0f)); break; case 2: // Hundredths of second. sTemp.sprintf("%02u:%02u:%02u.%02u", hh, mm, ss, (unsigned int) (secs * 100.0f)); break; case 3: // Raw milliseconds sTemp.sprintf("%02u:%02u:%02u.%03u", hh, mm, ss, (unsigned int) (secs * 1000.0f)); break; default: // No second decimation. sTemp.sprintf("%02u:%02u:%02u", hh, mm, ss); break; } return sTemp; } // Update the XRUN last/elapsed time item. QString qjackctlMainForm::formatElapsedTime ( int iStatusItem, const QTime& t, bool bElapsed ) const { QString sTemp = m_sTimeDashes; QString sText; // Compute and format elapsed time. if (t.isNull()) { sText = sTemp; } else { sText = t.toString(); if (m_pJackClient) { float secs = float(t.elapsed()) / 1000.0f; if (bElapsed && secs > 0) { sTemp = formatTime(secs); sText += " (" + sTemp + ")"; } } } // Display elapsed time as big time? if ((iStatusItem == STATUS_RESET_TIME && m_pSetup->iTimeDisplay == DISPLAY_RESET_TIME) || (iStatusItem == STATUS_XRUN_TIME && m_pSetup->iTimeDisplay == DISPLAY_XRUN_TIME)) { m_ui.TimeDisplayTextLabel->setText(sTemp); } return sText; } // Update the XRUN last/elapsed time item. void qjackctlMainForm::updateElapsedTimes (void) { // Display time remaining on start delay... if (m_iTimerDelay < m_iStartDelay) m_ui.TimeDisplayTextLabel->setText(formatTime( float(m_iStartDelay - m_iTimerDelay) / 1000.0f)); else { updateStatusItem(STATUS_RESET_TIME, formatElapsedTime(STATUS_RESET_TIME, m_tResetLast, true)); updateStatusItem(STATUS_XRUN_TIME, formatElapsedTime(STATUS_XRUN_TIME, m_tXrunLast, ((m_iXrunCount + m_iXrunCallbacks) > 0))); } } // Update the XRUN list view items. void qjackctlMainForm::refreshXrunStats (void) { updateXrunCount(); if (m_fXrunTotal < 0.001f) { const QString n = "--"; updateStatusItem(STATUS_XRUN_TOTAL, n); updateStatusItem(STATUS_XRUN_MIN, n); updateStatusItem(STATUS_XRUN_MAX, n); updateStatusItem(STATUS_XRUN_AVG, n); updateStatusItem(STATUS_XRUN_LAST, n); } else { float fXrunAverage = 0.0f; if (m_iXrunCount > 0) fXrunAverage = (m_fXrunTotal / m_iXrunCount); const QString s = " " + tr("msec"); updateStatusItem(STATUS_XRUN_TOTAL, QString::number(m_fXrunTotal) + s); updateStatusItem(STATUS_XRUN_MIN, QString::number(m_fXrunMin) + s); updateStatusItem(STATUS_XRUN_MAX, QString::number(m_fXrunMax) + s); updateStatusItem(STATUS_XRUN_AVG, QString::number(fXrunAverage) + s); updateStatusItem(STATUS_XRUN_LAST, QString::number(m_fXrunLast) + s); } updateElapsedTimes(); } // Jack port/graph change event notifier. void qjackctlMainForm::portNotifyEvent (void) { // Log some message here, if new. if (m_iJackRefresh == 0) appendMessagesColor(tr("JACK connection graph change."), "#cc9966"); // Do what has to be done. refreshJackConnections(); // We'll be dirty too... m_iJackDirty++; } // Jack XRUN event notifier. void qjackctlMainForm::xrunNotifyEvent (void) { // Just increment callback counter. m_iXrunCallbacks++; // Skip this one? Maybe we're under some kind of storm... m_iXrunSkips++; // Report rate must be under one second... if (m_tXrunLast.restart() < 1000) return; #ifdef CONFIG_JACK_XRUN_DELAY // We have an official XRUN delay value (convert usecs to msecs)... updateXrunStats(0.001f * jack_get_xrun_delayed_usecs(m_pJackClient)); #endif // Just log this single event... appendMessagesColor(tr("XRUN callback (%1).") .arg(m_iXrunCallbacks), "#cc66cc"); } // Jack buffer size event notifier. void qjackctlMainForm::buffNotifyEvent (void) { // Don't need to nothing, it was handled on qjackctl_buffer_size_callback; // just log this event as routine. appendMessagesColor(tr("Buffer size change (%1).") .arg((int) g_nframes), "#996633"); } // Jack shutdown event notifier. void qjackctlMainForm::shutNotifyEvent (void) { // Log this event. appendMessagesColor(tr("Shutdown notification."), "#cc6666"); // SHUTDOWN: JACK client handle might not be valid anymore... m_bJackShutdown = true; // m_pJackClient = NULL; // Do what has to be done. stopJackServer(); } // Process exit event notifier. void qjackctlMainForm::exitNotifyEvent (void) { // Poor-mans read, copy, update (RCU) QProcess::ProcessError error = g_error; g_error = QProcess::UnknownError; switch (error) { case QProcess::FailedToStart: appendMessagesError(tr("Could not start JACK.\n\nSorry.")); jackFinished(); break; case QProcess::Crashed: #if defined(WIN32) if (!m_bJackStopped) #endif appendMessagesColor(tr("JACK has crashed."), "#cc3366"); break; case QProcess::Timedout: appendMessagesColor(tr("JACK timed out."), "#cc3366"); break; case QProcess::WriteError: appendMessagesColor(tr("JACK write error."), "#cc3366"); break; case QProcess::ReadError: appendMessagesColor(tr("JACK read error."), "#cc3366"); break; case QProcess::UnknownError: default: appendMessagesColor(tr("Unknown JACK error (%d).") .arg(int(error)), "#990099"); break; } } #ifdef CONFIG_JACK_METADATA // Jack property (metadata) event notifier. void qjackctlMainForm::propNotifyEvent (void) { // Log some message here, if new. if (m_iJackRefresh == 0) appendMessagesColor(tr("JACK property change."), "#993366"); // Special refresh mode... m_iJackPropertyChange++; // Do what has to be done. refreshJackConnections(); // We'll be dirty too... m_iJackDirty++; } #endif // ALSA announce slot. void qjackctlMainForm::alsaNotifySlot ( int /*fd*/ ) { #ifdef CONFIG_ALSA_SEQ snd_seq_event_t *pAlsaEvent; snd_seq_event_input(m_pAlsaSeq, &pAlsaEvent); snd_seq_free_event(pAlsaEvent); #endif // Log some message here, if new. if (m_iAlsaRefresh == 0) appendMessagesColor(tr("ALSA connection graph change."), "#66cc99"); // Do what has to be done. refreshAlsaConnections(); // We'll be dirty too... m_iAlsaDirty++; } // Timer callback funtion. void qjackctlMainForm::timerSlot (void) { // Is it the first shot on server start after a few delay? if (m_iTimerDelay < m_iStartDelay) { m_iTimerDelay += QJACKCTL_TIMER_MSECS; if (m_iTimerDelay >= m_iStartDelay) { // If we cannot start it now, // maybe we ought to cease & desist... if (!startJackClient(false)) stopJackServer(); } } // Is the connection patchbay dirty enough? if (m_pConnectionsForm) { const QString sEllipsis = "..."; // Are we about to enforce an audio connections persistence profile? if (m_iJackDirty > 0) { m_iJackDirty = 0; if (m_pSessionForm) m_pSessionForm->updateSession(); if (m_pSetup->bActivePatchbay) { appendMessagesColor( tr("JACK active patchbay scan") + sEllipsis, "#6699cc"); m_pPatchbayRack->connectJackScan(m_pJackClient); } refreshJackConnections(); } // Or is it from the MIDI field? if (m_iAlsaDirty > 0) { m_iAlsaDirty = 0; if (m_pSetup->bActivePatchbay) { appendMessagesColor( tr("ALSA active patchbay scan") + sEllipsis, "#99cc66"); m_pPatchbayRack->connectAlsaScan(m_pAlsaSeq); } refreshAlsaConnections(); } // Are we about to refresh it, really? if (m_iJackRefresh > 0 && m_pJackClient != NULL) { m_iJackRefresh = 0; #ifdef CONFIG_JACK_METADATA const bool bClear = (m_iJackPropertyChange > 0); m_iJackPropertyChange = 0; m_pConnectionsForm->refreshAudio(true, bClear); m_pConnectionsForm->refreshMidi(true, bClear); #else m_pConnectionsForm->refreshAudio(true); m_pConnectionsForm->refreshMidi(true); #endif } if (m_iAlsaRefresh > 0 && m_pAlsaSeq != NULL) { m_iAlsaRefresh = 0; m_pConnectionsForm->refreshAlsa(true); } } // Is the patchbay dirty enough? if (m_pPatchbayForm && m_iPatchbayRefresh > 0) { m_iPatchbayRefresh = 0; m_pPatchbayForm->refreshForm(); } // Update some statistical fields, directly. refreshStatus(); // Register the next timer slot. QTimer::singleShot(QJACKCTL_TIMER_MSECS, this, SLOT(timerSlot())); } // JACK connection notification slot. void qjackctlMainForm::jackConnectChanged (void) { // Just shake the audio connections status quo. if (++m_iJackDirty == 1) appendMessagesColor(tr("JACK connection change."), "#9999cc"); } // ALSA connection notification slot. void qjackctlMainForm::alsaConnectChanged (void) { // Just shake the MIDI connections status quo. if (++m_iAlsaDirty == 1) appendMessagesColor(tr("ALSA connection change."), "#cccc99"); } // Cable connection notification slot. void qjackctlMainForm::cableConnectSlot ( const QString& sOutputPort, const QString& sInputPort, unsigned int ulCableFlags ) { QString sText = QFileInfo(m_pSetup->sActivePatchbayPath).baseName() + ": "; QString sColor; sText += sOutputPort; sText += " -> "; sText += sInputPort; sText += " "; switch (ulCableFlags) { case QJACKCTL_CABLE_CHECKED: sText += tr("checked"); sColor = "#99cccc"; break; case QJACKCTL_CABLE_CONNECTED: sText += tr("connected"); sColor = "#669999"; break; case QJACKCTL_CABLE_DISCONNECTED: sText += tr("disconnected"); sColor = "#cc9999"; break; case QJACKCTL_CABLE_FAILED: default: sText += tr("failed"); sColor = "#cc6699"; break; } appendMessagesColor(sText + '.', sColor); } // Patchbay (dis)connection slot. void qjackctlMainForm::queryDisconnect ( qjackctlPortItem *pOPort, qjackctlPortItem *pIPort, int iSocketType ) { if (m_pSetup->bActivePatchbay && m_pSetup->bQueryDisconnect) { qjackctlPatchbayCable *pCable = m_pPatchbayRack->findCable( pOPort->clientName(), pOPort->portName(), pIPort->clientName(), pIPort->portName(), iSocketType); if (pCable) { bool bQueryDisconnect = true; const QString& sTitle = tr("Warning") + " - " QJACKCTL_SUBTITLE1; const QString& sText = tr("A patchbay definition is currently active,\n" "which is probable to redo this connection:\n\n" "%1 -> %2\n\n" "Do you want to remove the patchbay connection?") .arg(pCable->outputSocket()->name()) .arg(pCable->inputSocket()->name()); #if 0//QJACKCTL_QUERY_DISCONNECT bQueryDisconnect = (QMessageBox::warning(this, sTitle, Text, QMessageBox::Ok | QMessageBox::Cancel) == QMessageBox::Ok); #else QMessageBox mbox(this); mbox.setIcon(QMessageBox::Warning); mbox.setWindowTitle(sTitle); mbox.setText(sText); mbox.setStandardButtons(QMessageBox::Ok | QMessageBox::Cancel); QCheckBox cbox(tr("Don't ask this again")); cbox.setChecked(false); cbox.blockSignals(true); mbox.addButton(&cbox, QMessageBox::ActionRole); bQueryDisconnect = (mbox.exec() == QMessageBox::Ok); if (bQueryDisconnect && cbox.isChecked()) m_pSetup->bQueryDisconnect = false; #endif if (bQueryDisconnect) m_pPatchbayRack->removeCable(pCable); } // Refresh patchbay form anyway... if (m_pPatchbayForm && isActivePatchbay(m_pPatchbayForm->patchbayPath())) m_pPatchbayForm->loadPatchbayRack(m_pPatchbayRack); } } // Delay jack control client start... void qjackctlMainForm::startJackClientDelay (void) { // Sloppy boy fix: may the serve be stopped, just in case // the client will nerver make it... m_ui.StopToolButton->setEnabled(true); // Make sure all status(es) will be updated ASAP... m_iStatusRefresh += QJACKCTL_STATUS_CYCLE; m_iStatusBlink = 0; // Reset (yet again) the timer counters... m_iStartDelay = 1 + (m_preset.iStartDelay * 1000); m_iTimerDelay = 0; m_iJackRefresh = 0; } // Start our jack audio control client... bool qjackctlMainForm::startJackClient ( bool bDetach ) { // If can't be already started, are we? if (m_pJackClient) return true; // Have it a setup? if (m_pSetup == NULL) return false; // Time to (re)load current preset aliases? if (m_pConnectionsForm && !m_pConnectionsForm->loadAliases()) return false; // Make sure all status(es) will be updated ASAP. m_iStatusRefresh += QJACKCTL_STATUS_CYCLE; m_iStatusBlink = 0; // Are we about to start detached? if (bDetach) { // To fool timed client initialization delay. m_iTimerDelay += (m_iStartDelay + 1); // Refresh status (with dashes?) refreshStatus(); } // Create the jack client handle, using a distinct identifier (PID?) const char *pszClientName = "qjackctl"; jack_status_t status = JackFailure; if (m_pSetup->sServerName.isEmpty()) { m_pJackClient = jack_client_open(pszClientName, JackNoStartServer, &status); } else { m_pJackClient = jack_client_open(pszClientName, jack_options_t(JackNoStartServer | JackServerName), &status, m_pSetup->sServerName.toUtf8().constData()); } if (m_pJackClient == NULL) { if (!bDetach) { QStringList errs; if (status & JackFailure) errs << tr("Overall operation failed."); if (status & JackInvalidOption) errs << tr("Invalid or unsupported option."); if (status & JackNameNotUnique) errs << tr("Client name not unique."); if (status & JackServerStarted) errs << tr("Server is started."); if (status & JackServerFailed) errs << tr("Unable to connect to server."); if (status & JackServerError) errs << tr("Server communication error."); if (status & JackNoSuchClient) errs << tr("Client does not exist."); if (status & JackLoadFailure) errs << tr("Unable to load internal client."); if (status & JackInitFailure) errs << tr("Unable to initialize client."); if (status & JackShmFailure) errs << tr("Unable to access shared memory."); if (status & JackVersionError) errs << tr("Client protocol version mismatch."); appendMessagesError( tr("Could not connect to JACK server as client.\n" "- %1\nPlease check the messages window for more info.") .arg(errs.join("\n- "))); } return false; } // Set notification callbacks. jack_set_graph_order_callback(m_pJackClient, qjackctl_graph_order_callback, this); jack_set_port_registration_callback(m_pJackClient, qjackctl_port_registration_callback, this); jack_set_xrun_callback(m_pJackClient, qjackctl_xrun_callback, this); jack_set_buffer_size_callback(m_pJackClient, qjackctl_buffer_size_callback, this); jack_on_shutdown(m_pJackClient, qjackctl_on_shutdown, this); #ifdef CONFIG_JACK_METADATA jack_set_property_change_callback(m_pJackClient, qjackctl_property_change_callback, this); #endif // First knowledge about buffer size. g_nframes = jack_get_buffer_size(m_pJackClient); // Reconstruct our connections and session... if (m_pConnectionsForm) { m_pConnectionsForm->stabilizeAudio(true); m_pConnectionsForm->stabilizeMidi(true); } if (m_pSessionForm) m_pSessionForm->stabilizeForm(true); // Save server configuration file. if (m_pSetup->bServerConfig && !m_sJackCmdLine.isEmpty()) { QString sJackCmdLine = m_sJackCmdLine; if (m_pSetup->bServerConfigTemp) { int iPos = sJackCmdLine.indexOf(' '); if (iPos > 0) sJackCmdLine = sJackCmdLine.insert(iPos, " -T"); } QString sFilename = ::getenv("HOME"); sFilename += '/' + m_pSetup->sServerConfigName; QFile file(sFilename); if (file.open(QIODevice::WriteOnly | QIODevice::Truncate)) { QTextStream(&file) << sJackCmdLine << endl; file.close(); appendMessagesColor( tr("Server configuration saved to \"%1\".") .arg(sFilename), "#999933"); } } // Do not forget to reset XRUN stats variables. if (!bDetach) resetXrunStats(); else // We'll flag that we've been detached! m_bJackDetach = true; // Activate us as a client... jack_activate(m_pJackClient); // All displays are highlighted from now on. QPalette pal; pal.setColor(QPalette::Foreground, Qt::yellow); m_ui.ServerStateTextLabel->setPalette(pal); m_ui.DspLoadTextLabel->setPalette(pal); m_ui.ServerModeTextLabel->setPalette(pal); pal.setColor(QPalette::Foreground, Qt::darkYellow); m_ui.SampleRateTextLabel->setPalette(pal); pal.setColor(QPalette::Foreground, Qt::green); m_ui.TimeDisplayTextLabel->setPalette(pal); m_ui.TransportStateTextLabel->setPalette(pal); m_ui.TransportBpmTextLabel->setPalette(pal); m_ui.TransportTimeTextLabel->setPalette(pal); // Whether we've started detached, just change active status. updateServerState(m_bJackDetach ? QJACKCTL_ACTIVE : QJACKCTL_STARTED); m_ui.StopToolButton->setEnabled(true); // Log success here. appendMessages(tr("Client activated.")); // Formal patchbay activation, if any, is in order... updateActivePatchbay(); // Do we have any post-startup scripting?... // (only if we're not a detached client) if (!bDetach && !m_bJackDetach) { if (m_pSetup->bPostStartupScript && !m_pSetup->sPostStartupScriptShell.isEmpty()) { shellExecute(m_pSetup->sPostStartupScriptShell, tr("Post-startup script..."), tr("Post-startup script terminated")); } } // Have we an initial command-line to start away? if (!m_pSetup->sCmdLine.isEmpty()) { // Run it dettached... shellExecute(m_pSetup->sCmdLine, tr("Command line argument..."), tr("Command line argument started")); // And reset it forever more... m_pSetup->sCmdLine.clear(); } // Remember to schedule an initial connection refreshment. refreshConnections(); // OK, we're at it! return true; } // Stop jack audio client... void qjackctlMainForm::stopJackClient (void) { // Deactivate and close us as a client... if (m_pJackClient) { jack_deactivate(m_pJackClient); jack_client_close(m_pJackClient); m_pJackClient = NULL; // Log deactivation here. appendMessages(tr("Client deactivated.")); } // Reset command-line configuration info. m_sJackCmdLine.clear(); // Clear out the connections and session... if (m_pConnectionsForm) { m_pConnectionsForm->stabilizeAudio(false); m_pConnectionsForm->stabilizeMidi(false); } if (m_pSessionForm) m_pSessionForm->stabilizeForm(false); // Displays are dimmed again. QPalette pal; pal.setColor(QPalette::Foreground, Qt::darkYellow); m_ui.ServerModeTextLabel->setPalette(pal); m_ui.DspLoadTextLabel->setPalette(pal); m_ui.SampleRateTextLabel->setPalette(pal); pal.setColor(QPalette::Foreground, Qt::darkGreen); m_ui.TimeDisplayTextLabel->setPalette(pal); m_ui.TransportStateTextLabel->setPalette(pal); m_ui.TransportBpmTextLabel->setPalette(pal); m_ui.TransportTimeTextLabel->setPalette(pal); // Refresh jack client statistics explicitly. refreshXrunStats(); } // JACK client accessor. jack_client_t *qjackctlMainForm::jackClient (void) const { return (m_bJackShutdown ? NULL : m_pJackClient); } // ALSA sequencer client accessor. snd_seq_t *qjackctlMainForm::alsaSeq (void) const { return m_pAlsaSeq; } // Rebuild all patchbay items. void qjackctlMainForm::refreshConnections (void) { refreshJackConnections(); refreshAlsaConnections(); } void qjackctlMainForm::refreshJackConnections (void) { #if 0 // Hack this as for a while... if (m_pConnectionsForm && m_iJackRefresh == 0) { m_pConnectionsForm->stabilizeAudio(false); m_pConnectionsForm->stabilizeMidi(false); } #endif // Just increment our intentions; it will be deferred // to be executed just on timer slot processing... m_iJackRefresh++; } void qjackctlMainForm::refreshAlsaConnections (void) { #if 0 // Hack this as for a while... if (m_pConnectionsForm && m_iAlsaRefresh == 0) m_pConnectionsForm->stabilizeAlsa(false); #endif // Just increment our intentions; it will be deferred // to be executed just on timer slot processing... m_iAlsaRefresh++; } void qjackctlMainForm::refreshPatchbay (void) { // Just increment our intentions; it will be deferred // to be executed just on timer slot processing... m_iPatchbayRefresh++; } // Main form visibility requester slot. void qjackctlMainForm::toggleMainForm (void) { m_pSetup->saveWidgetGeometry(this, true); if (isVisible()) { #ifdef CONFIG_SYSTEM_TRAY if (m_pSetup->bSystemTray && m_pSystemTray) { // Hide away from sight, if not active... if (isActiveWindow()) { hide(); } else { raise(); activateWindow(); } } else #endif // Minimize (iconify) normally. showMinimized(); } else { show(); raise(); activateWindow(); } } // Message log/status form requester slot. void qjackctlMainForm::toggleMessagesStatusForm (void) { if (m_pMessagesStatusForm) { m_pSetup->saveWidgetGeometry(m_pMessagesStatusForm); if (m_pMessagesStatusForm->isVisible()) { m_pMessagesStatusForm->hide(); } else { m_pMessagesStatusForm->show(); m_pMessagesStatusForm->raise(); m_pMessagesStatusForm->activateWindow(); } } } void qjackctlMainForm::toggleMessagesForm (void) { if (m_pMessagesStatusForm) { int iTabPage = m_pMessagesStatusForm->tabPage(); m_pMessagesStatusForm->setTabPage( int(qjackctlMessagesStatusForm::MessagesTab)); if (m_pMessagesStatusForm->isVisible() && iTabPage != m_pMessagesStatusForm->tabPage()) return; } toggleMessagesStatusForm(); } void qjackctlMainForm::toggleStatusForm (void) { if (m_pMessagesStatusForm) { int iTabPage = m_pMessagesStatusForm->tabPage(); m_pMessagesStatusForm->setTabPage( int(qjackctlMessagesStatusForm::StatusTab)); if (m_pMessagesStatusForm->isVisible() && iTabPage != m_pMessagesStatusForm->tabPage()) return; } toggleMessagesStatusForm(); } // Session form requester slot. void qjackctlMainForm::toggleSessionForm (void) { if (m_pSessionForm) { m_pSetup->saveWidgetGeometry(m_pSessionForm); m_pSessionForm->stabilizeForm(m_pJackClient != NULL); if (m_pSessionForm->isVisible()) { m_pSessionForm->hide(); } else { m_pSessionForm->show(); m_pSessionForm->raise(); m_pSessionForm->activateWindow(); } } } // Connections form requester slot. void qjackctlMainForm::toggleConnectionsForm (void) { if (m_pConnectionsForm) { m_pSetup->saveWidgetGeometry(m_pConnectionsForm); m_pConnectionsForm->stabilizeAudio(m_pJackClient != NULL); m_pConnectionsForm->stabilizeMidi(m_pJackClient != NULL); m_pConnectionsForm->stabilizeAlsa(m_pAlsaSeq != NULL); if (m_pConnectionsForm->isVisible()) { m_pConnectionsForm->hide(); } else { m_pConnectionsForm->show(); m_pConnectionsForm->raise(); m_pConnectionsForm->activateWindow(); } } } // Patchbay form requester slot. void qjackctlMainForm::togglePatchbayForm (void) { if (m_pPatchbayForm) { m_pSetup->saveWidgetGeometry(m_pPatchbayForm); if (m_pPatchbayForm->isVisible()) { m_pPatchbayForm->hide(); } else { m_pPatchbayForm->show(); m_pPatchbayForm->raise(); m_pPatchbayForm->activateWindow(); } } } // Setup dialog requester slot. void qjackctlMainForm::showSetupForm (void) { if (m_pSetupForm) { // m_pSetup->saveWidgetGeometry(m_pSetupForm); if (m_pSetupForm->isVisible()) { m_pSetupForm->hide(); } else { m_pSetupForm->show(); m_pSetupForm->raise(); m_pSetupForm->activateWindow(); } } } // About dialog requester slot. void qjackctlMainForm::showAboutForm (void) { qjackctlAboutForm(this).exec(); } // Transport rewind. void qjackctlMainForm::transportRewind (void) { #ifdef CONFIG_JACK_TRANSPORT if (m_pJackClient) { jack_transport_locate(m_pJackClient, 0); // Log this here. appendMessages(tr("Transport rewind.")); // Make sure all status(es) will be updated ASAP... m_iStatusRefresh += QJACKCTL_STATUS_CYCLE; } #endif } // Transport backward. void qjackctlMainForm::transportBackward (void) { #ifdef CONFIG_JACK_TRANSPORT if (m_pJackClient) { jack_position_t tpos; jack_transport_query(m_pJackClient, &tpos); float rate = float(tpos.frame_rate); float tloc = ((float(tpos.frame) / rate) - m_fSkipAccel) * rate; if (tloc < 0.0f) tloc = 0.0f; jack_transport_locate(m_pJackClient, (jack_nframes_t) tloc); // Log this here (if on initial toggle). if (m_fSkipAccel < 1.1f) appendMessages(tr("Transport backward.")); // Take care of backward acceleration... if (m_ui.BackwardToolButton->isDown() && m_fSkipAccel < 60.0) m_fSkipAccel *= 1.1f; // Make sure all status(es) will be updated ASAP... m_iStatusRefresh += QJACKCTL_STATUS_CYCLE; } #endif } // Transport toggle (start/stop) void qjackctlMainForm::transportPlay ( bool bOn ) { if (m_iTransportPlay > 0) return; if (bOn) transportStart(); else transportStop(); } // Transport start (play) void qjackctlMainForm::transportStart (void) { #ifdef CONFIG_JACK_TRANSPORT if (m_pJackClient) { jack_transport_start(m_pJackClient); updateStatusItem(STATUS_TRANSPORT_STATE, tr("Starting")); // Log this here. appendMessages(tr("Transport start.")); // Make sure all status(es) will be updated ASAP... m_iStatusRefresh += QJACKCTL_STATUS_CYCLE; } #endif } // Transport stop (pause). void qjackctlMainForm::transportStop (void) { #ifdef CONFIG_JACK_TRANSPORT if (m_pJackClient) { jack_transport_stop(m_pJackClient); updateStatusItem(STATUS_TRANSPORT_STATE, tr("Stopping")); // Log this here. appendMessages(tr("Transport stop.")); // Make sure all status(es) will be updated ASAP... m_iStatusRefresh += QJACKCTL_STATUS_CYCLE; } #endif } // Transport forward. void qjackctlMainForm::transportForward (void) { #ifdef CONFIG_JACK_TRANSPORT if (m_pJackClient) { jack_position_t tpos; jack_transport_query(m_pJackClient, &tpos); float rate = float(tpos.frame_rate); float tloc = ((float(tpos.frame) / rate) + m_fSkipAccel) * rate; if (tloc < 0.0f) tloc = 0.0f; jack_transport_locate(m_pJackClient, (jack_nframes_t) tloc); // Log this here. if (m_fSkipAccel < 1.1f) appendMessages(tr("Transport forward.")); // Take care of forward acceleration... if (m_ui.ForwardToolButton->isDown() && m_fSkipAccel < 60.0f) m_fSkipAccel *= 1.1f; // Make sure all status(es) will be updated ASAP... m_iStatusRefresh += QJACKCTL_STATUS_CYCLE; } #endif } // Almost-complete running status refresher. void qjackctlMainForm::refreshStatus (void) { const QString n = "--"; const QString b = "-.-.---"; const QString sStopped = tr("Stopped"); m_iStatusRefresh++; if (m_pJackClient) { const QString s = " "; #ifdef CONFIG_JACK_TRANSPORT QString sText = n; jack_position_t tpos; jack_transport_state_t tstate = jack_transport_query(m_pJackClient, &tpos); const bool bPlaying = (tstate == JackTransportRolling || tstate == JackTransportLooping); // Transport timecode position. // if (bPlaying) updateStatusItem(STATUS_TRANSPORT_TIME, formatTime(float(tpos.frame) / float(tpos.frame_rate))); // else // updateStatusItem(STATUS_TRANSPORT_TIME, m_sTimeDashes); // Transport barcode position (bar:beat.tick) if (tpos.valid & JackPositionBBT) { updateStatusItem(STATUS_TRANSPORT_BBT, QString().sprintf("%u.%u.%03u", tpos.bar, tpos.beat, tpos.tick)); updateStatusItem(STATUS_TRANSPORT_BPM, QString::number(tpos.beats_per_minute, 'g', 4)); } else { updateStatusItem(STATUS_TRANSPORT_BBT, b); updateStatusItem(STATUS_TRANSPORT_BPM, n); } #endif // !CONFIG_JACK_TRANSPORT // Less frequent status items update... if (m_iStatusRefresh >= QJACKCTL_STATUS_CYCLE) { m_iStatusRefresh = 0; const float fDspLoad = jack_cpu_load(m_pJackClient); const char f = (fDspLoad > 0.1f ? 'f' : 'g'); // format const int p = (fDspLoad > 1.0f ? 1 : 2 ); // precision #ifdef CONFIG_SYSTEM_TRAY if (m_pSystemTray) { if (m_iXrunCount > 0) { m_pSystemTray->setToolTip(tr("%1 (%2%)") .arg(windowTitle()) .arg(fDspLoad, 0, f, p)); } else { m_pSystemTray->setToolTip(tr("%1 (%2%, %3 xruns)") .arg(windowTitle()) .arg(fDspLoad, 0, f, p) .arg(m_iXrunCount)); } } #endif updateStatusItem(STATUS_DSP_LOAD, tr("%1 %").arg(fDspLoad, 0, f, p)); updateStatusItem(STATUS_SAMPLE_RATE, tr("%1 Hz").arg(jack_get_sample_rate(m_pJackClient))); updateStatusItem(STATUS_BUFFER_SIZE, tr("%1 frames").arg(g_nframes)); // Blink server mode indicator?... if (m_pSetup && m_pSetup->bDisplayBlink) { QPalette pal; pal.setColor(QPalette::Foreground, (++m_iStatusBlink % 2) ? Qt::darkYellow: Qt::yellow); m_ui.ServerModeTextLabel->setPalette(pal); } #ifdef CONFIG_JACK_REALTIME const bool bRealtime = jack_is_realtime(m_pJackClient); updateStatusItem(STATUS_REALTIME, (bRealtime ? tr("Yes") : tr("No"))); m_ui.ServerModeTextLabel->setText(bRealtime ? tr("RT") : n); #else updateStatusItem(STATUS_REALTIME, n); m_ui.ServerModeTextLabel->setText(n); #endif // !CONFIG_JACK_REALTIME #ifdef CONFIG_JACK_TRANSPORT switch (tstate) { case JackTransportStarting: sText = tr("Starting"); break; case JackTransportRolling: sText = tr("Rolling"); break; case JackTransportLooping: sText = tr("Looping"); break; case JackTransportStopped: default: sText = sStopped; break; } updateStatusItem(STATUS_TRANSPORT_STATE, sText); m_ui.RewindToolButton->setEnabled(tpos.frame > 0); m_ui.BackwardToolButton->setEnabled(tpos.frame > 0); m_ui.PlayToolButton->setEnabled(true); m_ui.PauseToolButton->setEnabled(bPlaying); m_ui.ForwardToolButton->setEnabled(true); transportPlayStatus(bPlaying); if (!m_ui.BackwardToolButton->isDown() && !m_ui.ForwardToolButton->isDown()) m_fSkipAccel = 1.0; #else updateStatusItem(STATUS_TRANSPORT_STATE, n); m_ui.RewindToolButton->setEnabled(false); m_ui.BackwardToolButton->setEnabled(false); m_ui.PlayToolButton->setEnabled(false); m_ui.PauseToolButton->setEnabled(false); m_ui.ForwardToolButton->setEnabled(false); transportPlayStatus(false); updateStatusItem(STATUS_TRANSPORT_TIME, m_sTimeDashes); updateStatusItem(STATUS_TRANSPORT_BBT, b); updateStatusItem(STATUS_TRANSPORT_BPM, n); #endif // !CONFIG_JACK_TRANSPORT #ifdef CONFIG_JACK_MAX_DELAY updateStatusItem(STATUS_MAX_DELAY, tr("%1 msec") .arg(0.001f * jack_get_max_delayed_usecs(m_pJackClient))); #endif // Check if we're have some XRUNs to report... if (m_iXrunSkips > 0) { // Maybe we've skipped some... if (m_iXrunSkips > 1) { appendMessagesColor(tr("XRUN callback (%1 skipped).") .arg(m_iXrunSkips - 1), "#cc99cc"); } // Reset skip count. m_iXrunSkips = 0; // Highlight the (new) status... refreshXrunStats(); } } #ifdef CONFIG_SYSTEM_TRAY // XRUN: blink the system-tray icon backgroung... if (m_pSystemTray && m_iXrunCallbacks > 0) { const int iElapsed = m_tXrunLast.elapsed(); if (iElapsed > 0x7ff) { // T=2048ms. QColor color(m_pSystemTray->background()); color.setAlpha(0x0ff - ((iElapsed & 0x3ff) >> 3)); m_pSystemTray->setBackground(color); } } #endif } // No need to update often if we're just idle... else if (m_iStatusRefresh >= QJACKCTL_STATUS_CYCLE) { m_iStatusRefresh = 0; updateStatusItem(STATUS_DSP_LOAD, n); updateStatusItem(STATUS_SAMPLE_RATE, n); updateStatusItem(STATUS_BUFFER_SIZE, n); updateStatusItem(STATUS_REALTIME, n); m_ui.ServerModeTextLabel->setText(n); updateStatusItem(STATUS_TRANSPORT_STATE, n); updateStatusItem(STATUS_TRANSPORT_TIME, m_sTimeDashes); updateStatusItem(STATUS_TRANSPORT_BBT, b); updateStatusItem(STATUS_TRANSPORT_BPM, n); m_ui.RewindToolButton->setEnabled(false); m_ui.BackwardToolButton->setEnabled(false); m_ui.PlayToolButton->setEnabled(false); m_ui.PauseToolButton->setEnabled(false); m_ui.ForwardToolButton->setEnabled(false); transportPlayStatus(false); } // Elapsed times should be rigorous... updateElapsedTimes(); } // Status item updater. void qjackctlMainForm::updateStatusItem( int iStatusItem, const QString& sText ) { switch (iStatusItem) { case STATUS_SERVER_STATE: m_ui.ServerStateTextLabel->setText(sText); break; case STATUS_DSP_LOAD: m_ui.DspLoadTextLabel->setText(sText); break; case STATUS_SAMPLE_RATE: m_ui.SampleRateTextLabel->setText(sText); break; case STATUS_XRUN_COUNT: m_ui.XrunCountTextLabel->setText(sText); break; case STATUS_TRANSPORT_STATE: m_ui.TransportStateTextLabel->setText(sText); break; case STATUS_TRANSPORT_TIME: if (m_pSetup->iTimeDisplay == DISPLAY_TRANSPORT_TIME) m_ui.TimeDisplayTextLabel->setText(sText); else m_ui.TransportTimeTextLabel->setText(sText); break; case STATUS_TRANSPORT_BBT: if (m_pSetup->iTimeDisplay == DISPLAY_TRANSPORT_BBT) m_ui.TimeDisplayTextLabel->setText(sText); else if (m_pSetup->iTimeDisplay == DISPLAY_TRANSPORT_TIME) m_ui.TransportTimeTextLabel->setText(sText); break; case STATUS_TRANSPORT_BPM: m_ui.TransportBpmTextLabel->setText(sText); break; } if (m_pMessagesStatusForm) m_pMessagesStatusForm->updateStatusItem(iStatusItem, sText); } // Main window caption title and system tray icon and tooltip update. void qjackctlMainForm::updateTitleStatus (void) { QString sTitle; if (!m_pSetup->bLeftButtons || !m_pSetup->bRightButtons || !m_pSetup->bTextLabels) { sTitle = QJACKCTL_SUBTITLE0; } else { sTitle = QJACKCTL_SUBTITLE1; } sTitle += " [" + m_pSetup->sDefPreset + "] "; QString sState; QString sDots = "."; const QString s = ".."; switch (m_iServerState) { case QJACKCTL_STARTING: sState = tr("Starting"); sDots += s; break; case QJACKCTL_STARTED: sState = tr("Started"); break; case QJACKCTL_STOPPING: sState = tr("Stopping"); sDots += s; break; case QJACKCTL_STOPPED: sState = tr("Stopped"); break; case QJACKCTL_ACTIVE: sState = tr("Active"); break; case QJACKCTL_ACTIVATING: sState = tr("Activating"); sDots += s; break; case QJACKCTL_INACTIVE: default: sState = tr("Inactive"); break; } sTitle += sState + sDots; setWindowTitle(sTitle); updateStatusItem(STATUS_SERVER_STATE, sState); #ifdef CONFIG_SYSTEM_TRAY if (m_pSystemTray) { switch (m_iServerState) { case QJACKCTL_STARTING: m_pSystemTray->setPixmapOverlay(QPixmap(":/images/xstarting1.png")); break; case QJACKCTL_STARTED: m_pSystemTray->setPixmapOverlay(QPixmap(":/images/xstarted1.png")); break; case QJACKCTL_STOPPING: m_pSystemTray->setPixmapOverlay(QPixmap(":/images/xstopping1.png")); break; case QJACKCTL_STOPPED: m_pSystemTray->setPixmapOverlay(QPixmap(":/images/xstopped1.png")); break; case QJACKCTL_ACTIVE: m_pSystemTray->setPixmapOverlay(QPixmap(":/images/xactive1.png")); break; case QJACKCTL_ACTIVATING: m_pSystemTray->setPixmapOverlay(QPixmap(":/images/xactivating1.png")); break; case QJACKCTL_INACTIVE: default: m_pSystemTray->setPixmapOverlay(QPixmap(":/images/xinactive1.png")); break; } m_pSystemTray->setToolTip(sTitle); } #endif sTitle = m_pSetup->sServerName; if (sTitle.isEmpty()) sTitle = ::getenv("JACK_DEFAULT_SERVER"); if (sTitle.isEmpty()) sTitle = m_pSetup->sDefPresetName; updateStatusItem(STATUS_SERVER_NAME, sTitle); } // Main server state status update helper. void qjackctlMainForm::updateServerState ( int iServerState ) { // Just set the new server state. m_iServerState = iServerState; // Now's time to update main window // caption title and status immediately. updateTitleStatus(); } #ifdef CONFIG_SYSTEM_TRAY // System tray master switcher. void qjackctlMainForm::updateSystemTray (void) { if (!m_pSetup->bSystemTray && m_pSystemTray) { // Strange enough, this would close the application too. // m_pSystemTray->close(); delete m_pSystemTray; m_pSystemTray = NULL; } if (m_pSetup->bSystemTray && m_pSystemTray == NULL) { m_pSystemTray = new qjackctlSystemTray(this); QObject::connect(m_pSystemTray, SIGNAL(clicked()), SLOT(toggleMainForm())); QObject::connect(m_pSystemTray, SIGNAL(middleClicked()), SLOT(resetXrunStats())); QObject::connect(m_pSystemTray, SIGNAL(doubleClicked()), SLOT(toggleJack())); QObject::connect(m_pSystemTray, SIGNAL(contextMenuRequested(const QPoint &)), SLOT(contextMenu(const QPoint &))); m_pSystemTray->show(); } else { // Make sure the main widget is visible. show(); raise(); activateWindow(); } } #endif // System tray context menu request slot. void qjackctlMainForm::contextMenu ( const QPoint& pos ) { QMenu menu(this); QAction *pAction; QString sHideMinimize = tr("Mi&nimize"); QString sShowRestore = tr("Rest&ore"); #ifdef CONFIG_SYSTEM_TRAY if (m_pSetup->bSystemTray && m_pSystemTray) { sHideMinimize = tr("&Hide"); sShowRestore = tr("S&how"); } #endif pAction = menu.addAction(isVisible() ? sHideMinimize : sShowRestore, this, SLOT(toggleMainForm())); menu.addSeparator(); if (m_pJackClient == NULL) { pAction = menu.addAction(QIcon(":/images/start1.png"), tr("&Start"), this, SLOT(startJack())); } else { pAction = menu.addAction(QIcon(":/images/stop1.png"), tr("&Stop"), this, SLOT(stopJack())); } pAction = menu.addAction(QIcon(":/images/reset1.png"), tr("&Reset"), this, SLOT(resetXrunStats())); // pAction->setEnabled(m_pJackClient != NULL); menu.addSeparator(); // Construct the actual presets menu, // overriding the last one, if any... QMenu *pPresetsMenu = menu.addMenu(tr("&Presets")); // Assume QStringList iteration follows item index order (0,1,2...) int iPreset = 0; QStringListIterator iter(m_pSetup->presets); while (iter.hasNext()) { const QString& sPreset = iter.next(); pAction = pPresetsMenu->addAction(sPreset); pAction->setCheckable(true); pAction->setChecked(sPreset == m_pSetup->sDefPreset); pAction->setData(iPreset); iPreset++; } // Default preset always present, and has invalid index parameter (-1)... if (iPreset > 0) pPresetsMenu->addSeparator(); pAction = pPresetsMenu->addAction(m_pSetup->sDefPresetName); pAction->setCheckable(true); pAction->setChecked(m_pSetup->sDefPresetName == m_pSetup->sDefPreset); pAction->setData(-1); QObject::connect(pPresetsMenu, SIGNAL(triggered(QAction*)), SLOT(activatePresetsMenu(QAction*))); menu.addSeparator(); if (m_pSessionForm) { bool bEnabled = (m_pJackClient != NULL); const QString sTitle = tr("S&ession"); const QIcon iconSession(":/images/session1.png"); QMenu *pSessionMenu = menu.addMenu(sTitle); pSessionMenu->setIcon(iconSession); pAction = pSessionMenu->addAction(m_pSessionForm->isVisible() ? tr("&Hide") : tr("S&how"), this, SLOT(toggleSessionForm())); pSessionMenu->addSeparator(); pAction = pSessionMenu->addAction(QIcon(":/images/open1.png"), tr("&Load..."), m_pSessionForm, SLOT(loadSession())); pAction->setEnabled(bEnabled); QMenu *pRecentMenu = m_pSessionForm->recentMenu(); pAction = pSessionMenu->addMenu(pRecentMenu); pAction->setEnabled(m_pJackClient != NULL && !pRecentMenu->isEmpty()); pSessionMenu->addSeparator(); pAction = pSessionMenu->addAction(QIcon(":/images/save1.png"), tr("&Save..."), m_pSessionForm, SLOT(saveSessionSave())); pAction->setEnabled(bEnabled); #ifdef CONFIG_JACK_SESSION pAction = pSessionMenu->addAction( tr("Save and &Quit..."), m_pSessionForm, SLOT(saveSessionSaveAndQuit())); pAction->setEnabled(bEnabled); pAction = pSessionMenu->addAction( tr("Save &Template..."), m_pSessionForm, SLOT(saveSessionSaveTemplate())); pAction->setEnabled(bEnabled); #endif pSessionMenu->addSeparator(); pAction = pSessionMenu->addAction( tr("&Versioning"), m_pSessionForm, SLOT(saveSessionVersion(bool))); pAction->setCheckable(true); pAction->setChecked(m_pSessionForm->isSaveSessionVersion()); pAction->setEnabled(bEnabled); pSessionMenu->addSeparator(); pAction = pSessionMenu->addAction(QIcon(":/images/refresh1.png"), tr("Re&fresh"), m_pSessionForm, SLOT(updateSession())); pAction->setEnabled(bEnabled); } pAction = menu.addAction(QIcon(":/images/messages1.png"), tr("&Messages"), this, SLOT(toggleMessagesForm())); pAction->setCheckable(true); pAction->setChecked(m_pMessagesStatusForm && m_pMessagesStatusForm->isVisible() && m_pMessagesStatusForm->tabPage() == qjackctlMessagesStatusForm::MessagesTab); pAction = menu.addAction(QIcon(":/images/status1.png"), tr("St&atus"), this, SLOT(toggleStatusForm())); pAction->setCheckable(true); pAction->setChecked(m_pMessagesStatusForm && m_pMessagesStatusForm->isVisible() && m_pMessagesStatusForm->tabPage() == qjackctlMessagesStatusForm::StatusTab); pAction = menu.addAction(QIcon(":/images/connections1.png"), tr("&Connections"), this, SLOT(toggleConnectionsForm())); pAction->setCheckable(true); pAction->setChecked(m_pConnectionsForm && m_pConnectionsForm->isVisible()); pAction = menu.addAction(QIcon(":/images/patchbay1.png"), tr("Patch&bay"), this, SLOT(togglePatchbayForm())); pAction->setCheckable(true); pAction->setChecked(m_pPatchbayForm && m_pPatchbayForm->isVisible()); menu.addSeparator(); QMenu *pTransportMenu = menu.addMenu(tr("&Transport")); pAction = pTransportMenu->addAction(QIcon(":/images/rewind1.png"), tr("&Rewind"), this, SLOT(transportRewind())); pAction->setEnabled(m_ui.RewindToolButton->isEnabled()); // pAction = pTransportMenu->addAction(QIcon(":/images/backward1.png"), // tr("&Backward"), this, SLOT(transportBackward())); // pAction->setEnabled(m_ui.BackwardToolButton->isEnabled()); pAction = pTransportMenu->addAction(QIcon(":/images/play1.png"), tr("&Play"), this, SLOT(transportStart())); pAction->setEnabled(!m_ui.PlayToolButton->isChecked()); pAction = pTransportMenu->addAction(QIcon(":/images/pause1.png"), tr("Pa&use"), this, SLOT(transportStop())); pAction->setEnabled(m_ui.PauseToolButton->isEnabled()); // pAction = pTransportMenu->addAction(QIcon(":/images/forward1.png"), // tr("&Forward"), this, SLOT(transportForward())); // pAction->setEnabled(m_ui.ForwardToolButton->isEnabled()); menu.addSeparator(); pAction = menu.addAction(QIcon(":/images/setup1.png"), tr("Set&up..."), this, SLOT(showSetupForm())); pAction->setCheckable(true); pAction->setChecked(m_pSetupForm && m_pSetupForm->isVisible()); if (!m_pSetup->bRightButtons || !m_pSetup->bTransportButtons) { pAction = menu.addAction(QIcon(":/images/about1.png"), tr("Ab&out..."), this, SLOT(showAboutForm())); } menu.addSeparator(); pAction = menu.addAction(QIcon(":/images/quit1.png"), tr("&Quit"), this, SLOT(quitMainForm())); menu.exec(pos); } // Server settings change warning. void qjackctlMainForm::showDirtySettingsWarning (void) { // If client service is currently running, // prompt the effective warning... if (m_pJackClient) { const QString& sTitle = tr("Warning") + " - " QJACKCTL_SUBTITLE1; const QString& sText = tr("Server settings will be only effective after\n" "restarting the JACK audio server."); #ifdef CONFIG_SYSTEM_TRAY if (m_pSetup->bSystemTray && m_pSystemTray && QSystemTrayIcon::supportsMessages()) { m_pSystemTray->showMessage(sTitle, sText, QSystemTrayIcon::Warning); } else #endif QMessageBox::warning(this, sTitle, sText); } // Otherwise, it will be just as convenient to update status... else updateTitleStatus(); } // Setup otions change warning. void qjackctlMainForm::showDirtySetupWarning (void) { const QString& sTitle = tr("Information") + " - " QJACKCTL_SUBTITLE1; const QString& sText = tr("Some settings will be only effective\n" "the next time you start this program."); #ifdef CONFIG_SYSTEM_TRAY if (m_pSetup->bSystemTray && m_pSystemTray && QSystemTrayIcon::supportsMessages()) { m_pSystemTray->showMessage(sTitle, sText, QSystemTrayIcon::Information); } else #endif QMessageBox::information(this, sTitle, sText); } // Select the current default preset (by name from context menu). void qjackctlMainForm::activatePresetsMenu ( QAction *pAction ) { activatePreset(pAction->data().toInt()); } // Select the current default preset (by name). void qjackctlMainForm::activatePreset ( const QString& sPreset ) { activatePreset(m_pSetup->presets.indexOf(sPreset)); } // Select the current default preset (by index). void qjackctlMainForm::activatePreset ( int iPreset ) { if (m_pConnectionsForm && !m_pConnectionsForm->queryClose()) return; if (iPreset >= 0 && iPreset < m_pSetup->presets.count()) m_pSetup->sDefPreset = m_pSetup->presets[iPreset]; else m_pSetup->sDefPreset = m_pSetup->sDefPresetName; showDirtySettingsWarning(); } // Close main form slot. void qjackctlMainForm::quitMainForm (void) { #ifdef CONFIG_SYSTEM_TRAY // Flag that we're quitting explicitly. m_bQuitClose = true; #endif // And then, do the closing dance. close(); } // Context menu event handler. void qjackctlMainForm::contextMenuEvent ( QContextMenuEvent *pEvent ) { // We'll just show up the usual system tray menu. contextMenu(pEvent->globalPos()); } void qjackctlMainForm::mousePressEvent(QMouseEvent *pMouseEvent) { if (pMouseEvent->button() == Qt::MidButton && m_ui.StatusDisplayFrame->geometry().contains(pMouseEvent->pos())) { resetXrunStats(); } } #ifdef CONFIG_DBUS // D-BUS: Set/reset parameter values from current selected preset options. void qjackctlMainForm::setDBusParameters (void) { // Set configuration parameters... const bool bDummy = (m_preset.sDriver == "dummy"); const bool bSun = (m_preset.sDriver == "sun"); const bool bOss = (m_preset.sDriver == "oss"); const bool bAlsa = (m_preset.sDriver == "alsa"); const bool bPortaudio = (m_preset.sDriver == "portaudio"); const bool bCoreaudio = (m_preset.sDriver == "coreaudio"); const bool bFreebob = (m_preset.sDriver == "freebob"); const bool bFirewire = (m_preset.sDriver == "firewire"); const bool bNet = (m_preset.sDriver == "net" || m_preset.sDriver == "netone"); setDBusEngineParameter("name", m_pSetup->sServerName, !m_pSetup->sServerName.isEmpty()); setDBusEngineParameter("verbose", m_preset.bVerbose); setDBusEngineParameter("realtime", m_preset.bRealtime); setDBusEngineParameter("realtime-priority", m_preset.iPriority, m_preset.bRealtime && m_preset.iPriority > 5); // setDBusEngineParameter("port-max", // m_preset.iPortMax, // m_preset.iPortMax > 0); setDBusEngineParameter("client-timeout", m_preset.iTimeout, m_preset.iTimeout > 0); // setDBusEngineParameter("no-memlock", m_preset.bNoMemLock); // setDBusEngineParameter("unlock-mem", // m_preset.bUnlockMem, // !m_preset.bNoMemLock); setDBusEngineParameter("driver", m_preset.sDriver); if ((bAlsa || bPortaudio) && (m_preset.iAudio != QJACKCTL_DUPLEX || m_preset.sInDevice.isEmpty() || m_preset.sOutDevice.isEmpty())) { QString sInterface = m_preset.sInterface; if (bAlsa && sInterface.isEmpty()) sInterface = "hw:0"; setDBusDriverParameter("device", sInterface); } if (bPortaudio) { setDBusDriverParameter("channel", (unsigned int) m_preset.iChan, m_preset.iChan > 0); } if (bCoreaudio || bFreebob || bFirewire) { setDBusDriverParameter("device", m_preset.sInterface, !m_preset.sInterface.isEmpty()); } if (!bNet) { setDBusDriverParameter("rate", (unsigned int) m_preset.iSampleRate, m_preset.iSampleRate > 0); setDBusDriverParameter("period", (unsigned int) m_preset.iFrames, m_preset.iFrames > 0); } if (bAlsa || bSun || bOss || bFreebob || bFirewire) { setDBusDriverParameter("nperiods", (unsigned int) m_preset.iPeriods, m_preset.iPeriods > 0); } if (bAlsa) { setDBusDriverParameter("softmode", m_preset.bSoftMode); setDBusDriverParameter("monitor", m_preset.bMonitor); setDBusDriverParameter("shorts", m_preset.bShorts); setDBusDriverParameter("hwmon", m_preset.bHWMon); setDBusDriverParameter("hwmeter", m_preset.bHWMeter); #ifdef CONFIG_JACK_MIDI setDBusDriverParameter("midi-driver", m_preset.sMidiDriver, !m_preset.sMidiDriver.isEmpty()); #endif } if (bAlsa || bPortaudio) { QString sInterface = m_preset.sInterface; if (bAlsa && sInterface.isEmpty()) sInterface = "hw:0"; QString sInDevice = m_preset.sInDevice; if (sInDevice.isEmpty()) sInDevice = sInterface; QString sOutDevice = m_preset.sOutDevice; if (sOutDevice.isEmpty()) sOutDevice = sInterface; switch (m_preset.iAudio) { case QJACKCTL_DUPLEX: setDBusDriverParameter("duplex", true); setDBusDriverParameter("capture", sInDevice); setDBusDriverParameter("playback", sOutDevice); break; case QJACKCTL_CAPTURE: resetDBusDriverParameter("duplex"); setDBusDriverParameter("capture", sInDevice); resetDBusDriverParameter("playback"); break; case QJACKCTL_PLAYBACK: resetDBusDriverParameter("duplex"); setDBusDriverParameter("playback", sOutDevice); resetDBusDriverParameter("capture"); break; } setDBusDriverParameter("inchannels", (unsigned int) m_preset.iInChannels, m_preset.iInChannels > 0 && m_preset.iAudio != QJACKCTL_PLAYBACK); setDBusDriverParameter("outchannels", (unsigned int) m_preset.iOutChannels, m_preset.iOutChannels > 0 && m_preset.iAudio != QJACKCTL_CAPTURE); unsigned char dither = 0; switch (m_preset.iDither) { case 0: dither = 'n'; break; case 1: dither = 'r'; break; case 2: dither = 's'; break; case 3: dither = 't'; break; } setDBusDriverParameter("dither", QVariant::fromValue(dither), dither > 0); } else if (bOss || bSun) { setDBusDriverParameter("ignorehw", m_preset.bIgnoreHW); setDBusDriverParameter("wordlength", (unsigned int) m_preset.iWordLength, m_preset.iWordLength > 0); QString sInDevice = m_preset.sInDevice; if (sInDevice.isEmpty() && m_preset.iAudio == QJACKCTL_CAPTURE) sInDevice = m_preset.sInterface; setDBusDriverParameter("capture", sInDevice, !sInDevice.isEmpty() && m_preset.iAudio != QJACKCTL_PLAYBACK); QString sOutDevice = m_preset.sOutDevice; if (sOutDevice.isEmpty() && m_preset.iAudio == QJACKCTL_PLAYBACK) sOutDevice = m_preset.sInterface; setDBusDriverParameter("playback", sOutDevice, !sOutDevice.isEmpty() && m_preset.iAudio != QJACKCTL_CAPTURE); setDBusDriverParameter("inchannels", (unsigned int) m_preset.iInChannels, m_preset.iInChannels > 0 && m_preset.iAudio != QJACKCTL_PLAYBACK); setDBusDriverParameter("outchannels", (unsigned int) m_preset.iOutChannels, m_preset.iOutChannels > 0 && m_preset.iAudio != QJACKCTL_CAPTURE); } else if (bCoreaudio || bFirewire || bNet) { setDBusDriverParameter("inchannels", (unsigned int) m_preset.iInChannels, m_preset.iInChannels > 0 && m_preset.iAudio != QJACKCTL_PLAYBACK); setDBusDriverParameter("outchannels", (unsigned int) m_preset.iOutChannels, m_preset.iOutChannels > 0 && m_preset.iAudio != QJACKCTL_CAPTURE); } else if (bFreebob) { setDBusDriverParameter("duplex", bool(m_preset.iAudio == QJACKCTL_DUPLEX)); resetDBusDriverParameter("capture"); resetDBusDriverParameter("playback"); resetDBusDriverParameter("outchannels"); resetDBusDriverParameter("inchannels"); } if (bDummy) { setDBusDriverParameter("wait", (unsigned int) m_preset.iWait, m_preset.iWait > 0); } else if (!bNet) { setDBusDriverParameter("input-latency", (unsigned int) m_preset.iInLatency, m_preset.iInLatency > 0); setDBusDriverParameter("output-latency", (unsigned int) m_preset.iOutLatency, m_preset.iOutLatency > 0); } } // D-BUS: Set parameter values (with reset option). bool qjackctlMainForm::setDBusEngineParameter ( const QString& param, const QVariant& value, bool bSet ) { return setDBusParameter(QStringList() << "engine" << param, value, bSet); } bool qjackctlMainForm::setDBusDriverParameter ( const QString& param, const QVariant& value, bool bSet ) { return setDBusParameter(QStringList() << "driver" << param, value, bSet); } bool qjackctlMainForm::setDBusParameter ( const QStringList& path, const QVariant& value, bool bSet ) { if (m_pDBusConfig == NULL) return false; if (!bSet) return resetDBusParameter(path); // Reset option. QDBusMessage dbusm = m_pDBusConfig->call( "SetParameterValue", path, QVariant::fromValue(QDBusVariant(value))); if (dbusm.type() == QDBusMessage::ErrorMessage) { appendMessagesError( tr("D-BUS: SetParameterValue('%1', '%2'):\n\n" "%3.\n(%4)").arg(path.join(":")).arg(value.toString()) .arg(dbusm.errorMessage()) .arg(dbusm.errorName())); return false; } return true; } // D-BUS: Reset parameter (to default) values. bool qjackctlMainForm::resetDBusEngineParameter ( const QString& param ) { return resetDBusParameter(QStringList() << "engine" << param); } bool qjackctlMainForm::resetDBusDriverParameter ( const QString& param ) { return resetDBusParameter(QStringList() << "driver" << param); } bool qjackctlMainForm::resetDBusParameter ( const QStringList& path ) { if (m_pDBusConfig == NULL) return false; QDBusMessage dbusm = m_pDBusConfig->call("ResetParameterValue", path); if (dbusm.type() == QDBusMessage::ErrorMessage) { appendMessagesError( tr("D-BUS: ResetParameterValue('%1'):\n\n" "%2.\n(%3)").arg(path.join(":")) .arg(dbusm.errorMessage()) .arg(dbusm.errorName())); return false; } return true; } // D-BUS: Get parameter values. QVariant qjackctlMainForm::getDBusEngineParameter ( const QString& param ) { return getDBusParameter(QStringList() << "engine" << param); } QVariant qjackctlMainForm::getDBusDriverParameter ( const QString& param ) { return getDBusParameter(QStringList() << "driver" << param); } QVariant qjackctlMainForm::getDBusParameter ( const QStringList& path ) { if (m_pDBusConfig == NULL) return QVariant(); QDBusMessage dbusm = m_pDBusConfig->call("GetParameterValue", path); if (dbusm.type() == QDBusMessage::ErrorMessage) { appendMessagesError( tr("D-BUS: GetParameterValue('%1'):\n\n" "%2.\n(%3)").arg(path.join(":")) .arg(dbusm.errorMessage()) .arg(dbusm.errorName())); return QVariant(); } return dbusm.arguments().at(2); } #endif // CONFIG_DBUS // Quotes string with embedded whitespace. QString qjackctlMainForm::formatQuoted ( const QString& s ) const { const QChar b = ' '; const QChar q = '"'; return (s.contains(b) && !s.contains(q) ? q + s + q : s); } // Guarded transport play/pause toggle. void qjackctlMainForm::transportPlayStatus ( bool bOn ) { ++m_iTransportPlay; m_ui.PlayToolButton->setChecked(bOn); --m_iTransportPlay; } void qjackctlMainForm::commitData ( QSessionManager& sm ) { sm.release(); #ifdef CONFIG_SYSTEM_TRAY m_bQuitClose = true; #endif m_bQuitForce = true; } // end of qjackctlMainForm.cpp qjackctl-0.4.2/src/PaxHeaders.14935/qjackctlStatus.h0000644000000000000000000000013212700760152017013 xustar0030 mtime=1459871850.627912288 30 atime=1459871850.627912288 30 ctime=1459871850.627912288 qjackctl-0.4.2/src/qjackctlStatus.h0000644000175000001440000000363612700760152017567 0ustar00rncbcusers00000000000000// qjackctlStatus.h // /**************************************************************************** Copyright (C) 2003-2010, rncbc aka Rui Nuno Capela. All rights reserved. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. *****************************************************************************/ #ifndef __qjackctlStatus_h #define __qjackctlStatus_h // List view statistics item indexes #define STATUS_SERVER_NAME 0 #define STATUS_SERVER_STATE 1 #define STATUS_DSP_LOAD 2 #define STATUS_SAMPLE_RATE 3 #define STATUS_BUFFER_SIZE 4 #define STATUS_REALTIME 5 #define STATUS_TRANSPORT_STATE 6 #define STATUS_TRANSPORT_TIME 7 #define STATUS_TRANSPORT_BBT 8 #define STATUS_TRANSPORT_BPM 9 #define STATUS_XRUN_COUNT 10 #define STATUS_XRUN_TIME 11 #define STATUS_XRUN_LAST 12 #define STATUS_XRUN_MAX 13 #define STATUS_XRUN_MIN 14 #define STATUS_XRUN_AVG 15 #define STATUS_XRUN_TOTAL 16 #define STATUS_RESET_TIME 17 #define STATUS_MAX_DELAY 18 // (Big)Time display identifiers. #define DISPLAY_TRANSPORT_TIME 0 #define DISPLAY_TRANSPORT_BBT 1 #define DISPLAY_RESET_TIME 2 #define DISPLAY_XRUN_TIME 3 #endif // __qjackctlStatus_h // end of qjackctlStatus.h qjackctl-0.4.2/src/PaxHeaders.14935/qjackctlPatchbayForm.h0000644000000000000000000000013212700760152020107 xustar0030 mtime=1459871850.622909789 30 atime=1459871850.622909789 30 ctime=1459871850.622909789 qjackctl-0.4.2/src/qjackctlPatchbayForm.h0000644000175000001440000000600612700760152020655 0ustar00rncbcusers00000000000000// qjackctlPatchbayForm.h // /**************************************************************************** Copyright (C) 2003-2011, rncbc aka Rui Nuno Capela. All rights reserved. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. *****************************************************************************/ #ifndef __qjackctlPatchbayForm_h #define __qjackctlPatchbayForm_h #include "ui_qjackctlPatchbayForm.h" // Forward declarations. class qjackctlPatchbay; class qjackctlSetup; //---------------------------------------------------------------------------- // qjackctlPatchbayForm -- UI wrapper form. class qjackctlPatchbayForm : public QWidget { Q_OBJECT public: // Constructor. qjackctlPatchbayForm(QWidget *pParent = 0, Qt::WindowFlags wflags = 0); // Destructor. ~qjackctlPatchbayForm(); void setup(qjackctlSetup *pSetup); qjackctlPatchbayView *patchbayView() const; bool queryClose(); const QString& patchbayPath() const; void newPatchbayFile(bool bSnapshot); bool loadPatchbayFile(const QString& sFileName); bool savePatchbayFile(const QString& sFileName); void loadPatchbayRack(qjackctlPatchbayRack *pRack); void setRecentPatchbays(const QStringList& patchbays); void updateRecentPatchbays(); public slots: void newPatchbay(); void loadPatchbay(); void savePatchbay(); void selectPatchbay(int iPatchbay); void toggleActivePatchbay(); void addOSocket(); void removeOSocket(); void editOSocket(); void copyOSocket(); void moveUpOSocket(); void moveDownOSocket(); void addISocket(); void removeISocket(); void editISocket(); void copyISocket(); void moveUpISocket(); void moveDownISocket(); void connectSelected(); void disconnectSelected(); void disconnectAll(); void expandAll(); void contentsChanged(); void refreshForm(); void stabilizeForm(); protected: void showEvent(QShowEvent *); void hideEvent(QHideEvent *); void closeEvent(QCloseEvent *); void keyPressEvent(QKeyEvent *); private: // The Qt-designer UI struct... Ui::qjackctlPatchbayForm m_ui; // Instance variables. qjackctlSetup *m_pSetup; int m_iUntitled; qjackctlPatchbay *m_pPatchbay; QString m_sPatchbayPath; QString m_sPatchbayName; QStringList m_recentPatchbays; bool m_bActivePatchbay; int m_iUpdate; }; #endif // __qjackctlPatchbayForm_h // end of qjackctlPatchbayForm.h qjackctl-0.4.2/src/PaxHeaders.14935/qjackctlPatchbayFile.h0000644000000000000000000000013212700760152020063 xustar0030 mtime=1459871850.622909789 30 atime=1459871850.622909789 30 ctime=1459871850.622909789 qjackctl-0.4.2/src/qjackctlPatchbayFile.h0000644000175000001440000000260212700760152020627 0ustar00rncbcusers00000000000000// qjackctlPatchbayFile.h // /**************************************************************************** Copyright (C) 2003-2011, rncbc aka Rui Nuno Capela. All rights reserved. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. *****************************************************************************/ #ifndef __qjackctlPatchbayFile_h #define __qjackctlPatchbayFile_h #include "qjackctlPatchbayRack.h" // Patchbay XML definition. class qjackctlPatchbayFile { public: // Simple patchbay I/O methods. static bool load (qjackctlPatchbayRack *pPatchbay, const QString& sFilename); static bool save (qjackctlPatchbayRack *pPatchbay, const QString& sFilename); }; #endif // __qjackctlPatchbayFile_h // qjackctlPatchbayFile.h qjackctl-0.4.2/src/PaxHeaders.14935/qjackctlSocketForm.h0000644000000000000000000000013212700760152017604 xustar0030 mtime=1459871850.627912288 30 atime=1459871850.627912288 30 ctime=1459871850.627912288 qjackctl-0.4.2/src/qjackctlSocketForm.h0000644000175000001440000000554112700760152020355 0ustar00rncbcusers00000000000000// qjackctlSocketForm.h // /**************************************************************************** Copyright (C) 2003-2015, rncbc aka Rui Nuno Capela. All rights reserved. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. *****************************************************************************/ #ifndef __qjackctlSocketForm_h #define __qjackctlSocketForm_h #include "ui_qjackctlSocketForm.h" #include "qjackctlJackConnect.h" #include "qjackctlAlsaConnect.h" // Forward declarations. class qjackctlPatchbay; class qjackctlPatchbaySocket; class qjackctlSocketList; class QButtonGroup; class QPixmap; //---------------------------------------------------------------------------- // qjackctlSocketForm -- UI wrapper form. class qjackctlSocketForm : public QDialog { Q_OBJECT public: // Constructor. qjackctlSocketForm(QWidget *pParent = 0, Qt::WindowFlags wflags = 0); // Destructor. ~qjackctlSocketForm(); void setSocketCaption(const QString& sSocketCaption); void setSocketList(qjackctlSocketList *pSocketList); void setSocketNew(bool bSocketNew); void setPixmaps(QPixmap **ppPixmaps); void setConnectCount(int iConnectCount); void load(qjackctlPatchbaySocket *pSocket); void save(qjackctlPatchbaySocket *pSocket); public slots: void changed(); void addPlug(); void editPlug(); void removePlug(); void moveUpPlug(); void moveDownPlug(); void selectedPlug(); void activateAddPlugMenu(QAction *); void customContextMenu(const QPoint&); void socketTypeChanged(); void socketNameChanged(); void clientNameChanged(); void stabilizeForm(); protected slots: void accept(); void reject(); protected: void updateJackClients(int iSocketType); void updateAlsaClients(int iSocketType); void updateJackPlugs(int iSocketType); void updateAlsaPlugs(int iSocketType); bool validateForm(); private: // The Qt-designer UI struct... Ui::qjackctlSocketForm m_ui; // Instance variables. qjackctlSocketList *m_pSocketList; bool m_bSocketNew; int m_iSocketNameChanged; QPixmap **m_ppPixmaps; int m_iDirtyCount; QButtonGroup *m_pSocketTypeButtonGroup; }; #endif // __qjackctlSocketForm_h // end of qjackctlSocketForm.h qjackctl-0.4.2/src/PaxHeaders.14935/qjackctlSessionForm.cpp0000644000000000000000000000013212700760152020332 xustar0030 mtime=1459871850.623910288 30 atime=1459871850.623910288 30 ctime=1459871850.623910288 qjackctl-0.4.2/src/qjackctlSessionForm.cpp0000644000175000001440000007052512700760152021107 0ustar00rncbcusers00000000000000// qjackctlSessionForm.cpp // /**************************************************************************** Copyright (C) 2003-2013, rncbc aka Rui Nuno Capela. All rights reserved. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. *****************************************************************************/ #include "qjackctlAbout.h" #include "qjackctlSessionForm.h" #include "qjackctlSession.h" #include "qjackctlSetup.h" #include "qjackctlMainForm.h" #include #include #include #include #include #include #include #include #include #include #include #include // Local prototypes. static void remove_dir_list(const QList& list); static void remove_dir(const QString& sDir); // Remove specific file path. static void remove_dir ( const QString& sDir ) { QDir dir(sDir); remove_dir_list( dir.entryInfoList(QDir::AllEntries | QDir::NoDotAndDotDot)); dir.rmdir(sDir); } static void remove_dir_list ( const QList& list ) { QListIterator iter(list); while (iter.hasNext()) { const QFileInfo& info = iter.next(); const QString& sPath = info.absoluteFilePath(); if (info.isDir()) { remove_dir(sPath); } else { QFile::remove(sPath); } } } //------------------------------------------------------------------------- // qjackctlSessionInfraClientItemEditor qjackctlSessionInfraClientItemEditor::qjackctlSessionInfraClientItemEditor ( QWidget *pParent, const QModelIndex& index ) : QWidget(pParent), m_index(index) { m_pItemEdit = new QLineEdit(/*this*/); if (index.column() == 1) { m_pBrowseButton = new QToolButton(/*this*/); m_pBrowseButton->setFixedWidth(18); m_pBrowseButton->setText("..."); } else m_pBrowseButton = NULL; m_pResetButton = new QToolButton(/*this*/); m_pResetButton->setFixedWidth(18); m_pResetButton->setText("x"); QHBoxLayout *pLayout = new QHBoxLayout(); pLayout->setSpacing(0); pLayout->setMargin(0); pLayout->addWidget(m_pItemEdit); if (m_pBrowseButton) pLayout->addWidget(m_pBrowseButton); pLayout->addWidget(m_pResetButton); QWidget::setLayout(pLayout); QWidget::setFocusPolicy(Qt::StrongFocus); QWidget::setFocusProxy(m_pItemEdit); QObject::connect(m_pItemEdit, SIGNAL(editingFinished()), SLOT(finishSlot())); if (m_pBrowseButton) QObject::connect(m_pBrowseButton, SIGNAL(clicked()), SLOT(browseSlot())); QObject::connect(m_pResetButton, SIGNAL(clicked()), SLOT(resetSlot())); } // Item text accessors. void qjackctlSessionInfraClientItemEditor::setText ( const QString& sText ) { m_pItemEdit->setText(sText); } QString qjackctlSessionInfraClientItemEditor::text (void) const { return m_pItemEdit->text(); } // Item command browser. void qjackctlSessionInfraClientItemEditor::browseSlot (void) { bool bBlockSignals = m_pItemEdit->blockSignals(true); const QString& sCommand = QFileDialog::getOpenFileName(parentWidget(), tr("Infra-command")); if (!sCommand.isEmpty()) m_pItemEdit->setText(sCommand); m_pItemEdit->blockSignals(bBlockSignals); } // Item text clear/toggler. void qjackctlSessionInfraClientItemEditor::resetSlot (void) { if (m_pItemEdit->text() == m_sDefaultText) m_pItemEdit->clear(); else m_pItemEdit->setText(m_sDefaultText); m_pItemEdit->setFocus(); } // Item text finish notification. void qjackctlSessionInfraClientItemEditor::finishSlot (void) { bool bBlockSignals = m_pItemEdit->blockSignals(true); emit finishSignal(); m_index = QModelIndex(); m_sDefaultText.clear(); m_pItemEdit->blockSignals(bBlockSignals); } //------------------------------------------------------------------------- // qjackctlSessionInfraClientItemDelegate qjackctlSessionInfraClientItemDelegate::qjackctlSessionInfraClientItemDelegate ( QObject *pParent ) : QItemDelegate(pParent) { } QWidget *qjackctlSessionInfraClientItemDelegate::createEditor ( QWidget *pParent, const QStyleOptionViewItem& /*option*/, const QModelIndex& index ) const { qjackctlSessionInfraClientItemEditor *pItemEditor = new qjackctlSessionInfraClientItemEditor(pParent, index); pItemEditor->setDefaultText( index.model()->data(index, Qt::DisplayRole).toString()); QObject::connect(pItemEditor, SIGNAL(finishSignal()), SLOT(commitEditor())); return pItemEditor; } void qjackctlSessionInfraClientItemDelegate::setEditorData ( QWidget *pEditor, const QModelIndex& index ) const { qjackctlSessionInfraClientItemEditor *pItemEditor = qobject_cast (pEditor); pItemEditor->setText( index.model()->data(index, Qt::DisplayRole).toString()); } void qjackctlSessionInfraClientItemDelegate::setModelData ( QWidget *pEditor, QAbstractItemModel *pModel, const QModelIndex& index ) const { qjackctlSessionInfraClientItemEditor *pItemEditor = qobject_cast (pEditor); pModel->setData(index, pItemEditor->text()); } void qjackctlSessionInfraClientItemDelegate::commitEditor (void) { qjackctlSessionInfraClientItemEditor *pItemEditor = qobject_cast (sender()); const QString& sText = pItemEditor->text(); const QString& sDefaultText = pItemEditor->defaultText(); if (sText != sDefaultText) emit commitData(pItemEditor); emit closeEditor(pItemEditor); } //---------------------------------------------------------------------------- // qjackctlSessionForm -- UI wrapper form. // Constructor. qjackctlSessionForm::qjackctlSessionForm ( QWidget *pParent, Qt::WindowFlags wflags ) : QWidget(pParent, wflags) { // Setup UI struct... m_ui.setupUi(this); m_pSetup = NULL; // Common (sigleton) session object. m_pSession = new qjackctlSession(); // Set recent menu stuff... m_pRecentMenu = new QMenu(tr("&Recent")); m_ui.RecentSessionPushButton->setMenu(m_pRecentMenu); m_pSaveMenu = new QMenu(tr("&Save")); m_pSaveMenu->setIcon(QIcon(":/images/save1.png")); m_pSaveMenu->addAction(QIcon(":/images/save1.png"), tr("&Save..."), this, SLOT(saveSessionSave())); #ifdef CONFIG_JACK_SESSION m_pSaveMenu->addAction( tr("Save and &Quit..."), this, SLOT(saveSessionSaveAndQuit())); m_pSaveMenu->addAction( tr("Save &Template..."), this, SLOT(saveSessionSaveTemplate())); #endif m_ui.SaveSessionPushButton->setMenu(m_pSaveMenu); // Session tree view... QHeaderView *pHeader = m_ui.SessionTreeView->header(); // pHeader->setDefaultAlignment(Qt::AlignLeft); #if QT_VERSION >= 0x050000 // pHeader->setSectionResizeMode(QHeaderView::ResizeToContents); #else // pHeader->setResizeMode(QHeaderView::ResizeToContents); #endif pHeader->resizeSection(0, 200); // Client/Ports pHeader->resizeSection(1, 40); // UUID pHeader->setStretchLastSection(true); m_ui.SessionTreeView->setContextMenuPolicy(Qt::CustomContextMenu); // Infra-client list view... pHeader = m_ui.InfraClientListView->header(); // pHeader->setDefaultAlignment(Qt::AlignLeft); #if QT_VERSION >= 0x050000 // pHeader->setSectionResizeMode(QHeaderView::ResizeToContents); #else // pHeader->setResizeMode(QHeaderView::ResizeToContents); #endif pHeader->resizeSection(0, 120); // Infra-client pHeader->setStretchLastSection(true); m_ui.InfraClientListView->setItemDelegate( new qjackctlSessionInfraClientItemDelegate(m_ui.InfraClientListView)); m_ui.InfraClientListView->setContextMenuPolicy(Qt::CustomContextMenu); m_ui.InfraClientListView->sortItems(0, Qt::AscendingOrder); // UI connections... QObject::connect(m_ui.LoadSessionPushButton, SIGNAL(clicked()), SLOT(loadSession())); QObject::connect(m_ui.UpdateSessionPushButton, SIGNAL(clicked()), SLOT(updateSession())); QObject::connect(m_ui.SessionTreeView, SIGNAL(customContextMenuRequested(const QPoint&)), SLOT(sessionViewContextMenu(const QPoint&))); QObject::connect(m_ui.InfraClientListView, SIGNAL(currentItemChanged(QTreeWidgetItem *, QTreeWidgetItem *)), SLOT(selectInfraClient())); QObject::connect(m_ui.AddInfraClientPushButton, SIGNAL(clicked()), SLOT(addInfraClient())); QObject::connect(m_ui.EditInfraClientPushButton, SIGNAL(clicked()), SLOT(editInfraClient())); QObject::connect(m_ui.RemoveInfraClientPushButton, SIGNAL(clicked()), SLOT(removeInfraClient())); QObject::connect(m_ui.InfraClientListView->itemDelegate(), SIGNAL(commitData(QWidget *)), SLOT(editInfraClientCommit())); QObject::connect(m_ui.InfraClientListView, SIGNAL(customContextMenuRequested(const QPoint&)), SLOT(infraClientContextMenu(const QPoint&))); // Start disabled. stabilizeForm(false); } // Destructor. qjackctlSessionForm::~qjackctlSessionForm (void) { delete m_pSaveMenu; delete m_pRecentMenu; delete m_pSession; } // Set reference to global options, mostly needed for // the initial session save type and directories. void qjackctlSessionForm::setup ( qjackctlSetup *pSetup ) { m_pSetup = pSetup; if (m_pSetup) { m_ui.SaveSessionVersionCheckBox->setChecked( m_pSetup->bSessionSaveVersion); m_sessionDirs = m_pSetup->sessionDirs; // Setup infra-clients table view... QList sizes; sizes.append(320); sizes.append(120); m_pSetup->loadSplitterSizes(m_ui.InfraClientSplitter, sizes); // Load infra-clients table-view... m_pSession->loadInfraClients(m_pSetup->settings()); } updateRecentMenu(); updateInfraClients(); } // Maybe ask whether we can close. bool qjackctlSessionForm::queryClose (void) { bool bQueryClose = true; // Maybe just save some splitter sizes... if (m_pSetup && bQueryClose) { // Rebuild infra-clients list... m_pSession->clearInfraClients(); qjackctlSession::InfraClientList& list = m_pSession->infra_clients(); int iItemCount = m_ui.InfraClientListView->topLevelItemCount(); for (int i = 0; i < iItemCount; ++i) { QTreeWidgetItem *pItem = m_ui.InfraClientListView->topLevelItem(i); if (pItem) { const QString& sKey = pItem->text(0); const QString& sValue = pItem->text(1); if (!sValue.isEmpty()) { qjackctlSession::InfraClientItem *pInfraClientItem = new qjackctlSession::InfraClientItem; pInfraClientItem->client_name = sKey; pInfraClientItem->client_command = sValue; list.insert(sKey, pInfraClientItem); } } } // Save infra-clients table-view... m_pSession->saveInfraClients(m_pSetup->settings()); m_pSetup->saveSplitterSizes(m_ui.InfraClientSplitter); } return bQueryClose; } // Recent session directories accessor. const QStringList& qjackctlSessionForm::sessionDirs (void) const { return m_sessionDirs; } // Session save versioning option. bool qjackctlSessionForm::isSaveSessionVersion (void) const { return m_ui.SaveSessionVersionCheckBox->isChecked(); } // Recent menu accessor. QMenu *qjackctlSessionForm::recentMenu (void) const { return m_pRecentMenu; } // Save menu accessor. QMenu *qjackctlSessionForm::saveMenu (void) const { return m_pSaveMenu; } // Notify our parent that we're emerging. void qjackctlSessionForm::showEvent ( QShowEvent *pShowEvent ) { qjackctlMainForm *pMainForm = qjackctlMainForm::getInstance(); if (pMainForm) pMainForm->stabilizeForm(); QWidget::showEvent(pShowEvent); } // Notify our parent that we're closing. void qjackctlSessionForm::hideEvent ( QHideEvent *pHideEvent ) { QWidget::hideEvent(pHideEvent); qjackctlMainForm *pMainForm = qjackctlMainForm::getInstance(); if (pMainForm) pMainForm->stabilizeForm(); } // Just about to notify main-window that we're closing. void qjackctlSessionForm::closeEvent ( QCloseEvent * /*pCloseEvent*/ ) { QWidget::hide(); qjackctlMainForm *pMainForm = qjackctlMainForm::getInstance(); if (pMainForm) pMainForm->stabilizeForm(); } // Open/load session from specific file path. void qjackctlSessionForm::loadSession (void) { #if 0 QFileDialog loadDialog(this, tr("Load Session")); loadDialog.setAcceptMode(QFileDialog::AcceptOpen); loadDialog.setFileMode(QFileDialog::Directory); loadDialog.setViewMode(QFileDialog::List); loadDialog.setOptions(QFileDialog::ShowDirsOnly); loadDialog.setNameFilter(tr("Session directory")); loadDialog.setHistory(m_sessionDirs); if (!m_sessionDirs.isEmpty()) loadDialog.setDirectory(m_sessionDirs.first()); if (!loadDialog.exec()) return; QString sSessionDir = loadDialog.selectedFiles().first(); #else QString sSessionDir; if (!m_sessionDirs.isEmpty()) sSessionDir = m_sessionDirs.first(); sSessionDir = QFileDialog::getExistingDirectory( this, tr("Load Session"), sSessionDir); #endif loadSessionDir(sSessionDir); } // Load a recent session. void qjackctlSessionForm::recentSession (void) { QAction *pAction = qobject_cast (sender()); if (pAction) { int i = pAction->data().toInt(); if (i >= 0 && i < m_sessionDirs.count()) loadSessionDir(m_sessionDirs.at(i)); } } // Save current session to specific file path. void qjackctlSessionForm::saveSessionSave (void) { saveSessionEx(0); } void qjackctlSessionForm::saveSessionSaveAndQuit (void) { saveSessionEx(1); } void qjackctlSessionForm::saveSessionSaveTemplate (void) { saveSessionEx(2); } void qjackctlSessionForm::saveSessionEx ( int iSessionType ) { QString sTitle = tr("Save Session"); switch (iSessionType) { case 1: sTitle += ' ' + tr("and Quit"); break; case 2: sTitle += ' ' + tr("Template"); break; } #if 0 QFileDialog saveDialog(this, sTitle); saveDialog.setAcceptMode(QFileDialog::AcceptSave); saveDialog.setFileMode(QFileDialog::Directory); saveDialog.setViewMode(QFileDialog::List); saveDialog.setOptions(QFileDialog::ShowDirsOnly); saveDialog.setNameFilter(tr("Session directory")); saveDialog.setHistory(m_sessionDirs); if (!m_sessionDirs.isEmpty()) saveDialog.setDirectory(m_sessionDirs.first()); if (!saveDialog.exec()) return; QString sSessionDir = saveDialog.selectedFiles().first(); #else QString sSessionDir; if (!m_sessionDirs.isEmpty()) sSessionDir = m_sessionDirs.first(); sSessionDir = QFileDialog::getExistingDirectory( this, sTitle, sSessionDir); #endif saveSessionDir(sSessionDir, iSessionType); } // Save current session to specific file path. void qjackctlSessionForm::saveSessionVersion ( bool bOn ) { m_ui.SaveSessionVersionCheckBox->setChecked(bOn); } // Update the recent session list and menu. void qjackctlSessionForm::updateRecent ( const QString& sSessionDir ) { int i = m_sessionDirs.indexOf(sSessionDir); if (i >= 0) m_sessionDirs.removeAt(i); m_sessionDirs.prepend(sSessionDir); updateRecentMenu(); } // Update/stabilize recent sessions menu. void qjackctlSessionForm::updateRecentMenu (void) { int iRecent = m_sessionDirs.count(); for (; iRecent > 8; --iRecent) m_sessionDirs.pop_back(); m_pRecentMenu->clear(); for (int i = 0; i < iRecent; ++i) { const QString& sSessionDir = m_sessionDirs.at(i); if (QDir(sSessionDir).exists()) { QAction *pAction = m_pRecentMenu->addAction( QFileInfo(sSessionDir).fileName(), this, SLOT(recentSession())); pAction->setData(i); } } if (iRecent > 0) { m_pRecentMenu->addSeparator(); m_pRecentMenu->addAction(tr("&Clear"), this, SLOT(clearRecentMenu())); } m_ui.RecentSessionPushButton->setEnabled(iRecent > 0); } // Clear recent sessions menu. void qjackctlSessionForm::clearRecentMenu (void) { m_sessionDirs.clear(); updateRecentMenu(); } // Open/load session from specific file path. void qjackctlSessionForm::loadSessionDir ( const QString& sSessionDir ) { if (sSessionDir.isEmpty()) return; const QDir sessionDir(sSessionDir); if (!sessionDir.exists("session.xml")) { QMessageBox::critical(this, tr("Warning") + " - " QJACKCTL_SUBTITLE1, tr("A session could not be found in this folder:\n\n\"%1\"") .arg(sSessionDir)); return; } qjackctlMainForm *pMainForm = qjackctlMainForm::getInstance(); if (pMainForm == NULL) return; jack_client_t *pJackClient = pMainForm->jackClient(); if (pJackClient == NULL) return; pMainForm->appendMessages( tr("%1: loading session...").arg(sSessionDir)); QApplication::setOverrideCursor(QCursor(Qt::WaitCursor)); bool bLoadSession = m_pSession->load(sSessionDir); if (bLoadSession) updateRecent(sessionDir.absolutePath()); updateSessionView(); QApplication::restoreOverrideCursor(); pMainForm->appendMessages( tr("%1: load session %2.").arg(sSessionDir) .arg(bLoadSession ? "OK" : "FAILED")); } // Save current session to specific file path. void qjackctlSessionForm::saveSessionDir ( const QString& sSessionDir, int iSessionType ) { if (sSessionDir.isEmpty()) return; QDir sessionDir(sSessionDir); const QList list = sessionDir.entryInfoList(QDir::AllEntries | QDir::NoDotAndDotDot); if (!list.isEmpty()) { if (sessionDir.exists("session.xml")) { if (QMessageBox::warning(this, tr("Warning") + " - " QJACKCTL_SUBTITLE1, tr("A session already exists in this folder:\n\n\"%1\"\n\n" "Are you sure to overwrite the existing session?").arg(sSessionDir), QMessageBox::Ok | QMessageBox::Cancel) == QMessageBox::Cancel) return; } else { if (QMessageBox::warning(this, tr("Warning") + " - " QJACKCTL_SUBTITLE1, tr("This folder already exists and is not empty:\n\n\"%1\"\n\n" "Are you sure to overwrite the existing folder?").arg(sSessionDir), QMessageBox::Ok | QMessageBox::Cancel) == QMessageBox::Cancel) return; } // remove_dir_list(list); } qjackctlMainForm *pMainForm = qjackctlMainForm::getInstance(); if (pMainForm == NULL) return; jack_client_t *pJackClient = pMainForm->jackClient(); if (pJackClient == NULL) return; pMainForm->appendMessages( tr("%1: saving session...").arg(sSessionDir)); QApplication::setOverrideCursor(QCursor(Qt::WaitCursor)); if (!list.isEmpty()) { if (isSaveSessionVersion()) { int iSessionDirNo = 0; const QString sSessionDirMask = sSessionDir + ".%1"; QFileInfo fi(sSessionDirMask.arg(++iSessionDirNo)); while (fi.exists()) fi.setFile(sSessionDirMask.arg(++iSessionDirNo)); sessionDir.rename(sSessionDir, fi.absoluteFilePath()); } else remove_dir_list(list); sessionDir.refresh(); } if (!sessionDir.exists()) sessionDir.mkpath(sSessionDir); bool bSaveSession = m_pSession->save(sSessionDir, iSessionType); if (bSaveSession) updateRecent(sSessionDir); updateSessionView(); QApplication::restoreOverrideCursor(); pMainForm->appendMessages( tr("%1: save session %2.").arg(sSessionDir) .arg(bSaveSession ? "OK" : "FAILED")); } // Set icon error status according to given flag. QIcon qjackctlSessionForm::iconStatus ( const QIcon& icon, bool bStatus ) { QPixmap pm(icon.pixmap(16, 16)); // Merge with the overlay pixmap... if (bStatus) { const QPixmap pmOverlay(":/images/error1.png"); if (!pmOverlay.mask().isNull()) { QBitmap mask = pm.mask(); QPainter(&mask).drawPixmap(0, 0, pmOverlay.mask()); pm.setMask(mask); QPainter(&pm).drawPixmap(0, 0, pmOverlay); } } return QIcon(pm); } // Update/populate session tree view. void qjackctlSessionForm::updateSessionView (void) { m_ui.SessionTreeView->clear(); QList items; const QIcon iconClient(":/images/client1.png"); const QIcon iconPort(":/images/port1.png"); const QIcon iconConnect(":/images/connect1.png"); qjackctlSession::ClientList::ConstIterator iterClient = m_pSession->clients().constBegin(); for ( ; iterClient != m_pSession->clients().constEnd(); ++iterClient) { qjackctlSession::ClientItem *pClientItem = iterClient.value(); QTreeWidgetItem *pTopLevelItem = new QTreeWidgetItem(); pTopLevelItem->setIcon(0, iconStatus(iconClient, pClientItem->connected)); pTopLevelItem->setText(0, pClientItem->client_name); pTopLevelItem->setText(1, pClientItem->client_uuid); pTopLevelItem->setText(2, pClientItem->client_command); QListIterator iterPort(pClientItem->ports); QTreeWidgetItem *pChildItem = NULL; while (iterPort.hasNext()) { qjackctlSession::PortItem *pPortItem = iterPort.next(); pChildItem = new QTreeWidgetItem(pTopLevelItem, pChildItem); pChildItem->setIcon(0, iconStatus(iconPort, pPortItem->connected)); pChildItem->setText(0, pPortItem->port_name); QListIterator iterConnect(pPortItem->connects); QTreeWidgetItem *pLeafItem = NULL; while (iterConnect.hasNext()) { qjackctlSession::ConnectItem *pConnectItem = iterConnect.next(); pLeafItem = new QTreeWidgetItem(pChildItem, pLeafItem); pLeafItem->setIcon(0, iconStatus(iconConnect, !pConnectItem->connected)); pLeafItem->setText(0, pConnectItem->client_name + ':' + pConnectItem->port_name); } } items.append(pTopLevelItem); } m_ui.SessionTreeView->insertTopLevelItems(0, items); m_ui.SessionTreeView->expandAll(); } // Update/populate session connections and tree view. void qjackctlSessionForm::updateSession (void) { m_pSession->update(); updateSessionView(); updateInfraClients(); } // Context menu event handler. void qjackctlSessionForm::sessionViewContextMenu ( const QPoint& pos ) { QMenu menu(this); QAction *pAction; bool bEnabled = false; qjackctlMainForm *pMainForm = qjackctlMainForm::getInstance(); if (pMainForm) bEnabled = (pMainForm->jackClient() != NULL); pAction = menu.addAction(QIcon(":/images/open1.png"), tr("&Load..."), this, SLOT(loadSession())); pAction->setEnabled(bEnabled); pAction = menu.addMenu(m_pRecentMenu); pAction->setEnabled(bEnabled && !m_pRecentMenu->isEmpty()); menu.addSeparator(); pAction = menu.addAction(QIcon(":/images/save1.png"), tr("&Save..."), this, SLOT(saveSessionSave())); pAction->setEnabled(bEnabled); #ifdef CONFIG_JACK_SESSION pAction = menu.addAction( tr("Save and &Quit..."), this, SLOT(saveSessionSaveAndQuit())); pAction->setEnabled(bEnabled); pAction = menu.addAction( tr("Save &Template..."), this, SLOT(saveSessionSaveTemplate())); pAction->setEnabled(bEnabled); #endif menu.addSeparator(); pAction = menu.addAction( tr("&Versioning"), this, SLOT(saveSessionVersion(bool))); pAction->setCheckable(true); pAction->setChecked(isSaveSessionVersion()); pAction->setEnabled(bEnabled); menu.addSeparator(); pAction = menu.addAction(QIcon(":/images/refresh1.png"), tr("Re&fresh"), this, SLOT(updateSession())); menu.exec(m_ui.SessionTreeView->mapToGlobal(pos)); } // Add a new infra-client entry. void qjackctlSessionForm::addInfraClient (void) { #ifdef CONFIG_DEBUG_0 qDebug("qjackctlSessionForm::addInfraClient()"); #endif const QString& sNewInfraClient = tr("New Client"); QTreeWidgetItem *pItem = NULL; const QList& items = m_ui.InfraClientListView->findItems(sNewInfraClient, Qt::MatchExactly); if (items.isEmpty()) { pItem = m_ui.InfraClientListView->currentItem(); pItem = new QTreeWidgetItem(m_ui.InfraClientListView, pItem); pItem->setIcon(0, iconStatus(QIcon(":/images/client1.png"), true)); pItem->setText(0, sNewInfraClient); pItem->setFlags(pItem->flags() | Qt::ItemIsEditable); } else { pItem = items.first(); } m_ui.InfraClientListView->editItem(pItem, 0); } // Edit current infra-client entry. void qjackctlSessionForm::editInfraClient (void) { #ifdef CONFIG_DEBUG_0 qDebug("qjackctlSessionForm::editInfraClient()"); #endif QTreeWidgetItem *pItem = m_ui.InfraClientListView->currentItem(); if (pItem) m_ui.InfraClientListView->editItem(pItem, 1); } void qjackctlSessionForm::editInfraClientCommit (void) { #ifdef CONFIG_DEBUG_0 qDebug("qjackctlSessionForm::editInfraClientCommit()"); #endif QTreeWidgetItem *pItem = m_ui.InfraClientListView->currentItem(); if (pItem) { const QString& sKey = pItem->text(0); if (!sKey.isEmpty()) { const QString& sValue = pItem->text(1); qjackctlSession::InfraClientItem *pInfraClientItem = NULL; qjackctlSession::InfraClientList& list = m_pSession->infra_clients(); qjackctlSession::InfraClientList::Iterator iter = list.find(sKey); if (iter == list.end()) { pInfraClientItem = new qjackctlSession::InfraClientItem; pInfraClientItem->client_name = sKey; pInfraClientItem->client_command = sValue; list.insert(sKey, pInfraClientItem); } else { pInfraClientItem = iter.value(); pInfraClientItem->client_command = sValue; } pItem->setIcon(0, iconStatus(QIcon(":/images/client1.png"), pInfraClientItem->client_command.isEmpty())); } } } // Remove current infra-client entry. void qjackctlSessionForm::removeInfraClient (void) { #ifdef CONFIG_DEBUG_0 qDebug("qjackctlSessionForm::removeInfraClient()"); #endif QTreeWidgetItem *pItem = m_ui.InfraClientListView->currentItem(); if (pItem) { const QString& sKey = pItem->text(0); qjackctlSession::InfraClientList& list = m_pSession->infra_clients(); qjackctlSession::InfraClientList::Iterator iter = list.find(sKey); if (iter != list.end()) { list.erase(iter); updateInfraClients(); } } } // Select current infra-client entry. void qjackctlSessionForm::selectInfraClient (void) { #ifdef CONFIG_DEBUG_0 qDebug("qjackctlSessionForm::selectInfraClient()"); #endif QTreeWidgetItem *pItem = m_ui.InfraClientListView->currentItem(); m_ui.AddInfraClientPushButton->setEnabled(true); m_ui.EditInfraClientPushButton->setEnabled(pItem != NULL); m_ui.RemoveInfraClientPushButton->setEnabled(pItem != NULL); } // Update/populate infra-clients commands list view. void qjackctlSessionForm::updateInfraClients (void) { #ifdef CONFIG_DEBUG_0 qDebug("qjackctlSessionForm::updateInfraClients()"); #endif int iOldItem = m_ui.InfraClientListView->indexOfTopLevelItem( m_ui.InfraClientListView->currentItem()); m_ui.InfraClientListView->clear(); const QIcon iconClient(":/images/client1.png"); QTreeWidgetItem *pItem = NULL; qjackctlSession::InfraClientList& list = m_pSession->infra_clients(); qjackctlSession::InfraClientList::ConstIterator iter = list.constBegin(); const qjackctlSession::InfraClientList::ConstIterator& iter_end = list.constEnd(); for( ; iter != iter_end; ++iter) { qjackctlSession::InfraClientItem *pInfraClientItem = iter.value(); pItem = new QTreeWidgetItem(m_ui.InfraClientListView, pItem); pItem->setIcon(0, iconStatus(iconClient, pInfraClientItem->client_command.isEmpty())); pItem->setText(0, pInfraClientItem->client_name); pItem->setText(1, pInfraClientItem->client_command); pItem->setFlags(pItem->flags() | Qt::ItemIsEditable); } int iItemCount = m_ui.InfraClientListView->topLevelItemCount(); if (iOldItem >= 0 && iOldItem < iItemCount) { m_ui.InfraClientListView->setCurrentItem( m_ui.InfraClientListView->topLevelItem(iOldItem)); } } // Infra-client list context menu. void qjackctlSessionForm::infraClientContextMenu ( const QPoint& pos ) { QMenu menu(this); QAction *pAction; QTreeWidgetItem *pItem = m_ui.InfraClientListView->currentItem(); pAction = menu.addAction(QIcon(":/images/add1.png"), tr("&Add"), this, SLOT(addInfraClient())); // pAction->setEnabled(true); pAction = menu.addAction(QIcon(":/images/edit1.png"), tr("&Edit"), this, SLOT(editInfraClient())); pAction->setEnabled(pItem != NULL); pAction = menu.addAction(QIcon(":/images/remove1.png"), tr("Re&move"), this, SLOT(removeInfraClient())); pAction->setEnabled(pItem != NULL); menu.addSeparator(); pAction = menu.addAction(QIcon(":/images/refresh1.png"), tr("Re&fresh"), this, SLOT(updateInfraClients())); // pAction->setEnabled(true); menu.exec(m_ui.InfraClientListView->mapToGlobal(pos)); } // Stabilize form status. void qjackctlSessionForm::stabilizeForm ( bool bEnabled ) { m_ui.LoadSessionPushButton->setEnabled(bEnabled); m_ui.RecentSessionPushButton->setEnabled(bEnabled && !m_pRecentMenu->isEmpty()); m_ui.SaveSessionPushButton->setEnabled(bEnabled); m_ui.SaveSessionVersionCheckBox->setEnabled(bEnabled); m_ui.UpdateSessionPushButton->setEnabled(bEnabled); if (!bEnabled) { m_pSession->clear(); m_ui.SessionTreeView->clear(); } selectInfraClient(); } // Keyboard event handler. void qjackctlSessionForm::keyPressEvent ( QKeyEvent *pKeyEvent ) { #ifdef CONFIG_DEBUG_0 qDebug("qjackctlSessionForm::keyPressEvent(%d)", pKeyEvent->key()); #endif int iKey = pKeyEvent->key(); switch (iKey) { case Qt::Key_Escape: close(); break; default: QWidget::keyPressEvent(pKeyEvent); break; } } // end of qjackctlSessionForm.cpp qjackctl-0.4.2/src/PaxHeaders.14935/qjackctlInterfaceComboBox.cpp0000644000000000000000000000013212700760152021414 xustar0030 mtime=1459871850.618907789 30 atime=1459871850.618907789 30 ctime=1459871850.618907789 qjackctl-0.4.2/src/qjackctlInterfaceComboBox.cpp0000644000175000001440000003145612700760152022171 0ustar00rncbcusers00000000000000// qjackctlInterfaceComboBox.cpp // /**************************************************************************** Copyright (C) 2013, Arnout Engelen. All rights reserved. Copyright (C) 2003-2015, rncbc aka Rui Nuno Capela. All rights reserved. Copyright (C) 2015, Kjetil Matheussen. (portaudio_probe_thread) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. *****************************************************************************/ #include "qjackctlAbout.h" #include "qjackctlInterfaceComboBox.h" #include "qjackctlSetup.h" #include #include #include #include #include #include #ifdef CONFIG_COREAUDIO #include #include #include #include #include #endif #ifdef CONFIG_PORTAUDIO #include #include #include #endif #ifdef CONFIG_ALSA_SEQ #include #endif // Constructor. qjackctlInterfaceComboBox::qjackctlInterfaceComboBox ( QWidget *pParent ) : QComboBox(pParent) { QTreeView *pTreeView = new QTreeView(this); pTreeView->header()->hide(); pTreeView->setRootIsDecorated(false); pTreeView->setAllColumnsShowFocus(true); pTreeView->setSelectionBehavior(QAbstractItemView::SelectRows); pTreeView->setSelectionMode(QAbstractItemView::SingleSelection); pTreeView->setModel(new QStandardItemModel()); // pTreeView->setMinimumWidth(320); QComboBox::setView(pTreeView); } void qjackctlInterfaceComboBox::showPopup (void) { populateModel(); QComboBox::showPopup(); } QStandardItemModel *qjackctlInterfaceComboBox::model (void) const { return static_cast (QComboBox::model()); } void qjackctlInterfaceComboBox::setup ( QComboBox *pDriverComboBox, int iAudio, const QString& sDefName ) { m_pDriverComboBox = pDriverComboBox; m_iAudio = iAudio; m_sDefName = sDefName; } void qjackctlInterfaceComboBox::clearCards (void) { model()->clear(); } void qjackctlInterfaceComboBox::addCard ( const QString& sName, const QString& sDescription ) { QList items; if (sName == m_sDefName || sName.isEmpty()) items.append(new QStandardItem(m_sDefName)); else items.append(new QStandardItem(QIcon(":/images/device1.png"), sName)); items.append(new QStandardItem(sDescription)); model()->appendRow(items); } #ifdef CONFIG_COREAUDIO // borrowed from jackpilot source static OSStatus getDeviceUIDFromID( AudioDeviceID id, char *name, UInt32 nsize ) { UInt32 size = sizeof(CFStringRef); CFStringRef UI; OSStatus res = AudioDeviceGetProperty(id, 0, false, kAudioDevicePropertyDeviceUID, &size, &UI); if (res == noErr) CFStringGetCString(UI,name,nsize,CFStringGetSystemEncoding()); CFRelease(UI); return res; } #endif // CONFIG_COREAUDIO #ifdef CONFIG_PORTAUDIO #include #include #include #include namespace { class PortAudioProber : public QThread { public: static QStringList getNames(QWidget *pParent) { { QMutexLocker locker(&PortAudioProber::mutex); if (!PortAudioProber::names.isEmpty()) return PortAudioProber::names; } QMessageBox mbox(QMessageBox::Information, tr("Probing..."), tr("Please wait, PortAudio is probing audio hardware."), QMessageBox::Abort, pParent); // Make it impossible to start another PortAudioProber while waiting. mbox.setWindowModality(Qt::WindowModal); PortAudioProber *pab = new PortAudioProber; pab->start(); bool bTimedOut = true; for (int i = 0; i < 100; ++i) { if (mbox.isVisible()) QApplication::processEvents(); QThread::msleep(50); if (i == 10) // wait 1/2 second before showing message box mbox.show(); if (mbox.clickedButton() != NULL) { bTimedOut = false; break; } if (pab->isFinished()) { bTimedOut = false; break; } } if (bTimedOut) { QMessageBox::warning(pParent, tr("Warning"), tr("Audio hardware probing timed out.")); } { QMutexLocker locker(&PortAudioProber::mutex); return names; } } private: PortAudioProber() {} ~PortAudioProber() {} static QMutex mutex; static QStringList names; void run() { if (Pa_Initialize() == paNoError) { // Fill HostApi info... const PaHostApiIndex iNumHostApi = Pa_GetHostApiCount(); QString hostNames[iNumHostApi]; for (PaHostApiIndex i = 0; i < iNumHostApi; ++i) hostNames[i] = QString(Pa_GetHostApiInfo(i)->name); // Fill device info... const PaDeviceIndex iNumDevice = Pa_GetDeviceCount(); { QMutexLocker locker(&PortAudioProber::mutex); if (PortAudioProber::names.isEmpty()) { for (PaDeviceIndex i = 0; i < iNumDevice; ++i) { PaDeviceInfo *pDeviceInfo = const_cast (Pa_GetDeviceInfo(i)); const QString sName = hostNames[pDeviceInfo->hostApi] + "::" + QString(pDeviceInfo->name); PortAudioProber::names.push_back(sName); } } } Pa_Terminate(); } } }; QMutex PortAudioProber::mutex; QStringList PortAudioProber::names; } // namespace #endif // CONFIG_PORTAUDIO void qjackctlInterfaceComboBox::populateModel (void) { const bool bBlockSignals = QComboBox::blockSignals(true); QComboBox::setUpdatesEnabled(false); QComboBox::setDuplicatesEnabled(false); QLineEdit *pLineEdit = QComboBox::lineEdit(); // FIXME: Only valid for ALSA, Sun and OSS devices, // for the time being... and also CoreAudio ones too. const QString& sDriver = m_pDriverComboBox->currentText(); const bool bAlsa = (sDriver == "alsa"); const bool bSun = (sDriver == "sun"); const bool bOss = (sDriver == "oss"); #ifdef CONFIG_COREAUDIO const bool bCoreaudio = (sDriver == "coreaudio"); std::map coreaudioIdMap; #endif #ifdef CONFIG_PORTAUDIO const bool bPortaudio = (sDriver == "portaudio"); #endif QString sCurName = pLineEdit->text(); QString sName, sSubName; int iCards = 0; clearCards(); int iCurCard = -1; if (bAlsa) { #ifdef CONFIG_ALSA_SEQ // Enumerate the ALSA cards and PCM harfware devices... snd_ctl_t *handle; snd_ctl_card_info_t *info; snd_pcm_info_t *pcminfo; snd_ctl_card_info_alloca(&info); snd_pcm_info_alloca(&pcminfo); const QString sPrefix("hw:%1"); const QString sSuffix(" (%1)"); const QString sSubSuffix("%1,%2"); QString sName2, sSubName2; bool bCapture, bPlayback; int iCard = -1; while (snd_card_next(&iCard) >= 0 && iCard >= 0) { sName = sPrefix.arg(iCard); if (snd_ctl_open(&handle, sName.toUtf8().constData(), 0) >= 0 && snd_ctl_card_info(handle, info) >= 0) { sName2 = sPrefix.arg(snd_ctl_card_info_get_id(info)); addCard(sName2, snd_ctl_card_info_get_name(info) + sSuffix.arg(sName)); if (sCurName == sName || sCurName == sName2) iCurCard = iCards; ++iCards; int iDevice = -1; while (snd_ctl_pcm_next_device(handle, &iDevice) >= 0 && iDevice >= 0) { // Capture devices.. bCapture = false; if (m_iAudio == QJACKCTL_CAPTURE || m_iAudio == QJACKCTL_DUPLEX) { snd_pcm_info_set_device(pcminfo, iDevice); snd_pcm_info_set_subdevice(pcminfo, 0); snd_pcm_info_set_stream(pcminfo, SND_PCM_STREAM_CAPTURE); bCapture = (snd_ctl_pcm_info(handle, pcminfo) >= 0); } // Playback devices.. bPlayback = false; if (m_iAudio == QJACKCTL_PLAYBACK || m_iAudio == QJACKCTL_DUPLEX) { snd_pcm_info_set_device(pcminfo, iDevice); snd_pcm_info_set_subdevice(pcminfo, 0); snd_pcm_info_set_stream(pcminfo, SND_PCM_STREAM_PLAYBACK); bPlayback = (snd_ctl_pcm_info(handle, pcminfo) >= 0); } // List iif compliant with the audio mode criteria... if ((m_iAudio == QJACKCTL_CAPTURE && bCapture && !bPlayback) || (m_iAudio == QJACKCTL_PLAYBACK && !bCapture && bPlayback) || (m_iAudio == QJACKCTL_DUPLEX && bCapture && bPlayback)) { sSubName = sSubSuffix.arg(sName).arg(iDevice); sSubName2 = sSubSuffix.arg(sName2).arg(iDevice); addCard(sSubName2, snd_pcm_info_get_name(pcminfo) + sSuffix.arg(sSubName)); if (sCurName == sSubName || sCurName == sSubName2) iCurCard = iCards; ++iCards; } } snd_ctl_close(handle); } } #endif // CONFIG_ALSA_SEQ } else if (bSun) { QFile file("/var/run/dmesg.boot"); if (file.open(QIODevice::ReadOnly)) { QTextStream stream(&file); QString sLine; QRegExp rxDevice("audio([0-9]) at (.*)"); while (!stream.atEnd()) { sLine = stream.readLine(); if (rxDevice.exactMatch(sLine)) { sName = "/dev/audio" + rxDevice.cap(1); addCard(sName, rxDevice.cap(2)); if (sCurName == sName) iCurCard = iCards; ++iCards; } } file.close(); } } else if (bOss) { // Enumerate the OSS Audio devices... QFile file("/dev/sndstat"); if (file.open(QIODevice::ReadOnly)) { QTextStream stream(&file); QString sLine; bool bAudioDevices = false; QRegExp rxHeader("Audio devices.*", Qt::CaseInsensitive); QRegExp rxDevice("([0-9]+):[ ]+(.*)"); while (!stream.atEnd()) { sLine = stream.readLine(); if (bAudioDevices) { if (rxDevice.exactMatch(sLine)) { sName = "/dev/dsp" + rxDevice.cap(1); addCard(sName, rxDevice.cap(2)); if (sCurName == sName) iCurCard = iCards; ++iCards; } else break; } else if (rxHeader.exactMatch(sLine)) bAudioDevices = true; } file.close(); } } #ifdef CONFIG_COREAUDIO else if (bCoreaudio) { // Find out how many Core Audio devices are there, if any... // (code snippet gently "borrowed" from Stephane Letz jackdmp;) OSStatus err; Boolean isWritable; UInt32 outSize = sizeof(isWritable); err = AudioHardwareGetPropertyInfo(kAudioHardwarePropertyDevices, &outSize, &isWritable); if (err == noErr) { // Calculate the number of device available... int numCoreDevices = outSize / sizeof(AudioDeviceID); // Make space for the devices we are about to get... AudioDeviceID *coreDeviceIDs = new AudioDeviceID [numCoreDevices]; err = AudioHardwareGetProperty(kAudioHardwarePropertyDevices, &outSize, (void *) coreDeviceIDs); if (err == noErr) { // Look for the CoreAudio device name... char coreDeviceName[256]; UInt32 nameSize = 256; for (int i = 0; i < numCoreDevices; i++) { err = AudioDeviceGetPropertyInfo(coreDeviceIDs[i], 0, true, kAudioDevicePropertyDeviceName, &outSize, &isWritable); if (err == noErr) { err = AudioDeviceGetProperty(coreDeviceIDs[i], 0, true, kAudioDevicePropertyDeviceName, &nameSize, (void *) coreDeviceName); if (err == noErr) { char drivername[128]; UInt32 dnsize = 128; // this returns the unique id for the device // that must be used on the commandline for jack if (getDeviceUIDFromID(coreDeviceIDs[i], drivername, dnsize) == noErr) { sName = drivername; } else { sName = "Error"; } coreaudioIdMap[sName] = coreDeviceIDs[i]; // TODO: hide this ugly ID from the user, // only show human readable name // humanreadable \t UID sSubName = QString(coreDeviceName); addCard(sName, sSubName); if (sCurName == sName || sCurName == sSubName) iCurCard = iCards; ++iCards; } } } } delete [] coreDeviceIDs; } } #endif // CONFIG_COREAUDIO #ifdef CONFIG_PORTAUDIO else if (bPortaudio) { const QStringList& names = PortAudioProber::getNames(this); const int iCards = names.size(); for (int i = 0; i < iCards; ++i) { const QString& sName = names[i]; if (sCurName == sName) iCurCard = iCards; addCard(sName, QString()); } } #endif // CONFIG_PORTAUDIO addCard(m_sDefName, QString()); if (sCurName == m_sDefName || sCurName.isEmpty()) iCurCard = iCards; ++iCards; QTreeView *pTreeView = static_cast (QComboBox::view()); #if QT_VERSION < 0x050000 pTreeView->header()->setResizeMode(QHeaderView::ResizeToContents); #else pTreeView->header()->resizeSections(QHeaderView::ResizeToContents); #endif pTreeView->setMinimumWidth( pTreeView->sizeHint().width() + QComboBox::iconSize().width()); QComboBox::setCurrentIndex(iCurCard); pLineEdit->setText(sCurName); QComboBox::setUpdatesEnabled(true); QComboBox::blockSignals(bBlockSignals); } // end of qjackctlInterfaceComboBox.cpp qjackctl-0.4.2/src/PaxHeaders.14935/qjackctlSystemTray.cpp0000644000000000000000000000013212700760152020207 xustar0030 mtime=1459871850.627912288 30 atime=1459871850.627912288 30 ctime=1459871850.627912288 qjackctl-0.4.2/src/qjackctlSystemTray.cpp0000644000175000001440000000757412700760152020770 0ustar00rncbcusers00000000000000// qjackctlSystemTray.cpp // /**************************************************************************** Copyright (C) 2003-2016, rncbc aka Rui Nuno Capela. All rights reserved. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. *****************************************************************************/ #include "qjackctlAbout.h" #include "qjackctlSystemTray.h" #include #include #if QT_VERSION < 0x040500 namespace Qt { const WindowFlags WindowCloseButtonHint = WindowFlags(0x08000000); } #endif //---------------------------------------------------------------------------- // qjackctlSystemTray -- Custom system tray widget. // Constructor. qjackctlSystemTray::qjackctlSystemTray ( QWidget *pParent ) : QSystemTrayIcon(pParent) { // Set things inherited... if (pParent) { m_icon = pParent->windowIcon(); setBackground(Qt::transparent); // also updates pixmap. QSystemTrayIcon::setIcon(m_icon); QSystemTrayIcon::setToolTip(pParent->windowTitle()); } // Set proper context menu, even though it's empty... QSystemTrayIcon::setContextMenu(&m_menu); QObject::connect(&m_menu, SIGNAL(aboutToShow()), SLOT(contextMenuRequested())); QObject::connect(this, SIGNAL(activated(QSystemTrayIcon::ActivationReason)), SLOT(activated(QSystemTrayIcon::ActivationReason))); QSystemTrayIcon::show(); } // Redirect to hide. void qjackctlSystemTray::close (void) { QSystemTrayIcon::hide(); } // Handle systeam tray activity. void qjackctlSystemTray::activated ( QSystemTrayIcon::ActivationReason reason ) { switch (reason) { #if 0 case QSystemTrayIcon::Context: contextMenuRequested(); break; #endif case QSystemTrayIcon::Trigger: emit clicked(); break; case QSystemTrayIcon::MiddleClick: emit middleClicked(); break; case QSystemTrayIcon::DoubleClick: emit doubleClicked(); break; case QSystemTrayIcon::Unknown: default: break; } } void qjackctlSystemTray::contextMenuRequested (void) { emit contextMenuRequested(QCursor::pos()); } // Default destructor. qjackctlSystemTray::~qjackctlSystemTray (void) { } // System tray icon/pixmaps update method. void qjackctlSystemTray::updatePixmap (void) { // Renitialize icon as fit... m_pixmap = m_icon.pixmap(22, 22); // Merge with the overlay pixmap... if (!m_pixmapOverlay.mask().isNull()) { QBitmap mask = m_pixmap.mask(); QPainter(&mask).drawPixmap(0, 0, m_pixmapOverlay.mask()); m_pixmap.setMask(mask); QPainter(&m_pixmap).drawPixmap(0, 0, m_pixmapOverlay); } if (m_background != Qt::transparent) { QPixmap pixmap(m_pixmap); m_pixmap.fill(m_background); QPainter(&m_pixmap).drawPixmap(0, 0, pixmap); } // Setup system tray icon directly... QSystemTrayIcon::setIcon(QIcon(m_pixmap)); } // Background mask methods. void qjackctlSystemTray::setBackground ( const QColor& background ) { // Set background color, now. m_background = background; updatePixmap(); } const QColor& qjackctlSystemTray::background (void) const { return m_background; } // Set system tray icon overlay. void qjackctlSystemTray::setPixmapOverlay ( const QPixmap& pmOverlay ) { m_pixmapOverlay = pmOverlay; updatePixmap(); } const QPixmap& qjackctlSystemTray::pixmapOverlay (void) const { return m_pixmapOverlay; } // end of qjackctlSystemTray.cpp qjackctl-0.4.2/src/PaxHeaders.14935/qjackctlSetupForm.cpp0000644000000000000000000000013212700760152020007 xustar0030 mtime=1459871850.625911288 30 atime=1459871850.625911288 30 ctime=1459871850.625911288 qjackctl-0.4.2/src/qjackctlSetupForm.cpp0000644000175000001440000016566712700760152020600 0ustar00rncbcusers00000000000000// qjackctlSetupForm.cpp // /**************************************************************************** Copyright (C) 2003-2016, rncbc aka Rui Nuno Capela. All rights reserved. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. *****************************************************************************/ #include "qjackctlAbout.h" #include "qjackctlSetupForm.h" #include "qjackctlMainForm.h" #include "qjackctlSetup.h" #include #include #include #include #include #include #include #include #include #ifdef CONFIG_COREAUDIO #include #include #include #include #include #endif #ifdef CONFIG_PORTAUDIO #include #include #include #endif #ifdef CONFIG_ALSA_SEQ #include #endif //---------------------------------------------------------------------------- // qjackctlSetupForm -- UI wrapper form. // Constructor. qjackctlSetupForm::qjackctlSetupForm ( QWidget *pParent, Qt::WindowFlags wflags ) : QDialog(pParent, wflags) { // Setup UI struct... m_ui.setupUi(this); // No settings descriptor initially (the caller will set it). m_pSetup = NULL; // Setup time-display radio-button group. m_pTimeDisplayButtonGroup = new QButtonGroup(this); m_pTimeDisplayButtonGroup->addButton(m_ui.TransportTimeRadioButton, 0); m_pTimeDisplayButtonGroup->addButton(m_ui.TransportBBTRadioButton, 1); m_pTimeDisplayButtonGroup->addButton(m_ui.ElapsedResetRadioButton, 2); m_pTimeDisplayButtonGroup->addButton(m_ui.ElapsedXrunRadioButton, 3); m_pTimeDisplayButtonGroup->setExclusive(true); // Initialize dirty control state. m_iDirtySetup = 0; m_iDirtySettings = 0; m_iDirtyOptions = 0; // Set dialog validators... m_ui.PresetComboBox->setValidator( new QRegExpValidator(QRegExp("[\\w-]+"), m_ui.PresetComboBox)); m_ui.FramesComboBox->setValidator( new QIntValidator(m_ui.FramesComboBox)); m_ui.SampleRateComboBox->setValidator( new QIntValidator(m_ui.SampleRateComboBox)); m_ui.WaitComboBox->setValidator( new QIntValidator(m_ui.WaitComboBox)); m_ui.WordLengthComboBox->setValidator( new QIntValidator(m_ui.WordLengthComboBox)); m_ui.TimeoutComboBox->setValidator( new QIntValidator(m_ui.TimeoutComboBox)); m_ui.PortMaxComboBox->setValidator( new QIntValidator(m_ui.PortMaxComboBox)); m_ui.MessagesLimitLinesComboBox->setValidator( new QIntValidator(m_ui.MessagesLimitLinesComboBox)); m_ui.PresetComboBox->setCompleter(NULL); m_ui.ServerNameComboBox->setCompleter(NULL); m_ui.ServerPrefixComboBox->setCompleter(NULL); m_ui.ServerSuffixComboBox->setCompleter(NULL); // UI connections... QObject::connect(m_ui.PresetComboBox, SIGNAL(editTextChanged(const QString&)), SLOT(changeCurrentPreset(const QString&))); QObject::connect(m_ui.PresetSavePushButton, SIGNAL(clicked()), SLOT(saveCurrentPreset())); QObject::connect(m_ui.PresetDeletePushButton, SIGNAL(clicked()), SLOT(deleteCurrentPreset())); QObject::connect(m_ui.DriverComboBox, SIGNAL(activated(int)), SLOT(changeDriver(int))); QObject::connect(m_ui.AudioComboBox, SIGNAL(activated(int)), SLOT(changeAudio(int))); QObject::connect(m_ui.ServerPrefixComboBox, SIGNAL(editTextChanged(const QString&)), SLOT(settingsChanged())); QObject::connect(m_ui.ServerNameComboBox, SIGNAL(editTextChanged(const QString&)), SLOT(settingsChanged())); QObject::connect(m_ui.DriverComboBox, SIGNAL(activated(int)), SLOT(settingsChanged())); QObject::connect(m_ui.RealtimeCheckBox, SIGNAL(stateChanged(int)), SLOT(settingsChanged())); QObject::connect(m_ui.NoMemLockCheckBox, SIGNAL(stateChanged(int)), SLOT(settingsChanged())); QObject::connect(m_ui.SoftModeCheckBox, SIGNAL(stateChanged(int)), SLOT(settingsChanged())); QObject::connect(m_ui.MonitorCheckBox, SIGNAL(stateChanged(int)), SLOT(settingsChanged())); QObject::connect(m_ui.ShortsCheckBox, SIGNAL(stateChanged(int)), SLOT(settingsChanged())); QObject::connect(m_ui.HWMonCheckBox, SIGNAL(stateChanged(int)), SLOT(settingsChanged())); QObject::connect(m_ui.HWMeterCheckBox, SIGNAL(stateChanged(int)), SLOT(settingsChanged())); QObject::connect(m_ui.IgnoreHWCheckBox, SIGNAL(stateChanged(int)), SLOT(settingsChanged())); QObject::connect(m_ui.UnlockMemCheckBox, SIGNAL(stateChanged(int)), SLOT(settingsChanged())); QObject::connect(m_ui.VerboseCheckBox, SIGNAL(stateChanged(int)), SLOT(settingsChanged())); QObject::connect(m_ui.PrioritySpinBox, SIGNAL(valueChanged(int)), SLOT(settingsChanged())); QObject::connect(m_ui.FramesComboBox, SIGNAL(editTextChanged(const QString&)), SLOT(settingsChanged())); QObject::connect(m_ui.SampleRateComboBox, SIGNAL(editTextChanged(const QString&)), SLOT(settingsChanged())); QObject::connect(m_ui.PeriodsSpinBox, SIGNAL(valueChanged(int)), SLOT(settingsChanged())); QObject::connect(m_ui.WordLengthComboBox, SIGNAL(editTextChanged(const QString&)), SLOT(settingsChanged())); QObject::connect(m_ui.WaitComboBox, SIGNAL(editTextChanged(const QString&)), SLOT(settingsChanged())); QObject::connect(m_ui.ChanSpinBox, SIGNAL(valueChanged(int)), SLOT(settingsChanged())); QObject::connect(m_ui.InterfaceComboBox, SIGNAL(editTextChanged(const QString&)), SLOT(settingsChanged())); QObject::connect(m_ui.AudioComboBox, SIGNAL(activated(int)), SLOT(settingsChanged())); QObject::connect(m_ui.DitherComboBox, SIGNAL(activated(int)), SLOT(settingsChanged())); QObject::connect(m_ui.TimeoutComboBox, SIGNAL(editTextChanged(const QString&)), SLOT(settingsChanged())); QObject::connect(m_ui.InDeviceComboBox, SIGNAL(editTextChanged(const QString&)), SLOT(settingsChanged())); QObject::connect(m_ui.OutDeviceComboBox, SIGNAL(editTextChanged(const QString&)), SLOT(settingsChanged())); QObject::connect(m_ui.InChannelsSpinBox, SIGNAL(valueChanged(int)), SLOT(settingsChanged())); QObject::connect(m_ui.OutChannelsSpinBox, SIGNAL(valueChanged(int)), SLOT(settingsChanged())); QObject::connect(m_ui.InLatencySpinBox, SIGNAL(valueChanged(int)), SLOT(settingsChanged())); QObject::connect(m_ui.OutLatencySpinBox, SIGNAL(valueChanged(int)), SLOT(settingsChanged())); #ifdef CONFIG_JACK_MIDI QObject::connect(m_ui.MidiDriverComboBox, SIGNAL(activated(int)), SLOT(settingsChanged())); #endif QObject::connect(m_ui.StartDelaySpinBox, SIGNAL(valueChanged(int)), SLOT(settingsChanged())); QObject::connect(m_ui.PortMaxComboBox, SIGNAL(editTextChanged(const QString&)), SLOT(settingsChanged())); QObject::connect(m_ui.ServerSuffixComboBox, SIGNAL(editTextChanged(const QString&)), SLOT(settingsChanged())); QObject::connect(m_ui.StartupScriptCheckBox, SIGNAL(stateChanged(int)), SLOT(optionsChanged())); QObject::connect(m_ui.StartupScriptShellComboBox, SIGNAL(editTextChanged(const QString&)), SLOT(optionsChanged())); QObject::connect(m_ui.PostStartupScriptCheckBox, SIGNAL(stateChanged(int)), SLOT(optionsChanged())); QObject::connect(m_ui.PostStartupScriptShellComboBox, SIGNAL(editTextChanged(const QString&)), SLOT(optionsChanged())); QObject::connect(m_ui.ShutdownScriptCheckBox, SIGNAL(stateChanged(int)), SLOT(optionsChanged())); QObject::connect(m_ui.ShutdownScriptShellComboBox, SIGNAL(editTextChanged(const QString&)), SLOT(optionsChanged())); QObject::connect(m_ui.PostShutdownScriptCheckBox, SIGNAL(stateChanged(int)), SLOT(optionsChanged())); QObject::connect(m_ui.PostShutdownScriptShellComboBox, SIGNAL(editTextChanged(const QString&)), SLOT(optionsChanged())); QObject::connect(m_ui.StartupScriptBrowseToolButton, SIGNAL(clicked()), SLOT(browseStartupScript())); QObject::connect(m_ui.PostStartupScriptBrowseToolButton, SIGNAL(clicked()), SLOT(browsePostStartupScript())); QObject::connect(m_ui.ShutdownScriptBrowseToolButton, SIGNAL(clicked()), SLOT(browseShutdownScript())); QObject::connect(m_ui.PostShutdownScriptBrowseToolButton, SIGNAL(clicked()), SLOT(browsePostShutdownScript())); QObject::connect(m_ui.StartupScriptSymbolToolButton, SIGNAL(clicked()), SLOT(symbolStartupScript())); QObject::connect(m_ui.PostStartupScriptSymbolToolButton, SIGNAL(clicked()), SLOT(symbolPostStartupScript())); QObject::connect(m_ui.ShutdownScriptSymbolToolButton, SIGNAL(clicked()), SLOT(symbolShutdownScript())); QObject::connect(m_ui.PostShutdownScriptSymbolToolButton, SIGNAL(clicked()), SLOT(symbolPostShutdownScript())); QObject::connect(m_ui.StdoutCaptureCheckBox, SIGNAL(stateChanged(int)), SLOT(optionsChanged())); QObject::connect(m_ui.XrunRegexComboBox, SIGNAL(editTextChanged(const QString&)), SLOT(optionsChanged())); QObject::connect(m_ui.ActivePatchbayCheckBox, SIGNAL(stateChanged(int)), SLOT(optionsChanged())); QObject::connect(m_ui.ActivePatchbayPathComboBox, SIGNAL(editTextChanged(const QString&)), SLOT(optionsChanged())); QObject::connect(m_ui.ActivePatchbayPathToolButton, SIGNAL(clicked()), SLOT(browseActivePatchbayPath())); QObject::connect(m_ui.ActivePatchbayResetCheckBox, SIGNAL(stateChanged(int)), SLOT(optionsChanged())); QObject::connect(m_ui.QueryDisconnectCheckBox, SIGNAL(stateChanged(int)), SLOT(optionsChanged())); QObject::connect(m_ui.MessagesLogCheckBox, SIGNAL(stateChanged(int)), SLOT(optionsChanged())); QObject::connect(m_ui.MessagesLogPathComboBox, SIGNAL(editTextChanged(const QString&)), SLOT(optionsChanged())); QObject::connect(m_ui.MessagesLogPathToolButton, SIGNAL(clicked()), SLOT(browseMessagesLogPath())); QObject::connect(m_ui.TransportTimeRadioButton, SIGNAL(toggled(bool)), SLOT(optionsChanged())); QObject::connect(m_ui.TransportBBTRadioButton, SIGNAL(toggled(bool)), SLOT(optionsChanged())); QObject::connect(m_ui.ElapsedResetRadioButton, SIGNAL(toggled(bool)), SLOT(optionsChanged())); QObject::connect(m_ui.ElapsedXrunRadioButton, SIGNAL(toggled(bool)), SLOT(optionsChanged())); QObject::connect(m_ui.TimeFormatComboBox, SIGNAL(activated(int)), SLOT(optionsChanged())); QObject::connect(m_ui.DisplayEffectCheckBox, SIGNAL(toggled(bool)), SLOT(toggleDisplayEffect(bool))); QObject::connect(m_ui.DisplayBlinkCheckBox, SIGNAL(toggled(bool)), SLOT(optionsChanged())); QObject::connect(m_ui.DisplayFont1PushButton, SIGNAL(clicked()), SLOT(chooseDisplayFont1())); QObject::connect(m_ui.DisplayFont2PushButton, SIGNAL(clicked()), SLOT(chooseDisplayFont2())); QObject::connect(m_ui.MessagesFontPushButton, SIGNAL(clicked()), SLOT(chooseMessagesFont())); QObject::connect(m_ui.ConnectionsFontPushButton, SIGNAL(clicked()), SLOT(chooseConnectionsFont())); QObject::connect(m_ui.MessagesLimitCheckBox, SIGNAL(stateChanged(int)), SLOT(optionsChanged())); QObject::connect(m_ui.MessagesLimitLinesComboBox, SIGNAL(editTextChanged(const QString&)), SLOT(optionsChanged())); QObject::connect(m_ui.ConnectionsIconSizeComboBox, SIGNAL(activated(int)), SLOT(optionsChanged())); QObject::connect(m_ui.BezierLinesCheckBox, SIGNAL(stateChanged(int)), SLOT(optionsChanged())); QObject::connect(m_ui.AliasesEnabledCheckBox, SIGNAL(stateChanged(int)), SLOT(optionsChanged())); QObject::connect(m_ui.AliasesEditingCheckBox, SIGNAL(stateChanged(int)), SLOT(optionsChanged())); #ifdef CONFIG_JACK_PORT_ALIASES QObject::connect(m_ui.JackClientPortAliasComboBox, SIGNAL(activated(int)), SLOT(optionsChanged())); QObject::connect(m_ui.JackClientPortMetadataCheckBox, SIGNAL(stateChanged(int)), SLOT(optionsChanged())); #endif QObject::connect(m_ui.StartJackCheckBox, SIGNAL(stateChanged(int)), SLOT(optionsChanged())); QObject::connect(m_ui.StopJackCheckBox, SIGNAL(stateChanged(int)), SLOT(optionsChanged())); QObject::connect(m_ui.QueryCloseCheckBox, SIGNAL(stateChanged(int)), SLOT(optionsChanged())); QObject::connect(m_ui.QueryShutdownCheckBox, SIGNAL(stateChanged(int)), SLOT(optionsChanged())); QObject::connect(m_ui.KeepOnTopCheckBox, SIGNAL(stateChanged(int)), SLOT(optionsChanged())); #ifdef CONFIG_SYSTEM_TRAY QObject::connect(m_ui.SystemTrayCheckBox, SIGNAL(stateChanged(int)), SLOT(optionsChanged())); QObject::connect(m_ui.SystemTrayQueryCloseCheckBox, SIGNAL(stateChanged(int)), SLOT(optionsChanged())); #endif #ifdef CONFIG_XUNIQUE QObject::connect(m_ui.SingletonCheckBox, SIGNAL(stateChanged(int)), SLOT(optionsChanged())); #endif QObject::connect(m_ui.ServerConfigCheckBox, SIGNAL(stateChanged(int)), SLOT(optionsChanged())); QObject::connect(m_ui.ServerConfigNameComboBox, SIGNAL(editTextChanged(const QString&)), SLOT(optionsChanged())); QObject::connect(m_ui.ServerConfigTempCheckBox, SIGNAL(stateChanged(int)), SLOT(optionsChanged())); #ifdef CONFIG_ALSA_SEQ QObject::connect(m_ui.AlsaSeqEnabledCheckBox, SIGNAL(stateChanged(int)), SLOT(optionsChanged())); #endif #ifdef CONFIG_DBUS QObject::connect(m_ui.DBusEnabledCheckBox, SIGNAL(stateChanged(int)), SLOT(optionsChanged())); QObject::connect(m_ui.JackDBusEnabledCheckBox, SIGNAL(stateChanged(int)), SLOT(optionsChanged())); #endif QObject::connect(m_ui.LeftButtonsCheckBox, SIGNAL(stateChanged(int)), SLOT(optionsChanged())); QObject::connect(m_ui.RightButtonsCheckBox, SIGNAL(stateChanged(int)), SLOT(optionsChanged())); QObject::connect(m_ui.TransportButtonsCheckBox, SIGNAL(stateChanged(int)), SLOT(optionsChanged())); QObject::connect(m_ui.TextLabelsCheckBox, SIGNAL(stateChanged(int)), SLOT(optionsChanged())); QObject::connect(m_ui.BaseFontSizeComboBox, SIGNAL(editTextChanged(const QString&)), SLOT(optionsChanged())); QObject::connect(m_ui.DialogButtonBox, SIGNAL(accepted()), SLOT(accept())); QObject::connect(m_ui.DialogButtonBox, SIGNAL(rejected()), SLOT(reject())); // Try to restore old window positioning. adjustSize(); } // Destructor. qjackctlSetupForm::~qjackctlSetupForm (void) { delete m_pTimeDisplayButtonGroup; } // A combo-box text item setter helper. void qjackctlSetupForm::setComboBoxCurrentText ( QComboBox *pComboBox, const QString& sText ) const { if (pComboBox->isEditable()) { pComboBox->setEditText(sText); } else { int iIndex = pComboBox->findText(sText); if (iIndex < 0) { iIndex = 0; if (!sText.isEmpty()) pComboBox->insertItem(0, sText); } pComboBox->setCurrentIndex(iIndex); } } // Populate (setup) dialog controls from settings descriptors. void qjackctlSetupForm::setup ( qjackctlSetup *pSetup ) { // Set reference descriptor. m_pSetup = pSetup; // Avoid dirty this all up. m_iDirtySetup++; // Load combo box history... m_pSetup->loadComboBoxHistory(m_ui.ServerPrefixComboBox); m_pSetup->loadComboBoxHistory(m_ui.ServerNameComboBox); m_pSetup->loadComboBoxHistory(m_ui.ServerSuffixComboBox); m_pSetup->loadComboBoxHistory(m_ui.StartupScriptShellComboBox); m_pSetup->loadComboBoxHistory(m_ui.PostStartupScriptShellComboBox); m_pSetup->loadComboBoxHistory(m_ui.ShutdownScriptShellComboBox); m_pSetup->loadComboBoxHistory(m_ui.PostShutdownScriptShellComboBox); m_pSetup->loadComboBoxHistory(m_ui.XrunRegexComboBox); m_pSetup->loadComboBoxHistory(m_ui.ActivePatchbayPathComboBox); m_pSetup->loadComboBoxHistory(m_ui.MessagesLogPathComboBox); m_pSetup->loadComboBoxHistory(m_ui.ServerConfigNameComboBox); m_ui.InterfaceComboBox->setup( m_ui.DriverComboBox, QJACKCTL_DUPLEX, m_pSetup->sDefPresetName); m_ui.InDeviceComboBox->setup( m_ui.DriverComboBox, QJACKCTL_CAPTURE, m_pSetup->sDefPresetName); m_ui.OutDeviceComboBox->setup( m_ui.DriverComboBox, QJACKCTL_PLAYBACK, m_pSetup->sDefPresetName); // Load Options... m_ui.StartupScriptCheckBox->setChecked(m_pSetup->bStartupScript); setComboBoxCurrentText(m_ui.StartupScriptShellComboBox, m_pSetup->sStartupScriptShell); m_ui.PostStartupScriptCheckBox->setChecked(m_pSetup->bPostStartupScript); setComboBoxCurrentText(m_ui.PostStartupScriptShellComboBox, m_pSetup->sPostStartupScriptShell); m_ui.ShutdownScriptCheckBox->setChecked(m_pSetup->bShutdownScript); setComboBoxCurrentText(m_ui.ShutdownScriptShellComboBox, m_pSetup->sShutdownScriptShell); m_ui.PostShutdownScriptCheckBox->setChecked(m_pSetup->bPostShutdownScript); setComboBoxCurrentText(m_ui.PostShutdownScriptShellComboBox, m_pSetup->sPostShutdownScriptShell); m_ui.StdoutCaptureCheckBox->setChecked(m_pSetup->bStdoutCapture); setComboBoxCurrentText(m_ui.XrunRegexComboBox, m_pSetup->sXrunRegex); m_ui.ActivePatchbayCheckBox->setChecked(m_pSetup->bActivePatchbay); setComboBoxCurrentText(m_ui.ActivePatchbayPathComboBox, m_pSetup->sActivePatchbayPath); m_ui.ActivePatchbayResetCheckBox->setChecked(m_pSetup->bActivePatchbayReset); m_ui.QueryDisconnectCheckBox->setChecked(m_pSetup->bQueryDisconnect); m_ui.MessagesLogCheckBox->setChecked(m_pSetup->bMessagesLog); setComboBoxCurrentText(m_ui.MessagesLogPathComboBox, m_pSetup->sMessagesLogPath); m_ui.BezierLinesCheckBox->setChecked(m_pSetup->bBezierLines); // Load some other defaults... QRadioButton *pRadioButton = static_cast ( m_pTimeDisplayButtonGroup->button(m_pSetup->iTimeDisplay)); if (pRadioButton) pRadioButton->setChecked(true); m_ui.TimeFormatComboBox->setCurrentIndex(m_pSetup->iTimeFormat); // Load font chooser samples... const QString sSansSerif = "Sans Serif"; QFont font; QPalette pal; if (m_pSetup->sDisplayFont1.isEmpty() || !font.fromString(m_pSetup->sDisplayFont1)) font = QFont(sSansSerif, 12, QFont::Bold); m_ui.DisplayFont1TextLabel->setFont(font); m_ui.DisplayFont1TextLabel->setText( font.family() + ' ' + QString::number(font.pointSize())); if (m_pSetup->sDisplayFont2.isEmpty() || !font.fromString(m_pSetup->sDisplayFont2)) font = QFont(sSansSerif, 6, QFont::Bold); m_ui.DisplayFont2TextLabel->setFont(font); m_ui.DisplayFont2TextLabel->setText( font.family() + ' ' + QString::number(font.pointSize())); if (m_pSetup->sMessagesFont.isEmpty() || !font.fromString(m_pSetup->sMessagesFont)) font = QFont("Monospace", 8); pal = m_ui.MessagesFontTextLabel->palette(); pal.setColor(QPalette::Background, pal.base().color()); m_ui.MessagesFontTextLabel->setPalette(pal); m_ui.MessagesFontTextLabel->setFont(font); m_ui.MessagesFontTextLabel->setText( font.family() + ' ' + QString::number(font.pointSize())); if (m_pSetup->sConnectionsFont.isEmpty() || !font.fromString(m_pSetup->sConnectionsFont)) font = QFont(sSansSerif, 10); pal = m_ui.ConnectionsFontTextLabel->palette(); pal.setColor(QPalette::Background, pal.base().color()); m_ui.ConnectionsFontTextLabel->setPalette(pal); m_ui.ConnectionsFontTextLabel->setFont(font); m_ui.ConnectionsFontTextLabel->setText( font.family() + ' ' + QString::number(font.pointSize())); // The main display shiny effect option. m_ui.DisplayEffectCheckBox->setChecked(m_pSetup->bDisplayEffect); m_ui.DisplayBlinkCheckBox->setChecked(m_pSetup->bDisplayBlink); toggleDisplayEffect(m_pSetup->bDisplayEffect); // Connections view icon size. m_ui.ConnectionsIconSizeComboBox->setCurrentIndex( m_pSetup->iConnectionsIconSize); // and this JACK specialities... m_ui.JackClientPortAliasComboBox->setCurrentIndex( m_pSetup->iJackClientPortAlias); m_ui.JackClientPortMetadataCheckBox->setChecked( m_pSetup->bJackClientPortMetadata); // Messages limit option. m_ui.MessagesLimitCheckBox->setChecked(m_pSetup->bMessagesLimit); setComboBoxCurrentText(m_ui.MessagesLimitLinesComboBox, QString::number(m_pSetup->iMessagesLimitLines)); // Other misc options... m_ui.StartJackCheckBox->setChecked(m_pSetup->bStartJack); m_ui.StopJackCheckBox->setChecked(m_pSetup->bStopJack); m_ui.QueryCloseCheckBox->setChecked(m_pSetup->bQueryClose); m_ui.QueryShutdownCheckBox->setChecked(m_pSetup->bQueryShutdown); m_ui.KeepOnTopCheckBox->setChecked(m_pSetup->bKeepOnTop); #ifdef CONFIG_SYSTEM_TRAY m_ui.SystemTrayCheckBox->setChecked(m_pSetup->bSystemTray); m_ui.SystemTrayQueryCloseCheckBox->setChecked(m_pSetup->bSystemTrayQueryClose); #endif m_ui.SingletonCheckBox->setChecked(m_pSetup->bSingleton); m_ui.ServerConfigCheckBox->setChecked(m_pSetup->bServerConfig); setComboBoxCurrentText(m_ui.ServerConfigNameComboBox, m_pSetup->sServerConfigName); m_ui.ServerConfigTempCheckBox->setChecked(m_pSetup->bServerConfigTemp); m_ui.AlsaSeqEnabledCheckBox->setChecked(m_pSetup->bAlsaSeqEnabled); m_ui.DBusEnabledCheckBox->setChecked(m_pSetup->bDBusEnabled); m_ui.JackDBusEnabledCheckBox->setChecked(m_pSetup->bJackDBusEnabled); m_ui.AliasesEnabledCheckBox->setChecked(m_pSetup->bAliasesEnabled); m_ui.AliasesEditingCheckBox->setChecked(m_pSetup->bAliasesEditing); m_ui.LeftButtonsCheckBox->setChecked(!m_pSetup->bLeftButtons); m_ui.RightButtonsCheckBox->setChecked(!m_pSetup->bRightButtons); m_ui.TransportButtonsCheckBox->setChecked(!m_pSetup->bTransportButtons); m_ui.TextLabelsCheckBox->setChecked(!m_pSetup->bTextLabels); if (m_pSetup->iBaseFontSize > 0) m_ui.BaseFontSizeComboBox->setEditText(QString::number(m_pSetup->iBaseFontSize)); else m_ui.BaseFontSizeComboBox->setCurrentIndex(0); #ifndef CONFIG_SYSTEM_TRAY m_ui.SystemTrayCheckBox->setChecked(false); m_ui.SystemTrayCheckBox->setEnabled(false); m_ui.SystemTrayQueryCloseCheckBox->setChecked(false); m_ui.SystemTrayQueryCloseCheckBox->setEnabled(false); #endif #ifndef CONFIG_JACK_MIDI m_ui.MidiDriverComboBox->setCurrentIndex(0); m_ui.MidiDriverTextLabel->setEnabled(false); m_ui.MidiDriverComboBox->setEnabled(false); #endif #ifndef CONFIG_JACK_PORT_ALIASES m_ui.JackClientPortAliasComboBox->setCurrentIndex(0); m_ui.JackClientPortAliasTextLabel->setEnabled(false); m_ui.JackClientPortAliasComboBox->setEnabled(false); #endif #ifndef CONFIG_JACK_METADATA m_ui.JackClientPortMetadataCheckBox->setChecked(false); m_ui.JackClientPortMetadataCheckBox->setEnabled(false); #endif #ifndef CONFIG_ALSA_SEQ m_ui.AlsaSeqEnabledCheckBox->setEnabled(false); #endif #ifndef CONFIG_DBUS m_ui.DBusEnabledCheckBox->setEnabled(false); m_ui.JackDBusEnabledCheckBox->setEnabled(false); #endif // Load preset list... resetPresets(); setComboBoxCurrentText(m_ui.PresetComboBox, m_pSetup->sDefPreset); // Finally, load default settings... changePreset(m_ui.PresetComboBox->currentText()); // We're clean now. m_iDirtySetup--; stabilizeForm(); } void qjackctlSetupForm::changePreset ( const QString& sPreset ) { if (sPreset.isEmpty()) return; // Load Settings... qjackctlPreset preset; if (m_pSetup->loadPreset(preset, sPreset)) { setComboBoxCurrentText(m_ui.ServerPrefixComboBox, preset.sServerPrefix); setComboBoxCurrentText(m_ui.ServerNameComboBox, preset.sServerName.isEmpty() ? m_pSetup->sDefPresetName : preset.sServerName); m_ui.RealtimeCheckBox->setChecked(preset.bRealtime); m_ui.SoftModeCheckBox->setChecked(preset.bSoftMode); m_ui.MonitorCheckBox->setChecked(preset.bMonitor); m_ui.ShortsCheckBox->setChecked(preset.bShorts); m_ui.NoMemLockCheckBox->setChecked(preset.bNoMemLock); m_ui.UnlockMemCheckBox->setChecked(preset.bUnlockMem); m_ui.HWMonCheckBox->setChecked(preset.bHWMon); m_ui.HWMeterCheckBox->setChecked(preset.bHWMeter); m_ui.IgnoreHWCheckBox->setChecked(preset.bIgnoreHW); m_ui.PrioritySpinBox->setValue(preset.iPriority); setComboBoxCurrentText(m_ui.FramesComboBox, QString::number(preset.iFrames)); setComboBoxCurrentText(m_ui.SampleRateComboBox, QString::number(preset.iSampleRate)); m_ui.PeriodsSpinBox->setValue(preset.iPeriods); setComboBoxCurrentText(m_ui.WordLengthComboBox, QString::number(preset.iWordLength)); setComboBoxCurrentText(m_ui.WaitComboBox, QString::number(preset.iWait)); m_ui.ChanSpinBox->setValue(preset.iChan); setComboBoxCurrentText(m_ui.DriverComboBox, preset.sDriver); setComboBoxCurrentText(m_ui.InterfaceComboBox, preset.sInterface.isEmpty() ? m_pSetup->sDefPresetName : preset.sInterface); m_ui.AudioComboBox->setCurrentIndex(preset.iAudio); m_ui.DitherComboBox->setCurrentIndex(preset.iDither); setComboBoxCurrentText(m_ui.TimeoutComboBox, QString::number(preset.iTimeout)); setComboBoxCurrentText(m_ui.InDeviceComboBox, preset.sInDevice.isEmpty() ? m_pSetup->sDefPresetName : preset.sInDevice); setComboBoxCurrentText(m_ui.OutDeviceComboBox, preset.sOutDevice.isEmpty() ? m_pSetup->sDefPresetName : preset.sOutDevice); m_ui.InChannelsSpinBox->setValue(preset.iInChannels); m_ui.OutChannelsSpinBox->setValue(preset.iOutChannels); m_ui.InLatencySpinBox->setValue(preset.iInLatency); m_ui.OutLatencySpinBox->setValue(preset.iOutLatency); m_ui.StartDelaySpinBox->setValue(preset.iStartDelay); m_ui.VerboseCheckBox->setChecked(preset.bVerbose); setComboBoxCurrentText(m_ui.PortMaxComboBox, QString::number(preset.iPortMax)); #ifdef CONFIG_JACK_MIDI setComboBoxCurrentText(m_ui.MidiDriverComboBox, preset.sMidiDriver); #endif setComboBoxCurrentText(m_ui.ServerSuffixComboBox, preset.sServerSuffix); // Reset dirty flag. m_iDirtySettings = 0; } // Set current preset name.. m_sPreset = sPreset; } bool qjackctlSetupForm::savePreset ( const QString& sPreset ) { if (sPreset.isEmpty()) return false; // Unload settings. qjackctlPreset preset; preset.sServerPrefix = m_ui.ServerPrefixComboBox->currentText(); preset.sServerName = m_ui.ServerNameComboBox->currentText(); preset.bRealtime = m_ui.RealtimeCheckBox->isChecked(); preset.bSoftMode = m_ui.SoftModeCheckBox->isChecked(); preset.bMonitor = m_ui.MonitorCheckBox->isChecked(); preset.bShorts = m_ui.ShortsCheckBox->isChecked(); preset.bNoMemLock = m_ui.NoMemLockCheckBox->isChecked(); preset.bUnlockMem = m_ui.UnlockMemCheckBox->isChecked(); preset.bHWMon = m_ui.HWMonCheckBox->isChecked(); preset.bHWMeter = m_ui.HWMeterCheckBox->isChecked(); preset.bIgnoreHW = m_ui.IgnoreHWCheckBox->isChecked(); preset.iPriority = m_ui.PrioritySpinBox->value(); preset.iFrames = m_ui.FramesComboBox->currentText().toInt(); preset.iSampleRate = m_ui.SampleRateComboBox->currentText().toInt(); preset.iPeriods = m_ui.PeriodsSpinBox->value(); preset.iWordLength = m_ui.WordLengthComboBox->currentText().toInt(); preset.iWait = m_ui.WaitComboBox->currentText().toInt(); preset.iChan = m_ui.ChanSpinBox->value(); preset.sDriver = m_ui.DriverComboBox->currentText(); preset.sInterface = m_ui.InterfaceComboBox->currentText(); preset.iAudio = m_ui.AudioComboBox->currentIndex(); preset.iDither = m_ui.DitherComboBox->currentIndex(); preset.iTimeout = m_ui.TimeoutComboBox->currentText().toInt(); preset.sInDevice = m_ui.InDeviceComboBox->currentText(); preset.sOutDevice = m_ui.OutDeviceComboBox->currentText(); preset.iInChannels = m_ui.InChannelsSpinBox->value(); preset.iOutChannels = m_ui.OutChannelsSpinBox->value(); preset.iInLatency = m_ui.InLatencySpinBox->value(); preset.iOutLatency = m_ui.OutLatencySpinBox->value(); preset.iStartDelay = m_ui.StartDelaySpinBox->value(); preset.bVerbose = m_ui.VerboseCheckBox->isChecked(); preset.iPortMax = m_ui.PortMaxComboBox->currentText().toInt(); #ifdef CONFIG_JACK_MIDI preset.sMidiDriver = m_ui.MidiDriverComboBox->currentText(); #endif preset.sServerSuffix = m_ui.ServerSuffixComboBox->currentText(); if (preset.sServerName == m_pSetup->sDefPresetName) preset.sServerName.clear(); if (preset.sInterface == m_pSetup->sDefPresetName) preset.sInterface.clear(); if (preset.sInDevice == m_pSetup->sDefPresetName) preset.sInDevice.clear(); if (preset.sOutDevice == m_pSetup->sDefPresetName) preset.sOutDevice.clear(); m_pSetup->savePreset(preset, sPreset); return true; } bool qjackctlSetupForm::deletePreset ( const QString& sPreset ) { if (sPreset.isEmpty()) return false; // Just remove the preset item... m_pSetup->deletePreset(sPreset); return true; } void qjackctlSetupForm::resetPresets (void) { m_ui.PresetComboBox->clear(); m_ui.PresetComboBox->addItems(m_pSetup->presets); m_ui.PresetComboBox->addItem(m_pSetup->sDefPresetName); } void qjackctlSetupForm::changeCurrentPreset ( const QString& sPreset ) { if (m_iDirtySetup > 0) return; // Check if there's any pending changes... if (m_iDirtySettings > 0 && !m_sPreset.isEmpty()) { switch (QMessageBox::warning(this, tr("Warning") + " - " QJACKCTL_SUBTITLE1, tr("Some settings have been changed:\n\n" "\"%1\"\n\nDo you want to save the changes?") .arg(m_sPreset), QMessageBox::Save | QMessageBox::Discard | QMessageBox::Cancel)) { case QMessageBox::Save: savePreset(m_sPreset); m_iDirtySetup++; resetPresets(); setComboBoxCurrentText(m_ui.PresetComboBox, sPreset); m_iDirtySetup--; case QMessageBox::Discard: m_iDirtySettings = 0; break; default: // Cancel... m_iDirtySetup++; resetPresets(); setComboBoxCurrentText(m_ui.PresetComboBox, m_sPreset); m_iDirtySetup--; return; } } changePreset(sPreset); optionsChanged(); } void qjackctlSetupForm::saveCurrentPreset (void) { const QString sPreset = m_ui.PresetComboBox->currentText(); if (savePreset(sPreset)) { // Reset preset combobox list. m_iDirtySetup++; resetPresets(); setComboBoxCurrentText(m_ui.PresetComboBox, sPreset); m_iDirtySetup--; // Reset dirty flag. m_iDirtySettings = 0; stabilizeForm(); } } void qjackctlSetupForm::deleteCurrentPreset (void) { const QString sPreset = m_ui.PresetComboBox->currentText(); // Try to prompt user if he/she really wants this... if (QMessageBox::warning(this, tr("Warning") + " - " QJACKCTL_SUBTITLE1, tr("Delete preset:\n\n" "\"%1\"\n\nAre you sure?") .arg(sPreset), QMessageBox::Ok | QMessageBox::Cancel) == QMessageBox::Cancel) return; if (deletePreset(sPreset)) { // Reset preset combobox list, // and load a new available preset.. m_iDirtySetup++; int iItem = m_ui.PresetComboBox->currentIndex(); resetPresets(); m_ui.PresetComboBox->setCurrentIndex(iItem); changePreset(m_ui.PresetComboBox->currentText()); m_iDirtySetup--; // Take care that maybe it was the default one... if (m_pSetup->sDefPreset == sPreset) m_pSetup->sDefPreset = m_sPreset; // Make this stable now. optionsChanged(); } } void qjackctlSetupForm::computeLatency (void) { float lat = 0.0; int p = m_ui.FramesComboBox->currentText().toInt(); int r = m_ui.SampleRateComboBox->currentText().toInt(); int n = m_ui.PeriodsSpinBox->value(); if (r > 0) lat = (float) (1000.0 * p * n) / (float) r; if (lat > 0.0) m_ui.LatencyTextValue->setText(QString::number(lat, 'g', 3) + " " + tr("msec")); else m_ui.LatencyTextValue->setText(tr("n/a")); } void qjackctlSetupForm::changeDriverAudio ( const QString& sDriver, int iAudio ) { bool bSun = (sDriver == "sun"); bool bOss = (sDriver == "oss"); bool bAlsa = (sDriver == "alsa"); bool bCoreaudio = (sDriver == "coreaudio"); bool bPortaudio = (sDriver == "portaudio"); bool bFreebob = (sDriver == "freebob"); bool bFirewire = (sDriver == "firewire"); bool bNet = (sDriver == "net" || sDriver == "netone"); bool bInEnabled = false; bool bOutEnabled = false; bool bEnabled; switch (iAudio) { case QJACKCTL_DUPLEX: bInEnabled = (bSun || bOss || bAlsa || bCoreaudio || bPortaudio || bNet); bOutEnabled = (bSun || bOss || bAlsa || bCoreaudio || bPortaudio || bNet); break; case QJACKCTL_CAPTURE: bInEnabled = (bSun || bOss || bCoreaudio || bPortaudio || bNet); break; case QJACKCTL_PLAYBACK: bOutEnabled = (bSun || bOss || bCoreaudio || bPortaudio || bNet); break; } bEnabled = (bInEnabled && (bAlsa || bSun || bOss || bPortaudio)); m_ui.InDeviceTextLabel->setEnabled(bEnabled); m_ui.InDeviceComboBox->setEnabled(bEnabled); if (!bEnabled) setComboBoxCurrentText(m_ui.InDeviceComboBox, m_pSetup->sDefPresetName); bEnabled = (bOutEnabled && (bAlsa || bSun || bOss || bPortaudio)); m_ui.OutDeviceTextLabel->setEnabled(bEnabled); m_ui.OutDeviceComboBox->setEnabled(bEnabled); if (!bEnabled) setComboBoxCurrentText(m_ui.OutDeviceComboBox, m_pSetup->sDefPresetName); m_ui.InOutChannelsTextLabel->setEnabled(bInEnabled || (bAlsa || bFirewire)); m_ui.InChannelsSpinBox->setEnabled(bInEnabled || ((bAlsa || bFirewire) && iAudio != QJACKCTL_PLAYBACK)); m_ui.OutChannelsSpinBox->setEnabled(bOutEnabled || ((bAlsa || bFirewire) && iAudio != QJACKCTL_CAPTURE)); m_ui.InOutLatencyTextLabel->setEnabled((bInEnabled && !bNet) || (bAlsa || bFreebob || bFirewire)); m_ui.InLatencySpinBox->setEnabled((bInEnabled && !bNet) || ((bAlsa || bFreebob || bFirewire) && iAudio != QJACKCTL_PLAYBACK)); m_ui.OutLatencySpinBox->setEnabled((bOutEnabled && !bNet) || ((bAlsa || bFreebob || bFirewire) && iAudio != QJACKCTL_CAPTURE)); computeLatency(); } void qjackctlSetupForm::changeAudio ( int iAudio ) { changeDriverAudio(m_ui.DriverComboBox->currentText(), iAudio); } void qjackctlSetupForm::changeDriver ( int iDriver ) { changeDriverUpdate(m_ui.DriverComboBox->itemText(iDriver), true); } void qjackctlSetupForm::changeDriverUpdate ( const QString& sDriver, bool bUpdate ) { bool bDummy = (sDriver == "dummy"); bool bSun = (sDriver == "sun"); bool bOss = (sDriver == "oss"); bool bAlsa = (sDriver == "alsa"); bool bPortaudio = (sDriver == "portaudio"); bool bCoreaudio = (sDriver == "coreaudio"); bool bFreebob = (sDriver == "freebob"); bool bFirewire = (sDriver == "firewire"); bool bNet = (sDriver == "net" || sDriver == "netone"); m_ui.NoMemLockCheckBox->setEnabled(!bCoreaudio); m_ui.UnlockMemCheckBox->setEnabled(!bCoreaudio && !m_ui.NoMemLockCheckBox->isChecked()); m_ui.SoftModeCheckBox->setEnabled(bAlsa); m_ui.MonitorCheckBox->setEnabled(bAlsa); m_ui.ShortsCheckBox->setEnabled(bAlsa); m_ui.HWMonCheckBox->setEnabled(bAlsa); m_ui.HWMeterCheckBox->setEnabled(bAlsa); m_ui.IgnoreHWCheckBox->setEnabled(bSun || bOss); if (bCoreaudio || bPortaudio) { m_ui.PriorityTextLabel->setEnabled(false); m_ui.PrioritySpinBox->setEnabled(false); } else { bool bPriorityEnabled = m_ui.RealtimeCheckBox->isChecked(); m_ui.PriorityTextLabel->setEnabled(bPriorityEnabled); m_ui.PrioritySpinBox->setEnabled(bPriorityEnabled); } m_ui.SampleRateTextLabel->setEnabled(!bNet); m_ui.SampleRateComboBox->setEnabled(!bNet); m_ui.FramesTextLabel->setEnabled(!bNet); m_ui.FramesComboBox->setEnabled(!bNet); m_ui.PeriodsTextLabel->setEnabled(bAlsa || bSun || bOss || bFreebob || bFirewire); m_ui.PeriodsSpinBox->setEnabled(bAlsa || bSun || bOss || bFreebob || bFirewire); if (bUpdate && (bFreebob || bFirewire) && m_ui.PeriodsSpinBox->value() < 3) m_ui.PeriodsSpinBox->setValue(3); m_ui.WordLengthTextLabel->setEnabled(bSun || bOss); m_ui.WordLengthComboBox->setEnabled(bSun || bOss); m_ui.WaitTextLabel->setEnabled(bDummy); m_ui.WaitComboBox->setEnabled(bDummy); m_ui.ChanTextLabel->setEnabled(bPortaudio); m_ui.ChanSpinBox->setEnabled(bPortaudio); int iAudio = m_ui.AudioComboBox->currentIndex(); bool bEnabled = (bAlsa || bPortaudio); if (bEnabled && iAudio == QJACKCTL_DUPLEX) { const QString& sInDevice = m_ui.InDeviceComboBox->currentText(); const QString& sOutDevice = m_ui.OutDeviceComboBox->currentText(); bEnabled = (sInDevice.isEmpty() || sInDevice == m_pSetup->sDefPresetName || sOutDevice.isEmpty() || sOutDevice == m_pSetup->sDefPresetName); } bool bInterface = (bEnabled || bCoreaudio || bFreebob || bFirewire); m_ui.InterfaceTextLabel->setEnabled(bInterface); m_ui.InterfaceComboBox->setEnabled(bInterface); if (!bInterface) setComboBoxCurrentText(m_ui.InterfaceComboBox, m_pSetup->sDefPresetName); m_ui.DitherTextLabel->setEnabled(bAlsa || bPortaudio); m_ui.DitherComboBox->setEnabled(bAlsa || bPortaudio); #ifdef CONFIG_JACK_MIDI m_ui.MidiDriverTextLabel->setEnabled(bAlsa); m_ui.MidiDriverComboBox->setEnabled(bAlsa); #endif changeDriverAudio(sDriver, iAudio); } // Stabilize current form state. void qjackctlSetupForm::stabilizeForm (void) { bool bValid = (m_iDirtySettings > 0 || m_iDirtyOptions > 0); QString sPreset = m_ui.PresetComboBox->currentText(); if (!sPreset.isEmpty()) { const bool bPreset = (m_pSetup->presets.contains(sPreset)); m_ui.PresetSavePushButton->setEnabled(m_iDirtySettings > 0 || (!bPreset && sPreset != m_pSetup->sDefPresetName)); m_ui.PresetDeletePushButton->setEnabled(bPreset); } else { m_ui.PresetSavePushButton->setEnabled(false); m_ui.PresetDeletePushButton->setEnabled(false); } bool bEnabled = m_ui.StartupScriptCheckBox->isChecked(); m_ui.StartupScriptShellComboBox->setEnabled(bEnabled); m_ui.StartupScriptSymbolToolButton->setEnabled(bEnabled); m_ui.StartupScriptBrowseToolButton->setEnabled(bEnabled); bEnabled = m_ui.PostStartupScriptCheckBox->isChecked(); m_ui.PostStartupScriptShellComboBox->setEnabled(bEnabled); m_ui.PostStartupScriptSymbolToolButton->setEnabled(bEnabled); m_ui.PostStartupScriptBrowseToolButton->setEnabled(bEnabled); bEnabled = m_ui.ShutdownScriptCheckBox->isChecked(); m_ui.ShutdownScriptShellComboBox->setEnabled(bEnabled); m_ui.ShutdownScriptSymbolToolButton->setEnabled(bEnabled); m_ui.ShutdownScriptBrowseToolButton->setEnabled(bEnabled); bEnabled = m_ui.PostShutdownScriptCheckBox->isChecked(); m_ui.PostShutdownScriptShellComboBox->setEnabled(bEnabled); m_ui.PostShutdownScriptSymbolToolButton->setEnabled(bEnabled); m_ui.PostShutdownScriptBrowseToolButton->setEnabled(bEnabled); bEnabled = m_ui.StdoutCaptureCheckBox->isChecked(); m_ui.XrunRegexTextLabel->setEnabled(bEnabled); m_ui.XrunRegexComboBox->setEnabled(bEnabled); bEnabled = m_ui.ActivePatchbayCheckBox->isChecked(); m_ui.ActivePatchbayPathComboBox->setEnabled(bEnabled); m_ui.ActivePatchbayPathToolButton->setEnabled(bEnabled); m_ui.ActivePatchbayResetCheckBox->setEnabled(bEnabled); m_ui.QueryDisconnectCheckBox->setEnabled(bEnabled); if (bEnabled && bValid) { const QString& sPath = m_ui.ActivePatchbayPathComboBox->currentText(); bValid = (!sPath.isEmpty() && QFileInfo(sPath).exists()); } bEnabled = m_ui.MessagesLogCheckBox->isChecked(); m_ui.MessagesLogPathComboBox->setEnabled(bEnabled); m_ui.MessagesLogPathToolButton->setEnabled(bEnabled); if (bEnabled && bValid) { const QString& sPath = m_ui.MessagesLogPathComboBox->currentText(); bValid = !sPath.isEmpty(); } m_ui.MessagesLimitLinesComboBox->setEnabled( m_ui.MessagesLimitCheckBox->isChecked()); #ifdef CONFIG_JACK_METADATA #ifdef CONFIG_JACK_PORT_ALIASES bEnabled = !m_ui.JackClientPortMetadataCheckBox->isChecked(); m_ui.JackClientPortAliasTextLabel->setEnabled(bEnabled); m_ui.JackClientPortAliasComboBox->setEnabled(bEnabled); if (bEnabled) { m_ui.JackClientPortMetadataCheckBox->setEnabled( m_ui.JackClientPortAliasComboBox->currentIndex() == 0); } #endif #endif #ifdef CONFIG_SYSTEM_TRAY m_ui.SystemTrayQueryCloseCheckBox->setEnabled( m_ui.SystemTrayCheckBox->isChecked()); #endif m_ui.StopJackCheckBox->setEnabled( m_ui.JackDBusEnabledCheckBox->isChecked()); if (!m_ui.JackDBusEnabledCheckBox->isChecked()) { m_ui.StopJackCheckBox->setChecked(true); } bEnabled = m_ui.ServerConfigCheckBox->isChecked(); m_ui.ServerConfigNameComboBox->setEnabled(bEnabled); m_ui.ServerConfigTempCheckBox->setEnabled(bEnabled); m_ui.AliasesEditingCheckBox->setEnabled( m_ui.AliasesEnabledCheckBox->isChecked()); #ifndef CONFIG_XUNIQUE m_ui.SingletonCheckBox->setEnabled(false); #endif m_ui.TransportButtonsCheckBox->setEnabled( m_ui.LeftButtonsCheckBox->isChecked()); changeDriverUpdate(m_ui.DriverComboBox->currentText(), false); m_ui.DialogButtonBox->button(QDialogButtonBox::Ok)->setEnabled(bValid); } // Meta-symbol menu executive. void qjackctlSetupForm::symbolMenu( QLineEdit *pLineEdit, QToolButton *pToolButton ) { const QString s = " "; QMenu menu(this); menu.addAction("%P" + s + tr("&Preset Name")); menu.addSeparator(); menu.addAction("%N" + s + tr("&Server Name")); menu.addAction("%s" + s + tr("&Server Path")); menu.addAction("%d" + s + tr("&Driver")); menu.addAction("%i" + s + tr("&Interface")); menu.addSeparator(); menu.addAction("%r" + s + tr("Sample &Rate")); menu.addAction("%p" + s + tr("&Frames/Period")); menu.addAction("%n" + s + tr("Periods/&Buffer")); QAction *pAction = menu.exec(pToolButton->mapToGlobal(QPoint(0,0))); if (pAction) { const QString sText = pAction->text(); int iMetaChar = sText.indexOf('%'); if (iMetaChar >= 0) { pLineEdit->insert('%' + sText[iMetaChar + 1]); // optionsChanged(); } } } // Startup script meta-symbol button slot. void qjackctlSetupForm::symbolStartupScript (void) { symbolMenu(m_ui.StartupScriptShellComboBox->lineEdit(), m_ui.StartupScriptSymbolToolButton); } // Post-startup script meta-symbol button slot. void qjackctlSetupForm::symbolPostStartupScript (void) { symbolMenu(m_ui.PostStartupScriptShellComboBox->lineEdit(), m_ui.PostStartupScriptSymbolToolButton); } // Shutdown script meta-symbol button slot. void qjackctlSetupForm::symbolShutdownScript (void) { symbolMenu(m_ui.ShutdownScriptShellComboBox->lineEdit(), m_ui.ShutdownScriptSymbolToolButton); } // Post-shutdown script meta-symbol button slot. void qjackctlSetupForm::symbolPostShutdownScript (void) { symbolMenu(m_ui.PostShutdownScriptShellComboBox->lineEdit(), m_ui.PostShutdownScriptSymbolToolButton); } // Startup script browse slot. void qjackctlSetupForm::browseStartupScript() { QString sFileName = QFileDialog::getOpenFileName( this, // Parent. tr("Startup Script"), // Caption. m_ui.StartupScriptShellComboBox->currentText() // Start here. ); if (!sFileName.isEmpty()) { setComboBoxCurrentText(m_ui.StartupScriptShellComboBox, sFileName); m_ui.StartupScriptShellComboBox->setFocus(); optionsChanged(); } } // Post-startup script browse slot. void qjackctlSetupForm::browsePostStartupScript() { QString sFileName = QFileDialog::getOpenFileName( this, // Parent. tr("Post-Startup Script"), // Caption. m_ui.PostStartupScriptShellComboBox->currentText() // Start here. ); if (!sFileName.isEmpty()) { setComboBoxCurrentText(m_ui.PostStartupScriptShellComboBox, sFileName); m_ui.PostStartupScriptShellComboBox->setFocus(); optionsChanged(); } } // Shutdown script browse slot. void qjackctlSetupForm::browseShutdownScript() { QString sFileName = QFileDialog::getOpenFileName( this, // Parent. tr("Shutdown Script"), // Caption. m_ui.ShutdownScriptShellComboBox->currentText() // Start here. ); if (!sFileName.isEmpty()) { setComboBoxCurrentText(m_ui.ShutdownScriptShellComboBox, sFileName); m_ui.ShutdownScriptShellComboBox->setFocus(); optionsChanged(); } } // Post-shutdown script browse slot. void qjackctlSetupForm::browsePostShutdownScript() { QString sFileName = QFileDialog::getOpenFileName( this, // Parent. tr("Post-Shutdown Script"), // Caption. m_ui.PostShutdownScriptShellComboBox->currentText() // Start here. ); if (!sFileName.isEmpty()) { setComboBoxCurrentText(m_ui.PostShutdownScriptShellComboBox, sFileName); m_ui.PostShutdownScriptShellComboBox->setFocus(); optionsChanged(); } } // Active Patchbay path browse slot. void qjackctlSetupForm::browseActivePatchbayPath() { QString sFileName = QFileDialog::getOpenFileName( this, // Parent. tr("Active Patchbay Definition"), // Caption. m_ui.ActivePatchbayPathComboBox->currentText(), // Start here. tr("Patchbay Definition files") + " (*.xml)" // Filter (XML files) ); if (!sFileName.isEmpty()) { setComboBoxCurrentText(m_ui.ActivePatchbayPathComboBox, sFileName); m_ui.ActivePatchbayPathComboBox->setFocus(); optionsChanged(); } } // Messages log path browse slot. void qjackctlSetupForm::browseMessagesLogPath() { QString sFileName = QFileDialog::getSaveFileName( this, // Parent. tr("Messages Log"), // Caption. m_ui.MessagesLogPathComboBox->currentText(), // Start here. tr("Log files") + " (*.log)" // Filter (log files) ); if (!sFileName.isEmpty()) { setComboBoxCurrentText(m_ui.MessagesLogPathComboBox, sFileName); m_ui.MessagesLogPathComboBox->setFocus(); optionsChanged(); } } // The display font 1 (big time) selection dialog. void qjackctlSetupForm::chooseDisplayFont1() { bool bOk = false; QFont font = QFontDialog::getFont(&bOk, m_ui.DisplayFont1TextLabel->font(), this); if (bOk) { m_ui.DisplayFont1TextLabel->setFont(font); m_ui.DisplayFont1TextLabel->setText(font.family() + ' ' + QString::number(font.pointSize())); optionsChanged(); } } // The display font 2 (normal time et al.) selection dialog. void qjackctlSetupForm::chooseDisplayFont2() { bool bOk = false; QFont font = QFontDialog::getFont(&bOk, m_ui.DisplayFont2TextLabel->font(), this); if (bOk) { m_ui.DisplayFont2TextLabel->setFont(font); m_ui.DisplayFont2TextLabel->setText(font.family() + ' ' + QString::number(font.pointSize())); optionsChanged(); } } // The channel display effect demo changer. void qjackctlSetupForm::toggleDisplayEffect ( bool bOn ) { QPalette pal; pal.setColor(QPalette::Foreground, Qt::green); if (bOn) { QPixmap pm(":/images/displaybg1.png"); pal.setBrush(QPalette::Background, QBrush(pm)); } else { pal.setColor(QPalette::Background, Qt::black); } m_ui.DisplayFont1TextLabel->setPalette(pal); m_ui.DisplayFont2TextLabel->setPalette(pal); optionsChanged(); } // The messages font selection dialog. void qjackctlSetupForm::chooseMessagesFont (void) { bool bOk = false; QFont font = QFontDialog::getFont(&bOk, m_ui.MessagesFontTextLabel->font(), this); if (bOk) { m_ui.MessagesFontTextLabel->setFont(font); m_ui.MessagesFontTextLabel->setText(font.family() + ' ' + QString::number(font.pointSize())); optionsChanged(); } } // The connections font selection dialog. void qjackctlSetupForm::chooseConnectionsFont (void) { bool bOk = false; QFont font = QFontDialog::getFont(&bOk, m_ui.ConnectionsFontTextLabel->font(), this); if (bOk) { m_ui.ConnectionsFontTextLabel->setFont(font); m_ui.ConnectionsFontTextLabel->setText(font.family() + ' ' + QString::number(font.pointSize())); optionsChanged(); } } // Mark that some server preset settings have changed. void qjackctlSetupForm::settingsChanged (void) { if (m_iDirtySetup > 0) return; m_iDirtySettings++; stabilizeForm(); } // Mark that some program options have changed. void qjackctlSetupForm::optionsChanged (void) { if (m_iDirtySetup > 0) return; m_iDirtyOptions++; stabilizeForm(); } // Accept settings (OK button slot). void qjackctlSetupForm::accept (void) { qjackctlMainForm *pMainForm = qjackctlMainForm::getInstance(); if (pMainForm == NULL) return; if (m_iDirtySettings > 0 || m_iDirtyOptions > 0) { // To track down deferred or immediate changes. const bool bOldMessagesLog = m_pSetup->bMessagesLog; const QString sOldMessagesLogPath = m_pSetup->sMessagesLogPath; const QString sOldMessagesFont = m_pSetup->sMessagesFont; const QString sOldDisplayFont1 = m_pSetup->sDisplayFont1; const QString sOldDisplayFont2 = m_pSetup->sDisplayFont2; const QString sOldConnectionsFont = m_pSetup->sConnectionsFont; const int iOldConnectionsIconSize = m_pSetup->iConnectionsIconSize; const int iOldJackClientPortAlias = m_pSetup->iJackClientPortAlias; const bool bOldJackClientPortMetadata = m_pSetup->bJackClientPortMetadata; const int iOldTimeDisplay = m_pSetup->iTimeDisplay; const int iOldTimeFormat = m_pSetup->iTimeFormat; const bool bOldDisplayEffect = m_pSetup->bDisplayEffect; const bool bOldActivePatchbay = m_pSetup->bActivePatchbay; const QString sOldActivePatchbayPath = m_pSetup->sActivePatchbayPath; const bool bOldStdoutCapture = m_pSetup->bStdoutCapture; const bool bOldKeepOnTop = m_pSetup->bKeepOnTop; #ifdef CONFIG_SYSTEM_TRAY const bool bOldSystemTray = m_pSetup->bSystemTray; #endif const int bOldMessagesLimit = m_pSetup->bMessagesLimit; const int iOldMessagesLimitLines = m_pSetup->iMessagesLimitLines; const bool bOldBezierLines = m_pSetup->bBezierLines; const bool bOldAlsaSeqEnabled = m_pSetup->bAlsaSeqEnabled; const bool bOldDBusEnabled = m_pSetup->bDBusEnabled; const bool bOldJackDBusEnabled = m_pSetup->bJackDBusEnabled; const bool bOldAliasesEnabled = m_pSetup->bAliasesEnabled; const bool bOldAliasesEditing = m_pSetup->bAliasesEditing; const bool bOldLeftButtons = m_pSetup->bLeftButtons; const bool bOldRightButtons = m_pSetup->bRightButtons; const bool bOldTransportButtons = m_pSetup->bTransportButtons; const bool bOldTextLabels = m_pSetup->bTextLabels; const int iOldBaseFontSize = m_pSetup->iBaseFontSize; // Save current preset selection. m_pSetup->sDefPreset = m_ui.PresetComboBox->currentText(); // Always save current settings... savePreset(m_pSetup->sDefPreset); // Save Options... m_pSetup->bStartupScript = m_ui.StartupScriptCheckBox->isChecked(); m_pSetup->sStartupScriptShell = m_ui.StartupScriptShellComboBox->currentText(); m_pSetup->bPostStartupScript = m_ui.PostStartupScriptCheckBox->isChecked(); m_pSetup->sPostStartupScriptShell = m_ui.PostStartupScriptShellComboBox->currentText(); m_pSetup->bShutdownScript = m_ui.ShutdownScriptCheckBox->isChecked(); m_pSetup->sShutdownScriptShell = m_ui.ShutdownScriptShellComboBox->currentText(); m_pSetup->bPostShutdownScript = m_ui.PostShutdownScriptCheckBox->isChecked(); m_pSetup->sPostShutdownScriptShell = m_ui.PostShutdownScriptShellComboBox->currentText(); m_pSetup->bStdoutCapture = m_ui.StdoutCaptureCheckBox->isChecked(); m_pSetup->sXrunRegex = m_ui.XrunRegexComboBox->currentText(); m_pSetup->bActivePatchbay = m_ui.ActivePatchbayCheckBox->isChecked(); m_pSetup->sActivePatchbayPath = m_ui.ActivePatchbayPathComboBox->currentText(); m_pSetup->bActivePatchbayReset = m_ui.ActivePatchbayResetCheckBox->isChecked(); m_pSetup->bQueryDisconnect = m_ui.QueryDisconnectCheckBox->isChecked(); m_pSetup->bMessagesLog = m_ui.MessagesLogCheckBox->isChecked(); m_pSetup->sMessagesLogPath = m_ui.MessagesLogPathComboBox->currentText(); m_pSetup->bBezierLines = m_ui.BezierLinesCheckBox->isChecked(); // Save Defaults... m_pSetup->iTimeDisplay = m_pTimeDisplayButtonGroup->checkedId(); m_pSetup->iTimeFormat = m_ui.TimeFormatComboBox->currentIndex(); m_pSetup->sMessagesFont = m_ui.MessagesFontTextLabel->font().toString(); m_pSetup->bMessagesLimit = m_ui.MessagesLimitCheckBox->isChecked(); m_pSetup->iMessagesLimitLines = m_ui.MessagesLimitLinesComboBox->currentText().toInt(); m_pSetup->sDisplayFont1 = m_ui.DisplayFont1TextLabel->font().toString(); m_pSetup->sDisplayFont2 = m_ui.DisplayFont2TextLabel->font().toString(); m_pSetup->bDisplayEffect = m_ui.DisplayEffectCheckBox->isChecked(); m_pSetup->bDisplayBlink = m_ui.DisplayBlinkCheckBox->isChecked(); m_pSetup->iJackClientPortAlias = m_ui.JackClientPortAliasComboBox->currentIndex(); m_pSetup->bJackClientPortMetadata = m_ui.JackClientPortMetadataCheckBox->isChecked(); m_pSetup->iConnectionsIconSize = m_ui.ConnectionsIconSizeComboBox->currentIndex(); m_pSetup->sConnectionsFont = m_ui.ConnectionsFontTextLabel->font().toString(); m_pSetup->bStartJack = m_ui.StartJackCheckBox->isChecked(); m_pSetup->bStopJack = m_ui.StopJackCheckBox->isChecked(); m_pSetup->bQueryClose = m_ui.QueryCloseCheckBox->isChecked(); m_pSetup->bQueryShutdown = m_ui.QueryShutdownCheckBox->isChecked(); m_pSetup->bKeepOnTop = m_ui.KeepOnTopCheckBox->isChecked(); #ifdef CONFIG_SYSTEM_TRAY m_pSetup->bSystemTray = m_ui.SystemTrayCheckBox->isChecked(); m_pSetup->bSystemTrayQueryClose = m_ui.SystemTrayQueryCloseCheckBox->isChecked(); #endif m_pSetup->bSingleton = m_ui.SingletonCheckBox->isChecked(); m_pSetup->bServerConfig = m_ui.ServerConfigCheckBox->isChecked(); m_pSetup->sServerConfigName = m_ui.ServerConfigNameComboBox->currentText(); m_pSetup->bServerConfigTemp = m_ui.ServerConfigTempCheckBox->isChecked(); m_pSetup->bAlsaSeqEnabled = m_ui.AlsaSeqEnabledCheckBox->isChecked(); m_pSetup->bDBusEnabled = m_ui.DBusEnabledCheckBox->isChecked(); m_pSetup->bJackDBusEnabled = m_ui.JackDBusEnabledCheckBox->isChecked(); m_pSetup->bAliasesEnabled = m_ui.AliasesEnabledCheckBox->isChecked(); m_pSetup->bAliasesEditing = m_ui.AliasesEditingCheckBox->isChecked(); m_pSetup->bLeftButtons = !m_ui.LeftButtonsCheckBox->isChecked(); m_pSetup->bRightButtons = !m_ui.RightButtonsCheckBox->isChecked(); m_pSetup->bTransportButtons = !m_ui.TransportButtonsCheckBox->isChecked(); m_pSetup->bTextLabels = !m_ui.TextLabelsCheckBox->isChecked(); m_pSetup->iBaseFontSize = m_ui.BaseFontSizeComboBox->currentText().toInt(); // Check wheather something immediate has changed. if (( bOldMessagesLog && !m_pSetup->bMessagesLog) || (!bOldMessagesLog && m_pSetup->bMessagesLog) || (sOldMessagesLogPath != m_pSetup->sMessagesLogPath)) pMainForm->updateMessagesLogging(); if (( bOldBezierLines && !m_pSetup->bBezierLines) || (!bOldBezierLines && m_pSetup->bBezierLines)) pMainForm->updateBezierLines(); if (( bOldDisplayEffect && !m_pSetup->bDisplayEffect) || (!bOldDisplayEffect && m_pSetup->bDisplayEffect)) pMainForm->updateDisplayEffect(); if (iOldJackClientPortAlias != m_pSetup->iJackClientPortAlias) pMainForm->updateJackClientPortAlias(); if (( bOldJackClientPortMetadata && !m_pSetup->bJackClientPortMetadata) || (!bOldJackClientPortMetadata && m_pSetup->bJackClientPortMetadata)) pMainForm->updateJackClientPortMetadata(); if (iOldConnectionsIconSize != m_pSetup->iConnectionsIconSize) pMainForm->updateConnectionsIconSize(); if (sOldConnectionsFont != m_pSetup->sConnectionsFont) pMainForm->updateConnectionsFont(); if (sOldMessagesFont != m_pSetup->sMessagesFont) pMainForm->updateMessagesFont(); if (( bOldMessagesLimit && !m_pSetup->bMessagesLimit) || (!bOldMessagesLimit && m_pSetup->bMessagesLimit) || (iOldMessagesLimitLines != m_pSetup->iMessagesLimitLines)) pMainForm->updateMessagesLimit(); if (sOldDisplayFont1 != m_pSetup->sDisplayFont1 || sOldDisplayFont2 != m_pSetup->sDisplayFont2) pMainForm->updateTimeDisplayFonts(); if (iOldTimeDisplay != m_pSetup->iTimeDisplay) pMainForm->updateTimeDisplayToolTips(); if (iOldTimeFormat != m_pSetup->iTimeFormat) pMainForm->updateTimeFormat(); if ((!bOldActivePatchbay && m_pSetup->bActivePatchbay) || (sOldActivePatchbayPath != m_pSetup->sActivePatchbayPath)) pMainForm->updateActivePatchbay(); #ifdef CONFIG_SYSTEM_TRAY if (( bOldSystemTray && !m_pSetup->bSystemTray) || (!bOldSystemTray && m_pSetup->bSystemTray)) pMainForm->updateSystemTray(); #endif if (( bOldAliasesEnabled && !m_pSetup->bAliasesEnabled) || (!bOldAliasesEnabled && m_pSetup->bAliasesEnabled) || ( bOldAliasesEditing && !m_pSetup->bAliasesEditing) || (!bOldAliasesEditing && m_pSetup->bAliasesEditing)) pMainForm->updateAliases(); if (( bOldLeftButtons && !m_pSetup->bLeftButtons) || (!bOldLeftButtons && m_pSetup->bLeftButtons) || ( bOldRightButtons && !m_pSetup->bRightButtons) || (!bOldRightButtons && m_pSetup->bRightButtons) || ( bOldTransportButtons && !m_pSetup->bTransportButtons) || (!bOldTransportButtons && m_pSetup->bTransportButtons) || ( bOldTextLabels && !m_pSetup->bTextLabels) || (!bOldTextLabels && m_pSetup->bTextLabels)) pMainForm->updateButtons(); // Warn if something will be only effective on next run. if (( bOldStdoutCapture && !m_pSetup->bStdoutCapture) || (!bOldStdoutCapture && m_pSetup->bStdoutCapture) || ( bOldKeepOnTop && !m_pSetup->bKeepOnTop) || (!bOldKeepOnTop && m_pSetup->bKeepOnTop) || ( bOldAlsaSeqEnabled && !m_pSetup->bAlsaSeqEnabled) || (!bOldAlsaSeqEnabled && m_pSetup->bAlsaSeqEnabled) || ( bOldDBusEnabled && !m_pSetup->bDBusEnabled) || (!bOldDBusEnabled && m_pSetup->bDBusEnabled) || ( bOldJackDBusEnabled && !m_pSetup->bJackDBusEnabled) || (!bOldJackDBusEnabled && m_pSetup->bJackDBusEnabled) || (iOldBaseFontSize != m_pSetup->iBaseFontSize)) pMainForm->showDirtySetupWarning(); // If server is currently running, warn user... pMainForm->showDirtySettingsWarning(); } // Save combobox history... m_pSetup->saveComboBoxHistory(m_ui.ServerPrefixComboBox); m_pSetup->saveComboBoxHistory(m_ui.ServerNameComboBox); m_pSetup->saveComboBoxHistory(m_ui.ServerSuffixComboBox); m_pSetup->saveComboBoxHistory(m_ui.StartupScriptShellComboBox); m_pSetup->saveComboBoxHistory(m_ui.PostStartupScriptShellComboBox); m_pSetup->saveComboBoxHistory(m_ui.ShutdownScriptShellComboBox); m_pSetup->saveComboBoxHistory(m_ui.PostShutdownScriptShellComboBox); m_pSetup->saveComboBoxHistory(m_ui.XrunRegexComboBox); m_pSetup->saveComboBoxHistory(m_ui.ActivePatchbayPathComboBox); m_pSetup->saveComboBoxHistory(m_ui.MessagesLogPathComboBox); m_pSetup->saveComboBoxHistory(m_ui.ServerConfigNameComboBox); // Save/commit to disk. m_pSetup->saveSetup(); // Reset dirty flags. m_iDirtySettings = 0; m_iDirtyOptions = 0; // Just go with dialog acceptance. QDialog::accept(); } // Reject settings (Cancel button slot). void qjackctlSetupForm::reject (void) { if (queryClose()) QDialog::reject(); } // Check whether we're clear to close. bool qjackctlSetupForm::queryClose (void) { bool bQueryClose = true; // Check if there's any pending changes... if (m_iDirtySettings > 0 || m_iDirtyOptions > 0) { switch (QMessageBox::warning(this, tr("Warning") + " - " QJACKCTL_SUBTITLE1, tr("Some settings have been changed.\n\n" "Do you want to apply the changes?"), QMessageBox::Apply | QMessageBox::Discard | QMessageBox::Cancel)) { case QMessageBox::Apply: accept(); // Fall thru... case QMessageBox::Discard: // Reset dirty flags... m_iDirtySettings = 0; m_iDirtyOptions = 0; break; default: // Cancel. bQueryClose = false; break; } } return bQueryClose; } // Notify our parent that we're emerging. void qjackctlSetupForm::showEvent ( QShowEvent *pShowEvent ) { qjackctlMainForm *pMainForm = qjackctlMainForm::getInstance(); if (pMainForm) pMainForm->stabilizeForm(); stabilizeForm(); QDialog::showEvent(pShowEvent); } // Notify our parent that we're closing. void qjackctlSetupForm::hideEvent ( QHideEvent *pHideEvent ) { QDialog::hideEvent(pHideEvent); qjackctlMainForm *pMainForm = qjackctlMainForm::getInstance(); if (pMainForm) pMainForm->stabilizeForm(); } // Just about to notify main-window that we're closing. void qjackctlSetupForm::closeEvent ( QCloseEvent * /*pCloseEvent*/ ) { QDialog::hide(); qjackctlMainForm *pMainForm = qjackctlMainForm::getInstance(); if (pMainForm) pMainForm->stabilizeForm(); } // end of qjackctlSetupForm.cpp qjackctl-0.4.2/src/PaxHeaders.14935/qjackctlMessagesStatusForm.cpp0000644000000000000000000000013212700760152021662 xustar0030 mtime=1459871850.621909288 30 atime=1459871850.621909288 30 ctime=1459871850.621909288 qjackctl-0.4.2/src/qjackctlMessagesStatusForm.cpp0000644000175000001440000002375112700760152022436 0ustar00rncbcusers00000000000000// qjackctlMessagesStatusForm.cpp // /**************************************************************************** Copyright (C) 2003-2013, rncbc aka Rui Nuno Capela. All rights reserved. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. *****************************************************************************/ #include "qjackctlAbout.h" #include "qjackctlMessagesStatusForm.h" #include "qjackctlStatus.h" #include "qjackctlSetup.h" #include "qjackctlMainForm.h" #include #include #include #include #include #include #include #include // The maximum number of message lines. #define QJACKCTL_MESSAGES_MAXLINES 1000 //---------------------------------------------------------------------------- // qjackctlMessagesStatusForm -- UI wrapper form. // Constructor. qjackctlMessagesStatusForm::qjackctlMessagesStatusForm ( QWidget *pParent, Qt::WindowFlags wflags ) : QWidget(pParent, wflags) { // Setup UI struct... m_ui.setupUi(this); // m_ui.MessagesTextView->setTextFormat(Qt::LogText); // Initialize default message limit. m_iMessagesLines = 0; setMessagesLimit(QJACKCTL_MESSAGES_MAXLINES); m_pMessagesLog = NULL; // Create the list view items 'a priori'... const QString s = " "; const QString c = ":" + s; const QString n = "--"; QTreeWidgetItem *pViewItem; // Status list view... QHeaderView *pHeader = m_ui.StatsListView->header(); pHeader->setDefaultAlignment(Qt::AlignLeft); // pHeader->setDefaultSectionSize(320); #if QT_VERSION >= 0x050000 // pHeader->setSectionResizeMode(QHeaderView::Custom); pHeader->setSectionsMovable(false); #else // pHeader->setResizeMode(QHeaderView::Custom); pHeader->setMovable(false); #endif pHeader->setStretchLastSection(true); m_apStatus[STATUS_SERVER_NAME] = new QTreeWidgetItem(m_ui.StatsListView, QStringList() << s + tr("Server name") + c << n); m_apStatus[STATUS_SERVER_STATE] = new QTreeWidgetItem(m_ui.StatsListView, QStringList() << s + tr("Server state") + c << n); m_apStatus[STATUS_DSP_LOAD] = new QTreeWidgetItem(m_ui.StatsListView, QStringList() << s + tr("DSP Load") + c << n); m_apStatus[STATUS_SAMPLE_RATE] = new QTreeWidgetItem(m_ui.StatsListView, QStringList() << s + tr("Sample Rate") + c << n); m_apStatus[STATUS_BUFFER_SIZE] = new QTreeWidgetItem(m_ui.StatsListView, QStringList() << s + tr("Buffer Size") + c << n); m_apStatus[STATUS_REALTIME] = new QTreeWidgetItem(m_ui.StatsListView, QStringList() << s + tr("Realtime Mode") + c << n); pViewItem = new QTreeWidgetItem(m_ui.StatsListView, QStringList() << s + tr("Transport state") + c << n); m_apStatus[STATUS_TRANSPORT_STATE] = pViewItem; m_apStatus[STATUS_TRANSPORT_TIME] = new QTreeWidgetItem(pViewItem, QStringList() << s + tr("Transport Timecode") + c << n); m_apStatus[STATUS_TRANSPORT_BBT] = new QTreeWidgetItem(pViewItem, QStringList() << s + tr("Transport BBT") + c << n); m_apStatus[STATUS_TRANSPORT_BPM] = new QTreeWidgetItem(pViewItem, QStringList() << s + tr("Transport BPM") + c << n); pViewItem = new QTreeWidgetItem(m_ui.StatsListView, QStringList() << s + tr("XRUN count since last server startup") + c << n); m_apStatus[STATUS_XRUN_COUNT] = pViewItem; m_apStatus[STATUS_XRUN_TIME] = new QTreeWidgetItem(pViewItem, QStringList() << s + tr("XRUN last time detected") + c << n); m_apStatus[STATUS_XRUN_LAST] = new QTreeWidgetItem(pViewItem, QStringList() << s + tr("XRUN last") + c << n); m_apStatus[STATUS_XRUN_MAX] = new QTreeWidgetItem(pViewItem, QStringList() << s + tr("XRUN maximum") + c << n); m_apStatus[STATUS_XRUN_MIN] = new QTreeWidgetItem(pViewItem, QStringList() << s + tr("XRUN minimum") + c << n); m_apStatus[STATUS_XRUN_AVG] = new QTreeWidgetItem(pViewItem, QStringList() << s + tr("XRUN average") + c << n); m_apStatus[STATUS_XRUN_TOTAL] = new QTreeWidgetItem(pViewItem, QStringList() << s + tr("XRUN total") + c << n); #ifdef CONFIG_JACK_MAX_DELAY m_apStatus[STATUS_MAX_DELAY] = new QTreeWidgetItem(m_ui.StatsListView, QStringList() << s + tr("Maximum scheduling delay") + c << n); #endif m_apStatus[STATUS_RESET_TIME] = new QTreeWidgetItem(m_ui.StatsListView, QStringList() << s + tr("Time of last reset") + c << n); m_ui.StatsListView->resizeColumnToContents(0); // Description. m_ui.StatsListView->resizeColumnToContents(1); // Value. // UI connections... QObject::connect(m_ui.ResetPushButton, SIGNAL(clicked()), SLOT(resetXrunStats())); QObject::connect(m_ui.RefreshPushButton, SIGNAL(clicked()), SLOT(refreshXrunStats())); } // Destructor. qjackctlMessagesStatusForm::~qjackctlMessagesStatusForm (void) { setLogging(false); } // Notify our parent that we're emerging. void qjackctlMessagesStatusForm::showEvent ( QShowEvent *pShowEvent ) { qjackctlMainForm *pMainForm = qjackctlMainForm::getInstance(); if (pMainForm) pMainForm->stabilizeForm(); QWidget::showEvent(pShowEvent); } // Notify our parent that we're closing. void qjackctlMessagesStatusForm::hideEvent ( QHideEvent *pHideEvent ) { QWidget::hideEvent(pHideEvent); qjackctlMainForm *pMainForm = qjackctlMainForm::getInstance(); if (pMainForm) pMainForm->stabilizeForm(); } // Just about to notify main-window that we're closing. void qjackctlMessagesStatusForm::closeEvent ( QCloseEvent * /*pCloseEvent*/ ) { QWidget::hide(); qjackctlMainForm *pMainForm = qjackctlMainForm::getInstance(); if (pMainForm) pMainForm->stabilizeForm(); } // Tab page accessors. void qjackctlMessagesStatusForm::setTabPage ( int iTabPage ) { m_ui.MessagesStatusTabWidget->setCurrentIndex(iTabPage); } int qjackctlMessagesStatusForm::tabPage (void) const { return m_ui.MessagesStatusTabWidget->currentIndex(); } // Messages view font accessors. QFont qjackctlMessagesStatusForm::messagesFont (void) const { return m_ui.MessagesTextView->font(); } void qjackctlMessagesStatusForm::setMessagesFont ( const QFont & font ) { m_ui.MessagesTextView->setFont(font); } // Messages line limit accessors. int qjackctlMessagesStatusForm::messagesLimit (void) const { return m_iMessagesLimit; } void qjackctlMessagesStatusForm::setMessagesLimit ( int iMessagesLimit ) { m_iMessagesLimit = iMessagesLimit; m_iMessagesHigh = iMessagesLimit + (iMessagesLimit / 3); // m_ui.MessagesTextView->setMaxLogLines(iMessagesLimit); } // Messages logging stuff. bool qjackctlMessagesStatusForm::isLogging (void) const { return (m_pMessagesLog != NULL); } void qjackctlMessagesStatusForm::setLogging ( bool bEnabled, const QString& sFilename ) { if (m_pMessagesLog) { appendMessages(tr("Logging stopped --- %1 ---") .arg(QDateTime::currentDateTime().toString())); m_pMessagesLog->close(); delete m_pMessagesLog; m_pMessagesLog = NULL; } if (bEnabled) { m_pMessagesLog = new QFile(sFilename); if (m_pMessagesLog->open(QIODevice::Text | QIODevice::Append)) { appendMessages(tr("Logging started --- %1 ---") .arg(QDateTime::currentDateTime().toString())); } else { delete m_pMessagesLog; m_pMessagesLog = NULL; } } } // Messages log output method. void qjackctlMessagesStatusForm::appendMessagesLog ( const QString& s ) { if (m_pMessagesLog) { QTextStream(m_pMessagesLog) << s << endl; m_pMessagesLog->flush(); } } // Messages widget output method. void qjackctlMessagesStatusForm::appendMessagesLine ( const QString& s ) { // Check for message line limit... if (m_iMessagesLines > m_iMessagesHigh) { m_ui.MessagesTextView->setUpdatesEnabled(false); QTextCursor textCursor(m_ui.MessagesTextView->document()->begin()); while (m_iMessagesLines > m_iMessagesLimit) { // Move cursor extending selection // from start to next line-block... textCursor.movePosition( QTextCursor::NextBlock, QTextCursor::KeepAnchor); m_iMessagesLines--; } // Remove the excessive line-blocks... textCursor.removeSelectedText(); m_ui.MessagesTextView->setUpdatesEnabled(true); } m_ui.MessagesTextView->append(s); m_iMessagesLines++; } void qjackctlMessagesStatusForm::appendMessages ( const QString& s ) { appendMessagesColor(s, "#999999"); } void qjackctlMessagesStatusForm::appendMessagesColor ( const QString& s, const QString& c ) { QString sText = QTime::currentTime().toString("hh:mm:ss.zzz") + ' ' + s; appendMessagesLine("" + sText + ""); appendMessagesLog(sText); } void qjackctlMessagesStatusForm::appendMessagesText ( const QString& s ) { appendMessagesLine(s); appendMessagesLog(s); } // Ask our parent to reset status. void qjackctlMessagesStatusForm::resetXrunStats (void) { qjackctlMainForm *pMainForm = qjackctlMainForm::getInstance(); if (pMainForm) pMainForm->resetXrunStats(); } // Ask our parent to refresh our status. void qjackctlMessagesStatusForm::refreshXrunStats (void) { qjackctlMainForm *pMainForm = qjackctlMainForm::getInstance(); if (pMainForm) pMainForm->refreshXrunStats(); } // Update one status item value. void qjackctlMessagesStatusForm::updateStatusItem ( int iStatusItem, const QString& sText ) { m_apStatus[iStatusItem]->setText(1, sText); } // Keyboard event handler. void qjackctlMessagesStatusForm::keyPressEvent ( QKeyEvent *pKeyEvent ) { #ifdef CONFIG_DEBUG_0 qDebug("qjackctlMessagesStatusForm::keyPressEvent(%d)", pKeyEvent->key()); #endif int iKey = pKeyEvent->key(); switch (iKey) { case Qt::Key_Escape: close(); break; default: QWidget::keyPressEvent(pKeyEvent); break; } } // end of qjackctlMessagesStatusForm.cpp qjackctl-0.4.2/src/PaxHeaders.14935/qjackctlSetup.h0000644000000000000000000000013212700760152016630 xustar0030 mtime=1459871850.625911288 30 atime=1459871850.625911288 30 ctime=1459871850.625911288 qjackctl-0.4.2/src/qjackctlSetup.h0000644000175000001440000001324412700760152017400 0ustar00rncbcusers00000000000000// qjackctlSetup.h // /**************************************************************************** Copyright (C) 2003-2016, rncbc aka Rui Nuno Capela. All rights reserved. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. *****************************************************************************/ #ifndef __qjackctlSetup_h #define __qjackctlSetup_h #include "qjackctlConnectAlias.h" #include // Forward declarations. class QWidget; class QComboBox; class QSplitter; // Audio mode combobox item indexes. #define QJACKCTL_DUPLEX 0 #define QJACKCTL_CAPTURE 1 #define QJACKCTL_PLAYBACK 2 // Icon size combobox item indexes. #define QJACKCTL_ICON_16X16 0 #define QJACKCTL_ICON_32X32 1 #define QJACKCTL_ICON_64X64 2 // Server settings preset struct. struct qjackctlPreset { QString sServerPrefix; QString sServerName; bool bRealtime; bool bSoftMode; bool bMonitor; bool bShorts; bool bNoMemLock; bool bUnlockMem; bool bHWMon; bool bHWMeter; bool bIgnoreHW; int iPriority; int iFrames; int iSampleRate; int iPeriods; int iWordLength; int iWait; int iChan; QString sDriver; QString sInterface; int iAudio; int iDither; int iTimeout; QString sInDevice; QString sOutDevice; int iInChannels; int iOutChannels; int iInLatency; int iOutLatency; int iStartDelay; bool bVerbose; int iPortMax; QString sMidiDriver; QString sServerSuffix; }; // Common settings profile class. class qjackctlSetup { public: // Constructor. qjackctlSetup(); // Destructor; ~qjackctlSetup(); // The settings object accessor. QSettings& settings(); // Explicit I/O methods. void loadSetup(); void saveSetup(); // Command line arguments parser. bool parse_args(const QStringList& args); // Command line usage helper. void print_usage(const QString& arg0); // Default (translated) preset name. QString sDefPresetName; // Immediate server start options. bool bStartJack; bool bStartJackCmd; // Server stop options. bool bStopJack; // User supplied command line. QString sCmdLine; // Current (default) preset name. QString sDefPreset; // Available presets list. QStringList presets; // Options... bool bSingleton; QString sServerName; bool bStartupScript; QString sStartupScriptShell; bool bPostStartupScript; QString sPostStartupScriptShell; bool bShutdownScript; QString sShutdownScriptShell; bool bPostShutdownScript; QString sPostShutdownScriptShell; bool bStdoutCapture; QString sXrunRegex; bool bActivePatchbay; QString sActivePatchbayPath; bool bActivePatchbayReset; bool bQueryDisconnect; bool bMessagesLog; QString sMessagesLogPath; bool bBezierLines; int iTimeDisplay; int iTimeFormat; QString sMessagesFont; bool bMessagesLimit; int iMessagesLimitLines; QString sDisplayFont1; QString sDisplayFont2; bool bDisplayEffect; bool bDisplayBlink; int iJackClientPortAlias; bool bJackClientPortMetadata; int iConnectionsIconSize; QString sConnectionsFont; bool bQueryClose; bool bQueryShutdown; bool bKeepOnTop; bool bSystemTray; bool bSystemTrayQueryClose; bool bServerConfig; QString sServerConfigName; bool bServerConfigTemp; bool bAlsaSeqEnabled; bool bDBusEnabled; bool bJackDBusEnabled; bool bAliasesEnabled; bool bAliasesEditing; bool bLeftButtons; bool bRightButtons; bool bTransportButtons; bool bTextLabels; int iBaseFontSize; // Defaults... QString sPatchbayPath; // Recent patchbay listing. QStringList patchbays; // Recent session directories. QStringList sessionDirs; // Last open tab page... int iMessagesStatusTabPage; int iConnectionsTabPage; // Last session save type... bool bSessionSaveVersion; // Aliases containers. qjackctlConnectAlias aliasAudioOutputs; qjackctlConnectAlias aliasAudioInputs; qjackctlConnectAlias aliasMidiOutputs; qjackctlConnectAlias aliasMidiInputs; qjackctlConnectAlias aliasAlsaOutputs; qjackctlConnectAlias aliasAlsaInputs; // Aliases preset management methods. bool loadAliases(const QString& sPreset); bool saveAliases(const QString& sPreset); // Preset management methods. bool loadPreset(qjackctlPreset& preset, const QString& sPreset); bool savePreset(qjackctlPreset& preset, const QString& sPreset); bool deletePreset(const QString& sPreset); // Combo box history persistence helper prototypes. void loadComboBoxHistory(QComboBox *pComboBox, int iLimit = 8); void saveComboBoxHistory(QComboBox *pComboBox, int iLimit = 8); // Splitter widget sizes persistence helper methods. void loadSplitterSizes(QSplitter *pSplitter, QList& sizes); void saveSplitterSizes(QSplitter *pSplitter); // Widget geometry persistence helper prototypes. void saveWidgetGeometry(QWidget *pWidget, bool bVisible = false); void loadWidgetGeometry(QWidget *pWidget, bool bVisible = false); private: // Our proper settings profile. QSettings m_settings; }; #endif // __qjackctlSetup_h // end of qjackctlSetup.h qjackctl-0.4.2/src/PaxHeaders.14935/qjackctlSession.cpp0000644000000000000000000000013212700760152017506 xustar0030 mtime=1459871850.623910288 30 atime=1459871850.623910288 30 ctime=1459871850.623910288 qjackctl-0.4.2/src/qjackctlSession.cpp0000644000175000001440000004221012700760152020251 0ustar00rncbcusers00000000000000// qjackctlSession.cpp // /**************************************************************************** Copyright (C) 2003-2015, rncbc aka Rui Nuno Capela. All rights reserved. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. *****************************************************************************/ #include "qjackctlAbout.h" #include "qjackctlSession.h" #include "qjackctlMainForm.h" #ifdef CONFIG_JACK_SESSION #include #include #endif #include #include #include #include #include #include #include #include //---------------------------------------------------------------------------- // qjackctlSession -- JACK session container. // Constructor. qjackctlSession::qjackctlSession (void) { } // Destructor. qjackctlSession::~qjackctlSession (void) { clearInfraClients(); clear(); } // Client list accessor (read-only) const qjackctlSession::ClientList& qjackctlSession::clients (void) const { return m_clients; } // House-keeper. void qjackctlSession::clear (void) { qDeleteAll(m_clients); m_clients.clear(); } // Critical methods. bool qjackctlSession::save ( const QString& sSessionDir, int iSessionType ) { // We're always best to // reset old session settings. clear(); qjackctlMainForm *pMainForm = qjackctlMainForm::getInstance(); if (pMainForm == NULL) return false; jack_client_t *pJackClient = pMainForm->jackClient(); if (pJackClient == NULL) return false; const QString sSessionPath = sSessionDir + '/'; // First pass: get all client/port connections, no matter what... const char **ports = ::jack_get_ports(pJackClient, NULL, NULL, 0); if (ports) { for (int i = 0; ports[i]; ++i) { const char *pszSrcClientPort = ports[i]; const QString sSrcClientPort = QString::fromLocal8Bit(pszSrcClientPort); const QString sSrcClient = sSrcClientPort.section(':', 0, 0); ClientItem *pClientItem; if (m_clients.contains(sSrcClient)) { pClientItem = m_clients.value(sSrcClient); } else { pClientItem = new ClientItem; pClientItem->client_name = sSrcClient; m_clients.insert(pClientItem->client_name, pClientItem); } PortItem *pPortItem = new PortItem; pPortItem->port_name = sSrcClientPort.section(':', 1); jack_port_t *pJackPort = ::jack_port_by_name(pJackClient, pszSrcClientPort); pPortItem->port_type = (::jack_port_flags(pJackPort) & JackPortIsInput); const char **connections = ::jack_port_get_all_connections(pJackClient, pJackPort); if (connections) { for (int j = 0; connections[j]; ++j) { const QString sDstClientPort = QString::fromLocal8Bit(connections[j]); ConnectItem *pConnectItem = new ConnectItem; pConnectItem->client_name = sDstClientPort.section(':', 0, 0); pConnectItem->port_name = sDstClientPort.section(':', 1); pConnectItem->connected = true; pPortItem->connects.append(pConnectItem); // pPortItem->connected++; } ::jack_free(connections); } pClientItem->ports.append(pPortItem); // pClientItem->connected += pPortItem->connected; } ::jack_free(ports); } #ifdef CONFIG_JACK_SESSION // Second pass: get all session client commands... if (::jack_session_notify) { jack_session_event_type_t etype = JackSessionSave; switch (iSessionType) { case 1: etype = JackSessionSaveAndQuit; break; case 2: etype = JackSessionSaveTemplate; break; } const QByteArray aSessionPath = sSessionPath.toLocal8Bit(); const char *pszSessionPath = aSessionPath.constData(); jack_session_command_t *commands = ::jack_session_notify(pJackClient, NULL, etype, pszSessionPath); if (commands == NULL) return false; // Second pass... for (int k = 0; commands[k].uuid; ++k) { jack_session_command_t *pCommand = &commands[k]; const QString sClientName = QString::fromLocal8Bit(pCommand->client_name); ClientItem *pClientItem; if (m_clients.contains(sClientName)) { pClientItem = m_clients.value(sClientName); } else { pClientItem = new ClientItem; pClientItem->client_name = sClientName; m_clients.insert(pClientItem->client_name, pClientItem); } pClientItem->client_uuid = QString::fromLocal8Bit(pCommand->uuid); pClientItem->client_command = QString::fromLocal8Bit(pCommand->command); } ::jack_session_commands_free(commands); } #endif // CONFIG_JACK_SESSION // Third pass: check whether there are registered infra-clients... ClientList::ConstIterator iter = m_clients.constBegin(); const ClientList::ConstIterator& iter_end = m_clients.constEnd(); for ( ; iter != iter_end; ++iter) { ClientItem *pClientItem = iter.value(); if (pClientItem->client_command.isEmpty()) { const QString& sClientName = pClientItem->client_name; if (sClientName == "system") continue; InfraClientItem *pInfraClientItem = m_infra_clients.value(sClientName, NULL); if (pInfraClientItem) { pClientItem->client_command = pInfraClientItem->client_command; } else { pInfraClientItem = new InfraClientItem; pInfraClientItem->client_name = sClientName; pInfraClientItem->client_command = pClientItem->client_command; m_infra_clients.insert(sClientName, pInfraClientItem); } } } // Finally: save to file, immediate... return saveFile(sSessionPath + "session.xml"); } bool qjackctlSession::load ( const QString& sSessionDir ) { // Load from file, immediate... const QString sSessionPath = sSessionDir + '/'; if (!loadFile(sSessionPath + "session.xml")) return false; // Start/load clients... ClientList::ConstIterator iter = m_clients.constBegin(); const ClientList::ConstIterator& iter_end = m_clients.constEnd(); for ( ; iter != iter_end; ++iter) { const ClientItem *pClientItem = iter.value(); const QString& sClientName = pClientItem->client_name; QString sCommand = pClientItem->client_command; if (sCommand.isEmpty()) { // Maybe a registered infra-client command... InfraClientItem *pInfraClientItem = m_infra_clients.value(sClientName, NULL); if (pInfraClientItem && !isJackClient(sClientName)) sCommand = pInfraClientItem->client_command; } else if (!pClientItem->client_uuid.isEmpty()){ // Sure a legit session-client command... const QString& sClientDir = sSessionPath + pClientItem->client_name + '/'; sCommand.replace("${SESSION_DIR}", sClientDir); } // Launch command and wait a litle bit before continue... if (!sCommand.isEmpty() && QProcess::startDetached(sCommand)) { QTime time; time.start(); while (time.elapsed() < 200) QApplication::processEvents(); } } // Initial reconnection. update(); // Formerly successful. return true; } // Update (re)connections utility method. bool qjackctlSession::update (void) { qjackctlMainForm *pMainForm = qjackctlMainForm::getInstance(); if (pMainForm == NULL) return false; jack_client_t *pJackClient = pMainForm->jackClient(); if (pJackClient == NULL) return false; // We'll count how many connection updates... int iUpdate = 0; // Now, make the saved connections... ClientList::ConstIterator iter = m_clients.constBegin(); const ClientList::ConstIterator& iter_end = m_clients.constEnd(); for ( ; iter != iter_end; ++iter) { ClientItem *pClientItem = iter.value(); if (pClientItem->connected < 1) continue; QString sSrcClient = pClientItem->client_name; #ifdef CONFIG_JACK_SESSION if (!pClientItem->client_uuid.isEmpty()) { const QByteArray aSrcUuid = pClientItem->client_uuid.toLocal8Bit(); const char *pszSrcUuid = aSrcUuid.constData(); const char *pszSrcClient = ::jack_get_client_name_by_uuid(pJackClient, pszSrcUuid); if (pszSrcClient) { sSrcClient = QString::fromLocal8Bit(pszSrcClient); ::jack_free((void *) pszSrcClient); } } #endif QListIterator iterPort(pClientItem->ports); while (iterPort.hasNext()) { PortItem *pPortItem = iterPort.next(); if (pPortItem->connected < 1) continue; const QString sSrcPort = pPortItem->port_name; const QString sSrcClientPort = sSrcClient + ':' + sSrcPort; const QByteArray aSrcClientPort = sSrcClientPort.toLocal8Bit(); QListIterator iterConnect(pPortItem->connects); while (iterConnect.hasNext()) { ConnectItem *pConnectItem = iterConnect.next(); if (pConnectItem->connected) continue; QString sDstClient = pConnectItem->client_name; #ifdef CONFIG_JACK_SESSION if (m_clients.contains(sDstClient)) { const QString sDstUuid = m_clients.value(sDstClient)->client_uuid; const QByteArray aDstUuid = sDstUuid.toLocal8Bit(); const char *pszDstUuid = aDstUuid.constData(); const char *pszDstClient = ::jack_get_client_name_by_uuid(pJackClient, pszDstUuid); if (pszDstClient) { sDstClient = QString::fromLocal8Bit(pszDstClient); ::jack_free((void *) pszDstClient); } } #endif const QString sDstPort = pConnectItem->port_name; const QString sDstClientPort = sDstClient + ':' + sDstPort; const QByteArray aDstClientPort = sDstClientPort.toLocal8Bit(); int retc; if (pPortItem->port_type) { // Input port... retc = ::jack_connect(pJackClient, aDstClientPort.constData(), aSrcClientPort.constData()); #ifdef CONFIG_DEBUG qDebug("qjackctlSession::update() " "jack_connect: \"%s\" => \"%s\" (%d)", aDstClientPort.constData(), aSrcClientPort.constData(), retc); #endif } else { // Output port... retc = ::jack_connect(pJackClient, aSrcClientPort.constData(), aDstClientPort.constData()); #ifdef CONFIG_DEBUG qDebug("qjackctlSession::update() " "jack_connect: \"%s\" => \"%s\" (%d)", aSrcClientPort.constData(), aDstClientPort.constData(), retc); #endif } // Comply with connection result... if (retc == 0 || retc == EEXIST) { pConnectItem->connected = true; pPortItem->connected--; pClientItem->connected--; iUpdate++; } } } } // Report back. return (iUpdate > 0); } // Specific session file load (read) method. bool qjackctlSession::loadFile ( const QString& sFilename ) { // Open file... QFile file(sFilename); if (!file.open(QIODevice::ReadOnly)) return false; // Parse it a-la-DOM :-) QDomDocument doc("qjackctlSession"); if (!doc.setContent(&file)) { file.close(); return false; } file.close(); // Now, we're always best to // reset old session settings. clear(); // Get root element. QDomElement eDoc = doc.documentElement(); // Parse for clients... for (QDomNode nClient = eDoc.firstChild(); !nClient.isNull(); nClient = nClient.nextSibling()) { // Client element... QDomElement eClient = nClient.toElement(); if (eClient.isNull()) continue; if (eClient.tagName() != "client") continue; ClientItem *pClientItem = new ClientItem; pClientItem->client_name = eClient.attribute("name"); pClientItem->client_uuid = eClient.attribute("uuid"); // Client properties... for (QDomNode nChild = eClient.firstChild(); !nChild.isNull(); nChild = nChild.nextSibling()) { // Client child element... QDomElement eChild = nChild.toElement(); if (eChild.isNull()) continue; if (eChild.tagName() == "command") pClientItem->client_command = eChild.text(); else if (eChild.tagName() == "port") { // Port properties... PortItem *pPortItem = new PortItem; pPortItem->port_name = eChild.attribute("name"); pPortItem->port_type = (eChild.attribute("type") == "in"); // Connection child element... for (QDomNode nConnect = eChild.firstChild(); !nConnect.isNull(); nConnect = nConnect.nextSibling()) { QDomElement eConnect = nConnect.toElement(); if (eConnect.isNull()) continue; if (eConnect.tagName() != "connect") continue; ConnectItem *pConnectItem = new ConnectItem; pConnectItem->client_name = eConnect.attribute("client"); pConnectItem->port_name = eConnect.attribute("port"); pConnectItem->connected = false; pPortItem->connects.append(pConnectItem); pPortItem->connected++; } pClientItem->ports.append(pPortItem); pClientItem->connected += pPortItem->connected; } } m_clients.insert(pClientItem->client_name, pClientItem); } return true; } // Specific session file save (write) method. bool qjackctlSession::saveFile ( const QString& sFilename ) { QFileInfo fi(sFilename); QDomDocument doc("qjackctlSession"); QDomElement eSession = doc.createElement("session"); eSession.setAttribute("name", QFileInfo(fi.absolutePath()).baseName()); doc.appendChild(eSession); // Save clients spec... ClientList::ConstIterator iter = m_clients.constBegin(); const ClientList::ConstIterator& iter_end = m_clients.constEnd(); for ( ; iter != iter_end; ++iter) { const ClientItem *pClientItem = iter.value(); QDomElement eClient = doc.createElement("client"); eClient.setAttribute("name", pClientItem->client_name); if (!pClientItem->client_uuid.isEmpty()) eClient.setAttribute("uuid", pClientItem->client_uuid); if (!pClientItem->client_command.isEmpty()) { QDomElement eCommand = doc.createElement("command"); eCommand.appendChild(doc.createTextNode(pClientItem->client_command)); eClient.appendChild(eCommand); } QListIterator iterPort(pClientItem->ports); while (iterPort.hasNext()) { const PortItem *pPortItem = iterPort.next(); QDomElement ePort = doc.createElement("port"); ePort.setAttribute("name", pPortItem->port_name); ePort.setAttribute("type", pPortItem->port_type ? "in" : "out"); QListIterator iterConnect(pPortItem->connects); while (iterConnect.hasNext()) { const ConnectItem *pConnectItem = iterConnect.next(); QDomElement eConnect = doc.createElement("connect"); eConnect.setAttribute("client", pConnectItem->client_name); eConnect.setAttribute("port", pConnectItem->port_name); ePort.appendChild(eConnect); } eClient.appendChild(ePort); } eSession.appendChild(eClient); } // Finally, save to external file. QFile file(sFilename); if (!file.open(QIODevice::WriteOnly | QIODevice::Truncate)) return false; QTextStream ts(&file); ts << doc.toString() << endl; file.close(); return true; } // Infra-client list accessor (read-only) qjackctlSession::InfraClientList& qjackctlSession::infra_clients (void) { return m_infra_clients; } // Load all infra-clients from configuration file. void qjackctlSession::loadInfraClients ( QSettings& settings ) { clearInfraClients(); settings.beginGroup("/InfraClients"); const QStringList& keys = settings.childKeys(); QStringListIterator iter(keys); while (iter.hasNext()) { const QString& sKey = iter.next(); const QString& sValue = settings.value(sKey).toString(); if (!sValue.isEmpty()) { InfraClientItem *pInfraClientItem = new InfraClientItem; pInfraClientItem->client_name = sKey; pInfraClientItem->client_command = sValue; m_infra_clients.insert(sKey, pInfraClientItem); } } settings.endGroup(); } // Save all infra-clients to configuration file. void qjackctlSession::saveInfraClients ( QSettings& settings ) { settings.beginGroup("/InfraClients"); settings.remove(QString()); // Remove all current keys. InfraClientList::ConstIterator iter = m_infra_clients.constBegin(); const InfraClientList::ConstIterator& iter_end = m_infra_clients.constEnd(); for ( ; iter != iter_end; ++iter) { const QString& sKey = iter.key(); const QString& sValue = iter.value()->client_command; if (!sValue.isEmpty()) settings.setValue(sKey, sValue); } settings.endGroup(); } // Clear infra-client table. void qjackctlSession::clearInfraClients (void) { qDeleteAll(m_infra_clients); m_infra_clients.clear(); } // Check whether a given JACK client name exists... bool qjackctlSession::isJackClient ( const QString& sClientName ) const { const QByteArray aClientName = sClientName.toUtf8(); #ifdef CONFIG_JACK_SESSION if (::jack_get_uuid_for_client_name) { qjackctlMainForm *pMainForm = qjackctlMainForm::getInstance(); if (pMainForm == NULL) return false; jack_client_t *pJackClient = pMainForm->jackClient(); if (pJackClient == NULL) return false; const char *client_uuid = ::jack_get_uuid_for_client_name( pJackClient, aClientName.constData()); if (client_uuid) { ::jack_free((void *) client_uuid); return true; } return false; } #endif jack_client_t *pJackClient = ::jack_client_open(aClientName.constData(), jack_options_t(JackNoStartServer | JackUseExactName), NULL); if (pJackClient) { ::jack_client_close(pJackClient); return true; } return false; } // end of qjackctlSession.cpp qjackctl-0.4.2/src/PaxHeaders.14935/qjackctlJackConnect.cpp0000644000000000000000000000013212700760152020245 xustar0030 mtime=1459871850.618907789 30 atime=1459871850.618907789 30 ctime=1459871850.618907789 qjackctl-0.4.2/src/qjackctlJackConnect.cpp0000644000175000001440000004144512700760152021021 0ustar00rncbcusers00000000000000// qjackctlJackConnect.cpp // /**************************************************************************** Copyright (C) 2003-2015, rncbc aka Rui Nuno Capela. All rights reserved. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. *****************************************************************************/ #include "qjackctlJackConnect.h" #include "qjackctlMainForm.h" #include #ifdef CONFIG_JACK_METADATA #include #include static QString prettyName ( jack_uuid_t uuid ) { QString sPrettyName; char *pszValue = NULL; char *pszType = NULL; if (::jack_get_property(uuid, JACK_METADATA_PRETTY_NAME, &pszValue, &pszType) == 0) { if (pszValue) { sPrettyName = QString::fromUtf8(pszValue); ::jack_free(pszValue); } if (pszType) ::jack_free(pszType); } return sPrettyName; } static void setPrettyName ( jack_client_t *pJackClient, jack_uuid_t uuid, const QString& sPrettyName ) { const char *pszValue = sPrettyName.toUtf8().constData(); ::jack_set_property(pJackClient, uuid, JACK_METADATA_PRETTY_NAME, pszValue, NULL); } static void removePrettyName ( jack_client_t *pJackClient, jack_uuid_t uuid ) { ::jack_remove_property(pJackClient, uuid, JACK_METADATA_PRETTY_NAME); } #endif //---------------------------------------------------------------------- // class qjackctlJackPort -- Jack port list item. // // Constructor. qjackctlJackPort::qjackctlJackPort ( qjackctlJackClient *pClient, jack_port_t *pJackPort ) : qjackctlPortItem(pClient) { m_pJackPort = pJackPort; qjackctlJackConnect *pJackConnect = static_cast ( ((pClient->clientList())->listView())->binding()); if (pJackConnect) { const unsigned long ulPortFlags = jack_port_flags(m_pJackPort); if (ulPortFlags & JackPortIsInput) { if (ulPortFlags & JackPortIsTerminal) { QTreeWidgetItem::setIcon(0, QIcon(pJackConnect->pixmap( ulPortFlags & JackPortIsPhysical ? QJACKCTL_JACK_PORTPTI : QJACKCTL_JACK_PORTLTI))); } else { QTreeWidgetItem::setIcon(0, QIcon(pJackConnect->pixmap( ulPortFlags & JackPortIsPhysical ? QJACKCTL_JACK_PORTPNI : QJACKCTL_JACK_PORTLNI))); } } else if (ulPortFlags & JackPortIsOutput) { if (ulPortFlags & JackPortIsTerminal) { QTreeWidgetItem::setIcon(0, QIcon(pJackConnect->pixmap( ulPortFlags & JackPortIsPhysical ? QJACKCTL_JACK_PORTPTO : QJACKCTL_JACK_PORTLTO))); } else { QTreeWidgetItem::setIcon(0, QIcon(pJackConnect->pixmap( ulPortFlags & JackPortIsPhysical ? QJACKCTL_JACK_PORTPNO : QJACKCTL_JACK_PORTLNO))); } } } } // Default destructor. qjackctlJackPort::~qjackctlJackPort (void) { } // Jack port handles accessors. jack_port_t *qjackctlJackPort::jackPort (void) const { return m_pJackPort; } // Pretty/display name method (virtual override). void qjackctlJackPort::updatePortName ( bool bRename ) { #ifdef CONFIG_JACK_METADATA jack_client_t *pJackClient = NULL; qjackctlMainForm *pMainForm = qjackctlMainForm::getInstance(); if (pMainForm) pJackClient = pMainForm->jackClient(); if (pJackClient && qjackctlJackClientList::isJackClientPortMetadata()) { bool bRenameEnabled = false; QString sPortNameEx = portNameAlias(&bRenameEnabled); const QString& sPortName = portName(); jack_uuid_t port_uuid = ::jack_port_uuid(m_pJackPort); const QString& sPrettyName = prettyName(port_uuid); if (sPortNameEx != sPortName && sPortNameEx != sPrettyName) { if (sPrettyName.isEmpty() || bRename) { setPrettyName(pJackClient, port_uuid, sPortNameEx); } else { sPortNameEx = sPrettyName; setPortNameAlias(sPortNameEx); } } else if (sPortNameEx == sPortName && !sPrettyName.isEmpty() && bRename) { removePrettyName(pJackClient, port_uuid); } setPortText(sPortNameEx, bRenameEnabled); } else #endif qjackctlPortItem::updatePortName(bRename); } // Tooltip text builder (virtual override). QString qjackctlJackPort::tooltip (void) const { jack_latency_range_t latency_range; jack_port_get_latency_range(m_pJackPort, client()->isReadable() ? JackCaptureLatency : JackPlaybackLatency, &latency_range); QString sLatency = QString::number(latency_range.min); if (latency_range.max > latency_range.min) sLatency += '-' + QString::number(latency_range.max); return QObject::tr("%1 (%2 frames)").arg(portName()).arg(sLatency); } //---------------------------------------------------------------------- // class qjackctlJackClient -- Jack client list item. // // Constructor. qjackctlJackClient::qjackctlJackClient ( qjackctlJackClientList *pClientList ) : qjackctlClientItem(pClientList) { qjackctlJackConnect *pJackConnect = static_cast ( (pClientList->listView())->binding()); if (pJackConnect) { if (pClientList->isReadable()) { QTreeWidgetItem::setIcon(0, QIcon(pJackConnect->pixmap(QJACKCTL_JACK_CLIENTO))); } else { QTreeWidgetItem::setIcon(0, QIcon(pJackConnect->pixmap(QJACKCTL_JACK_CLIENTI))); } } } // Default destructor. qjackctlJackClient::~qjackctlJackClient (void) { } // Jack port lookup. qjackctlJackPort *qjackctlJackClient::findJackPort ( jack_port_t *pJackPort ) { QListIterator iter(ports()); while (iter.hasNext()) { qjackctlJackPort *pPort = static_cast (iter.next()); if (pPort && pPort->jackPort() == pJackPort) return pPort; } return NULL; } // Pretty/display name method (virtual override). void qjackctlJackClient::updateClientName ( bool bRename ) { #ifdef CONFIG_JACK_METADATA jack_client_t *pJackClient = NULL; qjackctlMainForm *pMainForm = qjackctlMainForm::getInstance(); if (pMainForm) pJackClient = pMainForm->jackClient(); if (pJackClient && qjackctlJackClientList::isJackClientPortMetadata()) { bool bRenameEnabled = false; QString sClientNameEx = clientNameAlias(&bRenameEnabled); const QString& sClientName = clientName(); const char *pszClientName = sClientName.toUtf8().constData(); const char *pszClientUuid = ::jack_get_uuid_for_client_name(pJackClient, pszClientName); if (pszClientUuid) { jack_uuid_t client_uuid = 0; ::jack_uuid_parse(pszClientUuid, &client_uuid); const QString& sPrettyName = prettyName(client_uuid); if (sClientNameEx != sClientName && sClientNameEx != sPrettyName) { if (sPrettyName.isEmpty() || bRename) { setPrettyName(pJackClient, client_uuid, sClientNameEx); } else { sClientNameEx = sPrettyName; setClientNameAlias(sClientNameEx); } } else if (sClientNameEx == sClientName && !sPrettyName.isEmpty() && bRename) { removePrettyName(pJackClient, client_uuid); } ::jack_free((void *) pszClientUuid); } setClientText(sClientNameEx, bRenameEnabled); } else #endif qjackctlClientItem::updateClientName(bRename); } //---------------------------------------------------------------------- // qjackctlJackClientList -- Jack client list. // // Constructor. qjackctlJackClientList::qjackctlJackClientList ( qjackctlClientListView *pListView, bool bReadable ) : qjackctlClientList(pListView, bReadable) { } // Default destructor. qjackctlJackClientList::~qjackctlJackClientList (void) { } // Jack port lookup. qjackctlJackPort *qjackctlJackClientList::findJackClientPort ( jack_port_t *pJackPort ) { QListIterator iter(clients()); while (iter.hasNext()) { qjackctlJackClient *pClient = static_cast (iter.next()); if (pClient) { qjackctlJackPort *pPort = pClient->findJackPort(pJackPort); if (pPort) return pPort; } } return NULL; } // Client:port refreshner. int qjackctlJackClientList::updateClientPorts (void) { qjackctlMainForm *pMainForm = qjackctlMainForm::getInstance(); if (pMainForm == NULL) return 0; jack_client_t *pJackClient = pMainForm->jackClient(); if (pJackClient == NULL) return 0; qjackctlJackConnect *pJackConnect = static_cast (listView()->binding()); if (pJackConnect == NULL) return 0; const char *pszJackType = JACK_DEFAULT_AUDIO_TYPE; #ifdef CONFIG_JACK_MIDI if (pJackConnect->jackType() == QJACKCTL_JACK_MIDI) pszJackType = JACK_DEFAULT_MIDI_TYPE; #endif char *aliases[2]; if (g_iJackClientPortAlias > 0) { const unsigned short alias_size = jack_port_name_size() + 1; aliases[0] = new char [alias_size]; aliases[1] = new char [alias_size]; } int iDirtyCount = 0; markClientPorts(0); const char **ppszClientPorts = jack_get_ports(pJackClient, 0, pszJackType, isReadable() ? JackPortIsOutput : JackPortIsInput); if (ppszClientPorts) { int iClientPort = 0; while (ppszClientPorts[iClientPort]) { QString sClientPort = QString::fromUtf8(ppszClientPorts[iClientPort]); qjackctlJackClient *pClient = 0; qjackctlJackPort *pPort = 0; jack_port_t *pJackPort = jack_port_by_name(pJackClient, ppszClientPorts[iClientPort]); #ifdef CONFIG_JACK_PORT_ALIASES if (g_iJackClientPortAlias > 0 && jack_port_get_aliases(pJackPort, aliases) >= g_iJackClientPortAlias) sClientPort = QString::fromUtf8(aliases[g_iJackClientPortAlias - 1]); #endif int iColon = sClientPort.indexOf(':'); if (pJackPort && iColon >= 0) { QString sClientName = sClientPort.left(iColon); QString sPortName = sClientPort.right(sClientPort.length() - iColon - 1); pClient = static_cast (findClient(sClientName)); if (pClient) pPort = static_cast (pClient->findPort(sPortName)); if (pClient == 0) { pClient = new qjackctlJackClient(this); pClient->setClientName(sClientName); iDirtyCount++; } if (pClient && pPort == 0) { pPort = new qjackctlJackPort(pClient, pJackPort); pPort->setPortName(sPortName); iDirtyCount++; } if (pPort) pPort->markClientPort(1); } iClientPort++; } ::free(ppszClientPorts); } iDirtyCount += cleanClientPorts(0); if (g_iJackClientPortAlias > 0) { delete [] aliases[0]; delete [] aliases[1]; } return iDirtyCount; } // Jack client port aliases mode. int qjackctlJackClientList::g_iJackClientPortAlias = 0; void qjackctlJackClientList::setJackClientPortAlias ( int iJackClientPortAlias ) { g_iJackClientPortAlias = iJackClientPortAlias; if (g_iJackClientPortAlias > 0) g_bJackClientPortMetadata = false; } int qjackctlJackClientList::jackClientPortAlias (void) { return g_iJackClientPortAlias; } // Jack client port pretty-names (metadata) mode. bool qjackctlJackClientList::g_bJackClientPortMetadata = false; void qjackctlJackClientList::setJackClientPortMetadata ( bool bJackClientPortMetadata ) { g_bJackClientPortMetadata = bJackClientPortMetadata; if (g_bJackClientPortMetadata) g_iJackClientPortAlias = 0; } bool qjackctlJackClientList::isJackClientPortMetadata (void) { return g_bJackClientPortMetadata; } //---------------------------------------------------------------------- // qjackctlJackConnect -- Output-to-Input client/ports connection object. // // Constructor. qjackctlJackConnect::qjackctlJackConnect ( qjackctlConnectView *pConnectView, int iJackType ) : qjackctlConnect(pConnectView) { m_iJackType = iJackType; createIconPixmaps(); setOClientList(new qjackctlJackClientList( connectView()->OListView(), true)); setIClientList(new qjackctlJackClientList( connectView()->IListView(), false)); } // Default destructor. qjackctlJackConnect::~qjackctlJackConnect (void) { deleteIconPixmaps(); } // Connection type accessors. int qjackctlJackConnect::jackType (void) const { return m_iJackType; } // Local pixmap-set janitor methods. void qjackctlJackConnect::createIconPixmaps (void) { switch (m_iJackType) { case QJACKCTL_JACK_MIDI: m_apPixmaps[QJACKCTL_JACK_CLIENTI] = createIconPixmap("mclienti"); m_apPixmaps[QJACKCTL_JACK_CLIENTO] = createIconPixmap("mcliento"); m_apPixmaps[QJACKCTL_JACK_PORTPTI] = createIconPixmap("mporti"); m_apPixmaps[QJACKCTL_JACK_PORTPTO] = createIconPixmap("mporto"); m_apPixmaps[QJACKCTL_JACK_PORTPNI] = createIconPixmap("mporti"); m_apPixmaps[QJACKCTL_JACK_PORTPNO] = createIconPixmap("mporto"); m_apPixmaps[QJACKCTL_JACK_PORTLTI] = createIconPixmap("mporti"); m_apPixmaps[QJACKCTL_JACK_PORTLTO] = createIconPixmap("mporto"); m_apPixmaps[QJACKCTL_JACK_PORTLNI] = createIconPixmap("mporti"); m_apPixmaps[QJACKCTL_JACK_PORTLNO] = createIconPixmap("mporto"); break; case QJACKCTL_JACK_AUDIO: default: m_apPixmaps[QJACKCTL_JACK_CLIENTI] = createIconPixmap("aclienti"); m_apPixmaps[QJACKCTL_JACK_CLIENTO] = createIconPixmap("acliento"); m_apPixmaps[QJACKCTL_JACK_PORTPTI] = createIconPixmap("aportpti"); m_apPixmaps[QJACKCTL_JACK_PORTPTO] = createIconPixmap("aportpto"); m_apPixmaps[QJACKCTL_JACK_PORTPNI] = createIconPixmap("aportpni"); m_apPixmaps[QJACKCTL_JACK_PORTPNO] = createIconPixmap("aportpno"); m_apPixmaps[QJACKCTL_JACK_PORTLTI] = createIconPixmap("aportlti"); m_apPixmaps[QJACKCTL_JACK_PORTLTO] = createIconPixmap("aportlto"); m_apPixmaps[QJACKCTL_JACK_PORTLNI] = createIconPixmap("aportlni"); m_apPixmaps[QJACKCTL_JACK_PORTLNO] = createIconPixmap("aportlno"); break; } } void qjackctlJackConnect::deleteIconPixmaps (void) { for (int i = 0; i < QJACKCTL_JACK_PIXMAPS; i++) { if (m_apPixmaps[i]) delete m_apPixmaps[i]; m_apPixmaps[i] = NULL; } } // Common pixmap accessor (static). const QPixmap& qjackctlJackConnect::pixmap ( int iPixmap ) const { return *m_apPixmaps[iPixmap]; } // Connection primitive. bool qjackctlJackConnect::connectPorts ( qjackctlPortItem *pOPort, qjackctlPortItem *pIPort ) { qjackctlMainForm *pMainForm = qjackctlMainForm::getInstance(); if (pMainForm == NULL) return false; jack_client_t *pJackClient = pMainForm->jackClient(); if (pJackClient == NULL) return false; qjackctlJackPort *pOJack = static_cast (pOPort); qjackctlJackPort *pIJack = static_cast (pIPort); return (jack_connect(pJackClient, pOJack->clientPortName().toUtf8().constData(), pIJack->clientPortName().toUtf8().constData()) == 0); } // Disconnection primitive. bool qjackctlJackConnect::disconnectPorts ( qjackctlPortItem *pOPort, qjackctlPortItem *pIPort ) { qjackctlMainForm *pMainForm = qjackctlMainForm::getInstance(); if (pMainForm == NULL) return false; jack_client_t *pJackClient = pMainForm->jackClient(); if (pJackClient == NULL) return false; qjackctlJackPort *pOJack = static_cast (pOPort); qjackctlJackPort *pIJack = static_cast (pIPort); return (jack_disconnect(pJackClient, pOJack->clientPortName().toUtf8().constData(), pIJack->clientPortName().toUtf8().constData()) == 0); } // Update port connection references. void qjackctlJackConnect::updateConnections (void) { qjackctlMainForm *pMainForm = qjackctlMainForm::getInstance(); if (pMainForm == NULL) return; jack_client_t *pJackClient = pMainForm->jackClient(); if (pJackClient == NULL) return; qjackctlJackClientList *pIClientList = static_cast (IClientList()); if (pIClientList == NULL) return; // For each output client item... QListIterator oclient(OClientList()->clients()); while (oclient.hasNext()) { qjackctlClientItem *pOClient = oclient.next(); // For each output port item... QListIterator oport(pOClient->ports()); while (oport.hasNext()) { qjackctlPortItem *pOPort = oport.next(); // Are there already any connections? if (pOPort->connects().count() > 0) continue; // Hava a proper type cast. qjackctlJackPort *pOJack = static_cast (pOPort); // Get port connections... const char **ppszClientPorts = jack_port_get_all_connections( pJackClient, pOJack->jackPort()); if (ppszClientPorts) { // Now, for each input client port... int iClientPort = 0; while (ppszClientPorts[iClientPort]) { jack_port_t *pJackPort = jack_port_by_name( pJackClient, ppszClientPorts[iClientPort]); if (pJackPort) { qjackctlPortItem *pIPort = pIClientList->findJackClientPort(pJackPort); if (pIPort) { pOPort->addConnect(pIPort); pIPort->addConnect(pOPort); } } iClientPort++; } ::free(ppszClientPorts); } } } } // Update icon size implementation. void qjackctlJackConnect::updateIconPixmaps (void) { deleteIconPixmaps(); createIconPixmaps(); } // end of qjackctlJackConnect.cpp qjackctl-0.4.2/src/PaxHeaders.14935/qjackctlMainForm.ui0000644000000000000000000000013212700760152017426 xustar0030 mtime=1459871850.621909288 30 atime=1459871850.619908288 30 ctime=1459871850.621909288 qjackctl-0.4.2/src/qjackctlMainForm.ui0000644000175000001440000005425212700760152020202 0ustar00rncbcusers00000000000000 rncbc aka Rui Nuno Capela JACK Audio Connection Kit - Qt GUI Interface. Copyright (C) 2003-2015, rncbc aka Rui Nuno Capela. All rights reserved. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. qjackctlMainForm 0 0 300 100 1 1 0 0 QjackCtl :/images/qjackctl.png 4 4 28 28 32767 28 Qt::TabFocus Start the JACK server &Start :/images/start1.png false Qt::ToolButtonTextBesideIcon 28 28 32767 28 Qt::TabFocus Stop the JACK server S&top :/images/stop1.png Qt::ToolButtonTextBesideIcon 7 7 0 0 260 80 true QFrame::Panel QFrame::Sunken 2 0 50 0 8 JACK server state Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter false 2 20 0 8 JACK server mode Qt::AlignCenter false 40 0 8 DSP Load Qt::AlignCenter false 50 0 8 Sample rate Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter false 30 0 8 XRUN Count (notifications) Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter false 2 130 0 14 75 true Time display Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter false 50 0 8 Transport state Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter false 2 30 0 8 Transport BPM Qt::AlignCenter false 80 0 8 75 true Transport time Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter false 28 28 32767 28 Qt::TabFocus Quit processing and exit &Quit :/images/quit1.png Qt::ToolButtonTextBesideIcon 28 28 32767 28 Qt::TabFocus Show/hide the session management window S&ession :/images/session1.png true Qt::ToolButtonTextBesideIcon 28 28 32767 28 Qt::TabFocus Show/hide the messages log/status window &Messages :/images/messagesstatus1.png true Qt::ToolButtonTextBesideIcon 28 28 32767 28 Qt::TabFocus Show settings and options dialog Set&up... :/images/setup1.png true Qt::ToolButtonTextBesideIcon 28 28 32767 28 Qt::TabFocus Show/hide the actual connections patchbay window &Connect :/images/connections1.png true Qt::ToolButtonTextBesideIcon 28 28 32767 28 Qt::TabFocus Show/hide the patchbay editor window &Patchbay :/images/patchbay1.png true Qt::ToolButtonTextBesideIcon 28 28 48 28 Qt::TabFocus Rewind transport &Rewind :/images/rewind1.png 28 28 48 28 Qt::TabFocus Backward transport &Backward :/images/backward1.png true 28 28 48 28 Qt::TabFocus Start transport rolling &Play :/images/play1.png true 1 1 0 0 28 28 48 28 Qt::TabFocus Stop transport rolling Pa&use :/images/pause1.png 28 28 48 28 Qt::TabFocus Forward transport &Forward :/images/forward1.png true 28 28 32767 28 Qt::TabFocus Show information about this application Ab&out... :/images/about1.png Qt::ToolButtonTextBesideIcon StartToolButton StopToolButton QuitToolButton MessagesStatusToolButton SessionToolButton SetupToolButton ConnectionsToolButton PatchbayToolButton RewindToolButton BackwardToolButton PlayToolButton PauseToolButton ForwardToolButton AboutToolButton qjackctl-0.4.2/src/PaxHeaders.14935/qjackctlConnectionsForm.h0000644000000000000000000000013212700760152020636 xustar0030 mtime=1459871850.617907288 30 atime=1459871850.617907288 30 ctime=1459871850.617907288 qjackctl-0.4.2/src/qjackctlConnectionsForm.h0000644000175000001440000000735212700760152021411 0ustar00rncbcusers00000000000000// qjackctlConnectionsForm.h // /**************************************************************************** Copyright (C) 2003-2014, rncbc aka Rui Nuno Capela. All rights reserved. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. *****************************************************************************/ #ifndef __qjackctlConnectionsForm_h #define __qjackctlConnectionsForm_h #include "ui_qjackctlConnectionsForm.h" #include "qjackctlJackConnect.h" #include "qjackctlAlsaConnect.h" // Forward declarations. class qjackctlSetup; //---------------------------------------------------------------------------- // qjackctlConnectionsForm -- UI wrapper form. class qjackctlConnectionsForm : public QWidget { Q_OBJECT public: // Constructor. qjackctlConnectionsForm(QWidget *pParent = 0, Qt::WindowFlags wflags = 0); // Destructor. ~qjackctlConnectionsForm(); void setup(qjackctlSetup *pSetup); qjackctlConnectView *audioConnectView() const; qjackctlConnectView *midiConnectView() const; qjackctlConnectView *alsaConnectView() const; bool queryClose(); enum TabPage { AudioTab = 0, MidiTab = 1, AlsaTab = 2 }; void setTabPage(int iTabPage); int tabPage() const; QFont connectionsFont() const; void setConnectionsFont(const QFont& font); void setConnectionsIconSize(int iIconSize); bool isAudioConnected() const; bool isMidiConnected() const; bool isAlsaConnected() const; void refreshAudio(bool bEnabled, bool bClear = false); void refreshMidi(bool bEnabled, bool bClear = false); void refreshAlsa(bool bEnabled, bool bClear = false); void stabilizeAudio(bool bEnabled, bool bClear = false); void stabilizeMidi(bool bEnabled, bool bClear = false); void stabilizeAlsa(bool bEnabled, bool bClear = false); void setupAliases(qjackctlSetup *pSetup); void updateAliases(); bool loadAliases(); bool saveAliases(); public slots: void audioConnectSelected(); void audioDisconnectSelected(); void audioDisconnectAll(); void audioExpandAll(); void audioRefreshClear(); void audioRefresh(); void audioStabilize(); void midiConnectSelected(); void midiDisconnectSelected(); void midiDisconnectAll(); void midiExpandAll(); void midiRefreshClear(); void midiRefresh(); void midiStabilize(); void alsaConnectSelected(); void alsaDisconnectSelected(); void alsaDisconnectAll(); void alsaExpandAll(); void alsaRefreshClear(); void alsaRefresh(); void alsaStabilize(); protected slots: void audioDisconnecting(qjackctlPortItem *, qjackctlPortItem *); void midiDisconnecting(qjackctlPortItem *, qjackctlPortItem *); void alsaDisconnecting(qjackctlPortItem *, qjackctlPortItem *); protected: void showEvent(QShowEvent *); void hideEvent(QHideEvent *); void closeEvent(QCloseEvent *); void keyPressEvent(QKeyEvent *); private: // The Qt-designer UI struct... Ui::qjackctlConnectionsForm m_ui; // Instance variables. qjackctlJackConnect *m_pAudioConnect; qjackctlJackConnect *m_pMidiConnect; qjackctlAlsaConnect *m_pAlsaConnect; qjackctlSetup *m_pSetup; QString m_sPreset; }; #endif // __qjackctlConnectionsForm_h // end of qjackctlConnectionsForm.h qjackctl-0.4.2/src/PaxHeaders.14935/qjackctl.cpp0000644000000000000000000000013212700760152016142 xustar0030 mtime=1459871850.616906788 30 atime=1459871850.615906288 30 ctime=1459871850.616906788 qjackctl-0.4.2/src/qjackctl.cpp0000644000175000001440000003325412700760152016715 0ustar00rncbcusers00000000000000// qjackctl.cpp // /**************************************************************************** Copyright (C) 2003-2015, rncbc aka Rui Nuno Capela. All rights reserved. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. *****************************************************************************/ #include "qjackctlAbout.h" #include "qjackctlSetup.h" #include "qjackctlMainForm.h" #include #include #include #include #include #if QT_VERSION < 0x040500 namespace Qt { const WindowFlags WindowCloseButtonHint = WindowFlags(0x08000000); } #endif #define CONFIG_QUOTE1(x) #x #define CONFIG_QUOTED(x) CONFIG_QUOTE1(x) #if defined(DATADIR) #define CONFIG_DATADIR CONFIG_QUOTED(DATADIR) #else #define CONFIG_DATADIR CONFIG_PREFIX "/share" #endif //------------------------------------------------------------------------- // Singleton application instance stuff (Qt/X11 only atm.) // #if QT_VERSION < 0x050000 #if defined(Q_WS_X11) #define CONFIG_X11 #endif #else #if defined(QT_X11EXTRAS_LIB) #define CONFIG_X11 #endif #endif #ifdef CONFIG_X11 #ifdef CONFIG_XUNIQUE #include /* for gethostname() */ #include #include #include #define QJACKCTL_XUNIQUE "qjackctlApplication" #if QT_VERSION >= 0x050100 #include #include #include class qjackctlApplication; class qjackctlXcbEventFilter : public QAbstractNativeEventFilter { public: // Constructor. qjackctlXcbEventFilter(qjackctlApplication *pApp) : QAbstractNativeEventFilter(), m_pApp(pApp) {} // XCB event filter (virtual processor). bool nativeEventFilter(const QByteArray& eventType, void *message, long *); private: // Instance variable. qjackctlApplication *m_pApp; }; #endif #endif // CONFIG_XUNIQUE #endif // CONFIG_X11 class qjackctlApplication : public QApplication { public: // Constructor. qjackctlApplication(int& argc, char **argv) : QApplication(argc, argv), m_pQtTranslator(0), m_pMyTranslator(0), m_pWidget(0) { // Load translation support. QLocale loc; if (loc.language() != QLocale::C) { // Try own Qt translation... m_pQtTranslator = new QTranslator(this); QString sLocName = "qt_" + loc.name(); QString sLocPath = QLibraryInfo::location(QLibraryInfo::TranslationsPath); if (m_pQtTranslator->load(sLocName, sLocPath)) { QApplication::installTranslator(m_pQtTranslator); } else { delete m_pQtTranslator; m_pQtTranslator = 0; #ifdef CONFIG_DEBUG qWarning("Warning: no translation found for '%s' locale: %s/%s.qm", loc.name().toUtf8().constData(), sLocPath.toUtf8().constData(), sLocName.toUtf8().constData()); #endif } // Try own application translation... m_pMyTranslator = new QTranslator(this); sLocName = "qjackctl_" + loc.name(); if (m_pMyTranslator->load(sLocName, sLocPath)) { QApplication::installTranslator(m_pMyTranslator); } else { sLocPath = CONFIG_DATADIR "/qjackctl/translations"; if (m_pMyTranslator->load(sLocName, sLocPath)) { QApplication::installTranslator(m_pMyTranslator); } else { delete m_pMyTranslator; m_pMyTranslator = 0; #ifdef CONFIG_DEBUG qWarning("Warning: no translation found for '%s' locale: %s/%s.qm", loc.name().toUtf8().constData(), sLocPath.toUtf8().constData(), sLocName.toUtf8().constData()); #endif } } } #ifdef CONFIG_X11 #ifdef CONFIG_XUNIQUE m_pDisplay = NULL; m_wOwner = None; #if QT_VERSION >= 0x050100 m_pXcbEventFilter = new qjackctlXcbEventFilter(this); installNativeEventFilter(m_pXcbEventFilter); #endif #endif // CONFIG_XUNIQUE #endif // CONFIG_X11 } // Destructor. ~qjackctlApplication() { #ifdef CONFIG_X11 #ifdef CONFIG_XUNIQUE #if QT_VERSION >= 0x050100 removeNativeEventFilter(m_pXcbEventFilter); delete m_pXcbEventFilter; #endif #endif // CONFIG_XUNIQUE #endif // CONFIG_X11 if (m_pMyTranslator) delete m_pMyTranslator; if (m_pQtTranslator) delete m_pQtTranslator; } // Main application widget accessors. void setMainWidget(QWidget *pWidget) { m_pWidget = pWidget; #ifdef CONFIG_X11 #ifdef CONFIG_XUNIQUE m_wOwner = m_pWidget->winId(); if (m_pDisplay && m_wOwner) { XGrabServer(m_pDisplay); XSetSelectionOwner(m_pDisplay, m_aUnique, m_wOwner, CurrentTime); XUngrabServer(m_pDisplay); } #endif // CONFIG_XUNIQUE #endif // CONFIG_X11 } QWidget *mainWidget() const { return m_pWidget; } // Check if another instance is running, // and raise its proper main widget... bool setup(const QString& sServerName) { #ifdef CONFIG_X11 #ifdef CONFIG_XUNIQUE m_pDisplay = QX11Info::display(); QString sUnique = QJACKCTL_XUNIQUE; if (sServerName.isEmpty()) { const char *pszServerName = ::getenv("JACK_DEFAULT_SERVER"); if (pszServerName) { sUnique += '_'; sUnique += pszServerName; } } else { sUnique += '_'; sUnique += sServerName; } char szHostName[255]; if (::gethostname(szHostName, sizeof(szHostName)) == 0) { sUnique += '@'; sUnique += szHostName; } m_aUnique = XInternAtom(m_pDisplay, sUnique.toUtf8().constData(), false); XGrabServer(m_pDisplay); m_wOwner = XGetSelectionOwner(m_pDisplay, m_aUnique); XUngrabServer(m_pDisplay); if (m_wOwner != None) { // First, notify any freedesktop.org WM // that we're about to show the main widget... Screen *pScreen = XDefaultScreenOfDisplay(m_pDisplay); int iScreen = XScreenNumberOfScreen(pScreen); XEvent ev; memset(&ev, 0, sizeof(ev)); ev.xclient.type = ClientMessage; ev.xclient.display = m_pDisplay; ev.xclient.window = m_wOwner; ev.xclient.message_type = XInternAtom(m_pDisplay, "_NET_ACTIVE_WINDOW", false); ev.xclient.format = 32; ev.xclient.data.l[0] = 0; // Source indication. ev.xclient.data.l[1] = 0; // Timestamp. ev.xclient.data.l[2] = 0; // Requestor's currently active window (none) ev.xclient.data.l[3] = 0; ev.xclient.data.l[4] = 0; XSelectInput(m_pDisplay, m_wOwner, StructureNotifyMask); XSendEvent(m_pDisplay, RootWindow(m_pDisplay, iScreen), false, (SubstructureNotifyMask | SubstructureRedirectMask), &ev); XSync(m_pDisplay, false); XRaiseWindow(m_pDisplay, m_wOwner); // And then, let it get caught on destination // by QApplication::native/x11EventFilter... const QByteArray value = QJACKCTL_XUNIQUE; XChangeProperty( m_pDisplay, m_wOwner, m_aUnique, m_aUnique, 8, PropModeReplace, (unsigned char *) value.data(), value.length()); // Done. return true; } #endif // CONFIG_XUNIQUE #endif // CONFIG_X11 return false; } #ifdef CONFIG_X11 #ifdef CONFIG_XUNIQUE void x11PropertyNotify(Window w) { if (m_pWidget && m_wOwner == w) { // Always check whether our property-flag is still around... Atom aType; int iFormat = 0; unsigned long iItems = 0; unsigned long iAfter = 0; unsigned char *pData = 0; if (XGetWindowProperty( m_pDisplay, m_wOwner, m_aUnique, 0, 1024, false, m_aUnique, &aType, &iFormat, &iItems, &iAfter, &pData) == Success && aType == m_aUnique && iItems > 0 && iAfter == 0) { // Avoid repeating it-self... XDeleteProperty(m_pDisplay, m_wOwner, m_aUnique); // Just make it always shows up fine... m_pWidget->show(); m_pWidget->raise(); m_pWidget->activateWindow(); // FIXME: Do our best speciality, although it should be // done iif configuration says so, we'll do it anyway! qjackctlMainForm *pMainForm = qjackctlMainForm::getInstance(); if (pMainForm) pMainForm->startJack(); } // Free any left-overs... if (iItems > 0 && pData) XFree(pData); } } #if QT_VERSION < 0x050000 bool x11EventFilter(XEvent *pEv) { if (pEv->type == PropertyNotify && pEv->xproperty.state == PropertyNewValue) x11PropertyNotify(pEv->xproperty.window); return QApplication::x11EventFilter(pEv); } #endif #endif // CONFIG_XUNIQUE #endif // CONFIG_X11 private: // Translation support. QTranslator *m_pQtTranslator; QTranslator *m_pMyTranslator; // Instance variables. QWidget *m_pWidget; #ifdef CONFIG_X11 #ifdef CONFIG_XUNIQUE Display *m_pDisplay; Atom m_aUnique; Window m_wOwner; #if QT_VERSION >= 0x050100 qjackctlXcbEventFilter *m_pXcbEventFilter; #endif #endif // CONFIG_XUNIQUE #endif // CONFIG_X11 }; #ifdef CONFIG_X11 #ifdef CONFIG_XUNIQUE #if QT_VERSION >= 0x050100 // XCB Event filter (virtual processor). bool qjackctlXcbEventFilter::nativeEventFilter ( const QByteArray& eventType, void *message, long * ) { if (eventType == "xcb_generic_event_t") { xcb_property_notify_event_t *pEv = static_cast (message); if ((pEv->response_type & ~0x80) == XCB_PROPERTY_NOTIFY && pEv->state == XCB_PROPERTY_NEW_VALUE) m_pApp->x11PropertyNotify(pEv->window); } return false; } #endif #endif // CONFIG_XUNIQUE #endif // CONFIG_X11 //------------------------------------------------------------------------- // stacktrace - Signal crash handler. // #ifdef CONFIG_STACKTRACE #if defined(__GNUC__) && defined(Q_OS_LINUX) #include #include #include #include #include void stacktrace ( int signo ) { pid_t pid; int rc; int status = 0; char cmd[80]; // Reinstall default handler; prevent race conditions... signal(signo, SIG_DFL); static const char *shell = "/bin/sh"; static const char *format = "gdb -q --batch --pid=%d" " --eval-command='thread apply all bt'"; snprintf(cmd, sizeof(cmd), format, (int) getpid()); pid = fork(); // Fork failure! if (pid < 0) return; // Fork child... if (pid == 0) { execl(shell, shell, "-c", cmd, NULL); _exit(1); return; } // Parent here: wait for child to terminate... do { rc = waitpid(pid, &status, 0); } while ((rc < 0) && (errno == EINTR)); // Dispatch any logging, if any... QApplication::processEvents(QEventLoop::AllEvents, 3000); // Make sure everyone terminates... kill(pid, SIGTERM); _exit(1); } #endif #endif //------------------------------------------------------------------------- // main - The main program trunk. // int main ( int argc, char **argv ) { Q_INIT_RESOURCE(qjackctl); #ifdef CONFIG_STACKTRACE #if defined(__GNUC__) && defined(Q_OS_LINUX) signal(SIGILL, stacktrace); signal(SIGFPE, stacktrace); signal(SIGSEGV, stacktrace); signal(SIGABRT, stacktrace); signal(SIGBUS, stacktrace); #endif #endif qjackctlApplication app(argc, argv); // Construct default settings; override with command line arguments. qjackctlSetup settings; if (!settings.parse_args(app.arguments())) { app.quit(); return 1; } // Check if we'll just start an external program... if (!settings.sCmdLine.isEmpty()) { jack_client_t *pJackClient = jack_client_open("qjackctl-start", JackNoStartServer, NULL); if (pJackClient) { jack_client_close(pJackClient); int iExitStatus = ::system(settings.sCmdLine.toUtf8().constData()); app.quit(); return iExitStatus; } } // Have another instance running? if (settings.bSingleton) { if (app.setup(settings.sServerName)) { app.quit(); return 2; } } // Dark themes grayed/disabled color group fix... QPalette pal(app.palette()); if (pal.base().color().value() < 0x7f) { #if QT_VERSION >= 0x050000 const QColor& color = pal.window().color(); const int iGroups = int(QPalette::Active | QPalette::Inactive) + 1; for (int i = 0; i < iGroups; ++i) { const QPalette::ColorGroup group = QPalette::ColorGroup(i); pal.setBrush(group, QPalette::Light, color.lighter(150)); pal.setBrush(group, QPalette::Midlight, color.lighter(120)); pal.setBrush(group, QPalette::Dark, color.darker(150)); pal.setBrush(group, QPalette::Mid, color.darker(120)); pal.setBrush(group, QPalette::Shadow, color.darker(200)); } // pal.setColor(QPalette::Disabled, QPalette::ButtonText, pal.mid().color()); #endif pal.setColorGroup(QPalette::Disabled, pal.windowText().color().darker(), pal.button(), pal.light(), pal.dark(), pal.mid(), pal.text().color().darker(), pal.text().color().lighter(), pal.base(), pal.window()); app.setPalette(pal); } // Set default base font... if (settings.iBaseFontSize > 0) app.setFont(QFont(app.font().family(), settings.iBaseFontSize)); // What style do we create these forms? Qt::WindowFlags wflags = Qt::Window | Qt::CustomizeWindowHint | Qt::WindowTitleHint | Qt::WindowSystemMenuHint | Qt::WindowMinMaxButtonsHint | Qt::WindowCloseButtonHint; if (settings.bKeepOnTop) wflags |= Qt::Tool; // Construct the main form, and show it to the world. qjackctlMainForm w(0, wflags); w.setup(&settings); // If we have a systray icon, we'll skip this. if (!settings.bSystemTray) { w.show(); w.adjustSize(); } // Settle this one as application main widget... app.setMainWidget(&w); // Settle session manager shutdown (eg. logoff)... QObject::connect( &app, SIGNAL(commitDataRequest(QSessionManager&)), &w, SLOT(commitData(QSessionManager&)), Qt::DirectConnection); // Register the quit signal/slot. app.setQuitOnLastWindowClosed(false); return app.exec(); } // end of qjackctl.cpp qjackctl-0.4.2/src/PaxHeaders.14935/qjackctlAboutForm.cpp0000644000000000000000000000013212700760152017761 xustar0030 mtime=1459871850.616906788 30 atime=1459871850.616906788 30 ctime=1459871850.616906788 qjackctl-0.4.2/src/qjackctlAboutForm.cpp0000644000175000001440000001064012700760152020526 0ustar00rncbcusers00000000000000// qjackctlAboutForm.cpp // /**************************************************************************** Copyright (C) 2003-2013, rncbc aka Rui Nuno Capela. All rights reserved. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. *****************************************************************************/ #include "qjackctlAbout.h" #include "qjackctlAboutForm.h" #include #ifdef CONFIG_JACK_VERSION #include #endif //---------------------------------------------------------------------------- // qjackctlAboutForm -- UI wrapper form. // Constructor. qjackctlAboutForm::qjackctlAboutForm ( QWidget *pParent, Qt::WindowFlags wflags ) : QDialog(pParent, wflags) { // Setup UI struct... m_ui.setupUi(this); // Stuff the about box... QString sText = "\n"; m_ui.AboutTextView->setText(sText); // UI connections... QObject::connect(m_ui.AboutQtButton, SIGNAL(clicked()), SLOT(aboutQt())); QObject::connect(m_ui.ClosePushButton, SIGNAL(clicked()), SLOT(close())); } // Destructor. qjackctlAboutForm::~qjackctlAboutForm (void) { } // About Qt request. void qjackctlAboutForm::aboutQt() { QMessageBox::aboutQt(this); } // end of qjackctlAboutForm.cpp qjackctl-0.4.2/PaxHeaders.14935/TODO0000644000000000000000000000013212700760152013543 xustar0030 mtime=1459871850.608902788 30 atime=1459871850.608902788 30 ctime=1459871850.608902788 qjackctl-0.4.2/TODO0000644000175000001440000000107012700760152014305 0ustar00rncbcusers00000000000000QjackCtl - JACK Audio Connection Kit Qt GUI Interface ----------------------------------------------------- TODOs 0.4.0 Backlog - Having parameter settings obey/depend on jackctl API. ... 0.1.1 Backlog - Having some LADCCA support or awareness may be very welcome. 0.0.5 Backlog - Make available some translations, as some has been contributed already; I'm missing "volunteers" for French (fr), German (de) and Spanish (es). 0.0.3 Backlog: - Display of current jackd version string. - XRUN ticker visual charting. - Any other feature one can think of ;) qjackctl-0.4.2/PaxHeaders.14935/TRANSLATORS0000644000000000000000000000013212700760152014612 xustar0030 mtime=1459871850.608902788 30 atime=1459871850.608902788 30 ctime=1459871850.608902788 qjackctl-0.4.2/TRANSLATORS0000644000175000001440000000074412700760152015363 0ustar00rncbcusers00000000000000Czech (cs) Pavel Fric German (de) Guido Scholz Spanish (es) Adrian Pardini French (fr) Raphaƫl Doursenaud Olivier Humbert Italian (it) Sergio Atzori Japanese (ja) Takashi Sakamoto Dutch (nl) Peter Geirnaert Russian (ru) Alexandre Prokoudine


\n"; sText += "" + tr(QJACKCTL_SUBTITLE) + "
\n"; sText += "
\n"; sText += tr("Version") + ": " QJACKCTL_VERSION "
\n"; sText += tr("Build") + ": " __DATE__ " " __TIME__ "
\n"; #ifdef CONFIG_JACK_VERSION sText += "
\n"; sText += tr("Using: JACK %1").arg(jack_get_version_string()); sText += "
\n"; #endif #ifdef CONFIG_DEBUG sText += ""; sText += tr("Debugging option enabled."); sText += "
\n"; #endif #ifndef CONFIG_SYSTEM_TRAY sText += ""; sText += tr("System tray disabled."); sText += "
\n"; #endif #ifndef CONFIG_JACK_TRANSPORT sText += ""; sText += tr("Transport status control disabled."); sText += "
\n"; #endif #ifndef CONFIG_JACK_REALTIME sText += ""; sText += tr("Realtime status disabled."); sText += "
\n"; #endif #ifndef CONFIG_JACK_XRUN_DELAY sText += ""; sText += tr("XRUN delay status disabled."); sText += "
\n"; #endif #ifndef CONFIG_JACK_MAX_DELAY sText += ""; sText += tr("Maximum delay status disabled."); sText += "
\n"; #endif #ifndef CONFIG_JACK_PORT_ALIASES sText += ""; sText += tr("JACK Port aliases support disabled."); sText += "
\n"; #endif #ifndef CONFIG_JACK_MIDI sText += ""; sText += tr("JACK MIDI support disabled."); sText += "
\n"; #endif #ifndef CONFIG_JACK_SESSION sText += ""; sText += tr("JACK Session support disabled."); sText += "
"; #endif #ifndef CONFIG_ALSA_SEQ #if !defined(WIN32) sText += ""; sText += tr("ALSA/MIDI sequencer support disabled."); sText += "
\n"; #endif #endif #ifndef CONFIG_DBUS #if !defined(WIN32) sText += ""; sText += tr("D-Bus interface support disabled."); sText += "
\n"; #endif #endif sText += "
\n"; sText += tr("Website") + ":
" QJACKCTL_WEBSITE "
\n"; sText += "
\n"; sText += ""; sText += QJACKCTL_COPYRIGHT "
\n"; sText += "
\n"; sText += tr("This program is free software; you can redistribute it and/or modify it") + "
\n"; sText += tr("under the terms of the GNU General Public License version 2 or later."); sText += "
"; sText += "